2009-11-06 18:06:12 +01:00
/*
* Copyright 2005 - 2007 Gerald Schmidt .
*
* This file is part of Xml Copy Editor .
*
* Xml Copy Editor is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; version 2 of the License .
*
* Xml Copy Editor is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with Xml Copy Editor ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
# include <iostream>
# include <fstream>
# include <string>
# include <wx/aboutdlg.h>
# include "xmlcopyeditor.h"
2012-03-16 16:13:33 +01:00
# include "xmlcopyeditorcopy.h"
2009-11-06 18:06:12 +01:00
# include "readfile.h"
# include "xmldoc.h"
# include "xmlctrl.h"
# include "wraplibxml.h"
# include "xmlschemalocator.h"
# include "xsllocator.h"
# include "xmlutf8reader.h"
# include "xmlpromptgenerator.h"
# include "xmlencodingspy.h"
# include "styledialog.h"
# include "mypropertysheet.h"
# include "wraptempfilename.h"
# include "globalreplacedialog.h"
# include "replace.h"
# include "associatedialog.h"
# include "xmlassociatexsd.h"
# include "xmlassociatexsl.h"
# include "xmlassociatedtd.h"
# include "wrapdaisy.h"
# include "aboutdialog.h"
# include "pathresolver.h"
# include "locationpanel.h"
# include "insertpanel.h"
# include "xmlwordcount.h"
# include "mynotebook.h"
# include "commandpanel.h"
# include "binaryfile.h"
# include "exportdialog.h"
# include <wx/aui/auibook.h>
# include <wx/richtext/richtextsymboldlg.h>
# include <wx/textctrl.h>
# include <wx/artprov.h>
# include <wx/stockitem.h>
# include <iconv.h>
2012-08-03 17:21:10 +02:00
# include <wx/stdpaths.h>
2012-08-18 17:41:27 +02:00
# include <wx/tokenzr.h>
# include <wx/dir.h>
2012-08-25 02:19:11 +02:00
# include "xmlschemagenerator.h"
2012-08-30 16:37:01 +02:00
# include "threadreaper.h"
2013-10-29 11:52:22 +01:00
# include <wx/wupdlock.h>
2013-12-04 17:22:00 +01:00
# include "dtd2schema.h"
2009-11-06 18:06:12 +01:00
# define ngettext wxGetTranslation
# ifdef NEWFINDREPLACE
# include "findreplacepanel.h"
# endif
# include "wrapxerces.h"
# ifndef __WXMSW__
# include "xpm/appicon.xpm"
# endif
2012-08-11 12:47:16 +02:00
typedef size_t universal_iconv ( iconv_t cd ,
char * * inbuf , size_t * inbytesleft ,
char * * outbuf , size_t * outbytesleft ) ;
/* On other platform, it could be:
size_t iconv ( iconv_t cd ,
const char * * inbuf , size_t * inbytesleft ,
char * * outbuf , size_t * outbytesleft ) ;
and a char * * can ' t be assigned to const char * *
http : //c-faq.com/ansi/constmismatch.html
Let ' s deal with this mess .
*/
2009-11-06 18:06:12 +01:00
BEGIN_EVENT_TABLE ( MyFrame , wxFrame )
EVT_ACTIVATE_APP ( MyFrame : : OnActivateApp )
EVT_CLOSE ( MyFrame : : OnFrameClose )
EVT_KEY_DOWN ( MyFrame : : OnKeyPressed )
EVT_MENU ( wxID_ABOUT , MyFrame : : OnAbout )
EVT_MENU ( wxID_CLOSE , MyFrame : : OnClose )
EVT_MENU ( wxID_CLOSE_ALL , MyFrame : : OnCloseAll )
EVT_MENU ( wxID_CUT , MyFrame : : OnCut )
EVT_MENU ( wxID_COPY , MyFrame : : OnCopy )
EVT_MENU ( wxID_HELP , MyFrame : : OnHelp )
EVT_MENU ( wxID_PASTE , MyFrame : : OnPaste )
EVT_MENU ( ID_PASTE_NEW_DOCUMENT , MyFrame : : OnPasteNewDocument )
EVT_MENU ( wxID_EXIT , MyFrame : : OnQuit )
EVT_MENU ( wxID_NEW , MyFrame : : OnNew )
EVT_MENU ( wxID_OPEN , MyFrame : : OnOpen )
EVT_MENU ( wxID_SAVE , MyFrame : : OnSave )
EVT_MENU ( wxID_SAVEAS , MyFrame : : OnSaveAs )
EVT_MENU ( ID_RELOAD , MyFrame : : OnReload )
EVT_MENU ( wxID_UNDO , MyFrame : : OnUndo )
EVT_MENU ( wxID_REDO , MyFrame : : OnRedo )
EVT_MENU ( wxID_REVERT , MyFrame : : OnRevert )
EVT_MENU ( ID_INSERT_CHILD , MyFrame : : OnInsertChild )
EVT_MENU ( ID_INSERT_SIBLING , MyFrame : : OnInsertSibling )
EVT_MENU ( ID_INSERT_ENTITY , MyFrame : : OnInsertEntity )
EVT_MENU ( ID_INSERT_TWIN , MyFrame : : OnInsertTwin )
EVT_MENU ( ID_INSERT_SYMBOL , MyFrame : : OnInsertSymbol )
EVT_MENU ( ID_TOGGLE_FOLD , MyFrame : : OnToggleFold )
EVT_MENU ( ID_FOLD_ALL , MyFrame : : OnFoldAll )
EVT_MENU ( ID_UNFOLD_ALL , MyFrame : : OnUnfoldAll )
EVT_MENU ( ID_OPEN_LARGE_FILE , MyFrame : : OnOpen )
EVT_MENU ( ID_PRINT_PREVIEW , MyFrame : : OnPrintPreview )
EVT_MENU ( ID_PRINT_SETUP , MyFrame : : OnPrintSetup )
EVT_MENU ( ID_PRINT , MyFrame : : OnPrint )
EVT_MENU ( ID_WORD_COUNT , MyFrame : : OnWordCount )
EVT_MENU ( ID_IMPORT_MSWORD , MyFrame : : OnImportMSWord )
EVT_MENU ( ID_EXPORT_MSWORD , MyFrame : : OnExportMSWord )
EVT_MENU ( ID_EXPORT , MyFrame : : OnExport )
EVT_MENU ( ID_HIDE_PANE , MyFrame : : OnClosePane )
EVT_MENU ( ID_COMMAND , MyFrame : : OnCommand )
EVT_MENU ( ID_FIND , MyFrame : : OnFind )
EVT_MENU ( ID_FIND_AGAIN , MyFrame : : OnFindAgain )
EVT_MENU ( ID_GOTO , MyFrame : : OnGoto )
EVT_MENU ( ID_FEEDBACK , MyFrame : : OnFeedback )
EVT_MENU ( ID_PREVIOUS_DOCUMENT , MyFrame : : OnPreviousDocument )
EVT_MENU ( ID_NEXT_DOCUMENT , MyFrame : : OnNextDocument )
EVT_MENU ( ID_BROWSER , MyFrame : : OnBrowser )
EVT_MENU ( ID_REPLACE , MyFrame : : OnFindReplace )
EVT_MENU ( ID_GLOBAL_REPLACE , MyFrame : : OnGlobalReplace )
EVT_MENU ( ID_CHECK_WELLFORMED , MyFrame : : OnCheckWellformedness )
EVT_MENU ( ID_VALIDATE_RELAX_NG , MyFrame : : OnValidateRelaxNG )
EVT_MENU ( ID_VALIDATE_W3C_SCHEMA , MyFrame : : OnValidateSchema )
2012-08-25 02:19:11 +02:00
EVT_MENU ( ID_CREATE_SCHEMA , MyFrame : : OnCreateSchema )
2013-12-04 17:22:00 +01:00
EVT_MENU ( ID_DTD_TO_SCHEMA , MyFrame : : OnDtd2Schema )
2009-11-06 18:06:12 +01:00
EVT_MENU ( ID_XPATH , MyFrame : : OnXPath )
EVT_MENU_RANGE ( ID_XSLT , ID_XSLT_WORDML_DOCBOOK , MyFrame : : OnXslt )
EVT_MENU ( ID_PRETTYPRINT , MyFrame : : OnPrettyPrint )
EVT_MENU ( ID_ENCODING , MyFrame : : OnEncoding )
EVT_MENU ( ID_STYLE , MyFrame : : OnSpelling )
EVT_MENU ( ID_SPELL , MyFrame : : OnSpelling )
EVT_MENU ( ID_FONT_SMALLER , MyFrame : : OnFontSmaller )
EVT_MENU ( ID_FONT_NORMAL , MyFrame : : OnFontMedium )
EVT_MENU ( ID_FONT_LARGER , MyFrame : : OnFontLarger )
EVT_MENU ( ID_OPTIONS , MyFrame : : OnOptions )
EVT_MENU ( ID_HOME , MyFrame : : OnHome )
EVT_MENU ( ID_DOWNLOAD_SOURCE , MyFrame : : OnDownloadSource )
EVT_MENU ( ID_TOOLBAR_VISIBLE , MyFrame : : OnToolbarVisible )
EVT_MENU ( ID_LOCATION_PANE_VISIBLE , MyFrame : : OnLocationPaneVisible )
EVT_MENU ( ID_PROTECT_TAGS , MyFrame : : OnProtectTags )
EVT_MENU ( ID_WRAP_WORDS , MyFrame : : OnWrapWords )
EVT_MENU_RANGE ( ID_SHOW_TAGS , ID_HIDE_TAGS , MyFrame : : OnVisibilityState )
EVT_MENU_RANGE ( ID_ASSOCIATE_DTD_PUBLIC , ID_ASSOCIATE_XSL , MyFrame : : OnAssociate )
EVT_MENU_RANGE ( wxID_FILE1 , wxID_FILE9 , MyFrame : : OnHistoryFile )
EVT_MENU_RANGE (
ID_VALIDATE_PRESET1 , ID_VALIDATE_PRESET9 , MyFrame : : OnValidatePreset )
EVT_MENU_RANGE (
ID_COLOR_SCHEME_DEFAULT ,
ID_COLOR_SCHEME_NONE ,
MyFrame : : OnColorScheme )
EVT_MENU_RANGE (
ID_SPLIT_TAB_TOP ,
ID_SPLIT_TAB_LEFT ,
MyFrame : : OnSplitTab )
EVT_UPDATE_UI_RANGE ( ID_REPLACE , ID_GLOBAL_REPLACE , MyFrame : : OnUpdateReplaceRange )
EVT_FIND ( wxID_ANY , MyFrame : : OnDialogFind )
EVT_FIND_NEXT ( wxID_ANY , MyFrame : : OnDialogFind )
EVT_FIND_REPLACE ( wxID_ANY , MyFrame : : OnDialogReplace )
EVT_FIND_REPLACE_ALL ( wxID_ANY , MyFrame : : OnDialogReplaceAll )
EVT_ICONIZE ( MyFrame : : OnIconize )
EVT_UPDATE_UI ( ID_LOCATION_PANE_VISIBLE , MyFrame : : OnUpdateLocationPaneVisible )
EVT_UPDATE_UI ( wxID_CLOSE , MyFrame : : OnUpdateDocRange )
EVT_UPDATE_UI ( wxID_SAVEAS , MyFrame : : OnUpdateDocRange )
EVT_UPDATE_UI ( wxID_CLOSE_ALL , MyFrame : : OnUpdateCloseAll )
EVT_UPDATE_UI_RANGE ( ID_SPLIT_TAB_TOP , ID_SPLIT_TAB_LEFT , MyFrame : : OnUpdateCloseAll )
EVT_UPDATE_UI ( wxID_REVERT , MyFrame : : OnUpdateUndo )
EVT_UPDATE_UI ( wxID_SAVE , MyFrame : : OnUpdateDocRange ) // always allow save if doc present
EVT_UPDATE_UI ( wxID_UNDO , MyFrame : : OnUpdateUndo )
EVT_UPDATE_UI ( wxID_REDO , MyFrame : : OnUpdateRedo )
EVT_UPDATE_UI ( wxID_PASTE , MyFrame : : OnUpdatePaste )
EVT_UPDATE_UI ( wxID_CUT , MyFrame : : OnUpdateCutCopy )
EVT_UPDATE_UI ( wxID_COPY , MyFrame : : OnUpdateCutCopy )
EVT_UPDATE_UI ( ID_FIND_AGAIN , MyFrame : : OnUpdateFindAgain )
EVT_UPDATE_UI_RANGE ( ID_FIND , ID_EXPORT_MSWORD , MyFrame : : OnUpdateDocRange )
EVT_UPDATE_UI ( ID_PREVIOUS_DOCUMENT , MyFrame : : OnUpdatePreviousDocument )
EVT_UPDATE_UI ( ID_NEXT_DOCUMENT , MyFrame : : OnUpdateNextDocument )
EVT_UPDATE_UI ( ID_HIDE_PANE , MyFrame : : OnUpdateClosePane )
EVT_UPDATE_UI ( ID_RELOAD , MyFrame : : OnUpdateReload )
EVT_IDLE ( MyFrame : : OnIdle )
EVT_AUINOTEBOOK_PAGE_CLOSE ( wxID_ANY , MyFrame : : OnPageClosing )
# ifdef __WXMSW__
EVT_DROP_FILES ( MyFrame : : OnDropFiles )
# endif
END_EVENT_TABLE ( )
IMPLEMENT_APP ( MyApp )
2013-07-20 20:05:11 +02:00
MyApp : : MyApp ( )
: checker ( NULL )
, server ( NULL )
, singleInstanceCheck ( false )
, lang ( 0 )
2012-08-09 13:22:21 +02:00
# if defined(__WXMSW__) && !wxCHECK_VERSION(2,9,0)
2013-07-20 20:05:11 +02:00
, config ( new wxFileConfig ( _T ( " .xmlcopyeditor " ) ) ) //( _T ( "SourceForge Project\\XML Copy Editor" ) ) )
2009-11-06 18:06:12 +01:00
# else
2013-07-20 20:05:11 +02:00
, config ( new wxFileConfig ( _T ( " xmlcopyeditor " ) ) )
2009-11-06 18:06:12 +01:00
# endif
{
2012-09-03 16:37:01 +02:00
# if defined ( __WXGTK__ ) && !defined ( __WXDEBUG__ )
2009-11-06 18:06:12 +01:00
int fdnull = open ( " /dev/null " , O_WRONLY , 0 ) ;
dup2 ( fdnull , STDERR_FILENO ) ;
# endif
2012-08-20 14:12:32 +02:00
}
MyApp : : ~ MyApp ( )
{
delete checker ;
delete server ;
}
bool MyApp : : OnInit ( )
{
2012-09-03 16:37:01 +02:00
# ifdef __WXDEBUG__
wxLog : : SetActiveTarget ( new wxLogStderr ( ) ) ;
wxLog : : SetLogLevel ( wxLOG_Max ) ;
# endif
2009-11-06 18:06:12 +01:00
int systemLocale = myLocale . GetSystemLanguage ( ) ;
switch ( systemLocale )
{
case wxLANGUAGE_GERMAN :
case wxLANGUAGE_GERMAN_AUSTRIAN :
case wxLANGUAGE_GERMAN_BELGIUM :
case wxLANGUAGE_GERMAN_LIECHTENSTEIN :
case wxLANGUAGE_GERMAN_LUXEMBOURG :
case wxLANGUAGE_GERMAN_SWISS :
systemLocale = wxLANGUAGE_GERMAN ;
break ;
case wxLANGUAGE_CHINESE_SIMPLIFIED :
systemLocale = wxLANGUAGE_CHINESE_SIMPLIFIED ;
break ;
case wxLANGUAGE_CHINESE_TRADITIONAL :
systemLocale = wxLANGUAGE_CHINESE_TRADITIONAL ;
break ;
case wxLANGUAGE_CATALAN :
2012-08-20 14:12:32 +02:00
systemLocale = wxLANGUAGE_CATALAN ;
break ;
2009-11-06 18:06:12 +01:00
case wxLANGUAGE_SPANISH :
case wxLANGUAGE_SPANISH_ARGENTINA :
case wxLANGUAGE_SPANISH_BOLIVIA :
case wxLANGUAGE_SPANISH_CHILE :
case wxLANGUAGE_SPANISH_COLOMBIA :
case wxLANGUAGE_SPANISH_COSTA_RICA :
case wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC :
case wxLANGUAGE_SPANISH_ECUADOR :
case wxLANGUAGE_SPANISH_EL_SALVADOR :
case wxLANGUAGE_SPANISH_GUATEMALA :
case wxLANGUAGE_SPANISH_HONDURAS :
case wxLANGUAGE_SPANISH_MEXICAN :
case wxLANGUAGE_SPANISH_MODERN :
case wxLANGUAGE_SPANISH_NICARAGUA :
case wxLANGUAGE_SPANISH_PANAMA :
case wxLANGUAGE_SPANISH_PARAGUAY :
case wxLANGUAGE_SPANISH_PERU :
case wxLANGUAGE_SPANISH_PUERTO_RICO :
case wxLANGUAGE_SPANISH_URUGUAY :
case wxLANGUAGE_SPANISH_US :
case wxLANGUAGE_SPANISH_VENEZUELA :
systemLocale = wxLANGUAGE_SPANISH ;
break ;
case wxLANGUAGE_SLOVAK :
systemLocale = wxLANGUAGE_SLOVAK ;
break ;
case wxLANGUAGE_SWEDISH :
systemLocale = wxLANGUAGE_SWEDISH ;
break ;
case wxLANGUAGE_FRENCH :
systemLocale = wxLANGUAGE_FRENCH ;
break ;
case wxLANGUAGE_UKRAINIAN :
systemLocale = wxLANGUAGE_UKRAINIAN ;
break ;
case wxLANGUAGE_ITALIAN :
systemLocale = wxLANGUAGE_ITALIAN ;
break ;
case wxLANGUAGE_RUSSIAN :
systemLocale = wxLANGUAGE_RUSSIAN ;
break ;
case wxLANGUAGE_DUTCH :
systemLocale = wxLANGUAGE_DUTCH ;
break ;
default :
2013-10-15 18:17:24 +02:00
systemLocale = wxLANGUAGE_DEFAULT ;
2009-11-06 18:06:12 +01:00
break ;
}
if ( config . get ( ) )
{
# ifdef __WXMSW__
singleInstanceCheck = config - > Read ( _T ( " singleInstanceCheck " ) , true ) ;
# else
long longFalse = 0 ;
singleInstanceCheck = config - > Read ( _T ( " singleInstanceCheck " ) , longFalse ) ;
# endif
lang = config - > Read ( _T ( " lang " ) , systemLocale ) ;
}
else
{
lang = systemLocale ;
# ifdef __WXMSW__
singleInstanceCheck = true ;
# else
singleInstanceCheck = false ;
# endif
}
wxString name , service , hostName ;
name . Printf ( _T ( " xmlcopyeditor-%s " ) , wxGetUserId ( ) . c_str ( ) ) ;
service = IPC_SERVICE ;
hostName = _T ( " localhost " ) ;
if ( singleInstanceCheck )
{
2012-08-20 14:12:32 +02:00
checker = new wxSingleInstanceChecker ( name ) ;
2009-11-06 18:06:12 +01:00
while ( checker - > IsAnotherRunning ( ) )
{
// attempt calling server
2013-10-15 16:55:28 +02:00
MyClient client ;
MyClientConnection * connection = ( MyClientConnection * )
client . MakeConnection ( hostName , service , IPC_TOPIC ) ;
2009-11-06 18:06:12 +01:00
if ( ! connection | | ! connection - > StartAdvise ( IPC_ADVISE_NAME ) )
break ;
else
{
2012-08-18 17:41:27 +02:00
wxString argument ;
wxChar whatBuffer [ ] = _T ( " Data " ) ;
2009-11-06 18:06:12 +01:00
if ( this - > argc > 1 )
{
for ( int i = 1 ; i < this - > argc ; i + + )
{
argument = ( wxString ) this - > argv [ i ] ;
argument = PathResolver : : run ( argument ) ;
if ( ! connection - > Poke ( argument , whatBuffer ) )
break ;
}
}
else
{
argument = ( wxString ) IPC_NO_FILE ;
connection - > Poke ( argument , whatBuffer ) ;
}
return false ;
}
}
}
server = new MyServer ;
server - > Create ( service ) ;
2012-08-20 14:12:32 +02:00
myLocale . Init ( lang , wxLOCALE_LOAD_DEFAULT ) ;
wxArrayString prefixes ;
# ifdef __WXGTK__
prefixes . Add ( _T ( " /usr/share/locale " ) ) ;
prefixes . Add ( _T ( " /usr/share/locale-langpack " ) ) ;
prefixes . Add ( _T ( " /usr/local/share/locale " ) ) ;
# endif
wxString poDir = wxStandardPaths : : Get ( ) . GetDataDir ( ) +
wxFileName : : GetPathSeparator ( ) + _T ( " po " ) + wxFileName : : GetPathSeparator ( ) ;
prefixes . Add ( poDir ) ;
for ( size_t i = 0 ; i < prefixes . Count ( ) ; )
{
if ( wxDirExists ( prefixes [ i ] ) )
wxLocale : : AddCatalogLookupPathPrefix ( prefixes [ i + + ] ) ;
else
prefixes . RemoveAt ( i ) ;
}
wxString catalog = _T ( " messages " ) ;
getAvailableTranslations ( & prefixes , & catalog ) ;
if ( ! myLocale . AddCatalog ( catalog ) )
2013-11-12 17:30:07 +01:00
{ }
2012-08-20 14:12:32 +02:00
# ifndef __WXMSW__
{
wxLogNull noLog ;
myLocale . AddCatalog ( _T ( " coreutils " ) ) ;
}
# endif
2009-11-06 18:06:12 +01:00
MyFrame * frame ;
try
{
wxImage : : AddHandler ( new wxPNGHandler ) ;
wxSystemOptions : : SetOption ( _T ( " msw.remap " ) , 0 ) ;
2012-08-11 01:50:42 +02:00
// Initialize Xerces-C++
2012-08-15 14:45:24 +02:00
WrapXerces : : Init ( ) ;
2012-08-11 01:50:42 +02:00
2009-11-06 18:06:12 +01:00
frame = new MyFrame (
_ ( " XML Copy Editor " ) ,
config . get ( ) ,
myLocale ,
singleInstanceCheck ,
lang ) ;
frame - > Show ( true ) ;
if ( frame - > getHandleCommandLineFlag ( ) )
frame - > handleCommandLine ( ) ;
}
2012-08-11 01:50:42 +02:00
catch ( const XMLException & e )
{
wxString error ;
2012-08-18 17:41:27 +02:00
error < < _ ( " Failed to initialize Xerces-C: \n " )
2012-08-11 01:50:42 +02:00
< < WrapXerces : : toString ( e . getMessage ( ) ) ;
wxMessageBox ( error , _ ( " Error " ) , wxOK | wxICON_ERROR ) ;
return false ;
}
2009-11-06 18:06:12 +01:00
catch ( exception & e )
{
const char * what ;
what = e . what ( ) ;
wxString wideWhat , errorString ;
wideWhat = wxString ( what , wxConvLocal , strlen ( what ) ) ;
if ( wideWhat . empty ( ) )
wideWhat = _ ( " (unknown error) " ) ;
errorString = _ ( " XML Copy Editor has encountered the following error and needs to close: " ) ;
errorString + = wideWhat ;
errorString + = _T ( " . " ) ;
# ifdef __WXMSW__
: : MessageBox (
NULL ,
errorString ,
_ ( " Error " ) ,
MB_ICONERROR | MB_TASKMODAL ) ;
# else
wxMessageBox ( errorString , _ ( " Error " ) , wxICON_ERROR ) ;
# endif
exit ( EXIT_FAILURE ) ;
}
catch ( . . . )
{
exit ( EXIT_FAILURE ) ;
}
return true ;
}
void MyApp : : OnUnhandledException ( )
{
# ifdef __WXMSW__
: : MessageBox (
NULL ,
_ ( " XML Copy Editor has encountered an error and needs to close. " ) ,
_ ( " Error " ) ,
MB_ICONERROR | MB_TASKMODAL ) ;
# else
wxMessageBox (
_ ( " XML Copy Editor has encountered an error and needs to close. " ) ,
_ ( " Error " ) ,
wxICON_ERROR ) ;
# endif
exit ( EXIT_FAILURE ) ;
}
bool MyApp : : OnExceptionInMainLoop ( )
{
try
{
throw ;
}
# ifdef __WXMSW__
catch ( bad_alloc & )
{
: : MessageBox (
NULL ,
_ ( " The operating system has turned down a request for additional memory " ) ,
_ ( " Out of memory " ) ,
MB_ICONERROR ) ;
return true ;
}
# endif
catch ( exception & e )
{
const char * what ;
what = e . what ( ) ;
wxString wideWhat , errorString ;
wideWhat = wxString ( what , wxConvLocal , strlen ( what ) ) ;
if ( wideWhat . empty ( ) )
_ ( " (unknown error) " ) ;
errorString = _ ( " The following error has occurred: " ) ;
errorString + = wideWhat ;
errorString + = _ ( " . \n \n Select \" Abort \" to exit, \" Retry \" to close this window and \" Ignore \" to continue. " ) ;
# ifdef __WXMSW__
int ret = : : MessageBox (
NULL ,
errorString ,
_ ( " Error " ) ,
MB_ABORTRETRYIGNORE |
MB_ICONERROR |
MB_TASKMODAL ) ;
switch ( ret )
{
case IDABORT :
exit ( EXIT_FAILURE ) ;
break ;
case IDRETRY :
return false ;
case IDIGNORE :
return true ;
default :
throw ;
}
# else
// wxGTK does not reach this point; see HandleEvent below
wxMessageBox (
errorString ,
_ ( " Error " ) ,
wxICON_ERROR ) ;
return false ;
# endif
}
catch ( . . . )
{
wxString otherError ( _ ( " XML Copy Editor has encountered an error and needs to close. " ) ) ;
# ifdef __WXMSW__
: : MessageBox (
NULL ,
otherError ,
_ ( " Error " ) ,
MB_ICONERROR ) ;
return false ;
# else
wxMessageBox (
otherError ,
_ ( " Error " ) ,
wxICON_ERROR ) ;
return false ;
# endif
}
return false ;
}
# ifndef __WXMSW__
void MyApp : : HandleEvent ( wxEvtHandler * handler , wxEventFunction func , wxEvent & event ) const
{
try
{
wxApp : : HandleEvent ( handler , func , event ) ;
}
catch ( std : : bad_alloc & )
{
wxMessageBox (
_ ( " The operating system has turned down a request for additional memory " ) ,
_ ( " Out of memory " ) ,
wxICON_ERROR ) ;
return ;
}
catch ( std : : exception & e )
{
std : : string s ( e . what ( ) ) ;
wxString ws = wxString ( s . c_str ( ) , wxConvUTF8 , s . size ( ) ) ;
wxMessageBox (
ws ,
_ ( " Error " ) ,
wxICON_ERROR ) ;
return ;
}
catch ( . . . )
{
throw ;
}
}
# endif
2012-08-20 14:12:32 +02:00
const std : : set < const wxLanguageInfo * > & MyApp : : getAvailableTranslations (
2012-08-18 17:41:27 +02:00
const wxArrayString * catalogLookupPathPrefixes /*= NULL*/ ,
const wxString * catalog /*= NULL*/ )
{
static class Translations // Most of the code was copied from wxTranslations
{
public :
Translations ( const wxArrayString * catalogLookupPathPrefixes ,
const wxString * catalog )
{
if ( catalogLookupPathPrefixes = = NULL )
throw std : : invalid_argument ( " catalogLookupPathPrefixes " ) ;
if ( catalog = = NULL )
throw std : : invalid_argument ( " catelog " ) ;
2012-08-20 14:12:32 +02:00
const wxLanguageInfo * info ;
2012-08-18 17:41:27 +02:00
# if wxCHECK_VERSION(2,9,0)
wxTranslations * t = wxTranslations : : Get ( ) ;
if ( t ! = NULL )
2012-08-20 14:12:32 +02:00
{
2012-08-30 16:37:01 +02:00
wxArrayString all = t - > GetAvailableTranslations ( * catalog ) ;
wxArrayString : : const_iterator trans = all . begin ( ) ;
for ( ; trans ! = all . end ( ) ; trans + + )
2012-08-20 14:12:32 +02:00
{
info = wxLocale : : FindLanguageInfo ( * trans ) ;
if ( info ! = NULL )
translations . insert ( info ) ;
}
}
2012-08-18 17:41:27 +02:00
# else
wxArrayString : : const_iterator i = catalogLookupPathPrefixes - > begin ( ) ;
for ( i = catalogLookupPathPrefixes - > begin ( ) ;
i ! = catalogLookupPathPrefixes - > end ( ) ; + + i )
{
if ( i - > empty ( ) )
continue ;
wxDir dir ;
if ( ! dir . Open ( * i ) )
continue ;
wxString lang ;
for ( bool ok = dir . GetFirst ( & lang , wxEmptyString , wxDIR_DIRS ) ; ok ;
ok = dir . GetNext ( & lang ) ) {
const wxString langdir = * i + wxFILE_SEP_PATH + lang ;
if ( HasMsgCatalogInDir ( langdir , * catalog ) ) {
# ifdef __WXOSX__
wxString rest ;
if ( lang . EndsWith ( " .lproj " , & rest ) )
lang = rest ;
# endif // __WXOSX__
2012-08-20 14:12:32 +02:00
info = wxLocale : : FindLanguageInfo ( lang ) ;
if ( info ! = NULL )
translations . insert ( info ) ;
2012-08-18 17:41:27 +02:00
}
}
}
# endif
}
bool HasMsgCatalogInDir ( const wxString & dir , const wxString & catelog )
{
return wxFileName ( dir , catelog , _T ( " mo " ) ) . FileExists ( )
| | wxFileName ( dir + wxFILE_SEP_PATH + _T ( " LC_MESSAGES " ) , catelog , _T ( " mo " ) ) . FileExists ( ) ;
}
2012-08-20 14:12:32 +02:00
const std : : set < const wxLanguageInfo * > & operator ( ) ( ) { return translations ; }
2012-08-18 17:41:27 +02:00
protected :
2012-08-20 14:12:32 +02:00
std : : set < const wxLanguageInfo * > translations ;
2012-08-18 17:41:27 +02:00
} translations ( catalogLookupPathPrefixes , catalog ) ;
return translations ( ) ;
}
2009-11-06 18:06:12 +01:00
MyFrame : : MyFrame (
const wxString & title ,
wxFileConfig * configParameter ,
wxLocale & locale ,
bool singleInstanceCheckParameter ,
int langParameter ) :
wxFrame ( NULL , wxID_ANY , title ) ,
config ( configParameter ) ,
myLocale ( locale ) ,
singleInstanceCheck ( singleInstanceCheckParameter ) ,
lang ( langParameter ) ,
htmlPrinting ( new wxHtmlEasyPrinting (
wxEmptyString ,
this ) ) ,
findDialog ( 0 ) ,
# ifndef __WXMSW__
helpController ( new wxHtmlHelpController ( ) ) ,
# endif
menuBar ( 0 ) ,
toolBar ( 0 ) ,
xmlMenu ( 0 ) ,
mainBook ( 0 ) ,
restoreFocusToNotebook ( false )
{
manager . SetManagedWindow ( this ) ;
lastPos = 0 ;
htmlReport = NULL ;
lastDoc = NULL ;
2012-08-15 15:43:31 +02:00
wxString defaultFont = wxSystemSettings : : GetFont ( wxSYS_SYSTEM_FONT ) . GetFaceName ( ) ;
2009-11-06 18:06:12 +01:00
bool findMatchCase ;
// fetch configuration
if ( config ) // config found
{
history . Load ( * config ) ;
properties . insertCloseTag =
config - > Read ( _T ( " insertCloseTag " ) , true ) ;
properties . completion =
config - > Read ( _T ( " completion " ) , true ) ;
properties . number =
config - > Read ( _T ( " number " ) , true ) ;
properties . fold =
config - > Read ( _T ( " fold " ) , true ) ;
properties . currentLine =
config - > Read ( _T ( " currentLine " ) , true ) ;
properties . highlightSyntax =
config - > Read ( _T ( " highlightSyntax " ) , true ) ;
properties . whitespaceVisible =
config - > Read ( _T ( " whitespaceVisible " ) , true ) ;
properties . indentLines =
config - > Read ( _T ( " indentLines " ) , true ) ;
properties . toggleLineBackground =
config - > Read ( _T ( " toggleLineBackground " ) , true ) ;
properties . protectHiddenElements =
config - > Read ( _T ( " protectHiddenElements " ) , true ) ;
properties . deleteWholeTag =
config - > Read ( _T ( " deleteWholeTag " ) , true ) ;
properties . validateAsYouType =
config - > Read ( _T ( " validateAsYouType " ) , true ) ;
properties . font =
config - > Read ( _T ( " font " ) , defaultFont ) ;
findRegex =
config - > Read ( _T ( " findRegex " ) , true ) ;
xpathExpression =
config - > Read ( _T ( " xpathExpression " ) , wxEmptyString ) ;
lastXslStylesheet =
config - > Read ( _T ( " lastXslStylesheet " ) , wxEmptyString ) ;
lastRelaxNGSchema =
config - > Read ( _T ( " lastRelaxNGSchema " ) , wxEmptyString ) ;
lastXslStylesheet . Replace ( _T ( " " ) , _T ( " %20 " ) , true ) ;
lastRelaxNGSchema . Replace ( _T ( " " ) , _T ( " %20 " ) , true ) ;
2010-04-26 00:24:53 +02:00
2009-11-06 18:06:12 +01:00
exportQuiet =
2010-04-26 00:24:53 +02:00
config - > Read ( _T ( " exportQuiet " ) , ( long ) true ) ;
2009-11-06 18:06:12 +01:00
exportMp3Album =
2010-04-26 00:24:53 +02:00
config - > Read ( _T ( " exportMp3Album " ) , ( long ) true ) ;
exportSuppressOptional =
config - > Read ( _T ( " exportSuppressOptional " ) , ( long ) true ) ;
exportHtml =
config - > Read ( _T ( " exportHtml " ) , ( long ) true ) ;
exportEpub =
config - > Read ( _T ( " exportEpub " ) , ( long ) true ) ;
exportRtf =
config - > Read ( _T ( " exportRtf " ) , ( long ) true ) ;
exportDoc =
config - > Read ( _T ( " exportDoc " ) , ( long ) true ) ;
exportFullDaisy =
config - > Read ( _T ( " exportFullDaisy " ) , ( long ) true ) ;
2009-11-06 18:06:12 +01:00
applicationDir =
2012-08-03 17:21:10 +02:00
config - > Read ( _T ( " applicationDir " ) , wxStandardPaths : : Get ( ) . GetDataDir ( ) ) ;
2009-11-06 18:06:12 +01:00
// if default value != true, type as long int
long valZoom , longFalse ;
longFalse = false ;
valZoom = 0 ;
frameWidth = frameHeight = framePosX = framePosY = 0 ;
properties . wrap =
config - > Read ( _T ( " wrap " ) , longFalse ) ;
properties . zoom =
config - > Read ( _T ( " zoom " ) , valZoom ) ;
properties . colorScheme = config - > Read ( _T ( " colorScheme " ) , COLOR_SCHEME_DEFAULT ) ;
globalReplaceAllDocuments =
config - > Read ( _T ( " globalReplaceAllDocuments " ) , longFalse ) ;
showFullPathOnFrame =
config - > Read ( _T ( " showFullPathOnFrame " ) , longFalse ) ;
findMatchCase =
config - > Read ( _T ( " findMatchCase " ) , longFalse ) ;
commandSync = config - > Read ( _T ( " commandSync " ) , longFalse ) ;
commandOutput = config - > Read ( _T ( " commandOutput " ) , ID_COMMAND_OUTPUT_IGNORE ) ;
commandString = config - > Read ( _T ( " commandString " ) , wxEmptyString ) ;
exportStylesheet = config - > Read ( _T ( " exportStylesheet " ) , wxEmptyString ) ;
exportFolder = config - > Read ( _T ( " exportFolder " ) , wxEmptyString ) ;
ruleSetPreset =
config - > Read ( _T ( " ruleSetPreset " ) , _ ( " Default style " ) ) ;
dictionaryPreset =
config - > Read ( _T ( " dictionaryPreset " ) , _ ( " en_US " ) ) ;
filterPreset =
config - > Read ( _T ( " filterPreset " ) , _ ( " (No filter) " ) ) ;
findData . SetFindString ( config - > Read ( _T ( " findReplaceFind " ) , _T ( " " ) ) ) ;
findData . SetReplaceString ( config - > Read ( _T ( " findReplaceReplace " ) , _T ( " " ) ) ) ;
toolbarVisible =
config - > Read ( _T ( " toolbarVisible " ) , true ) ;
protectTags = config - > Read ( _T ( " protectTags " ) , longFalse ) ;
visibilityState = config - > Read ( _T ( " visibilityState " ) , ID_SHOW_TAGS ) ;
framePosX = config - > Read ( _T ( " framePosX " ) , framePosX ) ;
framePosY = config - > Read ( _T ( " framePosY " ) , framePosY ) ;
frameWidth = config - > Read ( _T ( " frameWidth " ) , frameWidth ) ;
frameHeight = config - > Read ( _T ( " frameHeight " ) , frameHeight ) ;
rememberOpenTabs = config - > Read ( _T ( " rememberOpenTabs " ) , true ) ;
libxmlNetAccess = config - > Read ( _T ( " libxmlNetAccess " ) , longFalse ) ;
openTabsOnClose = config - > Read ( _T ( " openTabsOnClose " ) , _T ( " " ) ) ;
notebookStyle = config - > Read ( _T ( " notebookStyle " ) , ID_NOTEBOOK_STYLE_VC8_COLOR ) ;
saveBom = config - > Read ( _T ( " saveBom " ) , true ) ;
unlimitedUndo = config - > Read ( _T ( " unlimitedUndo " ) , true ) ;
layout = config - > Read ( _T ( " layout " ) , wxEmptyString ) ;
restoreLayout = config - > Read ( _T ( " restoreLayout " ) , true ) ;
showLocationPane = config - > Read ( _T ( " showLocationPane " ) , true ) ;
showInsertChildPane = config - > Read ( _T ( " showInsertChildPane " ) , true ) ;
showInsertSiblingPane = config - > Read ( _T ( " showInsertSiblingPane " ) , true ) ;
showInsertEntityPane = config - > Read ( _T ( " showInsertEntityPane " ) , true ) ;
expandInternalEntities = config - > Read ( _T ( " expandInternalEntities " ) , true ) ;
2012-08-04 04:15:32 +02:00
lastSymbol = config - > Read ( _T ( " lastSymbol " ) , _T ( " * " ) ) ;
2012-08-25 13:54:38 +02:00
xercescSSE2Warning = config - > Read ( _T ( " xercescSSE2Warning " ) , true ) ;
2009-11-06 18:06:12 +01:00
}
else // config not found
{
properties . insertCloseTag =
properties . completion =
properties . currentLine =
properties . indentLines =
properties . protectHiddenElements =
properties . toggleLineBackground =
properties . deleteWholeTag =
properties . highlightSyntax = true ;
properties . font = defaultFont ;
properties . wrap = properties . whitespaceVisible = false ;
properties . zoom = 0 ;
properties . colorScheme = COLOR_SCHEME_DEFAULT ;
2012-08-03 17:21:10 +02:00
applicationDir = wxStandardPaths : : Get ( ) . GetDataDir ( ) ;
2009-11-06 18:06:12 +01:00
ruleSetPreset = _ ( " Default style " ) ;
dictionaryPreset = _ ( " en_US " ) ;
filterPreset = _ ( " No filter " ) ;
xpathExpression = lastXslStylesheet = lastRelaxNGSchema = wxEmptyString ;
findRegex = true ;
findMatchCase = globalReplaceAllDocuments =
showFullPathOnFrame = false ;
toolbarVisible = true ;
protectTags = false ;
visibilityState = SHOW_TAGS ;
framePosX = framePosY = frameWidth = frameHeight = 0 ;
rememberOpenTabs = true ;
libxmlNetAccess = false ;
openTabsOnClose = wxEmptyString ;
notebookStyle = ID_NOTEBOOK_STYLE_VC8_COLOR ;
saveBom = unlimitedUndo = true ;
layout = wxEmptyString ;
restoreLayout = true ;
showLocationPane = true ;
showInsertChildPane = true ;
showInsertSiblingPane = true ;
showInsertEntityPane = true ;
expandInternalEntities = true ;
properties . validateAsYouType = true ;
commandSync = false ;
commandOutput = ID_COMMAND_OUTPUT_IGNORE ;
commandString = wxEmptyString ;
exportStylesheet = exportFolder = wxEmptyString ;
2010-04-26 00:24:53 +02:00
exportQuiet = exportMp3Album = exportSuppressOptional = exportHtml =
exportEpub = exportRtf = exportDoc = exportFullDaisy = true ;
2012-08-04 04:15:32 +02:00
lastSymbol = _T ( " * " ) ;
2012-08-25 13:54:38 +02:00
xercescSSE2Warning = true ;
}
if ( XMLPlatformUtils : : fgSSE2ok
& & xercescSSE2Warning
& & wxTheApp - > argc = = 1 )
{
xercescSSE2Warning = wxMessageBox (
2012-09-04 16:03:07 +02:00
_ ( " SSE2 is enabled in Xerces-C++ library. Xerces-C++ didn't " \
2012-08-25 13:54:38 +02:00
" use them in a thread-safe way. It may cause program crashes " \
" (segmentation faults). \n \n " \
" If it happens, please try compiling Xerces-C++ with SSE2 " \
" disabled. \n \n " \
" OK: \t Show this warning next time \n " \
" Cancel: \t Disable the warning \n " ) ,
_ ( " SSE2 problem in Xerces-C++ " ) ,
wxOK | wxCANCEL | wxICON_WARNING
) = = wxOK ;
2009-11-06 18:06:12 +01:00
}
largeFileProperties . completion = false ;
largeFileProperties . fold = false ;
largeFileProperties . whitespaceVisible = false ;
largeFileProperties . wrap = false ;
largeFileProperties . indentLines = false ;
largeFileProperties . protectHiddenElements = false ;
largeFileProperties . toggleLineBackground = false ;
largeFileProperties . insertCloseTag = false ;
largeFileProperties . deleteWholeTag = false ;
largeFileProperties . highlightSyntax = false ;
largeFileProperties . validateAsYouType = false ;
largeFileProperties . number = properties . number ;
largeFileProperties . currentLine = properties . currentLine ;
largeFileProperties . font = properties . font ;
largeFileProperties . zoom = 0 ;
largeFileProperties . colorScheme = COLOR_SCHEME_NONE ;
updatePaths ( ) ;
loadBitmaps ( ) ;
2012-08-30 16:37:01 +02:00
// Initialize libxml
WrapLibxml : : Init ( catalogPath ) ;
2009-11-06 18:06:12 +01:00
size_t findFlags = 0 ;
findFlags | = wxFR_DOWN ;
if ( findMatchCase )
findFlags | = wxFR_MATCHCASE ;
findData . SetFlags ( findFlags ) ;
// initialise document count for tab labels
documentCount = 1 ;
SetIcon ( wxICON ( appicon ) ) ;
CreateStatusBar ( ) ;
wxStatusBar * status = GetStatusBar ( ) ;
int widths [ ] = { - 24 , - 6 , - 6 , - 6 , - 8 } ;
status - > SetFieldsCount ( 5 ) ;
status - > SetStatusWidths ( 5 , widths ) ;
if ( ! frameWidth | |
! frameHeight | |
frameWidth < 0 | |
frameHeight < 0 | |
framePosX < 0 | |
framePosY < 0 )
{
# ifdef __WXMSW__
Maximize ( ) ;
# else
SetSize ( 50 , 50 , 640 , 480 ) ;
# endif
}
else
{
SetSize ( framePosX , framePosY , frameWidth , frameHeight ) ;
}
stylePosition = aboutPosition = wxDefaultPosition ;
styleSize = wxSize ( 720 , 540 ) ;
showTopBars ( toolbarVisible ) ;
long style = wxAUI_NB_TOP |
wxAUI_NB_TAB_SPLIT |
wxAUI_NB_TAB_MOVE |
2012-08-15 15:43:31 +02:00
wxAUI_NB_SCROLL_BUTTONS |
2009-11-06 18:06:12 +01:00
wxAUI_NB_WINDOWLIST_BUTTON |
wxAUI_NB_CLOSE_ON_ALL_TABS |
wxNO_BORDER ;
mainBook = new MyNotebook (
this ,
ID_NOTEBOOK ,
wxDefaultPosition ,
wxDefaultSize ,
style ) ;
manager . AddPane ( mainBook , wxAuiPaneInfo ( ) . CenterPane ( )
. PaneBorder ( false ) . Name ( _T ( " documentPane " ) ) ) ;
manager . GetPane ( mainBook ) . dock_proportion = 10 ;
// add insert child panes
locationPanel = new LocationPanel ( this , ID_LOCATION_PANEL ) ;
insertChildPanel = new InsertPanel ( this , ID_INSERT_CHILD_PANEL ,
INSERT_PANEL_TYPE_CHILD ) ;
insertSiblingPanel = new InsertPanel ( this , ID_INSERT_SIBLING_PANEL ,
INSERT_PANEL_TYPE_SIBLING ) ;
insertEntityPanel = new InsertPanel ( this , ID_INSERT_ENTITY_PANEL ,
INSERT_PANEL_TYPE_ENTITY ) ;
# ifdef __WXMSW__
manager . AddPane ( ( wxWindow * ) locationPanel , wxRIGHT , _ ( " Current Element " ) ) ;
manager . AddPane ( ( wxWindow * ) insertChildPanel , wxRIGHT , _ ( " Insert Element " ) ) ;
manager . AddPane ( ( wxWindow * ) insertSiblingPanel , wxRIGHT , _ ( " Insert Sibling " ) ) ;
manager . AddPane ( ( wxWindow * ) insertEntityPanel , wxRIGHT , _ ( " Insert Entity " ) ) ;
# else
manager . AddPane ( ( wxWindow * ) insertEntityPanel , wxRIGHT , _ ( " Insert Entity " ) ) ;
manager . AddPane ( ( wxWindow * ) insertSiblingPanel , wxRIGHT , _ ( " Insert Sibling " ) ) ;
manager . AddPane ( ( wxWindow * ) insertChildPanel , wxRIGHT , _ ( " Insert Element " ) ) ;
manager . AddPane ( ( wxWindow * ) locationPanel , wxRIGHT , _ ( " Current Element " ) ) ;
# endif
manager . GetPane ( locationPanel ) . Name ( _T ( " locationPane " ) ) . Show (
( restoreLayout ) ? showLocationPane : true ) . DestroyOnClose ( false ) . PinButton ( true ) ;
manager . GetPane ( locationPanel ) . dock_proportion = 1 ;
manager . GetPane ( insertChildPanel ) . Name ( _T ( " insertChildPane " ) ) . Show (
( restoreLayout ) ? showInsertChildPane : true ) . DestroyOnClose ( false ) . PinButton ( true ) ;
manager . GetPane ( insertChildPanel ) . dock_proportion = 1 ;
manager . GetPane ( insertSiblingPanel ) . Name ( _T ( " insertSiblingPane " ) ) . Show (
( restoreLayout ) ? showInsertSiblingPane : true ) . DestroyOnClose ( false ) . PinButton ( true ) ;
manager . GetPane ( insertSiblingPanel ) . dock_proportion = 1 ;
manager . GetPane ( insertEntityPanel ) . Name ( _T ( " insertEntityPane " ) ) . Show (
( restoreLayout ) ? showInsertEntityPane : true ) . DestroyOnClose ( false ) . PinButton ( true ) ;
manager . GetPane ( insertEntityPanel ) . dock_proportion = 1 ;
// add (hidden) message pane
htmlReport = new MyHtmlPane (
this ,
ID_VALIDATION_PANE ,
wxDefaultPosition ,
wxSize ( - 1 , 48 ) ) ;
# ifndef __WXMSW__
const int sizeArray [ ] =
{
8 , 9 , 10 , 11 , 12 , 13 , 14
} ;
htmlReport - > SetFonts ( wxEmptyString , wxEmptyString , sizeArray ) ;
# endif
htmlReport - > SetBorders ( 0 ) ;
manager . AddPane ( htmlReport , wxAuiPaneInfo ( ) . Movable ( ) . Bottom ( )
. Hide ( ) . Name ( _T ( " messagePane " ) )
. DestroyOnClose ( false ) . Layer ( 1 ) ) ;
manager . GetPane ( htmlReport ) . dock_proportion = 1 ;
# ifdef NEWFINDREPLACE
findReplacePanel = new FindReplacePanel (
this ,
ID_FIND_REPLACE_PANEL ,
& findData ,
true ,
findRegex ) ;
manager . AddPane (
( wxWindow * ) findReplacePanel ,
wxAuiPaneInfo ( ) . Bottom ( ) . Hide ( ) . Caption ( wxEmptyString ) .
DestroyOnClose ( false ) . Layer ( 2 ) ) ;
# endif
commandPanel = new CommandPanel (
this ,
wxID_ANY ,
commandString , // tbd
commandSync , // tbd
commandOutput // tbd
) ;
manager . AddPane (
( wxWindow * ) commandPanel ,
wxAuiPaneInfo ( ) . Bottom ( ) . Hide ( ) . Caption ( _T ( " Command " ) ) . DestroyOnClose ( false ) . Layer ( 3 ) ) ;
2013-12-14 00:36:03 +01:00
validatePaths ( ) ;
2009-11-06 18:06:12 +01:00
// handle command line and, on Windows, MS Word integration
handleCommandLineFlag = ( wxTheApp - > argc > 1 ) ? true : false ;
if ( rememberOpenTabs & & ! openTabsOnClose . empty ( ) )
openRememberedTabs ( ) ;
else
{
if ( ! handleCommandLineFlag )
newDocument ( wxEmptyString ) ;
}
# ifdef __WXMSW__
DragAcceptFiles ( true ) ; // currently Windows only
# endif
XmlDoc * doc = getActiveDocument ( ) ;
insertEntityPanel - > update ( doc ) ; // NULL is ok
manager . Update ( ) ;
/*
defaultLayout = manager . SavePerspective ( ) ;
// restore layout if req'd
if ( restoreLayout & & ! layout . empty ( ) )
{
if ( ! manager . LoadPerspective ( layout , true ) )
manager . LoadPerspective ( defaultLayout , true ) ;
}
*/
}
MyFrame : : ~ MyFrame ( )
{
2013-10-25 13:44:51 +02:00
ThreadReaper : : get ( ) . clear ( ) ;
2009-11-06 18:06:12 +01:00
std : : vector < wxString > : : iterator it ;
for ( it = tempFileVector . begin ( ) ; it ! = tempFileVector . end ( ) ; it + + )
wxRemoveFile ( * it ) ;
layout = manager . SavePerspective ( ) ;
if ( ! config )
return ;
history . Save ( * config ) ;
config - > Write ( _T ( " insertCloseTag " ) , properties . insertCloseTag ) ;
config - > Write ( _T ( " completion " ) , properties . completion ) ;
config - > Write ( _T ( " number " ) , properties . number ) ;
config - > Write ( _T ( " fold " ) , properties . fold ) ;
config - > Write ( _T ( " currentLine " ) , properties . currentLine ) ;
config - > Write ( _T ( " whitespaceVisible " ) , properties . whitespaceVisible ) ;
config - > Write ( _T ( " wrap " ) , properties . wrap ) ;
config - > Write ( _T ( " indentLines " ) , properties . indentLines ) ;
config - > Write ( _T ( " zoom " ) , properties . zoom ) ;
config - > Write ( _T ( " colorScheme " ) , properties . colorScheme ) ;
config - > Write ( _T ( " protectHiddenElements " ) , properties . protectHiddenElements ) ;
config - > Write ( _T ( " toggleLineBackground " ) , properties . toggleLineBackground ) ;
config - > Write ( _T ( " deleteWholeTag " ) , properties . deleteWholeTag ) ;
config - > Write ( _T ( " validateAsYouType " ) , properties . validateAsYouType ) ;
config - > Write ( _T ( " font " ) , properties . font ) ;
config - > Write ( _T ( " highlightSyntax " ) , properties . highlightSyntax ) ;
config - > Write ( _T ( " applicationDir " ) , applicationDir ) ;
config - > Write ( _T ( " ruleSetPreset " ) , ruleSetPreset ) ;
config - > Write ( _T ( " dictionaryPreset " ) , dictionaryPreset ) ;
config - > Write ( _T ( " filterPreset " ) , filterPreset ) ;
config - > Write ( _T ( " xpathExpression " ) , xpathExpression ) ;
config - > Write ( _T ( " findReplaceFind " ) , findData . GetFindString ( ) ) ;
config - > Write ( _T ( " findReplaceReplace " ) , findData . GetReplaceString ( ) ) ;
config - > Write ( _T ( " globalReplaceAllDocuments " ) , globalReplaceAllDocuments ) ;
config - > Write ( _T ( " showFullPathOnFrame " ) , showFullPathOnFrame ) ;
config - > Write ( _T ( " toolbarVisible " ) , toolbarVisible ) ;
config - > Write ( _T ( " protectTags " ) , protectTags ) ;
config - > Write ( _T ( " visibilityState " ) , visibilityState ) ;
config - > Write ( _T ( " showLocationPane " ) , manager . GetPane ( locationPanel ) . IsShown ( ) ) ;
config - > Write ( _T ( " showInsertChildPane " ) , manager . GetPane ( insertChildPanel ) . IsShown ( ) ) ;
config - > Write ( _T ( " showInsertSiblingPane " ) , manager . GetPane ( insertSiblingPanel ) . IsShown ( ) ) ;
config - > Write ( _T ( " showInsertEntityPane " ) , manager . GetPane ( insertEntityPanel ) . IsShown ( ) ) ;
config - > Write ( _T ( " expandInternalEntities " ) , expandInternalEntities ) ;
config - > Write ( _T ( " findRegex " ) , findReplacePanel - > getRegex ( ) ) ;
config - > Write ( _T ( " findMatchCase " ) , ( findData . GetFlags ( ) ) & wxFR_MATCHCASE ) ;
config - > Write ( _T ( " commandSync " ) , commandPanel - > getSync ( ) ) ;
config - > Write ( _T ( " commandOutput " ) , commandPanel - > getOutput ( ) ) ;
config - > Write ( _T ( " commandString " ) , commandPanel - > getCommand ( ) ) ;
config - > Write ( _T ( " restoreLayout " ) , restoreLayout ) ;
config - > Write ( _T ( " lastXslStylesheet " ) , lastXslStylesheet ) ;
config - > Write ( _T ( " lastRelaxNGSchema " ) , lastRelaxNGSchema ) ;
config - > Write ( _T ( " exportStylesheet " ) , exportStylesheet ) ;
config - > Write ( _T ( " exportFolder " ) , exportFolder ) ;
config - > Write ( _T ( " exportQuiet " ) , exportQuiet ) ;
config - > Write ( _T ( " exportMp3Album " ) , exportMp3Album ) ;
2010-04-26 00:24:53 +02:00
config - > Write ( _T ( " exportSuppressOptional " ) , exportSuppressOptional ) ;
config - > Write ( _T ( " exportHtml " ) , exportHtml ) ;
config - > Write ( _T ( " exportEpub " ) , exportEpub ) ;
config - > Write ( _T ( " exportRtf " ) , exportRtf ) ;
config - > Write ( _T ( " exportDoc " ) , exportDoc ) ;
config - > Write ( _T ( " exportFullDaisy " ) , exportFullDaisy ) ;
2009-11-06 18:06:12 +01:00
GetPosition ( & framePosX , & framePosY ) ;
config - > Write ( _T ( " framePosX " ) , framePosX ) ;
config - > Write ( _T ( " framePosY " ) , framePosY ) ;
GetSize ( & frameWidth , & frameHeight ) ;
config - > Write ( _T ( " frameWidth " ) , frameWidth ) ;
config - > Write ( _T ( " frameHeight " ) , frameHeight ) ;
config - > Write ( _T ( " rememberOpenTabs " ) , rememberOpenTabs ) ;
config - > Write ( _T ( " openTabsOnClose " ) , openTabsOnClose ) ;
config - > Write ( _T ( " libxmlNetAccess " ) , libxmlNetAccess ) ;
config - > Write ( _T ( " singleInstanceCheck " ) , singleInstanceCheck ) ;
config - > Write ( _T ( " lang " ) , lang ) ;
config - > Write ( _T ( " notebookStyle " ) , notebookStyle ) ;
config - > Write ( _T ( " saveBom " ) , saveBom ) ;
config - > Write ( _T ( " unlimitedUndo " ) , unlimitedUndo ) ;
2012-08-04 04:15:32 +02:00
config - > Write ( _T ( " lastSymbol " ) , lastSymbol ) ;
2012-08-25 13:54:38 +02:00
config - > Write ( _T ( " xercescSSE2Warning " ) , xercescSSE2Warning ) ;
2012-08-04 04:15:32 +02:00
2009-11-06 18:06:12 +01:00
manager . UnInit ( ) ;
wxTheClipboard - > Flush ( ) ;
}
void MyFrame : : showTopBars ( bool b )
{
if ( ! menuBar )
{
SetToolBar ( NULL ) ;
menuBar = getMenuBar ( ) ;
SetMenuBar ( menuBar ) ;
}
if ( b )
{
if ( ! toolBar )
toolBar = getToolBar ( ) ;
SetToolBar ( toolBar ) ;
}
else
{
SetToolBar ( NULL ) ;
delete toolBar ;
toolBar = NULL ;
}
}
void MyFrame : : handleCommandLine ( )
{
bool wordFlag , styleFlag ;
wordFlag = styleFlag = false ;
wxChar c ;
2012-08-09 13:23:00 +02:00
int argc = wxTheApp - > argc ;
wxChar * * argv = wxTheApp - > argv ;
2009-11-06 18:06:12 +01:00
2012-08-09 13:23:00 +02:00
while ( ( - - argc > 0 & & ( * + + argv ) [ 0 ] = = L ' - ' ) ! = 0 )
2009-11-06 18:06:12 +01:00
{
wxString wideVersion ( ABOUT_VERSION ) ;
std : : string version = ( const char * ) wideVersion . mb_str ( wxConvUTF8 ) ;
2012-08-09 13:23:00 +02:00
const wxChar * s = argv [ 0 ] ;
while ( ( c = * + + s ) ! = 0 )
2009-11-06 18:06:12 +01:00
{
switch ( c )
{
2012-08-09 13:23:00 +02:00
case ' w ' :
2009-11-06 18:06:12 +01:00
wordFlag = true ;
break ;
2012-08-09 13:23:00 +02:00
case ' s ' :
2009-11-06 18:06:12 +01:00
styleFlag = true ;
break ;
2012-08-09 13:23:00 +02:00
case ' - ' :
if ( * + + s = = ' v ' )
2009-11-06 18:06:12 +01:00
{
std : : cout < < version . c_str ( ) < < std : : endl ;
}
else
{
2012-08-09 13:23:00 +02:00
std : : cout < < " Usage: xmlcopyeditor [--version --help -ws] [<file>] [<file2>] " < < std : : endl
< < " Options -w (import Microsoft Word document) and -s (open Spelling and style check) are provided for integration with Microsoft Office and only available on Windows " < < std : : endl ;
2009-11-06 18:06:12 +01:00
}
exit ( 0 ) ;
default :
messagePane ( _ ( " Unknown command line switch (expecting 'w', 's', --version or --help) " ) ,
CONST_STOP ) ;
return ;
}
}
}
2012-08-09 13:23:00 +02:00
if ( argc < = 0 )
2009-11-06 18:06:12 +01:00
{
messagePane ( _ ( " Command line processing incomplete: no file specified " ) ,
CONST_STOP ) ;
return ;
}
wxString fileName ;
// no flags specified or not Windows
# ifdef __WXMSW__
if ( ! styleFlag & & ! wordFlag )
# endif
{
2012-08-09 13:23:00 +02:00
for ( ; argc > 0 ; - - argc , + + argv )
2009-11-06 18:06:12 +01:00
{
2012-08-09 13:23:00 +02:00
fileName = wxString ( * argv , wxConvLocal ) ;
2009-11-06 18:06:12 +01:00
fileName = PathResolver : : run ( fileName ) ;
if ( isOpen ( fileName ) )
continue ;
else if ( ! openFile ( fileName ) )
break ;
}
return ;
}
// options only available on Windows
2012-08-09 13:23:00 +02:00
fileName = wxString ( * argv , wxConvLocal ) ;
2009-11-06 18:06:12 +01:00
// fetch as many parameters as possible
for ( ; ; )
{
2012-08-09 13:23:00 +02:00
if ( - - argc < = 0 )
2009-11-06 18:06:12 +01:00
break ;
2012-08-09 13:23:00 +02:00
+ + argv ;
ruleSetPreset = wxString ( * argv , wxConvLocal ) ;
2009-11-06 18:06:12 +01:00
2012-08-09 13:23:00 +02:00
if ( - - argc < = 0 )
2009-11-06 18:06:12 +01:00
break ;
2012-08-09 13:23:00 +02:00
+ + argv ;
filterPreset = wxString ( * argv , wxConvLocal ) ;
2009-11-06 18:06:12 +01:00
2012-08-09 13:23:00 +02:00
if ( - - argc < = 0 )
2009-11-06 18:06:12 +01:00
break ;
2012-08-09 13:23:00 +02:00
+ + argv ;
applicationDir = wxString ( * argv , wxConvLocal ) ;
2009-11-06 18:06:12 +01:00
updatePaths ( ) ;
break ;
}
if ( wordFlag )
importMSWord ( fileName ) ;
else
openFile ( fileName ) ;
if ( styleFlag & & ! ruleSetPreset . empty ( ) & & ! filterPreset . empty ( ) )
{
wxCommandEvent e ;
OnSpelling ( e ) ;
}
}
bool MyFrame : : isOpen ( const wxString & fileName )
{
return ( openFileSet . find ( fileName ) ! = openFileSet . end ( ) ) ;
}
bool MyFrame : : activateTab ( const wxString & fileName )
{
int pageCount = mainBook - > GetPageCount ( ) ;
XmlDoc * currentDoc ;
for ( int i = 0 ; i < pageCount ; + + i )
{
currentDoc = ( XmlDoc * ) mainBook - > GetPage ( i ) ;
if ( ! currentDoc )
break ;
if ( currentDoc - > getFullFileName ( ) = = fileName )
{
mainBook - > SetSelection ( i ) ;
return true ;
}
}
return false ;
}
void MyFrame : : OnAbout ( wxCommandEvent & WXUNUSED ( event ) )
{
wxString description ;
description = ABOUT_DESCRIPTION ;
2012-08-04 09:50:30 +02:00
description . Append ( ABOUT_CONTRIBUTORS ) ;
2009-11-06 18:06:12 +01:00
description . Append ( _T ( " \n \n Framework version: " ) ) ;
description . Append ( wxVERSION_STRING ) ;
description . Append ( _T ( " \n " ) ) ;
wxAboutDialogInfo info ;
info . SetName ( _ ( " XML Copy Editor " ) ) ;
info . SetWebSite ( _T ( " http://xml-copy-editor.sourceforge.net " ) ) ;
info . SetVersion ( ABOUT_VERSION ) ;
info . SetCopyright ( ABOUT_COPYRIGHT ) ;
2012-03-16 19:00:48 +01:00
info . AddDeveloper ( _T ( " Gerald Schmidt (development) <gnschmidt at users dot sourceforge dot net> " ) ) ;
info . AddDeveloper ( _T ( " Matt Smigielski (testing) <alectrus at users dot sourceforge dot net> " ) ) ;
info . AddDeveloper ( _T ( " Justin Dearing (development) <j-pimp at users dot sourceforge dot net> " ) ) ;
info . AddDeveloper ( _T ( " Kev James (development) <kmjames at users dot sourceforge dot net> " ) ) ;
info . AddDeveloper ( _T ( " Anh Trinh (development) <ant271 at users dot sourceforge dot net> " ) ) ;
2012-08-11 08:19:43 +02:00
info . AddDeveloper ( _T ( " Zane U. Ji (development) <zaneuji at users dot sourceforge dot net> " ) ) ;
2012-03-16 19:00:48 +01:00
info . AddTranslator ( _T ( " Viliam Búr (Slovak) <viliam at bur dot sk> " ) ) ;
info . AddTranslator ( _T ( " David Håsäther (Swedish) <hasather at gmail dot com> " ) ) ;
info . AddTranslator ( _T ( " François Badier (French) <frabad at gmail dot com> " ) ) ;
info . AddTranslator ( _T ( " Thomas Wenzel (German) <thowen at users dot sourceforge.net> " ) ) ;
info . AddTranslator ( _T ( " SHiNE CsyFeK (Chinese Simplified) <csyfek at gmail dot com> " ) ) ;
info . AddTranslator ( _T ( " HSU PICHAN, YANG SHUFUN, CHENG PAULIAN, CHUANG KUO-PING, Marcus Bingenheimer (Chinese Traditional) " ) ) ;
info . AddTranslator ( _T ( " Serhij Dubyk (Ukrainian) <dubyk at library dot lviv dot ua> " ) ) ;
info . AddTranslator ( _T ( " Antonio Angelo (Italian) <aangelo at users dot sourceforge dot net> " ) ) ;
info . AddTranslator ( _T ( " Siarhei Kuchuk (Russian) <Cuchuk dot Sergey at gmail dot com> " ) ) ;
info . AddTranslator ( _T ( " Marcos Pérez González (Spanish) <marcos_pg at yahoo dot com> " ) ) ;
info . AddTranslator ( _T ( " Rob Elemans (Dutch) <relemans at gmail dot com> " ) ) ;
info . AddTranslator ( _T ( " Robert Falcó Miramontes <rfalco at acett dot org> " ) ) ;
2009-11-06 18:06:12 +01:00
info . SetLicense ( ABOUT_LICENSE ) ;
info . SetDescription ( description ) ;
wxAboutBox ( info ) ;
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
doc - > SetFocus ( ) ;
}
void MyFrame : : OnCheckWellformedness ( wxCommandEvent & event )
{
statusProgress ( wxEmptyString ) ;
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
std : : string utf8Buffer ;
getRawText ( doc , utf8Buffer ) ;
if ( utf8Buffer . empty ( ) )
return ;
// handle unusual encodings
if ( ! XmlEncodingHandler : : setUtf8 ( utf8Buffer ) )
{
encodingMessage ( ) ;
return ;
}
doc - > clearErrorIndicators ( ) ;
statusProgress ( _ ( " Parse in progress... " ) ) ;
// check for well-formedness
auto_ptr < WrapExpat > we ( new WrapExpat ( ) ) ;
if ( ! we - > parse ( utf8Buffer . c_str ( ) ) )
{
statusProgress ( wxEmptyString ) ;
2012-08-10 15:34:13 +02:00
messagePane ( we - > getLastError ( ) , CONST_WARNING ) ;
2009-11-06 18:06:12 +01:00
std : : pair < int , int > posPair = we - > getErrorPosition ( ) ;
- - ( posPair . first ) ;
int cursorPos =
doc - > PositionFromLine ( posPair . first ) ;
doc - > SetSelection ( cursorPos , cursorPos ) ;
doc - > setErrorIndicator ( posPair . first , posPair . second ) ;
return ;
}
statusProgress ( wxEmptyString ) ;
documentOk ( _ ( " well-formed " ) ) ;
}
void MyFrame : : OnPageClosing ( wxAuiNotebookEvent & event ) //wxNotebookEvent& event)//wxFlatNotebookEvent& event)
{
deletePageVetoed = false ;
if ( insertChildPanel & & insertSiblingPanel & & locationPanel )
{
insertChildPanel - > update ( NULL , wxEmptyString ) ;
insertSiblingPanel - > update ( NULL , wxEmptyString ) ;
locationPanel - > update ( ) ;
manager . Update ( ) ;
}
XmlDoc * doc ;
doc = ( XmlDoc * ) mainBook - > GetPage ( event . GetSelection ( ) ) ;
if ( ! doc )
return ;
statusProgress ( wxEmptyString ) ;
closePane ( ) ;
if ( doc - > GetModify ( ) ) //CanUndo())
{
int selection ;
wxString fileName ;
2013-11-12 17:30:07 +01:00
selection = mainBook - > GetSelection ( ) ;
if ( selection ! = - 1 )
2009-11-06 18:06:12 +01:00
fileName = doc - > getShortFileName ( ) ;
int answer = wxMessageBox (
_ ( " Do you want to save the changes to " ) + fileName + _T ( " ? " ) ,
_ ( " XML Copy Editor " ) ,
wxYES_NO | wxCANCEL | wxICON_QUESTION ,
this ) ;
if ( answer = = wxCANCEL )
{
event . Veto ( ) ;
deletePageVetoed = true ;
return ;
}
else if ( answer = = wxYES )
{
wxCommandEvent event ;
OnSave ( event ) ;
}
}
statusProgress ( wxEmptyString ) ;
openFileSet . erase ( doc - > getFullFileName ( ) ) ;
event . Skip ( ) ;
}
void MyFrame : : OnClose ( wxCommandEvent & WXUNUSED ( event ) )
{
closeActiveDocument ( ) ;
}
void MyFrame : : OnCloseAll ( wxCommandEvent & WXUNUSED ( event ) )
{
if ( ! mainBook )
return ;
openTabsOnClose = wxEmptyString ;
// retain tab order
if ( rememberOpenTabs & & ! openFileSet . empty ( ) )
{
XmlDoc * doc ;
wxString fullPath ;
size_t maxTabs = mainBook - > GetPageCount ( ) ;
for ( size_t i = 0 ; i < maxTabs ; + + i )
{
doc = ( XmlDoc * ) mainBook - > GetPage ( i ) ;
if ( doc )
{
fullPath = doc - > getFullFileName ( ) ;
if ( ! fullPath . empty ( ) )
{
openTabsOnClose . Append ( fullPath ) ;
openTabsOnClose . Append ( _T ( " | " ) ) ;
}
}
}
}
while ( closeActiveDocument ( ) )
;
}
void MyFrame : : OnClosePane ( wxCommandEvent & WXUNUSED ( event ) )
{
closePane ( ) ;
//closeFindReplacePane();
//closeCommandPane();
XmlDoc * doc = getActiveDocument ( ) ;
if ( doc )
doc - > SetFocus ( ) ;
}
void MyFrame : : closePane ( )
{
if ( ! htmlReport )
return ;
manager . GetPane ( htmlReport ) . Hide ( ) ;
manager . Update ( ) ;
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
doc - > SetFocus ( ) ;
}
void MyFrame : : closeFindReplacePane ( )
{
if ( manager . GetPane ( findReplacePanel ) . IsShown ( ) )
manager . GetPane ( findReplacePanel ) . Hide ( ) ;
manager . Update ( ) ;
}
void MyFrame : : closeCommandPane ( )
{
if ( manager . GetPane ( commandPanel ) . IsShown ( ) )
manager . GetPane ( commandPanel ) . Hide ( ) ;
manager . Update ( ) ;
}
bool MyFrame : : panelHasFocus ( )
{
XmlDoc * doc = getActiveDocument ( ) ;
return ( ! doc | | ( FindFocus ( ) ! = ( wxWindow * ) doc ) ) ;
}
void MyFrame : : OnCut ( wxCommandEvent & event )
{
if ( panelHasFocus ( ) )
{
event . Skip ( ) ;
return ;
}
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
if ( protectTags )
doc - > adjustSelection ( ) ;
doc - > Cut ( ) ;
doc - > setValidationRequired ( true ) ;
}
void MyFrame : : OnCopy ( wxCommandEvent & event )
{
if ( panelHasFocus ( ) )
{
event . Skip ( ) ;
return ;
}
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
doc - > Copy ( ) ;
}
void MyFrame : : OnPaste ( wxCommandEvent & event )
{
if ( panelHasFocus ( ) )
{
event . Skip ( ) ;
return ;
}
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
// this has to be handled here to override Scintilla's default Ctrl+V support
if ( protectTags )
{
if ( ! wxTheClipboard - > Open ( ) | | ! wxTheClipboard - > IsSupported ( wxDF_TEXT ) )
return ;
wxTextDataObject data ;
wxTheClipboard - > GetData ( data ) ;
wxString buffer = data . GetText ( ) ;
wxTheClipboard - > Close ( ) ;
xmliseWideTextNode ( buffer ) ;
doc - > adjustCursor ( ) ;
doc - > AddText ( buffer ) ;
}
else
doc - > Paste ( ) ;
}
void MyFrame : : OnIdle ( wxIdleEvent & event )
{
wxStatusBar * status = GetStatusBar ( ) ;
if ( ! status )
return ;
/*
// IPC handling: take one file from fileQueue at a time
if ( ! fileQueue . empty ( ) )
{
openFile ( * ( fileQueue . begin ( ) ) ) ;
fileQueue . erase ( fileQueue . begin ( ) ) ;
}
*/
// update attributes hidden field even if no document loaded
wxString currentHiddenStatus = status - > GetStatusText ( STATUS_HIDDEN ) ;
if ( visibilityState = = HIDE_ATTRIBUTES )
{
if ( currentHiddenStatus ! = _ ( " Attributes hidden " ) )
status - > SetStatusText (
_ ( " Attributes hidden " ) ,
STATUS_HIDDEN ) ;
}
else if ( visibilityState = = HIDE_TAGS )
{
if ( currentHiddenStatus ! = _ ( " Tags hidden " ) )
status - > SetStatusText (
_ ( " Tags hidden " ) ,
STATUS_HIDDEN ) ;
}
else
{
if ( ! currentHiddenStatus . empty ( ) )
status - > SetStatusText ( wxEmptyString , STATUS_HIDDEN ) ;
}
// update protected field even if no document loaded
wxString currentProtectedStatus = status - > GetStatusText ( STATUS_PROTECTED ) ;
if ( protectTags )
{
if ( currentProtectedStatus ! = _ ( " Tags locked " ) )
status - > SetStatusText (
_ ( " Tags locked " ) ,
STATUS_PROTECTED ) ;
}
else
{
if ( ! currentProtectedStatus . empty ( ) )
status - > SetStatusText ( wxEmptyString , STATUS_PROTECTED ) ;
}
// check if document loaded
wxString frameTitle = GetTitle ( ) ;
2013-12-11 16:06:15 +01:00
XmlDoc * doc = getActiveDocument ( ) ;
if ( doc = = NULL )
2009-11-06 18:06:12 +01:00
{
if ( lastDoc ! = NULL )
{
lastDoc = NULL ;
status - > SetStatusText ( wxEmptyString , STATUS_MODIFIED ) ;
status - > SetStatusText ( wxEmptyString , STATUS_POSITION ) ;
locationPanel - > update ( NULL , wxEmptyString ) ;
insertChildPanel - > update ( NULL , wxEmptyString ) ;
insertSiblingPanel - > update ( NULL , wxEmptyString ) ;
insertEntityPanel - > update ( NULL , wxEmptyString ) ;
wxString minimal = _ ( " XML Copy Editor " ) ;
if ( frameTitle ! = minimal )
SetTitle ( minimal ) ;
closeFindReplacePane ( ) ;
event . Skip ( ) ;
manager . Update ( ) ;
}
return ;
}
if ( restoreFocusToNotebook )
{
doc - > SetFocus ( ) ;
restoreFocusToNotebook = false ;
}
2013-12-11 16:06:15 +01:00
// update modified field
2009-11-06 18:06:12 +01:00
if ( ! mainBook )
return ;
int index = mainBook - > GetSelection ( ) ;
wxString currentModifiedStatus = status - > GetStatusText ( STATUS_MODIFIED ) ;
wxString currentTabLabel = mainBook - > GetPageText ( index ) ;
if ( doc - > GetModify ( ) )
{
if ( currentModifiedStatus ! = _ ( " Modified " ) )
{
status - > SetStatusText ( _ ( " Modified " ) , STATUS_MODIFIED ) ;
if ( ! ( currentTabLabel . Mid ( 0 , 1 ) = = _T ( " * " ) ) )
{
currentTabLabel . Prepend ( _T ( " * " ) ) ;
mainBook - > SetPageText ( index , currentTabLabel ) ;
}
}
}
else
{
if ( ! currentModifiedStatus . empty ( ) )
{
status - > SetStatusText ( _T ( " " ) , STATUS_MODIFIED ) ;
if ( currentTabLabel . Mid ( 0 , 1 ) = = _T ( " * " ) )
{
currentTabLabel . Remove ( 0 , 1 ) ;
mainBook - > SetPageText ( index , currentTabLabel ) ;
}
}
}
// update coordinates field
int current = doc - > GetCurrentPos ( ) ;
2013-12-11 16:06:15 +01:00
if ( current ! = lastPos )
2009-11-06 18:06:12 +01:00
{
wxString coordinates ;
coordinates . Printf (
_ ( " Ln %i Col %i " ) ,
2013-12-11 16:06:15 +01:00
doc - > LineFromPosition ( current ) + 1 ,
doc - > GetColumn ( current ) + 1 ) ;
2009-11-06 18:06:12 +01:00
GetStatusBar ( ) - > SetStatusText ( coordinates , STATUS_POSITION ) ;
}
// update parent element field
wxString parent , grandparent ;
if ( current = = lastPos & & doc = = lastDoc )
return ;
lastPos = current ;
lastDoc = doc ;
2013-12-11 16:06:15 +01:00
wxString docTitle ;
if ( doc - > getFullFileName ( ) . empty ( ) | | ! showFullPathOnFrame )
docTitle = doc - > getShortFileName ( ) ;
else
docTitle = doc - > getFullFileName ( ) ;
docTitle + = _T ( " - " ) ;
docTitle + = _ ( " XML Copy Editor " ) ;
if ( frameTitle ! = docTitle )
SetTitle ( docTitle ) ;
2009-11-06 18:06:12 +01:00
// don't try to find parent if pane is not shown
if ( ! manager . GetPane ( insertChildPanel ) . IsShown ( ) & & ! properties . validateAsYouType )
return ;
int parentCloseAngleBracket = - 1 ;
if ( ! doc - > canInsertAt ( current ) )
parent = grandparent = wxEmptyString ;
else
{
parentCloseAngleBracket = doc - > getParentCloseAngleBracket ( current ) ;
parent = doc - > getLastElementName ( parentCloseAngleBracket ) ;
}
if ( ! parent . empty ( ) & & properties . validateAsYouType & & doc - > getValidationRequired ( ) )
{
// tbd: limit to parent element
doc - > backgroundValidate ( ) ;
}
if ( parent = = lastParent )
return ;
lastParent = parent ;
bool mustUpdate = false ;
if ( locationPanel & & insertChildPanel & & insertEntityPanel )
{
locationPanel - > update ( doc , parent ) ;
insertChildPanel - > update ( doc , parent ) ;
insertEntityPanel - > update ( doc ) ;
mustUpdate = true ;
}
if ( parent . empty ( ) )
{
if ( insertSiblingPanel )
insertSiblingPanel - > update ( doc , wxEmptyString ) ;
if ( mustUpdate )
manager . Update ( ) ;
return ;
}
if ( ! manager . GetPane ( insertSiblingPanel ) . IsShown ( ) )
{
if ( mustUpdate )
manager . Update ( ) ;
return ;
}
// try to fetch grandparent if necessary/possible
if ( ! parent . empty ( ) & & parentCloseAngleBracket ! = - 1 )
{
int grandParentCloseAngleBracket ;
grandParentCloseAngleBracket =
doc - > getParentCloseAngleBracket (
doc - > getTagStartPos ( parentCloseAngleBracket ) ) ;
grandparent = doc - > getLastElementName ( grandParentCloseAngleBracket ) ;
if ( insertSiblingPanel )
insertSiblingPanel - > update ( doc , parent , grandparent ) ;
if ( grandparent ! = lastGrandparent )
{
mustUpdate = true ;
lastGrandparent = grandparent ;
}
}
if ( mustUpdate )
manager . Update ( ) ;
}
void MyFrame : : OnInsertChild ( wxCommandEvent & event )
{
if ( ! insertChildPanel )
return ;
wxAuiPaneInfo info = manager . GetPane ( insertChildPanel ) ;
if ( ! info . IsOk ( ) )
{
return ;
}
if ( ! info . IsShown ( ) )
{
manager . GetPane ( insertChildPanel ) . Show ( true ) ;
manager . Update ( ) ;
}
insertChildPanel - > setEditFocus ( ) ;
}
void MyFrame : : OnInsertSibling ( wxCommandEvent & event )
{
if ( ! insertSiblingPanel )
return ;
wxAuiPaneInfo info = manager . GetPane ( insertSiblingPanel ) ;
if ( ! info . IsOk ( ) )
{
return ;
}
if ( ! info . IsShown ( ) )
{
manager . GetPane ( insertSiblingPanel ) . Show ( true ) ;
manager . Update ( ) ;
}
insertSiblingPanel - > setEditFocus ( ) ;
}
void MyFrame : : OnInsertEntity ( wxCommandEvent & event )
{
if ( ! insertEntityPanel )
return ;
wxAuiPaneInfo info = manager . GetPane ( insertEntityPanel ) ;
if ( ! info . IsOk ( ) )
{
return ;
}
if ( ! info . IsShown ( ) )
{
manager . GetPane ( insertEntityPanel ) . Show ( true ) ;
manager . Update ( ) ;
}
insertEntityPanel - > setEditFocus ( ) ;
}
void MyFrame : : OnInsertSymbol ( wxCommandEvent & event )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
2012-08-04 04:15:32 +02:00
wxSymbolPickerDialog dlg ( lastSymbol , wxEmptyString , properties . font , this ) ;
2009-11-06 18:06:12 +01:00
if ( dlg . ShowModal ( ) = = wxID_OK )
{
if ( dlg . HasSelection ( ) )
{
2012-08-04 04:15:32 +02:00
lastSymbol = dlg . GetSymbol ( ) ;
doc - > AddText ( lastSymbol ) ;
2009-11-06 18:06:12 +01:00
}
}
}
void MyFrame : : OnInsertTwin ( wxCommandEvent & event )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
wxString parent = doc - > getParent ( ) ;
if ( ! doc - > insertSibling ( parent , parent ) )
{
wxString msg ;
msg . Printf ( _T ( " Cannot insert twin '%s' " ) , parent . c_str ( ) ) ;
messagePane ( msg , CONST_STOP ) ;
}
doc - > setValidationRequired ( true ) ;
doc - > SetFocus ( ) ;
}
void MyFrame : : OnPasteNewDocument ( wxCommandEvent & event )
{
if ( ! wxTheClipboard - > Open ( ) )
{
messagePane ( _ ( " Cannot open clipboard " ) , CONST_STOP ) ;
return ;
}
if ( ! wxTheClipboard - > IsSupported ( wxDF_TEXT ) )
{
messagePane ( _ ( " Cannot paste as new document: no text on clipboard " ) , CONST_STOP ) ;
return ;
}
wxTextDataObject data ;
wxTheClipboard - > GetData ( data ) ;
wxString buffer = data . GetText ( ) ;
xmliseWideTextNode ( buffer ) ;
buffer . Prepend ( _T ( " <?xml version= \" 1.0 \" encoding= \" UTF-8 \" ?> \n <root> " ) ) ;
buffer . Append ( _T ( " </root> \n " ) ) ;
newDocument ( buffer ) ;
wxTheClipboard - > Close ( ) ;
}
void MyFrame : : OnDialogFind ( wxFindDialogEvent & event )
{
findAgain ( event . GetFindString ( ) , event . GetFlags ( ) ) ;
}
void MyFrame : : OnDialogReplace ( wxFindDialogEvent & event )
{
statusProgress ( wxEmptyString ) ;
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
2012-08-09 17:00:06 +02:00
if ( ! doc - > GetSelectedText ( ) . IsEmpty ( ) )
2009-11-06 18:06:12 +01:00
{
2012-08-09 17:00:06 +02:00
if ( findReplacePanel - > getRegex ( ) )
{
2013-11-12 17:30:07 +01:00
doc - > ReplaceTargetRE ( event . GetReplaceString ( ) ) ;
2012-08-09 17:00:06 +02:00
}
else
{
doc - > ReplaceTarget ( event . GetReplaceString ( ) ) ;
}
2009-11-06 18:06:12 +01:00
}
OnDialogFind ( event ) ;
}
void MyFrame : : OnDialogReplaceAll ( wxFindDialogEvent & event )
{
statusProgress ( wxEmptyString ) ;
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
int flags = 0 ;
if ( event . GetFlags ( ) & wxFR_WHOLEWORD )
flags | = wxSTC_FIND_WHOLEWORD ;
if ( event . GetFlags ( ) & wxFR_MATCHCASE )
flags | = wxSTC_FIND_MATCHCASE ;
if ( findReplacePanel - > getRegex ( ) )
flags | = wxSTC_FIND_REGEXP ;
doc - > SetTargetStart ( 0 ) ;
doc - > SetTargetEnd ( doc - > GetLength ( ) ) ;
doc - > SetSearchFlags ( flags ) ;
2012-08-11 02:33:17 +02:00
doc - > BeginUndoAction ( ) ;
2009-11-06 18:06:12 +01:00
int newLocation , replacementCount , regexWidth ;
newLocation = replacementCount = regexWidth = 0 ;
while ( ( newLocation = doc - > SearchInTarget ( event . GetFindString ( ) ) ) ! = - 1 )
{
if ( findReplacePanel - > getRegex ( ) )
{
regexWidth = doc - > ReplaceTargetRE ( event . GetReplaceString ( ) ) ;
doc - > SetTargetStart ( newLocation + regexWidth ) ;
}
else
{
doc - > ReplaceTarget ( event . GetReplaceString ( ) ) ;
doc - > SetTargetStart ( newLocation + event . GetReplaceString ( ) . size ( ) ) ;
}
doc - > SetTargetEnd ( doc - > GetLength ( ) ) ;
+ + replacementCount ;
}
2012-08-11 02:33:17 +02:00
doc - > EndUndoAction ( ) ;
wxString msg ;
2009-11-06 18:06:12 +01:00
msg . Printf (
ngettext ( L " %i replacement made " , L " %i replacements made " , replacementCount ) ,
replacementCount ) ;
statusProgress ( msg ) ;
}
void MyFrame : : OnPrintSetup ( wxCommandEvent & WXUNUSED ( event ) )
{
if ( ! htmlPrinting . get ( ) )
return ;
htmlPrinting - > PageSetup ( ) ;
}
void MyFrame : : OnPrintPreview ( wxCommandEvent & WXUNUSED ( event ) )
{
XmlDoc * doc ;
if ( ! htmlPrinting . get ( ) | | ( doc = getActiveDocument ( ) ) = = NULL )
return ;
wxString shortFileName , header ;
shortFileName = doc - > getShortFileName ( ) ;
if ( ! shortFileName . empty ( ) )
header = shortFileName + _T ( " " ) ;
header + = _T ( " (@PAGENUM@/@PAGESCNT@)<hr> " ) ;
htmlPrinting - > SetHeader (
header ,
wxPAGE_ALL ) ;
statusProgress ( _ ( " Preparing Print Preview... " ) ) ;
wxString htmlBuffer = getHtmlBuffer ( ) ;
statusProgress ( wxEmptyString ) ;
if ( ! ( htmlPrinting - > PreviewText ( htmlBuffer ) ) )
2013-11-12 17:30:07 +01:00
{ }
2009-11-06 18:06:12 +01:00
}
void MyFrame : : OnPrint ( wxCommandEvent & WXUNUSED ( event ) )
{
XmlDoc * doc ;
if ( ! htmlPrinting . get ( ) | | ( doc = getActiveDocument ( ) ) = = NULL )
return ;
wxString shortFileName , header ;
shortFileName = doc - > getShortFileName ( ) ;
if ( ! shortFileName . empty ( ) )
header = shortFileName + _T ( " " ) ;
header + = _T ( " (@PAGENUM@/@PAGESCNT@)<hr> " ) ;
htmlPrinting - > SetHeader (
header ,
wxPAGE_ALL ) ;
statusProgress ( _ ( " Preparing to print... " ) ) ;
wxString htmlBuffer = getHtmlBuffer ( ) ;
statusProgress ( wxEmptyString ) ;
if ( ! ( htmlPrinting - > PrintText ( htmlBuffer ) ) )
2013-11-12 17:30:07 +01:00
{ }
2009-11-06 18:06:12 +01:00
}
wxString MyFrame : : getHtmlBuffer ( )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return _T ( " <html><head></head><body></body></html> " ) ;
wxString buffer , htmlBuffer ;
buffer = doc - > GetText ( ) ;
size_t size = buffer . size ( ) ;
htmlBuffer . reserve ( size * 2 ) ;
htmlBuffer = _T ( " <html><body><p> " ) ;
bool startOfLine = true ;
for ( size_t i = 0 ; i < size ; + + i )
{
wchar_t c = buffer [ i ] ;
switch ( c )
{
case L ' ' :
htmlBuffer + = ( startOfLine ) ? _T ( " " ) : _T ( " " ) ;
break ;
case L ' \t ' :
htmlBuffer + = _T ( " " ) ;
break ;
case L ' < ' :
htmlBuffer + = _T ( " < " ) ;
startOfLine = false ;
break ;
case L ' > ' :
htmlBuffer + = _T ( " > " ) ;
startOfLine = false ;
break ;
case L ' \n ' :
htmlBuffer + = _T ( " <br> " ) ;
startOfLine = true ;
break ;
case L ' & ' :
htmlBuffer + _T ( " & " ) ;
startOfLine = false ;
break ;
default :
htmlBuffer + = c ;
startOfLine = false ;
break ;
}
}
htmlBuffer + = _T ( " </p></body></html> " ) ;
return htmlBuffer ;
}
void MyFrame : : OnFind ( wxCommandEvent & WXUNUSED ( event ) )
{
# ifdef NEWFINDREPLACE
manager . GetPane ( findReplacePanel ) . Caption ( _ ( " Find " ) ) ;
bool visible = manager . GetPane ( findReplacePanel ) . IsShown ( ) ;
if ( ! visible )
{
manager . GetPane ( findReplacePanel ) . Show ( ) ;
}
manager . Update ( ) ;
findReplacePanel - > refresh ( ) ;
findReplacePanel - > setReplaceVisible ( false ) ;
findReplacePanel - > focusOnFind ( ) ;
return ;
# endif
if ( findDialog . get ( ) )
{
findDialog = std : : auto_ptr < wxFindReplaceDialog > ( 0 ) ;
}
findDialog = ( std : : auto_ptr < wxFindReplaceDialog > ( new wxFindReplaceDialog (
this ,
& findData ,
_ ( " Find " ) ) ) ) ;
findDialog - > Show ( ) ;
}
void MyFrame : : OnImportMSWord ( wxCommandEvent & event )
{
# ifndef __WXMSW__
messagePane ( _ ( " This functionality requires Microsoft Windows " ) ) ;
return ;
# endif
std : : auto_ptr < wxFileDialog > fd ( new wxFileDialog (
this ,
_ ( " Import Microsoft Word Document " ) ,
_T ( " " ) ,
_T ( " " ) ,
_T ( " Microsoft Word (*.doc)|*.doc " ) ,
2012-08-09 13:22:21 +02:00
# if wxCHECK_VERSION(2,9,0)
2012-03-14 16:08:20 +01:00
wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR
# else
2009-11-06 18:06:12 +01:00
wxOPEN | wxFILE_MUST_EXIST | wxCHANGE_DIR
2012-03-14 16:08:20 +01:00
# endif
) ) ;
2009-11-06 18:06:12 +01:00
if ( fd - > ShowModal ( ) = = wxID_CANCEL )
return ;
wxString path = fd - > GetPath ( ) ;
if ( path = = _T ( " " ) )
return ;
importMSWord ( path ) ;
}
void MyFrame : : OnExport ( wxCommandEvent & event )
{
statusProgress ( wxEmptyString ) ;
closePane ( ) ;
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
wxString testDir = applicationDir + wxFileName : : GetPathSeparator ( ) + _T ( " daisy " ) ;
bool downloadLink = ! wxDirExists ( testDir ) ;
std : : auto_ptr < ExportDialog > ed ( new ExportDialog (
this ,
exportStylesheet ,
exportFolder ,
exportQuiet ,
2010-04-26 00:24:53 +02:00
exportSuppressOptional ,
exportHtml ,
exportEpub ,
exportRtf ,
exportDoc ,
exportFullDaisy ,
2009-11-06 18:06:12 +01:00
exportMp3Album ,
downloadLink ) ) ;
int ret = ed - > ShowModal ( ) ;
if ( ret ! = wxID_OK )
return ;
exportStylesheet = ed - > getUrlString ( ) ;
exportFolder = ed - > getFolderString ( ) ;
exportQuiet = ed - > getQuiet ( ) ;
exportMp3Album = ed - > getMp3Album ( ) ;
2010-04-26 00:24:53 +02:00
exportSuppressOptional = ed - > getSuppressOptional ( ) ;
exportHtml = ed - > getHtml ( ) ;
exportEpub = ed - > getEpub ( ) ;
exportRtf = ed - > getRtf ( ) ;
exportDoc = ed - > getDoc ( ) ;
exportFullDaisy = ed - > getFullDaisy ( ) ;
2009-11-06 18:06:12 +01:00
std : : string rawBufferUtf8 ;
getRawText ( doc , rawBufferUtf8 ) ;
if ( ! XmlEncodingHandler : : setUtf8 ( rawBufferUtf8 ) )
{
encodingMessage ( ) ;
return ;
}
WrapTempFileName tempFileName ( doc - > getFullFileName ( ) ) ;
ofstream rawBufferStream ( tempFileName . name ( ) . c_str ( ) ) ;
if ( ! rawBufferStream )
return ;
rawBufferStream < < rawBufferUtf8 ;
rawBufferStream . close ( ) ;
wxString tempFile = tempFileName . wideName ( ) ;
WrapDaisy wd ( this , daisyDir , doc - > getFullFileName ( ) ) ;
2010-04-26 00:24:53 +02:00
if ( ! wd . run (
tempFile ,
exportStylesheet ,
exportFolder ,
exportQuiet ,
exportSuppressOptional ,
exportEpub ,
exportRtf ,
exportDoc ,
exportFullDaisy ,
exportMp3Album ) )
2009-11-06 18:06:12 +01:00
{
messagePane ( _ ( " [b]DAISY export stopped[/b]: " ) + wd . getLastError ( ) , CONST_STOP ) ;
return ;
}
messagePane ( _ ( " DAISY export completed. Output files are stored in: [b] " ) + exportFolder + _T ( " [/b]. " ) , CONST_INFO ) ;
}
void MyFrame : : importMSWord ( const wxString & path )
{
# ifndef __WXMSW__
messagePane ( _ ( " This functionality requires Microsoft Windows " ) ) ;
return ;
# endif
WrapTempFileName tempFileName ( _T ( " " ) ) , swapFileName ( _T ( " " ) ) ;
wxString completeSwapFileName = swapFileName . wideName ( ) + _T ( " .doc " ) ;
if ( ! wxCopyFile ( path , completeSwapFileName , true ) )
{
wxString message ;
message . Printf ( _ ( " Cannot open [b]%s[/b] for import " ) , path . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
return ;
}
wxString cmd = binDir +
_T ( " doc2xml.exe \" " ) +
completeSwapFileName + _T ( " \" \" " ) +
tempFileName . wideName ( ) + _T ( " \" " ) ;
statusProgress ( _ ( " Import in progress... " ) ) ;
int result = wxExecute ( cmd , wxEXEC_SYNC ) ;
wxRemoveFile ( completeSwapFileName ) ; // necessary because .doc extension added
statusProgress ( wxEmptyString ) ;
wxString message ;
wxString versionMessage (
_ ( " (lossless conversion requires version 2003 or later) " ) ) ;
switch ( result )
{
case 0 :
break ;
case 1 :
messagePane ( _ ( " Cannot start Microsoft Word " ) , CONST_STOP ) ;
return ;
case 2 :
messagePane (
_ ( " A more recent version of Microsoft Word is required " ) , CONST_STOP ) ;
return ;
case 3 :
message . Printf ( _T ( " Microsoft Word cannot open [b]%s[/b] " ) , path . c_str ( ) ) ;
messagePane ( message + path , CONST_STOP ) ;
return ;
case 4 :
message . Printf ( _ ( " Microsoft Word cannot save [b]%s[/b] as XML " ) , path . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
return ;
case 5 :
messagePane (
_ ( " Microsoft Word cannot save this document as WordprocessingML " ) +
versionMessage ,
CONST_INFO ) ;
break ;
default :
break ;
}
statusProgress ( _ ( " Opening imported file... " ) ) ;
std : : string buffer ;
wxString displayBuffer ;
if ( result ! = 5 ) // Word 2003 or later
{
std : : auto_ptr < WrapLibxml > prettyPrinter ( new WrapLibxml ( libxmlNetAccess ) ) ;
prettyPrinter - > parse ( tempFileName . name ( ) , true ) ;
buffer = prettyPrinter - > getOutput ( ) ;
displayBuffer = wxString ( buffer . c_str ( ) , wxConvUTF8 , buffer . size ( ) ) ;
}
else // earlier versions
{
if ( ! ReadFile : : run ( tempFileName . name ( ) , buffer ) )
{
statusProgress ( wxEmptyString ) ;
messagePane ( _ ( " Cannot open imported file " ) , CONST_STOP ) ;
return ;
}
displayBuffer = wxString ( buffer . c_str ( ) , wxConvUTF8 , buffer . size ( ) ) ;
displayBuffer . Remove ( 0 , 1 ) ; // remove byte order mark
xmliseWideTextNode ( displayBuffer ) ;
displayBuffer . Prepend (
_T ( " <?xml version= \" 1.0 \" encoding= \" UTF-8 \" ?> \n <root> " ) ) ;
displayBuffer . Append ( _T ( " </root> \n " ) ) ;
}
newDocument ( displayBuffer , tempFileName . wideName ( ) ) ;
statusProgress ( wxEmptyString ) ;
}
void MyFrame : : OnExportMSWord ( wxCommandEvent & event )
{
# ifndef __WXMSW__
messagePane ( _ ( " This functionality requires Microsoft Windows " ) ) ;
return ;
# endif
statusProgress ( wxEmptyString ) ;
// fetch document contents
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
WrapTempFileName wtfn ( _T ( " " ) ) ;
wxString sourceFileName = doc - > getFullFileName ( ) ;
if ( sourceFileName . empty ( ) )
{
sourceFileName = wtfn . wideName ( ) ;
std : : fstream ofs ( wtfn . name ( ) . c_str ( ) ) ;
if ( ! ofs )
return ;
std : : string utf8Buffer ;
getRawText ( doc , utf8Buffer ) ;
ofs < < utf8Buffer ;
ofs . close ( ) ;
}
else if ( doc - > GetModify ( ) ) //CanUndo())
{
modifiedMessage ( ) ;
return ;
}
std : : auto_ptr < wxFileDialog > fd ( new wxFileDialog (
this ,
_ ( " Export Microsoft Word Document " ) ,
_T ( " " ) ,
_T ( " " ) ,
_T ( " Microsoft Word (*.doc)|*.doc " ) ,
2012-08-09 13:22:21 +02:00
# if wxCHECK_VERSION(2,9,0)
2012-03-14 16:08:20 +01:00
wxFD_SAVE | wxFD_OVERWRITE_PROMPT ) ) ;
# else
2009-11-06 18:06:12 +01:00
wxSAVE | wxOVERWRITE_PROMPT ) ) ;
2012-03-14 16:08:20 +01:00
# endif
2009-11-06 18:06:12 +01:00
fd - > ShowModal ( ) ;
wxString path = fd - > GetPath ( ) ;
if ( path = = _T ( " " ) )
return ;
wxString cmd = binDir +
_T ( " xml2doc.exe -v \" " ) +
sourceFileName + _T ( " \" \" " ) +
path + _T ( " \" " ) ;
statusProgress ( _ ( " Export in progress... " ) ) ;
int result = wxExecute ( cmd , wxEXEC_SYNC ) ;
statusProgress ( wxEmptyString ) ;
wxString message ;
switch ( result )
{
case 1 :
messagePane ( _ ( " Cannot start Microsoft Word " ) , CONST_STOP ) ;
return ;
case 2 :
messagePane (
_ ( " A more recent version of Microsoft Word is required " ) , CONST_STOP ) ;
return ;
case 3 :
message . Printf ( _ ( " Microsoft Word cannot save %s " ) , path . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
return ;
case 0 :
break ;
default :
break ;
}
}
void MyFrame : : OnBrowser ( wxCommandEvent & WXUNUSED ( event ) )
{
statusProgress ( wxEmptyString ) ;
// fetch document contents
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
wxString sourceFileName = doc - > getFullFileName ( ) ;
WrapTempFileName wtfn ( sourceFileName , _T ( " .html " ) ) ;
if ( sourceFileName . empty ( ) | | doc - > GetModify ( ) )
{
sourceFileName = wtfn . wideName ( ) ;
std : : ofstream ofs ( ( const char * ) wtfn . name ( ) . c_str ( ) ) ;
if ( ! ofs )
{
messagePane ( _ ( " Cannot save temporary file " ) , CONST_STOP ) ;
return ;
}
std : : string utf8Buffer ;
getRawText ( doc , utf8Buffer ) ;
ofs < < utf8Buffer ;
ofs . close ( ) ;
// keep files until application closes
tempFileVector . push_back ( sourceFileName ) ;
tempFileVector . push_back ( wtfn . originalWideName ( ) ) ;
wtfn . setKeepFiles ( true ) ;
}
2012-08-11 09:33:01 +02:00
wxLaunchDefaultBrowser ( sourceFileName ) ;
2009-11-06 18:06:12 +01:00
}
void MyFrame : : OnHelp ( wxCommandEvent & event )
{
# ifdef __WXMSW__
wxString cmd = _T ( " hh.exe \" " ) + helpDir + _T ( " xmlcopyeditor.chm \" " ) ;
wxExecute ( cmd ) ;
# else
wxString helpFileName = helpDir + _T ( " xmlcopyeditor.hhp " ) ;
helpController - > AddBook ( wxFileName ( helpFileName ) ) ;
helpController - > DisplayContents ( ) ;
# endif
}
void MyFrame : : OnSplitTab ( wxCommandEvent & event )
{
/*
int id = event . GetId ( ) ;
XmlDoc * doc = getActiveDocument ( ) ;
if ( ! doc )
return ;
wxString fileName = doc - > getFullFileName ( ) ;
// mainBook->GetSelection() is currently unreliable, so fetch by title
int pageCount = mainBook - > GetPageCount ( ) ;
XmlDoc * currentDoc ;
int currentSelection = - 1 ;
for ( int i = 0 ; i < pageCount ; + + i )
{
currentDoc = ( XmlDoc * ) mainBook - > GetPage ( i ) ;
if ( ! currentDoc )
break ;
if ( currentDoc - > getFullFileName ( ) = = fileName )
{
currentSelection = i ;
}
}
if ( currentSelection = = - 1 )
return ;
*/
int currentSelection , direction ;
currentSelection = mainBook - > GetSelection ( ) ;
direction = wxAUI_NB_RIGHT ;
/*
switch ( id )
{
ID_SPLIT_TAB_TOP :
direction = wxAUI_NB_TOP ;
break ;
ID_SPLIT_TAB_RIGHT :
direction = wxAUI_NB_RIGHT ;
break ;
ID_SPLIT_TAB_BOTTOM :
direction = wxAUI_NB_BOTTOM ;
break ;
ID_SPLIT_TAB_LEFT :
direction = wxAUI_NB_LEFT ;
break ;
default :
direction = wxAUI_NB_RIGHT ;
break ;
}
*/
mainBook - > Split ( currentSelection , direction ) ;
}
void MyFrame : : OnColorScheme ( wxCommandEvent & event )
{
int id = event . GetId ( ) ;
switch ( id )
{
case ID_COLOR_SCHEME_DEFAULT :
properties . colorScheme = COLOR_SCHEME_DEFAULT ;
break ;
case ID_COLOR_SCHEME_DEFAULT_BACKGROUND :
properties . colorScheme = COLOR_SCHEME_DEFAULT_BACKGROUND ;
break ;
case ID_COLOR_SCHEME_REDUCED_GLARE :
properties . colorScheme = COLOR_SCHEME_REDUCED_GLARE ;
break ;
case ID_COLOR_SCHEME_NONE :
properties . colorScheme = COLOR_SCHEME_NONE ;
break ;
default :
return ;
}
colorSchemeMenu - > Check ( id , true ) ;
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
properties . zoom = doc - > GetZoom ( ) ; // ensure temp changes to font size are kept
applyEditorProperties ( false ) ;
doc - > SetFocus ( ) ;
}
void MyFrame : : OnFontSmaller ( wxCommandEvent & event )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
doc - > ZoomOut ( ) ;
properties . zoom = doc - > GetZoom ( ) ;
applyEditorProperties ( true ) ;
doc - > SetFocus ( ) ;
}
void MyFrame : : OnFontMedium ( wxCommandEvent & event )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
doc - > SetZoom ( 0 ) ;
properties . zoom = doc - > GetZoom ( ) ;
applyEditorProperties ( true ) ;
doc - > SetFocus ( ) ;
}
void MyFrame : : OnFontLarger ( wxCommandEvent & event )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
doc - > ZoomIn ( ) ;
properties . zoom = doc - > GetZoom ( ) ;
applyEditorProperties ( true ) ;
doc - > SetFocus ( ) ;
}
void MyFrame : : OnOptions ( wxCommandEvent & WXUNUSED ( event ) )
{
// ensure font size does not change after
XmlDoc * doc = getActiveDocument ( ) ;
if ( doc )
{
properties . zoom = doc - > GetZoom ( ) ;
}
wxString title
# ifdef __WXMSW__
( _ ( " Options " ) ) ;
# else
( _ ( " Preferences " ) ) ;
# endif
std : : auto_ptr < MyPropertySheet > mpsd ( new MyPropertySheet (
this ,
properties ,
applicationDir ,
rememberOpenTabs ,
libxmlNetAccess ,
singleInstanceCheck ,
saveBom ,
unlimitedUndo ,
restoreLayout ,
expandInternalEntities ,
showFullPathOnFrame ,
lang ,
2012-08-20 14:12:32 +02:00
wxGetApp ( ) . getAvailableTranslations ( ) ,
2009-11-06 18:06:12 +01:00
wxID_ANY ,
title ) ) ;
if ( mpsd - > ShowModal ( ) = = wxID_OK )
{
applyEditorProperties ( ) ;
updatePaths ( ) ;
}
if ( doc )
doc - > SetFocus ( ) ;
}
void MyFrame : : OnHistoryFile ( wxCommandEvent & event )
{
wxString f ( history . GetHistoryFile ( event . GetId ( ) - wxID_FILE1 ) ) ;
if ( ! f . empty ( ) )
openFile ( f ) ;
}
void MyFrame : : OnGoto ( wxCommandEvent & WXUNUSED ( event ) )
{
statusProgress ( wxEmptyString ) ;
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
wxTextEntryDialog * dlg = new wxTextEntryDialog (
this ,
_ ( " Enter line number: " ) ,
_ ( " Go To " ) ) ;
int ret = dlg - > ShowModal ( ) ;
if ( ret = = wxID_CANCEL )
return ;
wxString val = dlg - > GetValue ( ) ;
long line ;
if ( ! val . ToLong ( & line ) | | line < 1 )
{
wxString msg ;
msg . Printf ( _ ( " '%s' is not a valid line number " ) , val . c_str ( ) ) ;
messagePane ( msg , CONST_STOP ) ;
return ;
}
- - line ;
doc - > GotoLine ( ( int ) line ) ;
doc - > SetFocus ( ) ;
}
void MyFrame : : OnFindAgain ( wxCommandEvent & event )
{
//findAgain(findData.GetFindString(), findData.GetFlags());
findReplacePanel - > OnFindNext ( event ) ;
}
void MyFrame : : OnCommand ( wxCommandEvent & WXUNUSED ( event ) )
{
bool visible = manager . GetPane ( commandPanel ) . IsShown ( ) ;
if ( ! visible )
{
manager . GetPane ( commandPanel ) . Show ( ) ;
}
manager . Update ( ) ;
commandPanel - > focusOnCommand ( ) ;
}
void MyFrame : : OnFindReplace ( wxCommandEvent & WXUNUSED ( event ) )
{
# ifdef NEWFINDREPLACE
manager . GetPane ( findReplacePanel ) . Caption ( _ ( " Replace " ) ) ;
bool visible = manager . GetPane ( findReplacePanel ) . IsShown ( ) ;
if ( ! visible )
{
manager . GetPane ( findReplacePanel ) . Show ( ) ;
}
manager . Update ( ) ;
findReplacePanel - > refresh ( ) ;
findReplacePanel - > setReplaceVisible ( true ) ;
findReplacePanel - > focusOnFind ( ) ;
return ;
# endif
if ( findDialog . get ( ) )
{
findDialog = std : : auto_ptr < wxFindReplaceDialog > ( 0 ) ;
}
findDialog = std : : auto_ptr < wxFindReplaceDialog > ( new wxFindReplaceDialog (
this ,
& findData ,
_ ( " Find and Replace " ) ,
wxFR_REPLACEDIALOG ) ) ;
findDialog - > Show ( ) ;
}
void MyFrame : : OnGlobalReplace ( wxCommandEvent & event )
{
2013-11-12 17:30:07 +01:00
if ( getActiveDocument ( ) = = NULL )
2009-11-06 18:06:12 +01:00
return ;
size_t flags = findData . GetFlags ( ) ;
std : : auto_ptr < GlobalReplaceDialog > grd ( new GlobalReplaceDialog (
this ,
findData . GetFindString ( ) ,
findData . GetReplaceString ( ) ,
flags & wxFR_MATCHCASE ,
globalReplaceAllDocuments ,
findRegex ) ) ;
int res = grd - > ShowModal ( ) ;
flags = 0 ;
flags | = wxFR_DOWN ;
if ( grd - > getMatchCase ( ) )
flags | = wxFR_MATCHCASE ;
findRegex = grd - > getRegex ( ) ;
globalReplaceAllDocuments = grd - > getAllDocuments ( ) ;
findData . SetFindString ( grd - > getFindString ( ) ) ;
findData . SetReplaceString ( grd - > getReplaceString ( ) ) ;
findData . SetFlags ( flags ) ;
findReplacePanel - > setRegex ( findRegex ) ;
findReplacePanel - > setMatchCase ( flags & wxFR_MATCHCASE ) ;
findReplacePanel - > refresh ( ) ;
if ( res ! = wxID_OK )
{
return ;
}
int globalMatchCount , pageCount ;
globalMatchCount = 0 ;
pageCount = mainBook - > GetPageCount ( ) ;
XmlDoc * currentDoc = getActiveDocument ( ) ;
if ( ! currentDoc )
return ;
for ( int i = 0 ; i < pageCount ; + + i )
{
std : : string bufferUtf8 ;
if ( ! globalReplaceAllDocuments )
{
getRawText ( currentDoc , bufferUtf8 ) ;
}
else
{
currentDoc = ( XmlDoc * ) mainBook - > GetPage ( i ) ;
if ( ! currentDoc )
return ;
getRawText ( currentDoc , bufferUtf8 ) ;
}
size_t flags = findData . GetFlags ( ) ;
if ( ! findRegex )
{
std : : string findUtf8 , replaceUtf8 ;
findUtf8 = findData . GetFindString ( ) . mb_str ( wxConvUTF8 ) ;
replaceUtf8 = findData . GetReplaceString ( ) . mb_str ( wxConvUTF8 ) ;
globalMatchCount + = Replace : : run (
bufferUtf8 ,
findUtf8 ,
replaceUtf8 ,
flags & wxFR_MATCHCASE ) ;
currentDoc - > SetTextRaw ( bufferUtf8 . c_str ( ) ) ;
currentDoc - > setValidationRequired ( true ) ;
}
else
{
try
{
std : : auto_ptr < WrapRegex > wr ( new WrapRegex (
( const char * ) findData . GetFindString ( ) . mb_str ( wxConvUTF8 ) ,
flags & wxFR_MATCHCASE ,
( const char * ) findData . GetReplaceString ( ) . mb_str ( wxConvUTF8 ) ) ) ;
int matchCount ;
std : : string outputBuffer = wr - > replaceGlobal ( bufferUtf8 , & matchCount ) ;
globalMatchCount + = matchCount ;
currentDoc - > SetTextRaw ( outputBuffer . c_str ( ) ) ;
currentDoc - > setValidationRequired ( true ) ;
}
catch ( std : : exception & e )
{
wxString wideError = wxString ( e . what ( ) , wxConvUTF8 , strlen ( e . what ( ) ) ) ;
messagePane ( _ ( " Cannot replace: " ) + wideError , CONST_STOP ) ;
return ;
}
}
if ( ! globalReplaceAllDocuments )
break ;
}
wxString msg ;
msg . Printf (
ngettext ( L " %i replacement made " , L " %i replacements made " , globalMatchCount ) ,
globalMatchCount ) ;
statusProgress ( msg ) ;
}
void MyFrame : : OnFrameClose ( wxCloseEvent & event )
{
wxCommandEvent e ;
OnCloseAll ( e ) ;
if ( mainBook - > GetPageCount ( ) )
{
event . Veto ( ) ;
return ;
}
event . Skip ( ) ;
}
void MyFrame : : OnNew ( wxCommandEvent & WXUNUSED ( event ) )
{
wxString defaultSelection , typeSelection , templateFile ;
defaultSelection = _ ( " XML document (*.xml) " ) ;
wxArrayString templateArray ;
2013-12-13 16:51:13 +01:00
if ( wxDirExists ( templateDir ) )
2009-11-06 18:06:12 +01:00
{
wxString templateMask , name , extension , entry ;
2013-10-26 15:21:47 +02:00
wxFileName fn ;
2009-11-06 18:06:12 +01:00
templateMask = templateDir + wxFileName : : GetPathSeparator ( ) + _T ( " *.* " ) ;
templateFile = wxFindFirstFile ( templateMask , wxFILE ) ;
2013-10-26 15:21:47 +02:00
while ( ! templateFile . empty ( ) )
2009-11-06 18:06:12 +01:00
{
2013-10-26 15:21:47 +02:00
templateFile . Replace ( _T ( " _ " ) , _T ( " " ) ) ;
2009-11-06 18:06:12 +01:00
fn . Assign ( templateFile ) ;
name = fn . GetName ( ) ;
extension = fn . GetExt ( ) ;
entry . Printf ( _T ( " %s (*.%s) " ) , name . c_str ( ) , extension . c_str ( ) ) ;
templateArray . Add ( entry ) ;
2013-10-26 15:21:47 +02:00
templateFile = wxFindNextFile ( ) ;
2009-11-06 18:06:12 +01:00
}
templateArray . Sort ( ) ;
templateArray . Insert ( defaultSelection , 0 ) ;
const int arraySize = templateArray . GetCount ( ) ;
wxString choiceArray [ arraySize + 1 ] ;
for ( int i = 0 ; i < arraySize ; + + i )
* ( choiceArray + i ) = templateArray . Item ( i ) ;
wxSingleChoiceDialog scd (
this , _ ( " Choose a document type: " ) , _ ( " New Document " ) , arraySize , choiceArray ) ;
if ( scd . ShowModal ( ) = = wxID_CANCEL )
{
XmlDoc * doc = getActiveDocument ( ) ;
if ( doc )
doc - > SetFocus ( ) ;
return ;
}
typeSelection = scd . GetStringSelection ( ) ;
}
if ( typeSelection = = defaultSelection )
{
wxString emptyString ( _T ( " " ) ) ;
newDocument ( emptyString ) ;
return ;
}
typeSelection . Replace ( _T ( " (* " ) , wxEmptyString ) ;
typeSelection . Replace ( _T ( " ) " ) , wxEmptyString ) ;
2009-12-01 14:33:22 +01:00
typeSelection . Replace ( _T ( " " ) , _T ( " _ " ) ) ;
2009-11-06 18:06:12 +01:00
templateFile = templateDir + typeSelection ;
std : : string templateFileLocal , buffer ;
templateFileLocal = templateFile . mb_str ( wxConvLocal ) ;
ReadFile : : run ( templateFileLocal , buffer ) ;
wxString documentContents = wxString ( buffer . c_str ( ) , wxConvUTF8 , buffer . size ( ) ) ;
2013-10-16 19:28:39 +02:00
newDocument ( buffer , templateFile ) ;
2009-11-06 18:06:12 +01:00
}
void MyFrame : : newDocument ( const wxString & s , const wxString & path , bool canSave )
{
std : : string bufferUtf8 = ( const char * ) s . mb_str ( wxConvUTF8 ) ;
2013-10-16 19:28:39 +02:00
newDocument ( bufferUtf8 , path , canSave ) ;
2009-11-06 18:06:12 +01:00
}
2013-10-16 19:28:39 +02:00
void MyFrame : : newDocument ( const std : : string & s , const wxString & path , bool canSave )
2009-11-06 18:06:12 +01:00
{
XmlDoc * doc ;
wxString documentLabel ;
documentLabel . Printf ( _ ( " Document%i " ) , documentCount + + ) ;
2013-10-16 19:28:39 +02:00
wxString auxPath = getAuxPath ( path ) ;
2009-11-06 18:06:12 +01:00
2013-10-29 11:52:22 +01:00
{
wxWindowUpdateLocker noupdate ( this ) ;
doc = ( s . empty ( ) ) ?
new XmlDoc (
mainBook ,
properties ,
& protectTags ,
visibilityState ,
FILE_TYPE_XML ,
wxID_ANY ,
NULL , 0 // new: NULL pointer leads to default document
)
: new XmlDoc (
mainBook ,
properties ,
& protectTags ,
visibilityState ,
FILE_TYPE_XML ,
wxID_ANY ,
s . c_str ( ) , // modified
s . size ( ) , // new
path ,
auxPath ) ;
mainBook - > AddPage ( ( wxWindow * ) doc , documentLabel ) ;
}
2009-11-06 18:06:12 +01:00
2012-08-18 17:41:27 +02:00
mainBook - > Layout ( ) ;
2009-11-06 18:06:12 +01:00
if ( properties . completion )
doc - > updatePromptMaps ( ) ;
doc - > setShortFileName ( documentLabel ) ;
doc - > SetFocus ( ) ;
manager . Update ( ) ;
locationPanel - > update ( doc , wxEmptyString ) ;
insertChildPanel - > update ( doc , wxEmptyString ) ;
insertSiblingPanel - > update ( doc , wxEmptyString ) ;
insertEntityPanel - > update ( doc ) ;
if ( properties . validateAsYouType )
doc - > backgroundValidate ( ) ;
}
void MyFrame : : OnOpen ( wxCommandEvent & event )
{
bool largeFile ;
largeFile = ( event . GetId ( ) = = ID_OPEN_LARGE_FILE ) ;
wxString defaultFile , defaultDir ;
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) ! = NULL )
{
defaultFile = doc - > getFullFileName ( ) ;
if ( ! defaultFile . empty ( ) )
{
wxFileName fn ( defaultFile ) ;
defaultDir = fn . GetPath ( ) ;
}
}
2013-10-29 12:01:45 +01:00
wxFileDialog fd (
2009-11-06 18:06:12 +01:00
this ,
( largeFile ) ? _ ( " Open Large Document " ) : _ ( " Open " ) ,
defaultDir ,
wxEmptyString ,
FILE_FILTER ,
2012-08-09 13:22:21 +02:00
# if wxCHECK_VERSION(2,9,0)
2012-03-14 16:08:20 +01:00
wxFD_OPEN | wxFD_MULTIPLE | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR
# else
2009-11-06 18:06:12 +01:00
wxOPEN | wxMULTIPLE | wxFILE_MUST_EXIST | wxCHANGE_DIR
2012-03-14 16:08:20 +01:00
# endif
) ;
2009-11-06 18:06:12 +01:00
2013-10-29 12:01:45 +01:00
if ( fd . ShowModal ( ) = = wxID_CANCEL )
2009-11-06 18:06:12 +01:00
return ;
wxArrayString paths ;
2013-10-29 12:01:45 +01:00
fd . GetPaths ( paths ) ;
2009-11-06 18:06:12 +01:00
size_t count = paths . Count ( ) ;
if ( ! count )
return ;
for ( size_t i = 0 ; i < count ; + + i )
if ( ! openFile ( paths [ i ] , largeFile ) )
break ;
}
bool MyFrame : : openFile ( wxString & fileName , bool largeFile )
{
# ifndef __WXMSW__
// truncate string up to file:/ portion added by GNOME
wxString filePrefix = _T ( " file: " ) ;
int index = fileName . Find ( filePrefix . c_str ( ) ) ;
if ( index ! = - 1 )
{
fileName = fileName . Mid ( ( size_t ) index + filePrefix . Length ( ) ) ;
}
# endif
if ( ! wxFileName : : FileExists ( fileName ) )
{
wxString message ;
message . Printf ( _ ( " Cannot open %s. " ) , fileName . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
return false ;
}
if ( openFileSet . count ( fileName ) )
{
wxString message ;
message . Printf ( _ ( " %s is already open " ) , fileName . c_str ( ) ) ;
statusProgress ( message ) ;
activateTab ( fileName ) ;
return false ;
}
wxString directory , name , extension ;
wxFileName : : SplitPath ( fileName , NULL , & directory , & name , & extension ) ;
if ( ! extension . empty ( ) )
{
name + = _T ( " . " ) ;
name + = extension ;
}
wxString wideError ;
pair < int , int > posPair ;
XmlDoc * doc ;
int type = getFileType ( fileName ) ;
2013-10-16 19:28:39 +02:00
wxString auxPath = getAuxPath ( fileName ) ;
2009-11-06 18:06:12 +01:00
2012-08-11 12:47:16 +02:00
char * docBuffer = NULL ;
2009-11-06 18:06:12 +01:00
size_t docBufferLen = 0 ;
bool fileEmpty = false ;
statusProgress ( _T ( " Opening file... " ) ) ;
2013-10-29 11:52:22 +01:00
BinaryFile binaryfile ( fileName ) ;
if ( ! binaryfile . getData ( ) )
2009-11-06 18:06:12 +01:00
{
2009-12-01 14:33:22 +01:00
wxString message ;
message . Printf ( _ ( " Cannot open %s " ) , fileName . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
statusProgress ( wxEmptyString ) ;
return false ;
2009-11-06 18:06:12 +01:00
}
2009-12-01 14:33:22 +01:00
/*
2013-10-29 11:52:22 +01:00
//wxMemoryMappedFile memorymap (
fileName ,
true , // readOnly
true // fread
) ;
2009-12-01 14:33:22 +01:00
*/
2009-11-06 18:06:12 +01:00
/*
catch ( wxMemoryMappedFileEmptyException & )
{
fileEmpty = true ;
}
*/
bool isUtf8 = false ;
if ( ! fileEmpty )
{
2013-10-29 11:52:22 +01:00
docBuffer = ( char * ) binaryfile . getData ( ) ; //memorymap->GetStream();
docBufferLen = binaryfile . getDataLen ( ) ; //memorymap->GetMapSize();
2009-11-06 18:06:12 +01:00
}
else
{
docBuffer = NULL ;
docBufferLen = 0 ;
isUtf8 = true ;
}
statusProgress ( wxEmptyString ) ;
2012-08-27 14:25:08 +02:00
wxCharBuffer iconvBuffer ;
2009-11-06 18:06:12 +01:00
size_t iconvBufferLen = 0 ;
char * finalBuffer ;
size_t finalBufferLen ;
2013-10-25 13:23:34 +02:00
std : : string encoding ;
2013-10-29 11:52:22 +01:00
if ( largeFile )
{
encoding = " UTF-8 " ;
}
else if ( docBufferLen > = 4 & & // UTF-32 BE
2013-10-25 13:23:34 +02:00
( unsigned char ) docBuffer [ 0 ] = = 0x00 & &
( unsigned char ) docBuffer [ 1 ] = = 0x00 & &
( unsigned char ) docBuffer [ 2 ] = = 0xFE & &
( unsigned char ) docBuffer [ 3 ] = = 0xFF )
{
docBuffer + = 4 ;
docBufferLen - = 4 ;
encoding = " UTF-32BE " ;
}
else if ( docBufferLen > = 4 & & // UTF-32 LE
( unsigned char ) docBuffer [ 0 ] = = 0xFF & &
( unsigned char ) docBuffer [ 1 ] = = 0xFE & &
( unsigned char ) docBuffer [ 2 ] = = 0x00 & &
( unsigned char ) docBuffer [ 3 ] = = 0x00 )
{
docBuffer + = 4 ;
docBufferLen - = 4 ;
encoding = " UTF-32LE " ;
}
else if ( docBufferLen > = 2 & & //UTF-16 BE
( unsigned char ) docBuffer [ 0 ] = = 0xFE & &
( unsigned char ) docBuffer [ 1 ] = = 0xFF )
{
docBuffer + = 2 ;
docBufferLen - = 2 ;
encoding = " UTF-16BE " ;
}
else if ( docBufferLen > = 2 & & //UTF-16 LE
( unsigned char ) docBuffer [ 0 ] = = 0xFF & &
( unsigned char ) docBuffer [ 1 ] = = 0xFE )
{
docBuffer + = 2 ;
docBufferLen - = 2 ;
encoding = " UTF-16LE " ;
}
else if ( docBufferLen > = 3 & & //UTF-8
( unsigned char ) docBuffer [ 0 ] = = 0xEF & &
( unsigned char ) docBuffer [ 1 ] = = 0xBB & &
( unsigned char ) docBuffer [ 2 ] = = 0xBF )
2009-11-06 18:06:12 +01:00
{
docBuffer + = 3 ;
docBufferLen - = 3 ;
2013-10-25 13:23:34 +02:00
encoding = " UTF-8 " ;
2009-11-06 18:06:12 +01:00
}
2013-10-25 13:23:34 +02:00
if ( encoding . empty ( ) )
2009-11-06 18:06:12 +01:00
{
XmlEncodingSpy es ;
es . parse ( docBuffer , docBufferLen ) ;
encoding = es . getEncoding ( ) ;
2013-10-25 13:23:34 +02:00
if ( encoding . empty ( ) ) // Expat couldn't parse file (e.g. UTF-32)
encoding = getApproximateEncoding ( docBuffer , docBufferLen ) ;
2009-11-06 18:06:12 +01:00
}
// convert buffer if not UTF-8
2013-10-25 13:23:34 +02:00
if ( encoding = = " UTF-8 " | |
encoding = = " utf-8 " | |
encoding = = " US-ASCII " | |
encoding = = " us-ascii " | | // US-ASCII is a subset of UTF-8
docBufferLen = = 0 )
2009-11-06 18:06:12 +01:00
{
finalBuffer = docBuffer ;
finalBufferLen = docBufferLen ;
2013-10-25 13:23:34 +02:00
isUtf8 = true ;
2009-11-06 18:06:12 +01:00
}
else
{
wxString wideEncoding = wxString (
encoding . c_str ( ) ,
wxConvLocal ,
encoding . size ( ) ) ;
iconv_t cd = iconv_open ( " UTF-8 " , encoding . c_str ( ) ) ;
if ( cd = = ( iconv_t ) - 1 )
{
wxString message ;
message . Printf ( _ ( " Cannot open %s: unknown encoding %s " ) ,
fileName . c_str ( ) ,
wideEncoding . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
return false ;
} ;
int iconvLenMultiplier = 4 ; // worst case scenario
if ( encoding = = " ISO-8859-1 " | |
encoding = = " UTF-16 " | |
encoding = = " UTF-16BE " | |
encoding = = " UTF-16LE " )
{
iconvLenMultiplier = 2 ;
}
else if ( encoding = = " UTF-32 " | |
encoding = = " UTF-32BE " | |
encoding = = " UTF-32LE " )
{
iconvLenMultiplier = 1 ;
}
2012-08-27 14:25:08 +02:00
size_t nconv ;
char * buffer ;
2009-11-06 18:06:12 +01:00
size_t iconvBufferLeft , docBufferLeft ;
2013-10-25 13:23:34 +02:00
iconvBufferLen = iconvBufferLeft = docBufferLen * iconvLenMultiplier + 1 ;
2009-11-06 18:06:12 +01:00
docBufferLeft = docBufferLen ;
2013-10-29 11:52:22 +01:00
if ( ( ( ( size_t ) - 1 ) - 1 ) / iconvLenMultiplier < docBufferLen
| | ! iconvBuffer . extend ( iconvBufferLen ) )
{
wxString message ;
message . Printf ( _ ( " Cannot open %s: out of memory " ) ,
fileName . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
statusProgress ( wxEmptyString ) ;
return false ;
}
2012-08-27 14:25:08 +02:00
finalBuffer = buffer = iconvBuffer . data ( ) ; // buffer will be incremented by iconv
2012-08-11 12:47:16 +02:00
nconv = reinterpret_cast < universal_iconv & > ( iconv ) (
2009-11-06 18:06:12 +01:00
cd ,
& docBuffer ,
& docBufferLeft ,
2012-08-27 14:25:08 +02:00
& buffer ,
2009-11-06 18:06:12 +01:00
& iconvBufferLeft ) ;
2012-08-27 14:25:08 +02:00
* buffer = ' \0 ' ;
2009-11-06 18:06:12 +01:00
iconv_close ( cd ) ;
if ( nconv = = ( size_t ) - 1 )
{
wxString message ;
message . Printf ( _ ( " Cannot open %s: conversion from encoding %s failed " ) ,
fileName . c_str ( ) ,
wideEncoding . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
return false ;
}
finalBufferLen = iconvBufferLen - iconvBufferLeft ;
}
statusProgress ( _ ( " Creating document view... " ) ) ;
2013-10-29 11:52:22 +01:00
{
wxWindowUpdateLocker noupdate ( this ) ;
doc = new XmlDoc (
mainBook ,
( largeFile ) ? largeFileProperties : properties ,
& protectTags ,
visibilityState ,
( ! binaryfile . getDataLen ( ) ) ? FILE_TYPE_XML : type ,
wxID_ANY ,
finalBuffer ,
finalBufferLen ,
fileName ,
auxPath ) ;
2009-11-06 18:06:12 +01:00
# ifdef __WXMSW__
2013-10-29 11:52:22 +01:00
doc - > SetUndoCollection ( false ) ;
doc - > SetUndoCollection ( true ) ;
2009-11-06 18:06:12 +01:00
# endif
2013-10-29 11:52:22 +01:00
doc - > setFullFileName ( fileName ) ;
doc - > setShortFileName ( name ) ;
doc - > setDirectory ( directory ) ;
openFileSet . insert ( fileName ) ;
history . AddFileToHistory ( fileName ) ;
updateFileMenu ( ) ;
wxFileName ofn ( fileName ) ;
doc - > setLastModified ( ofn . GetModificationTime ( ) ) ;
mainBook - > AddPage ( ( wxWindow * ) doc , name , _T ( " " ) ) ;
}
2009-11-06 18:06:12 +01:00
statusProgress ( wxEmptyString ) ;
2012-08-18 17:41:27 +02:00
mainBook - > Layout ( ) ;
2009-11-06 18:06:12 +01:00
wxFileName fn ( fileName ) ;
doc - > setLastModified ( fn . GetModificationTime ( ) ) ;
doc - > SetFocus ( ) ;
2013-10-29 11:52:22 +01:00
if ( type ! = FILE_TYPE_XML | | ! binaryfile . getDataLen ( ) )
2009-11-06 18:06:12 +01:00
{
return true ;
}
// NOW parse the document, but don't create a UTF-8 copy
statusProgress ( _T ( " Parsing document... " ) ) ;
std : : auto_ptr < WrapExpat > we ( new WrapExpat ( ) ) ;
// omit XML declaration
2013-10-25 13:23:34 +02:00
if ( ! isUtf8 & & finalBufferLen > 5 & &
2009-11-06 18:06:12 +01:00
finalBuffer [ 0 ] = = ' < ' & &
finalBuffer [ 1 ] = = ' ? ' & &
finalBuffer [ 2 ] = = ' x ' & &
finalBuffer [ 3 ] = = ' m ' & &
finalBuffer [ 4 ] = = ' l ' )
{
for ( ; * finalBuffer & & finalBufferLen ; finalBuffer + + & & finalBufferLen - - )
{
if ( * finalBuffer = = ' > ' )
{
finalBuffer + + ;
finalBufferLen - - ;
break ;
}
}
}
2013-10-25 13:23:34 +02:00
bool optimisedParseSuccess = false ;
2009-11-06 18:06:12 +01:00
if ( finalBuffer )
{
optimisedParseSuccess = we - > parse ( finalBuffer , finalBufferLen ) ;
statusProgress ( wxEmptyString ) ;
}
// NOW update prompt maps if necessary
if ( ! largeFile & & ( properties . completion | | properties . validateAsYouType ) )
{
statusProgress ( _T ( " Compiling autocompletion lists... " ) ) ;
doc - > updatePromptMaps ( finalBuffer , finalBufferLen ) ;
statusProgress ( wxEmptyString ) ;
}
if ( ! largeFile & & ( properties . validateAsYouType & & doc - > getGrammarFound ( ) ) )
{
statusProgress ( _T ( " Validating document... " ) ) ;
//doc->backgroundValidate ( finalBuffer, doc->getFullFileName().mb_str(wxConvUTF8), finalBufferLen );
doc - > backgroundValidate ( ) ;
statusProgress ( wxEmptyString ) ;
}
if ( ! optimisedParseSuccess )
{
posPair = we - > getErrorPosition ( ) ;
- - ( posPair . first ) ;
2012-08-18 17:41:27 +02:00
messagePane ( we - > getLastError ( ) , CONST_WARNING ) ;
2009-11-06 18:06:12 +01:00
int newPosition = doc - > PositionFromLine ( posPair . first ) ;
doc - > SetSelection ( newPosition , newPosition ) ;
doc - > SetFocus ( ) ;
2012-09-20 18:53:05 +02:00
doc - > setErrorIndicator ( posPair . first , posPair . second ) ;
2009-11-06 18:06:12 +01:00
}
else
{
closePane ( ) ;
}
return true ;
}
std : : string MyFrame : : getApproximateEncoding ( char * docBuffer ,
size_t docBufferLen )
{
2013-11-12 17:30:07 +01:00
std : : string line ;
2009-11-06 18:06:12 +01:00
char * it ;
size_t i ;
// grab first line
for (
i = 0 , it = docBuffer ;
i < docBufferLen & & * it ! = ' \n ' & & i < BUFSIZ ;
i + + , it + + )
{
if ( * it )
line + = * it ;
}
std : : pair < int , int > limits = XmlEncodingHandler : : getEncodingValueLimits ( line ) ;
if ( limits . first = = - 1 | | limits . second = = - 1 )
return " " ;
return line . substr ( limits . first , limits . second ) ;
}
void MyFrame : : OnToggleFold ( wxCommandEvent & WXUNUSED ( event ) )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
doc - > toggleFold ( ) ;
}
void MyFrame : : OnFoldAll ( wxCommandEvent & WXUNUSED ( event ) )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
doc - > foldAll ( ) ;
doc - > SetFocus ( ) ;
}
void MyFrame : : OnUnfoldAll ( wxCommandEvent & WXUNUSED ( event ) )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
doc - > unfoldAll ( ) ;
doc - > SetFocus ( ) ;
}
void MyFrame : : OnQuit ( wxCommandEvent & WXUNUSED ( event ) )
{
Close ( true ) ;
}
void MyFrame : : OnUndo ( wxCommandEvent & WXUNUSED ( event ) )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
doc - > Undo ( ) ;
doc - > setValidationRequired ( true ) ;
doc - > SetFocus ( ) ;
}
void MyFrame : : OnRedo ( wxCommandEvent & WXUNUSED ( event ) )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
doc - > Redo ( ) ;
doc - > setValidationRequired ( true ) ;
doc - > SetFocus ( ) ;
}
void MyFrame : : OnRevert ( wxCommandEvent & WXUNUSED ( event ) )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
while ( doc - > GetModify ( ) )
{
if ( ! doc - > CanUndo ( ) )
return ;
doc - > Undo ( ) ;
doc - > setValidationRequired ( true ) ;
}
doc - > SetFocus ( ) ;
}
void MyFrame : : OnSpelling ( wxCommandEvent & event )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
statusProgress ( wxEmptyString ) ;
closePane ( ) ;
# ifdef __WXMSW__
doc - > SetUndoCollection ( false ) ;
doc - > SetUndoCollection ( true ) ;
# endif
int id , type ;
id = event . GetId ( ) ;
type = ( id = = ID_STYLE ) ? ID_TYPE_STYLE : ID_TYPE_SPELL ;
std : : string rawBufferUtf8 ;
getRawText ( doc , rawBufferUtf8 ) ;
bool success = true ; // always true for now: well-formedness not req'd
auto_ptr < StyleDialog > sd ( new StyleDialog (
this ,
wxICON ( appicon ) ,
rawBufferUtf8 ,
doc - > getShortFileName ( ) ,
ruleSetDir ,
filterDir ,
( type = = ID_TYPE_SPELL ) ? dictionaryPreset : ruleSetPreset ,
filterPreset ,
# ifdef __WXMSW__
aspellDataPath ,
aspellDictPath ,
# endif
type ,
( success ) ? false : true ,
stylePosition ,
styleSize ) ) ;
if ( sd - > ShowModal ( ) = = wxID_OK )
{
std : : string bufferUtf8 = sd - > getEditedString ( ) ;
if ( bufferUtf8 . empty ( ) )
messagePane ( _ ( " Edited document empty " ) , CONST_STOP ) ;
else
doc - > SetTextRaw ( bufferUtf8 . c_str ( ) ) ;
}
// update presets if report has been created (even if followed by cancel)
if ( type = = ID_TYPE_STYLE )
{
ruleSetPreset = sd - > getRuleSetPreset ( ) ;
filterPreset = sd - > getFilterPreset ( ) ;
}
else
dictionaryPreset = sd - > getRuleSetPreset ( ) ;
# ifdef __WXMSW__
stylePosition = sd - > getPosition ( ) ;
styleSize = sd - > getSize ( ) ;
# endif
}
void MyFrame : : OnPreviousDocument ( wxCommandEvent & WXUNUSED ( event ) )
{
if ( ! getActiveDocument ( ) )
return ;
statusProgress ( wxEmptyString ) ;
closePane ( ) ;
int currentSelection = mainBook - > GetSelection ( ) ;
if ( currentSelection < 1 )
return ;
mainBook - > SetSelection ( - - currentSelection ) ;
XmlDoc * doc = getActiveDocument ( ) ;
if ( doc )
doc - > SetFocus ( ) ;
}
void MyFrame : : OnNextDocument ( wxCommandEvent & WXUNUSED ( event ) )
{
if ( ! getActiveDocument ( ) )
return ;
statusProgress ( wxEmptyString ) ;
closePane ( ) ;
int currentSelection = mainBook - > GetSelection ( ) ;
int maxSelection = mainBook - > GetPageCount ( ) ;
if ( currentSelection > = ( maxSelection - 1 ) )
return ;
mainBook - > SetSelection ( + + currentSelection ) ;
XmlDoc * doc = getActiveDocument ( ) ;
if ( doc )
doc - > SetFocus ( ) ;
}
void MyFrame : : OnSave ( wxCommandEvent & event )
{
save ( ) ;
}
void MyFrame : : save ( )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
wxString fileName ;
if ( ( fileName = doc - > getFullFileName ( ) ) = = _T ( " " ) )
{
wxCommandEvent event ;
OnSaveAs ( event ) ;
return ;
}
if ( ! saveFile ( doc , fileName , true ) )
2013-11-12 17:30:07 +01:00
{ } // handle messages in saveFile
2009-11-06 18:06:12 +01:00
}
void MyFrame : : OnReload ( wxCommandEvent & event )
{
reloadTab ( ) ;
}
void MyFrame : : reloadTab ( )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
wxString fileName = doc - > getFullFileName ( ) ;
if ( closeActiveDocument ( ) )
openFile ( fileName ) ;
}
void MyFrame : : OnSaveAs ( wxCommandEvent & event )
{
saveAs ( ) ;
}
void MyFrame : : saveAs ( )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
wxString defaultFile , defaultDir ;
defaultFile = doc - > getFullFileName ( ) ;
if ( ! defaultFile . empty ( ) )
{
wxFileName fn ( defaultFile ) ;
defaultDir = fn . GetPath ( ) ;
}
auto_ptr < wxFileDialog > fd ( new wxFileDialog (
this ,
_ ( " Save As " ) ,
defaultDir ,
defaultFile ,
FILE_FILTER ,
2012-08-09 13:22:21 +02:00
# if wxCHECK_VERSION(2,9,0)
2012-03-14 16:08:20 +01:00
wxFD_SAVE | wxFD_OVERWRITE_PROMPT ) ) ;
# else
2009-11-06 18:06:12 +01:00
wxSAVE | wxOVERWRITE_PROMPT ) ) ;
2012-03-14 16:08:20 +01:00
# endif
2009-11-06 18:06:12 +01:00
if ( fd - > ShowModal ( ) = = wxID_CANCEL )
return ;
wxString path = fd - > GetPath ( ) ;
if (
openFileSet . count ( path ) & &
path ! = doc - > getFullFileName ( ) )
{
wxString message ;
message . Printf ( _ ( " %s is already open " ) , path . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
return ;
}
wxString name = fd - > GetFilename ( ) ;
wxString directory ;
wxFileName : : SplitPath ( path , & directory , NULL , NULL ) ;
if ( path = = _T ( " " ) )
return ;
if ( ! saveFile ( doc , path , false ) )
return ;
// if already named, remove from set of open files
openFileSet . erase ( doc - > getFullFileName ( ) ) ;
doc - > setFullFileName ( path ) ;
doc - > setShortFileName ( name ) ;
doc - > setDirectory ( directory ) ;
history . AddFileToHistory ( path ) ; // update history
updateFileMenu ( ) ;
int selection ;
if ( ( selection = mainBook - > GetSelection ( ) ) = = - 1 )
return ;
mainBook - > SetPageText ( selection , name ) ;
}
void MyFrame : : OnUpdateCloseAll ( wxUpdateUIEvent & event )
{
event . Enable ( mainBook - > GetPageCount ( ) > 1 ) ;
}
void MyFrame : : OnUpdateReload ( wxUpdateUIEvent & event )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
{
event . Enable ( false ) ;
return ;
}
event . Enable ( ! doc - > getFullFileName ( ) . empty ( ) ) ;
}
void MyFrame : : OnUpdateCutCopy ( wxUpdateUIEvent & event )
{
2013-11-12 17:30:07 +01:00
event . Enable ( getActiveDocument ( ) ! = NULL ) ;
2009-11-06 18:06:12 +01:00
}
void MyFrame : : OnUpdateLocationPaneVisible ( wxUpdateUIEvent & event )
{
if ( ! viewMenu )
return ;
wxAuiPaneInfo info = manager . GetPane ( locationPanel ) ;
event . Check ( info . IsShown ( ) ) ;
}
void MyFrame : : OnUpdateSavedOnly ( wxUpdateUIEvent & event )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
{
event . Enable ( false ) ;
return ;
}
2013-11-12 17:30:07 +01:00
event . Enable ( ! doc - > getFullFileName ( ) . empty ( ) ) ;
2009-11-06 18:06:12 +01:00
}
void MyFrame : : OnUpdateDocRange ( wxUpdateUIEvent & event )
{
2013-11-12 17:30:07 +01:00
event . Enable ( getActiveDocument ( ) ! = NULL ) ;
2009-11-06 18:06:12 +01:00
}
void MyFrame : : OnUpdateReplaceRange ( wxUpdateUIEvent & event )
{
2013-11-12 17:30:07 +01:00
event . Enable ( getActiveDocument ( ) ! = NULL ) ;
2009-11-06 18:06:12 +01:00
}
void MyFrame : : OnUpdateFindAgain ( wxUpdateUIEvent & event )
{
if ( ! getActiveDocument ( ) | | findData . GetFindString ( ) . empty ( ) )
{
event . Enable ( false ) ;
return ;
}
event . Enable ( true ) ;
}
void MyFrame : : OnUpdateUndo ( wxUpdateUIEvent & event )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
{
event . Enable ( false ) ;
return ;
}
# ifdef __WXMSW__
event . Enable ( ( doc - > CanUndo ( ) ) ? true : false ) ;
# else
event . Enable ( ( doc - > GetModify ( ) ) ? true : false ) ;
# endif
}
void MyFrame : : OnUpdateRedo ( wxUpdateUIEvent & event )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
{
event . Enable ( false ) ;
return ;
}
event . Enable ( doc - > CanRedo ( ) ) ;
}
void MyFrame : : OnUpdatePaste ( wxUpdateUIEvent & event )
{
2013-11-12 17:30:07 +01:00
event . Enable ( getActiveDocument ( ) ! = NULL ) ;
2009-11-06 18:06:12 +01:00
}
void MyFrame : : OnUpdatePreviousDocument ( wxUpdateUIEvent & event )
{
if ( ! getActiveDocument ( ) )
{
event . Enable ( false ) ;
return ;
}
int currentDocument = mainBook - > GetSelection ( ) ;
event . Enable ( ( currentDocument < 1 ) ? false : true ) ;
}
void MyFrame : : OnUpdateNextDocument ( wxUpdateUIEvent & event )
{
if ( ! getActiveDocument ( ) )
{
event . Enable ( false ) ;
return ;
}
int currentDocument = mainBook - > GetSelection ( ) ;
int maxDocument = mainBook - > GetPageCount ( ) ;
event . Enable ( ( currentDocument > = ( maxDocument - 1 ) ) ? false : true ) ;
}
void MyFrame : : OnUpdateClosePane ( wxUpdateUIEvent & event )
{
wxAuiPaneInfo i1 , i2 , i3 ;
i1 = manager . GetPane ( htmlReport ) ;
i2 = manager . GetPane ( findReplacePanel ) ;
i3 = manager . GetPane ( commandPanel ) ;
event . Enable ( i1 . IsShown ( ) | | i2 . IsShown ( ) | | i3 . IsShown ( ) ) ;
}
void MyFrame : : OnValidateDTD ( wxCommandEvent & event )
{
statusProgress ( wxEmptyString ) ;
// fetch document contents
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
wxString fname = doc - > getFullFileName ( ) ;
WrapTempFileName wtfn ( fname ) ;
if ( fname . empty ( ) | | doc - > GetModify ( ) )
{
wxString wideBuffer = doc - > GetText ( ) ;
std : : string buffer = ( const char * ) wideBuffer . mb_str ( wxConvUTF8 ) ;
if ( ! saveRawUtf8 (
wtfn . name ( ) ,
buffer ) )
{
messagePane (
_ ( " Cannot save temporary copy for validation; please save or discard changes " ) ,
CONST_STOP ) ;
return ;
}
fname = wtfn . wideName ( ) ;
}
std : : string fnameLocal = ( const char * ) fname . mb_str ( wxConvLocal ) ;
doc - > clearErrorIndicators ( ) ;
statusProgress ( _ ( " DTD Validation in progress... " ) ) ;
2012-08-30 16:37:01 +02:00
auto_ptr < WrapLibxml > wl ( new WrapLibxml ( libxmlNetAccess ) ) ;
2009-11-06 18:06:12 +01:00
if ( ! wl - > validate ( fnameLocal ) )
{
std : : string error = wl - > getLastError ( ) ;
wxString wideError = wxString ( error . c_str ( ) , wxConvUTF8 , error . size ( ) ) ;
statusProgress ( wxEmptyString ) ;
messagePane ( wideError , CONST_WARNING ) ;
std : : pair < int , int > posPair = wl - > getErrorPosition ( ) ;
- - ( posPair . first ) ;
int cursorPos =
doc - > PositionFromLine ( posPair . first ) ;
doc - > SetSelection ( cursorPos , cursorPos ) ;
// shallow validate all
doc - > backgroundValidate ( ) ; // has to come first as it deletes all indicators
doc - > setErrorIndicator ( posPair . first , posPair . second ) ;
return ;
}
statusProgress ( wxEmptyString ) ;
documentOk ( _ ( " valid " ) ) ;
}
void MyFrame : : OnValidateRelaxNG ( wxCommandEvent & event )
{
statusProgress ( wxEmptyString ) ;
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
wxString fileName = doc - > getFullFileName ( ) ;
wxString defaultFile , defaultDir ;
defaultFile = doc - > getFullFileName ( ) ;
if ( ! defaultFile . empty ( ) )
{
wxFileName fn ( defaultFile ) ;
defaultDir = fn . GetPath ( ) ;
}
AssociateDialog ad (
this ,
_ ( " Select RELAX NG grammar " ) ,
_ ( " Choose a file: " ) ,
_ ( " RELAX NG grammar " ) ,
_T ( " *.* " ) ,
lastRelaxNGSchema ) ;
if ( ad . ShowModal ( ) ! = wxID_OK )
return ;
wxString path = lastRelaxNGSchema = ad . getUrl ( ) ;
if ( path . empty ( ) )
{
statusProgress ( wxEmptyString ) ;
return ;
}
validateRelaxNG ( doc , path , fileName ) ;
}
void MyFrame : : validateRelaxNG (
XmlDoc * doc ,
const wxString & schemaName ,
wxString & fileName ) // not const: may change if empty/document modified
{
statusProgress ( wxEmptyString ) ;
if ( ! doc )
return ;
WrapTempFileName wtfn ( fileName ) ;
if ( fileName . empty ( ) | | doc - > GetModify ( ) )
{
wxString wideBuffer = doc - > GetText ( ) ;
std : : string buffer = ( const char * ) wideBuffer . mb_str ( wxConvUTF8 ) ;
if ( ! saveRawUtf8 (
wtfn . name ( ) ,
buffer ) )
{
messagePane (
_ ( " Cannot save temporary copy for validation; please save or discard changes " ) ,
CONST_STOP ) ;
return ;
}
fileName = wtfn . wideName ( ) ;
}
doc - > clearErrorIndicators ( ) ;
statusProgress ( _ ( " RELAX NG validation in progress... " ) ) ;
2012-08-30 16:37:01 +02:00
auto_ptr < WrapLibxml > wl ( new WrapLibxml ( libxmlNetAccess ) ) ;
2009-11-06 18:06:12 +01:00
std : : string schemaFileNameLocal = ( const char * ) schemaName . mb_str ( wxConvLocal ) ;
std : : string fileNameLocal = ( const char * ) fileName . mb_str ( wxConvLocal ) ;
if ( ! wl - > validateRelaxNG ( schemaFileNameLocal , fileNameLocal ) )
{
std : : string error = wl - > getLastError ( ) ;
wxString wideError = wxString ( error . c_str ( ) , wxConvUTF8 , error . size ( ) ) ;
statusProgress ( wxEmptyString ) ;
std : : pair < int , int > posPair = wl - > getErrorPosition ( ) ;
- - ( posPair . first ) ;
int cursorPos =
doc - > PositionFromLine ( posPair . first ) ;
doc - > SetSelection ( cursorPos , cursorPos ) ;
doc - > setErrorIndicator ( posPair . first , posPair . second ) ;
messagePane ( wideError , CONST_WARNING ) ;
doc - > SetFocus ( ) ;
return ;
}
statusProgress ( wxEmptyString ) ;
documentOk ( _ ( " valid " ) ) ;
doc - > SetFocus ( ) ;
}
void MyFrame : : OnValidatePreset ( wxCommandEvent & event )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
wxString fileName = doc - > getFullFileName ( ) ;
int id = event . GetId ( ) ;
wxString schemaFileName = validationPresetMap [ id ] ;
if ( schemaFileName . empty ( ) )
return ;
validateRelaxNG ( doc , schemaFileName , fileName ) ;
}
void MyFrame : : OnValidateSchema ( wxCommandEvent & event )
{
statusProgress ( wxEmptyString ) ;
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
// branch: if no XML Schema found, use LibXML DTD parser instead
// so the catalog is read - switch when Xerces-C implements
// XMLCatalogResolver
# ifdef __WXMSW__
{
2013-11-12 17:30:07 +01:00
std : : string rawBuffer ;
2009-11-06 18:06:12 +01:00
getRawText ( doc , rawBuffer ) ;
2013-10-25 13:23:34 +02:00
if ( ! XmlEncodingHandler : : setUtf8 ( rawBuffer ) )
{
encodingMessage ( ) ;
return ;
}
2009-11-06 18:06:12 +01:00
auto_ptr < XmlSchemaLocator > xsl ( new XmlSchemaLocator ( ) ) ;
xsl - > parse ( rawBuffer . c_str ( ) ) ;
if ( ( xsl - > getSchemaLocation ( ) ) . empty ( ) )
{
OnValidateDTD ( event ) ;
return ;
}
}
# endif
wxString fileName ;
fileName = doc - > getFullFileName ( ) ;
WrapTempFileName wtfn ( fileName ) ;
if ( fileName . empty ( ) | | doc - > GetModify ( ) )
{
wxString wideBuffer = doc - > GetText ( ) ;
std : : string buffer = ( const char * ) wideBuffer . mb_str ( wxConvUTF8 ) ;
if ( ! saveRawUtf8 (
wtfn . name ( ) ,
buffer ) )
{
messagePane (
_ ( " Cannot save temporary copy for validation; please save or discard changes " ) ,
CONST_STOP ) ;
return ;
}
fileName = wtfn . wideName ( ) ;
}
statusProgress ( _ ( " Validation in progress... " ) ) ;
doc - > clearErrorIndicators ( ) ;
2012-08-30 16:37:01 +02:00
std : : auto_ptr < WrapXerces > validator ( new WrapXerces ( ) ) ;
2013-10-25 13:23:34 +02:00
if ( ! validator - > validate ( fileName ) )
2009-11-06 18:06:12 +01:00
{
statusProgress ( wxEmptyString ) ;
2012-08-10 15:34:13 +02:00
messagePane ( validator - > getLastError ( ) , CONST_WARNING ) ;
2009-11-06 18:06:12 +01:00
std : : pair < int , int > posPair = validator - > getErrorPosition ( ) ;
int cursorPos =
doc - > PositionFromLine ( posPair . first - 1 ) ;
doc - > SetSelection ( cursorPos , cursorPos ) ;
doc - > setErrorIndicator ( posPair . first - 1 , 0 ) ;
}
else
documentOk ( _ ( " valid " ) ) ;
}
2012-08-25 02:19:11 +02:00
void MyFrame : : OnCreateSchema ( wxCommandEvent & event )
{
statusProgress ( wxEmptyString ) ;
XmlDoc * doc = getActiveDocument ( ) ;
if ( doc = = NULL )
return ;
std : : string rawBufferUtf8 ;
getRawText ( doc , rawBufferUtf8 ) ;
if ( ! XmlEncodingHandler : : setUtf8 ( rawBufferUtf8 ) )
{
encodingMessage ( ) ;
return ;
}
2012-09-04 16:03:07 +02:00
const static wxString types [ ] = { _ ( " W3C Schema " ) , _ ( " DTD " ) } ;
const static wxString message = _ ( " Please choose a shema type " ) ;
wxSingleChoiceDialog dlg ( this , message , _ ( " Schema type " ) ,
( int ) sizeof ( types ) / sizeof ( types [ 0 ] ) , types ) ;
int ret = dlg . ShowModal ( ) ;
if ( ret = = wxID_CANCEL ) return ;
2012-08-25 02:19:11 +02:00
2012-09-04 16:03:07 +02:00
Grammar : : GrammarType type = ( dlg . GetSelection ( ) = = 0 ) ?
2012-08-25 02:19:11 +02:00
Grammar : : SchemaGrammarType : Grammar : : DTDGrammarType ;
std : : auto_ptr < XmlSchemaGenerator > gen ( new XmlSchemaGenerator ( ) ) ;
const wxString & schema = gen - > generate ( type , doc - > getFullFileName ( ) ,
rawBufferUtf8 . c_str ( ) , rawBufferUtf8 . size ( ) ) ;
if ( schema . IsEmpty ( ) ) {
messagePane ( gen - > getLastError ( ) , CONST_WARNING ) ;
return ;
}
newDocument ( schema ) ;
}
2013-12-04 17:22:00 +01:00
void MyFrame : : OnDtd2Schema ( wxCommandEvent & event )
{
closePane ( ) ;
# if wxCHECK_VERSION(2,9,0)
long style = wxFD_OPEN | wxFD_FILE_MUST_EXIST ;
# else
long style = wxOPEN | wxFILE_MUST_EXIST ;
# endif
wxFileDialog fd ( this , _ ( " Please select a DTD file " ) , wxEmptyString ,
wxEmptyString , _T ( " DTD files (*.dtd)|*.dtd|All files (*.*)|*.* " ) ,
style ) ;
if ( fd . ShowModal ( ) ! = wxID_OK )
return ;
statusProgress ( _ ( " Converting... " ) ) ;
Dtd2Schema dtd2xsd ;
const wxString & schema = dtd2xsd . convert ( fd . GetPath ( ) ) ;
const wxString & error = dtd2xsd . getErrors ( ) ;
if ( ! error . empty ( ) )
messagePane ( error , CONST_STOP ) ;
if ( ! schema . empty ( ) )
{
statusProgress ( _ ( " Creating view... " ) ) ;
newDocument ( schema ) ;
}
statusProgress ( wxEmptyString ) ;
}
2009-11-06 18:06:12 +01:00
void MyFrame : : OnXPath ( wxCommandEvent & event )
{
statusProgress ( wxEmptyString ) ;
closePane ( ) ;
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
auto_ptr < wxTextEntryDialog > dlg ( new wxTextEntryDialog (
this ,
_ ( " Enter XPath: " ) ,
_ ( " Evaluate XPath " ) ,
xpathExpression ) ) ;
int ret = dlg - > ShowModal ( ) ;
if ( ret = = wxID_CANCEL )
return ;
xpathExpression = dlg - > GetValue ( ) ;
std : : string valUtf8 = ( const char * ) xpathExpression . mb_str ( wxConvUTF8 ) ;
// fetch document contents
std : : string rawBufferUtf8 ;
getRawText ( doc , rawBufferUtf8 ) ;
if ( ! XmlEncodingHandler : : setUtf8 ( rawBufferUtf8 ) )
{
encodingMessage ( ) ;
return ;
}
WrapTempFileName tempFileName ( doc - > getFullFileName ( ) ) ;
ofstream rawBufferStream ( tempFileName . name ( ) . c_str ( ) ) ;
if ( ! rawBufferStream )
return ;
rawBufferStream < < rawBufferUtf8 ;
rawBufferStream . close ( ) ;
2012-08-30 16:37:01 +02:00
auto_ptr < WrapLibxml > wl ( new WrapLibxml ( libxmlNetAccess ) ) ;
2009-11-06 18:06:12 +01:00
bool success = wl - > xpath ( valUtf8 , tempFileName . name ( ) ) ;
if ( ! success )
{
std : : string error = wl - > getLastError ( ) ;
wxString wideError = wxString ( error . c_str ( ) , wxConvUTF8 , error . size ( ) ) ;
if ( ! wideError . empty ( ) )
wideError . Prepend ( _T ( " : " ) ) ;
wideError . Prepend ( _ ( " Cannot evaluate XPath " ) ) ;
messagePane ( wideError , CONST_WARNING ) ;
return ;
}
statusProgress ( wxEmptyString ) ;
std : : string buffer = wl - > getOutput ( ) ;
if ( buffer . empty ( ) )
{
messagePane ( _ ( " No matching nodes found " ) , CONST_WARNING ) ;
return ;
}
newDocument ( buffer ) ;
statusProgress ( wxEmptyString ) ;
}
void MyFrame : : OnXslt ( wxCommandEvent & event )
{
statusProgress ( wxEmptyString ) ;
closePane ( ) ;
// fetch document contents
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
std : : string rawBufferUtf8 ;
getRawText ( doc , rawBufferUtf8 ) ;
if ( ! XmlEncodingHandler : : setUtf8 ( rawBufferUtf8 ) )
{
encodingMessage ( ) ;
return ;
}
WrapTempFileName tempFileName ( doc - > getFullFileName ( ) ) ;
ofstream rawBufferStream ( tempFileName . name ( ) . c_str ( ) ) ;
if ( ! rawBufferStream )
return ;
rawBufferStream < < rawBufferUtf8 ;
rawBufferStream . close ( ) ;
wxString path ;
int id = event . GetId ( ) ;
if ( id = = ID_XSLT )
{
XslLocator xl ;
xl . parse ( rawBufferUtf8 ) ;
std : : string location = xl . getXslLocation ( ) ;
path = wxString ( location . c_str ( ) , wxConvUTF8 , location . size ( ) ) ;
path . Replace ( _T ( " %20 " ) , _T ( " " ) , true ) ;
path = PathResolver : : run ( path , doc - > getFullFileName ( ) ) ;
if ( ! wxFileName : : FileExists ( path ) )
{
if ( ! path . empty ( ) )
{
wxString message ;
message . Printf ( _ ( " Cannot open stylesheet %s " ) , path . c_str ( ) ) ;
messagePane ( message , CONST_WARNING ) ;
}
wxString defaultFile , defaultDir ;
defaultFile = doc - > getFullFileName ( ) ;
if ( ! defaultFile . empty ( ) )
{
wxFileName fn ( defaultFile ) ;
defaultDir = fn . GetPath ( ) ;
}
AssociateDialog ad (
this ,
_ ( " Select stylesheet " ) ,
_ ( " Choose a file: " ) ,
_ ( " XSLT stylesheet " ) ,
_T ( " *.xsl;*.xslt " ) ,
lastXslStylesheet ) ;
if ( ad . ShowModal ( ) ! = wxID_OK )
return ;
path = lastXslStylesheet = ad . getUrl ( ) ;
if ( path . empty ( ) ) // Cancel selected
{
statusProgress ( wxEmptyString ) ;
return ;
}
}
}
else
{
wxString sep ;
sep . Append ( wxFileName : : GetPathSeparator ( ) ) ;
switch ( id )
{
case ID_XSLT_TEI_FO :
path = applicationDir + sep + _T ( " tei " ) + sep + _T ( " fo " ) + sep +
_T ( " tei.xsl " ) ;
break ;
case ID_XSLT_TEI_HTML :
path = applicationDir + sep + _T ( " tei " ) + sep + _T ( " html " ) + sep +
_T ( " tei.xsl " ) ;
break ;
case ID_XSLT_TEI_XHTML :
path = applicationDir + sep + _T ( " tei " ) + sep + _T ( " xhtml " ) + sep +
_T ( " tei.xsl " ) ;
break ;
case ID_XSLT_TEI_LATEX :
path = applicationDir + sep + _T ( " tei " ) + sep + _T ( " latex " ) + sep +
_T ( " tei.xsl " ) ;
break ;
case ID_XSLT_DOCBOOK_FO :
path = applicationDir + sep + _T ( " docbook " ) + sep + _T ( " fo " ) + sep +
_T ( " docbook.xsl " ) ;
break ;
case ID_XSLT_DOCBOOK_HTML :
path = applicationDir + sep + _T ( " docbook " ) + sep + _T ( " html " ) + sep +
_T ( " docbook.xsl " ) ;
break ;
case ID_XSLT_DOCBOOK_XHTML :
path = applicationDir + sep + _T ( " docbook " ) + sep + _T ( " xhtml " ) + sep +
_T ( " docbook.xsl " ) ;
break ;
default :
break ;
}
}
statusProgress ( _ ( " XSL transformation in progress... " ) ) ;
std : : string stylefnameLocal = ( const char * ) path . mb_str ( wxConvLocal ) ;
2012-08-30 16:37:01 +02:00
auto_ptr < WrapLibxml > wl ( new WrapLibxml ( libxmlNetAccess ) ) ;
2009-11-06 18:06:12 +01:00
if ( ! wl - > xslt ( stylefnameLocal , tempFileName . name ( ) ) )
{
std : : string error = wl - > getLastError ( ) ;
wxString wideError = wxString ( error . c_str ( ) , wxConvUTF8 , error . size ( ) ) ;
wideError . Prepend ( _ ( " Cannot transform: " ) ) ;
statusProgress ( wxEmptyString ) ;
messagePane ( wideError , CONST_WARNING ) ;
return ;
}
std : : string buffer = wl - > getOutput ( ) ;
if ( buffer . empty ( ) )
{
messagePane ( _ ( " Output document empty " ) , CONST_WARNING ) ;
return ;
}
statusProgress ( wxEmptyString ) ;
newDocument ( buffer ) ;
}
void MyFrame : : OnPrettyPrint ( wxCommandEvent & event )
{
statusProgress ( wxEmptyString ) ;
closePane ( ) ;
// fetch document contents
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
int line = doc - > LineFromPosition ( doc - > GetCurrentPos ( ) ) ;
std : : string rawBufferUtf8 ;
getRawText ( doc , rawBufferUtf8 ) ;
std : : string encoding = XmlEncodingHandler : : get ( rawBufferUtf8 ) ;
if ( ! XmlEncodingHandler : : setUtf8 ( rawBufferUtf8 , true ) )
{
encodingMessage ( ) ;
return ;
}
statusProgress ( _ ( " Pretty-printing in progress... " ) ) ;
for ( int i = 0 ; i < 2 ; i + + ) // perform two iterations
{
WrapTempFileName tempFileName ( doc - > getFullFileName ( ) ) ;
ofstream rawBufferStream ( tempFileName . name ( ) . c_str ( ) ) ;
if ( ! rawBufferStream )
return ;
rawBufferStream < < rawBufferUtf8 ;
rawBufferStream . close ( ) ;
2012-08-30 16:37:01 +02:00
auto_ptr < WrapLibxml > wl ( new WrapLibxml ( libxmlNetAccess ) ) ;
2009-11-06 18:06:12 +01:00
bool success = wl - > parse ( tempFileName . name ( ) , true ) ;
if ( ! success )
{
std : : string error = wl - > getLastError ( ) ;
wxString wideError = wxString ( error . c_str ( ) , wxConvUTF8 , error . size ( ) ) ;
wideError . Prepend ( _ ( " Cannot pretty-print: " ) ) ;
statusProgress ( wxEmptyString ) ;
messagePane ( wideError , CONST_WARNING ) ;
return ;
}
rawBufferUtf8 = wl - > getOutput ( ) ;
}
statusProgress ( wxEmptyString ) ;
if ( rawBufferUtf8 . empty ( ) )
messagePane (
_ ( " Pretty-print unsuccessful: output document empty " ) ,
CONST_STOP ) ;
else
{
/*
if ( encoding ! = " UTF-8 " )
{
std : : string output = getEncodedBuffer ( rawBufferUtf8 , encoding ) ;
if ( ! output . empty ( ) )
rawBufferUtf8 = output ;
}
*/
if ( encoding ! = " UTF-8 " & & ! encoding . empty ( ) )
{
XmlEncodingHandler : : set ( rawBufferUtf8 , encoding ) ;
}
doc - > SetTextRaw ( rawBufferUtf8 . c_str ( ) ) ;
statusProgress ( wxEmptyString ) ;
}
doc - > setValidationRequired ( true ) ;
doc - > GotoLine ( line ) ;
doc - > SetFocus ( ) ;
}
void MyFrame : : OnEncoding ( wxCommandEvent & event )
{
statusProgress ( wxEmptyString ) ;
closePane ( ) ;
// fetch document contents
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
std : : vector < wxString > encodingVector ;
encodingVector . push_back ( _T ( " UTF-8 " ) ) ;
encodingVector . push_back ( _T ( " UTF-16 " ) ) ;
encodingVector . push_back ( _T ( " UTF-16LE " ) ) ;
encodingVector . push_back ( _T ( " UTF-16BE " ) ) ;
encodingVector . push_back ( _T ( " ISO-8859-1 " ) ) ;
encodingVector . push_back ( _T ( " US-ASCII " ) ) ;
const int vectorSize = encodingVector . size ( ) ;
wxString choiceArray [ vectorSize + 1 ] ;
for ( int i = 0 ; i < vectorSize ; + + i )
* ( choiceArray + i ) = encodingVector . at ( i ) ;
wxSingleChoiceDialog scd (
this , _ ( " Choose an encoding: " ) , _ ( " Encoding " ) , vectorSize , choiceArray ) ;
if ( scd . ShowModal ( ) = = wxID_CANCEL )
return ;
wxString selection ;
std : : string selectionUtf8 , bufferUtf8 ;
selection = scd . GetStringSelection ( ) ;
selectionUtf8 = selection . mb_str ( wxConvUTF8 ) ;
getRawText ( doc , bufferUtf8 ) ;
XmlEncodingHandler : : setUtf8 ( bufferUtf8 , true ) ;
WrapTempFileName tempFileName ( _T ( " " ) ) ;
std : : auto_ptr < WrapLibxml > wl ( new WrapLibxml ( libxmlNetAccess ) ) ;
int res ;
WrapTempFileName sourceFileName ( doc - > getFullFileName ( ) ) ;
saveRawUtf8 ( sourceFileName . name ( ) , bufferUtf8 ) ;
res = wl - > saveEncodingFromFile ( sourceFileName . name ( ) , tempFileName . name ( ) , selectionUtf8 ) ;
if ( res = = - 1 )
{
std : : string error = wl - > getLastError ( ) ;
wxString wideError = wxString ( error . c_str ( ) , wxConvUTF8 , error . size ( ) ) ;
wideError . Prepend ( _ ( " Cannot set encoding: " ) ) ;
messagePane ( wideError , CONST_STOP ) ;
return ;
}
std : : string newBuffer ;
bool success = ReadFile : : run ( tempFileName . name ( ) , newBuffer ) ;
if ( ! success )
{
messagePane ( _ ( " Cannot set encoding (cannot open temporary file) " ) ,
CONST_STOP ) ;
return ;
}
std : : auto_ptr < XmlUtf8Reader > xur ( new XmlUtf8Reader (
false ,
expandInternalEntities ,
newBuffer . size ( ) ) ) ;
if ( ! xur - > parse ( newBuffer ) )
{
messagePane ( _ ( " Cannot set encoding (cannot parse temporary file) " ) ,
CONST_STOP ) ;
return ;
}
doc - > SetTextRaw ( xur - > getBuffer ( ) . c_str ( ) ) ;
doc - > setValidationRequired ( true ) ;
doc - > SetFocus ( ) ;
}
void MyFrame : : OnHome ( wxCommandEvent & event )
{
2012-08-11 09:33:01 +02:00
wxLaunchDefaultBrowser ( _T ( " http://xml-copy-editor.sourceforge.net " ) ) ;
2009-11-06 18:06:12 +01:00
}
void MyFrame : : OnDownloadSource ( wxCommandEvent & event )
{
2013-10-24 18:12:11 +02:00
wxLaunchDefaultBrowser ( _T ( " http://sourceforge.net/p/xml-copy-editor/code/ " ) ) ;
2009-11-06 18:06:12 +01:00
}
void MyFrame : : OnToolbarVisible ( wxCommandEvent & event )
{
if ( ! viewMenu )
return ;
toolbarVisible = ( toolbarVisible ) ? false : true ;
viewMenu - > Check ( ID_TOOLBAR_VISIBLE , toolbarVisible ) ;
showTopBars ( toolbarVisible ) ;
manager . Update ( ) ;
}
void MyFrame : : OnWrapWords ( wxCommandEvent & event )
{
if ( ! viewMenu )
return ;
bool wrapWords ;
wrapWords = ( properties . wrap ) ? false : true ;
viewMenu - > Check ( ID_WRAP_WORDS , wrapWords ) ;
properties . wrap = wrapWords ;
// update all documents
int pageCount = mainBook - > GetPageCount ( ) ;
XmlDoc * currentDoc ;
for ( int i = 0 ; i < pageCount ; + + i )
{
currentDoc = ( XmlDoc * ) mainBook - > GetPage ( i ) ;
if ( ! currentDoc )
break ;
currentDoc - > SetWrapMode ( wrapWords ) ;
}
}
void MyFrame : : OnLocationPaneVisible ( wxCommandEvent & event )
{
wxAuiPaneInfo info = manager . GetPane ( locationPanel ) ;
bool visible = ( info . IsShown ( ) ) ? false : true ;
manager . GetPane ( locationPanel ) . Show ( visible ) ;
manager . Update ( ) ;
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
doc - > SetFocus ( ) ;
}
void MyFrame : : OnProtectTags ( wxCommandEvent & event )
{
if ( ! xmlMenu )
return ;
protectTags = ( protectTags ) ? false : true ;
if ( xmlMenu )
xmlMenu - > Check ( ID_PROTECT_TAGS , protectTags ) ;
if ( toolBar )
toolBar - > ToggleTool ( ID_PROTECT_TAGS , protectTags ) ;
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
if ( protectTags )
doc - > adjustCursor ( ) ; // apply to all open docs?
doc - > SetFocus ( ) ;
}
void MyFrame : : OnVisibilityState ( wxCommandEvent & event )
{
int id ;
id = event . GetId ( ) ;
switch ( id )
{
case ID_SHOW_TAGS :
visibilityState = SHOW_TAGS ;
//GetStatusBar()->SetStatusText(wxEmptyString, STATUS_PARENT);
break ;
case ID_HIDE_ATTRIBUTES :
visibilityState = HIDE_ATTRIBUTES ;
//GetStatusBar()->SetStatusText(wxEmptyString, STATUS_PARENT);
break ;
case ID_HIDE_TAGS :
visibilityState = HIDE_TAGS ;
break ;
default :
visibilityState = SHOW_TAGS ;
break ;
}
if ( viewMenu )
viewMenu - > Check ( id , true ) ;
// iterate over all open documents
int pageCount = mainBook - > GetPageCount ( ) ;
XmlDoc * currentDoc ;
for ( int i = 0 ; i < pageCount ; + + i )
{
currentDoc = ( XmlDoc * ) mainBook - > GetPage ( i ) ;
if ( ! currentDoc )
break ;
currentDoc - > applyVisibilityState ( visibilityState ) ;
}
if ( visibilityState = = HIDE_ATTRIBUTES | | visibilityState = = HIDE_TAGS )
{
if ( properties . protectHiddenElements & & ! protectTags )
{
wxCommandEvent e ;
OnProtectTags ( e ) ;
}
}
// fetch current document
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
// set focus for current document
doc - > SetFocus ( ) ;
}
void MyFrame : : OnFeedback ( wxCommandEvent & event )
{
wxString forumUrl =
_T ( " https://sourceforge.net/forum/forum.php?forum_id=475215 " ) ;
2012-08-11 09:33:01 +02:00
wxLaunchDefaultBrowser ( forumUrl ) ;
2009-11-06 18:06:12 +01:00
}
void MyFrame : : findAgain ( wxString s , int flags )
{
findReplacePanel - > flagNotFound ( false ) ;
if ( s . empty ( ) )
return ;
statusProgress ( wxEmptyString ) ;
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
// update regex parameter to keep global replace in sync
findRegex = findReplacePanel - > getRegex ( ) ;
int newLocation ;
int myFlags = 0 ;
if ( flags & wxFR_WHOLEWORD )
myFlags | = wxSTC_FIND_WHOLEWORD ;
if ( flags & wxFR_MATCHCASE )
myFlags | = wxSTC_FIND_MATCHCASE ;
if ( findReplacePanel - > getRegex ( ) )
myFlags | = wxSTC_FIND_REGEXP ;
bool incrementalFind =
( findReplacePanel - > getIncrementalFind ( ) ) ? true : false ;
//doc->SetYCaretPolicy(wxSTC_CARET_SLOP | wxSTC_CARET_STRICT, 10);
if ( flags & wxFR_DOWN ) // find next
{
doc - > SetTargetStart ( ( incrementalFind ) ?
doc - > GetSelectionStart ( ) : doc - > GetSelectionEnd ( ) ) ;
doc - > SetTargetEnd ( doc - > GetLength ( ) ) ;
doc - > SetSearchFlags ( myFlags ) ;
newLocation = doc - > SearchInTarget ( s ) ;
// try once more from top
if ( newLocation = = - 1 )
{
doc - > SetTargetStart ( 0 ) ;
doc - > SetTargetEnd ( doc - > GetLength ( ) ) ;
newLocation = doc - > SearchInTarget ( s ) ;
}
}
else // find previous
{
doc - > SetCurrentPos (
( doc - > GetSelectionStart ( ) ) ? doc - > GetSelectionStart ( ) - 1 : 0 ) ;
doc - > SearchAnchor ( ) ;
newLocation = doc - > SearchPrev ( myFlags , s ) ;
}
//doc->SetYCaretPolicy(wxSTC_CARET_SLOP, 0);
if ( newLocation = = - 1 )
{
findReplacePanel - > flagNotFound ( true ) ;
wxString err ;
err . Printf ( _ ( " Cannot find '%s' " ) , s . c_str ( ) ) ;
doc - > SetSelectionEnd ( doc - > GetSelectionStart ( ) ) ;
statusProgress ( err ) ;
// must clear target to prevent replace affecting whole document
doc - > SetTargetStart ( 0 ) ;
doc - > SetTargetEnd ( 0 ) ;
return ;
}
doc - > SetSelection ( doc - > GetTargetStart ( ) , doc - > GetTargetEnd ( ) ) ;
doc - > EnsureCaretVisible ( ) ;
}
bool MyFrame : : closeActiveDocument ( )
{
statusProgress ( wxEmptyString ) ;
closePane ( ) ;
int selection = mainBook - > GetSelection ( ) ;
if ( selection = = - 1 | | ! mainBook - > GetPageCount ( ) ) // GetPageCount needed for wxAuiNotebook
return false ;
locationPanel - > update ( NULL , wxEmptyString ) ;
insertChildPanel - > update ( NULL , wxEmptyString ) ;
insertSiblingPanel - > update ( NULL , wxEmptyString ) ;
// workaround -- wxAuiNotebook: send virtual close event? DeletePage doesn't generate one
wxAuiNotebookEvent e ;
e . SetSelection ( selection ) ;
OnPageClosing ( e ) ;
if ( deletePageVetoed )
return false ;
mainBook - > DeletePage ( selection ) ; // check this is still correct
return true ;
// apparently fixed betw. 2.8.0 and 2.8.6, so from v. 1.1.0.3, BUT this is once more:
// 1.1.0.5: reverted to above workaround - no confirmation dialog?
// watch memory usage for DeletePage call
//mainBook->DeletePage ( selection );
//return ( !deletePageVetoed );
}
bool MyFrame : : saveFile ( XmlDoc * doc , wxString & fileName , bool checkLastModified )
{
if ( ! doc )
return false ;
statusProgress ( wxEmptyString ) ;
if ( checkLastModified )
{
wxFileName fn ( fileName ) ;
if ( fn . IsOk ( ) )
{
wxDateTime myLastModified = fn . GetModificationTime ( ) ;
if ( ! myLastModified . IsEqualTo ( doc - > getLastModified ( ) ) )
{
int choice = wxMessageBox (
_ ( " File has been modified by another application. \n Do you want to proceed? " ) ,
_ ( " Confirmation " ) ,
wxICON_QUESTION | wxYES_NO | wxCANCEL ) ;
if ( choice ! = wxYES )
return false ;
}
}
}
int bytes = 0 ;
std : : string utf8Buffer , encoding , fileNameLocal ;
bool isXml = true ;
try
{
getRawText ( doc , utf8Buffer ) ;
XmlEncodingSpy es ;
es . parse ( utf8Buffer ) ;
encoding = es . getEncoding ( ) ;
fileNameLocal = fileName . mb_str ( wxConvLocal ) ;
closePane ( ) ;
bool success ;
success = true ;
if ( getFileType ( fileName ) ! = FILE_TYPE_XML )
{
isXml = false ;
}
// raw file conditions
if ( doc - > getType ( ) = = FILE_TYPE_BINARY )
{
success = saveRawUtf8 ( fileNameLocal , utf8Buffer , true , isXml ) ;
if ( success )
bytes = utf8Buffer . size ( ) ;
else
{
wxString message ;
message . Printf ( _ ( " Cannot save %s " ) , fileName . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
return false ;
}
}
else if ( ! isXml & & encoding . empty ( ) )
{
success = saveRawUtf8 ( fileNameLocal , utf8Buffer , true , isXml ) ;
if ( success )
bytes = utf8Buffer . size ( ) ;
else
{
wxString message ;
message . Printf ( _ ( " Cannot save %s " ) , fileName . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
return false ;
}
}
else if ( encoding = = " UTF-8 " )
{
auto_ptr < WrapExpat > we ( new WrapExpat ( ) ) ;
if ( ! we - > parse ( utf8Buffer ) )
{
2012-08-10 15:34:13 +02:00
//if ( we->isEncodingError() )
// ;
messagePane ( we - > getLastError ( ) , CONST_WARNING ) ;
2009-11-06 18:06:12 +01:00
}
success = saveRawUtf8 ( fileNameLocal , utf8Buffer , true , isXml ) ;
if ( success )
bytes = utf8Buffer . size ( ) ;
else
{
wxString message ;
message . Printf ( _ ( " Cannot save %s " ) , fileName . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
return false ;
}
}
else
{
wxString wideEncoding = wxString ( encoding . c_str ( ) , wxConvLocal , encoding . size ( ) ) ;
// IF Unicode, use iconv to convert buffer
if ( encoding = = " UTF-16 " | | encoding = = " UTF-16LE " | |
encoding = = " UTF-16BE " | | encoding = = " UTF-32 " | | encoding = = " UTF-32LE " | |
encoding = = " UTF-32BE " )
{
iconv_t cd = iconv_open ( encoding . c_str ( ) , " UTF-8 " ) ;
if ( cd = = ( iconv_t ) - 1 )
{
success = saveRawUtf8 ( fileNameLocal , utf8Buffer , false , isXml ) ;
if ( success )
{
bytes = utf8Buffer . size ( ) ;
wxString message ;
message . Printf (
_ ( " %s saved in default encoding UTF-8: unknown encoding %s " ) ,
fileName . c_str ( ) ,
wideEncoding . c_str ( ) ) ;
messagePane ( message , CONST_WARNING ) ;
}
else
{
wxString message ;
message . Printf ( _ ( " Cannot save %s " ) , fileName . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
return false ;
}
}
else
{
size_t utf8BufferLen = utf8Buffer . size ( ) ;
size_t iconvBufferLen , iconvBufferLeft , utf8BufferLeft ;
int iconvLenMultiplier = 4 ; // worst case scenario
if ( encoding = = " UTF-16 " | |
encoding = = " UTF-16BE " | |
encoding = = " UTF-16LE " )
{
iconvLenMultiplier = 2 ;
}
else if ( encoding = = " UTF-32 " | |
encoding = = " UTF-32BE " | |
encoding = = " UTF-32LE " )
{
iconvLenMultiplier = 4 ;
}
iconvBufferLen = iconvBufferLeft =
utf8BufferLen * iconvLenMultiplier + 4 ; // worst case scenario
char * finalBuffer ;
2013-10-25 13:24:33 +02:00
char * iconvBuffer ;
2009-11-06 18:06:12 +01:00
utf8BufferLeft = utf8BufferLen ;
iconvBuffer = new char [ iconvBufferLen ] ;
finalBuffer = iconvBuffer ; // iconvBuffer will be incremented by iconv
size_t nconv ;
2012-08-09 13:22:21 +02:00
char * utf8BufferPtr = ( char * ) utf8Buffer . c_str ( ) ;
2009-11-06 18:06:12 +01:00
2012-08-11 12:47:16 +02:00
nconv = reinterpret_cast < universal_iconv & > ( iconv ) (
2009-11-06 18:06:12 +01:00
cd ,
& utf8BufferPtr ,
& utf8BufferLeft ,
& iconvBuffer ,
& iconvBufferLeft ) ;
iconv_close ( cd ) ;
if ( nconv = = ( size_t ) - 1 ) // conversion failed
{
delete [ ] finalBuffer ;
success = saveRawUtf8 ( fileNameLocal , utf8Buffer , false , isXml ) ;
if ( success )
{
bytes = utf8Buffer . size ( ) ;
wxString message ;
message . Printf (
_ ( " %s saved in default encoding UTF-8: conversion to %s failed " ) ,
fileName . c_str ( ) ,
wideEncoding . c_str ( ) ) ;
messagePane ( message , CONST_WARNING ) ;
}
else
{
wxString message ;
message . Printf ( _ ( " Cannot save %s " ) , fileName . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
return false ;
}
}
else
{
size_t finalBufferLen = iconvBufferLen - iconvBufferLeft ;
std : : ofstream ofs ( fileNameLocal . c_str ( ) , std : : ios : : out | std : : ios : : binary ) ;
if ( ! ofs )
{
delete [ ] finalBuffer ;
wxString message ;
message . Printf ( _ ( " Cannot save %s " ) , fileName . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
return false ;
}
// iconv adds boms for UTF-16 & UTF-32 automatically
ofs . write ( finalBuffer , finalBufferLen ) ;
ofs . close ( ) ;
delete [ ] finalBuffer ;
bytes = finalBufferLen ;
}
}
}
else // all other encodings handled by Libxml
{
XmlEncodingHandler : : setUtf8 ( utf8Buffer ) ;
auto_ptr < WrapLibxml > wl ( new WrapLibxml ( libxmlNetAccess ) ) ;
WrapTempFileName sourceFileName ( fileName ) ;
saveRawUtf8 ( sourceFileName . name ( ) , utf8Buffer ) ;
int result = wl - > saveEncodingFromFile ( sourceFileName . name ( ) , fileNameLocal , encoding ) ;
if ( result = = - 1 )
{
success = saveRawUtf8 ( fileNameLocal , utf8Buffer , false , isXml ) ;
if ( success )
{
std : : string libxmlError = wl - > getLastError ( ) ;
bytes = utf8Buffer . size ( ) ;
wxString msg , wideEncoding , wideError ;
wideEncoding =
wxString ( encoding . c_str ( ) , wxConvUTF8 , encoding . size ( ) ) ;
wideError = wxString ( libxmlError . c_str ( ) , wxConvUTF8 , libxmlError . size ( ) ) ;
if ( wideError . empty ( ) )
wideError = _ ( " unknown error " ) ;
msg . Printf ( _ ( " Cannot save document in %s: %s (saved in default encoding UTF-8) " ) ,
wideEncoding . c_str ( ) , wideError . c_str ( ) ) ;
messagePane ( msg , CONST_INFO ) ;
}
else
{
wxString message ;
message . Printf ( _ ( " Cannot save %s " ) , fileName . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
return false ;
}
}
else
bytes = result ;
}
}
} // try
catch ( std : : bad_alloc & )
{
if ( encoding ! = " UTF-8 " )
{
int answer = wxMessageBox (
_ ( " Out of memory: attempt to save in default encoding UTF-8? " ) ,
_ ( " Out of memory " ) ,
wxYES_NO | wxCANCEL | wxICON_QUESTION ,
this ) ;
if ( answer = = wxCANCEL | | answer = = wxNO )
return false ;
bool success = saveRawUtf8 ( fileNameLocal , utf8Buffer , true , isXml ) ;
if ( success )
{
bytes = utf8Buffer . size ( ) ;
wxString message ;
message . Printf (
_ ( " %s saved in default encoding UTF-8 " ) ,
fileName . c_str ( ) ) ;
messagePane ( message , CONST_INFO ) ;
}
else
{
wxString message ;
message . Printf ( _ ( " Cannot save %s " ) , fileName . c_str ( ) ) ;
messagePane ( message , CONST_STOP ) ;
return false ;
}
}
}
doc - > SetFocus ( ) ;
doc - > SetSavePoint ( ) ;
if ( properties . validateAsYouType & & isXml )
{
doc - > clearErrorIndicators ( ) ;
//doc->backgroundValidate ( utf8Buffer.c_str(), doc->getFullFileName().mb_str(wxConvUTF8), utf8Buffer.size() );
doc - > backgroundValidate ( ) ;
}
if ( ! unlimitedUndo )
doc - > EmptyUndoBuffer ( ) ;
wxFileName fn ( fileName ) ;
if ( fn . IsOk ( ) )
doc - > setLastModified ( fn . GetModificationTime ( ) ) ;
openFileSet . insert ( fileName ) ;
displaySavedStatus ( bytes ) ;
return true ;
}
bool MyFrame : : saveRawUtf8 (
const std : : string & fileNameLocal ,
std : : string & bufferUtf8 ,
bool ignoreEncoding ,
bool isXml )
{
ofstream ofs ( fileNameLocal . c_str ( ) , std : : ios : : out | std : : ios : : binary ) ;
if ( ! ofs )
return false ;
if ( ! ignoreEncoding & & isXml )
XmlEncodingHandler : : setUtf8 ( bufferUtf8 , true ) ;
if ( saveBom & & isXml )
{
char bom [ 4 ] ;
bom [ 0 ] = 0xEF ;
bom [ 1 ] = 0xBB ;
bom [ 2 ] = 0xBF ;
bom [ 3 ] = 0 ;
ofs . write ( bom , 3 ) ;
}
ofs . write ( bufferUtf8 . c_str ( ) , bufferUtf8 . size ( ) ) ;
ofs . close ( ) ;
return true ;
}
void MyFrame : : displaySavedStatus ( int bytes )
{
wxString unit ;
float result = 0 ;
if ( bytes > 1000000 )
{
result = bytes / 1000000 ;
unit = _ ( " MB " ) ;
}
else if ( bytes > 1000 )
{
result = bytes / 1000 ;
unit = _ ( " kB " ) ;
}
else if ( bytes > = 0 )
{
result = bytes ;
unit = ngettext ( L " byte " , L " bytes " , bytes ) ;
}
else
return ;
wxString msg ;
msg . Printf (
_ ( " %g %s saved " ) ,
result ,
unit . c_str ( ) ) ;
statusProgress ( msg ) ;
}
bool MyFrame : : getHandleCommandLineFlag ( )
{
return handleCommandLineFlag ;
}
wxMenuBar * MyFrame : : getMenuBar ( )
{
fileMenu = new wxMenu ; // use class-wide data member
updateFileMenu ( false ) ;
// edit menu
wxMenu * editMenu = new wxMenu ;
wxMenuItem * undoItem =
new wxMenuItem ( NULL , wxID_UNDO , _ ( " &Undo \t Ctrl+Z " ) , _ ( " Undo " ) ) ;
undoItem - > SetBitmap ( undo16Bitmap ) ;
wxMenuItem * redoItem =
new wxMenuItem ( NULL , wxID_REDO , _ ( " &Redo \t Ctrl+Y " ) , _ ( " Redo " ) ) ;
redoItem - > SetBitmap ( redo16Bitmap ) ;
wxMenuItem * cutItem =
new wxMenuItem ( NULL , wxID_CUT , _ ( " &Cut \t Ctrl+X " ) , _ ( " Cut " ) ) ;
cutItem - > SetBitmap ( cutBitmap ) ;
wxMenuItem * copyItem =
new wxMenuItem ( NULL , wxID_COPY , _ ( " C&opy \t Ctrl+C " ) , _ ( " Copy " ) ) ;
copyItem - > SetBitmap ( copyBitmap ) ;
wxMenuItem * pasteItem =
new wxMenuItem ( NULL , wxID_PASTE , _ ( " &Paste \t Ctrl+V " ) , _ ( " Paste " ) ) ;
pasteItem - > SetBitmap ( pasteBitmap ) ;
wxMenuItem * pasteNewDocumentItem =
new wxMenuItem (
NULL ,
ID_PASTE_NEW_DOCUMENT ,
_ ( " P&aste As New Document " ) ,
_ ( " Paste As New Document " ) ) ;
pasteNewDocumentItem - > SetBitmap ( wxNullBitmap ) ;
wxMenuItem * findItem =
new wxMenuItem ( NULL , ID_FIND , _ ( " &Find... \t Ctrl+F " ) , _ ( " Find... " ) ) ;
findItem - > SetBitmap ( searchBitmap ) ;
wxMenuItem * findAgainItem =
new wxMenuItem ( NULL , ID_FIND_AGAIN , _ ( " F&ind Again \t F3 " ) , _ ( " Find Again " ) ) ;
findAgainItem - > SetBitmap ( wxNullBitmap ) ;
wxMenuItem * replaceItem =
new wxMenuItem ( NULL , ID_REPLACE , _ ( " &Replace... \t Ctrl+R " ) , _ ( " Replace... " ) ) ;
replaceItem - > SetBitmap ( wxNullBitmap ) ;
wxMenuItem * globalReplaceItem =
new wxMenuItem (
NULL ,
ID_GLOBAL_REPLACE ,
_ ( " &Global Replace... \t Ctrl+Shift+R " ) ,
_ ( " Global Replace... " ) ) ;
globalReplaceItem - > SetBitmap ( wxNullBitmap ) ;
wxMenuItem * gotoItem =
new wxMenuItem ( NULL , ID_GOTO , _ ( " G&o To... \t Ctrl+G " ) , _ ( " Go To... " ) ) ;
gotoItem - > SetBitmap ( wxNullBitmap ) ;
editMenu - > Append ( undoItem ) ;
editMenu - > Append ( redoItem ) ;
editMenu - > AppendSeparator ( ) ;
editMenu - > Append ( cutItem ) ;
editMenu - > Append ( copyItem ) ;
editMenu - > Append ( pasteItem ) ;
editMenu - > Append ( pasteNewDocumentItem ) ;
editMenu - > AppendSeparator ( ) ;
editMenu - > Append ( findItem ) ;
editMenu - > Append ( findAgainItem ) ;
editMenu - > Append ( replaceItem ) ;
editMenu - > Append ( globalReplaceItem ) ;
editMenu - > AppendSeparator ( ) ;
editMenu - > Append ( gotoItem ) ;
# ifndef __WXMSW__
wxMenuItem * preferencesItem =
new wxMenuItem ( NULL , ID_OPTIONS , _ ( " Pr&eferences... " ) , _ ( " Preferences... " ) ) ;
editMenu - > AppendSeparator ( ) ;
editMenu - > Append ( preferencesItem ) ;
# endif
// font size menu
wxMenu * fontSizeMenu = new wxMenu ;
fontSizeMenu - > Append (
ID_FONT_LARGER , _ ( " Increase \t Ctrl+U " ) , _ ( " Increase " ) ) ;
fontSizeMenu - > Append (
ID_FONT_SMALLER , _ ( " Decrease \t Ctrl+D " ) , _ ( " Decrease " ) ) ;
fontSizeMenu - > AppendSeparator ( ) ;
fontSizeMenu - > Append ( ID_FONT_NORMAL , _ ( " Normal \t Ctrl+0 " ) , _ ( " Normal " ) ) ;
// color scheme menu
colorSchemeMenu = new wxMenu ;
colorSchemeMenu - > AppendRadioItem (
ID_COLOR_SCHEME_DEFAULT , _ ( " &Default " ) , _ ( " Default " ) ) ;
colorSchemeMenu - > AppendRadioItem (
ID_COLOR_SCHEME_REDUCED_GLARE ,
_ ( " &Blue background, white text " ) ,
_ ( " Blue background, white text " ) ) ;
colorSchemeMenu - > AppendRadioItem (
ID_COLOR_SCHEME_DEFAULT_BACKGROUND ,
_ ( " &Light " ) ,
_ ( " Light " ) ) ;
colorSchemeMenu - > AppendRadioItem (
ID_COLOR_SCHEME_NONE ,
_ ( " &None " ) ,
_ ( " None " ) ) ;
switch ( properties . colorScheme )
{
case COLOR_SCHEME_DEFAULT :
colorSchemeMenu - > Check ( ID_COLOR_SCHEME_DEFAULT , true ) ;
break ;
case COLOR_SCHEME_DEFAULT_BACKGROUND :
colorSchemeMenu - > Check ( ID_COLOR_SCHEME_DEFAULT_BACKGROUND , true ) ;
break ;
case COLOR_SCHEME_REDUCED_GLARE :
colorSchemeMenu - > Check ( ID_COLOR_SCHEME_REDUCED_GLARE , true ) ;
break ;
case COLOR_SCHEME_NONE :
colorSchemeMenu - > Check ( ID_COLOR_SCHEME_NONE , true ) ;
break ;
default :
break ;
}
/* WAIT FOR AUI LIBRARY TO SUPPORT THIS - currently always splits left
wxMenu * splitTabMenu = new wxMenu ;
splitTabMenu - > Append ( ID_SPLIT_TAB_TOP , _ ( " &Top " ) , _ ( " Top " ) ) ;
splitTabMenu - > Append ( ID_SPLIT_TAB_RIGHT , _ ( " &Right " ) , _ ( " Right " ) ) ;
splitTabMenu - > Append ( ID_SPLIT_TAB_BOTTOM , _ ( " &Bottom " ) , _ ( " Bottom " ) ) ;
splitTabMenu - > Append ( ID_SPLIT_TAB_LEFT , _ ( " &Left " ) , _ ( " Left " ) ) ;
*/
viewMenu = new wxMenu ; // use class-wide data member
viewMenu - > Append ( ID_PREVIOUS_DOCUMENT , _ ( " &Previous Document \t Ctrl+PgUp " ) , _ ( " Previous Document " ) ) ;
viewMenu - > Append ( ID_NEXT_DOCUMENT , _ ( " &Next Document \t Ctrl+PgDn " ) , _ ( " Next Document " ) ) ;
//viewMenu->Append ( wxID_ANY, _ ( "&Split Tab" ), splitTabMenu );
viewMenu - > Append ( ID_BROWSER , _ ( " &Browser \t Ctrl+B " ) , _ ( " Browser " ) ) ;
viewMenu - > AppendSeparator ( ) ;
viewMenu - > AppendRadioItem (
ID_SHOW_TAGS ,
_ ( " &Show Tags and Attributes \t Ctrl+T " ) , _ ( " Show Tags and Attributes " ) ) ;
viewMenu - > AppendRadioItem (
ID_HIDE_ATTRIBUTES ,
_ ( " &Hide Attributes Only \t Ctrl+Shift+A " ) , _ ( " Hide Attributes Only " ) ) ;
viewMenu - > AppendRadioItem (
ID_HIDE_TAGS ,
_ ( " H&ide Tags and Attributes \t Ctrl+Shift+T " ) , _ ( " Hide Tags and Attributes " ) ) ;
switch ( visibilityState )
{
case SHOW_TAGS :
viewMenu - > Check ( ID_SHOW_TAGS , true ) ;
break ;
case HIDE_TAGS :
viewMenu - > Check ( ID_HIDE_TAGS , true ) ;
break ;
case HIDE_ATTRIBUTES :
viewMenu - > Check ( ID_HIDE_ATTRIBUTES , true ) ;
break ;
default :
viewMenu - > Check ( ID_SHOW_TAGS , true ) ;
break ;
}
viewMenu - > AppendSeparator ( ) ;
viewMenu - > Append (
ID_TOGGLE_FOLD , _ ( " &Toggle Fold \t Ctrl+Alt+T " ) , _ ( " Toggle Fold " ) ) ;
viewMenu - > Append (
ID_FOLD_ALL , _ ( " &Fold Tags \t Ctrl+Shift+F " ) , _ ( " Fold Tags " ) ) ;
viewMenu - > Append (
ID_UNFOLD_ALL , _ ( " &Unfold Tags \t Ctrl+Shift+U " ) , _T ( " Unfold Tags " ) ) ;
viewMenu - > AppendSeparator ( ) ;
viewMenu - > AppendCheckItem (
ID_WRAP_WORDS , _ ( " &Wrap Words \t Ctrl+W " ) , _T ( " Wrap Words " ) ) ;
viewMenu - > Check ( ID_WRAP_WORDS , properties . wrap ) ;
viewMenu - > Append ( wxID_ANY , _ ( " &Color Scheme " ) , colorSchemeMenu ) ;
viewMenu - > Append ( wxID_ANY , _ ( " &Text Size " ) , fontSizeMenu ) ;
viewMenu - > AppendSeparator ( ) ;
viewMenu - > AppendCheckItem (
ID_LOCATION_PANE_VISIBLE ,
_ ( " S&how Current Element Pane " ) ,
_ ( " Show Current Element Pane " ) ) ;
viewMenu - > Check ( ID_LOCATION_PANE_VISIBLE , false ) ;
viewMenu - > AppendCheckItem (
ID_TOOLBAR_VISIBLE , _ ( " Sh&ow Toolbar " ) , _ ( " Show Toolbar " ) ) ;
viewMenu - > Check ( ID_TOOLBAR_VISIBLE , toolbarVisible ) ;
viewMenu - > Append (
ID_HIDE_PANE , _ ( " C&lose Message Pane \t Alt+C " ) , _ ( " Close Message Pane " ) ) ;
// insert menu
wxMenu * insertMenu = new wxMenu ;
insertMenu - > Append ( ID_INSERT_CHILD , _ ( " &Element... \t Ctrl+I " ) , _ ( " Element... " ) ) ;
insertMenu - > Append ( ID_INSERT_SIBLING , _ ( " &Sibling... \t Ctrl+Shift+I " ) , _ ( " Sibling... " ) ) ;
insertMenu - > Append ( ID_INSERT_ENTITY , _ ( " &Entity... \t Ctrl+E " ) , _ ( " Entity... " ) ) ;
insertMenu - > AppendSeparator ( ) ;
insertMenu - > Append ( ID_INSERT_TWIN , _ ( " &Twin \t Ctrl+Enter " ) , _ ( " Twin " ) ) ;
insertMenu - > AppendSeparator ( ) ;
insertMenu - > Append ( ID_INSERT_SYMBOL , _ ( " S&ymbol... " ) , _ ( " Symbol... " ) ) ;
// validation menu
wxMenu * validationMenu = new wxMenu ;
/*
validationMenu - > Append ( ID_VALIDATE_DTD , _ ( " &DTD \t F4 " ) , _ ( " DTD " ) ) ;
*/
validationMenu - > Append (
ID_VALIDATE_W3C_SCHEMA , _ ( " &DTD/XML Schema \t F5 " ) , _ ( " DTD/XML Schema " ) ) ;
validationMenu - > AppendSeparator ( ) ;
validationMenu - > Append (
ID_VALIDATE_RELAX_NG , _ ( " &RELAX NG... \t F6 " ) , _ ( " RELAX NG... " ) ) ;
wxMenu * associateMenu = new wxMenu ;
associateMenu - > Append ( ID_ASSOCIATE_DTD_PUBLIC , _ ( " &Public DTD... " ) , _ ( " Public DTD... " ) ) ;
associateMenu - > Append ( ID_ASSOCIATE_DTD_SYSTEM , _ ( " &System DTD... " ) , _ ( " System DTD... " ) ) ;
associateMenu - > Append ( ID_ASSOCIATE_W3C_SCHEMA , _ ( " &XML Schema... " ) , _ ( " XML Schema... " ) ) ;
associateMenu - > Append ( ID_ASSOCIATE_XSL , _ ( " XS< stylesheet... " ) , _ ( " XSLT stylesheet... " ) ) ;
2013-12-13 16:51:13 +01:00
if ( wxDirExists ( rngDir ) )
2009-11-06 18:06:12 +01:00
{
wxString rngMask , rngFile , displayName , shortcutString ;
rngMask = rngDir + wxFileName : : GetPathSeparator ( ) + _T ( " *.rng " ) ;
rngFile = wxFindFirstFile ( rngMask , wxFILE ) ;
int id = ID_VALIDATE_PRESET1 ;
if ( ! rngFile . empty ( ) )
{
validationPresetMap . insert ( make_pair ( id , rngFile ) ) ;
wxFileName : : SplitPath ( rngFile , NULL , NULL , & displayName , NULL ) ;
displayName . Replace ( _T ( " .rng " ) , _T ( " " ) ) ;
shortcutString . Printf ( _ ( " \t Ctrl+%i " ) , ( id - ID_VALIDATE_PRESET1 ) + 1 ) ;
validationMenu - > Append ( id , displayName + shortcutString , displayName ) ;
for ( id = ID_VALIDATE_PRESET2 ; id < = ID_VALIDATE_PRESET9 ; + + id )
{
rngFile = wxFindNextFile ( ) ;
if ( rngFile . empty ( ) )
break ;
validationPresetMap . insert ( make_pair ( id , rngFile ) ) ;
wxFileName : : SplitPath ( rngFile , NULL , NULL , & displayName , NULL ) ;
shortcutString . Printf ( _ ( " \t Ctrl+%i " ) , ( id - ID_VALIDATE_PRESET1 ) + 1 ) ;
displayName . Replace ( _T ( " .rng " ) , _T ( " " ) ) ;
validationMenu - > Append ( id , displayName + shortcutString , displayName ) ;
}
}
}
// xsl menu
/*
wxMenu * xslMenu = new wxMenu ;
xslMenu - > Append ( ID_XSLT , _ ( " &XSL Transform... \t F8 " ) ,
_ ( " XSL Transform... " ) ) ;
xslMenu - > AppendSeparator ( ) ;
xslMenu - > Append (
ID_XSLT_DOCBOOK_HTML ,
_ ( " &DocBook to HTML \t Alt+1 " ) , _ ( " DocBook to HTML " ) ) ;
xslMenu - > Append (
ID_XSLT_DOCBOOK_XHTML ,
_ ( " &DocBook to XHTML \t Alt+2 " ) , _ ( " DocBook to XHTML " ) ) ;
xslMenu - > Append (
ID_XSLT_DOCBOOK_FO ,
_ ( " D&ocBook to XSL-FO \t Alt+3 " ) , _ ( " DocBook to XSL-FO " ) ) ;
xslMenu - > Append (
ID_XSLT_TEI_HTML ,
_ ( " &TEI to HTML \t Alt+4 " ) , _ ( " TEI to HTML " ) ) ;
xslMenu - > Append (
ID_XSLT_TEI_LATEX ,
_ ( " T&EI to LaTeX \t Alt+5 " ) , _ ( " TEI to LaTeX " ) ) ;
xslMenu - > Append (
ID_XSLT_TEI_XHTML ,
_ ( " TE&I to XHTML \t Alt+6 " ) , _ ( " TEI to XHTML " ) ) ;
xslMenu - > Append (
ID_XSLT_TEI_FO ,
_ ( " TEI to &XSL-FO \t Alt+7 " ) , _ ( " TEI to XSL-FO " ) ) ;
*/
// xml menu
xmlMenu = new wxMenu ; // use class-wide data member
xmlMenu - > Append (
ID_CHECK_WELLFORMED ,
_ ( " &Check Well-formedness \t F2 " ) , _ ( " Check Well-formedness " ) ) ;
xmlMenu - > Append (
wxID_ANY ,
_ ( " &Validate " ) ,
validationMenu ) ;
2012-08-25 02:19:11 +02:00
xmlMenu - > Append ( ID_CREATE_SCHEMA , _ ( " Create &Schema... \t F10 " ) ,
2013-12-04 17:22:00 +01:00
_ ( " Create schema... " ) ) ;
xmlMenu - > Append ( ID_DTD_TO_SCHEMA , _ ( " DTD -> Schema... " ) ,
_ ( " DTD -> Schema... " ) ) ;
2009-11-06 18:06:12 +01:00
xmlMenu - > AppendSeparator ( ) ;
xmlMenu - > Append (
wxID_ANY ,
_ ( " &Associate " ) ,
associateMenu ) ;
xmlMenu - > AppendSeparator ( ) ;
xmlMenu - > Append ( ID_XSLT , _ ( " &XSL Transform... \t F8 " ) ,
_ ( " XSL Transform... " ) ) ;
xmlMenu - > Append (
ID_XPATH ,
_ ( " &Evaluate XPath... \t F9 " ) ,
_ ( " Evaluate XPath... " ) ) ;
xmlMenu - > AppendSeparator ( ) ;
xmlMenu - > Append (
ID_PRETTYPRINT ,
_ ( " &Pretty-print \t F11 " ) , _ ( " Pretty-print " ) ) ;
xmlMenu - > AppendSeparator ( ) ;
xmlMenu - > AppendCheckItem (
ID_PROTECT_TAGS ,
_ ( " &Lock Tags \t Ctrl+L " ) ,
_ ( " Lock Tags " ) ) ;
xmlMenu - > Check ( ID_PROTECT_TAGS , protectTags ) ;
xmlMenu - > AppendSeparator ( ) ;
xmlMenu - > Append (
ID_ENCODING ,
_ ( " E&ncoding... " ) , _ ( " Encoding... " ) ) ;
// tools menu
wxMenu * toolsMenu = new wxMenu ;
wxMenuItem * spellingItem =
new wxMenuItem (
NULL ,
ID_SPELL ,
_ ( " &Spelling... \t F7 " ) ,
_ ( " Spelling... " ) ) ;
spellingItem - > SetBitmap ( spelling16Bitmap ) ;
2012-08-18 17:41:27 +02:00
2009-11-06 18:06:12 +01:00
wxMenuItem * styleItem =
new wxMenuItem (
NULL ,
ID_STYLE ,
_ ( " &Style... \t Shift+F7 " ) ,
_ ( " Style... " ) ) ;
styleItem - > SetBitmap ( wxNullBitmap ) ;
wxMenuItem * wordCountItem =
new wxMenuItem (
NULL ,
ID_WORD_COUNT ,
_ ( " &Word Count " ) ,
_ ( " Word Count " ) ) ;
wordCountItem - > SetBitmap ( wxNullBitmap ) ;
2012-08-18 17:41:27 +02:00
2009-11-06 18:06:12 +01:00
wxMenuItem * commandItem =
new wxMenuItem (
NULL ,
ID_COMMAND ,
_ ( " &Command \t Ctrl+Alt+C " ) ,
_ ( " Command " ) ) ;
commandItem - > SetBitmap ( wxNullBitmap ) ;
toolsMenu - > Append ( spellingItem ) ;
toolsMenu - > Append ( styleItem ) ;
toolsMenu - > Append ( wordCountItem ) ;
toolsMenu - > AppendSeparator ( ) ;
toolsMenu - > Append ( commandItem ) ;
# ifdef __WXMSW__
toolsMenu - > AppendSeparator ( ) ;
wxMenuItem * optionsItem =
new wxMenuItem (
NULL ,
ID_OPTIONS ,
_ ( " &Options... " ) ,
_ ( " Options... " ) ) ;
optionsItem - > SetBitmap ( wxNullBitmap ) ;
toolsMenu - > Append ( optionsItem ) ;
# endif
// help menu
wxMenu * helpMenu = new wxMenu ;
wxMenuItem * helpItem =
new wxMenuItem ( NULL , wxID_HELP ,
_ ( " &XML Copy Editor Help \t F1 " ) , _ ( " Help " ) ) ;
helpItem - > SetBitmap ( helpBitmap ) ;
2012-08-18 17:41:27 +02:00
2009-11-06 18:06:12 +01:00
wxMenuItem * homeItem =
new wxMenuItem ( NULL , ID_HOME ,
_ ( " &Home Page " ) , _ ( " Home Page " ) ) ;
homeItem - > SetBitmap ( wxNullBitmap ) ;
wxMenuItem * feedbackItem =
new wxMenuItem ( NULL , ID_FEEDBACK , _ ( " &Forum " ) , _ ( " Forum " ) ) ;
feedbackItem - > SetBitmap ( wxNullBitmap ) ;
wxMenuItem * aboutItem =
new wxMenuItem ( NULL , wxID_ABOUT ,
_ ( " &About XML Copy Editor " ) , _ ( " About " ) ) ;
aboutItem - > SetBitmap ( wxNullBitmap ) ;
wxMenuItem * downloadSourceItem =
new wxMenuItem ( NULL , ID_DOWNLOAD_SOURCE ,
_ ( " &Browse Source " ) , _ ( " Browse Source " ) ) ;
downloadSourceItem - > SetBitmap ( wxNullBitmap ) ;
helpMenu - > Append ( helpItem ) ;
2012-08-18 17:41:27 +02:00
2009-11-06 18:06:12 +01:00
helpMenu - > AppendSeparator ( ) ;
helpMenu - > Append ( homeItem ) ;
helpMenu - > Append ( feedbackItem ) ;
helpMenu - > Append ( downloadSourceItem ) ;
helpMenu - > AppendSeparator ( ) ;
helpMenu - > Append ( aboutItem ) ;
wxMenuBar * menuBar = new wxMenuBar ( wxMB_DOCKABLE ) ;
menuBar - > Append ( fileMenu , _ ( " &File " ) ) ;
menuBar - > Append ( editMenu , _ ( " &Edit " ) ) ;
menuBar - > Append ( viewMenu , _ ( " &View " ) ) ;
menuBar - > Append ( insertMenu , _ ( " &Insert " ) ) ;
menuBar - > Append ( xmlMenu , _ ( " &XML " ) ) ;
menuBar - > Append ( toolsMenu , _ ( " &Tools " ) ) ;
menuBar - > Append ( helpMenu , _ ( " &Help " ) ) ;
return menuBar ;
}
void MyFrame : : updateFileMenu ( bool deleteExisting )
{
if ( deleteExisting )
{
wxMenuItemList list = fileMenu - > GetMenuItems ( ) ;
size_t count = list . size ( ) ;
for ( size_t i = 0 ; i < count ; + + i )
fileMenu - > Delete ( list [ i ] ) ;
}
wxMenuItem * newItem =
new wxMenuItem ( NULL , wxID_NEW , _ ( " &New... \t Ctrl+N " ) , _ ( " New... " ) ) ;
newItem - > SetBitmap ( new16Bitmap ) ;
wxMenuItem * openItem =
new wxMenuItem ( NULL , wxID_OPEN , _ ( " &Open... \t Ctrl+O " ) , _ ( " Open... " ) ) ;
openItem - > SetBitmap ( open16Bitmap ) ;
wxMenuItem * openLargeFileItem =
new wxMenuItem ( NULL , ID_OPEN_LARGE_FILE ,
_ ( " O&pen Large Document... \t Ctrl+Shift+O " ) , _ ( " Open Large Document... " ) ) ;
openLargeFileItem - > SetBitmap ( wxNullBitmap ) ;
wxMenuItem * closeItem =
new wxMenuItem ( NULL , wxID_CLOSE , _ ( " &Close \t Ctrl+F4 " ) , _ ( " Close " ) ) ;
closeItem - > SetBitmap ( wxNullBitmap ) ;
wxMenuItem * closeAllItem =
new wxMenuItem ( NULL , wxID_CLOSE_ALL , _ ( " C&lose All " ) , _ ( " Close All " ) ) ;
closeAllItem - > SetBitmap ( wxNullBitmap ) ;
wxMenuItem * saveItem =
new wxMenuItem ( NULL , wxID_SAVE , _ ( " &Save \t Ctrl+S " ) , _ ( " Save " ) ) ;
saveItem - > SetBitmap ( save16Bitmap ) ;
wxMenuItem * saveAsItem =
new wxMenuItem ( NULL , wxID_SAVEAS , _ ( " S&ave As... \t F12 " ) , _ ( " Save As... " ) ) ;
saveAsItem - > SetBitmap ( wxNullBitmap ) ;
2009-12-01 14:33:22 +01:00
# ifdef __WXMSW__
2009-11-06 18:06:12 +01:00
wxMenuItem * exportItem =
new wxMenuItem ( NULL , ID_EXPORT , _ ( " &DAISY Export... " ) , _ ( " DAISY Export... " ) ) ;
exportItem - > SetBitmap ( wxNullBitmap ) ;
2009-12-01 14:33:22 +01:00
# endif
2009-11-06 18:06:12 +01:00
wxMenuItem * reloadItem =
new wxMenuItem ( NULL , ID_RELOAD , _ ( " &Reload " ) , _ ( " Reload " ) ) ;
reloadItem - > SetBitmap ( wxNullBitmap ) ;
wxMenuItem * revertItem =
new wxMenuItem ( NULL , wxID_REVERT , _ ( " &Revert " ) , _ ( " Revert " ) ) ;
revertItem - > SetBitmap ( wxNullBitmap ) ;
wxMenuItem * printSetupItem =
new wxMenuItem ( NULL , ID_PRINT_SETUP , _ ( " Pa&ge Setup... " ) , _ ( " Page Setup... " ) ) ;
printSetupItem - > SetBitmap ( wxNullBitmap ) ;
wxMenuItem * printPreviewItem =
new wxMenuItem ( NULL , ID_PRINT_PREVIEW , _ ( " Pr&int Preview... " ) , _ ( " Print Preview... " ) ) ;
printPreviewItem - > SetBitmap ( printPreviewBitmap ) ;
wxMenuItem * printItem =
new wxMenuItem ( NULL , ID_PRINT , _ ( " Pri&nt... \t Ctrl+P " ) , _ ( " Print... " ) ) ;
printItem - > SetBitmap ( print16Bitmap ) ;
wxMenuItem * importMSWordItem =
new wxMenuItem (
NULL , ID_IMPORT_MSWORD , _ ( " I&mport Microsoft Word Document... " ) ) ;
importMSWordItem - > SetBitmap ( wxNullBitmap ) ;
wxMenuItem * exportMSWordItem =
new wxMenuItem (
NULL , ID_EXPORT_MSWORD , _ ( " Expor&t Microsoft Word Document... " ) ) ;
exportMSWordItem - > SetBitmap ( wxNullBitmap ) ;
wxMenuItem * exitItem =
new wxMenuItem ( NULL , wxID_EXIT , _ ( " E&xit " ) , _ ( " Exit " ) ) ;
exitItem - > SetBitmap ( wxNullBitmap ) ;
fileMenu - > Append ( newItem ) ;
fileMenu - > Append ( openItem ) ;
fileMenu - > Append ( openLargeFileItem ) ;
fileMenu - > AppendSeparator ( ) ;
fileMenu - > Append ( closeItem ) ;
fileMenu - > Append ( closeAllItem ) ;
fileMenu - > Append ( saveItem ) ;
fileMenu - > Append ( saveAsItem ) ;
fileMenu - > AppendSeparator ( ) ;
fileMenu - > Append ( reloadItem ) ;
fileMenu - > Append ( revertItem ) ;
fileMenu - > AppendSeparator ( ) ;
fileMenu - > Append ( printSetupItem ) ;
fileMenu - > Append ( printPreviewItem ) ;
fileMenu - > Append ( printItem ) ;
2009-12-01 14:33:22 +01:00
# ifdef __WXMSW__
2009-11-06 18:06:12 +01:00
fileMenu - > AppendSeparator ( ) ;
fileMenu - > Append ( exportItem ) ;
fileMenu - > Append ( importMSWordItem ) ;
fileMenu - > Append ( exportMSWordItem ) ;
# endif
history . AddFilesToMenu ( fileMenu ) ;
2012-08-18 17:41:27 +02:00
2009-11-06 18:06:12 +01:00
fileMenu - > AppendSeparator ( ) ;
fileMenu - > Append ( exitItem ) ;
}
wxToolBar * MyFrame : : getToolBar ( )
{
wxToolBar * toolBar = new wxToolBar (
this ,
ID_TOOLBAR ,
wxDefaultPosition ,
wxDefaultSize ,
wxTB_FLAT |
wxTB_HORIZONTAL |
wxTB_DOCKABLE ) ;
int w , h ;
w = saveBitmap . GetWidth ( ) , h = saveBitmap . GetHeight ( ) ;
toolBar - > SetToolBitmapSize ( wxSize ( w , h ) ) ;
toolBar - > AddTool (
wxID_NEW ,
_ ( " New " ) ,
newBitmap ,
_ ( " New " ) ) ;
toolBar - > AddTool (
wxID_OPEN ,
_ ( " Open " ) ,
openBitmap ,
_ ( " Open " ) ) ;
toolBar - > AddTool (
wxID_SAVE ,
_ ( " Save " ) ,
saveBitmap ,
wxNullBitmap ,
wxITEM_NORMAL ,
_ ( " Save " ) ) ;
toolBar - > AddTool (
ID_PRINT ,
_ ( " Print " ) ,
printBitmap ,
wxNullBitmap ,
wxITEM_NORMAL ,
_ ( " Print " ) ) ;
toolBar - > AddTool (
ID_CHECK_WELLFORMED ,
_ ( " Check Well-formedness " ) ,
checkWellformedBitmap ,
wxNullBitmap ,
wxITEM_NORMAL ,
_ ( " Check Well-formedness " ) ) ;
toolBar - > AddTool (
ID_VALIDATE_W3C_SCHEMA ,
_ ( " Validate " ) ,
checkValidBitmap ,
wxNullBitmap ,
wxITEM_NORMAL ,
_ ( " Validate " ) ) ;
toolBar - > AddTool (
ID_BROWSER ,
_ ( " Browser " ) ,
internetBitmap ,
wxNullBitmap ,
wxITEM_NORMAL ,
_ ( " Browser " ) ) ;
toolBar - > AddTool (
ID_SPELL ,
_ ( " Spelling " ) ,
spellingBitmap ,
wxNullBitmap ,
wxITEM_NORMAL ,
_ ( " Spelling " ) ) ;
toolBar - > AddCheckTool (
ID_PROTECT_TAGS ,
_ ( " Lock Tags " ) ,
hyperlinkBitmap ,
wxNullBitmap ,
_ ( " Lock Tags " ) ) ;
toolBar - > ToggleTool (
ID_PROTECT_TAGS , protectTags ) ;
toolBar - > Realize ( ) ;
return toolBar ;
}
XmlDoc * MyFrame : : getActiveDocument ( )
{
if ( ! mainBook - > GetPageCount ( ) )
return NULL ;
return ( XmlDoc * ) mainBook - > GetPage ( mainBook - > GetSelection ( ) ) ;
}
void MyFrame : : addSafeSeparator ( wxToolBar * toolBar )
{
wxStaticText * staticControl = new wxStaticText (
toolBar ,
wxID_ANY ,
_T ( " " ) ) ;
toolBar - > AddControl ( staticControl ) ;
}
void MyFrame : : statusProgress ( const wxString & s )
{
wxStatusBar * status = GetStatusBar ( ) ;
if ( ! status )
return ;
status - > SetStatusText ( s , 0 ) ;
}
void MyFrame : : messagePane ( const wxString & s , int iconType , bool forcePane )
{
statusProgress ( wxEmptyString ) ;
wxString paneTitle ;
switch ( iconType )
{
case ( CONST_INFO ) :
paneTitle = _ ( " Information " ) ;
break ;
case ( CONST_WARNING ) :
paneTitle = _ ( " Warning " ) ;
break ;
case ( CONST_STOP ) :
paneTitle = _ ( " Stopped " ) ;
break ;
case ( CONST_QUESTION ) :
paneTitle = _ ( " Question " ) ;
break ;
default :
paneTitle = _ ( " Message " ) ;
break ;
}
wxAuiPaneInfo info = manager . GetPane ( htmlReport ) ;
if ( ! info . IsShown ( ) )
{
manager . GetPane ( htmlReport ) . Show ( true ) ;
manager . Update ( ) ;
}
manager . GetPane ( htmlReport ) . Caption ( paneTitle ) ;
wxString htmlString = s ;
htmlString . Replace ( _T ( " & " ) , _T ( " & " ) , true ) ;
htmlString . Replace ( _T ( " < " ) , _T ( " < " ) , true ) ;
htmlString . Replace ( _T ( " > " ) , _T ( " > " ) , true ) ;
2013-12-04 17:22:00 +01:00
// have to use <br> on Ubuntu
htmlString . Replace ( _T ( " [br] " ) , _T ( " <br> " ) , true ) ;
htmlString . Replace ( _T ( " [br/] " ) , _T ( " <br/> " ) , true ) ;
htmlString . Replace ( _T ( " [b] " ) , _T ( " <b> " ) , true ) ;
htmlString . Replace ( _T ( " [/b] " ) , _T ( " </b> " ) , true ) ;
htmlString . Replace ( _T ( " [i] " ) , _T ( " <i> " ) , true ) ;
htmlString . Replace ( _T ( " [/i] " ) , _T ( " </i> " ) , true ) ;
2009-11-06 18:06:12 +01:00
wxString htmlBuffer ;
htmlBuffer + = _T ( " <html><body><table><tr><td width= \" 5% \" ><img src= \" " ) ;
switch ( iconType )
{
case ( CONST_INFO ) :
htmlBuffer + = pngDir ;
htmlBuffer + = _T ( " stock_dialog-info-32.png " ) ;
break ;
case ( CONST_WARNING ) :
htmlBuffer + = pngDir ;
htmlBuffer + = _T ( " stock_dialog-warning-32.png " ) ;
break ;
case ( CONST_STOP ) :
htmlBuffer + = pngDir ;
htmlBuffer + = _T ( " stock_dialog-stop-32.png " ) ;
break ;
case ( CONST_QUESTION ) :
htmlBuffer + = pngDir ;
htmlBuffer + = _T ( " stock_dialog-question-32.png " ) ;
break ;
default :
break ;
}
htmlBuffer + = _T ( " \" ></td><td width= \" 95% \" > " ) ;
htmlBuffer + = htmlString ;
htmlBuffer + = _T ( " </td></tr></table></body></html> " ) ;
htmlReport - > SetPage ( htmlBuffer ) ;
manager . Update ( ) ;
}
void MyFrame : : documentOk ( const wxString & status )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
wxString message ;
message . Printf ( _ ( " %s is %s " ) ,
doc - > getShortFileName ( ) . c_str ( ) ,
status . c_str ( ) ) ;
messagePane ( message , CONST_INFO ) ;
}
void MyFrame : : applyEditorProperties ( bool zoomOnly )
{
XmlDoc * doc ;
size_t documentCount = mainBook - > GetPageCount ( ) ;
for ( size_t i = 0 ; i < documentCount ; i + + )
{
doc = ( XmlDoc * ) mainBook - > GetPage ( i ) ;
if ( doc )
{
doc - > applyProperties ( properties , zoomOnly ) ;
if ( ! properties . validateAsYouType )
doc - > clearErrorIndicators ( ) ;
}
}
}
void MyFrame : : modifiedMessage ( )
{
messagePane (
_ ( " Document has been modified: save or discard changes " ) ,
CONST_STOP ) ;
}
void MyFrame : : xmliseWideTextNode ( wxString & s )
{
s . Replace ( _T ( " & " ) , _T ( " & " ) , true ) ;
s . Replace ( _T ( " < " ) , _T ( " < " ) , true ) ;
s . Replace ( _T ( " > " ) , _T ( " > " ) , true ) ;
}
int MyFrame : : getFileType ( const wxString & fileName )
{
2012-08-11 16:41:00 +02:00
wxString extension ;
wxFileName : : SplitPath ( fileName , NULL /*Path*/ , NULL /*Name*/ , & extension ) ;
if ( extension . size ( ) ! = 3 )
return FILE_TYPE_XML ;
extension . MakeLower ( ) ;
2009-11-06 18:06:12 +01:00
2012-08-11 16:41:00 +02:00
if ( extension = = _T ( " dtd " ) | | extension = = _T ( " ent " ) )
2009-11-06 18:06:12 +01:00
return FILE_TYPE_DTD ;
2012-08-11 16:41:00 +02:00
else if ( extension = = _T ( " css " ) )
2009-11-06 18:06:12 +01:00
return FILE_TYPE_CSS ;
2012-08-11 16:41:00 +02:00
else if ( extension = = _T ( " php " ) )
2009-11-06 18:06:12 +01:00
return FILE_TYPE_PHP ;
2012-08-11 16:41:00 +02:00
else if ( extension = = _T ( " exe " ) )
2009-11-06 18:06:12 +01:00
return FILE_TYPE_BINARY ;
2012-08-11 16:41:00 +02:00
else if ( extension = = _T ( " rnc " ) )
2009-11-06 18:06:12 +01:00
return FILE_TYPE_RNC ;
return FILE_TYPE_XML ;
}
long MyFrame : : getNotebookStyleMask ( )
{
/*
if ( notebookStyleMenu - > IsChecked ( ID_NOTEBOOK_STYLE_FLAT ) )
return wxFNB_FANCY_TABS | wxFNB_MOUSE_MIDDLE_CLOSES_TABS | wxFNB_X_ON_TAB ;
else if ( notebookStyleMenu - > IsChecked ( ID_NOTEBOOK_STYLE_VC8 ) )
return wxFNB_BACKGROUND_GRADIENT | wxFNB_VC8 | wxFNB_MOUSE_MIDDLE_CLOSES_TABS |
wxFNB_X_ON_TAB | wxFNB_DROPDOWN_TABS_LIST | wxFNB_NO_NAV_BUTTONS ;
else
return wxFNB_BACKGROUND_GRADIENT | wxFNB_VC8 | wxFNB_MOUSE_MIDDLE_CLOSES_TABS | wxFNB_COLORFUL_TABS |
wxFNB_X_ON_TAB | wxFNB_DROPDOWN_TABS_LIST | wxFNB_NO_NAV_BUTTONS ;
//wxFNB_BACKGROUND_GRADIENT | wxFNB_VC8 | wxFNB_MOUSE_MIDDLE_CLOSES_TABS | wxFNB_COLORFUL_TABS;
*/
return 0 ;
}
bool MyFrame : : isSpecialFileType ( const wxString & fileName )
{
std : : string fileNameLocal , fileNameLocalLC ;
fileNameLocal = fileName . mb_str ( wxConvLocal ) ;
fileNameLocalLC = CaseHandler : : lowerCase ( fileNameLocal ) ;
return (
fileNameLocalLC . find ( " .dtd " ) ! = std : : string : : npos | |
fileNameLocalLC . find ( " .css " ) ! = std : : string : : npos | |
fileNameLocalLC . find ( " .php " ) ! = std : : string : : npos ) ;
}
void MyFrame : : encodingMessage ( )
{
wxString msg = _ ( " Encoding should be one of " ) ;
msg + = ENCODING_INFO ;
messagePane ( msg , CONST_STOP ) ;
}
void MyFrame : : updatePaths ( )
{
ruleSetDir = applicationDir + wxFileName : : GetPathSeparator ( ) + _T ( " rulesets " ) ;
filterDir = applicationDir + wxFileName : : GetPathSeparator ( ) + _T ( " filters " ) ;
templateDir = applicationDir + wxFileName : : GetPathSeparator ( ) + _T ( " templates " ) +
wxFileName : : GetPathSeparator ( ) ;
binDir = applicationDir + wxFileName : : GetPathSeparator ( ) + _T ( " bin " ) +
wxFileName : : GetPathSeparator ( ) ;
helpDir = applicationDir + wxFileName : : GetPathSeparator ( ) + _T ( " help " ) +
wxFileName : : GetPathSeparator ( ) ;
rngDir = applicationDir + wxFileName : : GetPathSeparator ( ) + _T ( " rng " ) +
wxFileName : : GetPathSeparator ( ) ;
htmlDir = applicationDir + wxFileName : : GetPathSeparator ( ) + _T ( " html " ) +
wxFileName : : GetPathSeparator ( ) ;
pngDir = applicationDir + wxFileName : : GetPathSeparator ( ) + _T ( " png " ) +
wxFileName : : GetPathSeparator ( ) ;
daisyDir = applicationDir + wxFileName : : GetPathSeparator ( ) + _T ( " daisy " ) +
wxFileName : : GetPathSeparator ( ) ;
2013-10-19 18:05:44 +02:00
catalogPath =
2009-11-06 18:06:12 +01:00
applicationDir + wxFileName : : GetPathSeparator ( ) + _T ( " catalog " ) +
wxFileName : : GetPathSeparator ( ) + _T ( " catalog " ) ;
2013-10-19 18:05:44 +02:00
xslDtdPath =
2009-11-06 18:06:12 +01:00
applicationDir + wxFileName : : GetPathSeparator ( ) + _T ( " dtd " ) +
wxFileName : : GetPathSeparator ( ) + _T ( " xslt10.dtd " ) ;
2013-10-19 18:05:44 +02:00
rssDtdPath =
2009-11-06 18:06:12 +01:00
applicationDir + wxFileName : : GetPathSeparator ( ) + _T ( " dtd " ) +
wxFileName : : GetPathSeparator ( ) + _T ( " rss2.dtd " ) ;
2013-10-19 18:05:44 +02:00
xtmDtdPath =
2009-11-06 18:06:12 +01:00
applicationDir + wxFileName : : GetPathSeparator ( ) + _T ( " dtd " ) +
wxFileName : : GetPathSeparator ( ) + _T ( " xtm1.dtd " ) ;
2013-10-19 18:05:44 +02:00
lzxDtdPath =
2009-11-06 18:06:12 +01:00
applicationDir + wxFileName : : GetPathSeparator ( ) + _T ( " dtd " ) +
wxFileName : : GetPathSeparator ( ) + _T ( " lzx.dtd " ) ;
2013-10-19 18:05:44 +02:00
xliffDtdPath =
2009-11-06 18:06:12 +01:00
applicationDir + wxFileName : : GetPathSeparator ( ) + _T ( " dtd " ) +
wxFileName : : GetPathSeparator ( ) + _T ( " xliff.dtd " ) ;
2013-10-19 18:05:44 +02:00
aspellDataPath = applicationDir + wxFileName : : GetPathSeparator ( ) +
2009-11-06 18:06:12 +01:00
_T ( " aspell " ) + wxFileName : : GetPathSeparator ( ) + _T ( " data " ) ;
2013-10-19 18:05:44 +02:00
aspellDictPath = applicationDir + wxFileName : : GetPathSeparator ( ) +
2009-11-06 18:06:12 +01:00
_T ( " aspell " ) + wxFileName : : GetPathSeparator ( ) + _T ( " dict " ) ;
}
void MyFrame : : OnAssociate ( wxCommandEvent & event )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
wxString title , label , type , extension , path , defaulturl , defaultaux ;
wxString auxiliaryLabel ;
int id = event . GetId ( ) ;
switch ( id )
{
case ID_ASSOCIATE_DTD_PUBLIC :
type = _ ( " Public DTD " ) ;
extension = _T ( " *.dtd " ) ;
defaulturl = lastDtdPublic ;
defaultaux = lastDtdPublicAux ;
break ;
case ID_ASSOCIATE_DTD_SYSTEM :
type = _ ( " System DTD " ) ;
extension = _T ( " *.dtd " ) ;
defaulturl = lastDtdSystem ;
defaultaux = _T ( " " ) ;
break ;
case ID_ASSOCIATE_W3C_SCHEMA :
type = _ ( " XML Schema " ) ;
extension = _T ( " *.xsd " ) ;
defaulturl = lastSchema ;
defaultaux = _T ( " " ) ;
break ;
case ID_ASSOCIATE_XSL :
type = _ ( " XSLT stylesheet " ) ;
extension = _T ( " *.xsl;*.xslt " ) ;
defaulturl = lastXslStylesheet ;
defaultaux = _T ( " " ) ;
break ;
default :
return ;
}
std : : string utf8Buffer ;
getRawText ( doc , utf8Buffer ) ;
2012-08-09 15:31:10 +02:00
std : : string origEncoding = XmlEncodingHandler : : get ( utf8Buffer ) ;
XmlEncodingHandler : : setUtf8 ( utf8Buffer , true ) ;
2009-11-06 18:06:12 +01:00
std : : auto_ptr < WrapExpat > wellformedparser ( new WrapExpat ( ) ) ;
2012-08-10 14:42:59 +02:00
if ( ! wellformedparser - > parse ( utf8Buffer ) )
2009-11-06 18:06:12 +01:00
{
wxString message ;
message . Printf (
_ ( " Cannot associate %s: %s " ) ,
type . c_str ( ) ,
2012-08-18 17:41:27 +02:00
wellformedparser - > getLastError ( ) . c_str ( ) ) ;
2012-08-10 15:34:13 +02:00
messagePane ( message , CONST_STOP ) ;
2009-11-06 18:06:12 +01:00
return ;
}
title . Printf ( _ ( " Associate %s " ) , type . c_str ( ) ) ;
label = _ ( " Choose a file: " ) ;
bool auxiliaryBox =
( id = = ID_ASSOCIATE_DTD_PUBLIC ) ;
//(id == ID_ASSOCIATE_W3C_SCHEMA_NS || id == ID_ASSOCIATE_DTD_PUBLIC);
if ( auxiliaryBox )
{
auxiliaryLabel = _ ( " Choose a public identifier: " ) ;
/*
( id = = ID_ASSOCIATE_DTD_PUBLIC ) ? _ ( " Choose a public identifier: " ) :
_ ( " Choose a namespace: " ) ;
*/
}
AssociateDialog ad (
this ,
title ,
label ,
type ,
extension ,
defaulturl ,
auxiliaryBox ,
auxiliaryLabel ,
defaultaux ) ;
if ( ad . ShowModal ( ) ! = wxID_OK )
return ;
path = ad . getUrl ( ) ;
wxString aux , schemaPathMemory ;
if ( auxiliaryBox )
{
aux = ad . getAux ( ) ;
}
std : : string utf8Path = ( const char * ) path . mb_str ( wxConvUTF8 ) ;
std : : string modifiedBuffer ;
// remember choice
switch ( id )
{
case ID_ASSOCIATE_W3C_SCHEMA :
lastSchema = path ;
break ;
case ID_ASSOCIATE_DTD_PUBLIC :
lastDtdPublic = path ;
lastDtdPublicAux = aux ;
break ;
case ID_ASSOCIATE_DTD_SYSTEM :
lastDtdSystem = path ;
break ;
case ID_ASSOCIATE_XSL :
lastXslStylesheet = path ;
break ;
default :
break ;
}
if ( id = = ID_ASSOCIATE_W3C_SCHEMA )
{
std : : auto_ptr < XmlAssociateXsd > parser ( new XmlAssociateXsd ( utf8Path ) ) ;
if ( ! parser - > parse ( utf8Buffer ) )
return ;
modifiedBuffer = parser - > getBuffer ( ) ;
}
else if ( id = = ID_ASSOCIATE_DTD_SYSTEM | | id = = ID_ASSOCIATE_DTD_PUBLIC )
{
std : : auto_ptr < XmlAssociateDtd > parser ( new XmlAssociateDtd (
utf8Path ,
( auxiliaryBox ) ? ( const char * ) aux . mb_str ( wxConvUTF8 ) : " " ) ) ;
if ( ! parser - > parse ( utf8Buffer ) )
return ;
modifiedBuffer = parser - > getBuffer ( ) ;
}
else if ( id = = ID_ASSOCIATE_XSL )
{
std : : auto_ptr < XmlAssociateXsl > parser ( new XmlAssociateXsl (
utf8Path ) ) ;
if ( ! parser - > parse ( utf8Buffer ) )
return ;
modifiedBuffer = parser - > getBuffer ( ) ;
}
else
return ;
2012-08-09 15:31:10 +02:00
XmlEncodingHandler : : set ( modifiedBuffer , origEncoding ) ;
2009-11-06 18:06:12 +01:00
doc - > SetTextRaw ( modifiedBuffer . c_str ( ) ) ;
doc - > SetFocus ( ) ;
}
void MyFrame : : openRememberedTabs ( )
{
2012-08-18 17:41:27 +02:00
wxStringTokenizer files ( openTabsOnClose , _T ( " | " ) ) ;
while ( files . HasMoreTokens ( ) )
2009-11-06 18:06:12 +01:00
{
2012-08-18 17:41:27 +02:00
wxString file = files . GetNextToken ( ) ;
if ( file . IsEmpty ( ) | | ! openFile ( file ) )
2012-08-09 14:40:32 +02:00
continue ; //break; // Ignore errors
2009-11-06 18:06:12 +01:00
}
2012-08-18 17:41:27 +02:00
2009-11-06 18:06:12 +01:00
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) ! = NULL )
doc - > SetFocus ( ) ;
}
void MyFrame : : getRawText ( XmlDoc * doc , std : : string & buffer )
{
if ( ! doc )
{
buffer = " " ;
return ;
}
buffer = doc - > myGetTextRaw ( ) ;
}
void MyFrame : : OnWordCount ( wxCommandEvent & event )
{
XmlDoc * doc ;
if ( ( doc = getActiveDocument ( ) ) = = NULL )
return ;
wxString wideBuffer ;
std : : string buffer ;
wideBuffer = doc - > GetText ( ) ;
buffer = wideBuffer . mb_str ( wxConvUTF8 ) ;
auto_ptr < XmlWordCount > xwc ( new XmlWordCount ( ) ) ;
wxString msg ;
if ( ! xwc - > parse ( buffer . c_str ( ) ) )
{
statusProgress ( wxEmptyString ) ;
2012-08-18 17:41:27 +02:00
msg . Printf ( _ ( " Cannot count words: %s " ) , xwc - > getLastError ( ) . c_str ( ) ) ;
2009-11-06 18:06:12 +01:00
messagePane ( msg , CONST_STOP ) ;
return ;
}
int count = xwc - > getWordCount ( ) ;
msg . Printf (
ngettext ( L " %s contains %i word " , L " %s contains %i words " , count ) ,
doc - > getShortFileName ( ) . c_str ( ) , count ) ;
messagePane ( msg , CONST_INFO , true ) ;
doc - > SetFocus ( ) ;
}
void MyFrame : : removeUtf8Bom ( std : : string & buffer )
{
if ( buffer . size ( ) > 3 & &
( unsigned char ) buffer [ 0 ] = = 0xEF & &
( unsigned char ) buffer [ 1 ] = = 0xBB & &
( unsigned char ) buffer [ 2 ] = = 0xBF )
{
buffer . erase ( 0 , 3 ) ;
}
}
void MyFrame : : loadBitmaps ( )
{
# ifdef __WXMSW__
// toolbar icons
newBitmap = wxBITMAP ( stock_new ) ;
openBitmap = wxBITMAP ( stock_open ) ;
saveBitmap = wxBITMAP ( stock_save ) ;
printBitmap = wxBITMAP ( stock_print ) ;
spellingBitmap = wxBITMAP ( stock_spellcheck ) ;
internetBitmap = wxBITMAP ( stock_internet ) ;
hyperlinkBitmap = wxBITMAP ( stock_hyperlink ) ;
filtersBitmap = wxBITMAP ( stock_filters ) ;
checkWellformedBitmap = wxBITMAP ( stock_calc - accept ) ;
checkValidBitmap = wxBITMAP ( stock_calc - accept - green ) ;
// menu icons
new16Bitmap = wxBITMAP ( stock_new_16 ) ;
open16Bitmap = wxBITMAP ( stock_open_16 ) ;
save16Bitmap = wxBITMAP ( stock_save_16 ) ;
printPreviewBitmap = wxBITMAP ( stock_print_preview_16 ) ;
print16Bitmap = wxBITMAP ( stock_print_16 ) ;
undo16Bitmap = wxBITMAP ( stock_undo_16 ) ;
redo16Bitmap = wxBITMAP ( stock_redo_16 ) ;
cutBitmap = wxBITMAP ( stock_cut_16 ) ;
copyBitmap = wxBITMAP ( stock_copy_16 ) ;
pasteBitmap = wxBITMAP ( stock_paste_16 ) ;
findBitmap = wxBITMAP ( stock_search_16 ) ;
spelling16Bitmap = wxBITMAP ( stock_spellcheck_16 ) ;
helpBitmap = wxBITMAP ( stock_help_16 ) ;
# else
// toolbar icons
newBitmap = wxArtProvider : : GetBitmap ( wxART_NEW , wxART_TOOLBAR ) ;
openBitmap = wxArtProvider : : GetBitmap ( wxART_FILE_OPEN , wxART_TOOLBAR ) ;
saveBitmap = wxArtProvider : : GetBitmap ( wxART_FILE_SAVE , wxART_TOOLBAR ) ;
printBitmap = wxArtProvider : : GetBitmap ( wxART_PRINT , wxART_TOOLBAR ) ;
spellingBitmap = wxArtProvider : : GetBitmap ( _T ( " gtk-spell-check " ) , wxART_TOOLBAR ) ;
// no stock icons for the following
internetBitmap . LoadFile ( pngDir + _T ( " stock_internet.png " ) , wxBITMAP_TYPE_PNG ) ;
hyperlinkBitmap . LoadFile ( pngDir + _T ( " stock_hyperlink.png " ) , wxBITMAP_TYPE_PNG ) ;
checkWellformedBitmap . LoadFile ( pngDir + _T ( " stock_calc-accept.png " ) , wxBITMAP_TYPE_PNG ) ;
checkValidBitmap . LoadFile ( pngDir + _T ( " stock_calc-accept-green.png " ) , wxBITMAP_TYPE_PNG ) ;
// menu icons
new16Bitmap = wxNullBitmap ;
open16Bitmap = wxNullBitmap ;
save16Bitmap = wxNullBitmap ;
printPreviewBitmap = wxNullBitmap ;
print16Bitmap = wxNullBitmap ;
undo16Bitmap = wxNullBitmap ;
redo16Bitmap = wxNullBitmap ;
cutBitmap = wxNullBitmap ;
copyBitmap = wxNullBitmap ;
pasteBitmap = wxNullBitmap ;
findBitmap = wxNullBitmap ;
spelling16Bitmap = wxNullBitmap ;
helpBitmap = wxNullBitmap ;
# endif
}
# ifdef __WXMSW__
void MyFrame : : OnDropFiles ( wxDropFilesEvent & event )
{
int no = event . GetNumberOfFiles ( ) ;
wxString * iterator = event . GetFiles ( ) ;
if ( ! no | | ! iterator )
return ;
for ( int i = 0 ; i < no ; i + + , iterator + + )
{
if ( ! openFile ( * iterator ) )
break ;
}
}
# endif
2013-10-16 19:28:39 +02:00
wxString MyFrame : : getAuxPath ( const wxString & fileName )
{
if ( fileName . Find ( _T ( " .xsl " ) ) ! = wxNOT_FOUND | |
fileName . Find ( _T ( " .XSL " ) ) ! = wxNOT_FOUND )
2013-10-19 18:05:44 +02:00
return xslDtdPath ;
2013-10-16 19:28:39 +02:00
else if ( fileName . Find ( _T ( " .rss " ) ) ! = wxNOT_FOUND | |
fileName . Find ( _T ( " .RSS " ) ) ! = wxNOT_FOUND )
2013-10-19 18:05:44 +02:00
return rssDtdPath ;
2013-10-16 19:28:39 +02:00
else if ( fileName . Find ( _T ( " .xtm " ) ) ! = wxNOT_FOUND | |
fileName . Find ( _T ( " .xtmm " ) ) ! = wxNOT_FOUND | |
fileName . Find ( _T ( " .XTM " ) ) ! = wxNOT_FOUND | |
fileName . Find ( _T ( " .XTMM " ) ) ! = wxNOT_FOUND )
2013-10-19 18:05:44 +02:00
return xtmDtdPath ;
2013-10-16 19:28:39 +02:00
else if ( fileName . Find ( _T ( " .lzx " ) ) ! = wxNOT_FOUND | |
fileName . Find ( _T ( " .LZX " ) ) ! = wxNOT_FOUND )
2013-10-19 18:05:44 +02:00
return lzxDtdPath ;
2013-10-16 19:28:39 +02:00
else if ( fileName . Find ( _T ( " .xlf " ) ) ! = wxNOT_FOUND | |
fileName . Find ( _T ( " .XLF " ) ) ! = wxNOT_FOUND )
2013-10-19 18:05:44 +02:00
return xliffDtdPath ;
2013-10-16 19:28:39 +02:00
return wxEmptyString ;
2009-11-06 18:06:12 +01:00
}
void MyFrame : : OnActivateApp ( wxActivateEvent & event )
{
event . Skip ( ) ;
if ( ! mainBook | | ! event . GetActive ( ) )
return ;
restoreFocusToNotebook = true ;
}
void MyFrame : : OnIconize ( wxIconizeEvent & event )
{
event . Skip ( ) ;
2012-08-09 13:22:21 +02:00
# if wxCHECK_VERSION(2,9,0)
2012-03-14 16:08:20 +01:00
if ( event . IsIconized ( ) )
# else
2009-11-06 18:06:12 +01:00
if ( event . Iconized ( ) )
2012-03-14 16:08:20 +01:00
# endif
2009-11-06 18:06:12 +01:00
return ;
restoreFocusToNotebook = true ;
}
void MyFrame : : OnKeyPressed ( wxKeyEvent & event )
{
event . Skip ( ) ;
}
void MyFrame : : setStrictScrolling ( bool b )
{
XmlDoc * doc ;
doc = getActiveDocument ( ) ;
if ( ! doc )
return ;
doc - > SetYCaretPolicy ( ( b ) ? ( wxSTC_CARET_STRICT | wxSTC_CARET_SLOP ) : wxSTC_CARET_EVEN ,
( b ) ? 10 : 0 ) ;
}
void MyFrame : : addToFileQueue ( wxString & fileName )
{
fileQueue . push_back ( fileName ) ;
}
2013-12-14 00:36:03 +01:00
void MyFrame : : validatePaths ( )
{
bool valid = true ;
wxString msg ;
// Warning: Don't put a space between 'CHECK' and '('
# define CHECK( check, path ) \
if ( ! ( check ) ( path ) ) \
{ \
valid = false ; \
msg < < _ ( " Invalid path: " ) < < path < < wxTextFile : : GetEOL ( ) ; \
}
CHECK ( wxDirExists , ruleSetDir ) ;
//CHECK ( wxDirExists, filterDir );
CHECK ( wxDirExists , templateDir ) ;
//CHECK ( wxDirExists, binDir );
CHECK ( wxDirExists , helpDir ) ;
CHECK ( wxDirExists , rngDir ) ;
//CHECK ( wxDirExists, htmlDir );
CHECK ( wxDirExists , pngDir ) ;
//CHECK ( wxDirExists, daisyDir );
CHECK ( wxFileExists , catalogPath ) ;
CHECK ( wxFileExists , xslDtdPath ) ;
CHECK ( wxFileExists , rssDtdPath ) ;
CHECK ( wxFileExists , xtmDtdPath ) ;
CHECK ( wxFileExists , lzxDtdPath ) ;
CHECK ( wxFileExists , xliffDtdPath ) ;
CHECK ( wxDirExists , aspellDataPath ) ;
CHECK ( wxDirExists , aspellDictPath ) ;
# undef CHECK
if ( valid )
return ;
msg < < wxTextFile : : GetEOL ( )
# ifdef __WXMSW__
< < _ ( " To change application directory, see Tools, Options..., General " ) ;
# else
< < _ ( " To change application directory, see Edit, Preferences..., General " ) ;
# endif
wxMessageBox ( msg , GetTitle ( ) , wxOK | wxICON_ERROR , this ) ;
}