1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     Drawer child window classes. 
   4 //              Drawer windows appear under their parent window and 
   5 //              behave like a drawer, opening and closing to reveal 
   6 //              content that does not need to be visible at all times. 
   7 // Author:      Jason Bagley  
   8 // Modified by: Ryan Norton (To make it work :), plus bug fixes) 
  11 // Copyright:   (c) Jason Bagley; Art & Logic, Inc. 
  12 // Licence:     wxWindows licence 
  13 ///////////////////////////////////////////////////////////////////////////// 
  15 #include "wx/wxprec.h" 
  17 #include "wx/mac/private.h" 
  19 #if defined( __WXMAC__ ) && TARGET_API_MAC_OSX && ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2 ) 
  21 #include "wx/mac/carbon/drawer.h" 
  23 IMPLEMENT_DYNAMIC_CLASS(wxDrawerWindow
, wxWindow
) 
  25 // Use constants for now. 
  26 // These can be made into member variables and set dynamically. 
  27 const int kLeadingOffset 
= 20; 
  28 const int kTrailingOffset 
= 20; 
  31 // Converts Mac window edge constants to wxDirections, wxLEFT, wxRIGHT, etc. 
  32 static wxDirection 
WindowEdgeToDirection(OptionBits edge
); 
  34 // Convert wxDirections to MAc window edge constants. 
  35 static OptionBits 
DirectionToWindowEdge(wxDirection direction
); 
  38 wxDrawerWindow::wxDrawerWindow() 
  42 wxDrawerWindow::~wxDrawerWindow() 
  44     m_isBeingDeleted 
= TRUE
; 
  48 bool wxDrawerWindow::Create(wxWindow 
*parent
, 
  49  wxWindowID id
, const wxString
& title
, 
  50  wxSize size
, wxDirection edge
, const wxString
& name
) 
  52     wxASSERT_MSG(NULL 
!= parent
, wxT("wxDrawerWindows must be attached to a parent window.")); 
  54     // Constrain the drawer size to the parent window. 
  55     const wxSize 
parentSize(parent
->GetClientSize()); 
  56     if (wxLEFT 
== edge 
|| wxRIGHT 
== edge
) 
  58         if (size
.GetHeight() > parentSize
.GetHeight()) 
  59             size
.SetHeight(parentSize
.GetHeight() - (kLeadingOffset 
+ kTrailingOffset
)); 
  63         if (size
.GetWidth() > parentSize
.GetWidth()) 
  64             size
.SetWidth(parentSize
.GetWidth() - (kLeadingOffset 
+ kTrailingOffset
)); 
  67     // Create the drawer window.  
  68     const wxPoint 
pos(0, 0); 
  69     const wxSize 
dummySize(0,0); 
  70     const long style 
= wxFRAME_DRAWER
; 
  72     bool success  
= wxWindow::Create(parent
, id
, pos
, dummySize
, style
, name
); 
  75         this->MacCreateRealWindow(title
, pos
, size
, style
, name
); 
  76         success 
= (m_macWindow 
!= NULL
); 
  82         m_macBackgroundBrush
.MacSetTheme(kThemeBrushDrawerBackground
); 
  83         ::SetThemeWindowBackground((WindowRef
)m_macWindow
, 
  84          m_macBackgroundBrush
.MacGetTheme(), false); 
  86         // Leading and trailing offset are gaps from parent window edges 
  87         // to where the drawer starts. 
  88         ::SetDrawerOffsets((WindowRef
)m_macWindow
, kLeadingOffset
, kTrailingOffset
); 
  90         // Set the drawers parent. 
  91         // Is there a better way to get the parent's WindowRef? 
  92         wxTopLevelWindow
* tlwParent 
= wxDynamicCast(parent
, wxTopLevelWindow
); 
  93         if (NULL 
!= tlwParent
) 
  95             OSStatus status 
= ::SetDrawerParent((WindowRef
)m_macWindow
, 
  96             (WindowRef
)tlwParent
->MacGetWindowRef()); 
  97             success 
= (noErr 
== status
); 
 103     return success 
&& SetPreferredEdge(edge
); 
 106 wxDirection 
wxDrawerWindow::GetCurrentEdge() const 
 108     const OptionBits edge 
= ::GetDrawerCurrentEdge((WindowRef
)m_macWindow
); 
 109     return WindowEdgeToDirection(edge
); 
 112 wxDirection 
wxDrawerWindow::GetPreferredEdge() const 
 114     const OptionBits edge 
= ::GetDrawerPreferredEdge((WindowRef
)m_macWindow
); 
 115     return WindowEdgeToDirection(edge
); 
 118 bool wxDrawerWindow::IsOpen() const 
 120     WindowDrawerState state 
= ::GetDrawerState((WindowRef
)m_macWindow
); 
 121     return (state 
== kWindowDrawerOpen 
|| state 
== kWindowDrawerOpening
); 
 124 bool wxDrawerWindow::Open(bool show
) 
 126     static const Boolean kAsynchronous 
= true; 
 127     OSStatus status 
= noErr
; 
 131         const OptionBits preferredEdge 
= ::GetDrawerPreferredEdge((WindowRef
)m_macWindow
); 
 132         status 
= ::OpenDrawer((WindowRef
)m_macWindow
, preferredEdge
, kAsynchronous
); 
 135         status 
= ::CloseDrawer((WindowRef
)m_macWindow
, kAsynchronous
); 
 137     return (noErr 
== status
); 
 140 bool wxDrawerWindow::SetPreferredEdge(wxDirection edge
) 
 142     const OSStatus status 
= ::SetDrawerPreferredEdge((WindowRef
)m_macWindow
, 
 143      DirectionToWindowEdge(edge
)); 
 144         return (noErr 
== status
); 
 148 OptionBits 
DirectionToWindowEdge(wxDirection direction
) 
 154         edge 
= kWindowEdgeTop
; 
 158         edge 
= kWindowEdgeBottom
; 
 162         edge 
= kWindowEdgeRight
; 
 167         edge 
= kWindowEdgeLeft
; 
 173 wxDirection 
WindowEdgeToDirection(OptionBits edge
) 
 175     wxDirection direction
; 
 182         case kWindowEdgeBottom
: 
 183         direction 
= wxBOTTOM
; 
 186         case kWindowEdgeRight
: 
 190         case kWindowEdgeDefault
: // store current preferred and return that here? 
 191         case kWindowEdgeLeft
: 
 200 #endif // defined( __WXMAC__ ) && TARGET_API_MAC_OSX && ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2 )