1 /////////////////////////////////////////////////////////////////////////////
 
   3 // Purpose:     Wrappers for the "gizmo" classes in wx/contrib
 
   7 // Created:     23-Nov-2001
 
   9 // Copyright:   (c) 2001 by Total Control Software
 
  10 // Licence:     wxWindows license
 
  11 /////////////////////////////////////////////////////////////////////////////
 
  14 "Various *gizmo* classes: `DynamicSashWindow`, `EditableListBox`,
 
  15 `LEDNumberCtrl`, `TreeListCtrl`, etc."
 
  18 %module(package="wx", docstring=DOCSTRING) gizmos
 
  22 #include "wx/wxPython/wxPython.h"
 
  23 #include "wx/wxPython/pyclasses.h"
 
  25 #include <wx/gizmos/dynamicsash.h>
 
  26 #include <wx/gizmos/editlbox.h>
 
  27 #include <wx/gizmos/splittree.h>
 
  28 #include <wx/gizmos/ledctrl.h>
 
  29 #include <wx/gizmos/statpict.h>
 
  31 #include <wx/listctrl.h>
 
  32 #include <wx/treectrl.h>
 
  33 #include <wx/imaglist.h>
 
  37 //---------------------------------------------------------------------------
 
  41 %pythoncode { import wx }
 
  42 %pythoncode { __docfilter__ = wx._core.__DocFilter(globals()) }
 
  45 MAKE_CONST_WXSTRING2(DynamicSashNameStr,     wxT("dynamicSashWindow"));
 
  46 MAKE_CONST_WXSTRING2(EditableListBoxNameStr, wxT("editableListBox"));
 
  47 MAKE_CONST_WXSTRING(StaticPictureNameStr);                     
 
  49 MAKE_CONST_WXSTRING_NOSWIG(EmptyString);
 
  51 //---------------------------------------------------------------------------
 
  54     wxDS_MANAGE_SCROLLBARS,
 
  58 %constant wxEventType wxEVT_DYNAMIC_SASH_SPLIT;
 
  59 %constant wxEventType wxEVT_DYNAMIC_SASH_UNIFY;
 
  63     wxDynamicSashSplitEvents are sent to your view by wxDynamicSashWindow
 
  64     whenever your view is being split by the user.  It is your
 
  65     responsibility to handle this event by creating a new view window as
 
  66     a child of the wxDynamicSashWindow.  wxDynamicSashWindow will
 
  67     automatically reparent it to the proper place in its window hierarchy.
 
  69 class wxDynamicSashSplitEvent : public wxCommandEvent {
 
  71     wxDynamicSashSplitEvent(wxObject *target);
 
  76     wxDynamicSashUnifyEvents are sent to your view by wxDynamicSashWindow
 
  77     whenever the sash which splits your view and its sibling is being
 
  78     reunified such that your view is expanding to replace its sibling.
 
  79     You needn't do anything with this event if you are allowing
 
  80     wxDynamicSashWindow to manage your view's scrollbars, but it is useful
 
  81     if you are managing the scrollbars yourself so that you can keep
 
  82     the scrollbars' event handlers connected to your view's event handler
 
  85 class wxDynamicSashUnifyEvent : public wxCommandEvent {
 
  87     wxDynamicSashUnifyEvent(wxObject *target);
 
  96     wxDynamicSashWindow widgets manages the way other widgets are viewed.
 
  97     When a wxDynamicSashWindow is first shown, it will contain one child
 
  98     view, a viewport for that child, and a pair of scrollbars to allow the
 
  99     user to navigate the child view area.  Next to each scrollbar is a small
 
 100     tab.  By clicking on either tab and dragging to the appropriate spot, a
 
 101     user can split the view area into two smaller views separated by a
 
 102     draggable sash.  Later, when the user wishes to reunify the two subviews,
 
 103     the user simply drags the sash to the side of the window.
 
 104     wxDynamicSashWindow will automatically reparent the appropriate child
 
 105     view back up the window hierarchy, and the wxDynamicSashWindow will have
 
 106     only one child view once again.
 
 108     As an application developer, you will simply create a wxDynamicSashWindow
 
 109     using either the Create() function or the more complex constructor
 
 110     provided below, and then create a view window whose parent is the
 
 111     wxDynamicSashWindow.  The child should respond to
 
 112     wxDynamicSashSplitEvents -- perhaps with an OnSplit() event handler -- by
 
 113     constructing a new view window whose parent is also the
 
 114     wxDynamicSashWindow.  That's it!  Now your users can dynamically split
 
 115     and reunify the view you provided.
 
 117     If you wish to handle the scrollbar events for your view, rather than
 
 118     allowing wxDynamicSashWindow to do it for you, things are a bit more
 
 119     complex.  (You might want to handle scrollbar events yourself, if,
 
 120     for instance, you wish to scroll a subwindow of the view you add to
 
 121     your wxDynamicSashWindow object, rather than scrolling the whole view.)
 
 122     In this case, you will need to construct your wxDynamicSashWindow without
 
 123     the wxDS_MANAGE_SCROLLBARS style and  you will need to use the
 
 124     GetHScrollBar() and GetVScrollBar() methods to retrieve the scrollbar
 
 125     controls and call SetEventHanler() on them to redirect the scrolling
 
 126     events whenever your window is reparented by wxDyanmicSashWindow.
 
 127     You will need to set the scrollbars' event handler at three times:
 
 129         *  When your view is created
 
 130         *  When your view receives a wxDynamicSashSplitEvent
 
 131         *  When your view receives a wxDynamicSashUnifyEvent
 
 133     See the dynsash_switch sample application for an example which does this.
 
 137 MustHaveApp(wxDynamicSashWindow);
 
 139 class wxDynamicSashWindow : public wxWindow {
 
 141     %pythonAppend wxDynamicSashWindow         "self._setOORInfo(self)"
 
 142     %pythonAppend wxDynamicSashWindow()       ""
 
 144     wxDynamicSashWindow(wxWindow *parent, wxWindowID id=-1,
 
 145                         const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
 
 146                         long style = wxCLIP_CHILDREN | wxDS_MANAGE_SCROLLBARS | wxDS_DRAG_CORNER,
 
 147                         const wxString& name = wxPyDynamicSashNameStr);
 
 148     %RenameCtor(PreDynamicSashWindow, wxDynamicSashWindow());
 
 150     bool Create(wxWindow *parent, wxWindowID id=-1,
 
 151                 const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
 
 152                 long style = wxCLIP_CHILDREN | wxDS_MANAGE_SCROLLBARS | wxDS_DRAG_CORNER,
 
 153                 const wxString& name = wxPyDynamicSashNameStr);
 
 155     wxScrollBar *GetHScrollBar(const wxWindow *child) const;
 
 156     wxScrollBar *GetVScrollBar(const wxWindow *child) const;
 
 162 EVT_DYNAMIC_SASH_SPLIT = wx.PyEventBinder( wxEVT_DYNAMIC_SASH_SPLIT, 1 )
 
 163 EVT_DYNAMIC_SASH_UNIFY = wx.PyEventBinder( wxEVT_DYNAMIC_SASH_UNIFY, 1 )
 
 166 //---------------------------------------------------------------------------
 
 167 //---------------------------------------------------------------------------
 
 176 %typemap(out) wxPyListCtrl*
 
 177 { $result = wxPyMake_wxObject((wxObject*)$1, (bool)$owner); }
 
 180 // This class provides a composite control that lets the
 
 181 // user easily enter list of strings
 
 182 MustHaveApp(wxEditableListBox);
 
 183 class wxEditableListBox : public wxPanel
 
 186     %pythonAppend wxEditableListBox         "self._setOORInfo(self)"
 
 187     %pythonAppend wxEditableListBox()       ""
 
 189     wxEditableListBox(wxWindow *parent, wxWindowID id=-1,
 
 190                       const wxString& label = wxPyEmptyString,
 
 191                       const wxPoint& pos = wxDefaultPosition,
 
 192                       const wxSize& size = wxDefaultSize,
 
 193                       long style = wxEL_ALLOW_NEW | wxEL_ALLOW_EDIT | wxEL_ALLOW_DELETE,
 
 194                       const wxString& name = wxPyEditableListBoxNameStr);
 
 197     void SetStrings(const wxArrayString& strings);
 
 199     //void GetStrings(wxArrayString& strings);
 
 201         PyObject* GetStrings() {
 
 202             wxArrayString strings;
 
 203             self->GetStrings(strings);
 
 204             return wxArrayString2PyList_helper(strings);
 
 208     wxPyListCtrl* GetListCtrl();
 
 209     wxBitmapButton* GetDelButton();
 
 210     wxBitmapButton* GetNewButton();
 
 211     wxBitmapButton* GetUpButton();
 
 212     wxBitmapButton* GetDownButton();
 
 213     wxBitmapButton* GetEditButton();
 
 215     %property(DelButton, GetDelButton, doc="See `GetDelButton`");
 
 216     %property(DownButton, GetDownButton, doc="See `GetDownButton`");
 
 217     %property(EditButton, GetEditButton, doc="See `GetEditButton`");
 
 218     %property(ListCtrl, GetListCtrl, doc="See `GetListCtrl`");
 
 219     %property(NewButton, GetNewButton, doc="See `GetNewButton`");
 
 220     %property(Strings, GetStrings, SetStrings, doc="See `GetStrings` and `SetStrings`");
 
 221     %property(UpButton, GetUpButton, doc="See `GetUpButton`");
 
 226 //---------------------------------------------------------------------------
 
 230  * wxRemotelyScrolledTreeCtrl
 
 232  * This tree control disables its vertical scrollbar and catches scroll
 
 233  * events passed by a scrolled window higher in the hierarchy.
 
 234  * It also updates the scrolled window vertical scrollbar as appropriate.
 
 238     typedef wxTreeCtrl wxPyTreeCtrl;
 
 241 MustHaveApp(wxRemotelyScrolledTreeCtrl);
 
 243 class wxRemotelyScrolledTreeCtrl: public wxPyTreeCtrl
 
 246     %pythonAppend wxRemotelyScrolledTreeCtrl         "self._setOORInfo(self)"
 
 247     %pythonAppend wxRemotelyScrolledTreeCtrl()       ""
 
 249     wxRemotelyScrolledTreeCtrl(wxWindow* parent, wxWindowID id,
 
 250                                const wxPoint& pos = wxDefaultPosition,
 
 251                                const wxSize& size = wxDefaultSize,
 
 252                                long style = wxTR_HAS_BUTTONS);
 
 255     void HideVScrollbar();
 
 257     // Adjust the containing wxScrolledWindow's scrollbars appropriately
 
 258     void AdjustRemoteScrollbars();
 
 260     // Find the scrolled window that contains this control
 
 261     wxScrolledWindow* GetScrolledWindow() const;
 
 263     // Scroll to the given line (in scroll units where each unit is
 
 264     // the height of an item)
 
 265     void ScrollToLine(int posHoriz, int posVert);
 
 267     // The companion window is one which will get notified when certain
 
 268     // events happen such as node expansion
 
 269     void SetCompanionWindow(wxWindow* companion);
 
 270     wxWindow* GetCompanionWindow() const;
 
 272     %property(CompanionWindow, GetCompanionWindow, SetCompanionWindow, doc="See `GetCompanionWindow` and `SetCompanionWindow`");
 
 273     %property(ScrolledWindow, GetScrolledWindow, doc="See `GetScrolledWindow`");
 
 279  * wxTreeCompanionWindow
 
 281  * A window displaying values associated with tree control items.
 
 285 class wxPyTreeCompanionWindow: public wxTreeCompanionWindow
 
 288     wxPyTreeCompanionWindow(wxWindow* parent, wxWindowID id = -1,
 
 289                             const wxPoint& pos = wxDefaultPosition,
 
 290                             const wxSize& size = wxDefaultSize,
 
 292         : wxTreeCompanionWindow(parent, id, pos, size, style) {}
 
 295     virtual void DrawItem(wxDC& dc, wxTreeItemId id, const wxRect& rect) {
 
 297         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 298         if ((found = wxPyCBH_findCallback(m_myInst, "DrawItem"))) {
 
 299             PyObject* dcobj = wxPyMake_wxObject(&dc,false);
 
 300             PyObject* idobj = wxPyConstructObject((void*)&id, wxT("wxTreeItemId"), false);
 
 301             PyObject* recobj= wxPyConstructObject((void*)&rect, wxT("wxRect"), false);
 
 302             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(OOO)", dcobj, idobj, recobj));
 
 307         wxPyEndBlockThreads(blocked);
 
 309             wxTreeCompanionWindow::DrawItem(dc, id, rect);
 
 317 MustHaveApp(wxPyTreeCompanionWindow);
 
 319 %rename(TreeCompanionWindow) wxPyTreeCompanionWindow;
 
 320 class wxPyTreeCompanionWindow: public wxWindow
 
 323     %pythonAppend wxPyTreeCompanionWindow         "self._setOORInfo(self);" setCallbackInfo(TreeCompanionWindow)
 
 324     %pythonAppend wxPyTreeCompanionWindow()       ""
 
 326     wxPyTreeCompanionWindow(wxWindow* parent, wxWindowID id = -1,
 
 327                             const wxPoint& pos = wxDefaultPosition,
 
 328                             const wxSize& size = wxDefaultSize,
 
 330     void _setCallbackInfo(PyObject* self, PyObject* _class);
 
 332     wxRemotelyScrolledTreeCtrl* GetTreeCtrl() const;
 
 333     void SetTreeCtrl(wxRemotelyScrolledTreeCtrl* treeCtrl);
 
 335     %property(TreeCtrl, GetTreeCtrl, SetTreeCtrl, doc="See `GetTreeCtrl` and `SetTreeCtrl`");
 
 341  * wxThinSplitterWindow
 
 343  * Implements a splitter with a less obvious sash
 
 344  * than the usual one.
 
 347 MustHaveApp(wxThinSplitterWindow);
 
 349 class wxThinSplitterWindow: public wxSplitterWindow
 
 352     %pythonAppend wxThinSplitterWindow         "self._setOORInfo(self)"
 
 353     %pythonAppend wxThinSplitterWindow()       ""
 
 355     wxThinSplitterWindow(wxWindow* parent, wxWindowID id = -1,
 
 356                          const wxPoint& pos = wxDefaultPosition,
 
 357                          const wxSize& size = wxDefaultSize,
 
 358                          long style = wxSP_3D | wxCLIP_CHILDREN);
 
 364  * wxSplitterScrolledWindow
 
 366  * This scrolled window is aware of the fact that one of its
 
 367  * children is a splitter window. It passes on its scroll events
 
 368  * (after some processing) to both splitter children for them
 
 369  * scroll appropriately.
 
 372 MustHaveApp(wxSplitterScrolledWindow);
 
 374 class wxSplitterScrolledWindow: public wxScrolledWindow
 
 377     %pythonAppend wxSplitterScrolledWindow         "self._setOORInfo(self)"
 
 378     %pythonAppend wxSplitterScrolledWindow()       ""
 
 380     wxSplitterScrolledWindow(wxWindow* parent, wxWindowID id = -1,
 
 381                              const wxPoint& pos = wxDefaultPosition,
 
 382                              const wxSize& size = wxDefaultSize,
 
 387 //---------------------------------------------------------------------------
 
 388 //---------------------------------------------------------------------------
 
 403 MustHaveApp(wxLEDNumberCtrl);
 
 405 class wxLEDNumberCtrl : public wxControl
 
 408     %pythonAppend wxLEDNumberCtrl         "self._setOORInfo(self)"
 
 409     %pythonAppend wxLEDNumberCtrl()       ""
 
 411     wxLEDNumberCtrl(wxWindow *parent, wxWindowID id = -1,
 
 412                     const wxPoint& pos = wxDefaultPosition,
 
 413                     const wxSize& size = wxDefaultSize,
 
 414                     long style =  wxLED_ALIGN_LEFT | wxLED_DRAW_FADED);
 
 415     %RenameCtor(PreLEDNumberCtrl,  wxLEDNumberCtrl());
 
 417     bool Create(wxWindow *parent, wxWindowID id = -1,
 
 418                     const wxPoint& pos = wxDefaultPosition,
 
 419                     const wxSize& size = wxDefaultSize,
 
 420                     long style = wxLED_ALIGN_LEFT | wxLED_DRAW_FADED);
 
 422     wxLEDValueAlign GetAlignment() const;
 
 423     bool GetDrawFaded() const;
 
 424     const wxString &GetValue() const;
 
 426     void SetAlignment(wxLEDValueAlign Alignment, bool Redraw = true);
 
 427     void SetDrawFaded(bool DrawFaded, bool Redraw = true);
 
 428     void SetValue(const wxString &Value, bool Redraw = true);
 
 430     %property(Alignment, GetAlignment, SetAlignment, doc="See `GetAlignment` and `SetAlignment`");
 
 431     %property(DrawFaded, GetDrawFaded, SetDrawFaded, doc="See `GetDrawFaded` and `SetDrawFaded`");
 
 432     %property(Value, GetValue, SetValue, doc="See `GetValue` and `SetValue`");
 
 437 //----------------------------------------------------------------------
 
 441 //----------------------------------------------------------------------
 
 451 MustHaveApp(wxStaticPicture);
 
 453 class wxStaticPicture : public wxControl
 
 456     %pythonAppend wxStaticPicture         "self._setOORInfo(self)"
 
 457     %pythonAppend wxStaticPicture()       ""
 
 459     wxStaticPicture( wxWindow* parent, wxWindowID id=-1,
 
 460                      const wxBitmap& label=wxNullBitmap,
 
 461                      const wxPoint& pos = wxDefaultPosition,
 
 462                      const wxSize& size = wxDefaultSize,
 
 464                      const wxString& name = wxPyStaticPictureNameStr );
 
 466     %RenameCtor(PreStaticPicture, wxStaticPicture());
 
 468     bool Create( wxWindow* parent, wxWindowID id=-1,
 
 469                  const wxBitmap& label=wxNullBitmap,
 
 470                  const wxPoint& pos = wxDefaultPosition,
 
 471                  const wxSize& size = wxDefaultSize,
 
 473                  const wxString& name = wxPyStaticPictureNameStr );
 
 475     void SetBitmap( const wxBitmap& bmp );
 
 476     wxBitmap GetBitmap() const;
 
 477     void SetIcon( const wxIcon& icon );
 
 478     wxIcon GetIcon() const;
 
 480     void SetAlignment( int align );
 
 481     int GetAlignment() const;
 
 483     void SetScale( int scale );
 
 484     int GetScale() const; 
 
 486     void SetCustomScale( float sx, float sy );
 
 487     void GetCustomScale( float* OUTPUT, float* OUTPUT ) const;
 
 489     %property(Alignment, GetAlignment, SetAlignment, doc="See `GetAlignment` and `SetAlignment`");
 
 490     %property(Bitmap, GetBitmap, SetBitmap, doc="See `GetBitmap` and `SetBitmap`");
 
 491     %property(Icon, GetIcon, SetIcon, doc="See `GetIcon` and `SetIcon`");
 
 492     %property(Scale, GetScale, SetScale, doc="See `GetScale` and `SetScale`");
 
 496 //----------------------------------------------------------------------
 
 497 //----------------------------------------------------------------------
 
 500     wxPyPtrTypeMap_Add("wxTreeCompanionWindow", "wxPyTreeCompanionWindow");
 
 503 //----------------------------------------------------------------------
 
 504 //----------------------------------------------------------------------