X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ab7ce33c563651f790f99d64ee56727706047ae3..d5cc191c9cd48a915ce0dfc6e49511b2fddb6746:/samples/stc/stctest.cpp?ds=inline diff --git a/samples/stc/stctest.cpp b/samples/stc/stctest.cpp index b33052c86c..8db40419ef 100644 --- a/samples/stc/stctest.cpp +++ b/samples/stc/stctest.cpp @@ -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" @@ -22,173 +20,804 @@ #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 +//! 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 -#include +//============================================================================ +// 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 _("") + +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() }; -//---------------------------------------------------------------------- +// created dynamically by wxWidgets +DECLARE_APP (App); -// 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); +//---------------------------------------------------------------------------- +//! frame of the application APP_VENDOR-APP_NAME. +class AppFrame: public wxFrame { + friend class App; + friend class AppBook; + friend class AppAbout; - void OnQuit(wxCommandEvent& event); - void OnAbout(wxCommandEvent& event); +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: - wxStyledTextCtrl* ed; + // 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 { -// IDs for the controls and the menu commands -enum -{ - // menu items - ID_Quit = 1, - ID_About, - ID_ED +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() }; -BEGIN_EVENT_TABLE(MyFrame, wxFrame) - EVT_MENU (ID_Quit, MyFrame::OnQuit) - EVT_MENU (ID_About, MyFrame::OnAbout) + +//============================================================================ +// implementation +//============================================================================ + +IMPLEMENT_APP (App) + + +BEGIN_EVENT_TABLE(App, wxApp) +EVT_MENU(myID_WINDOW_MINIMAL, App::OnMinimalEditor) END_EVENT_TABLE() -IMPLEMENT_APP(MyApp) +//---------------------------------------------------------------------------- +// App +//---------------------------------------------------------------------------- + +bool App::OnInit () { + + wxInitAllImageHandlers(); -//---------------------------------------------------------------------- -// `Main program' equivalent: the program execution "starts" here + // 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); -bool MyApp::OnInit() +#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) { - MyFrame *frame = new MyFrame("Testing wxStyledTextCtrl", - wxPoint(5, 5), wxSize(400, 600)); + 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); - frame->Show(TRUE); - return TRUE; + // 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 +} -// frame constructor -MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) - : wxFrame((wxFrame *)NULL, -1, title, pos, size) +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 () { -#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 + // 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); +} - // create a menu bar - wxMenu *menuFile = new wxMenu("", wxMENU_TEAROFF); - - // the "About" item should be in the help menu - wxMenu *helpMenu = new wxMenu; - helpMenu->Append(ID_About, "&About...\tCtrl-A", "Show about dialog"); - - menuFile->Append(ID_Quit, "E&xit\tAlt-X", "Quit this program"); - - // now append the freshly created menu to the menu bar... - wxMenuBar *menuBar = new wxMenuBar(); - menuBar->Append(menuFile, "&File"); - menuBar->Append(helpMenu, "&Help"); - - // ... and attach this menu bar to the frame - SetMenuBar(menuBar); - -#if wxUSE_STATUSBAR - CreateStatusBar(2); - SetStatusText("Testing wxStyledTextCtrl"); -#endif // wxUSE_STATUSBAR - - - //---------------------------------------- - // Setup the editor - ed = new wxStyledTextCtrl(this, ID_ED); - - // Default font - wxFont font(10, wxMODERN, wxNORMAL, wxNORMAL); - ed->StyleSetFont(wxSTC_STYLE_DEFAULT, font); - ed->StyleClearAll(); - - ed->StyleSetForeground(0, wxColour(0x80, 0x80, 0x80)); - ed->StyleSetForeground(1, wxColour(0x00, 0x7f, 0x00)); - //ed->StyleSetForeground(2, wxColour(0x00, 0x7f, 0x00)); - ed->StyleSetForeground(3, wxColour(0x7f, 0x7f, 0x7f)); - ed->StyleSetForeground(4, wxColour(0x00, 0x7f, 0x7f)); - ed->StyleSetForeground(5, wxColour(0x00, 0x00, 0x7f)); - ed->StyleSetForeground(6, wxColour(0x7f, 0x00, 0x7f)); - ed->StyleSetForeground(7, wxColour(0x7f, 0x00, 0x7f)); - ed->StyleSetForeground(8, wxColour(0x00, 0x7f, 0x7f)); - ed->StyleSetForeground(9, wxColour(0x7f, 0x7f, 0x7f)); - ed->StyleSetForeground(10, wxColour(0x00, 0x00, 0x00)); - ed->StyleSetForeground(11, wxColour(0x00, 0x00, 0x00)); - ed->StyleSetBold(5, TRUE); - ed->StyleSetBold(10, TRUE); - -#ifdef __WXMSW__ - ed->StyleSetSpec(2, "fore:#007f00,bold,face:Arial,size:9"); -#else - ed->StyleSetSpec(2, "fore:#007f00,bold,face:Helvetica,size:9"); -#endif +wxRect AppFrame::DeterminePrintSize () { - // give it some text to play with - wxFile file("stctest.cpp"); - wxString st; + wxSize scr = wxGetDisplaySize(); - char* buff = st.GetWriteBuf(file.Length()); - file.Read(buff, file.Length()); - st.UngetWriteBuf(); + // 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)); - ed->InsertText(0, st); - ed->EmptyUndoBuffer(); + return rect; +} - ed->SetLexer(wxSTC_LEX_CPP); - ed->SetKeyWords(0, - "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 +//---------------------------------------------------------------------------- + +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); +} -void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) +///////////////////////////////////////////////////////////////////////////// +// 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 { - // TRUE is to force the frame to close - Close(TRUE); + 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 MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) +void MinimalEditor::OnText(wxStyledTextEvent& event) { - wxString msg; - msg.Printf( _T("Testing wxStyledTextCtrl...\n")); + wxLogDebug(wxT("Modified")); + event.Skip(); +} - wxMessageBox(msg, "About This Test", wxOK | wxICON_INFORMATION, this); +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( + "\n" + " \n" + " This is xml with syntax highlighting, line numbers, folding, word wrap and context menu\n" + " \n" + "" + ); + } +}; + +wxFrame* App::MinimalEditor() +{ + MinimalEditorFrame* frame = new MinimalEditorFrame; + frame->Show(); + return frame; +} + +void App::OnMinimalEditor(wxCommandEvent& WXUNUSED(event)) +{ + MinimalEditor(); } +