X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4424b2a11606b2611be4cbe27ece6993888fdc4a..0a5bb138a71dfc1c706fc0858fb2801500e2c2e8:/wxPython/src/_vscroll.i?ds=sidebyside diff --git a/wxPython/src/_vscroll.i b/wxPython/src/_vscroll.i index 59f8eeb156..546c0db92b 100644 --- a/wxPython/src/_vscroll.i +++ b/wxPython/src/_vscroll.i @@ -95,6 +95,11 @@ public: wxCoord GetLinesHeight(size_t lineMin, size_t lineMax) const { return wxVScrolledWindow::GetLinesHeight(lineMin, lineMax); } + // update the thumb size shown by the scrollbar + void UpdateScrollbar() { wxVScrolledWindow::UpdateScrollbar(); } + + // remove the scrollbar completely because we don't need it + void RemoveScrollbar() { wxVScrolledWindow::RemoveScrollbar(); } PYPRIVATE; }; @@ -131,7 +136,7 @@ MustHaveApp(wxPyVScrolledWindow); class wxPyVScrolledWindow : public wxPanel { public: - %pythonAppend wxPyVScrolledWindow "self._setOORInfo(self); self._setCallbackInfo(self, VScrolledWindow)" + %pythonAppend wxPyVScrolledWindow "self._setOORInfo(self);" setCallbackInfo(VScrolledWindow) %pythonAppend wxPyVScrolledWindow() "" @@ -215,257 +220,12 @@ public: // get the total height of the lines between lineMin (inclusive) and // lineMax (exclusive) wxCoord GetLinesHeight(size_t lineMin, size_t lineMax) const; -}; - - - -//---------------------------------------------------------------------------- -%newgroup; - -// wxHVScrolledWindow - -// First, the C++ version -%{ -class wxPyHVScrolledWindow : public wxHVScrolledWindow -{ - DECLARE_ABSTRACT_CLASS(wxPyHVScrolledWindow) -public: - wxPyHVScrolledWindow() : wxHVScrolledWindow() {} - wxPyHVScrolledWindow(wxWindow *parent, - wxWindowID id = wxID_ANY, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = 0, - const wxString& name = wxPyPanelNameStr) - : wxHVScrolledWindow(parent, id, pos, size, style, name) {} - - // Overridable virtuals - - // these functions must be overridden in the derived class and they should - // return the width or height of the given line in pixels - DEC_PYCALLBACK_COORD_SIZET_constpure(OnGetRowHeight); - DEC_PYCALLBACK_COORD_SIZET_constpure(OnGetColumnWidth); - - // the following functions don't need to be overridden but it may be useful - // to do if calculating the lines widths or heights is a relatively - // expensive operation as it gives the user code a possibility to calculate - // several of them at once - // - // OnGetRowsHeightHint() and OnGetColumnsWidthHint() are normally called - // just before OnGetRowHeight() and OnGetColumnWidth(), respectively, but - // you shouldn't rely on the latter methods being called for all lines in - // the interval specified here. It is also possible that OnGetRowHeight() - // or OnGetColumnWidth() will be called for the lines outside of this - // interval, so this is really just a hint, not a promise. - // - // finally note that min is inclusive, while max is exclusive, as usual - DEC_PYCALLBACK_VOID_SIZETSIZET_const(OnGetRowsHeightHint); - DEC_PYCALLBACK_VOID_SIZETSIZET_const(OnGetColumnsWidthHint); - - // when the number of lines changes, we try to estimate the total width or - // height of all lines which is a rather expensive operation in terms of - // lines access, so if the user code may estimate the average height - // better/faster than we do, it should override this function to implement - // its own logic - // - // this function should return the best guess for the total height it may - // make - DEC_PYCALLBACK_COORD_const(EstimateTotalHeight); - DEC_PYCALLBACK_COORD_const(EstimateTotalWidth); - - - // Also expose some other interesting protected methods - - // find the index of the horizontal line we need to show at the top of the - // window such that the last (fully or partially) visible line is the given - // one - size_t FindFirstFromRight(size_t columnLast, bool fullyVisible = false) - { return wxHVScrolledWindow::FindFirstFromRight(columnLast, fullyVisible); } - - // find the index of the vertical line we need to show at the top of the - // window such that the last (fully or partially) visible line is the given - // one - size_t FindFirstFromBottom(size_t lineLast, bool fullyVisible = false) - { return wxHVScrolledWindow::FindFirstFromBottom(lineLast, fullyVisible); } - - - // get the total width or height of the lines between lineMin (inclusive) - // and lineMax (exclusive) - wxCoord GetRowsHeight(size_t lineMin, size_t lineMax) const - { return wxHVScrolledWindow::GetRowsHeight(lineMin, lineMax); } - wxCoord GetColumnsWidth(size_t columnMin, size_t columnMax) const - { return wxHVScrolledWindow::GetColumnsWidth(columnMin, columnMax); } - - PYPRIVATE; -}; - - -IMPLEMENT_ABSTRACT_CLASS(wxPyHVScrolledWindow, wxHVScrolledWindow); - -IMP_PYCALLBACK_COORD_SIZET_constpure(wxPyHVScrolledWindow, wxHVScrolledWindow, OnGetRowHeight); -IMP_PYCALLBACK_COORD_SIZET_constpure(wxPyHVScrolledWindow, wxHVScrolledWindow, OnGetColumnWidth); -IMP_PYCALLBACK_VOID_SIZETSIZET_const(wxPyHVScrolledWindow, wxHVScrolledWindow, OnGetRowsHeightHint); -IMP_PYCALLBACK_VOID_SIZETSIZET_const(wxPyHVScrolledWindow, wxHVScrolledWindow, OnGetColumnsWidthHint); -IMP_PYCALLBACK_COORD_const (wxPyHVScrolledWindow, wxHVScrolledWindow, EstimateTotalHeight); -IMP_PYCALLBACK_COORD_const (wxPyHVScrolledWindow, wxHVScrolledWindow, EstimateTotalWidth); -%} - - - - -// Now define this class for SWIG - -/* - This class is strongly influenced by wxVScrolledWindow. In fact, much of - code is line for line the same except it EXPLICITLY states which axis is - being worked on. Like wxVScrolledWindow, this class is here to provide - an easy way to implement variable line sizes. The difference is that - wxVScrolledWindow only works with vertical scrolling. This class extends - the behavior of wxVScrolledWindow to the horizontal axis in addition to the - vertical axis. - - The scrolling is also "virtual" in the sense that line widths and heights - only need to be known for lines that are currently visible. - - Like wxVScrolledWindow, this is a generalization of the wxScrolledWindow - class which can be only used when all horizontal lines have the same width - and all of the vertical lines have the same height. Like wxVScrolledWinow - it lacks some of wxScrolledWindow features such as scrolling another window - or only scrolling a rectangle of the window and not its entire client area. - - If only vertical scrolling is needed, wxVScrolledWindow is recommended - because it is simpler to use (and you get to type less). - - There is no wxHScrolledWindow but horizontal only scrolling is implemented - easily enough with this class. If someone feels the need for such a class, - implementing it is trivial. - */ -MustHaveApp(wxPyHVScrolledWindow); - -%rename(HVScrolledWindow) wxPyHVScrolledWindow; -class wxPyHVScrolledWindow : public wxPanel -{ -public: - %pythonAppend wxPyHVScrolledWindow "self._setOORInfo(self); self._setCallbackInfo(self, VScrolledWindow)" - %pythonAppend wxPyHVScrolledWindow() "" - - // normal ctor, no need to call Create() after this one - // - // note that wxVSCROLL and wxHSCROLL are always automatically added to our - // style, there is no need to specify them explicitly - wxPyHVScrolledWindow(wxWindow *parent, - wxWindowID id = wxID_ANY, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = 0, - const wxString& name = wxPyPanelNameStr); - - %RenameCtor(PreHVScrolledWindow, wxPyHVScrolledWindow()); - void _setCallbackInfo(PyObject* self, PyObject* _class); - - - bool Create(wxWindow *parent, - wxWindowID id = wxID_ANY, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = 0, - const wxString& name = wxPyPanelNameStr); - - // operations - // ---------- - - // set the number of lines the window contains for each axis: the derived - // class must provide the widths and heights for all lines with indices up - // to each of the one given here in its OnGetColumnWidth() and - // OnGetRowHeight() - void SetRowColumnCounts(size_t rowCount, size_t columnCount); - - // with physical scrolling on, the device origin is changed properly when - // a wxPaintDC is prepared, children are actually moved and layed out - // properly, and the contents of the window (pixels) are actually moved - void EnablePhysicalScrolling(bool scrolling = true); - - // scroll to the specified line: it will become the first visible line in - // the window - // - // return true if we scrolled the window, false if nothing was done - bool ScrollToRow(size_t row); - bool ScrollToColumn(size_t column); - bool ScrollToRowColumn(size_t row, size_t column); - - // scroll by the specified number of lines/pages - virtual bool ScrollRows(int rows); - virtual bool ScrollColumns(int columns); - virtual bool ScrollRowsColumns(int rows, int columns); - virtual bool ScrollRowPages(int pages); - virtual bool ScrollColumnPages(int pages); - virtual bool ScrollPages(int rowPages, int columnPages); - - // redraw the specified line - virtual void RefreshRow(size_t line); - virtual void RefreshColumn(size_t line); - virtual void RefreshRowColumn(size_t row, size_t column); - - // redraw all lines in the specified range (inclusive) - virtual void RefreshRows(size_t from, size_t to); - virtual void RefreshColumns(size_t from, size_t to); - virtual void RefreshRowsColumns(size_t fromRow, size_t toRow, - size_t fromColumn, size_t toColumn); - - // return the horizontal and vertical line within a wxPoint at the - // specified (in physical coordinates) position or. - - // wxNOT_FOUND in either or both axes if no line is present at the - // requested coordinates, i.e. if it is past the last lines - %Rename(HitTestXY, wxPoint, HitTest(wxCoord x, wxCoord y) const); - wxPoint HitTest(const wxPoint& pt) const; - - // recalculate all our parameters and redisplay all lines - virtual void RefreshAll(); - - - // accessors - // --------- - - // get the number of lines this window contains (previously set by - // SetLineCount()) - size_t GetRowCount() const; - size_t GetColumnCount() const; - wxSize GetRowColumnCounts() const; - - // get the first currently visible line/lines - size_t GetVisibleRowsBegin() const; - size_t GetVisibleColumnsBegin() const; - wxPoint GetVisibleBegin() const; - - // get the last currently visible line/lines - size_t GetVisibleRowsEnd() const; - size_t GetVisibleColumnsEnd() const; - wxPoint GetVisibleEnd() const; - - // is this line currently visible? - bool IsRowVisible(size_t row) const; - bool IsColumnVisible(size_t column) const; - bool IsVisible(size_t row, size_t column) const; - - - // find the index of the horizontal line we need to show at the top of the - // window such that the last (fully or partially) visible line is the given - // one - size_t FindFirstFromRight(size_t columnLast, bool fullyVisible = false); - - // find the index of the vertical line we need to show at the top of the - // window such that the last (fully or partially) visible line is the given - // one - size_t FindFirstFromBottom(size_t lineLast, bool fullyVisible = false); - - - // get the total width or height of the lines between lineMin (inclusive) - // and lineMax (exclusive) - wxCoord GetRowsHeight(size_t lineMin, size_t lineMax) const; - wxCoord GetColumnsWidth(size_t columnMin, size_t columnMax) const; - + %property(FirstVisibleLine, GetFirstVisibleLine, doc="See `GetFirstVisibleLine`"); + %property(LastVisibleLine, GetLastVisibleLine, doc="See `GetLastVisibleLine`"); + %property(LineCount, GetLineCount, SetLineCount, doc="See `GetLineCount` and `SetLineCount`"); + %property(VisibleBegin, GetVisibleBegin, doc="See `GetVisibleBegin`"); + %property(VisibleEnd, GetVisibleEnd, doc="See `GetVisibleEnd`"); }; @@ -517,7 +277,7 @@ public: // // the base class version doesn't do anything // virtual void OnDrawSeparator(wxDC& dc, wxRect& rect, size_t n) const; - DEC_PYCALLBACK__DCRECTSIZET_constpure(OnDrawSeparator); + DEC_PYCALLBACK__DCRECTSIZET2_const(OnDrawSeparator); // this method is used to draw the items background and, maybe, a border @@ -538,7 +298,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxPyVListBox, wxVListBox); IMP_PYCALLBACK__DCRECTSIZET_constpure(wxPyVListBox, wxVListBox, OnDrawItem); IMP_PYCALLBACK_COORD_SIZET_constpure (wxPyVListBox, wxVListBox, OnMeasureItem); -IMP_PYCALLBACK__DCRECTSIZET_constpure(wxPyVListBox, wxVListBox, OnDrawSeparator); +IMP_PYCALLBACK__DCRECTSIZET2_const (wxPyVListBox, wxVListBox, OnDrawSeparator); IMP_PYCALLBACK__DCRECTSIZET_const (wxPyVListBox, wxVListBox, OnDrawBackground); %} @@ -562,7 +322,7 @@ MustHaveApp(wxPyVListBox); class wxPyVListBox : public wxPyVScrolledWindow { public: - %pythonAppend wxPyVListBox "self._setOORInfo(self);self._setCallbackInfo(self, VListBox)" + %pythonAppend wxPyVListBox "self._setOORInfo(self);" setCallbackInfo(VListBox) %pythonAppend wxPyVListBox() "" @@ -709,6 +469,15 @@ public: // change the background colour of the selected cells void SetSelectionBackground(const wxColour& col); + virtual void OnDrawSeparator(wxDC& dc, wxRect& rect, size_t n) const; + virtual void OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const; + + %property(FirstSelected, GetFirstSelected, doc="See `GetFirstSelected`"); + %property(ItemCount, GetItemCount, SetItemCount, doc="See `GetItemCount` and `SetItemCount`"); + %property(Margins, GetMargins, SetMargins, doc="See `GetMargins` and `SetMargins`"); + %property(SelectedCount, GetSelectedCount, doc="See `GetSelectedCount`"); + %property(Selection, GetSelection, SetSelection, doc="See `GetSelection` and `SetSelection`"); + %property(SelectionBackground, GetSelectionBackground, SetSelectionBackground, doc="See `GetSelectionBackground` and `SetSelectionBackground`"); }; @@ -745,6 +514,10 @@ public: // this function may be overridden to decorate HTML returned by OnGetItem() DEC_PYCALLBACK_STRING_SIZET(OnGetItemMarkup); + // These are from wxVListBox + DEC_PYCALLBACK__DCRECTSIZET2_const(OnDrawSeparator); + DEC_PYCALLBACK__DCRECTSIZET_const(OnDrawBackground); + // TODO: // // this method allows to customize the selection appearance: it may be used // // to specify the colour of the text which normally has the given colour @@ -759,6 +532,11 @@ public: // // globally using SetSelectionBackground() // virtual wxColour GetSelectedTextBgColour(const wxColour& colBg) const; + + // This method may be overriden to handle clicking on a link in + // the listbox. By default, clicking links is ignored. + virtual void OnLinkClicked(size_t n, + const wxHtmlLinkInfo& link); PYPRIVATE; }; @@ -768,7 +546,24 @@ IMPLEMENT_ABSTRACT_CLASS(wxPyHtmlListBox, wxHtmlListBox) IMP_PYCALLBACK_STRING_SIZET_pure(wxPyHtmlListBox, wxHtmlListBox, OnGetItem); IMP_PYCALLBACK_STRING_SIZET (wxPyHtmlListBox, wxHtmlListBox, OnGetItemMarkup); - +IMP_PYCALLBACK__DCRECTSIZET2_const (wxPyHtmlListBox, wxHtmlListBox, OnDrawSeparator); +IMP_PYCALLBACK__DCRECTSIZET_const (wxPyHtmlListBox, wxHtmlListBox, OnDrawBackground); + + +void wxPyHtmlListBox::OnLinkClicked(size_t n, + const wxHtmlLinkInfo& link) { + bool found; + wxPyBlock_t blocked = wxPyBeginBlockThreads(); + if ((found = wxPyCBH_findCallback(m_myInst, "OnLinkClicked"))) { + PyObject* obj = wxPyConstructObject((void*)&link, wxT("wxHtmlLinkInfo"), 0); + wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iO)", n, obj)); + Py_DECREF(obj); + } + wxPyEndBlockThreads(blocked); + if (! found) + wxPyHtmlListBox::OnLinkClicked(n, link); +} + %} @@ -782,7 +577,7 @@ MustHaveApp(wxPyHtmlListBox); class wxPyHtmlListBox : public wxPyVListBox { public: - %pythonAppend wxPyHtmlListBox "self._setOORInfo(self);self._setCallbackInfo(self, HtmlListBox)" + %pythonAppend wxPyHtmlListBox "self._setOORInfo(self);" setCallbackInfo(HtmlListBox) %pythonAppend wxPyHtmlListBox() "" @@ -812,9 +607,55 @@ public: // retrieve the file system used by the wxHtmlWinParser: if you use // relative paths in your HTML, you should use its ChangePathTo() method wxFileSystem& GetFileSystem(); + + void OnLinkClicked(size_t n, const wxHtmlLinkInfo& link); + + %property(FileSystem, GetFileSystem, doc="See `GetFileSystem`"); +}; + + + +//--------------------------------------------------------------------------- + +%{ + const wxArrayString wxPyEmptyStringArray; +%} +MAKE_CONST_WXSTRING(SimpleHtmlListBoxNameStr); + + +enum { + wxHLB_DEFAULT_STYLE, + wxHLB_MULTIPLE }; +MustHaveApp(wxSimpleHtmlListBox); +class wxSimpleHtmlListBox : public wxPyHtmlListBox, + public wxItemContainer +{ +public: + %pythonAppend wxSimpleHtmlListBox "self._setOORInfo(self)"; + %pythonAppend wxSimpleHtmlListBox() ""; + + wxSimpleHtmlListBox(wxWindow *parent, + wxWindowID id = -1, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxArrayString& choices = wxPyEmptyStringArray, + long style = wxHLB_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxPySimpleHtmlListBoxNameStr); + %RenameCtor(PreSimpleHtmlListBox, wxSimpleHtmlListBox()); + + bool Create(wxWindow *parent, + wxWindowID id = -1, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size= wxDefaultSize, + const wxArrayString& choices = wxPyEmptyStringArray, + long style = wxHLB_DEFAULT_STYLE, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxPySimpleHtmlListBoxNameStr); +}; //---------------------------------------------------------------------------