2006-01-16 22:02:54 +01:00
// Copyright (c) 2005, Rodrigo Braz Monteiro
// 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
//
////////////
// Includes
2009-01-04 07:31:48 +01:00
# include "config.h"
2006-01-16 22:02:54 +01:00
# include <wx/filename.h>
2006-12-26 05:48:53 +01:00
# include <wx/filedlg.h>
# include <wx/choicdlg.h>
2007-09-12 01:22:26 +02:00
# include <wx/intl.h>
# include <wx/clipbrd.h>
# include <wx/tokenzr.h>
2006-01-16 22:02:54 +01:00
# include "dialog_style_manager.h"
# include "dialog_style_editor.h"
# include "ass_style.h"
# include "ass_file.h"
2006-10-20 00:53:06 +02:00
# include "ass_dialogue.h"
2007-06-21 02:46:50 +02:00
# include "standard_paths.h"
2006-01-16 22:02:54 +01:00
# include "options.h"
# include "subs_grid.h"
2007-07-05 01:09:40 +02:00
# include "utils.h"
2007-08-18 04:00:20 +02:00
# include "help_button.h"
2009-07-24 02:08:25 +02:00
# include "libresrc/libresrc.h"
2009-07-25 18:15:13 +02:00
2006-01-16 22:02:54 +01:00
///////////////
// Constructor
DialogStyleManager : : DialogStyleManager ( wxWindow * parent , SubtitlesGrid * _grid )
: wxDialog ( parent , - 1 , _ ( " Styles Manager " ) , wxDefaultPosition , wxDefaultSize , wxDEFAULT_DIALOG_STYLE , _T ( " DialogStylesManager " ) )
{
2007-06-28 22:29:56 +02:00
// Set icon
2009-07-25 06:49:59 +02:00
SetIcon ( BitmapToIcon ( GETIMAGE ( style_toolbutton_24 ) ) ) ;
2007-06-28 22:29:56 +02:00
2006-01-16 22:02:54 +01:00
// Vars
grid = _grid ;
// Catalog
wxSizer * CatalogBox = new wxStaticBoxSizer ( wxHORIZONTAL , this , _ ( " Catalog of available storages " ) ) ;
2007-10-21 01:04:06 +02:00
CatalogList = new wxComboBox ( this , LIST_CATALOG , _T ( " " ) , wxDefaultPosition , wxSize ( - 1 , - 1 ) , 0 , NULL , wxCB_READONLY | wxCB_READONLY , wxDefaultValidator , _T ( " Catalog List " ) ) ;
wxButton * CatalogNew = new wxButton ( this , BUTTON_CATALOG_NEW , _ ( " New " ) , wxDefaultPosition , wxSize ( - 1 , - 1 ) ) ;
wxButton * CatalogDelete = new wxButton ( this , BUTTON_CATALOG_DELETE , _ ( " Delete " ) , wxDefaultPosition , wxSize ( - 1 , - 1 ) ) ;
2006-01-16 22:02:54 +01:00
CatalogBox - > Add ( CatalogList , 1 , wxEXPAND | wxRIGHT | wxALIGN_RIGHT , 5 ) ;
CatalogBox - > Add ( CatalogNew , 0 , wxRIGHT , 5 ) ;
CatalogBox - > Add ( CatalogDelete , 0 , 0 , 0 ) ;
// Storage styles list
2007-07-02 08:18:28 +02:00
StorageList = new wxListBox ( this , LIST_STORAGE , wxDefaultPosition , wxSize ( 240 , 250 ) , 0 , NULL , wxLB_EXTENDED ) ;
2006-01-16 22:02:54 +01:00
wxSizer * StorageBox = new wxStaticBoxSizer ( wxVERTICAL , this , _ ( " Storage " ) ) ;
wxSizer * StorageButtons = new wxBoxSizer ( wxHORIZONTAL ) ;
2007-07-02 08:18:28 +02:00
wxSizer * StorageButtonsLow = new wxBoxSizer ( wxVERTICAL ) ;
wxSizer * StorageListSizer = new wxBoxSizer ( wxHORIZONTAL ) ;
2007-10-21 01:04:06 +02:00
MoveToLocal = new wxButton ( this , BUTTON_STORAGE_COPYTO , _ ( " Copy to current script -> " ) , wxDefaultPosition , wxSize ( 205 , - 1 ) ) ;
StorageNew = new wxButton ( this , BUTTON_STORAGE_NEW , _ ( " New " ) , wxDefaultPosition , wxSize ( 40 , - 1 ) ) ;
StorageEdit = new wxButton ( this , BUTTON_STORAGE_EDIT , _ ( " Edit " ) , wxDefaultPosition , wxSize ( 40 , - 1 ) ) ;
StorageCopy = new wxButton ( this , BUTTON_STORAGE_COPY , _ ( " Copy " ) , wxDefaultPosition , wxSize ( 40 , - 1 ) ) ;
StorageDelete = new wxButton ( this , BUTTON_STORAGE_DELETE , _ ( " Delete " ) , wxDefaultPosition , wxSize ( 40 , - 1 ) ) ;
2007-07-02 08:18:28 +02:00
StorageButtons - > Add ( StorageNew , 1 , wxEXPAND | wxRIGHT , 5 ) ;
StorageButtons - > Add ( StorageEdit , 1 , wxEXPAND | wxRIGHT , 5 ) ;
StorageButtons - > Add ( StorageCopy , 1 , wxEXPAND | wxRIGHT , 5 ) ;
2006-01-16 22:02:54 +01:00
StorageButtons - > Add ( StorageDelete , 1 , wxEXPAND | wxALL , 0 ) ;
2009-07-25 06:49:59 +02:00
StorageMoveUp = new wxBitmapButton ( this , BUTTON_STORAGE_UP , GETIMAGE ( arrow_up_24 ) ) ;
StorageMoveDown = new wxBitmapButton ( this , BUTTON_STORAGE_DOWN , GETIMAGE ( arrow_down_24 ) ) ;
StorageMoveTop = new wxBitmapButton ( this , BUTTON_STORAGE_TOP , GETIMAGE ( arrow_up_stop_24 ) ) ;
StorageMoveBottom = new wxBitmapButton ( this , BUTTON_STORAGE_BOTTOM , GETIMAGE ( arrow_down_stop_24 ) ) ;
StorageSort = new wxBitmapButton ( this , BUTTON_STORAGE_SORT , GETIMAGE ( arrow_sort_24 ) ) ;
2007-07-02 08:18:28 +02:00
StorageMoveUp - > SetToolTip ( _ ( " Move style up. " ) ) ;
StorageMoveDown - > SetToolTip ( _ ( " Move style down. " ) ) ;
StorageMoveTop - > SetToolTip ( _ ( " Move style to top. " ) ) ;
StorageMoveBottom - > SetToolTip ( _ ( " Move style to bottom. " ) ) ;
StorageSort - > SetToolTip ( _ ( " Sort styles alphabetically. " ) ) ;
StorageButtonsLow - > AddStretchSpacer ( 1 ) ;
StorageButtonsLow - > Add ( StorageMoveTop , 0 , wxEXPAND | wxALL , 0 ) ;
StorageButtonsLow - > Add ( StorageMoveUp , 0 , wxEXPAND | wxALL , 0 ) ;
StorageButtonsLow - > Add ( StorageMoveDown , 0 , wxEXPAND | wxALL , 0 ) ;
StorageButtonsLow - > Add ( StorageMoveBottom , 0 , wxEXPAND | wxALL , 0 ) ;
StorageButtonsLow - > Add ( StorageSort , 0 , wxEXPAND | wxALL , 0 ) ;
StorageButtonsLow - > AddStretchSpacer ( 1 ) ;
StorageListSizer - > Add ( StorageList , 1 , wxEXPAND | wxRIGHT , 0 ) ;
StorageListSizer - > Add ( StorageButtonsLow , 0 , wxEXPAND | wxALL , 0 ) ;
StorageBox - > Add ( StorageListSizer , 1 , wxEXPAND | wxBOTTOM , 5 ) ;
StorageBox - > Add ( MoveToLocal , 0 , wxEXPAND | wxBOTTOM , 5 ) ;
StorageBox - > Add ( StorageButtons , 0 , wxEXPAND | wxBOTTOM , 0 ) ;
2006-01-16 22:02:54 +01:00
MoveToLocal - > Disable ( ) ;
2006-10-20 00:53:06 +02:00
StorageEdit - > Disable ( ) ;
2006-01-16 22:02:54 +01:00
StorageCopy - > Disable ( ) ;
StorageDelete - > Disable ( ) ;
// Local styles list
2007-07-02 08:18:28 +02:00
CurrentList = new wxListBox ( this , LIST_CURRENT , wxDefaultPosition , wxSize ( 240 , 250 ) , 0 , NULL , wxLB_EXTENDED ) ;
2006-01-16 22:02:54 +01:00
wxSizer * CurrentBox = new wxStaticBoxSizer ( wxVERTICAL , this , _ ( " Current script " ) ) ;
wxSizer * CurrentButtons = new wxBoxSizer ( wxHORIZONTAL ) ;
2007-07-02 08:18:28 +02:00
wxSizer * CurrentButtonsLow = new wxBoxSizer ( wxVERTICAL ) ;
wxSizer * CurrentListSizer = new wxBoxSizer ( wxHORIZONTAL ) ;
wxSizer * MoveImportSizer = new wxBoxSizer ( wxHORIZONTAL ) ;
MoveToStorage = new wxButton ( this , BUTTON_CURRENT_COPYTO , _ ( " <- Copy to storage " ) , wxDefaultPosition , wxSize ( - 1 , 25 ) ) ;
2007-08-16 01:17:42 +02:00
MoveImportSizer - > Add ( MoveToStorage , 1 , wxEXPAND | wxRIGHT , 5 ) ;
MoveImportSizer - > Add ( new wxButton ( this , BUTTON_CURRENT_IMPORT , _ ( " Import from script... " ) ) , 1 , wxEXPAND , 0 ) ;
2007-10-21 01:04:06 +02:00
CurrentNew = new wxButton ( this , BUTTON_CURRENT_NEW , _ ( " New " ) , wxDefaultPosition , wxSize ( 40 , - 1 ) ) ;
CurrentEdit = new wxButton ( this , BUTTON_CURRENT_EDIT , _ ( " Edit " ) , wxDefaultPosition , wxSize ( 40 , - 1 ) ) ;
CurrentCopy = new wxButton ( this , BUTTON_CURRENT_COPY , _ ( " Copy " ) , wxDefaultPosition , wxSize ( 40 , - 1 ) ) ;
CurrentDelete = new wxButton ( this , BUTTON_CURRENT_DELETE , _ ( " Delete " ) , wxDefaultPosition , wxSize ( 40 , - 1 ) ) ;
2007-07-02 08:18:28 +02:00
CurrentButtons - > Add ( CurrentNew , 1 , wxEXPAND | wxRIGHT , 5 ) ;
CurrentButtons - > Add ( CurrentEdit , 1 , wxEXPAND | wxRIGHT , 5 ) ;
CurrentButtons - > Add ( CurrentCopy , 1 , wxEXPAND | wxRIGHT , 5 ) ;
2006-01-16 22:02:54 +01:00
CurrentButtons - > Add ( CurrentDelete , 1 , wxEXPAND | wxALL , 0 ) ;
2009-07-25 06:49:59 +02:00
CurrentMoveUp = new wxBitmapButton ( this , BUTTON_CURRENT_UP , GETIMAGE ( arrow_up_24 ) ) ;
CurrentMoveDown = new wxBitmapButton ( this , BUTTON_CURRENT_DOWN , GETIMAGE ( arrow_down_24 ) ) ;
CurrentMoveTop = new wxBitmapButton ( this , BUTTON_CURRENT_TOP , GETIMAGE ( arrow_up_stop_24 ) ) ;
CurrentMoveBottom = new wxBitmapButton ( this , BUTTON_CURRENT_BOTTOM , GETIMAGE ( arrow_down_stop_24 ) ) ;
CurrentSort = new wxBitmapButton ( this , BUTTON_CURRENT_SORT , GETIMAGE ( arrow_sort_24 ) ) ;
2007-07-02 08:18:28 +02:00
CurrentMoveUp - > SetToolTip ( _ ( " Move style up. " ) ) ;
CurrentMoveDown - > SetToolTip ( _ ( " Move style down. " ) ) ;
CurrentMoveTop - > SetToolTip ( _ ( " Move style to top. " ) ) ;
CurrentMoveBottom - > SetToolTip ( _ ( " Move style to bottom. " ) ) ;
CurrentSort - > SetToolTip ( _ ( " Sort styles alphabetically. " ) ) ;
CurrentButtonsLow - > AddStretchSpacer ( 1 ) ;
CurrentButtonsLow - > Add ( CurrentMoveTop , 0 , wxEXPAND | wxALL , 0 ) ;
CurrentButtonsLow - > Add ( CurrentMoveUp , 0 , wxEXPAND | wxALL , 0 ) ;
CurrentButtonsLow - > Add ( CurrentMoveDown , 0 , wxEXPAND | wxALL , 0 ) ;
CurrentButtonsLow - > Add ( CurrentMoveBottom , 0 , wxEXPAND | wxALL , 0 ) ;
CurrentButtonsLow - > Add ( CurrentSort , 0 , wxEXPAND | wxALL , 0 ) ;
CurrentButtonsLow - > AddStretchSpacer ( 1 ) ;
CurrentListSizer - > Add ( CurrentList , 1 , wxEXPAND | wxRIGHT , 0 ) ;
CurrentListSizer - > Add ( CurrentButtonsLow , 0 , wxEXPAND | wxALL , 0 ) ;
CurrentBox - > Add ( CurrentListSizer , 1 , wxEXPAND | wxBOTTOM , 5 ) ;
CurrentBox - > Add ( MoveImportSizer , 0 , wxEXPAND | wxBOTTOM , 5 ) ;
CurrentBox - > Add ( CurrentButtons , 0 , wxEXPAND | wxBOTTOM , 0 ) ;
2006-01-16 22:02:54 +01:00
MoveToStorage - > Disable ( ) ;
2006-10-20 00:53:06 +02:00
CurrentEdit - > Disable ( ) ;
2006-01-16 22:02:54 +01:00
CurrentCopy - > Disable ( ) ;
CurrentDelete - > Disable ( ) ;
2007-06-23 09:27:09 +02:00
// Buttons
wxStdDialogButtonSizer * buttonSizer = new wxStdDialogButtonSizer ( ) ;
buttonSizer - > SetCancelButton ( new wxButton ( this , wxID_CLOSE ) ) ;
2008-01-13 22:05:31 +01:00
buttonSizer - > AddButton ( new HelpButton ( this , _T ( " Styles Manager " ) ) ) ;
2007-06-23 09:27:09 +02:00
buttonSizer - > Realize ( ) ;
2006-01-16 22:02:54 +01:00
// General layout
wxSizer * StylesSizer = new wxBoxSizer ( wxHORIZONTAL ) ;
2006-12-26 05:48:53 +01:00
StylesSizer - > Add ( StorageBox , 0 , wxRIGHT | wxEXPAND , 5 ) ;
StylesSizer - > Add ( CurrentBox , 0 , wxLEFT | wxEXPAND , 0 ) ;
2006-01-16 22:02:54 +01:00
MainSizer = new wxBoxSizer ( wxVERTICAL ) ;
MainSizer - > Add ( CatalogBox , 0 , wxEXPAND | wxLEFT | wxRIGHT | wxTOP , 5 ) ;
2007-06-23 09:27:09 +02:00
MainSizer - > Add ( StylesSizer , 1 , wxEXPAND | wxALL , 5 ) ;
MainSizer - > Add ( buttonSizer , 0 , wxBOTTOM | wxEXPAND , 5 ) ;
2006-01-16 22:02:54 +01:00
// Set sizer
SetSizer ( MainSizer ) ;
MainSizer - > SetSizeHints ( this ) ;
// Position window
if ( lastx = = - 1 & & lasty = = - 1 ) {
CenterOnParent ( ) ;
} else {
Move ( lastx , lasty ) ;
}
// Populate lists
LoadCatalog ( ) ;
LoadCurrentStyles ( AssFile : : top ) ;
2006-10-20 00:53:06 +02:00
2007-02-05 20:09:45 +01:00
//Set key handlers for lists
2007-03-18 03:18:25 +01:00
CatalogList - > PushEventHandler ( new DialogStyleManagerEvent ( this ) ) ;
2007-02-07 17:39:05 +01:00
StorageList - > PushEventHandler ( new DialogStyleManagerEvent ( this ) ) ;
CurrentList - > PushEventHandler ( new DialogStyleManagerEvent ( this ) ) ;
2007-02-05 20:09:45 +01:00
2006-10-20 00:53:06 +02:00
// Select default item
wxString selected_style ;
if ( _grid ) {
AssDialogue * dia = _grid - > GetDialogue ( _grid - > GetFirstSelRow ( ) ) ;
2007-02-25 19:08:19 +01:00
if ( dia ) selected_style = dia - > Style ;
2006-10-20 00:53:06 +02:00
}
2006-12-01 00:37:34 +01:00
if ( StorageList - > GetCount ( ) & & StorageList - > SetStringSelection ( selected_style ) ) {
2006-10-20 00:53:06 +02:00
StorageEdit - > Enable ( ) ;
StorageCopy - > Enable ( ) ;
StorageDelete - > Enable ( ) ;
MoveToLocal - > Enable ( ) ;
}
2006-12-01 00:37:34 +01:00
if ( CurrentList - > GetCount ( ) & & CurrentList - > SetStringSelection ( selected_style ) ) {
2006-10-20 00:53:06 +02:00
CurrentEdit - > Enable ( ) ;
CurrentCopy - > Enable ( ) ;
CurrentDelete - > Enable ( ) ;
MoveToStorage - > Enable ( ) ;
}
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
//////////////
// Destructor
DialogStyleManager : : ~ DialogStyleManager ( ) {
int sel = CatalogList - > GetSelection ( ) ;
if ( sel ! = wxNOT_FOUND ) {
AssFile : : top - > SetScriptInfo ( _T ( " Last Style Storage " ) , CatalogList - > GetString ( sel ) ) ;
}
2009-05-22 00:15:32 +02:00
CatalogList - > PopEventHandler ( true ) ;
StorageList - > PopEventHandler ( true ) ;
CurrentList - > PopEventHandler ( true ) ;
2009-05-22 00:24:52 +02:00
Store . Clear ( ) ;
2006-01-16 22:02:54 +01:00
}
/////////////////////
// Loads the catalog
void DialogStyleManager : : LoadCatalog ( ) {
// Clear
CatalogList - > Clear ( ) ;
// Create catalog if it doesn't exist
2007-06-21 02:46:50 +02:00
wxString dirname = StandardPaths : : DecodePath ( _T ( " ?user/catalog/ " ) ) ;
2006-01-16 22:02:54 +01:00
if ( ! wxDirExists ( dirname ) ) {
if ( ! wxMkdir ( dirname ) ) {
2007-07-18 15:46:38 +02:00
throw _T ( " Failed creating directory for style catalogues " ) ;
2006-01-16 22:02:54 +01:00
}
else {
// Create default style
Store . Clear ( ) ;
AssStyle * defstyle = new AssStyle ;
Store . style . push_back ( defstyle ) ;
Store . Save ( _T ( " Default " ) ) ;
}
}
// Get dir
2007-06-21 02:46:50 +02:00
dirname = StandardPaths : : DecodePath ( _T ( " ?user/catalog/*.sty " ) ) ;
2006-01-16 22:02:54 +01:00
// Populate
wxString curfile = wxFindFirstFile ( dirname , wxFILE ) ;
wxString path , name , ext ;
while ( ! curfile . empty ( ) ) {
wxFileName : : SplitPath ( curfile , & path , & name , & ext ) ;
CatalogList - > Append ( name ) ;
curfile = wxFindNextFile ( ) ;
}
// Set to default if available
StorageActions ( false ) ;
wxString pickStyle = AssFile : : top - > GetScriptInfo ( _T ( " Last Style Storage " ) ) ;
2006-02-20 22:32:58 +01:00
if ( pickStyle . IsEmpty ( ) ) pickStyle = _T ( " Default " ) ;
2008-09-06 13:35:36 +02:00
int opt = CatalogList - > FindString ( pickStyle , false ) ;
2006-01-16 22:02:54 +01:00
if ( opt ! = wxNOT_FOUND ) {
CatalogList - > SetSelection ( opt ) ;
wxCommandEvent dummy ;
OnChangeCatalog ( dummy ) ;
}
}
////////////////////
// Loads style list
void DialogStyleManager : : LoadCurrentStyles ( AssFile * subs ) {
using std : : list ;
AssStyle * style ;
// Reset
CurrentList - > Clear ( ) ;
styleMap . clear ( ) ;
// Add styles
for ( list < AssEntry * > : : iterator cur = subs - > Line . begin ( ) ; cur ! = subs - > Line . end ( ) ; cur + + ) {
style = AssEntry : : GetAsStyle ( * cur ) ;
if ( style ) {
if ( style - > Valid ) {
CurrentList - > Append ( style - > name ) ;
styleMap . push_back ( style ) ;
}
}
}
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
void DialogStyleManager : : LoadStorageStyles ( ) {
using std : : list ;
AssStyle * style ;
// Reset
StorageList - > Clear ( ) ;
styleStorageMap . clear ( ) ;
// Add styles
for ( list < AssStyle * > : : iterator cur = Store . style . begin ( ) ; cur ! = Store . style . end ( ) ; cur + + ) {
style = * cur ;
if ( style ) {
if ( style - > Valid ) {
StorageList - > Append ( style - > name ) ;
styleStorageMap . push_back ( style ) ;
}
}
}
// Flag change
wxCommandEvent dummy ;
OnStorageChange ( dummy ) ;
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
///////////////////////////////////////
// Enables or disables storage actions
void DialogStyleManager : : StorageActions ( bool state ) {
StorageList - > Enable ( state ) ;
MoveToLocal - > Enable ( state ) ;
StorageNew - > Enable ( state ) ;
StorageCopy - > Enable ( state ) ;
StorageDelete - > Enable ( state ) ;
wxCommandEvent dummy ;
OnStorageChange ( dummy ) ;
wxArrayInt selections ;
if ( CurrentList - > GetSelections ( selections ) ! = 0 ) MoveToStorage - > Enable ( state ) ;
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
///////////////
// Event table
BEGIN_EVENT_TABLE ( DialogStyleManager , wxDialog )
EVT_BUTTON ( wxID_CLOSE , DialogStyleManager : : OnClose )
EVT_BUTTON ( BUTTON_CATALOG_NEW , DialogStyleManager : : OnCatalogNew )
EVT_BUTTON ( BUTTON_CATALOG_DELETE , DialogStyleManager : : OnCatalogDelete )
EVT_COMBOBOX ( LIST_CATALOG , DialogStyleManager : : OnChangeCatalog )
EVT_LISTBOX ( LIST_CURRENT , DialogStyleManager : : OnCurrentChange )
EVT_LISTBOX ( LIST_STORAGE , DialogStyleManager : : OnStorageChange )
EVT_LISTBOX_DCLICK ( LIST_STORAGE , DialogStyleManager : : OnStorageEdit )
EVT_LISTBOX_DCLICK ( LIST_CURRENT , DialogStyleManager : : OnCurrentEdit )
EVT_BUTTON ( BUTTON_CURRENT_COPYTO , DialogStyleManager : : OnCopyToStorage )
EVT_BUTTON ( BUTTON_STORAGE_COPYTO , DialogStyleManager : : OnCopyToCurrent )
2006-10-20 00:53:06 +02:00
EVT_BUTTON ( BUTTON_CURRENT_EDIT , DialogStyleManager : : OnCurrentEdit )
EVT_BUTTON ( BUTTON_STORAGE_EDIT , DialogStyleManager : : OnStorageEdit )
2006-01-16 22:02:54 +01:00
EVT_BUTTON ( BUTTON_CURRENT_COPY , DialogStyleManager : : OnCurrentCopy )
EVT_BUTTON ( BUTTON_STORAGE_COPY , DialogStyleManager : : OnStorageCopy )
EVT_BUTTON ( BUTTON_CURRENT_NEW , DialogStyleManager : : OnCurrentNew )
EVT_BUTTON ( BUTTON_STORAGE_NEW , DialogStyleManager : : OnStorageNew )
EVT_BUTTON ( BUTTON_CURRENT_DELETE , DialogStyleManager : : OnCurrentDelete )
EVT_BUTTON ( BUTTON_STORAGE_DELETE , DialogStyleManager : : OnStorageDelete )
2006-12-26 05:48:53 +01:00
EVT_BUTTON ( BUTTON_CURRENT_IMPORT , DialogStyleManager : : OnCurrentImport )
2006-12-26 22:45:23 +01:00
EVT_BUTTON ( BUTTON_CURRENT_UP , DialogStyleManager : : OnCurrentMoveUp )
EVT_BUTTON ( BUTTON_CURRENT_TOP , DialogStyleManager : : OnCurrentMoveTop )
EVT_BUTTON ( BUTTON_CURRENT_DOWN , DialogStyleManager : : OnCurrentMoveDown )
EVT_BUTTON ( BUTTON_CURRENT_BOTTOM , DialogStyleManager : : OnCurrentMoveBottom )
2006-12-26 23:28:44 +01:00
EVT_BUTTON ( BUTTON_CURRENT_SORT , DialogStyleManager : : OnCurrentSort )
2006-12-26 22:45:23 +01:00
EVT_BUTTON ( BUTTON_STORAGE_UP , DialogStyleManager : : OnStorageMoveUp )
EVT_BUTTON ( BUTTON_STORAGE_TOP , DialogStyleManager : : OnStorageMoveTop )
EVT_BUTTON ( BUTTON_STORAGE_DOWN , DialogStyleManager : : OnStorageMoveDown )
EVT_BUTTON ( BUTTON_STORAGE_BOTTOM , DialogStyleManager : : OnStorageMoveBottom )
2006-12-26 23:28:44 +01:00
EVT_BUTTON ( BUTTON_STORAGE_SORT , DialogStyleManager : : OnStorageSort )
2006-01-16 22:02:54 +01:00
END_EVENT_TABLE ( )
//////////
// Events
/////////
// Close
void DialogStyleManager : : OnClose ( wxCommandEvent & event ) {
GetPosition ( & lastx , & lasty ) ;
Close ( ) ;
}
////////////////////////
// Change catalog entry
void DialogStyleManager : : OnChangeCatalog ( wxCommandEvent & event ) {
int sel = CatalogList - > GetSelection ( ) ;
if ( sel ! = wxNOT_FOUND ) {
StorageActions ( true ) ;
Store . Load ( CatalogList - > GetString ( sel ) ) ;
LoadStorageStyles ( ) ;
}
else {
StorageActions ( false ) ;
Store . Clear ( ) ;
LoadStorageStyles ( ) ;
}
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
/////////////////////
// New catalog entry
void DialogStyleManager : : OnCatalogNew ( wxCommandEvent & event ) {
wxString name = wxGetTextFromUser ( _ ( " New storage name: " ) , _ ( " New catalog entry " ) , _T ( " " ) , this ) ;
if ( ! name . empty ( ) ) {
2006-11-23 20:08:46 +01:00
// Remove bad characters from the name
wxString badchars = wxFileName : : GetForbiddenChars ( ) ;
int badchars_removed = 0 ;
for ( size_t i = 0 ; i < name . Length ( ) ; + + i ) {
for ( size_t j = 0 ; j < badchars . Length ( ) ; + + j ) {
if ( name [ i ] = = badchars [ j ] ) {
name [ i ] = _T ( ' _ ' ) ;
+ + badchars_removed ;
}
}
}
2007-04-08 02:10:42 +02:00
2008-09-06 13:35:36 +02:00
// Make sure that there is no storage with the same name (case insensitive search since Windows filenames are case insensitive)
if ( CatalogList - > FindString ( name , false ) ! = wxNOT_FOUND ) {
2009-07-24 04:10:41 +02:00
wxMessageBox ( _ ( " A catalog with that name already exists. " ) , _ ( " Catalog name conflict " ) , wxICON_ERROR | wxOK ) ;
2007-04-08 02:10:42 +02:00
return ;
}
// Warn about bad characters
2006-11-23 20:08:46 +01:00
if ( badchars_removed > 0 ) {
2007-04-08 02:10:42 +02:00
wxMessageBox ( wxString : : Format ( _ ( " The specified catalog name contains one or more illegal characters. They have been replaced with underscores instead. \n The catalog has been renamed to \" %s \" . " ) , name . c_str ( ) ) , _ ( " Invalid characters " ) ) ;
2006-11-23 20:08:46 +01:00
}
2007-04-08 02:10:42 +02:00
// Add to list of storages
2006-01-16 22:02:54 +01:00
Store . Clear ( ) ;
StorageList - > Clear ( ) ;
CatalogList - > Append ( name ) ;
CatalogList - > SetStringSelection ( name ) ;
StorageActions ( true ) ;
2007-04-08 02:10:42 +02:00
// Save
2007-06-21 02:46:50 +02:00
wxString dirname = StandardPaths : : DecodePath ( _T ( " ?user/catalog/ " ) ) ;
2006-01-16 22:02:54 +01:00
if ( ! wxDirExists ( dirname ) ) {
if ( ! wxMkdir ( dirname ) ) {
2007-07-18 15:46:38 +02:00
throw _T ( " Failed creating directory for style catalogues " ) ;
2006-01-16 22:02:54 +01:00
}
}
Store . Save ( name ) ;
}
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
//////////////////
// Catalog delete
void DialogStyleManager : : OnCatalogDelete ( wxCommandEvent & event ) {
int sel = CatalogList - > GetSelection ( ) ;
if ( sel ! = wxNOT_FOUND ) {
wxString name = CatalogList - > GetString ( sel ) ;
2007-09-12 01:22:26 +02:00
wxString message = wxString : : Format ( _ ( " Are you sure you want to delete the storage \" %s \" from the catalog? " ) , name . c_str ( ) ) ;
2006-01-16 22:02:54 +01:00
int option = wxMessageBox ( message , _ ( " Confirm delete " ) , wxYES_NO | wxICON_EXCLAMATION , this ) ;
if ( option = = wxYES ) {
2007-06-21 02:46:50 +02:00
wxRemoveFile ( StandardPaths : : DecodePath ( _T ( " ?user/catalog/ " ) + name + _T ( " .sty " ) ) ) ;
2006-01-16 22:02:54 +01:00
CatalogList - > Delete ( sel ) ;
StorageList - > Clear ( ) ;
StorageActions ( false ) ;
}
}
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
/////////////////////////
// Edit style on storage
void DialogStyleManager : : OnStorageEdit ( wxCommandEvent & event ) {
wxArrayInt selections ;
int n = StorageList - > GetSelections ( selections ) ;
AssStyle * temp ;
if ( n = = 1 ) {
temp = styleStorageMap . at ( selections [ 0 ] ) ;
2007-07-27 08:14:38 +02:00
DialogStyleEditor editor ( this , temp , grid , false , & Store ) ;
2006-01-16 22:02:54 +01:00
int modified = editor . ShowModal ( ) ;
if ( modified ) {
//LoadStorageStyles();
StorageList - > SetString ( selections [ 0 ] , temp - > name ) ;
Store . Save ( CatalogList - > GetString ( CatalogList - > GetSelection ( ) ) ) ;
}
}
else if ( n > 1 ) {
2006-12-26 22:45:23 +01:00
}
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
////////////////////////////////
// Edit style on current script
void DialogStyleManager : : OnCurrentEdit ( wxCommandEvent & event ) {
wxArrayInt selections ;
int n = CurrentList - > GetSelections ( selections ) ;
AssStyle * temp ;
if ( n = = 1 ) {
temp = styleMap . at ( selections [ 0 ] ) ;
2007-07-27 08:14:38 +02:00
DialogStyleEditor editor ( this , temp , grid , true , & Store ) ;
2006-01-16 22:02:54 +01:00
int modified = editor . ShowModal ( ) ;
if ( modified ) {
CurrentList - > SetString ( selections [ 0 ] , temp - > name ) ;
}
}
else if ( n > 1 ) {
}
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
///////////////////////////////////////
// Selection on current script changed
void DialogStyleManager : : OnCurrentChange ( wxCommandEvent & event ) {
wxArrayInt selections ;
int n = CurrentList - > GetSelections ( selections ) ;
2006-10-20 00:53:06 +02:00
CurrentEdit - > Enable ( n = = 1 ) ;
CurrentCopy - > Enable ( n = = 1 ) ;
CurrentDelete - > Enable ( n > 0 ) ;
MoveToStorage - > Enable ( n > 0 ) ;
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
////////////////////////////////
// Selection on storage changed
void DialogStyleManager : : OnStorageChange ( wxCommandEvent & event ) {
wxArrayInt selections ;
int n = StorageList - > GetSelections ( selections ) ;
2006-10-20 00:53:06 +02:00
StorageEdit - > Enable ( n = = 1 ) ;
StorageCopy - > Enable ( n = = 1 ) ;
StorageDelete - > Enable ( n > 0 ) ;
MoveToLocal - > Enable ( n > 0 ) ;
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
///////////////////
// Copy to Storage
void DialogStyleManager : : OnCopyToStorage ( wxCommandEvent & event ) {
// Check if there is actually a storage
if ( ! StorageNew - > IsEnabled ( ) ) {
return ;
}
wxArrayInt selections ;
int n = CurrentList - > GetSelections ( selections ) ;
2009-07-18 04:52:46 +02:00
for ( int i = 0 ; i < n ; i + + ) {
wxString styleName = CurrentList - > GetString ( selections [ i ] ) ;
bool addStyle = true ;
for ( std : : list < AssStyle * > : : iterator style = Store . style . begin ( ) ; style ! = Store . style . end ( ) ; + + style ) {
if ( ( * style ) - > name . CmpNoCase ( styleName ) = = 0 ) {
addStyle = false ;
if ( wxYES = = wxMessageBox ( wxString : : Format ( _T ( " There is already a style with the name \" %s \" on the current storage. Proceed and overwrite anyway? " ) , styleName ) , _T ( " Style name collision. " ) , wxYES_NO ) ) {
* * style = * styleMap . at ( selections [ i ] ) ;
}
break ;
2008-01-13 07:42:34 +01:00
}
2009-07-18 04:52:46 +02:00
}
if ( addStyle ) {
AssStyle * temp = new AssStyle ( * styleMap . at ( selections [ i ] ) ) ;
Store . style . push_back ( temp ) ;
2006-01-16 22:02:54 +01:00
}
}
Store . Save ( CatalogList - > GetString ( CatalogList - > GetSelection ( ) ) ) ;
LoadStorageStyles ( ) ;
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
///////////////////
// Copy to Current
void DialogStyleManager : : OnCopyToCurrent ( wxCommandEvent & event ) {
wxArrayInt selections ;
int n = StorageList - > GetSelections ( selections ) ;
2009-07-18 04:52:46 +02:00
for ( int i = 0 ; i < n ; i + + ) {
wxString styleName = StorageList - > GetString ( selections [ i ] ) ;
bool addStyle = true ;
for ( std : : vector < AssStyle * > : : iterator style = styleMap . begin ( ) ; style ! = styleMap . end ( ) ; + + style ) {
if ( ( * style ) - > name . CmpNoCase ( styleName ) = = 0 ) {
addStyle = false ;
if ( wxYES = = wxMessageBox ( wxString : : Format ( _T ( " There is already a style with the name \" %s \" on the current script. Proceed and overwrite anyway? " ) , styleName ) , _T ( " Style name collision. " ) , wxYES_NO ) ) {
* * style = * styleStorageMap . at ( selections [ i ] ) ;
}
break ;
}
2006-12-17 21:30:59 +01:00
}
2009-07-18 04:52:46 +02:00
if ( addStyle ) {
AssStyle * temp = new AssStyle ( * styleStorageMap . at ( selections [ i ] ) ) ;
2006-01-16 22:02:54 +01:00
AssFile : : top - > InsertStyle ( temp ) ;
}
}
LoadCurrentStyles ( AssFile : : top ) ;
2007-01-26 01:47:42 +01:00
grid - > ass - > FlagAsModified ( _ ( " style copy " ) ) ;
2006-01-16 22:02:54 +01:00
grid - > CommitChanges ( ) ;
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
/////////////////////
// Storage make copy
void DialogStyleManager : : OnStorageCopy ( wxCommandEvent & event ) {
wxArrayInt selections ;
2007-01-27 00:42:19 +01:00
StorageList - > GetSelections ( selections ) ;
2009-07-18 04:52:46 +02:00
AssStyle * temp = new AssStyle ( * ( styleStorageMap . at ( selections [ 0 ] ) ) ) ;
2006-01-16 22:02:54 +01:00
wxString newName = _ ( " Copy of " ) ;
newName + = temp - > name ;
temp - > name = newName ;
2007-07-27 08:14:38 +02:00
DialogStyleEditor editor ( this , temp , grid , false , & Store ) ;
2006-01-16 22:02:54 +01:00
int modified = editor . ShowModal ( ) ;
if ( modified ) {
Store . style . push_back ( temp ) ;
Store . Save ( CatalogList - > GetString ( CatalogList - > GetSelection ( ) ) ) ;
LoadStorageStyles ( ) ;
StorageList - > SetStringSelection ( temp - > name ) ; // the copy/delete/copy-to-local buttons stay disabled after this?
}
else delete temp ;
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
/////////////////////
// Current make copy
void DialogStyleManager : : OnCurrentCopy ( wxCommandEvent & event ) {
wxArrayInt selections ;
2007-01-27 00:42:19 +01:00
CurrentList - > GetSelections ( selections ) ;
2006-01-16 22:02:54 +01:00
2006-02-27 03:23:50 +01:00
AssStyle * temp = new AssStyle ( styleMap . at ( selections [ 0 ] ) - > GetEntryData ( ) ) ;
2006-01-16 22:02:54 +01:00
wxString newName = _ ( " Copy of " ) ;
newName + = temp - > name ;
temp - > name = newName ;
2007-07-27 08:14:38 +02:00
DialogStyleEditor editor ( this , temp , grid , true , & Store ) ;
2006-01-16 22:02:54 +01:00
int modified = editor . ShowModal ( ) ;
if ( modified ) {
AssFile : : top - > InsertStyle ( temp ) ;
LoadCurrentStyles ( AssFile : : top ) ;
CurrentList - > SetStringSelection ( temp - > name ) ; // but even without this, the copy/delete/copy-to-storage buttons stay enabled?
}
else delete temp ;
2007-01-26 01:47:42 +01:00
grid - > ass - > FlagAsModified ( _ ( " style copy " ) ) ;
2006-01-16 22:02:54 +01:00
grid - > CommitChanges ( ) ;
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
2007-02-06 04:25:14 +01:00
//////////////////////
// Copy to clipboard
void DialogStyleManager : : CopyToClipboard ( wxListBox * list , std : : vector < AssStyle * > v ) {
wxString data = _T ( " " ) ;
AssStyle * s ;
wxArrayInt selections ;
list - > GetSelections ( selections ) ;
for ( int unsigned i = 0 ; i < selections . size ( ) ; i + + ) {
if ( i ! = 0 ) data + = _T ( " \r \n " ) ;
s = v . at ( selections [ i ] ) ;
s - > UpdateData ( ) ;
data + = s - > GetEntryData ( ) ;
}
if ( wxTheClipboard - > Open ( ) ) {
wxTheClipboard - > SetData ( new wxTextDataObject ( data ) ) ;
wxTheClipboard - > Close ( ) ;
}
}
////////////////////////
// Paste from clipboard
void DialogStyleManager : : PasteToCurrent ( ) {
wxString data = _T ( " " ) ;
if ( wxTheClipboard - > Open ( ) ) {
if ( wxTheClipboard - > IsSupported ( wxDF_TEXT ) ) {
wxTextDataObject rawdata ;
wxTheClipboard - > GetData ( rawdata ) ;
data = rawdata . GetText ( ) ;
}
wxTheClipboard - > Close ( ) ;
}
wxStringTokenizer st ( data , _T ( ' \n ' ) ) ;
while ( st . HasMoreTokens ( ) ) {
2007-09-02 21:31:17 +02:00
try {
AssStyle * s = new AssStyle ( st . GetNextToken ( ) . Trim ( true ) ) ;
if ( s - > Valid ) {
while ( AssFile : : top - > GetStyle ( s - > name ) ! = NULL )
s - > name = _T ( " Copy of " ) + s - > name ;
s - > UpdateData ( ) ;
AssFile : : top - > InsertStyle ( s ) ;
LoadCurrentStyles ( AssFile : : top ) ;
grid - > ass - > FlagAsModified ( _ ( " style paste " ) ) ;
grid - > CommitChanges ( ) ;
}
else
wxMessageBox ( _ ( " Could not parse style " ) , _ ( " Could not parse style " ) , wxOK | wxICON_EXCLAMATION , this ) ;
}
catch ( . . . ) {
wxMessageBox ( _ ( " Could not parse style " ) , _ ( " Could not parse style " ) , wxOK | wxICON_EXCLAMATION , this ) ;
2007-02-06 04:25:14 +01:00
}
2007-09-02 21:31:17 +02:00
2007-02-06 04:25:14 +01:00
}
}
void DialogStyleManager : : PasteToStorage ( ) {
wxString data = _T ( " " ) ;
if ( wxTheClipboard - > Open ( ) ) {
if ( wxTheClipboard - > IsSupported ( wxDF_TEXT ) ) {
wxTextDataObject rawdata ;
wxTheClipboard - > GetData ( rawdata ) ;
data = rawdata . GetText ( ) ;
}
wxTheClipboard - > Close ( ) ;
}
wxStringTokenizer st ( data , _T ( ' \n ' ) ) ;
while ( st . HasMoreTokens ( ) ) {
2007-09-02 21:31:17 +02:00
try {
AssStyle * s = new AssStyle ( st . GetNextToken ( ) . Trim ( true ) ) ;
if ( s - > Valid ) {
while ( Store . GetStyle ( s - > name ) ! = NULL )
s - > name = _T ( " Copy of " ) + s - > name ;
s - > UpdateData ( ) ;
Store . style . push_back ( s ) ;
Store . Save ( CatalogList - > GetString ( CatalogList - > GetSelection ( ) ) ) ;
LoadStorageStyles ( ) ;
StorageList - > SetStringSelection ( s - > name ) ;
}
else
wxMessageBox ( _ ( " Could not parse style " ) , _ ( " Could not parse style " ) , wxOK | wxICON_EXCLAMATION , this ) ;
2007-02-06 04:25:14 +01:00
}
2007-09-02 21:31:17 +02:00
catch ( . . . ) {
wxMessageBox ( _ ( " Could not parse style " ) , _ ( " Could not parse style " ) , wxOK | wxICON_EXCLAMATION , this ) ;
}
2007-02-06 04:25:14 +01:00
}
}
2006-01-16 22:02:54 +01:00
///////////////
// Storage new
void DialogStyleManager : : OnStorageNew ( wxCommandEvent & event ) {
AssStyle * temp = new AssStyle ;
2007-07-27 08:14:38 +02:00
DialogStyleEditor editor ( this , temp , grid , false , & Store ) ;
2006-01-16 22:02:54 +01:00
int modified = editor . ShowModal ( ) ;
if ( modified ) {
Store . style . push_back ( temp ) ;
Store . Save ( CatalogList - > GetString ( CatalogList - > GetSelection ( ) ) ) ;
LoadStorageStyles ( ) ;
}
else delete temp ;
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
///////////////
// Current new
void DialogStyleManager : : OnCurrentNew ( wxCommandEvent & event ) {
AssStyle * temp = new AssStyle ;
2007-07-27 08:14:38 +02:00
DialogStyleEditor editor ( this , temp , grid , true , & Store ) ;
2006-01-16 22:02:54 +01:00
int modified = editor . ShowModal ( ) ;
if ( modified ) {
AssFile : : top - > InsertStyle ( temp ) ;
LoadCurrentStyles ( AssFile : : top ) ;
}
else delete temp ;
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
//////////////////
// Storage delete
void DialogStyleManager : : OnStorageDelete ( wxCommandEvent & event ) {
wxArrayInt selections ;
int n = StorageList - > GetSelections ( selections ) ;
wxString message ;
if ( n ! = 1 ) {
message = _ ( " Are you sure you want to delete these " ) ;
message + = wxString : : Format ( _T ( " %i " ) , n ) ;
message + = _ ( " styles? " ) ;
}
else message = _ ( " Are you sure you want to delete this style? " ) ;
2007-02-05 20:09:45 +01:00
int option = wxMessageBox ( message , _ ( " Confirm delete from storage " ) , wxYES_NO | wxICON_EXCLAMATION , this ) ;
2006-01-16 22:02:54 +01:00
if ( option = = wxYES ) {
AssStyle * temp ;
for ( int i = 0 ; i < n ; i + + ) {
temp = styleStorageMap . at ( selections [ i ] ) ;
Store . style . remove ( temp ) ;
delete temp ;
}
Store . Save ( CatalogList - > GetString ( CatalogList - > GetSelection ( ) ) ) ;
LoadStorageStyles ( ) ;
// Set buttons
MoveToLocal - > Enable ( false ) ;
StorageCopy - > Enable ( false ) ;
StorageDelete - > Enable ( false ) ;
}
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
//////////////////
// Current delete
void DialogStyleManager : : OnCurrentDelete ( wxCommandEvent & event ) {
wxArrayInt selections ;
int n = CurrentList - > GetSelections ( selections ) ;
wxString message ;
if ( n ! = 1 ) {
message = _ ( " Are you sure you want to delete these " ) ;
message + = wxString : : Format ( _T ( " %i " ) , n ) ;
message + = _ ( " styles? " ) ;
}
else message = _ ( " Are you sure you want to delete this style? " ) ;
2007-02-05 20:09:45 +01:00
int option = wxMessageBox ( message , _ ( " Confirm delete from current " ) , wxYES_NO | wxICON_EXCLAMATION , this ) ;
2006-01-16 22:02:54 +01:00
if ( option = = wxYES ) {
AssStyle * temp ;
for ( int i = 0 ; i < n ; i + + ) {
temp = styleMap . at ( selections [ i ] ) ;
2006-12-26 05:48:53 +01:00
grid - > ass - > Line . remove ( temp ) ;
2006-01-16 22:02:54 +01:00
delete temp ;
}
2006-12-26 05:48:53 +01:00
LoadCurrentStyles ( grid - > ass ) ;
2006-01-16 22:02:54 +01:00
// Set buttons
MoveToStorage - > Enable ( false ) ;
CurrentCopy - > Enable ( false ) ;
CurrentDelete - > Enable ( false ) ;
2007-01-26 01:47:42 +01:00
grid - > ass - > FlagAsModified ( _ ( " style delete " ) ) ;
2006-01-16 22:02:54 +01:00
grid - > CommitChanges ( ) ;
}
2006-12-26 22:45:23 +01:00
UpdateMoveButtons ( ) ;
2006-01-16 22:02:54 +01:00
}
2006-12-26 05:48:53 +01:00
/////////////////////////////////////
// Import styles from another script
void DialogStyleManager : : OnCurrentImport ( wxCommandEvent & event ) {
// Get file name
wxString path = Options . AsText ( _T ( " Last open subtitles path " ) ) ;
2007-01-22 20:31:49 +01:00
wxString filename = wxFileSelector ( _ ( " Open subtitles file " ) , path , _T ( " " ) , _T ( " " ) , AssFile : : GetWildcardList ( 0 ) , wxFD_OPEN | wxFD_FILE_MUST_EXIST ) ;
2006-12-26 05:48:53 +01:00
if ( ! filename . IsEmpty ( ) ) {
// Save path
wxFileName filepath ( filename ) ;
Options . SetText ( _T ( " Last open subtitles path " ) , filepath . GetPath ( ) ) ;
Options . Save ( ) ;
try {
// Load file
AssFile temp ;
temp . Load ( filename , _T ( " " ) , false ) ;
// Get styles
wxArrayString styles = temp . GetStyles ( ) ;
if ( styles . Count ( ) = = 0 | | ( styles . Count ( ) = = 1 & & styles [ 0 ] = = _T ( " Default " ) ) ) {
2008-01-17 21:30:44 +01:00
wxMessageBox ( _ ( " The selected file has no available styles. " ) , _ ( " Error Importing Styles " ) , wxOK ) ;
2006-12-26 05:48:53 +01:00
return ;
}
// Get selection
wxArrayInt selections ;
2009-06-12 01:30:33 +02:00
# if wxCHECK_VERSION(2,9,0)
int res = wxGetSelectedChoices ( selections , _ ( " Choose styles to import: " ) , _ ( " Import Styles " ) , styles ) ;
# else
2006-12-26 05:48:53 +01:00
int res = wxGetMultipleChoices ( selections , _ ( " Choose styles to import: " ) , _ ( " Import Styles " ) , styles ) ;
2009-06-12 01:30:33 +02:00
# endif
2006-12-26 05:48:53 +01:00
if ( res = = - 1 | | selections . Count ( ) = = 0 ) return ;
bool modified = false ;
// Loop through selection
for ( unsigned int i = 0 ; i < selections . Count ( ) ; i + + ) {
// Check if there is already a style with that name
2008-09-06 13:35:36 +02:00
int test = CurrentList - > FindString ( styles [ selections [ i ] ] , false ) ;
2006-12-26 05:48:53 +01:00
if ( test ! = wxNOT_FOUND ) {
2007-07-27 07:58:55 +02:00
int answer = wxMessageBox ( wxString : : Format ( _T ( " There is already a style with the name \" %s \" on the current script. Overwrite? " ) , styles [ selections [ i ] ] . c_str ( ) ) , _T ( " Style name collision. " ) , wxYES_NO ) ;
if ( answer = = wxYES ) {
// Overwrite
modified = true ;
2008-09-06 13:35:36 +02:00
// The GetString->FindString mess is a silly workaround for the fact that to vsfilter
// (and the duplicate check a few lines above), style names aren't case sensitive, but to the
// rest of Aegisub they are.
* ( AssFile : : top - > GetStyle ( CurrentList - > GetString ( CurrentList - > FindString ( styles [ selections [ i ] ] , false ) ) ) ) = * temp . GetStyle ( styles [ selections [ i ] ] ) ;
2007-07-27 07:58:55 +02:00
}
continue ;
2006-12-26 05:48:53 +01:00
}
// Copy
modified = true ;
AssStyle * tempStyle = new AssStyle ;
* tempStyle = * temp . GetStyle ( styles [ selections [ i ] ] ) ;
AssFile : : top - > InsertStyle ( tempStyle ) ;
}
// Update
if ( modified ) {
LoadCurrentStyles ( grid - > ass ) ;
2007-01-26 01:47:42 +01:00
grid - > ass - > FlagAsModified ( _ ( " style import " ) ) ;
2006-12-26 05:48:53 +01:00
grid - > CommitChanges ( ) ;
}
}
catch ( . . . ) {
}
}
}
2006-12-26 22:45:23 +01:00
///////////////////////
// Update move buttons
void DialogStyleManager : : UpdateMoveButtons ( ) {
// Get storage selection
wxArrayInt sels ;
int n = StorageList - > GetSelections ( sels ) ;
int firstStor = - 1 ;
int lastStor = - 1 ;
if ( n ) {
firstStor = sels [ 0 ] ;
lastStor = sels [ n - 1 ] ;
}
int itemsStor = StorageList - > GetCount ( ) ;
2006-12-26 23:02:17 +01:00
// Check if selection is continuous
bool contStor = true ;
if ( n ) {
int last = sels [ 0 ] ;
for ( int i = 1 ; i < n ; i + + ) {
if ( sels [ i ] ! = last + 1 ) {
contStor = false ;
break ;
}
last = sels [ i ] ;
}
}
2006-12-26 22:45:23 +01:00
// Get current selection
n = CurrentList - > GetSelections ( sels ) ;
int firstCurr = - 1 ;
int lastCurr = - 1 ;
if ( n ) {
firstCurr = sels [ 0 ] ;
lastCurr = sels [ n - 1 ] ;
}
int itemsCurr = CurrentList - > GetCount ( ) ;
2006-12-26 23:02:17 +01:00
// Check if selection is continuous
bool contCurr = true ;
if ( n ) {
int last = sels [ 0 ] ;
for ( int i = 1 ; i < n ; i + + ) {
if ( sels [ i ] ! = last + 1 ) {
contCurr = false ;
break ;
}
last = sels [ i ] ;
}
}
2006-12-26 22:45:23 +01:00
// Set values
2006-12-26 23:02:17 +01:00
StorageMoveUp - > Enable ( contStor & & firstStor > 0 ) ;
StorageMoveTop - > Enable ( contStor & & firstStor > 0 ) ;
StorageMoveDown - > Enable ( contStor & & lastStor ! = - 1 & & lastStor < itemsStor - 1 ) ;
StorageMoveBottom - > Enable ( contStor & & lastStor ! = - 1 & & lastStor < itemsStor - 1 ) ;
2006-12-26 23:28:44 +01:00
StorageSort - > Enable ( itemsStor > 1 ) ;
2006-12-26 23:02:17 +01:00
CurrentMoveUp - > Enable ( contCurr & & firstCurr > 0 ) ;
CurrentMoveTop - > Enable ( contCurr & & firstCurr > 0 ) ;
CurrentMoveDown - > Enable ( contCurr & & lastCurr ! = - 1 & & lastCurr < itemsCurr - 1 ) ;
CurrentMoveBottom - > Enable ( contCurr & & lastCurr ! = - 1 & & lastCurr < itemsCurr - 1 ) ;
2006-12-26 23:28:44 +01:00
CurrentSort - > Enable ( itemsCurr > 1 ) ;
2006-12-26 22:45:23 +01:00
}
///////////////
// Move events
void DialogStyleManager : : OnStorageMoveUp ( wxCommandEvent & event ) { MoveStyles ( true , 0 ) ; }
void DialogStyleManager : : OnStorageMoveTop ( wxCommandEvent & event ) { MoveStyles ( true , 1 ) ; }
void DialogStyleManager : : OnStorageMoveDown ( wxCommandEvent & event ) { MoveStyles ( true , 2 ) ; }
void DialogStyleManager : : OnStorageMoveBottom ( wxCommandEvent & event ) { MoveStyles ( true , 3 ) ; }
2006-12-26 23:28:44 +01:00
void DialogStyleManager : : OnStorageSort ( wxCommandEvent & event ) { MoveStyles ( true , 4 ) ; }
2006-12-26 22:45:23 +01:00
void DialogStyleManager : : OnCurrentMoveUp ( wxCommandEvent & event ) { MoveStyles ( false , 0 ) ; }
void DialogStyleManager : : OnCurrentMoveTop ( wxCommandEvent & event ) { MoveStyles ( false , 1 ) ; }
void DialogStyleManager : : OnCurrentMoveDown ( wxCommandEvent & event ) { MoveStyles ( false , 2 ) ; }
void DialogStyleManager : : OnCurrentMoveBottom ( wxCommandEvent & event ) { MoveStyles ( false , 3 ) ; }
2006-12-26 23:28:44 +01:00
void DialogStyleManager : : OnCurrentSort ( wxCommandEvent & event ) { MoveStyles ( false , 4 ) ; }
2006-12-26 22:45:23 +01:00
/////////////////
// Move function
void DialogStyleManager : : MoveStyles ( bool storage , int type ) {
// Variables
AssFile * subs = AssFile : : top ;
wxListBox * list ;
if ( storage ) list = StorageList ;
else list = CurrentList ;
// Get selection
wxArrayInt sels ;
int n = list - > GetSelections ( sels ) ;
2006-12-26 23:28:44 +01:00
int first = - 1 ; ;
int last = - 1 ;
if ( n ) {
first = sels [ 0 ] ;
last = sels [ n - 1 ] ;
}
2006-12-26 22:45:23 +01:00
// Get total style count
int nStyles = list - > GetCount ( ) ;
// Get styles
std : : vector < AssStyle * > styls ;
std : : vector < AssStyle * > * srcStyls ;
if ( storage ) srcStyls = & styleStorageMap ;
else srcStyls = & styleMap ;
// Move up
if ( type = = 0 ) {
for ( int i = 0 ; i < first - 1 ; i + + ) styls . push_back ( srcStyls - > at ( i ) ) ;
for ( int i = first ; i < = last ; i + + ) styls . push_back ( srcStyls - > at ( i ) ) ;
styls . push_back ( srcStyls - > at ( first - 1 ) ) ;
for ( int i = last + 1 ; i < nStyles ; i + + ) styls . push_back ( srcStyls - > at ( i ) ) ;
first - - ;
last - - ;
}
// Move to top
if ( type = = 1 ) {
for ( int i = first ; i < = last ; i + + ) styls . push_back ( srcStyls - > at ( i ) ) ;
for ( int i = 0 ; i < first ; i + + ) styls . push_back ( srcStyls - > at ( i ) ) ;
for ( int i = last + 1 ; i < nStyles ; i + + ) styls . push_back ( srcStyls - > at ( i ) ) ;
last = last - first ;
first = 0 ;
}
// Move down
if ( type = = 2 ) {
for ( int i = 0 ; i < first ; i + + ) styls . push_back ( srcStyls - > at ( i ) ) ;
styls . push_back ( srcStyls - > at ( last + 1 ) ) ;
for ( int i = first ; i < = last ; i + + ) styls . push_back ( srcStyls - > at ( i ) ) ;
for ( int i = last + 2 ; i < nStyles ; i + + ) styls . push_back ( srcStyls - > at ( i ) ) ;
first + + ;
last + + ;
}
// Move to bottom
if ( type = = 3 ) {
for ( int i = 0 ; i < first ; i + + ) styls . push_back ( srcStyls - > at ( i ) ) ;
for ( int i = last + 1 ; i < nStyles ; i + + ) styls . push_back ( srcStyls - > at ( i ) ) ;
for ( int i = first ; i < = last ; i + + ) styls . push_back ( srcStyls - > at ( i ) ) ;
first = nStyles - ( last - first + 1 ) ;
last = nStyles - 1 ;
}
2006-12-26 23:28:44 +01:00
// Sort
if ( type = = 4 ) {
// Get confirmation
if ( storage ) {
int res = wxMessageBox ( _ ( " Are you sure? This cannot be undone! " ) , _ ( " Sort styles " ) , wxYES_NO ) ;
if ( res = = wxNO ) return ;
}
// Get sorted list
2009-07-18 06:37:43 +02:00
wxArrayString styleNames ;
for ( int i = 0 ; i < nStyles ; i + + ) styleNames . Add ( srcStyls - > at ( i ) - > name ) ;
styleNames . Sort ( ) ;
std : : list < AssStyle * > styles ( srcStyls - > begin ( ) , srcStyls - > end ( ) ) ;
for ( int i = 0 ; i < nStyles ; i + + ) {
for ( std : : list < AssStyle * > : : iterator style = styles . begin ( ) ; style ! = styles . end ( ) ; style + + ) {
if ( ( * style ) - > name = = styleNames [ i ] ) {
styls . push_back ( * style ) ;
styles . erase ( style ) ;
break ;
2006-12-26 23:28:44 +01:00
}
}
}
// Zero selection
first = 0 ;
last = 0 ;
}
2006-12-26 22:45:23 +01:00
// Storage
if ( storage ) {
// Rewrite storage
Store . style . clear ( ) ;
for ( unsigned int i = 0 ; i < styls . size ( ) ; i + + ) Store . style . push_back ( styls [ i ] ) ;
// Save storage
Store . Save ( CatalogList - > GetString ( CatalogList - > GetSelection ( ) ) ) ;
}
// Current
else {
// Replace styles
entryIter next ;
int curn = 0 ;
for ( entryIter cur = subs - > Line . begin ( ) ; cur ! = subs - > Line . end ( ) ; cur = next ) {
next = cur ;
next + + ;
AssStyle * style = AssEntry : : GetAsStyle ( * cur ) ;
if ( style ) {
subs - > Line . insert ( cur , styls [ curn ] ) ;
subs - > Line . erase ( cur ) ;
curn + + ;
}
}
// Flag as modified
2007-01-26 01:47:42 +01:00
grid - > ass - > FlagAsModified ( _ ( " style move " ) ) ;
2006-12-26 22:45:23 +01:00
grid - > CommitChanges ( ) ;
}
// Update
for ( int i = 0 ; i < nStyles ; i + + ) {
list - > SetString ( i , styls [ i ] - > name ) ;
if ( i < first | | i > last ) list - > Deselect ( i ) ;
else list - > Select ( i ) ;
}
// Set map
* srcStyls = styls ;
// Update buttons
UpdateMoveButtons ( ) ;
}
2007-02-05 20:09:45 +01:00
//////////////////
// Keydown event
void DialogStyleManager : : OnKeyDown ( wxKeyEvent & event ) {
wxCommandEvent evt ;
switch ( event . GetKeyCode ( ) ) {
case WXK_ESCAPE :
OnClose ( evt ) ;
break ;
case WXK_DELETE :
if ( wxWindow : : FindFocus ( ) = = StorageList ) {
OnStorageDelete ( evt ) ;
}
else if ( wxWindow : : FindFocus ( ) = = CurrentList ) {
OnCurrentDelete ( evt ) ;
}
break ;
2007-02-06 04:25:14 +01:00
case ' C ' :
case ' c ' :
2007-09-22 00:56:44 +02:00
# ifdef __APPLE__
if ( event . CmdDown ( ) ) {
# else
2007-02-06 04:25:14 +01:00
if ( event . ControlDown ( ) ) {
2007-09-22 00:56:44 +02:00
# endif
2007-02-06 04:25:14 +01:00
if ( wxWindow : : FindFocus ( ) = = CurrentList ) {
CopyToClipboard ( CurrentList , styleMap ) ;
}
else if ( wxWindow : : FindFocus ( ) = = StorageList ) {
CopyToClipboard ( StorageList , styleStorageMap ) ;
}
}
break ;
case ' V ' :
case ' v ' :
2007-09-22 00:56:44 +02:00
# ifdef __APPLE__
if ( event . CmdDown ( ) ) {
# else
2007-02-06 04:25:14 +01:00
if ( event . ControlDown ( ) ) {
2007-09-22 00:56:44 +02:00
# endif
2007-02-06 04:25:14 +01:00
if ( wxWindow : : FindFocus ( ) = = CurrentList ) {
PasteToCurrent ( ) ;
}
else if ( wxWindow : : FindFocus ( ) = = StorageList ) {
PasteToStorage ( ) ;
}
}
break ;
2007-02-05 20:09:45 +01:00
}
}
2006-12-26 05:48:53 +01:00
//////////////////
// I have no clue
2006-01-16 22:02:54 +01:00
int DialogStyleManager : : lastx = - 1 ;
int DialogStyleManager : : lasty = - 1 ;
2007-02-05 20:09:45 +01:00
/////////////////////////////////
// DialogStyleManagerEvent stuff
DialogStyleManagerEvent : : DialogStyleManagerEvent ( DialogStyleManager * ctrl ) {
control = ctrl ;
}
BEGIN_EVENT_TABLE ( DialogStyleManagerEvent , wxEvtHandler )
EVT_KEY_DOWN ( DialogStyleManagerEvent : : OnKeyDown )
END_EVENT_TABLE ( )
void DialogStyleManagerEvent : : OnKeyDown ( wxKeyEvent & event ) {
control - > OnKeyDown ( event ) ; //we need to access controls, so rather than make the controls public...
}
2007-09-12 01:22:26 +02:00