From: Vadim Zeitlin Date: Tue, 5 Feb 2013 20:46:16 +0000 (+0000) Subject: Add simple tests for Scintilla annotations to the stc sample. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/2fb4e3cb0a3e91d7e89a0ece11a307cf222274eb Add simple tests for Scintilla annotations to the stc sample. Show how add, remove and clear annotations and also how to update the text width when long annotations are added. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73463 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/samples/stc/defsext.h b/samples/stc/defsext.h index d554b03c5b..97cb8bc184 100644 --- a/samples/stc/defsext.h +++ b/samples/stc/defsext.h @@ -58,6 +58,12 @@ enum { myID_OVERTYPE, myID_READONLY, myID_WRAPMODEON, + myID_ANNOTATION_ADD, + myID_ANNOTATION_REMOVE, + myID_ANNOTATION_CLEAR, + myID_ANNOTATION_STYLE_HIDDEN, + myID_ANNOTATION_STYLE_STANDARD, + myID_ANNOTATION_STYLE_BOXED, myID_CHANGECASE, myID_CHANGELOWER, myID_CHANGEUPPER, diff --git a/samples/stc/edit.cpp b/samples/stc/edit.cpp index 17e3737927..c220fa7faf 100644 --- a/samples/stc/edit.cpp +++ b/samples/stc/edit.cpp @@ -28,6 +28,7 @@ // need because it includes almost all 'standard' wxWidgets headers) #ifndef WX_PRECOMP #include "wx/wx.h" + #include "wx/textdlg.h" #endif //! wxWidgets headers @@ -49,6 +50,8 @@ // declarations //============================================================================ +// The (uniform) style used for the annotations. +const int ANNOTATION_STYLE = wxSTC_STYLE_LASTPREDEFINED + 1; //============================================================================ // implementation @@ -93,6 +96,13 @@ BEGIN_EVENT_TABLE (Edit, wxStyledTextCtrl) EVT_MENU (myID_WRAPMODEON, Edit::OnWrapmodeOn) EVT_MENU (myID_CHARSETANSI, Edit::OnUseCharset) EVT_MENU (myID_CHARSETMAC, Edit::OnUseCharset) + // annotations + EVT_MENU (myID_ANNOTATION_ADD, Edit::OnAnnotationAdd) + EVT_MENU (myID_ANNOTATION_REMOVE, Edit::OnAnnotationRemove) + EVT_MENU (myID_ANNOTATION_CLEAR, Edit::OnAnnotationClear) + EVT_MENU (myID_ANNOTATION_STYLE_HIDDEN, Edit::OnAnnotationStyle) + EVT_MENU (myID_ANNOTATION_STYLE_STANDARD, Edit::OnAnnotationStyle) + EVT_MENU (myID_ANNOTATION_STYLE_BOXED, Edit::OnAnnotationStyle) // extra EVT_MENU (myID_CHANGELOWER, Edit::OnChangeCase) EVT_MENU (myID_CHANGEUPPER, Edit::OnChangeCase) @@ -157,7 +167,10 @@ Edit::Edit (wxWindow *parent, wxWindowID id, MarkerDefine (wxSTC_MARKNUM_FOLDERMIDTAIL, wxSTC_MARK_EMPTY, wxT("BLACK"), wxT("BLACK")); MarkerDefine (wxSTC_MARKNUM_FOLDERTAIL, wxSTC_MARK_EMPTY, wxT("BLACK"), wxT("BLACK")); - // miscelaneous + // annotations + AnnotationSetVisible(wxSTC_ANNOTATION_BOXED); + + // miscellaneous m_LineNrMargin = TextWidth (wxSTC_STYLE_LINENUMBER, wxT("_999999")); m_FoldingMargin = 16; CmdKeyClear (wxSTC_KEY_TAB, 0); // this is done by the menu accelerator key @@ -312,6 +325,79 @@ void Edit::OnUseCharset (wxCommandEvent &event) { SetCodePage (charset); } +void Edit::OnAnnotationAdd(wxCommandEvent& WXUNUSED(event)) +{ + const int line = GetCurrentLine(); + + wxString ann = AnnotationGetText(line); + ann = wxGetTextFromUser + ( + wxString::Format("Enter annotation for the line %d", line), + "Edit annotation", + ann, + this + ); + if ( ann.empty() ) + return; + + AnnotationSetText(line, ann); + AnnotationSetStyle(line, ANNOTATION_STYLE); + + // Scintilla doesn't update the scroll width for annotations, even with + // scroll width tracking on, so do it manually. + const int width = GetScrollWidth(); + + // NB: The following adjustments are only needed when using + // wxSTC_ANNOTATION_BOXED annotations style, but we apply them always + // in order to make things simpler and not have to redo the width + // calculations when the annotations visibility changes. In a real + // program you'd either just stick to a fixed annotations visibility or + // update the width when it changes. + + // Take into account the fact that the annotation is shown indented, with + // the same indent as the line it's attached to. + int indent = GetLineIndentation(line); + + // This is just a hack to account for the width of the box, there doesn't + // seem to be any way to get it directly from Scintilla. + indent += 3; + + const int widthAnn = TextWidth(ANNOTATION_STYLE, ann + wxString(indent, ' ')); + + if (widthAnn > width) + SetScrollWidth(widthAnn); +} + +void Edit::OnAnnotationRemove(wxCommandEvent& WXUNUSED(event)) +{ + AnnotationSetText(GetCurrentLine(), wxString()); +} + +void Edit::OnAnnotationClear(wxCommandEvent& WXUNUSED(event)) +{ + AnnotationClearAll(); +} + +void Edit::OnAnnotationStyle(wxCommandEvent& event) +{ + int style = 0; + switch (event.GetId()) { + case myID_ANNOTATION_STYLE_HIDDEN: + style = wxSTC_ANNOTATION_HIDDEN; + break; + + case myID_ANNOTATION_STYLE_STANDARD: + style = wxSTC_ANNOTATION_STANDARD; + break; + + case myID_ANNOTATION_STYLE_BOXED: + style = wxSTC_ANNOTATION_BOXED; + break; + } + + AnnotationSetVisible(style); +} + void Edit::OnChangeCase (wxCommandEvent &event) { switch (event.GetId()) { case myID_CHANGELOWER: { @@ -417,6 +503,12 @@ bool Edit::InitializePrefs (const wxString &name) { StyleSetBackground (wxSTC_STYLE_LINENUMBER, *wxWHITE); SetMarginWidth (m_LineNrID, 0); // start out not visible + // annotations style + StyleSetBackground(ANNOTATION_STYLE, wxColour(244, 220, 220)); + StyleSetForeground(ANNOTATION_STYLE, *wxBLACK); + StyleSetSizeFractional(ANNOTATION_STYLE, + (StyleGetSizeFractional(wxSTC_STYLE_DEFAULT)*4)/5); + // default fonts for all styles! int Nr; for (Nr = 0; Nr < wxSTC_STYLE_LASTPREDEFINED; Nr++) { diff --git a/samples/stc/edit.h b/samples/stc/edit.h index d22222f67c..f9c5e7e6bc 100644 --- a/samples/stc/edit.h +++ b/samples/stc/edit.h @@ -91,6 +91,11 @@ public: void OnSetReadOnly (wxCommandEvent &event); void OnWrapmodeOn (wxCommandEvent &event); void OnUseCharset (wxCommandEvent &event); + // annotations + void OnAnnotationAdd(wxCommandEvent& event); + void OnAnnotationRemove(wxCommandEvent& event); + void OnAnnotationClear(wxCommandEvent& event); + void OnAnnotationStyle(wxCommandEvent& event); //! extra void OnChangeCase (wxCommandEvent &event); void OnConvertEOL (wxCommandEvent &event); diff --git a/samples/stc/stctest.cpp b/samples/stc/stctest.cpp index a662f074d5..f34b476e22 100644 --- a/samples/stc/stctest.cpp +++ b/samples/stc/stctest.cpp @@ -268,8 +268,6 @@ BEGIN_EVENT_TABLE (AppFrame, wxFrame) 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 (wxID_REDO, AppFrame::OnEdit) EVT_MENU (wxID_UNDO, AppFrame::OnEdit) @@ -517,6 +515,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")); @@ -550,10 +562,13 @@ void AppFrame::CreateMenu () 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)