]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/stc/stctest.cpp
fix vertical mouse wheel event rotation value, sign was reversed in r74805
[wxWidgets.git] / samples / stc / stctest.cpp
index ea4c90a706b19e0f4b4a327d0ec02f32591bac11..b42bda52d8bd906170760b39674ca263f6da971a 100644 (file)
@@ -1,9 +1,8 @@
 //////////////////////////////////////////////////////////////////////////////
-// File:        stctest.cpp
+// File:        contrib/samples/stc/stctest.cpp
 // Purpose:     STC test application
 // Maintainer:  Otto Wyss
 // Created:     2003-09-01
-// RCS-ID:      $Id$
 // Copyright:   (c) wxGuide
 // Licence:     wxWindows licence
 //////////////////////////////////////////////////////////////////////////////
@@ -12,8 +11,8 @@
 // headers
 //----------------------------------------------------------------------------
 
-// For compilers that support precompilation, includes <wx/wx.h>.
-#include <wx/wxprec.h>
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
     #pragma hdrstop
 #include "edit.h"        // Edit module
 #include "prefs.h"       // Prefs
 
-
 //----------------------------------------------------------------------------
 // resources
 //----------------------------------------------------------------------------
 
 // the application icon (under Windows and OS/2 it is in resources)
-#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) || defined(__WXX11__)
-    #include "mondrian.xpm"
+#ifndef wxHAS_IMAGES_IN_RESOURCES
+    #include "../sample.xpm"
 #endif
 
 //============================================================================
 // declarations
 //============================================================================
 
-#define APP_NAME _T("STC-Test")
+#define APP_NAME wxT("STC-Test")
 #define APP_DESCR _("See http://wxguide.sourceforge.net/")
 
-#define APP_MAINT _T("Otto Wyss")
-#define APP_VENDOR _T("wxWidgets")
-#define APP_COPYRIGTH _T("(C) 2003 Otto Wyss")
-#define APP_LICENCE _T("wxWidgets")
+#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 _T("0.1.alpha")
+#define APP_VERSION wxT("0.1.alpha")
 #define APP_BUILD __DATE__
 
-#define APP_WEBSITE _T("http://www.wxWidgets.org")
-#define APP_MAIL _T("mailto://???")
+#define APP_WEBSITE wxT("http://www.wxWidgets.org")
+#define APP_MAIL wxT("mailto://???")
 
 #define NONAME _("<untitled>")
 
@@ -80,11 +78,13 @@ wxString *g_appname = NULL;
 
 //! global print data, to remember settings during the session
 wxPrintData *g_printData = (wxPrintData*) NULL;
-wxPageSetupData *g_pageSetupData = (wxPageSetupData*) NULL;
+wxPageSetupDialogData *g_pageSetupData = (wxPageSetupDialogData*) NULL;
 
 #endif // wxUSE_PRINTING_ARCHITECTURE
 
 
+class AppFrame;
+
 //----------------------------------------------------------------------------
 //! application APP_VENDOR-APP_NAME.
 class App: public wxApp {
@@ -101,6 +101,10 @@ private:
     //! frame window
     AppFrame* m_frame;
 
+    wxFrame* MinimalEditor();
+protected:
+    void OnMinimalEditor(wxCommandEvent&);
+    DECLARE_EVENT_TABLE()
 };
 
 // created dynamically by wxWidgets
@@ -188,6 +192,11 @@ private:
 
 IMPLEMENT_APP (App)
 
+
+BEGIN_EVENT_TABLE(App, wxApp)
+EVT_MENU(myID_WINDOW_MINIMAL, App::OnMinimalEditor)
+END_EVENT_TABLE()
+
 //----------------------------------------------------------------------------
 // App
 //----------------------------------------------------------------------------
@@ -201,7 +210,7 @@ bool App::OnInit () {
     SetVendorName (APP_VENDOR);
     g_appname = new wxString ();
     g_appname->Append (APP_VENDOR);
-    g_appname->Append (_T("-"));
+    g_appname->Append (wxT("-"));
     g_appname->Append (APP_NAME);
 
 #if wxUSE_PRINTING_ARCHITECTURE
@@ -216,7 +225,6 @@ bool App::OnInit () {
     // open application frame
     m_frame->Layout ();
     m_frame->Show (true);
-    SetTopWindow (m_frame);
 
     return true;
 }
@@ -254,62 +262,34 @@ BEGIN_EVENT_TABLE (AppFrame, wxFrame)
     EVT_MENU (wxID_PREVIEW,          AppFrame::OnPrintPreview)
     EVT_MENU (wxID_PRINT,            AppFrame::OnPrint)
     EVT_MENU (wxID_EXIT,             AppFrame::OnExit)
-    // edit
+    // 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 (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,
+    // And all our edit-related menu commands.
+    EVT_MENU_RANGE (myID_EDIT_FIRST, myID_EDIT_LAST,
                                      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) {
+                    wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE)
+{
+    SetIcon(wxICON(sample));
 
-    // intitialize important variables
+    // initialize important variables
     m_edit = NULL;
 
     // set icon and background
     SetTitle (*g_appname);
-    SetIcon (wxICON (mondrian));
-    SetBackgroundColour (_T("WHITE"));
-
-    // about box shown for 1 seconds
-    AppAbout dlg(this, 1000);
+    SetBackgroundColour (wxT("WHITE"));
 
     // create menu
     m_menuBar = new wxMenuBar;
@@ -319,7 +299,7 @@ AppFrame::AppFrame (const wxString &title)
     m_edit = new Edit (this, wxID_ANY);
     m_edit->SetFocus();
 
-    FileOpen (_T("stctest.cpp"));
+    FileOpen (wxT("stctest.cpp"));
 }
 
 AppFrame::~AppFrame () {
@@ -349,8 +329,8 @@ void AppFrame::OnFileOpen (wxCommandEvent &WXUNUSED(event)) {
     if (!m_edit) return;
 #if wxUSE_FILEDLG
     wxString fname;
-    wxFileDialog dlg (this, _T("Open file"), wxEmptyString, wxEmptyString, _T("Any file (*)|*"),
-                      wxOPEN | wxFILE_MUST_EXIST | wxCHANGE_DIR);
+    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);
@@ -371,7 +351,7 @@ void AppFrame::OnFileSaveAs (wxCommandEvent &WXUNUSED(event)) {
     if (!m_edit) return;
 #if wxUSE_FILEDLG
     wxString filename = wxEmptyString;
-    wxFileDialog dlg (this, _T("Save file"), wxEmptyString, wxEmptyString, _T("Any file (*)|*"), wxSAVE|wxOVERWRITE_PROMPT);
+    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);
@@ -420,7 +400,7 @@ void AppFrame::OnPrintPreview (wxCommandEvent &WXUNUSED(event)) {
         new wxPrintPreview (new EditPrint (m_edit),
                             new EditPrint (m_edit),
                             &printDialogData);
-    if (!preview->Ok()) {
+    if (!preview->IsOk()) {
         delete preview;
         wxMessageBox (_("There was a problem with previewing.\n\
                          Perhaps your current printer is not correctly?"),
@@ -455,7 +435,7 @@ void AppFrame::OnPrint (wxCommandEvent &WXUNUSED(event)) {
 
 // edit events
 void AppFrame::OnEdit (wxCommandEvent &event) {
-    if (m_edit) m_edit->ProcessEvent (event);
+    if (m_edit) m_edit->GetEventHandler()->ProcessEvent (event);
 }
 
 // private functions
@@ -500,7 +480,7 @@ void AppFrame::CreateMenu ()
     menuEdit->Enable (myID_GOTO, false);
     menuEdit->AppendSeparator();
     menuEdit->Append (myID_INDENTINC, _("&Indent increase\tTab"));
-    menuEdit->Append (myID_INDENTRED, _("I&ndent reduce\tBksp"));
+    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"));
@@ -534,6 +514,20 @@ void AppFrame::CreateMenu ()
     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"));
@@ -557,25 +551,30 @@ void AppFrame::CreateMenu ()
     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"));
+    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)
 {
     wxFileName w(fname); w.Normalize(); fname = w.GetFullPath();
     m_edit->LoadFile (fname);
+    m_edit->SelectNone();
 }
 
 wxRect AppFrame::DeterminePrintSize () {
@@ -639,7 +638,7 @@ AppAbout::AppAbout (wxWindow *parent,
 
     // about icontitle//info
     wxBoxSizer *aboutpane = new wxBoxSizer (wxHORIZONTAL);
-    wxBitmap bitmap = wxBitmap(wxICON (mondrian));
+    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);
@@ -666,16 +665,147 @@ AppAbout::AppAbout (wxWindow *parent,
 }
 
 AppAbout::~AppAbout () {
-    if (m_timer)  {
-        delete m_timer;
-        m_timer = NULL;
-    }
+    wxDELETE(m_timer);
 }
 
 //----------------------------------------------------------------------------
 // event handlers
 void AppAbout::OnTimerEvent (wxTimerEvent &WXUNUSED(event)) {
-    if (m_timer) delete m_timer;
-    m_timer = NULL;
+    wxDELETE(m_timer);
     EndModal (wxID_OK);
 }
+
+/////////////////////////////////////////////////////////////////////////////
+// Minimal editor added by Troels K 2008-04-08
+// Thanks to geralds for SetLexerXml() - http://wxforum.shadonet.com/viewtopic.php?t=7155
+
+class MinimalEditor : public wxStyledTextCtrl
+{
+    enum
+    {
+        margin_id_lineno,
+        margin_id_fold,
+    };
+
+public:
+    MinimalEditor(wxWindow* parent, wxWindowID id = wxID_ANY) : wxStyledTextCtrl(parent, id)
+    {
+        SetLexerXml();
+
+        SetProperty(wxT("fold"), wxT("1"));
+        SetProperty(wxT("fold.comment"), wxT("1"));
+        SetProperty(wxT("fold.compact"), wxT("1"));
+        SetProperty(wxT("fold.preprocessor"), wxT("1"));
+        SetProperty(wxT("fold.html"), wxT("1"));
+        SetProperty(wxT("fold.html.preprocessor"), wxT("1"));
+
+        SetMarginType(margin_id_lineno, wxSTC_MARGIN_NUMBER);
+        SetMarginWidth(margin_id_lineno, 32);
+
+        MarkerDefine(wxSTC_MARKNUM_FOLDER,        wxSTC_MARK_BOXPLUS, wxT("WHITE"), wxT("BLACK"));
+        MarkerDefine(wxSTC_MARKNUM_FOLDEROPEN,    wxSTC_MARK_BOXMINUS,  wxT("WHITE"), wxT("BLACK"));
+        MarkerDefine(wxSTC_MARKNUM_FOLDERSUB,     wxSTC_MARK_VLINE,     wxT("WHITE"), wxT("BLACK"));
+        MarkerDefine(wxSTC_MARKNUM_FOLDEREND,     wxSTC_MARK_BOXPLUSCONNECTED, wxT("WHITE"), wxT("BLACK"));
+        MarkerDefine(wxSTC_MARKNUM_FOLDEROPENMID, wxSTC_MARK_BOXMINUSCONNECTED, wxT("WHITE"), wxT("BLACK"));
+        MarkerDefine(wxSTC_MARKNUM_FOLDERMIDTAIL, wxSTC_MARK_TCORNER,     wxT("WHITE"), wxT("BLACK"));
+        MarkerDefine(wxSTC_MARKNUM_FOLDERTAIL,    wxSTC_MARK_LCORNER,     wxT("WHITE"), wxT("BLACK"));
+
+        SetMarginMask(margin_id_fold, wxSTC_MASK_FOLDERS);
+        SetMarginWidth(margin_id_fold, 32);
+        SetMarginSensitive(margin_id_fold, true);
+
+        SetFoldFlags(wxSTC_FOLDFLAG_LINEBEFORE_CONTRACTED | wxSTC_FOLDFLAG_LINEAFTER_CONTRACTED);
+
+        SetTabWidth(4);
+        SetUseTabs(false);
+        SetWrapMode(wxSTC_WRAP_WORD);
+        SetWrapVisualFlags(wxSTC_WRAPVISUALFLAG_END);
+    }
+    virtual bool SetFont(const wxFont& font)
+    {
+        StyleSetFont(wxSTC_STYLE_DEFAULT, (wxFont&)font);
+        return wxStyledTextCtrl::SetFont(font);
+    }
+    void SetLexerXml()
+    {
+        SetLexer(wxSTC_LEX_XML);
+        StyleSetForeground(wxSTC_H_DEFAULT, *wxBLACK);
+        StyleSetForeground(wxSTC_H_TAG, *wxBLUE);
+        StyleSetForeground(wxSTC_H_TAGUNKNOWN, *wxBLUE);
+        StyleSetForeground(wxSTC_H_ATTRIBUTE, *wxRED);
+        StyleSetForeground(wxSTC_H_ATTRIBUTEUNKNOWN, *wxRED);
+        StyleSetBold(wxSTC_H_ATTRIBUTEUNKNOWN, true);
+        StyleSetForeground(wxSTC_H_NUMBER, *wxBLACK);
+        StyleSetForeground(wxSTC_H_DOUBLESTRING, *wxBLACK);
+        StyleSetForeground(wxSTC_H_SINGLESTRING, *wxBLACK);
+        StyleSetForeground(wxSTC_H_OTHER, *wxBLUE);
+        StyleSetForeground(wxSTC_H_COMMENT, wxTheColourDatabase->Find(wxT("GREY")));
+        StyleSetForeground(wxSTC_H_ENTITY, *wxRED);
+        StyleSetBold(wxSTC_H_ENTITY, true);
+        StyleSetForeground(wxSTC_H_TAGEND, *wxBLUE);
+        StyleSetForeground(wxSTC_H_XMLSTART, *wxBLUE);
+        StyleSetForeground(wxSTC_H_XMLEND, *wxBLUE);
+        StyleSetForeground(wxSTC_H_CDATA, *wxRED);
+    }
+protected:
+    void OnMarginClick(wxStyledTextEvent&);
+    void OnText(wxStyledTextEvent&);
+    DECLARE_EVENT_TABLE()
+};
+
+BEGIN_EVENT_TABLE(MinimalEditor, wxStyledTextCtrl)
+    EVT_STC_MARGINCLICK(wxID_ANY, MinimalEditor::OnMarginClick)
+    EVT_STC_CHANGE(wxID_ANY, MinimalEditor::OnText)
+END_EVENT_TABLE()
+
+void MinimalEditor::OnMarginClick(wxStyledTextEvent &event)
+{
+    if (event.GetMargin() == margin_id_fold)
+    {
+        int lineClick = LineFromPosition(event.GetPosition());
+        int levelClick = GetFoldLevel(lineClick);
+        if ((levelClick & wxSTC_FOLDLEVELHEADERFLAG) > 0)
+        {
+            ToggleFold(lineClick);
+        }
+    }
+}
+
+void MinimalEditor::OnText(wxStyledTextEvent& event)
+{
+    wxLogDebug(wxT("Modified"));
+    event.Skip();
+}
+
+class MinimalEditorFrame : public wxFrame
+{
+public:
+    MinimalEditorFrame() : wxFrame(NULL, wxID_ANY, _("Minimal Editor"))
+    {
+        MinimalEditor* editor = new MinimalEditor(this);
+        editor->SetFont(wxSystemSettings::GetFont(wxSYS_ANSI_FIXED_FONT));
+        wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
+        sizer->Add(editor, 1, wxEXPAND);
+        SetSizer(sizer);
+        editor->SetText(
+           "<xml>\n"
+           "   <text>\n"
+           "      This is xml with syntax highlighting, line numbers, folding, word wrap and context menu\n"
+           "   </text>\n"
+           "</xml>"
+           );
+    }
+};
+
+wxFrame* App::MinimalEditor()
+{
+    MinimalEditorFrame* frame = new MinimalEditorFrame;
+    frame->Show();
+    return frame;
+}
+
+void App::OnMinimalEditor(wxCommandEvent& WXUNUSED(event))
+{
+    MinimalEditor();
+}
+