2007-01-13 03:42:19 +01:00
// Copyright (c) 2005, Dan Donovan (Dansolo)
2007-01-13 03:22:28 +01:00
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither the name of the Aegisub Group nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// -----------------------------------------------------------------------------
//
// AEGISUB
//
// Website: http://aegisub.cellosoft.com
// Contact: mailto:zeratul@cellosoft.com
//
2007-01-17 01:06:42 +01:00
//
// NOTE: A "source group" in this file refers to a group of plain text following a
// override block containing \k
2007-01-13 03:22:28 +01:00
2007-01-15 00:34:27 +01:00
# define MIN(a,b) ((a<b)?a:b)
2007-01-16 21:55:27 +01:00
# define KANA_SEARCH_DISTANCE 1 //Kana interpolation, in characters, unset to disable
2007-01-16 23:32:05 +01:00
# define ROMAJI_SEARCH_DISTANCE 4 //Romaji interpolation, in karaoke groups, unset to disable
2007-01-15 00:34:27 +01:00
2007-01-13 03:22:28 +01:00
///////////
// Headers
# include "dialog_kanji_timer.h"
# include "ass_file.h"
# include "ass_dialogue.h"
# include "ass_style.h"
# include "ass_override.h"
# include "subs_grid.h"
# include "validators.h"
2007-01-21 18:01:22 +01:00
# include "video_context.h"
2007-01-13 03:22:28 +01:00
///////////////
// Constructor
DialogKanjiTimer : : DialogKanjiTimer ( wxWindow * parent , SubtitlesGrid * _grid )
: wxDialog ( parent , - 1 , _ ( " Kanji timing " ) , wxDefaultPosition )
{
// Variables
AssFile * subs = AssFile : : top ;
grid = _grid ;
2007-01-13 09:34:42 +01:00
RegroupSourceSelected = 0 ;
2007-01-13 03:22:28 +01:00
//Sizers
wxSizer * ResBoxSizer1 = new wxStaticBoxSizer ( wxVERTICAL , this , _ ( " Text " ) ) ;
wxSizer * ResBoxSizer2 = new wxStaticBoxSizer ( wxVERTICAL , this , _ ( " Shortcut Keys " ) ) ;
wxSizer * ResBoxSizer3 = new wxStaticBoxSizer ( wxVERTICAL , this , _ ( " Groups " ) ) ;
wxSizer * ResBoxSizer4 = new wxStaticBoxSizer ( wxVERTICAL , this , _ ( " Styles " ) ) ;
wxSizer * ResBoxSizer5 = new wxStaticBoxSizer ( wxVERTICAL , this , _ ( " Commands " ) ) ;
wxBoxSizer * ResSizer1 = new wxBoxSizer ( wxHORIZONTAL ) ;
2007-01-15 00:34:27 +01:00
wxFlexGridSizer * ResSizerGrid1 = new wxFlexGridSizer ( 2 , 2 , 3 , 3 ) ;
2007-01-13 03:22:28 +01:00
2007-01-15 00:34:27 +01:00
SourceText = new wxTextCtrl ( this , TEXT_SOURCE , _T ( " " ) , wxDefaultPosition , wxSize ( 450 , - 1 ) , wxTE_READONLY | wxTE_NOHIDESEL | wxSIMPLE_BORDER | wxTE_RIGHT | wxTE_PROCESS_ENTER ) ;
DestText = new wxTextCtrl ( this , TEXT_DEST , _T ( " " ) , wxDefaultPosition , wxSize ( 450 , - 1 ) , wxTE_NOHIDESEL | wxSIMPLE_BORDER | wxTE_RIGHT | wxTE_PROCESS_ENTER ) ;
2007-01-13 03:22:28 +01:00
SourceText - > SetEventHandler ( new DialogKanjiTimerEvent ( this ) ) ;
DestText - > SetEventHandler ( new DialogKanjiTimerEvent ( this ) ) ;
2007-01-13 03:42:19 +01:00
wxStaticText * ShortcutKeys = new wxStaticText ( this , - 1 , _ ( " When the destination textbox has focus, use the following keys: \n \n Right Arrow: Increase dest. selection length \n Left Arrow: Decrease dest. selection length \n Up Arrow: Increase source selection length \n Down Arrow: Decrease source selection length \n Enter: Link, accept line when done \n Backspace: Unlink last " ) ) ;
2007-01-13 03:22:28 +01:00
2007-01-13 03:42:19 +01:00
SourceStyle = new wxComboBox ( this , - 1 , _ ( " " ) , wxDefaultPosition , wxSize ( 160 , - 1 ) ,
2007-01-13 03:22:28 +01:00
subs - > GetStyles ( ) , wxCB_READONLY , wxDefaultValidator , _ ( " Source Style " ) ) ;
2007-01-13 03:42:19 +01:00
DestStyle = new wxComboBox ( this , - 1 , _ ( " " ) , wxDefaultPosition , wxSize ( 160 , - 1 ) ,
2007-01-13 03:22:28 +01:00
subs - > GetStyles ( ) , wxCB_READONLY , wxDefaultValidator , _ ( " Dest Style " ) ) ;
2007-01-13 03:42:19 +01:00
GroupsList = new wxListCtrl ( this , - 1 , wxDefaultPosition , wxSize ( 180 , 100 ) , wxLC_REPORT | wxLC_NO_HEADER | wxLC_HRULES | wxLC_VRULES ) ;
2007-01-13 03:22:28 +01:00
GroupsList - > InsertColumn ( 0 , _T ( " " ) , wxLIST_FORMAT_CENTER , 72 ) ;
GroupsList - > InsertColumn ( 1 , _T ( " " ) , wxLIST_FORMAT_CENTER , 72 ) ;
2007-01-13 03:42:19 +01:00
2007-01-13 03:22:28 +01:00
//Buttons
2007-01-13 03:42:19 +01:00
wxButton * Start = new wxButton ( this , BUTTON_KTSTART , _ ( " Start " ) ) ;
wxButton * Link = new wxButton ( this , BUTTON_KTLINK , _ ( " Link " ) ) ;
wxButton * Unlink = new wxButton ( this , BUTTON_KTUNLINK , _ ( " Unlink " ) ) ;
wxButton * SkipSourceLine = new wxButton ( this , BUTTON_KTSKIPSOURCE , _ ( " Skip Source Line " ) ) ;
wxButton * SkipDestLine = new wxButton ( this , BUTTON_KTSKIPDEST , _ ( " Skip Dest Line " ) ) ;
wxButton * GoBackLine = new wxButton ( this , BUTTON_KTGOBACK , _ ( " Go Back a Line " ) ) ;
wxButton * AcceptLine = new wxButton ( this , BUTTON_KTACCEPT , _ ( " Accept Line " ) ) ;
2007-01-15 00:34:27 +01:00
wxButton * CloseKT = new wxButton ( this , wxID_CLOSE , _ ( " Close " ) , wxDefaultPosition , wxDefaultSize , wxALIGN_RIGHT ) ;
//Checkbox
Interpolate = new wxCheckBox ( this , - 1 , _ ( " Attempt to interpolate kanji. " ) , wxDefaultPosition , wxDefaultSize , wxALIGN_LEFT ) ;
2007-01-16 21:55:27 +01:00
Interpolate - > SetValue ( Options . AsBool ( _T ( " kanji timer interpolation " ) ) ) ;
2007-01-15 00:34:27 +01:00
//Static Text labels for source/dest
wxStaticText * SourceLabel = new wxStaticText ( this , - 1 , _ ( " Source: " ) ) ;
wxStaticText * DestLabel = new wxStaticText ( this , - 1 , _ ( " Dest: " ) ) ;
2007-01-13 03:22:28 +01:00
//Frame: Text
2007-01-15 00:34:27 +01:00
ResSizerGrid1 - > Add ( SourceLabel , 1 , wxALIGN_CENTER | wxRIGHT , 3 ) ;
ResSizerGrid1 - > Add ( SourceText , 0 , wxALIGN_CENTER , 3 ) ;
ResSizerGrid1 - > Add ( DestLabel , 1 , wxALIGN_CENTER | wxRIGHT , 3 ) ;
ResSizerGrid1 - > Add ( DestText , 0 , wxALIGN_CENTER , 3 ) ;
ResBoxSizer1 - > Add ( ResSizerGrid1 , 1 , wxALIGN_CENTER | wxEXPAND , 5 ) ;
2007-01-13 03:22:28 +01:00
//Frame: Shortcut Keys
2007-01-13 03:42:19 +01:00
ResBoxSizer2 - > Add ( ShortcutKeys , 0 , wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxRIGHT , 5 ) ;
2007-01-13 03:22:28 +01:00
//Frame: Groups
ResBoxSizer3 - > Add ( GroupsList , 1 , wxALIGN_CENTER , 5 ) ;
//Frame: Styles
2007-01-13 03:42:19 +01:00
ResBoxSizer4 - > Add ( SourceStyle , 0 , wxALIGN_CENTER | wxBOTTOM , 5 ) ;
ResBoxSizer4 - > Add ( DestStyle , 0 , wxALIGN_CENTER , 5 ) ;
2007-01-13 03:22:28 +01:00
//Frame: Commands
2007-01-13 03:42:19 +01:00
ResBoxSizer5 - > AddStretchSpacer ( 1 ) ;
ResBoxSizer5 - > Add ( Start , 0 , wxEXPAND | wxBOTTOM , 5 ) ;
ResBoxSizer5 - > Add ( Link , 0 , wxEXPAND | wxBOTTOM , 5 ) ;
ResBoxSizer5 - > Add ( Unlink , 0 , wxEXPAND | wxBOTTOM , 5 ) ;
ResBoxSizer5 - > Add ( SkipSourceLine , 0 , wxEXPAND | wxBOTTOM , 5 ) ;
ResBoxSizer5 - > Add ( SkipDestLine , 0 , wxEXPAND | wxBOTTOM , 5 ) ;
ResBoxSizer5 - > Add ( GoBackLine , 0 , wxEXPAND | wxBOTTOM , 5 ) ;
ResBoxSizer5 - > Add ( AcceptLine , 0 , wxEXPAND | wxBOTTOM , 0 ) ;
ResBoxSizer5 - > AddStretchSpacer ( 1 ) ;
2007-01-13 03:22:28 +01:00
//Combine Shortcut Keys and Groups
2007-01-13 03:42:19 +01:00
ResSizer1 - > Add ( ResBoxSizer2 , 0 , wxEXPAND | wxRIGHT , 5 ) ;
ResSizer1 - > Add ( ResBoxSizer3 , 1 , wxEXPAND , 5 ) ;
2007-01-13 03:22:28 +01:00
// Main sizer
2007-01-15 00:34:27 +01:00
wxFlexGridSizer * MainSizer = new wxFlexGridSizer ( 3 , 2 , 0 , 0 ) ;
2007-01-13 03:42:19 +01:00
MainSizer - > Add ( ResBoxSizer1 , 0 , wxEXPAND | wxLEFT | wxRIGHT , 5 ) ;
MainSizer - > Add ( ResBoxSizer4 , 0 , wxEXPAND | wxLEFT | wxRIGHT , 5 ) ;
MainSizer - > Add ( ResSizer1 , 0 , wxEXPAND | wxALL , 5 ) ;
MainSizer - > Add ( ResBoxSizer5 , 0 , wxEXPAND | wxALL , 5 ) ;
MainSizer - > AddGrowableCol ( 0 , 1 ) ;
2007-01-15 00:34:27 +01:00
MainSizer - > Add ( Interpolate , 0 , wxEXPAND | wxALL , 5 ) ;
MainSizer - > AddGrowableCol ( 0 , 1 ) ;
MainSizer - > Add ( CloseKT , 0 , wxEXPAND | wxALL , 5 ) ;
2007-01-13 03:22:28 +01:00
MainSizer - > SetSizeHints ( this ) ;
SetSizer ( MainSizer ) ;
CenterOnParent ( ) ;
}
///////////////
// Event table
BEGIN_EVENT_TABLE ( DialogKanjiTimer , wxDialog )
2007-01-15 00:34:27 +01:00
EVT_BUTTON ( wxID_CLOSE , DialogKanjiTimer : : OnClose )
2007-01-13 03:22:28 +01:00
EVT_BUTTON ( BUTTON_KTSTART , DialogKanjiTimer : : OnStart )
EVT_BUTTON ( BUTTON_KTLINK , DialogKanjiTimer : : OnLink )
EVT_BUTTON ( BUTTON_KTUNLINK , DialogKanjiTimer : : OnUnlink )
EVT_BUTTON ( BUTTON_KTSKIPSOURCE , DialogKanjiTimer : : OnSkipSource )
EVT_BUTTON ( BUTTON_KTSKIPDEST , DialogKanjiTimer : : OnSkipDest )
EVT_BUTTON ( BUTTON_KTGOBACK , DialogKanjiTimer : : OnGoBack )
EVT_BUTTON ( BUTTON_KTACCEPT , DialogKanjiTimer : : OnAccept )
EVT_KEY_DOWN ( DialogKanjiTimer : : OnKeyDown )
EVT_TEXT_ENTER ( TEXT_SOURCE , DialogKanjiTimer : : OnKeyEnter )
EVT_TEXT_ENTER ( TEXT_DEST , DialogKanjiTimer : : OnKeyEnter )
END_EVENT_TABLE ( )
2007-01-15 00:34:27 +01:00
void DialogKanjiTimer : : OnClose ( wxCommandEvent & event ) {
2007-01-16 21:55:27 +01:00
Options . SetBool ( _T ( " kanji timer interpolation " ) , Interpolate - > IsChecked ( ) ) ;
Options . Save ( ) ;
2007-01-15 00:34:27 +01:00
Close ( ) ;
}
2007-01-13 03:22:28 +01:00
void DialogKanjiTimer : : OnStart ( wxCommandEvent & event ) {
SourceIndex = DestIndex = 0 ;
2007-01-13 08:04:12 +01:00
if ( SourceStyle - > GetValue ( ) . Len ( ) = = 0 | | DestStyle - > GetValue ( ) . Len ( ) = = 0 )
wxMessageBox ( _ ( " Select source and destination styles first. " ) , _ ( " Error " ) , wxICON_EXCLAMATION | wxOK ) ;
else if ( SourceStyle - > GetValue ( ) = = DestStyle - > GetValue ( ) )
wxMessageBox ( _ ( " The source and destination styles must be different. " ) , _ ( " Error " ) , wxICON_EXCLAMATION | wxOK ) ;
else {
OnSkipDest ( ( wxCommandEvent ) NULL ) ;
2007-01-15 00:34:27 +01:00
OnSkipSource ( ( wxCommandEvent ) NULL ) ;
2007-01-13 08:04:12 +01:00
DestText - > SetFocus ( ) ;
}
2007-01-13 03:22:28 +01:00
}
void DialogKanjiTimer : : OnLink ( wxCommandEvent & event ) {
int sourceLen = SourceText - > GetStringSelection ( ) . Len ( ) ;
int destLen = DestText - > GetStringSelection ( ) . Len ( ) ;
if ( sourceLen ! = 0 ) {
wxString sourceText = SourceText - > GetValue ( ) ;
wxString destText = DestText - > GetValue ( ) ;
2007-01-13 08:04:12 +01:00
RegroupGroups [ RegroupSourceSelected < < 1 ] = SourceText - > GetStringSelection ( ) ;
RegroupGroups [ ( RegroupSourceSelected < < 1 ) + 1 ] = DestText - > GetStringSelection ( ) ;
2007-01-13 03:22:28 +01:00
wxListItem itm ;
int i = GroupsList - > GetItemCount ( ) ;
GroupsList - > InsertItem ( i , itm ) ;
2007-01-13 08:04:12 +01:00
GroupsList - > SetItem ( i , 0 , RegroupGroups [ RegroupSourceSelected < < 1 ] ) ;
GroupsList - > SetItem ( i , 1 , RegroupGroups [ ( RegroupSourceSelected < < 1 ) + 1 ] ) ;
2007-01-13 03:22:28 +01:00
2007-01-13 08:04:12 +01:00
SourceText - > ChangeValue ( sourceText . Right ( sourceText . Len ( ) - sourceLen ) ) ;
DestText - > ChangeValue ( destText . Right ( destText . Len ( ) - destLen ) ) ;
2007-01-13 03:22:28 +01:00
2007-01-15 00:34:27 +01:00
SetSelected ( ) ;
2007-01-13 08:04:12 +01:00
2007-01-13 03:22:28 +01:00
RegroupSourceSelected + + ;
}
2007-01-13 08:04:12 +01:00
else {
wxMessageBox ( _ ( " Select source text first. " ) , _ ( " Error " ) , wxICON_EXCLAMATION | wxOK ) ;
}
2007-01-13 03:22:28 +01:00
DestText - > SetFocus ( ) ;
}
void DialogKanjiTimer : : OnUnlink ( wxCommandEvent & event ) {
if ( RegroupSourceSelected ) {
RegroupSourceSelected - - ;
SourceText - > ChangeValue ( RegroupGroups [ RegroupSourceSelected < < 1 ] + SourceText - > GetValue ( ) ) ;
DestText - > ChangeValue ( RegroupGroups [ ( RegroupSourceSelected < < 1 ) + 1 ] + DestText - > GetValue ( ) ) ;
GroupsList - > DeleteItem ( GroupsList - > GetItemCount ( ) - 1 ) ;
2007-01-15 00:34:27 +01:00
SetSelected ( ) ;
2007-01-13 03:22:28 +01:00
}
DestText - > SetFocus ( ) ;
}
void DialogKanjiTimer : : OnSkipSource ( wxCommandEvent & event ) {
GroupsList - > DeleteAllItems ( ) ;
2007-01-13 08:04:12 +01:00
TextBeforeKaraoke = _T ( " " ) ;
2007-01-15 00:34:27 +01:00
RegroupSourceSelected = 0 ;
SourceText - > SetSelection ( 0 , 0 ) ;
2007-01-13 03:22:28 +01:00
int index = ListIndexFromStyleandIndex ( SourceStyle - > GetValue ( ) , SourceIndex ) ;
if ( index ! = - 1 ) {
AssDialogue * line = grid - > GetDialogue ( index ) ;
AssDialogueBlockOverride * override ;
AssDialogueBlockPlain * plain ;
AssOverrideTag * tag ;
2007-01-17 01:06:42 +01:00
wxRegEx reK ( _T ( " \\ \\ [kK][of]? " ) , wxRE_NOSUB ) ;
2007-01-13 08:04:12 +01:00
int k , kIndex = 0 , textIndex = 0 , TextBeforeOffset = 0 ;
2007-01-13 03:22:28 +01:00
bool LastWasOverride = false ;
line = grid - > GetDialogue ( index ) ;
wxString StrippedText = line - > GetStrippedText ( ) ;
line - > ParseASSTags ( ) ;
size_t blockn = line - > Blocks . size ( ) ;
RegroupSourceText = new wxString [ ( const int ) blockn ] ;
RegroupGroups = new wxString [ ( const int ) blockn < < 1 ] ;
RegroupSourceKLengths = new int [ ( const int ) blockn ] ;
RegroupTotalLen = 0 ; //The above arrays won't actually be of size blockn
for ( size_t i = 0 ; i < blockn ; i + + ) {
k = 0 ;
override = AssDialogueBlock : : GetAsOverride ( line - > Blocks . at ( i ) ) ;
if ( override ) {
if ( LastWasOverride ) {
/* Explanation for LastWasOverride:
* If we have a karaoke block with no text ( IE for a pause )
* then we will get thrown off in the SourceText array
* because the K Length array will increase without it .
*/
RegroupSourceText [ textIndex + + ] = _T ( " " ) ;
}
for ( size_t j = 0 ; j < override - > Tags . size ( ) ; j + + ) {
tag = override - > Tags . at ( j ) ;
2007-01-17 01:06:42 +01:00
if ( reK . Matches ( tag - > Name ) & & tag - > Params . size ( ) = = 1 )
2007-01-13 03:22:28 +01:00
k = tag - > Params [ 0 ] - > AsInt ( ) ;
}
RegroupSourceKLengths [ kIndex + + ] = k ;
LastWasOverride = true ;
}
plain = AssDialogueBlock : : GetAsPlain ( line - > Blocks . at ( i ) ) ;
if ( plain ) {
2007-01-13 08:04:12 +01:00
if ( kIndex = = 0 ) {
/*kIndex hasn't been incremented yet so this is text before a \k
* This will throw off our processing .
* Ask the user to copy it over or ignore it .
*/
int result = wxMessageBox ( _ ( " The source line contains text before the first karaoke block. \n Do you want to carry it over to the destination? \n It will be ignored otherwise. " ) ,
_ ( " Question " ) , wxICON_QUESTION | wxYES_NO | wxYES_DEFAULT ) ;
TextBeforeOffset = plain - > text . Len ( ) ;
if ( result = = wxYES )
TextBeforeKaraoke = plain - > text ;
}
else {
RegroupSourceText [ textIndex + + ] = plain - > text ;
LastWasOverride = false ;
}
2007-01-13 03:22:28 +01:00
}
}
2007-01-13 08:04:12 +01:00
RegroupTotalLen = kIndex ; //should be the same as textIndex
if ( kIndex ! = textIndex ) //...or there was likely an error parsing, alert but don't halt
wxMessageBox ( _ ( " Possible error parsing source line " ) , _ ( " Error " ) , wxICON_EXCLAMATION | wxOK ) ;
2007-01-15 00:34:27 +01:00
SourceText - > ChangeValue ( StrippedText . Mid ( TextBeforeOffset ) ) ;
2007-01-13 08:04:12 +01:00
2007-01-13 03:22:28 +01:00
SourceIndex + + ;
2007-01-15 00:34:27 +01:00
SetSelected ( ) ;
DestText - > SetFocus ( ) ;
2007-01-13 03:22:28 +01:00
}
}
void DialogKanjiTimer : : OnSkipDest ( wxCommandEvent & event ) {
GroupsList - > DeleteAllItems ( ) ;
int index = ListIndexFromStyleandIndex ( DestStyle - > GetValue ( ) , DestIndex ) ;
if ( index ! = - 1 ) {
AssDialogue * line = grid - > GetDialogue ( index ) ;
DestText - > ChangeValue ( grid - > GetDialogue ( index ) - > GetStrippedText ( ) ) ;
2007-01-15 00:34:27 +01:00
SetSelected ( ) ;
2007-01-13 03:22:28 +01:00
DestText - > SetFocus ( ) ;
DestIndex + + ;
}
}
void DialogKanjiTimer : : OnGoBack ( wxCommandEvent & event ) {
DestIndex - = 2 ;
SourceIndex - = 2 ;
OnSkipDest ( ( wxCommandEvent ) NULL ) ;
2007-01-15 00:34:27 +01:00
OnSkipSource ( ( wxCommandEvent ) NULL ) ;
2007-01-13 03:22:28 +01:00
}
void DialogKanjiTimer : : OnAccept ( wxCommandEvent & event ) {
2007-01-13 08:04:12 +01:00
if ( RegroupTotalLen = = 0 )
wxMessageBox ( _ ( " Group some text first. " ) , _ ( " Error " ) , wxICON_EXCLAMATION | wxOK ) ;
else if ( SourceText - > GetValue ( ) . Len ( ) ! = 0 )
wxMessageBox ( _ ( " Group all of the source text. " ) , _ ( " Error " ) , wxICON_EXCLAMATION | wxOK ) ;
else {
wxString OutputText = TextBeforeKaraoke ;
wxString ThisText ;
AssDialogue * line = grid - > GetDialogue ( ListIndexFromStyleandIndex ( DestStyle - > GetValue ( ) , DestIndex - 1 ) ) ;
int ItemCount = GroupsList - > GetItemCount ( ) ;
int SourceLength ;
int WorkingK = 0 ;
int SourceIndex = 0 ;
for ( int index = 0 ; index ! = ItemCount ; index + + ) {
SourceLength = RegroupGroups [ index < < 1 ] . Len ( ) ;
if ( RegroupSourceText [ SourceIndex ] . Len ( ) = = 0 ) {
//Karaoke block w/o text that is NOT in the middle of a group, just copy it over
// since we can't figure out if it should go to the previous or the next group
OutputText = wxString : : Format ( _ ( " %s{ \\ k%i} " ) , OutputText , RegroupSourceKLengths [ SourceIndex ] ) ;
SourceIndex + + ;
}
2007-01-13 03:22:28 +01:00
2007-01-13 08:04:12 +01:00
while ( SourceLength > 0 ) {
WorkingK + = RegroupSourceKLengths [ SourceIndex ] ;
SourceLength - = ( RegroupSourceText [ SourceIndex ] ) . Len ( ) ;
SourceIndex + + ;
}
OutputText = wxString : : Format ( _ ( " %s{ \\ k%i}%s " ) , OutputText , WorkingK , RegroupGroups [ ( index < < 1 ) + 1 ] ) ;
WorkingK = 0 ;
2007-01-13 03:22:28 +01:00
}
2007-01-13 08:04:12 +01:00
line - > Text = OutputText ;
grid - > ass - > FlagAsModified ( ) ;
grid - > CommitChanges ( ) ;
2007-01-13 03:22:28 +01:00
2007-01-13 08:04:12 +01:00
OnSkipDest ( ( wxCommandEvent ) NULL ) ;
2007-01-15 00:34:27 +01:00
OnSkipSource ( ( wxCommandEvent ) NULL ) ;
2007-01-13 08:04:12 +01:00
}
2007-01-13 03:22:28 +01:00
}
void DialogKanjiTimer : : OnKeyDown ( wxKeyEvent & event ) {
2007-01-16 21:55:27 +01:00
switch ( event . GetKeyCode ( ) ) {
2007-01-13 03:22:28 +01:00
case WXK_ESCAPE :
2007-01-16 21:55:27 +01:00
//this->EndModal(0);
OnClose ( ( wxCommandEvent ) NULL ) ;
2007-01-13 03:22:28 +01:00
break ;
case WXK_BACK :
2007-01-16 21:55:27 +01:00
OnUnlink ( ( wxCommandEvent ) NULL ) ;
2007-01-13 03:22:28 +01:00
break ;
case WXK_RIGHT : //inc dest selection len
if ( DestText - > GetStringSelection ( ) . Len ( ) ! = DestText - > GetValue ( ) . Len ( ) )
DestText - > SetSelection ( 0 , DestText - > GetStringSelection ( ) . Len ( ) + 1 ) ;
break ;
case WXK_LEFT : //dec dest selection len
if ( DestText - > GetStringSelection ( ) . Len ( ) ! = 0 )
DestText - > SetSelection ( 0 , DestText - > GetStringSelection ( ) . Len ( ) - 1 ) ;
break ;
case WXK_UP : //inc source selection len
if ( SourceText - > GetStringSelection ( ) . Len ( ) ! = SourceText - > GetValue ( ) . Len ( ) ) {
SourceText - > SetSelection ( 0 , SourceText - > GetStringSelection ( ) . Len ( ) + RegroupSourceText [ GetSourceArrayPos ( false ) ] . Len ( ) ) ;
}
break ;
case WXK_DOWN : //dec source selection len
if ( SourceText - > GetStringSelection ( ) . Len ( ) ! = 0 ) {
SourceText - > SetSelection ( 0 , SourceText - > GetStringSelection ( ) . Len ( ) - RegroupSourceText [ GetSourceArrayPos ( true ) ] . Len ( ) ) ;
}
break ;
case WXK_RETURN :
2007-01-13 08:04:12 +01:00
OnKeyEnter ( ( wxCommandEvent ) NULL ) ;
2007-01-13 03:22:28 +01:00
break ;
default :
event . Skip ( ) ;
}
}
void DialogKanjiTimer : : OnKeyEnter ( wxCommandEvent & event ) {
2007-01-13 08:04:12 +01:00
if ( SourceText - > GetValue ( ) . Len ( ) = = 0 & & RegroupTotalLen ! = 0 )
2007-01-13 03:22:28 +01:00
this - > OnAccept ( ( wxCommandEvent ) NULL ) ;
else if ( SourceText - > GetStringSelection ( ) . Len ( ) ! = 0 )
this - > OnLink ( ( wxCommandEvent ) NULL ) ;
}
2007-01-13 08:04:12 +01:00
void DialogKanjiTimer : : OnMouseEvent ( wxMouseEvent & event ) {
if ( event . LeftDown ( ) ) DestText - > SetFocus ( ) ;
}
2007-01-15 00:34:27 +01:00
void DialogKanjiTimer : : SetSelected ( ) {
2007-01-13 08:04:12 +01:00
if ( SourceText - > GetValue ( ) . Len ( ) ! = 0 )
SourceText - > SetSelection ( 0 , RegroupSourceText [ GetSourceArrayPos ( false ) ] . Len ( ) ) ;
2007-01-15 00:34:27 +01:00
if ( SourceText - > GetValue ( ) . Len ( ) ! = 0 & & SourceText - > GetStringSelection ( ) . Len ( ) = = SourceText - > GetValue ( ) . Len ( ) )
DestText - > SetSelection ( 0 , DestText - > GetValue ( ) . Len ( ) ) ;
else if ( SourceText - > GetStringSelection ( ) = = _T ( " " ) & & ! DestText - > GetValue ( ) . StartsWith ( _T ( " " ) ) )
DestText - > SetSelection ( 0 , 0 ) ;
else if ( DestText - > GetValue ( ) . StartsWith ( SourceText - > GetStringSelection ( ) ) )
DestText - > SetSelection ( 0 , SourceText - > GetStringSelection ( ) . Len ( ) ) ;
else if ( SourceText - > GetValue ( ) . Len ( ) ! = 0 & & DestText - > GetValue ( ) . Len ( ) ! = 0 ) {
bool foundit = false ;
if ( Interpolate - > IsChecked ( ) ) {
KanaTable * kt = new KanaTable ( ) ;
wxString Destext = DestText - > GetValue ( ) ;
wxString SrcG = SourceText - > GetStringSelection ( ) ;
wxString trimmed = SrcG . Trim ( true ) ;
2007-01-17 01:06:42 +01:00
wxString Destextmid ;
2007-01-15 00:34:27 +01:00
SrcG = SourceText - > GetStringSelection ( ) ;
2007-01-17 01:06:42 +01:00
size_t sourceindex = 0 , destsel = 0 ;
bool h , k ;
2007-01-15 00:34:27 +01:00
2007-01-17 01:06:42 +01:00
//Find hiragana/katakana for the first source group
2007-01-15 00:34:27 +01:00
for ( std : : list < KanaEntry > : : iterator iter = kt - > entries . begin ( ) ; iter ! = kt - > entries . end ( ) ; iter + + ) {
KanaEntry ke = * iter ;
2007-01-17 01:06:42 +01:00
Destextmid = Destext . Mid ( destsel ) ;
h = Destextmid . StartsWith ( ke . hiragana ) ;
k = Destext . StartsWith ( ke . katakana ) ;
if ( Destext . Len ( ) > = destsel & & ( h | | k ) ) {
2007-01-15 00:34:27 +01:00
if ( SrcG . Len ( ) = = sourceindex | | trimmed . Mid ( sourceindex ) = = ke . hepburn ) {
foundit = true ;
2007-01-16 23:32:05 +01:00
if ( Destext . Len ( ) > ( destsel + 1 ) & & SrcG . EndsWith ( _T ( " " ) ) & & Destext . at ( destsel + 1 ) = = ' ' )
DestText - > SetSelection ( 0 , destsel + 2 ) ;
else
DestText - > SetSelection ( 0 , destsel + 1 ) ;
2007-01-15 00:34:27 +01:00
break ;
}
if ( ke . hepburn . Len ( ) ! = 0 & & trimmed . Mid ( sourceindex ) . StartsWith ( ke . hepburn ) ) {
2007-01-17 01:06:42 +01:00
destsel + = h ? ke . hiragana . Len ( ) : ke . katakana . Len ( ) ;
2007-01-15 00:34:27 +01:00
sourceindex + = ke . hepburn . Len ( ) ;
2007-01-17 01:06:42 +01:00
iter = kt - > entries . begin ( ) ; //start over in list
2007-01-15 00:34:27 +01:00
}
}
}
2007-01-16 21:55:27 +01:00
# ifdef KANA_SEARCH_DISTANCE
2007-01-15 00:34:27 +01:00
if ( KANA_SEARCH_DISTANCE > 0 & & ! foundit ) {
//Try some interpolation for kanji. If we find a hiragana we know after this,
// then we may be able to figure this one out.
wxString NextSGroup = RegroupSourceText [ GetSourceArrayPos ( false ) ] ;
2007-01-17 01:06:42 +01:00
int highlight = 0 ;
2007-01-15 00:34:27 +01:00
for ( std : : list < KanaEntry > : : iterator iter = kt - > entries . begin ( ) ; iter ! = kt - > entries . end ( ) ; iter + + ) {
KanaEntry ke = * iter ;
if ( NextSGroup . StartsWith ( ke . hepburn ) ) {
2007-01-16 23:32:05 +01:00
for ( int i = 0 ; i ! = KANA_SEARCH_DISTANCE ; i + + ) {
2007-01-17 01:06:42 +01:00
Destextmid = Destext . Mid ( i ) ;
2007-01-15 00:34:27 +01:00
if ( Destextmid . StartsWith ( ke . hiragana ) | | Destextmid . StartsWith ( ke . katakana ) ) {
DestText - > SetSelection ( 0 , i ) ;
return ;
}
}
}
}
}
2007-01-16 21:55:27 +01:00
# endif
# ifdef ROMAJI_SEARCH_DISTANCE
2007-01-15 00:34:27 +01:00
if ( ROMAJI_SEARCH_DISTANCE > 0 & & ! foundit ) {
wxString Destext = DestText - > GetValue ( ) ;
wxString NextSGroup , trimmed ;
int highlight = SourceText - > GetStringSelection ( ) . Len ( ) ;
int start = GetSourceArrayPos ( false ) ;
//GetSourceArrayPos is going to give us the next pos already
// and not our current pos, so subtract 1 from it for end.
2007-01-16 23:32:05 +01:00
int end = MIN ( RegroupTotalLen , start + ( ROMAJI_SEARCH_DISTANCE - 1 ) ) ;
2007-01-15 00:34:27 +01:00
2007-01-16 23:32:05 +01:00
for ( int i = start ; foundit = = false & & i ! = end ; i + + ) {
2007-01-15 00:34:27 +01:00
NextSGroup = RegroupSourceText [ i ] ;
trimmed = NextSGroup . Trim ( false ) . Trim ( true ) ;
NextSGroup = RegroupSourceText [ i ] ;
2007-01-16 21:55:27 +01:00
if ( ( NextSGroup . Len ( ) > 0 | | i = = start ) & & NextSGroup . EndsWith ( _T ( " " ) ) & & Destext . at ( 1 ) = = ' ' ) {
SourceText - > SetSelection ( 0 , highlight ) ;
DestText - > SetSelection ( 0 , 1 ) ;
foundit = true ;
}
else {
for ( std : : list < KanaEntry > : : iterator iter = kt - > entries . begin ( ) ; iter ! = kt - > entries . end ( ) ; iter + + ) {
KanaEntry ke = * iter ;
2007-01-16 23:32:05 +01:00
if ( trimmed . StartsWith ( ke . hepburn ) ) {
2007-01-16 21:55:27 +01:00
int foundhira = Destext . Find ( ke . hiragana ) ;
int foundkata = Destext . Find ( ke . katakana ) ;
int foundat ;
if ( foundhira > 0 & & foundkata > 0 ) foundat = MIN ( foundhira , foundkata ) ;
else if ( foundhira > 0 ) foundat = foundhira ;
else foundat = foundkata ; //-1 is fine
2007-01-16 23:32:05 +01:00
//if (foundat>0 && foundat<=ROMAJI_SEARCH_DISTANCE) {
if ( foundat = = 1 ) {
2007-01-16 21:55:27 +01:00
SourceText - > SetSelection ( 0 , highlight ) ;
DestText - > SetSelection ( 0 , foundat ) ;
foundit = true ;
}
break ;
2007-01-15 00:34:27 +01:00
}
2007-01-16 21:55:27 +01:00
} //end kana search
}
2007-01-15 00:34:27 +01:00
highlight + = NextSGroup . Len ( ) ;
}
} //end romaji interpolation
2007-01-16 21:55:27 +01:00
# endif
2007-01-15 00:34:27 +01:00
}
if ( ! foundit & & DestText - > GetValue ( ) . Len ( ) ! = 0 & & DestText - > GetStringSelection ( ) . Len ( ) = = 0 )
2007-01-13 08:04:12 +01:00
DestText - > SetSelection ( 0 , 1 ) ;
2007-01-15 00:34:27 +01:00
}
2007-01-13 08:04:12 +01:00
}
2007-01-15 00:34:27 +01:00
2007-01-13 03:22:28 +01:00
////////////////////////////////////////////////////
// Gets the current position in RegroupSourceText //
int DialogKanjiTimer : : GetSourceArrayPos ( bool GoingDown ) {
int Len = 0 ;
int index ;
for ( index = 0 ; index ! = GroupsList - > GetItemCount ( ) ; index + + ) {
Len + = RegroupGroups [ index < < 1 ] . Len ( ) ;
}
Len + = SourceText - > GetStringSelection ( ) . Len ( ) ;
for ( index = 0 ; Len > 0 & & index ! = RegroupTotalLen ; index + + ) {
Len - = RegroupSourceText [ index ] . Len ( ) ;
}
//Disregard \k blocks w/o text
if ( GoingDown ) {
index - - ;
while ( index ! = RegroupTotalLen & & RegroupSourceText [ index ] . Len ( ) = = 0 ) { index - - ; }
}
else {
while ( index ! = RegroupTotalLen & & RegroupSourceText [ index ] . Len ( ) = = 0 ) { index + + ; }
}
return index ;
}
2007-01-17 01:06:42 +01:00
//////////////////////////////////////////////////////////////////////////
/// Return dialogue index given a style and the number of the occurance //
// StyleName: The name of the style you're looking for //
// Occurance: Look for the nth dialogue occurance. Indexed from 0. //
2007-01-13 03:22:28 +01:00
int DialogKanjiTimer : : ListIndexFromStyleandIndex ( wxString StyleName , int Occurance ) {
AssDialogue * line ;
int index = 0 ;
int occindex = 0 ;
while ( line = grid - > GetDialogue ( index ) ) {
if ( line - > Style = = StyleName ) {
if ( occindex = = Occurance )
return index ;
occindex + + ;
}
index + + ;
}
return - 1 ;
}
DialogKanjiTimerEvent : : DialogKanjiTimerEvent ( DialogKanjiTimer * ctrl ) {
control = ctrl ;
}
// Event table
BEGIN_EVENT_TABLE ( DialogKanjiTimerEvent , wxEvtHandler )
EVT_KEY_DOWN ( DialogKanjiTimerEvent : : KeyHandler )
2007-01-13 08:04:12 +01:00
EVT_MOUSE_EVENTS ( DialogKanjiTimerEvent : : MouseHandler )
2007-01-13 03:22:28 +01:00
END_EVENT_TABLE ( )
// Redirects
void DialogKanjiTimerEvent : : KeyHandler ( wxKeyEvent & event ) { control - > OnKeyDown ( event ) ; }
2007-01-13 08:04:12 +01:00
void DialogKanjiTimerEvent : : MouseHandler ( wxMouseEvent & event ) {
control - > OnMouseEvent ( event ) ;
}