diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..70d3584 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.DS_Store +*.dmg +*.app +*.bz2 diff --git a/README b/README deleted file mode 100644 index 99a8091..0000000 --- a/README +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/README.md b/README.md new file mode 100644 index 0000000..779b680 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +XML Copy Editor +=============== + +Fast, free, validating XML editor. As of version 1.2.1.5 available for Linux, Windows and Mac. diff --git a/mac/Applications.lnk b/mac/Applications.lnk new file mode 100755 index 0000000..2e1221b Binary files /dev/null and b/mac/Applications.lnk differ diff --git a/mac/Info.plist b/mac/Info.plist new file mode 100644 index 0000000..fe8b346 --- /dev/null +++ b/mac/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + xmlcopyeditor + CFBundleIconFile + xmlcopyeditor.icns + CFBundleIdentifier + net.sourceforge.xml-copy-editor + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleSignature + xmlc + CFBundleVersion + 1.2.1.4 + CFBundleShortVersionString + 1.2.1 + NSPrincipalClass + NSApplication + CFBundleDisplayName + XML Copy Editor + + diff --git a/mac/InfoPlist.strings b/mac/InfoPlist.strings new file mode 100644 index 0000000..f52f90a --- /dev/null +++ b/mac/InfoPlist.strings @@ -0,0 +1,2 @@ +"CFBundleDisplayName" = "XML Copy Editor"; +"CFBundleName" = "XML Copy Editor"; diff --git a/mac/Makefile b/mac/Makefile new file mode 100644 index 0000000..f80530b --- /dev/null +++ b/mac/Makefile @@ -0,0 +1,35 @@ +build: + `wx-config --cxx --cxxflags --libs all` -I /usr/include -I /usr/local/include -I /usr/include/libxml2 -I ../src -lxml2 -lxslt -laspell.15 -lxerces-c -lpcre -o xmlcopyeditor ../src/*.cpp +bundle: Info.plist xmlcopyeditor version.plist InfoPlist.strings xmlcopyeditor.icns + SetFile -t APPL xmlcopyeditor + -mkdir xmlcopyeditor.app + -mkdir xmlcopyeditor.app/Contents + -mkdir xmlcopyeditor.app/Contents/MacOS + -mkdir xmlcopyeditor.app/Contents/Resources + -mkdir xmlcopyeditor.app/Contents/Resources/English.lproj + -mkdir xmlcopyeditor.app/Contents/SharedSupport + -mkdir xmlcopyeditor.app/Contents/Frameworks + cp Info.plist xmlcopyeditor.app/Contents/ + cp version.plist xmlcopyeditor.app/Contents/ + cp InfoPlist.strings xmlcopyeditor.app/Contents/Resources/English.lproj/ + echo -n 'APPLxmlc' > xmlcopyeditor.app/Contents/PkgInfo + cp xmlcopyeditor xmlcopyeditor.app/Contents/MacOS/xmlcopyeditor + cp -R ../src/png xmlcopyeditor.app/Contents/SharedSupport/ + cp -R ../src/catalog xmlcopyeditor.app/Contents/SharedSupport/ + cp -R ../src/dtd xmlcopyeditor.app/Contents/SharedSupport/ + cp -R ../src/help xmlcopyeditor.app/Contents/SharedSupport/ + cp -R ../src/ico xmlcopyeditor.app/Contents/SharedSupport/ + cp -R ../src/rng xmlcopyeditor.app/Contents/SharedSupport/ + cp -R ../src/rulesets xmlcopyeditor.app/Contents/SharedSupport/ + cp -R ../src/templates xmlcopyeditor.app/Contents/SharedSupport/ + cp -R ../src/xpm xmlcopyeditor.app/Contents/SharedSupport/ + cp -R ../src/xsl xmlcopyeditor.app/Contents/SharedSupport/ + cp xmlcopyeditor.icns xmlcopyeditor.app/Contents/Resources/ + for DYLIB in lib/libxml2.2 lib/libxslt.1 lib/libpcre.0 local/lib/libaspell.15 local/lib/libxerces-c-3.1; do BASENAME=`basename /usr/$${DYLIB}.dylib`; echo "relinking $${BASENAME}"; cp /usr/$${DYLIB}.dylib xmlcopyeditor.app/Contents/Frameworks/; install_name_tool -change /usr/$${DYLIB}.dylib @executable_path/../Frameworks/$${BASENAME} xmlcopyeditor.app/Contents/MacOS/xmlcopyeditor; done +dmg: + make -f Makefile.diskimage +clean: + rm -f xmlcopyeditor + rm -rf xmlcopyeditor.app/ + make -f Makefile.diskimage clean +all: clean build bundle dmg diff --git a/mac/Makefile.diskimage b/mac/Makefile.diskimage new file mode 100644 index 0000000..0fd628c --- /dev/null +++ b/mac/Makefile.diskimage @@ -0,0 +1,76 @@ +# +# Build file for creating DMG files. +# +# The DMG packager looks for a template.dmg.bz2 for using as its +# DMG template. If it doesn't find one, it generates a clean one. +# +# If you create a DMG template, you should make one containing all +# the files listed in $(SOURCE_FILES) below, and arrange everything to suit +# your style. The contents of the files themselves does not matter, so +# they can be empty (they will be overwritten later). +# +# Remko Tronçon +# https://el-tramo.be +# Licensed under the MIT License. See COPYING for details. + + +################################################################################ +# Customizable variables +################################################################################ + +NAME ?= xmlcopyeditor +VERSION ?= 1.2.1.5 + +SOURCE_DIR ?= . +SOURCE_FILES ?= xmlcopyeditor.app Applications.lnk + +TEMPLATE_DMG ?= xmlcopyeditor.dmg +TEMPLATE_SIZE ?= 40m + +################################################################################ +# DMG building. No editing should be needed beyond this point. +################################################################################ + +MASTER_DMG=$(NAME)-$(VERSION).dmg +WC_DMG=wc.dmg +WC_DIR=wc + +.PHONY: all +all: $(MASTER_DMG) + +$(TEMPLATE_DMG): $(TEMPLATE_DMG).bz2 + bunzip2 -k $< + +$(TEMPLATE_DMG).bz2: + @echo + @echo --------------------- Generating empty template -------------------- + mkdir template + hdiutil create -fs HFSX -layout SPUD -size $(TEMPLATE_SIZE) "$(TEMPLATE_DMG)" -srcfolder template -format UDRW -volname "$(NAME)" -quiet + rmdir template + bzip2 "$(TEMPLATE_DMG)" + @echo + +$(WC_DMG): $(TEMPLATE_DMG) + cp $< $@ + +$(MASTER_DMG): $(WC_DMG) $(addprefix $(SOURCE_DIR)/,$(SOURCE_FILES)) + @echo + @echo --------------------- Creating Disk Image -------------------- + mkdir -p $(WC_DIR) + hdiutil attach "$(WC_DMG)" -noautoopen -quiet -mountpoint "$(WC_DIR)" + for i in $(SOURCE_FILES); do \ + rm -rf "$(WC_DIR)/$$i"; \ + ditto -rsrc "$(SOURCE_DIR)/$$i" "$(WC_DIR)/$$i"; \ + done + #rm -f "$@" + #hdiutil create -srcfolder "$(WC_DIR)" -format UDZO -imagekey zlib-level=9 "$@" -volname "$(NAME) $(VERSION)" -scrub -quiet + WC_DEV=`hdiutil info | grep "$(WC_DIR)" | grep "Apple_HFS" | awk '{print $$1}'` && \ + hdiutil detach $$WC_DEV -quiet -force + rm -f "$(MASTER_DMG)" + hdiutil convert "$(WC_DMG)" -quiet -format UDZO -imagekey zlib-level=9 -o "$@" + rm -rf $(WC_DIR) + @echo + +.PHONY: clean +clean: + -rm -rf $(TEMPLATE_DMG) $(MASTER_DMG) $(WC_DMG) *.bz2 *.dmg diff --git a/mac/version.plist b/mac/version.plist new file mode 100644 index 0000000..24027d7 --- /dev/null +++ b/mac/version.plist @@ -0,0 +1,16 @@ + + + + + BuildVersion + 1 + CFBundleVersion + 1.0 + ProductBuildVersion + 1.0 + ProjectName + XML Copy Editor + SourceVersion + 1000 + + diff --git a/mac/xmlcopyeditor.icns b/mac/xmlcopyeditor.icns new file mode 100644 index 0000000..b9653ed Binary files /dev/null and b/mac/xmlcopyeditor.icns differ diff --git a/mac/xmlcopyeditor.iconset/icon_128x128.png b/mac/xmlcopyeditor.iconset/icon_128x128.png new file mode 100644 index 0000000..a856c54 Binary files /dev/null and b/mac/xmlcopyeditor.iconset/icon_128x128.png differ diff --git a/mac/xmlcopyeditor.iconset/icon_128x128@2x.png b/mac/xmlcopyeditor.iconset/icon_128x128@2x.png new file mode 100644 index 0000000..20137f3 Binary files /dev/null and b/mac/xmlcopyeditor.iconset/icon_128x128@2x.png differ diff --git a/mac/xmlcopyeditor.iconset/icon_16x16.png b/mac/xmlcopyeditor.iconset/icon_16x16.png new file mode 100644 index 0000000..8ea64d6 Binary files /dev/null and b/mac/xmlcopyeditor.iconset/icon_16x16.png differ diff --git a/mac/xmlcopyeditor.iconset/icon_16x16@2x.png b/mac/xmlcopyeditor.iconset/icon_16x16@2x.png new file mode 100644 index 0000000..3b93fb9 Binary files /dev/null and b/mac/xmlcopyeditor.iconset/icon_16x16@2x.png differ diff --git a/mac/xmlcopyeditor.iconset/icon_256x256.png b/mac/xmlcopyeditor.iconset/icon_256x256.png new file mode 100644 index 0000000..20137f3 Binary files /dev/null and b/mac/xmlcopyeditor.iconset/icon_256x256.png differ diff --git a/mac/xmlcopyeditor.iconset/icon_256x256@2x.png b/mac/xmlcopyeditor.iconset/icon_256x256@2x.png new file mode 100644 index 0000000..3165313 Binary files /dev/null and b/mac/xmlcopyeditor.iconset/icon_256x256@2x.png differ diff --git a/mac/xmlcopyeditor.iconset/icon_32x32.png b/mac/xmlcopyeditor.iconset/icon_32x32.png new file mode 100644 index 0000000..3b93fb9 Binary files /dev/null and b/mac/xmlcopyeditor.iconset/icon_32x32.png differ diff --git a/mac/xmlcopyeditor.iconset/icon_32x32@2x.png b/mac/xmlcopyeditor.iconset/icon_32x32@2x.png new file mode 100644 index 0000000..194b6f8 Binary files /dev/null and b/mac/xmlcopyeditor.iconset/icon_32x32@2x.png differ diff --git a/mac/xmlcopyeditor.iconset/icon_512x512.png b/mac/xmlcopyeditor.iconset/icon_512x512.png new file mode 100644 index 0000000..3165313 Binary files /dev/null and b/mac/xmlcopyeditor.iconset/icon_512x512.png differ diff --git a/src/myipc.cpp b/src/myipc.cpp index 197775f..bc21488 100755 --- a/src/myipc.cpp +++ b/src/myipc.cpp @@ -1,256 +1,256 @@ -/* - * 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; either version 2 - * of the License, or (at your option) any later version. - * - * 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 "myipc.h" -#include "xmlcopyeditor.h" -#include "pathresolver.h" -#ifdef HAVE_GTK2 -#include - -guint32 XTimeNow() -{ - struct timespec ts; - clock_gettime ( CLOCK_MONOTONIC, &ts ); - return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; -} -#endif // HAVE_GTK2 - -MyServerConnection *server_connection = 0; -MyClientConnection *client_connection = 0; - -wxConnectionBase *MyServer::OnAcceptConnection ( const wxString& topic ) -{ - if ( topic == IPC_TOPIC ) - return new MyServerConnection(); - - // unknown topic - return NULL; -} - -MyServerConnection::MyServerConnection() - : wxConnection() - , mFrameWnd ( ( wxIntPtr ) NULL ) -{ - server_connection = this; -} - -MyServerConnection::~MyServerConnection() -{ - if ( server_connection ) - { - server_connection = NULL; - } -} - -bool MyServerConnection::OnPoke ( - const wxString& WXUNUSED ( topic ) - , const wxString& item - , IPCData *data - , IPCSize_t size - , wxIPCFormat WXUNUSED ( format ) - ) -{ - if ( !wxTheApp ) - return false; - MyFrame *frame; - frame = ( MyFrame * ) wxTheApp->GetTopWindow(); - if ( !frame ) - return false; - if ( item == ( wxString ) IPC_NO_FILE ) - { - ; - } - else if ( frame->isOpen ( item ) ) - { - if ( frame->activateTab ( item ) ) - frame->reloadTab(); - } - else - { -#if wxCHECK_VERSION(2,9,0) - wxCommandEvent event ( wxEVT_MENU, wxID_OPEN ); -#else - wxCommandEvent event ( wxEVT_COMMAND_MENU_SELECTED, wxID_OPEN ); -#endif - event.SetString ( item ); - wxPostEvent ( frame->GetEventHandler(), event ); - //frame->addToFileQueue ( ( wxString& ) item ); // prevent event loop problems - } -#ifndef __WXMSW__ -#ifdef HAVE_GTK2 - // Processes mostly cannot raise their own windows. - // http://osdir.com/ml/gnome.gaim.devel/2004-12/msg00077.html - GtkWidget *widget = frame->GetHandle(); - GdkWindow *window = gtk_widget_get_window ( widget ); - gdk_x11_window_set_user_time ( window, - //XTimeNow() ); // This works too. - gdk_x11_get_server_time ( window ) ); - //gdk_window_show ( window ); - //gdk_window_raise ( window ); - //gtk_window_present ( GTK_WINDOW ( widget ) ); -#endif // HAVE_GTK2 - frame->Show(); - frame->Raise(); -#endif // __WXMSW__ - return true; -} - -IPCData *MyServerConnection::OnRequest - ( const wxString& WXUNUSED ( topic ) - , const wxString& item - , IPCSize_t *size - , wxIPCFormat WXUNUSED ( format ) /*= wxIPC_PRIVATE */ - ) -{ - if ( size == NULL ) - return NULL; - - if ( item == IPC_FRAME_WND ) - { - if ( !mFrameWnd ) - { - wxWindow *window = wxTheApp->GetTopWindow(); - if ( window ) - { -#ifdef HAVE_GTK2 - GtkWidget *wnd = window->GetHandle(); - if ( wnd ) - { - GdkWindow *gwnd = gtk_widget_get_window ( wnd ); - if ( gwnd ) - mFrameWnd = GDK_WINDOW_XID ( gwnd ); - } -#else - mFrameWnd = window->GetHandle(); -#endif - } - } - *size = sizeof mFrameWnd; - return ( IPCData * ) &mFrameWnd; - } - - *size = 0; - return NULL; -} - -bool MyServerConnection::OnStartAdvise ( const wxString& WXUNUSED ( topic ), - const wxString& WXUNUSED ( item ) ) -{ - return true; -} - -MyClientConnection::MyClientConnection() -{ -} - -wxConnectionBase *MyClient::OnMakeConnection() -{ - return new MyClientConnection; -} - -bool MyClientConnection::OnAdvise ( - const wxString& WXUNUSED ( topic ) - , const wxString& WXUNUSED ( item ) - , IPCData * WXUNUSED ( data ) - , IPCSize_t WXUNUSED ( size ) - , wxIPCFormat WXUNUSED ( format ) - ) -{ - return true; -} - -bool MyClientConnection::OnDisconnect() -{ - client_connection = NULL; - return wxConnection::OnDisconnect(); -} - -MyServer::MyServer() -{ -} - -MyClient::MyClient() -{ -} - -bool MyClient::talkToServer ( int argc, const wxChar * const *argv ) -{ - MyClientConnection *connection = ( MyClientConnection * ) - MakeConnection ( _T ( "localhost" ), IPC_SERVICE, IPC_TOPIC ); - if ( !connection || !connection->StartAdvise ( IPC_ADVISE_NAME ) ) - return false; - - // Grab what we need before the server is too busy to response - IPCSize_t size; - const void *data = connection->Request ( IPC_FRAME_WND, &size ); - - wxString argument; - // wxConnectionBase::Poke expects something other than NULL in debug - // version - static wxChar whatBuffer[] = _T ( "Data" ); - const static size_t bufSize = sizeof ( whatBuffer ) - sizeof ( wxChar ); - if ( argc <= 1 ) - { - connection->Poke ( IPC_NO_FILE, whatBuffer, bufSize ); - } - else for ( int i = 1; i < argc; i++ ) - { - argument = argv[i]; - argument = PathResolver::run ( argument ); - if ( ! connection->Poke ( argument, whatBuffer, bufSize ) ) - break; - } - - if ( !data ) - return false; - - // Bring the window to front -#ifdef __WXMSW__ - if ( size == sizeof ( HWND ) ) - { - HWND hwnd = * ( const HWND * )data; - if ( ::IsIconic ( hwnd ) ) - ::ShowWindow ( hwnd, SW_RESTORE ); - else - ::SetForegroundWindow ( hwnd ); - } -#elif defined ( __WXGTK__x ) // It doesn't work - if ( size == sizeof ( GdkNativeWindow ) ) - { - GdkNativeWindow xWnd = * ( GdkNativeWindow * ) data; - GdkWindow *window = gdk_window_foreign_new ( xWnd ); - if ( window ) - { - gdk_x11_window_set_user_time ( window, - XTimeNow() ); - //gdk_x11_get_server_time ( window ) ); - gdk_window_show ( window ); - gdk_window_raise ( window ); - gdk_window_unref ( window ); - //GtkWidget *widget; - //gdk_window_get_user_data(window, (void**)&widget); - //printf ("widget: %p\n",widget); - //gtk_window_present ( GTK_WINDOW ( widget ) ); - } - } -#endif // __WXMSW__ - - return true; -} +/* + * 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; either version 2 + * of the License, or (at your option) any later version. + * + * 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 "myipc.h" +#include "xmlcopyeditor.h" +#include "pathresolver.h" +#ifdef HAVE_GTK2 +#include + +guint32 XTimeNow() +{ + struct timespec ts; + clock_gettime ( CLOCK_MONOTONIC, &ts ); + return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; +} +#endif // HAVE_GTK2 + +MyServerConnection *server_connection = 0; +MyClientConnection *client_connection = 0; + +wxConnectionBase *MyServer::OnAcceptConnection ( const wxString& topic ) +{ + if ( topic == IPC_TOPIC ) + return new MyServerConnection(); + + // unknown topic + return NULL; +} + +MyServerConnection::MyServerConnection() + : wxConnection() + , mFrameWnd ( 0 ) +{ + server_connection = this; +} + +MyServerConnection::~MyServerConnection() +{ + if ( server_connection ) + { + server_connection = NULL; + } +} + +bool MyServerConnection::OnPoke ( + const wxString& WXUNUSED ( topic ) + , const wxString& item + , IPCData *data + , IPCSize_t size + , wxIPCFormat WXUNUSED ( format ) + ) +{ + if ( !wxTheApp ) + return false; + MyFrame *frame; + frame = ( MyFrame * ) wxTheApp->GetTopWindow(); + if ( !frame ) + return false; + if ( item == ( wxString ) IPC_NO_FILE ) + { + ; + } + else if ( frame->isOpen ( item ) ) + { + if ( frame->activateTab ( item ) ) + frame->reloadTab(); + } + else + { +#if wxCHECK_VERSION(2,9,0) + wxCommandEvent event ( wxEVT_MENU, wxID_OPEN ); +#else + wxCommandEvent event ( wxEVT_COMMAND_MENU_SELECTED, wxID_OPEN ); +#endif + event.SetString ( item ); + wxPostEvent ( frame->GetEventHandler(), event ); + //frame->addToFileQueue ( ( wxString& ) item ); // prevent event loop problems + } +#ifndef __WXMSW__ +#ifdef HAVE_GTK2 + // Processes mostly cannot raise their own windows. + // http://osdir.com/ml/gnome.gaim.devel/2004-12/msg00077.html + GtkWidget *widget = frame->GetHandle(); + GdkWindow *window = gtk_widget_get_window ( widget ); + gdk_x11_window_set_user_time ( window, + //XTimeNow() ); // This works too. + gdk_x11_get_server_time ( window ) ); + //gdk_window_show ( window ); + //gdk_window_raise ( window ); + //gtk_window_present ( GTK_WINDOW ( widget ) ); +#endif // HAVE_GTK2 + frame->Show(); + frame->Raise(); +#endif // __WXMSW__ + return true; +} + +IPCData *MyServerConnection::OnRequest + ( const wxString& WXUNUSED ( topic ) + , const wxString& item + , IPCSize_t *size + , wxIPCFormat WXUNUSED ( format ) /*= wxIPC_PRIVATE */ + ) +{ + if ( size == NULL ) + return NULL; + + if ( item == IPC_FRAME_WND ) + { + if ( !mFrameWnd ) + { + wxWindow *window = wxTheApp->GetTopWindow(); + if ( window ) + { +#ifdef HAVE_GTK2 + GtkWidget *wnd = window->GetHandle(); + if ( wnd ) + { + GdkWindow *gwnd = gtk_widget_get_window ( wnd ); + if ( gwnd ) + mFrameWnd = GDK_WINDOW_XID ( gwnd ); + } +#else + mFrameWnd = window->GetHandle(); +#endif + } + } + *size = sizeof mFrameWnd; + return ( IPCData * ) &mFrameWnd; + } + + *size = 0; + return NULL; +} + +bool MyServerConnection::OnStartAdvise ( const wxString& WXUNUSED ( topic ), + const wxString& WXUNUSED ( item ) ) +{ + return true; +} + +MyClientConnection::MyClientConnection() +{ +} + +wxConnectionBase *MyClient::OnMakeConnection() +{ + return new MyClientConnection; +} + +bool MyClientConnection::OnAdvise ( + const wxString& WXUNUSED ( topic ) + , const wxString& WXUNUSED ( item ) + , IPCData * WXUNUSED ( data ) + , IPCSize_t WXUNUSED ( size ) + , wxIPCFormat WXUNUSED ( format ) + ) +{ + return true; +} + +bool MyClientConnection::OnDisconnect() +{ + client_connection = NULL; + return wxConnection::OnDisconnect(); +} + +MyServer::MyServer() +{ +} + +MyClient::MyClient() +{ +} + +bool MyClient::talkToServer ( int argc, const wxChar * const *argv ) +{ + MyClientConnection *connection = ( MyClientConnection * ) + MakeConnection ( _T ( "localhost" ), IPC_SERVICE, IPC_TOPIC ); + if ( !connection || !connection->StartAdvise ( IPC_ADVISE_NAME ) ) + return false; + + // Grab what we need before the server is too busy to response + IPCSize_t size; + const void *data = connection->Request ( IPC_FRAME_WND, &size ); + + wxString argument; + // wxConnectionBase::Poke expects something other than NULL in debug + // version + static wxChar whatBuffer[] = _T ( "Data" ); + const static size_t bufSize = sizeof ( whatBuffer ) - sizeof ( wxChar ); + if ( argc <= 1 ) + { + connection->Poke ( IPC_NO_FILE, whatBuffer, bufSize ); + } + else for ( int i = 1; i < argc; i++ ) + { + argument = argv[i]; + argument = PathResolver::run ( argument ); + if ( ! connection->Poke ( argument, whatBuffer, bufSize ) ) + break; + } + + if ( !data ) + return false; + + // Bring the window to front +#ifdef __WXMSW__ + if ( size == sizeof ( HWND ) ) + { + HWND hwnd = * ( const HWND * )data; + if ( ::IsIconic ( hwnd ) ) + ::ShowWindow ( hwnd, SW_RESTORE ); + else + ::SetForegroundWindow ( hwnd ); + } +#elif defined ( __WXGTK__x ) // It doesn't work + if ( size == sizeof ( GdkNativeWindow ) ) + { + GdkNativeWindow xWnd = * ( GdkNativeWindow * ) data; + GdkWindow *window = gdk_window_foreign_new ( xWnd ); + if ( window ) + { + gdk_x11_window_set_user_time ( window, + XTimeNow() ); + //gdk_x11_get_server_time ( window ) ); + gdk_window_show ( window ); + gdk_window_raise ( window ); + gdk_window_unref ( window ); + //GtkWidget *widget; + //gdk_window_get_user_data(window, (void**)&widget); + //printf ("widget: %p\n",widget); + //gtk_window_present ( GTK_WINDOW ( widget ) ); + } + } +#endif // __WXMSW__ + + return true; +} diff --git a/src/xmlcopyeditor.cpp b/src/xmlcopyeditor.cpp index a24255f..bd4cebc 100644 --- a/src/xmlcopyeditor.cpp +++ b/src/xmlcopyeditor.cpp @@ -66,6 +66,7 @@ #include #include "dtd2schema.h" #include "myipc.h" +#include #ifdef NEWFINDREPLACE #include "findreplacepanel.h" @@ -225,6 +226,8 @@ MyApp::MyApp() , config ( new wxFileConfig ( _T ( "xmlcopyeditor" ) ) ) #endif { + wxDisableAsserts(); + #if defined ( __WXGTK__ ) && !defined ( __WXDEBUG__ ) int fdnull = open ( "/dev/null", O_WRONLY, 0 ); dup2 ( fdnull, STDERR_FILENO ); @@ -657,9 +660,11 @@ MyFrame::MyFrame ( wxEmptyString, this ) ), findDialog ( 0 ), -#ifndef __WXMSW__ - helpController ( new wxHtmlHelpController() ), + helpController ( new wxHtmlHelpController ( +#ifdef __WXOSX__ + wxHF_CONTENTS | wxHF_INDEX | wxHF_SEARCH | wxHF_BOOKMARKS | wxHF_PRINT #endif + ) ), menuBar ( 0 ), toolBar ( 0 ), xmlMenu ( 0 ), @@ -881,7 +886,7 @@ MyFrame::MyFrame ( // Initialize Xerces-C++ WrapXerces::Init ( libxmlNetAccess ); -#if _XERCES_VERSION >= 30100 +#if _XERCES_VERSION >= 30100 && wxDEBUG_LEVEL > 0 if ( XMLPlatformUtils::fgSSE2ok && xercescSSE2Warning && wxTheApp->argc == 1 ) @@ -940,7 +945,13 @@ MyFrame::MyFrame ( stylePosition = aboutPosition = wxDefaultPosition; styleSize = wxSize ( 720, 540 ); - showTopBars ( toolbarVisible ); + showTopBars ( +#ifndef __WXOSX__ + toolbarVisible +#else + false +#endif + ); long style = wxAUI_NB_TOP | wxAUI_NB_TAB_SPLIT | @@ -5073,9 +5084,11 @@ wxMenuBar *MyFrame::getMenuBar() _ ( "S&how Current Element Pane" ), _ ( "Show Current Element Pane" ) ); viewMenu->Check ( ID_LOCATION_PANE_VISIBLE, false ); +#ifndef __WXOSX__ viewMenu->AppendCheckItem ( ID_TOOLBAR_VISIBLE, _ ( "Sh&ow Toolbar" ), _ ( "Show Toolbar" ) ); viewMenu->Check ( ID_TOOLBAR_VISIBLE, toolbarVisible ); +#endif viewMenu->Append ( ID_CLOSE_MESSAGE_PANE, _ ( "C&lose Message Pane\tAlt+C" ), _ ( "Close Message Pane" ) ); viewMenu->Append ( ID_CLOSE_FIND_REPLACE_PANE, @@ -5429,6 +5442,7 @@ wxToolBar *MyFrame::getToolBar() wxNullBitmap, wxITEM_NORMAL, _ ( "Save" ) ); +#ifndef __WXOSX__ toolBar->AddTool ( ID_PRINT, _ ( "Print" ), @@ -5464,7 +5478,6 @@ wxToolBar *MyFrame::getToolBar() wxNullBitmap, wxITEM_NORMAL, _ ( "Spelling" ) ); - toolBar->AddCheckTool ( ID_PROTECT_TAGS, _ ( "Lock Tags" ), @@ -5473,6 +5486,7 @@ wxToolBar *MyFrame::getToolBar() _ ( "Lock Tags" ) ); toolBar->ToggleTool ( ID_PROTECT_TAGS, protectTags ); +#endif toolBar->Realize(); return toolBar; @@ -5684,44 +5698,33 @@ void MyFrame::encodingMessage() 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(); + wxString sep = wxFileName::GetPathSeparator(); + ruleSetDir = applicationDir + sep + _T ( "rulesets" ); + filterDir = applicationDir + sep + _T ( "filters" ); + templateDir = applicationDir + sep + _T ( "templates" ) + sep; + binDir = applicationDir + sep + _T ( "bin" ) + sep; + helpDir = applicationDir + sep + _T ( "help" ) + sep; + rngDir = applicationDir + sep + _T ( "rng" ) + sep; + htmlDir = applicationDir + sep + _T ( "html" ) + sep; + pngDir = applicationDir + sep + _T ( "png" ) + sep; + xpmDir = applicationDir + sep + _T ( "xpm" ) + sep; + daisyDir = applicationDir + sep + _T ( "daisy" ) + sep; catalogPath = - applicationDir + wxFileName::GetPathSeparator() + _T ( "catalog" ) + - wxFileName::GetPathSeparator() + _T ( "catalog" ); + applicationDir + sep + _T ( "catalog" ) + sep + _T ( "catalog" ); xslDtdPath = - applicationDir + wxFileName::GetPathSeparator() + _T ( "dtd" ) + - wxFileName::GetPathSeparator() + _T ( "xslt10.dtd" ); + applicationDir + sep + _T ( "dtd" ) + sep + _T ( "xslt10.dtd" ); rssDtdPath = - applicationDir + wxFileName::GetPathSeparator() + _T ( "dtd" ) + - wxFileName::GetPathSeparator() + _T ( "rss2.dtd" ); + applicationDir + sep + _T ( "dtd" ) + sep + _T ( "rss2.dtd" ); xtmDtdPath = - applicationDir + wxFileName::GetPathSeparator() + _T ( "dtd" ) + - wxFileName::GetPathSeparator() + _T ( "xtm1.dtd" ); + applicationDir + sep + _T ( "dtd" ) + sep + _T ( "xtm1.dtd" ); lzxDtdPath = - applicationDir + wxFileName::GetPathSeparator() + _T ( "dtd" ) + - wxFileName::GetPathSeparator() + _T ( "lzx.dtd" ); + applicationDir + sep + _T ( "dtd" ) + sep + _T ( "lzx.dtd" ); xliffDtdPath = - applicationDir + wxFileName::GetPathSeparator() + _T ( "dtd" ) + - wxFileName::GetPathSeparator() + _T ( "xliff.dtd" ); - aspellDataPath = applicationDir + wxFileName::GetPathSeparator() + - _T ( "aspell" ) + wxFileName::GetPathSeparator() + _T ( "data" ); - aspellDictPath = applicationDir + wxFileName::GetPathSeparator() + - _T ( "aspell" ) + wxFileName::GetPathSeparator() + _T ( "dict" ); + applicationDir + sep + _T ( "dtd" ) + sep + _T ( "xliff.dtd" ); + aspellDataPath = applicationDir + sep + + _T ( "aspell" ) + sep + _T ( "data" ); + aspellDictPath = applicationDir + sep + + _T ( "aspell" ) + sep + _T ( "dict" ); } void MyFrame::OnAssociate ( wxCommandEvent& event ) @@ -5966,11 +5969,34 @@ void MyFrame::loadBitmaps() findBitmap = wxBITMAP ( stock_search_16 ); spelling16Bitmap = wxBITMAP ( stock_spellcheck_16 ); helpBitmap = wxBITMAP ( stock_help_16 ); +/* +#elif __WXOSX__ + // toolbar icons + newBitmap.LoadFile ( xpmDir + _T ( "stock_new.xpm" ), wxBITMAP_TYPE_XPM ); + openBitmap.LoadFile ( xpmDir + _T ( "stock_open.xpm" ), wxBITMAP_TYPE_XPM ); + saveBitmap.LoadFile ( xpmDir + _T ( "stock_save.xpm" ), wxBITMAP_TYPE_XPM ); + + // 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; +*/ #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 ); +#ifndef __WXOSX__ printBitmap = wxArtProvider::GetBitmap ( wxART_PRINT, wxART_TOOLBAR ); spellingBitmap = wxArtProvider::GetBitmap ( _T ( "gtk-spell-check" ), wxART_TOOLBAR ); @@ -5979,6 +6005,7 @@ void MyFrame::loadBitmaps() 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 ); +#endif // menu icons new16Bitmap = wxNullBitmap; diff --git a/src/xmlcopyeditor.h b/src/xmlcopyeditor.h index 134a00c..f09435b 100644 --- a/src/xmlcopyeditor.h +++ b/src/xmlcopyeditor.h @@ -21,6 +21,12 @@ #ifndef XMLCOPYEDITOR_H #define XMLCOPYEDITOR_H +#define wxDEBUG_LEVEL 0 + +#ifdef __WXOSX__ +#define wxMAC_USE_NATIVE_TOOLBAR 1 +#endif + #define NEWFINDREPLACE 1 #include @@ -432,6 +438,7 @@ class MyFrame : public wxFrame rngDir, htmlDir, pngDir, + xpmDir, daisyDir, xpathExpression, lastDtdPublic, diff --git a/src/xmlcopyeditor.rc b/src/xmlcopyeditor.rc index 522f92e..d099287 100644 --- a/src/xmlcopyeditor.rc +++ b/src/xmlcopyeditor.rc @@ -175,8 +175,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,2,1,4 - PRODUCTVERSION 1,2,1,4 + FILEVERSION 1,2,1,5 + PRODUCTVERSION 1,2,1,5 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -195,7 +195,7 @@ BEGIN VALUE "FileDescription", "XML Copy Editor is a fast, free, validating XML editor" VALUE "FileVersion", "" VALUE "InternalName", "xmlcopyeditor.exe" - VALUE "LegalCopyright", "Copyright (c) 2014 Gerald Schmidt" + VALUE "LegalCopyright", "Copyright (c) 2018 Gerald Schmidt" VALUE "OriginalFilename", "XmlCopyEditor.exe" VALUE "ProductName", "XML Copy Editor" VALUE "ProductVersion", "" diff --git a/src/xmlcopyeditorcopy.h b/src/xmlcopyeditorcopy.h index 261ab1d..7fa5651 100644 --- a/src/xmlcopyeditorcopy.h +++ b/src/xmlcopyeditorcopy.h @@ -24,7 +24,7 @@ #else #define FILE_FILTER _("All files (*)|*|XML (*.xml)|*.xml|XHTML (*.html)|*.html|DTD (*.dtd)|*.dtd|XML Schema (*.xsd)|*.xsd|RELAX NG grammar (*.rng)|*.rng|XSL (*.xsl)|*.xsl") #endif -#define ABOUT_COPYRIGHT _("Copyright © 2005-2009 Gerald Schmidt ") +#define ABOUT_COPYRIGHT _("Copyright © 2005-2018 Gerald Schmidt ") #define ABOUT_DESCRIPTION _("\nXML Copy Editor is free software released under the GNU\nGeneral Public License.\n\nMany thanks are due to ") #define ABOUT_CONTRIBUTORS _T(\ "Tim van Niekerk, Matt Smigielski,\n"\ @@ -52,7 +52,7 @@ "License along with this program; if not, write to the Free\n"\ "Software Foundation, Inc., 59 Temple Place, Suite 330,\n"\ "Boston, MA 02111-1307 USA.") -#define ABOUT_VERSION _T("1.2.1.4") +#define ABOUT_VERSION _T("1.2.1.5") #define XMLCE_VAR _T("XMLCE_VAR") #ifdef __WXMSW__