X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0015757fecd9eca06336af8c10e900589c34cbea..4d623b67ee74794fbeba5805a269433d030c67d5:/samples/stc/edit.cpp 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++) {