18f42b94df
It is definitely not necessary to call SetTopWindow() when there is only a single top level window and it is arguable whether it's useful to do it even when there are many of them so don't encourage its use in the documentation and also remove all its occurrences from the samples. Closes #12816. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66528 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
824 lines
28 KiB
C++
824 lines
28 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
// File: contrib/samples/stc/stctest.cpp
|
|
// Purpose: STC test application
|
|
// Maintainer: Otto Wyss
|
|
// Created: 2003-09-01
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) wxGuide
|
|
// Licence: wxWindows licence
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//----------------------------------------------------------------------------
|
|
// headers
|
|
//----------------------------------------------------------------------------
|
|
|
|
// For compilers that support precompilation, includes "wx/wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
// for all others, include the necessary headers (this file is usually all you
|
|
// need because it includes almost all 'standard' wxWidgets headers)
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/wx.h"
|
|
#endif
|
|
|
|
//! wxWidgets headers
|
|
#include "wx/config.h" // configuration support
|
|
#include "wx/filedlg.h" // file dialog support
|
|
#include "wx/filename.h" // filename support
|
|
#include "wx/notebook.h" // notebook support
|
|
#include "wx/settings.h" // system settings
|
|
#include "wx/string.h" // strings support
|
|
#include "wx/image.h" // images support
|
|
|
|
//! application headers
|
|
#include "defsext.h" // Additional definitions
|
|
#include "edit.h" // Edit module
|
|
#include "prefs.h" // Prefs
|
|
|
|
//----------------------------------------------------------------------------
|
|
// resources
|
|
//----------------------------------------------------------------------------
|
|
|
|
// the application icon (under Windows and OS/2 it is in resources)
|
|
#if !defined(__WXMSW__) && !defined(__WXPM__)
|
|
#include "../sample.xpm"
|
|
#endif
|
|
|
|
//============================================================================
|
|
// declarations
|
|
//============================================================================
|
|
|
|
#define APP_NAME wxT("STC-Test")
|
|
#define APP_DESCR _("See http://wxguide.sourceforge.net/")
|
|
|
|
#define APP_MAINT wxT("Otto Wyss")
|
|
#define APP_VENDOR wxT("wxWidgets")
|
|
#define APP_COPYRIGTH wxT("(C) 2003 Otto Wyss")
|
|
#define APP_LICENCE wxT("wxWidgets")
|
|
|
|
#define APP_VERSION wxT("0.1.alpha")
|
|
#define APP_BUILD __DATE__
|
|
|
|
#define APP_WEBSITE wxT("http://www.wxWidgets.org")
|
|
#define APP_MAIL wxT("mailto://???")
|
|
|
|
#define NONAME _("<untitled>")
|
|
|
|
class AppBook;
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! global application name
|
|
wxString *g_appname = NULL;
|
|
|
|
#if wxUSE_PRINTING_ARCHITECTURE
|
|
|
|
//! global print data, to remember settings during the session
|
|
wxPrintData *g_printData = (wxPrintData*) NULL;
|
|
wxPageSetupData *g_pageSetupData = (wxPageSetupData*) NULL;
|
|
|
|
#endif // wxUSE_PRINTING_ARCHITECTURE
|
|
|
|
|
|
class AppFrame;
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! application APP_VENDOR-APP_NAME.
|
|
class App: public wxApp {
|
|
friend class AppFrame;
|
|
|
|
public:
|
|
//! the main function called durning application start
|
|
virtual bool OnInit ();
|
|
|
|
//! application exit function
|
|
virtual int OnExit ();
|
|
|
|
private:
|
|
//! frame window
|
|
AppFrame* m_frame;
|
|
|
|
wxFrame* MinimalEditor();
|
|
protected:
|
|
void OnMinimalEditor(wxCommandEvent&);
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
// created dynamically by wxWidgets
|
|
DECLARE_APP (App);
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! frame of the application APP_VENDOR-APP_NAME.
|
|
class AppFrame: public wxFrame {
|
|
friend class App;
|
|
friend class AppBook;
|
|
friend class AppAbout;
|
|
|
|
public:
|
|
//! constructor
|
|
AppFrame (const wxString &title);
|
|
|
|
//! destructor
|
|
~AppFrame ();
|
|
|
|
//! event handlers
|
|
//! common
|
|
void OnClose (wxCloseEvent &event);
|
|
void OnAbout (wxCommandEvent &event);
|
|
void OnExit (wxCommandEvent &event);
|
|
void OnTimerEvent (wxTimerEvent &event);
|
|
//! file
|
|
void OnFileNew (wxCommandEvent &event);
|
|
void OnFileNewFrame (wxCommandEvent &event);
|
|
void OnFileOpen (wxCommandEvent &event);
|
|
void OnFileOpenFrame (wxCommandEvent &event);
|
|
void OnFileSave (wxCommandEvent &event);
|
|
void OnFileSaveAs (wxCommandEvent &event);
|
|
void OnFileClose (wxCommandEvent &event);
|
|
//! properties
|
|
void OnProperties (wxCommandEvent &event);
|
|
//! print
|
|
void OnPrintSetup (wxCommandEvent &event);
|
|
void OnPrintPreview (wxCommandEvent &event);
|
|
void OnPrint (wxCommandEvent &event);
|
|
//! edit events
|
|
void OnEdit (wxCommandEvent &event);
|
|
|
|
private:
|
|
// edit object
|
|
Edit *m_edit;
|
|
void FileOpen (wxString fname);
|
|
|
|
//! creates the application menu bar
|
|
wxMenuBar *m_menuBar;
|
|
void CreateMenu ();
|
|
|
|
// print preview position and size
|
|
wxRect DeterminePrintSize ();
|
|
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! about box of the application APP_VENDOR-APP_NAME
|
|
class AppAbout: public wxDialog {
|
|
|
|
public:
|
|
//! constructor
|
|
AppAbout (wxWindow *parent,
|
|
int milliseconds = 0,
|
|
long style = 0);
|
|
|
|
//! destructor
|
|
~AppAbout ();
|
|
|
|
// event handlers
|
|
void OnTimerEvent (wxTimerEvent &event);
|
|
|
|
private:
|
|
// timer
|
|
wxTimer *m_timer;
|
|
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
|
|
//============================================================================
|
|
// implementation
|
|
//============================================================================
|
|
|
|
IMPLEMENT_APP (App)
|
|
|
|
|
|
BEGIN_EVENT_TABLE(App, wxApp)
|
|
EVT_MENU(myID_WINDOW_MINIMAL, App::OnMinimalEditor)
|
|
END_EVENT_TABLE()
|
|
|
|
//----------------------------------------------------------------------------
|
|
// App
|
|
//----------------------------------------------------------------------------
|
|
|
|
bool App::OnInit () {
|
|
|
|
wxInitAllImageHandlers();
|
|
|
|
// set application and vendor name
|
|
SetAppName (APP_NAME);
|
|
SetVendorName (APP_VENDOR);
|
|
g_appname = new wxString ();
|
|
g_appname->Append (APP_VENDOR);
|
|
g_appname->Append (wxT("-"));
|
|
g_appname->Append (APP_NAME);
|
|
|
|
#if wxUSE_PRINTING_ARCHITECTURE
|
|
// initialize print data and setup
|
|
g_printData = new wxPrintData;
|
|
g_pageSetupData = new wxPageSetupDialogData;
|
|
#endif // wxUSE_PRINTING_ARCHITECTURE
|
|
|
|
// create application frame
|
|
m_frame = new AppFrame (*g_appname);
|
|
|
|
// open application frame
|
|
m_frame->Layout ();
|
|
m_frame->Show (true);
|
|
|
|
return true;
|
|
}
|
|
|
|
int App::OnExit () {
|
|
|
|
// delete global appname
|
|
delete g_appname;
|
|
|
|
#if wxUSE_PRINTING_ARCHITECTURE
|
|
// delete global print data and setup
|
|
if (g_printData) delete g_printData;
|
|
if (g_pageSetupData) delete g_pageSetupData;
|
|
#endif // wxUSE_PRINTING_ARCHITECTURE
|
|
|
|
return 0;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// AppFrame
|
|
//----------------------------------------------------------------------------
|
|
|
|
BEGIN_EVENT_TABLE (AppFrame, wxFrame)
|
|
// common
|
|
EVT_CLOSE ( AppFrame::OnClose)
|
|
// file
|
|
EVT_MENU (wxID_OPEN, AppFrame::OnFileOpen)
|
|
EVT_MENU (wxID_SAVE, AppFrame::OnFileSave)
|
|
EVT_MENU (wxID_SAVEAS, AppFrame::OnFileSaveAs)
|
|
EVT_MENU (wxID_CLOSE, AppFrame::OnFileClose)
|
|
// properties
|
|
EVT_MENU (myID_PROPERTIES, AppFrame::OnProperties)
|
|
// print and exit
|
|
EVT_MENU (wxID_PRINT_SETUP, AppFrame::OnPrintSetup)
|
|
EVT_MENU (wxID_PREVIEW, AppFrame::OnPrintPreview)
|
|
EVT_MENU (wxID_PRINT, AppFrame::OnPrint)
|
|
EVT_MENU (wxID_EXIT, AppFrame::OnExit)
|
|
// edit
|
|
EVT_MENU (wxID_CLEAR, AppFrame::OnEdit)
|
|
EVT_MENU (wxID_CUT, AppFrame::OnEdit)
|
|
EVT_MENU (wxID_COPY, AppFrame::OnEdit)
|
|
EVT_MENU (wxID_PASTE, AppFrame::OnEdit)
|
|
EVT_MENU (myID_INDENTINC, AppFrame::OnEdit)
|
|
EVT_MENU (myID_INDENTRED, AppFrame::OnEdit)
|
|
EVT_MENU (wxID_SELECTALL, AppFrame::OnEdit)
|
|
EVT_MENU (myID_SELECTLINE, AppFrame::OnEdit)
|
|
EVT_MENU (wxID_REDO, AppFrame::OnEdit)
|
|
EVT_MENU (wxID_UNDO, AppFrame::OnEdit)
|
|
// find
|
|
EVT_MENU (wxID_FIND, AppFrame::OnEdit)
|
|
EVT_MENU (myID_FINDNEXT, AppFrame::OnEdit)
|
|
EVT_MENU (myID_REPLACE, AppFrame::OnEdit)
|
|
EVT_MENU (myID_REPLACENEXT, AppFrame::OnEdit)
|
|
EVT_MENU (myID_BRACEMATCH, AppFrame::OnEdit)
|
|
EVT_MENU (myID_GOTO, AppFrame::OnEdit)
|
|
// view
|
|
EVT_MENU_RANGE (myID_HILIGHTFIRST, myID_HILIGHTLAST,
|
|
AppFrame::OnEdit)
|
|
EVT_MENU (myID_DISPLAYEOL, AppFrame::OnEdit)
|
|
EVT_MENU (myID_INDENTGUIDE, AppFrame::OnEdit)
|
|
EVT_MENU (myID_LINENUMBER, AppFrame::OnEdit)
|
|
EVT_MENU (myID_LONGLINEON, AppFrame::OnEdit)
|
|
EVT_MENU (myID_WHITESPACE, AppFrame::OnEdit)
|
|
EVT_MENU (myID_FOLDTOGGLE, AppFrame::OnEdit)
|
|
EVT_MENU (myID_OVERTYPE, AppFrame::OnEdit)
|
|
EVT_MENU (myID_READONLY, AppFrame::OnEdit)
|
|
EVT_MENU (myID_WRAPMODEON, AppFrame::OnEdit)
|
|
// extra
|
|
EVT_MENU (myID_CHANGELOWER, AppFrame::OnEdit)
|
|
EVT_MENU (myID_CHANGEUPPER, AppFrame::OnEdit)
|
|
EVT_MENU (myID_CONVERTCR, AppFrame::OnEdit)
|
|
EVT_MENU (myID_CONVERTCRLF, AppFrame::OnEdit)
|
|
EVT_MENU (myID_CONVERTLF, AppFrame::OnEdit)
|
|
EVT_MENU (myID_CHARSETANSI, AppFrame::OnEdit)
|
|
EVT_MENU (myID_CHARSETMAC, AppFrame::OnEdit)
|
|
// help
|
|
EVT_MENU (wxID_ABOUT, AppFrame::OnAbout)
|
|
END_EVENT_TABLE ()
|
|
|
|
AppFrame::AppFrame (const wxString &title)
|
|
: wxFrame ((wxFrame *)NULL, wxID_ANY, title, wxDefaultPosition, wxSize(750,550),
|
|
wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE)
|
|
{
|
|
SetIcon(wxICON(sample));
|
|
|
|
// initialize important variables
|
|
m_edit = NULL;
|
|
|
|
// set icon and background
|
|
SetTitle (*g_appname);
|
|
SetBackgroundColour (wxT("WHITE"));
|
|
|
|
// about box shown for 1 seconds
|
|
AppAbout dlg(this, 1000);
|
|
|
|
// create menu
|
|
m_menuBar = new wxMenuBar;
|
|
CreateMenu ();
|
|
|
|
// open first page
|
|
m_edit = new Edit (this, wxID_ANY);
|
|
m_edit->SetFocus();
|
|
|
|
FileOpen (wxT("stctest.cpp"));
|
|
}
|
|
|
|
AppFrame::~AppFrame () {
|
|
}
|
|
|
|
// common event handlers
|
|
void AppFrame::OnClose (wxCloseEvent &event) {
|
|
wxCommandEvent evt;
|
|
OnFileClose (evt);
|
|
if (m_edit && m_edit->Modified()) {
|
|
if (event.CanVeto()) event.Veto (true);
|
|
return;
|
|
}
|
|
Destroy();
|
|
}
|
|
|
|
void AppFrame::OnAbout (wxCommandEvent &WXUNUSED(event)) {
|
|
AppAbout dlg(this);
|
|
}
|
|
|
|
void AppFrame::OnExit (wxCommandEvent &WXUNUSED(event)) {
|
|
Close (true);
|
|
}
|
|
|
|
// file event handlers
|
|
void AppFrame::OnFileOpen (wxCommandEvent &WXUNUSED(event)) {
|
|
if (!m_edit) return;
|
|
#if wxUSE_FILEDLG
|
|
wxString fname;
|
|
wxFileDialog dlg (this, wxT("Open file"), wxEmptyString, wxEmptyString, wxT("Any file (*)|*"),
|
|
wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR);
|
|
if (dlg.ShowModal() != wxID_OK) return;
|
|
fname = dlg.GetPath ();
|
|
FileOpen (fname);
|
|
#endif // wxUSE_FILEDLG
|
|
}
|
|
|
|
void AppFrame::OnFileSave (wxCommandEvent &WXUNUSED(event)) {
|
|
if (!m_edit) return;
|
|
if (!m_edit->Modified()) {
|
|
wxMessageBox (_("There is nothing to save!"), _("Save file"),
|
|
wxOK | wxICON_EXCLAMATION);
|
|
return;
|
|
}
|
|
m_edit->SaveFile ();
|
|
}
|
|
|
|
void AppFrame::OnFileSaveAs (wxCommandEvent &WXUNUSED(event)) {
|
|
if (!m_edit) return;
|
|
#if wxUSE_FILEDLG
|
|
wxString filename = wxEmptyString;
|
|
wxFileDialog dlg (this, wxT("Save file"), wxEmptyString, wxEmptyString, wxT("Any file (*)|*"), wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
|
|
if (dlg.ShowModal() != wxID_OK) return;
|
|
filename = dlg.GetPath();
|
|
m_edit->SaveFile (filename);
|
|
#endif // wxUSE_FILEDLG
|
|
}
|
|
|
|
void AppFrame::OnFileClose (wxCommandEvent &WXUNUSED(event)) {
|
|
if (!m_edit) return;
|
|
if (m_edit->Modified()) {
|
|
if (wxMessageBox (_("Text is not saved, save before closing?"), _("Close"),
|
|
wxYES_NO | wxICON_QUESTION) == wxYES) {
|
|
m_edit->SaveFile();
|
|
if (m_edit->Modified()) {
|
|
wxMessageBox (_("Text could not be saved!"), _("Close abort"),
|
|
wxOK | wxICON_EXCLAMATION);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
m_edit->SetFilename (wxEmptyString);
|
|
m_edit->ClearAll();
|
|
m_edit->SetSavePoint();
|
|
}
|
|
|
|
// properties event handlers
|
|
void AppFrame::OnProperties (wxCommandEvent &WXUNUSED(event)) {
|
|
if (!m_edit) return;
|
|
EditProperties dlg(m_edit, 0);
|
|
}
|
|
|
|
// print event handlers
|
|
void AppFrame::OnPrintSetup (wxCommandEvent &WXUNUSED(event)) {
|
|
#if wxUSE_PRINTING_ARCHITECTURE
|
|
(*g_pageSetupData) = * g_printData;
|
|
wxPageSetupDialog pageSetupDialog(this, g_pageSetupData);
|
|
pageSetupDialog.ShowModal();
|
|
(*g_printData) = pageSetupDialog.GetPageSetupData().GetPrintData();
|
|
(*g_pageSetupData) = pageSetupDialog.GetPageSetupData();
|
|
#endif // wxUSE_PRINTING_ARCHITECTURE
|
|
}
|
|
|
|
void AppFrame::OnPrintPreview (wxCommandEvent &WXUNUSED(event)) {
|
|
#if wxUSE_PRINTING_ARCHITECTURE
|
|
wxPrintDialogData printDialogData( *g_printData);
|
|
wxPrintPreview *preview =
|
|
new wxPrintPreview (new EditPrint (m_edit),
|
|
new EditPrint (m_edit),
|
|
&printDialogData);
|
|
if (!preview->Ok()) {
|
|
delete preview;
|
|
wxMessageBox (_("There was a problem with previewing.\n\
|
|
Perhaps your current printer is not correctly?"),
|
|
_("Previewing"), wxOK);
|
|
return;
|
|
}
|
|
wxRect rect = DeterminePrintSize();
|
|
wxPreviewFrame *frame = new wxPreviewFrame (preview, this, _("Print Preview"));
|
|
frame->SetSize (rect);
|
|
frame->Centre(wxBOTH);
|
|
frame->Initialize();
|
|
frame->Show(true);
|
|
#endif // wxUSE_PRINTING_ARCHITECTURE
|
|
}
|
|
|
|
void AppFrame::OnPrint (wxCommandEvent &WXUNUSED(event)) {
|
|
#if wxUSE_PRINTING_ARCHITECTURE
|
|
wxPrintDialogData printDialogData( *g_printData);
|
|
wxPrinter printer (&printDialogData);
|
|
EditPrint printout (m_edit);
|
|
if (!printer.Print (this, &printout, true)) {
|
|
if (wxPrinter::GetLastError() == wxPRINTER_ERROR) {
|
|
wxMessageBox (_("There was a problem with printing.\n\
|
|
Perhaps your current printer is not correctly?"),
|
|
_("Previewing"), wxOK);
|
|
return;
|
|
}
|
|
}
|
|
(*g_printData) = printer.GetPrintDialogData().GetPrintData();
|
|
#endif // wxUSE_PRINTING_ARCHITECTURE
|
|
}
|
|
|
|
// edit events
|
|
void AppFrame::OnEdit (wxCommandEvent &event) {
|
|
if (m_edit) m_edit->GetEventHandler()->ProcessEvent (event);
|
|
}
|
|
|
|
// private functions
|
|
void AppFrame::CreateMenu ()
|
|
{
|
|
// File menu
|
|
wxMenu *menuFile = new wxMenu;
|
|
menuFile->Append (wxID_OPEN, _("&Open ..\tCtrl+O"));
|
|
menuFile->Append (wxID_SAVE, _("&Save\tCtrl+S"));
|
|
menuFile->Append (wxID_SAVEAS, _("Save &as ..\tCtrl+Shift+S"));
|
|
menuFile->Append (wxID_CLOSE, _("&Close\tCtrl+W"));
|
|
menuFile->AppendSeparator();
|
|
menuFile->Append (myID_PROPERTIES, _("Proper&ties ..\tCtrl+I"));
|
|
menuFile->AppendSeparator();
|
|
menuFile->Append (wxID_PRINT_SETUP, _("Print Set&up .."));
|
|
menuFile->Append (wxID_PREVIEW, _("Print Pre&view\tCtrl+Shift+P"));
|
|
menuFile->Append (wxID_PRINT, _("&Print ..\tCtrl+P"));
|
|
menuFile->AppendSeparator();
|
|
menuFile->Append (wxID_EXIT, _("&Quit\tCtrl+Q"));
|
|
|
|
// Edit menu
|
|
wxMenu *menuEdit = new wxMenu;
|
|
menuEdit->Append (wxID_UNDO, _("&Undo\tCtrl+Z"));
|
|
menuEdit->Append (wxID_REDO, _("&Redo\tCtrl+Shift+Z"));
|
|
menuEdit->AppendSeparator();
|
|
menuEdit->Append (wxID_CUT, _("Cu&t\tCtrl+X"));
|
|
menuEdit->Append (wxID_COPY, _("&Copy\tCtrl+C"));
|
|
menuEdit->Append (wxID_PASTE, _("&Paste\tCtrl+V"));
|
|
menuEdit->Append (wxID_CLEAR, _("&Delete\tDel"));
|
|
menuEdit->AppendSeparator();
|
|
menuEdit->Append (wxID_FIND, _("&Find\tCtrl+F"));
|
|
menuEdit->Enable (wxID_FIND, false);
|
|
menuEdit->Append (myID_FINDNEXT, _("Find &next\tF3"));
|
|
menuEdit->Enable (myID_FINDNEXT, false);
|
|
menuEdit->Append (myID_REPLACE, _("&Replace\tCtrl+H"));
|
|
menuEdit->Enable (myID_REPLACE, false);
|
|
menuEdit->Append (myID_REPLACENEXT, _("Replace &again\tShift+F4"));
|
|
menuEdit->Enable (myID_REPLACENEXT, false);
|
|
menuEdit->AppendSeparator();
|
|
menuEdit->Append (myID_BRACEMATCH, _("&Match brace\tCtrl+M"));
|
|
menuEdit->Append (myID_GOTO, _("&Goto\tCtrl+G"));
|
|
menuEdit->Enable (myID_GOTO, false);
|
|
menuEdit->AppendSeparator();
|
|
menuEdit->Append (myID_INDENTINC, _("&Indent increase\tTab"));
|
|
menuEdit->Append (myID_INDENTRED, _("I&ndent reduce\tShift+Tab"));
|
|
menuEdit->AppendSeparator();
|
|
menuEdit->Append (wxID_SELECTALL, _("&Select all\tCtrl+A"));
|
|
menuEdit->Append (myID_SELECTLINE, _("Select &line\tCtrl+L"));
|
|
|
|
// hilight submenu
|
|
wxMenu *menuHilight = new wxMenu;
|
|
int Nr;
|
|
for (Nr = 0; Nr < g_LanguagePrefsSize; Nr++) {
|
|
menuHilight->Append (myID_HILIGHTFIRST + Nr,
|
|
g_LanguagePrefs [Nr].name);
|
|
}
|
|
|
|
// charset submenu
|
|
wxMenu *menuCharset = new wxMenu;
|
|
menuCharset->Append (myID_CHARSETANSI, _("&ANSI (Windows)"));
|
|
menuCharset->Append (myID_CHARSETMAC, _("&MAC (Macintosh)"));
|
|
|
|
// View menu
|
|
wxMenu *menuView = new wxMenu;
|
|
menuView->Append (myID_HILIGHTLANG, _("&Hilight language .."), menuHilight);
|
|
menuView->AppendSeparator();
|
|
menuView->AppendCheckItem (myID_FOLDTOGGLE, _("&Toggle current fold\tCtrl+T"));
|
|
menuView->AppendCheckItem (myID_OVERTYPE, _("&Overwrite mode\tIns"));
|
|
menuView->AppendCheckItem (myID_WRAPMODEON, _("&Wrap mode\tCtrl+U"));
|
|
menuView->AppendSeparator();
|
|
menuView->AppendCheckItem (myID_DISPLAYEOL, _("Show line &endings"));
|
|
menuView->AppendCheckItem (myID_INDENTGUIDE, _("Show &indent guides"));
|
|
menuView->AppendCheckItem (myID_LINENUMBER, _("Show line &numbers"));
|
|
menuView->AppendCheckItem (myID_LONGLINEON, _("Show &long line marker"));
|
|
menuView->AppendCheckItem (myID_WHITESPACE, _("Show white&space"));
|
|
menuView->AppendSeparator();
|
|
menuView->Append (myID_USECHARSET, _("Use &code page of .."), menuCharset);
|
|
|
|
// change case submenu
|
|
wxMenu *menuChangeCase = new wxMenu;
|
|
menuChangeCase->Append (myID_CHANGEUPPER, _("&Upper case"));
|
|
menuChangeCase->Append (myID_CHANGELOWER, _("&Lower case"));
|
|
|
|
// convert EOL submenu
|
|
wxMenu *menuConvertEOL = new wxMenu;
|
|
menuConvertEOL->Append (myID_CONVERTCR, _("CR (&Linux)"));
|
|
menuConvertEOL->Append (myID_CONVERTCRLF, _("CR+LF (&Windows)"));
|
|
menuConvertEOL->Append (myID_CONVERTLF, _("LF (&Macintosh)"));
|
|
|
|
// Extra menu
|
|
wxMenu *menuExtra = new wxMenu;
|
|
menuExtra->AppendCheckItem (myID_READONLY, _("&Readonly mode"));
|
|
menuExtra->AppendSeparator();
|
|
menuExtra->Append (myID_CHANGECASE, _("Change &case to .."), menuChangeCase);
|
|
menuExtra->AppendSeparator();
|
|
menuExtra->Append (myID_CONVERTEOL, _("Convert line &endings to .."), menuConvertEOL);
|
|
|
|
// Window menu
|
|
wxMenu *menuWindow = new wxMenu;
|
|
menuWindow->Append (myID_PAGEPREV, _("&Previous\tCtrl+Shift+Tab"));
|
|
menuWindow->Append (myID_PAGENEXT, _("&Next\tCtrl+Tab"));
|
|
menuWindow->Append(myID_WINDOW_MINIMAL, _("&Minimal editor"));
|
|
|
|
// Help menu
|
|
wxMenu *menuHelp = new wxMenu;
|
|
menuHelp->Append (wxID_ABOUT, _("&About ..\tShift+F1"));
|
|
|
|
// construct menu
|
|
m_menuBar->Append (menuFile, _("&File"));
|
|
m_menuBar->Append (menuEdit, _("&Edit"));
|
|
m_menuBar->Append (menuView, _("&View"));
|
|
m_menuBar->Append (menuExtra, _("E&xtra"));
|
|
m_menuBar->Append (menuWindow, _("&Window"));
|
|
m_menuBar->Append (menuHelp, _("&Help"));
|
|
SetMenuBar (m_menuBar);
|
|
}
|
|
|
|
void AppFrame::FileOpen (wxString fname)
|
|
{
|
|
wxFileName w(fname); w.Normalize(); fname = w.GetFullPath();
|
|
m_edit->LoadFile (fname);
|
|
}
|
|
|
|
wxRect AppFrame::DeterminePrintSize () {
|
|
|
|
wxSize scr = wxGetDisplaySize();
|
|
|
|
// determine position and size (shifting 16 left and down)
|
|
wxRect rect = GetRect();
|
|
rect.x += 16;
|
|
rect.y += 16;
|
|
rect.width = wxMin (rect.width, (scr.x - rect.x));
|
|
rect.height = wxMin (rect.height, (scr.x - rect.y));
|
|
|
|
return rect;
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
// AppAbout
|
|
//----------------------------------------------------------------------------
|
|
|
|
BEGIN_EVENT_TABLE (AppAbout, wxDialog)
|
|
EVT_TIMER (myID_ABOUTTIMER, AppAbout::OnTimerEvent)
|
|
END_EVENT_TABLE ()
|
|
|
|
AppAbout::AppAbout (wxWindow *parent,
|
|
int milliseconds,
|
|
long style)
|
|
: wxDialog (parent, wxID_ANY, wxEmptyString,
|
|
wxDefaultPosition, wxDefaultSize,
|
|
style | wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) {
|
|
|
|
// set timer if any
|
|
m_timer = NULL;
|
|
if (milliseconds > 0) {
|
|
m_timer = new wxTimer (this, myID_ABOUTTIMER);
|
|
m_timer->Start (milliseconds, wxTIMER_ONE_SHOT);
|
|
}
|
|
|
|
// sets the application title
|
|
SetTitle (_("About .."));
|
|
|
|
// about info
|
|
wxGridSizer *aboutinfo = new wxGridSizer (2, 0, 2);
|
|
aboutinfo->Add (new wxStaticText(this, wxID_ANY, _("Written by: ")),
|
|
0, wxALIGN_LEFT);
|
|
aboutinfo->Add (new wxStaticText(this, wxID_ANY, APP_MAINT),
|
|
1, wxEXPAND | wxALIGN_LEFT);
|
|
aboutinfo->Add (new wxStaticText(this, wxID_ANY, _("Version: ")),
|
|
0, wxALIGN_LEFT);
|
|
aboutinfo->Add (new wxStaticText(this, wxID_ANY, APP_VERSION),
|
|
1, wxEXPAND | wxALIGN_LEFT);
|
|
aboutinfo->Add (new wxStaticText(this, wxID_ANY, _("Licence type: ")),
|
|
0, wxALIGN_LEFT);
|
|
aboutinfo->Add (new wxStaticText(this, wxID_ANY, APP_LICENCE),
|
|
1, wxEXPAND | wxALIGN_LEFT);
|
|
aboutinfo->Add (new wxStaticText(this, wxID_ANY, _("Copyright: ")),
|
|
0, wxALIGN_LEFT);
|
|
aboutinfo->Add (new wxStaticText(this, wxID_ANY, APP_COPYRIGTH),
|
|
1, wxEXPAND | wxALIGN_LEFT);
|
|
|
|
// about icontitle//info
|
|
wxBoxSizer *aboutpane = new wxBoxSizer (wxHORIZONTAL);
|
|
wxBitmap bitmap = wxBitmap(wxICON (sample));
|
|
aboutpane->Add (new wxStaticBitmap (this, wxID_ANY, bitmap),
|
|
0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 20);
|
|
aboutpane->Add (aboutinfo, 1, wxEXPAND);
|
|
aboutpane->Add (60, 0);
|
|
|
|
// about complete
|
|
wxBoxSizer *totalpane = new wxBoxSizer (wxVERTICAL);
|
|
totalpane->Add (0, 20);
|
|
wxStaticText *appname = new wxStaticText(this, wxID_ANY, *g_appname);
|
|
appname->SetFont (wxFont (24, wxDEFAULT, wxNORMAL, wxBOLD));
|
|
totalpane->Add (appname, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, 40);
|
|
totalpane->Add (0, 10);
|
|
totalpane->Add (aboutpane, 0, wxEXPAND | wxALL, 4);
|
|
totalpane->Add (new wxStaticText(this, wxID_ANY, APP_DESCR),
|
|
0, wxALIGN_CENTER | wxALL, 10);
|
|
wxButton *okButton = new wxButton (this, wxID_OK, _("OK"));
|
|
okButton->SetDefault();
|
|
totalpane->Add (okButton, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT | wxBOTTOM, 10);
|
|
|
|
SetSizerAndFit (totalpane);
|
|
|
|
CenterOnScreen();
|
|
ShowModal();
|
|
}
|
|
|
|
AppAbout::~AppAbout () {
|
|
wxDELETE(m_timer);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// event handlers
|
|
void AppAbout::OnTimerEvent (wxTimerEvent &WXUNUSED(event)) {
|
|
wxDELETE(m_timer);
|
|
EndModal (wxID_OK);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Minimal editor added by Troels K 2008-04-08
|
|
// Thanks to geralds for SetLexerXml() - http://wxforum.shadonet.com/viewtopic.php?t=7155
|
|
|
|
class MinimalEditor : public wxStyledTextCtrl
|
|
{
|
|
enum
|
|
{
|
|
margin_id_lineno,
|
|
margin_id_fold,
|
|
};
|
|
|
|
public:
|
|
MinimalEditor(wxWindow* parent, wxWindowID id = wxID_ANY) : wxStyledTextCtrl(parent, id)
|
|
{
|
|
SetLexerXml();
|
|
|
|
SetProperty(wxT("fold"), wxT("1"));
|
|
SetProperty(wxT("fold.comment"), wxT("1"));
|
|
SetProperty(wxT("fold.compact"), wxT("1"));
|
|
SetProperty(wxT("fold.preprocessor"), wxT("1"));
|
|
SetProperty(wxT("fold.html"), wxT("1"));
|
|
SetProperty(wxT("fold.html.preprocessor"), wxT("1"));
|
|
|
|
SetMarginType(margin_id_lineno, wxSTC_MARGIN_NUMBER);
|
|
SetMarginWidth(margin_id_lineno, 32);
|
|
|
|
MarkerDefine(wxSTC_MARKNUM_FOLDER, wxSTC_MARK_BOXPLUS, wxT("WHITE"), wxT("BLACK"));
|
|
MarkerDefine(wxSTC_MARKNUM_FOLDEROPEN, wxSTC_MARK_BOXMINUS, wxT("WHITE"), wxT("BLACK"));
|
|
MarkerDefine(wxSTC_MARKNUM_FOLDERSUB, wxSTC_MARK_VLINE, wxT("WHITE"), wxT("BLACK"));
|
|
MarkerDefine(wxSTC_MARKNUM_FOLDEREND, wxSTC_MARK_BOXPLUSCONNECTED, wxT("WHITE"), wxT("BLACK"));
|
|
MarkerDefine(wxSTC_MARKNUM_FOLDEROPENMID, wxSTC_MARK_BOXMINUSCONNECTED, wxT("WHITE"), wxT("BLACK"));
|
|
MarkerDefine(wxSTC_MARKNUM_FOLDERMIDTAIL, wxSTC_MARK_TCORNER, wxT("WHITE"), wxT("BLACK"));
|
|
MarkerDefine(wxSTC_MARKNUM_FOLDERTAIL, wxSTC_MARK_LCORNER, wxT("WHITE"), wxT("BLACK"));
|
|
|
|
SetMarginMask(margin_id_fold, wxSTC_MASK_FOLDERS);
|
|
SetMarginWidth(margin_id_fold, 32);
|
|
SetMarginSensitive(margin_id_fold, true);
|
|
|
|
SetFoldFlags(wxSTC_FOLDFLAG_LINEBEFORE_CONTRACTED | wxSTC_FOLDFLAG_LINEAFTER_CONTRACTED);
|
|
|
|
SetTabWidth(4);
|
|
SetUseTabs(false);
|
|
SetWrapMode(wxSTC_WRAP_WORD);
|
|
SetWrapVisualFlags(wxSTC_WRAPVISUALFLAG_END);
|
|
}
|
|
virtual bool SetFont(const wxFont& font)
|
|
{
|
|
StyleSetFont(wxSTC_STYLE_DEFAULT, (wxFont&)font);
|
|
return wxStyledTextCtrl::SetFont(font);
|
|
}
|
|
void SetLexerXml()
|
|
{
|
|
SetLexer(wxSTC_LEX_XML);
|
|
StyleSetForeground(wxSTC_H_DEFAULT, *wxBLACK);
|
|
StyleSetForeground(wxSTC_H_TAG, *wxBLUE);
|
|
StyleSetForeground(wxSTC_H_TAGUNKNOWN, *wxBLUE);
|
|
StyleSetForeground(wxSTC_H_ATTRIBUTE, *wxRED);
|
|
StyleSetForeground(wxSTC_H_ATTRIBUTEUNKNOWN, *wxRED);
|
|
StyleSetBold(wxSTC_H_ATTRIBUTEUNKNOWN, true);
|
|
StyleSetForeground(wxSTC_H_NUMBER, *wxBLACK);
|
|
StyleSetForeground(wxSTC_H_DOUBLESTRING, *wxBLACK);
|
|
StyleSetForeground(wxSTC_H_SINGLESTRING, *wxBLACK);
|
|
StyleSetForeground(wxSTC_H_OTHER, *wxBLUE);
|
|
StyleSetForeground(wxSTC_H_COMMENT, wxTheColourDatabase->Find(wxT("GREY")));
|
|
StyleSetForeground(wxSTC_H_ENTITY, *wxRED);
|
|
StyleSetBold(wxSTC_H_ENTITY, true);
|
|
StyleSetForeground(wxSTC_H_TAGEND, *wxBLUE);
|
|
StyleSetForeground(wxSTC_H_XMLSTART, *wxBLUE);
|
|
StyleSetForeground(wxSTC_H_XMLEND, *wxBLUE);
|
|
StyleSetForeground(wxSTC_H_CDATA, *wxRED);
|
|
}
|
|
protected:
|
|
void OnMarginClick(wxStyledTextEvent&);
|
|
void OnText(wxStyledTextEvent&);
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
BEGIN_EVENT_TABLE(MinimalEditor, wxStyledTextCtrl)
|
|
EVT_STC_MARGINCLICK(wxID_ANY, MinimalEditor::OnMarginClick)
|
|
EVT_STC_CHANGE(wxID_ANY, MinimalEditor::OnText)
|
|
END_EVENT_TABLE()
|
|
|
|
void MinimalEditor::OnMarginClick(wxStyledTextEvent &event)
|
|
{
|
|
if (event.GetMargin() == margin_id_fold)
|
|
{
|
|
int lineClick = LineFromPosition(event.GetPosition());
|
|
int levelClick = GetFoldLevel(lineClick);
|
|
if ((levelClick & wxSTC_FOLDLEVELHEADERFLAG) > 0)
|
|
{
|
|
ToggleFold(lineClick);
|
|
}
|
|
}
|
|
}
|
|
|
|
void MinimalEditor::OnText(wxStyledTextEvent& event)
|
|
{
|
|
wxLogDebug(wxT("Modified"));
|
|
event.Skip();
|
|
}
|
|
|
|
class MinimalEditorFrame : public wxFrame
|
|
{
|
|
public:
|
|
MinimalEditorFrame() : wxFrame(NULL, wxID_ANY, _("Minimal Editor"))
|
|
{
|
|
MinimalEditor* editor = new MinimalEditor(this);
|
|
editor->SetFont(wxSystemSettings::GetFont(wxSYS_ANSI_FIXED_FONT));
|
|
wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
|
|
sizer->Add(editor, 1, wxEXPAND);
|
|
SetSizer(sizer);
|
|
editor->SetText(
|
|
"<xml>\n"
|
|
" <text>\n"
|
|
" This is xml with syntax highlighting, line numbers, folding, word wrap and context menu\n"
|
|
" </text>\n"
|
|
"</xml>"
|
|
);
|
|
}
|
|
};
|
|
|
|
wxFrame* App::MinimalEditor()
|
|
{
|
|
MinimalEditorFrame* frame = new MinimalEditorFrame;
|
|
frame->Show();
|
|
return frame;
|
|
}
|
|
|
|
void App::OnMinimalEditor(wxCommandEvent& WXUNUSED(event))
|
|
{
|
|
MinimalEditor();
|
|
}
|
|
|