From 3ccb912e629f8f9ecd24f7ef3a41f1b607de91c7 Mon Sep 17 00:00:00 2001 From: New Pagodi Date: Sat, 13 Jul 2019 15:53:33 -0500 Subject: [PATCH] Store SELECTION_CHANGE data in wxSTCListBoxVisualData MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The first attempt to add the wxEVT_STC_AUTOCOMP_SELECTION_CHANGE event to wxSTC passed the data needed for the event through the constructor for the wxSTCListBox class. Instead of mdifying the constructor for wxSTCListBox, it’s better to store the data in the wxSTCListBoxVisualData class with accessors for setting and retrieving the data. --- src/stc/PlatWX.cpp | 80 +++++++++++++++++++++++++++++----------------- src/stc/PlatWX.h | 3 -- 2 files changed, 50 insertions(+), 33 deletions(-) diff --git a/src/stc/PlatWX.cpp b/src/stc/PlatWX.cpp index 8fb73b8d7b..4c71d284a5 100644 --- a/src/stc/PlatWX.cpp +++ b/src/stc/PlatWX.cpp @@ -2355,6 +2355,12 @@ public: const wxColour& GetCurrentBgColour() const; const wxColour& GetCurrentTextColour() const; + // Data needed for SELECTION_CHANGE event + void SetSciListData(int*, int*, int*); + int GetListType() const; + int GetPosStart() const; + int GetStartLen() const; + private: WX_DECLARE_HASH_MAP(int, wxBitmap, wxIntegerHash, wxIntegerEqual, ImgList); @@ -2376,6 +2382,10 @@ private: wxColour m_currentTextColour; bool m_useDefaultCurrentBgColour; bool m_useDefaultCurrentTextColour; + + int* m_listType; + int* m_posStart; + int* m_startLen; }; wxSTCListBoxVisualData::wxSTCListBoxVisualData(int d):m_desiredVisibleRows(d), @@ -2385,7 +2395,8 @@ wxSTCListBoxVisualData::wxSTCListBoxVisualData(int d):m_desiredVisibleRows(d), m_useDefaultHighlightTextColour(true), m_hasListCtrlAppearance(true), m_useDefaultCurrentBgColour(true), - m_useDefaultCurrentTextColour(true) + m_useDefaultCurrentTextColour(true), + m_listType(NULL), m_posStart(NULL), m_startLen(NULL) { ComputeColours(); } @@ -2584,12 +2595,34 @@ const wxColour& wxSTCListBoxVisualData::GetCurrentTextColour() const return m_currentTextColour; } +void wxSTCListBoxVisualData::SetSciListData(int* type, int* pos, int* len) +{ + m_listType = type; + m_posStart = pos; + m_startLen = len; +} + +int wxSTCListBoxVisualData::GetListType() const +{ + return (m_listType?*m_listType:0); +} + +int wxSTCListBoxVisualData::GetPosStart() const +{ + return (m_posStart?*m_posStart:0); +} + +int wxSTCListBoxVisualData::GetStartLen() const +{ + return (m_startLen?*m_startLen:0); +} + // The class is intended to look like a standard listbox (with an optional // icon). However, it needs to look like it has focus even when it doesn't. class wxSTCListBox : public wxSystemThemedControl { public: - wxSTCListBox(wxWindow*, wxSTCListBoxVisualData*, int, int, int*, int*); + wxSTCListBox(wxWindow*, wxSTCListBoxVisualData*, int); // wxWindow overrides virtual bool AcceptsFocus() const wxOVERRIDE; @@ -2643,9 +2676,6 @@ private: CallBackAction m_doubleClickAction; void* m_doubleClickActionData; int m_aveCharWidth; - int m_listType; - int* m_posStart; - int* m_startLen; // These drawing parameters are computed or set externally. int m_borderSize; @@ -2662,14 +2692,12 @@ private: int m_textExtraVerticalPadding; }; -wxSTCListBox::wxSTCListBox(wxWindow* parent, wxSTCListBoxVisualData* v, - int ht, int listType, int* posStart, int* startLen) +wxSTCListBox::wxSTCListBox(wxWindow* parent, wxSTCListBoxVisualData* v, int ht) :wxSystemThemedControl(), m_visualData(v), m_maxStrWidth(0), m_currentRow(wxNOT_FOUND), m_doubleClickAction(NULL), m_doubleClickActionData(NULL), m_aveCharWidth(8), m_textHeight(ht), m_itemHeight(ht), - m_textTopGap(0), m_imageAreaWidth(0), m_imageAreaHeight(0), - m_listType(listType), m_posStart(posStart), m_startLen(startLen) + m_textTopGap(0), m_imageAreaWidth(0), m_imageAreaHeight(0) { wxVListBox::Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); @@ -2849,11 +2877,11 @@ void wxSTCListBox::SelectHelper(int i) // Scintilla currently used does not support it. //If the Scintilla component is updated, it should be sufficient to: - // 1) change this method to use a callback to let Scintilla generate the + // 1) Change this method to use a callback to let Scintilla generate the // event. - // 2) remove the member variables m_listType, m_posStart, and m_startLen - // from this and the ListBoxImpl class since they will no longer be - // needed. The SetListInfo method can also be removed from ListBoxImpl. + // 2) Remove the SELECTION_CHANGE event data from the wxSTCListBoxVisualData + // class and the SetListInfo method from the ListBoxImpl class since they + // will no longer be needed. wxStyledTextCtrl* stc = wxDynamicCast(GetGrandParent(), wxStyledTextCtrl); @@ -2861,12 +2889,10 @@ void wxSTCListBox::SelectHelper(int i) { wxStyledTextEvent evt(wxEVT_STC_AUTOCOMP_SELECTION_CHANGE,stc->GetId()); evt.SetEventObject(stc); - evt.SetListType(m_listType); + evt.SetListType(m_visualData->GetListType()); - if ( m_posStart != NULL && m_startLen != NULL ) - evt.SetPosition(*m_posStart - *m_startLen); - else - evt.SetPosition(stc->AutoCompPosStart()); + evt.SetPosition(m_visualData->GetPosStart() - + m_visualData->GetStartLen()); if ( 0 <= i && i < static_cast(m_labels.size()) ) evt.SetString(m_labels[i]); @@ -3076,8 +3102,7 @@ void wxSTCListBox::OnDrawBackground(wxDC &dc, const wxRect &rect,size_t n) const class wxSTCListBoxWin : public wxSTCPopupWindow { public: - wxSTCListBoxWin(wxWindow*, wxSTCListBox**, wxSTCListBoxVisualData*, - int, int, int*, int*); + wxSTCListBoxWin(wxWindow*, wxSTCListBox**, wxSTCListBoxVisualData*, int); protected: void OnPaint(wxPaintEvent&); @@ -3087,11 +3112,10 @@ private: }; wxSTCListBoxWin::wxSTCListBoxWin(wxWindow* parent, wxSTCListBox** lb, - wxSTCListBoxVisualData* v, int h, - int t, int* p, int* l) + wxSTCListBoxVisualData* v, int h) :wxSTCPopupWindow(parent) { - *lb = new wxSTCListBox(this, v, h, t, p, l); + *lb = new wxSTCListBox(this, v, h); // Use the background of this window to form a frame around the listbox // except on macos where the native Scintilla popup has no frame. @@ -3125,8 +3149,7 @@ void wxSTCListBoxWin::OnPaint(wxPaintEvent& WXUNUSED(evt)) //---------------------------------------------------------------------- ListBoxImpl::ListBoxImpl() - :m_listBox(NULL), m_visualData(new wxSTCListBoxVisualData(5)), - m_listType(NULL), m_posStart(NULL), m_startLen(NULL) + :m_listBox(NULL), m_visualData(new wxSTCListBoxVisualData(5)) { } @@ -3145,8 +3168,7 @@ void ListBoxImpl::Create(Window &parent, int WXUNUSED(ctrlID), bool WXUNUSED(unicodeMode_), int WXUNUSED(technology_)) { wid = new wxSTCListBoxWin(GETWIN(parent.GetID()), &m_listBox, m_visualData, - lineHeight_, (m_listType?*m_listType:0), - m_posStart, m_startLen); + lineHeight_); } @@ -3243,9 +3265,7 @@ void ListBoxImpl::SetDoubleClickAction(CallBackAction action, void *data) { void ListBoxImpl::SetListInfo(int* listType, int* posStart, int* startLen) { - m_listType = listType; - m_posStart = posStart; - m_startLen = startLen; + m_visualData->SetSciListData(listType,posStart,startLen); } diff --git a/src/stc/PlatWX.h b/src/stc/PlatWX.h index 8d1a73e63f..714f5e4180 100644 --- a/src/stc/PlatWX.h +++ b/src/stc/PlatWX.h @@ -22,9 +22,6 @@ class ListBoxImpl : public ListBox { private: wxSTCListBox* m_listBox; wxSTCListBoxVisualData* m_visualData; - int* m_listType; - int* m_posStart; - int* m_startLen; public: ListBoxImpl();