]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/stc/stctest.cpp
Added wxSimplebook class: a wxBookCtrl without controller.
[wxWidgets.git] / samples / stc / stctest.cpp
index 6c5afdba22dd7099e70a2b799d10a70cac8c2699..8db40419ef015d8be9011995e39fa520a8ed4446 100644 (file)
@@ -1,18 +1,16 @@
-/////////////////////////////////////////////////////////////////////////////
-// Name:        stctest.cpp
-// Purpose:     sample of using wxStyledTextCtrl
-// Author:      Robin Dunn
-// Modified by:
-// Created:     3-Feb-2000
+//////////////////////////////////////////////////////////////////////////////
+// File:        contrib/samples/stc/stctest.cpp
+// Purpose:     STC test application
+// Maintainer:  Otto Wyss
+// Created:     2003-09-01
 // RCS-ID:      $Id$
-// Copyright:   (c) 2000 by Total Control Software
+// Copyright:   (c) wxGuide
 // Licence:     wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
 
-#if defined(__GNUG__) && !defined(__APPLE__)
-    #pragma implementation "stctest.cpp"
-    #pragma interface "stctest.cpp"
-#endif
+//----------------------------------------------------------------------------
+// headers
+//----------------------------------------------------------------------------
 
 // For compilers that support precompilation, includes "wx/wx.h".
 #include "wx/wxprec.h"
 #endif
 
 // for all others, include the necessary headers (this file is usually all you
-// need because it includes almost all "standard" wxWindows headers
+// need because it includes almost all 'standard' wxWidgets headers)
 #ifndef WX_PRECOMP
     #include "wx/wx.h"
 #endif
 
-#include <wx/wfstream.h>
+//! 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)
+#ifndef wxHAS_IMAGES_IN_RESOURCES
+    #include "../sample.xpm"
+#endif
+
+//============================================================================
+// declarations
+//============================================================================
 
-#include <wx/stc/stc.h>
+#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;
+wxPageSetupDialogData *g_pageSetupData = (wxPageSetupDialogData*) NULL;
+
+#endif // wxUSE_PRINTING_ARCHITECTURE
+
+
+class AppFrame;
+
+//----------------------------------------------------------------------------
+//! application APP_VENDOR-APP_NAME.
+class App: public wxApp {
+    friend class AppFrame;
 
-class MyApp : public wxApp
-{
 public:
-    virtual bool OnInit();
+    //! 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()
 };
 
-//----------------------------------------------------------------------
-//  Make an editor class
+// created dynamically by wxWidgets
+DECLARE_APP (App);
 
-class MySTC : public wxStyledTextCtrl
-{
-public:
-    MySTC(wxWindow *parent, wxWindowID id,
-          const wxPoint& pos = wxDefaultPosition,
-          const wxSize& size = wxDefaultSize, long style = 0);
+//----------------------------------------------------------------------------
+//! frame of the application APP_VENDOR-APP_NAME.
+class AppFrame: public wxFrame {
+    friend class App;
+    friend class AppBook;
+    friend class AppAbout;
 
-    void OnKeyPressed(wxKeyEvent& evt);
+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()
 };
 
-BEGIN_EVENT_TABLE(MySTC, wxStyledTextCtrl)
-    EVT_KEY_DOWN(MySTC::OnKeyPressed)
-END_EVENT_TABLE()
+//----------------------------------------------------------------------------
+//! about box of the application APP_VENDOR-APP_NAME
+class AppAbout: public wxDialog {
 
-//----------------------------------------------------------------------
-// Define a new frame type: this is going to be our main frame
-class MyFrame : public wxFrame
-{
 public:
-    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
+    //! constructor
+    AppAbout (wxWindow *parent,
+              int milliseconds = 0,
+              long style = 0);
 
-    void OnQuit(wxCommandEvent& event);
-    void OnAbout(wxCommandEvent& event);
+    //! destructor
+    ~AppAbout ();
+
+    // event handlers
+    void OnTimerEvent (wxTimerEvent &event);
 
 private:
-    MySTC* ed;
+    // timer
+    wxTimer *m_timer;
 
     DECLARE_EVENT_TABLE()
 };
 
 
-// IDs for the controls and the menu commands
-enum
-{
-    // menu items
-    ID_Quit = 1,
-    ID_About,
-    ID_ED
-};
+//============================================================================
+// implementation
+//============================================================================
+
+IMPLEMENT_APP (App)
 
-BEGIN_EVENT_TABLE(MyFrame, wxFrame)
-    EVT_MENU            (ID_Quit,  MyFrame::OnQuit)
-    EVT_MENU            (ID_About, MyFrame::OnAbout)
+
+BEGIN_EVENT_TABLE(App, wxApp)
+EVT_MENU(myID_WINDOW_MINIMAL, App::OnMinimalEditor)
 END_EVENT_TABLE()
 
-IMPLEMENT_APP(MyApp)
+//----------------------------------------------------------------------------
+// App
+//----------------------------------------------------------------------------
 
-//----------------------------------------------------------------------
-// `Main program' equivalent: the program execution "starts" here
+bool App::OnInit () {
 
-bool MyApp::OnInit()
-{
-    MyFrame *frame = new MyFrame(_T("Testing wxStyledTextCtrl"),
-                                 wxPoint(5, 5), wxSize(600, 600));
+    wxInitAllImageHandlers();
 
-    frame->Show(TRUE);
-    return TRUE;
+    // 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 () {
 
-// frame constructor
-MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
-       : wxFrame((wxFrame *)NULL, -1, title, pos, size)
+    // 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)
 {
-#ifdef __WXMAC__
-    // we need this in order to allow the about menu relocation, since ABOUT is
-    // not the default id of the about menu
-    wxApp::s_macAboutMenuItemId = ID_About;
-#endif
+    SetIcon(wxICON(sample));
 
+    // initialize important variables
+    m_edit = NULL;
 
-    // create a menu bar
-    wxMenu *menuFile = new wxMenu(wxEmptyString, wxMENU_TEAROFF);
+    // set icon and background
+    SetTitle (*g_appname);
+    SetBackgroundColour (wxT("WHITE"));
 
-    // the "About" item should be in the help menu
-    wxMenu *helpMenu = new wxMenu;
-    helpMenu->Append(ID_About, _T("&About...\tCtrl-A"), _T("Show about dialog"));
+    // about box shown for 1 seconds
+    AppAbout dlg(this, 1000);
 
-    menuFile->Append(ID_Quit, _T("E&xit\tAlt-X"), _T("Quit this program"));
+    // create menu
+    m_menuBar = new wxMenuBar;
+    CreateMenu ();
 
-    // now append the freshly created menu to the menu bar...
-    wxMenuBar *menuBar = new wxMenuBar();
-    menuBar->Append(menuFile, _T("&File"));
-    menuBar->Append(helpMenu, _T("&Help"));
+    // open first page
+    m_edit = new Edit (this, wxID_ANY);
+    m_edit->SetFocus();
+
+    FileOpen (wxT("stctest.cpp"));
+}
 
-    // ... and attach this menu bar to the frame
-    SetMenuBar(menuBar);
+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();
+}
 
-#if wxUSE_STATUSBAR
-    CreateStatusBar(2);
-    SetStatusText(_T("Testing wxStyledTextCtrl"));
-#endif // wxUSE_STATUSBAR
+void AppFrame::OnAbout (wxCommandEvent &WXUNUSED(event)) {
+    AppAbout dlg(this);
+}
 
+void AppFrame::OnExit (wxCommandEvent &WXUNUSED(event)) {
+    Close (true);
+}
 
-    //----------------------------------------
-    // Setup the editor
-    ed = new MySTC(this, ID_ED);
+// 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 ();
+}
 
-// event handlers
+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 MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
+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);
+}
+
+// private functions
+void AppFrame::CreateMenu ()
 {
-    // TRUE is to force the frame to close
-    Close(TRUE);
+    // 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 MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
+void AppFrame::FileOpen (wxString fname)
 {
-    wxString msg;
-    msg.Printf( _T("Testing wxStyledTextCtrl...\n"));
+    wxFileName w(fname); w.Normalize(); fname = w.GetFullPath();
+    m_edit->LoadFile (fname);
+}
+
+wxRect AppFrame::DeterminePrintSize () {
+
+    wxSize scr = wxGetDisplaySize();
 
-    wxMessageBox(msg, _T("About This Test"), wxOK | wxICON_INFORMATION, this);
+    // 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 ()
 
-wxChar* keywords =
-_T("asm auto bool break case catch char class const \
-const_cast continue default delete do double \
-dynamic_cast else enum explicit export extern \
-false float for friend goto if inline int long \
-mutable namespace new operator private protected \
-public register reinterpret_cast return short signed \
-sizeof static static_cast struct switch template this \
-throw true try typedef typeid typename union unsigned \
-using virtual void volatile wchar_t while");
+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();
+}
 
-MySTC::MySTC(wxWindow *parent, wxWindowID id,
-             const wxPoint& pos, const wxSize& size,
-             long style)
-    : wxStyledTextCtrl(parent, id, pos, size, style)
+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
 {
-    // Default font
-    wxFont font(10, wxMODERN, wxNORMAL, wxNORMAL);
-    StyleSetFont(wxSTC_STYLE_DEFAULT, font);
-    StyleClearAll();
-
-    StyleSetForeground(0,  wxColour(0x80, 0x80, 0x80));
-    StyleSetForeground(1,  wxColour(0x00, 0x7f, 0x00));
-    //StyleSetForeground(2,  wxColour(0x00, 0x7f, 0x00));
-    StyleSetForeground(3,  wxColour(0x7f, 0x7f, 0x7f));
-    StyleSetForeground(4,  wxColour(0x00, 0x7f, 0x7f));
-    StyleSetForeground(5,  wxColour(0x00, 0x00, 0x7f));
-    StyleSetForeground(6,  wxColour(0x7f, 0x00, 0x7f));
-    StyleSetForeground(7,  wxColour(0x7f, 0x00, 0x7f));
-    StyleSetForeground(8,  wxColour(0x00, 0x7f, 0x7f));
-    StyleSetForeground(9,  wxColour(0x7f, 0x7f, 0x7f));
-    StyleSetForeground(10, wxColour(0x00, 0x00, 0x00));
-    StyleSetForeground(11, wxColour(0x00, 0x00, 0x00));
-    StyleSetBold(5,  TRUE);
-    StyleSetBold(10, TRUE);
-
-#ifdef __WXMSW__
-    StyleSetSpec(2, _T("fore:#007f00,bold,face:Arial,size:9"));
-#else
-    StyleSetSpec(2, _T("fore:#007f00,bold,face:Helvetica,size:9"));
-#endif
+    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()
+};
 
-    // give it some text to play with
-    wxString st;
-    wxFileInputStream stream(wxT("stctest.cpp"));
-    size_t sz = stream.GetSize();
-    char* buf = new char[sz + 1];
-    stream.Read((void*) buf, stream.GetSize());
-    buf[sz] = 0;
-    st = wxString::FromAscii(buf);
-    delete[] buf;
+BEGIN_EVENT_TABLE(MinimalEditor, wxStyledTextCtrl)
+    EVT_STC_MARGINCLICK(wxID_ANY, MinimalEditor::OnMarginClick)
+    EVT_STC_CHANGE(wxID_ANY, MinimalEditor::OnText)
+END_EVENT_TABLE()
 
-    InsertText(0, st);
-    EmptyUndoBuffer();
+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);
+        }
+    }
+}
 
-    SetLexer(wxSTC_LEX_CPP);
-    SetKeyWords(0, keywords);
+void MinimalEditor::OnText(wxStyledTextEvent& event)
+{
+    wxLogDebug(wxT("Modified"));
+    event.Skip();
 }
 
-void MySTC::OnKeyPressed(wxKeyEvent& evt)
+class MinimalEditorFrame : public wxFrame
 {
-    if (CallTipActive())
-        CallTipCancel();
-
-    int key = evt.GetKeyCode();
-    if ( key == WXK_SPACE && evt.ControlDown()) {
-        int pos = GetCurrentPos();
-
-        if (evt.ShiftDown()) {
-            // show how to do CallTips
-            CallTipSetBackground(wxColour(_T("YELLOW")));
-            CallTipShow(pos, _T("lots of of text: blah, blah, blah\n\n\
-show some suff, maybe parameters..\n\n\
-fubar(param1, param2)"));
-        }
-        else {
-            // show how to do AutoComplete
-            AutoCompSetIgnoreCase(false);
-            AutoCompShow(0, keywords);   // reuse the keyword list here
-            // normally you would build a string of completion texts...
-        }
+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>"
+           );
     }
-    else
-        evt.Skip();
+};
+
+wxFrame* App::MinimalEditor()
+{
+    MinimalEditorFrame* frame = new MinimalEditorFrame;
+    frame->Show();
+    return frame;
 }
+
+void App::OnMinimalEditor(wxCommandEvent& WXUNUSED(event))
+{
+    MinimalEditor();
+}
+