wxWidgets/samples/stc/stctest.cpp
Vadim Zeitlin f37d449208 Add convenient wxFileName::GetAbsolutePath() wrapper and use it
This wrapper simply combines the calls to MakeAbsolute() and
GetFullPath(), but using it results in shorter and more clear code, so
it seems to be worth having.
2021-07-11 14:51:31 +01:00

843 lines
28 KiB
C++

//////////////////////////////////////////////////////////////////////////////
// File: contrib/samples/stc/stctest.cpp
// Purpose: STC test application
// Maintainer: Otto Wyss
// Created: 2003-09-01
// Copyright: (c) wxGuide
// Licence: wxWindows licence
//////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------
// headers
//----------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
// 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
#if wxUSE_PRINTING_ARCHITECTURE
#include "wx/paper.h"
#endif // wxUSE_PRINTING_ARCHITECTURE
//! application headers
#include "defsext.h" // Additional definitions
#include "edit.h" // Edit module
#include "prefs.h" // Prefs
//----------------------------------------------------------------------------
// resources
//----------------------------------------------------------------------------
// the application icon (under Windows it is in resources)
#ifndef wxHAS_IMAGES_IN_RESOURCES
#include "../sample.xpm"
#endif
//============================================================================
// declarations
//============================================================================
#define APP_NAME "STC-Test"
#define APP_DESCR "See http://wxguide.sourceforge.net/"
#define APP_MAINT "Otto Wyss"
#define APP_VENDOR "wxWidgets"
#define APP_COPYRIGTH "(C) 2003 Otto Wyss"
#define APP_LICENCE "wxWidgets"
#define APP_VERSION "0.1.alpha"
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;
wxPageSetupDialogData *g_pageSetupData = (wxPageSetupDialogData*) NULL;
#endif // wxUSE_PRINTING_ARCHITECTURE
class AppFrame;
//----------------------------------------------------------------------------
//! application APP_VENDOR-APP_NAME.
class App: public wxApp {
friend class AppFrame;
public:
//! the main function called during application start
virtual bool OnInit () wxOVERRIDE;
//! application exit function
virtual int OnExit () wxOVERRIDE;
private:
//! frame window
AppFrame* m_frame;
wxFrame* MinimalEditor();
protected:
void OnMinimalEditor(wxCommandEvent&);
wxDECLARE_EVENT_TABLE();
};
// created dynamically by wxWidgets
wxDECLARE_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);
//! file
void OnFileOpen (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);
void OnContextMenu(wxContextMenuEvent& evt);
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 ();
wxDECLARE_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;
wxDECLARE_EVENT_TABLE();
};
//============================================================================
// implementation
//============================================================================
wxIMPLEMENT_APP(App);
wxBEGIN_EVENT_TABLE(App, wxApp)
EVT_MENU(myID_WINDOW_MINIMAL, App::OnMinimalEditor)
wxEND_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 ("-");
g_appname->Append (APP_NAME);
#if wxUSE_PRINTING_ARCHITECTURE
// initialize print data and setup
g_printData = new wxPrintData;
wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(wxPAPER_A4);
g_printData->SetPaperId(paper->GetId());
g_printData->SetPaperSize(paper->GetSize());
g_printData->SetOrientation(wxPORTRAIT);
g_pageSetupData = new wxPageSetupDialogData;
// copy over initial paper size from print record
(*g_pageSetupData) = *g_printData;
#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
//----------------------------------------------------------------------------
wxBEGIN_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)
// Menu items with standard IDs forwarded to the editor.
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 (wxID_SELECTALL, AppFrame::OnEdit)
EVT_MENU (wxID_REDO, AppFrame::OnEdit)
EVT_MENU (wxID_UNDO, AppFrame::OnEdit)
EVT_MENU (wxID_FIND, AppFrame::OnEdit)
// And all our edit-related menu commands.
EVT_MENU_RANGE (myID_EDIT_FIRST, myID_EDIT_LAST,
AppFrame::OnEdit)
// help
EVT_MENU (wxID_ABOUT, AppFrame::OnAbout)
EVT_CONTEXT_MENU( AppFrame::OnContextMenu)
wxEND_EVENT_TABLE ()
AppFrame::AppFrame (const wxString &title)
: wxFrame ((wxFrame *)NULL, wxID_ANY, title, wxDefaultPosition, wxSize(750,550))
{
SetIcon(wxICON(sample));
// initialize important variables
m_edit = NULL;
// set icon and background
SetTitle (*g_appname);
SetBackgroundColour ("WHITE");
// create menu
m_menuBar = new wxMenuBar;
CreateMenu ();
// open first page
m_edit = new Edit (this, wxID_ANY);
m_edit->SetFocus();
FileOpen ("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, "Open file", wxEmptyString, wxEmptyString, "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;
wxFileDialog dlg (this, "Save file", wxEmptyString, wxEmptyString, "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->IsOk()) {
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);
}
void AppFrame::OnContextMenu(wxContextMenuEvent& evt)
{
wxPoint point = evt.GetPosition();
// If from keyboard
if ( point.x == -1 && point.y == -1 )
{
wxSize size = GetSize();
point.x = size.x / 2;
point.y = size.y / 2;
}
else
{
point = ScreenToClient(point);
}
wxMenu menu;
menu.Append(wxID_ABOUT, "&About");
menu.Append(wxID_EXIT, "E&xit");
PopupMenu(&menu, point);
}
// 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"));
// highlight submenu
wxMenu *menuHighlight = new wxMenu;
int Nr;
for (Nr = 0; Nr < g_LanguagePrefsSize; Nr++) {
menuHighlight->Append (myID_HIGHLIGHTFIRST + 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_HIGHLIGHTLANG, _("&Highlight language .."), menuHighlight);
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);
// Annotations menu
wxMenu* menuAnnotations = new wxMenu;
menuAnnotations->Append(myID_ANNOTATION_ADD, _("&Add or edit an annotation..."),
_("Add an annotation for the current line"));
menuAnnotations->Append(myID_ANNOTATION_REMOVE, _("&Remove annotation"),
_("Remove the annotation for the current line"));
menuAnnotations->Append(myID_ANNOTATION_CLEAR, _("&Clear all annotations"));
wxMenu* menuAnnotationsStyle = new wxMenu;
menuAnnotationsStyle->AppendRadioItem(myID_ANNOTATION_STYLE_HIDDEN, _("&Hidden"));
menuAnnotationsStyle->AppendRadioItem(myID_ANNOTATION_STYLE_STANDARD, _("&Standard"));
menuAnnotationsStyle->AppendRadioItem(myID_ANNOTATION_STYLE_BOXED, _("&Boxed"));
menuAnnotations->AppendSubMenu(menuAnnotationsStyle, "&Style");
// 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);
menuExtra->AppendCheckItem(myID_MULTIPLE_SELECTIONS, _("Toggle &multiple selections"));
menuExtra->AppendCheckItem(myID_MULTI_PASTE, _("Toggle multi-&paste"));
menuExtra->AppendCheckItem(myID_MULTIPLE_SELECTIONS_TYPING, _("Toggle t&yping on multiple selections"));
menuExtra->AppendSeparator();
#if defined(__WXMSW__) && wxUSE_GRAPHICS_DIRECT2D
wxMenu* menuTechnology = new wxMenu;
menuTechnology->AppendRadioItem(myID_TECHNOLOGY_DEFAULT, _("&Default"));
menuTechnology->AppendRadioItem(myID_TECHNOLOGY_DIRECTWRITE, _("Direct&Write"));
menuExtra->AppendSubMenu(menuTechnology, _("&Technology"));
menuExtra->AppendSeparator();
#endif
menuExtra->AppendCheckItem (myID_CUSTOM_POPUP, _("C&ustom context menu"));
// Window menu
wxMenu *menuWindow = new wxMenu;
menuWindow->Append(myID_WINDOW_MINIMAL, _("&Minimal editor"));
// Help menu
wxMenu *menuHelp = new wxMenu;
menuHelp->Append (wxID_ABOUT, _("&About ..\tCtrl+D"));
// construct menu
m_menuBar->Append (menuFile, _("&File"));
m_menuBar->Append (menuEdit, _("&Edit"));
m_menuBar->Append (menuView, _("&View"));
m_menuBar->Append (menuAnnotations, _("&Annotations"));
m_menuBar->Append (menuExtra, _("E&xtra"));
m_menuBar->Append (menuWindow, _("&Window"));
m_menuBar->Append (menuHelp, _("&Help"));
SetMenuBar (m_menuBar);
m_menuBar->Check(myID_ANNOTATION_STYLE_BOXED, true);
}
void AppFrame::FileOpen (wxString fname)
{
m_edit->LoadFile (wxFileName(fname).GetAbsolutePath());
m_edit->SelectNone();
}
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
//----------------------------------------------------------------------------
wxBEGIN_EVENT_TABLE (AppAbout, wxDialog)
EVT_TIMER (myID_ABOUTTIMER, AppAbout::OnTimerEvent)
wxEND_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);
}
// Get version of Scintilla
wxVersionInfo vi = wxStyledTextCtrl::GetLibraryVersionInfo();
// 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, wxString::Format("%s (%s)", APP_VERSION, vi.GetVersionString())),
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 (wxFontInfo(24).Bold());
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("fold", "1");
SetProperty("fold.comment", "1");
SetProperty("fold.compact", "1");
SetProperty("fold.preprocessor", "1");
SetProperty("fold.html", "1");
SetProperty("fold.html.preprocessor", "1");
SetMarginType(margin_id_lineno, wxSTC_MARGIN_NUMBER);
SetMarginWidth(margin_id_lineno, 32);
MarkerDefine(wxSTC_MARKNUM_FOLDER, wxSTC_MARK_BOXPLUS, "WHITE", "BLACK");
MarkerDefine(wxSTC_MARKNUM_FOLDEROPEN, wxSTC_MARK_BOXMINUS, "WHITE", "BLACK");
MarkerDefine(wxSTC_MARKNUM_FOLDERSUB, wxSTC_MARK_VLINE, "WHITE", "BLACK");
MarkerDefine(wxSTC_MARKNUM_FOLDEREND, wxSTC_MARK_BOXPLUSCONNECTED, "WHITE", "BLACK");
MarkerDefine(wxSTC_MARKNUM_FOLDEROPENMID, wxSTC_MARK_BOXMINUSCONNECTED, "WHITE", "BLACK");
MarkerDefine(wxSTC_MARKNUM_FOLDERMIDTAIL, wxSTC_MARK_TCORNER, "WHITE", "BLACK");
MarkerDefine(wxSTC_MARKNUM_FOLDERTAIL, wxSTC_MARK_LCORNER, "WHITE", "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) wxOVERRIDE
{
StyleSetFont(wxSTC_STYLE_DEFAULT, 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, wxColour("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&);
wxDECLARE_EVENT_TABLE();
};
wxBEGIN_EVENT_TABLE(MinimalEditor, wxStyledTextCtrl)
EVT_STC_MARGINCLICK(wxID_ANY, MinimalEditor::OnMarginClick)
EVT_STC_CHANGE(wxID_ANY, MinimalEditor::OnText)
wxEND_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("Modified");
event.Skip();
}
class MinimalEditorFrame : public wxFrame
{
public:
MinimalEditorFrame() : wxFrame(NULL, wxID_ANY, _("Minimal Editor"))
{
MinimalEditor* editor = new MinimalEditor(this);
editor->SetFont(wxFontInfo().Family(wxFONTFAMILY_TELETYPE));
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();
}