]> git.saurik.com Git - wxWidgets.git/blobdiff - contrib/src/foldbar/foldpanelitem.cpp
bug fixes for using wxTransientPopupWindow and wxDP_ALLOWNONE support from Andreas...
[wxWidgets.git] / contrib / src / foldbar / foldpanelitem.cpp
index 0b632863ba21e3fb22a0c7020d3381b6d7d8f559..48997c13722be2e2d5a0d3c72ac4b15b6b0e6f01 100644 (file)
@@ -1,8 +1,13 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        wxFoldPanelItem.cpp
-// Author:      XX
-// Created:     Tuesday, June 22, 2004 21:01:02
-// Copyright:   XX
+// Name:        foldpanelitem.cpp
+// Purpose:
+// Author:      Jorgen Bodde
+// Modified by: ABX - 19/12/2004 : possibility of horizontal orientation
+//                               : wxWidgets coding standards
+// Created:     22/06/2004
+// RCS-ID:      $Id$
+// Copyright:   (c) Jorgen Bodde
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // For compilers that support precompilation, includes "wx/wx.h".
     #pragma hdrstop
 #endif
 
-#include "wx/foldbar/foldpanelitem.h"
+#ifndef WX_PRECOMP
+    #include "wx/wx.h"
+#endif
+
+#include "wx/foldbar/foldpanelbar.h"
 
 #include <wx/arrimpl.cpp>
 WX_DEFINE_OBJARRAY(wxFoldWindowItemArray);
@@ -24,177 +33,219 @@ WX_DEFINE_OBJARRAY(wxFoldWindowItemArray);
 IMPLEMENT_CLASS( wxFoldPanelItem, wxPanel )
 
 BEGIN_EVENT_TABLE(wxFoldPanelItem,wxPanel)
-       EVT_CAPTIONBAR(-1, wxFoldPanelItem::OnPressCaption)
-       EVT_PAINT(wxFoldPanelItem::OnPaint)
-       //EVT_SIZE(wxFoldPanelItem::OnSize)
+    EVT_CAPTIONBAR(wxID_ANY, wxFoldPanelItem::OnPressCaption)
+    EVT_PAINT(wxFoldPanelItem::OnPaint)
+    //EVT_SIZE(wxFoldPanelItem::OnSize)
 END_EVENT_TABLE()
 
-wxFoldPanelItem::wxFoldPanelItem( wxWindow *parent, const wxString &caption, wxImageList *icons, bool collapsedInitially, 
-                                                                 const wxCaptionBarStyle &style )
-       : _controlCreated(false)
-       , _yUserSize(0)
-       , _yPanelSize(0)
-       , _yPos(0)
-       , _userSized(false)
-       , _yLastInsertPos(0)
+wxFoldPanelItem::wxFoldPanelItem( wxWindow *parent, const wxString &caption, wxImageList *icons, bool collapsedInitially,
+                                  const wxCaptionBarStyle &style )
+    : m_controlCreated(false)
+    , m_userSize(0)
+    , m_panelSize(0)
+    , m_lastInsertPos(0)
+    , m_itemPos(0)
+    , m_userSized(false)
 {
     wxCHECK2(parent, return);
-       
-       wxPanel::Create(parent, -1);
-    
-       // create the caption bar, in collapsed or expanded state
-
-       _captionBar = new wxCaptionBar(this, caption, icons, -1, style, wxPoint(0,0));  
-       //_captionBar->SetBoldFont();
-       
-       if(collapsedInitially)
-               _captionBar->Collapse();
-       
-       _controlCreated = true;
-       
-       // make initial size for component, if collapsed, the 
-       // size is determined on the panel height and won't change
-
-       wxSize size = _captionBar->GetSize();
-       _yPanelSize = size.GetHeight(); 
-       _yLastInsertPos = _yPanelSize;
+
+    wxPanel::Create(parent, wxID_ANY);
+
+    // create the caption bar, in collapsed or expanded state
+
+    m_captionBar = new wxCaptionBar(this, caption, icons, wxID_ANY, style, wxPoint(0,0));
+    //m_captionBar->SetBoldFont();
+
+    if(collapsedInitially)
+        m_captionBar->Collapse();
+
+    m_controlCreated = true;
+
+    // make initial size for component, if collapsed, the
+    // size is determined on the panel height and won't change
+
+    wxSize size = m_captionBar->GetSize();
+    m_panelSize = IsVertical()?size.GetHeight():size.GetWidth();
+    m_lastInsertPos = m_panelSize;
 }
-    
+
 void wxFoldPanelItem::AddWindow(wxWindow *window, int flags, int ySpacing, int leftSpacing, int rightSpacing)
 {
-       wxASSERT(window);
-       
-       wxFoldWindowItem *wi = new wxFoldWindowItem(window, flags, ySpacing, leftSpacing, rightSpacing);
-       _items.Add(wi);
-
-       window->SetSize(leftSpacing, _yLastInsertPos + ySpacing, -1, -1, wxSIZE_USE_EXISTING);
-       _yLastInsertPos += wi->GetWindowHeight();
-       
-       ResizePanel();
+    wxASSERT(window);
+
+    wxFoldWindowItem *wi = new wxFoldWindowItem(window, flags, ySpacing, leftSpacing, rightSpacing);
+    m_items.Add(wi);
+
+    bool vertical = this->IsVertical();
+
+    window->SetSize( vertical ? leftSpacing : m_lastInsertPos + ySpacing,
+                     vertical ? m_lastInsertPos + ySpacing : leftSpacing,
+                     wxDefaultCoord,
+                     wxDefaultCoord,
+                     wxSIZE_USE_EXISTING);
+
+    m_lastInsertPos += wi->GetWindowLength( vertical );
+
+    ResizePanel();
 }
 
 void wxFoldPanelItem::AddSeparator(const wxColour &color, int ySpacing, int leftSpacing, int rightSpacing)
-{      
-       wxFoldWindowItem *wi = new wxFoldWindowItem(_yLastInsertPos, color, ySpacing, leftSpacing, rightSpacing);
-       _items.Add(wi);
+{
+    wxFoldWindowItem *wi = new wxFoldWindowItem(m_lastInsertPos, color, ySpacing, leftSpacing, rightSpacing);
+    m_items.Add(wi);
+
+    m_lastInsertPos += wi->GetWindowLength( this->IsVertical() );
 
-       _yLastInsertPos += wi->GetWindowHeight();
-       
-       ResizePanel();
+    ResizePanel();
 }
 
 
 wxFoldPanelItem::~wxFoldPanelItem()
 {
-    _items.Clear();
+    m_items.Clear();
 }
 
 void wxFoldPanelItem::OnPressCaption(wxCaptionBarEvent &event)
 {
-       // tell the upper container we are responsible 
-       // for this event, so it can fold the panel item
-       // and do a refresh
+    // tell the upper container we are responsible
+    // for this event, so it can fold the panel item
+    // and do a refresh
 
-       event.SetTag((void *)this);     
-       event.Skip();
+    event.SetTag((void *)this);
+    event.Skip();
 }
 
 /* Inactive */
 void wxFoldPanelItem::OnSize(wxSizeEvent &event)
 {
-       // deny access to pointers (yet)
+    // deny access to pointers (yet)
 
-       if(!_controlCreated)
-       {
-               event.Skip();
-               return;
-       }
+    if(!m_controlCreated)
+    {
+        event.Skip();
+        return;
+    }
 
-       // calculate the size needed for this window, so 
-       // we get the parent size, and determine the size for the caption and the panel
-       
-       //wxRect rect = GetRect();
+    // calculate the size needed for this window, so
+    // we get the parent size, and determine the size for the caption and the panel
 
-       //wxSize size(0,-1);
-       //size.SetWidth(rect.GetWidth());
-       //_captionBar->SetSize(size);
+    //wxRect rect = GetRect();
+
+    //wxSize size(0,wxDefaultCoord);
+    //size.SetWidth(rect.GetWidth());
+    //m_captionBar->SetSize(size);
 
 }
 
-int wxFoldPanelItem::Reposition(int y)
+int wxFoldPanelItem::Reposition(int pos)
 {
-       // NOTE: Call Resize before Reposition when an item is added, because the new 
-       // size needed will be calculated by Resize. Ofcourse the relative position
-       // of the controls have to be correct in respect to the caption bar
-       
-       Freeze();
-       
-       SetSize(-1, y, -1, -1, wxSIZE_USE_EXISTING);
-       _yPos = y;
-
-       Thaw();
-
-       return GetPanelHeight();
+    // NOTE: Call Resize before Reposition when an item is added, because the new
+    // size needed will be calculated by Resize. Ofcourse the relative position
+    // of the controls have to be correct in respect to the caption bar
+
+    Freeze();
+
+    bool vertical = this->IsVertical();
+
+    SetSize( vertical ? wxDefaultCoord : pos,
+             vertical ? pos : wxDefaultCoord,
+             wxDefaultCoord,
+             wxDefaultCoord,
+             wxSIZE_USE_EXISTING);
+
+    m_itemPos = pos;
+
+    Thaw();
+
+    return GetPanelLength();
 }
 
 void wxFoldPanelItem::ResizePanel()
 {
-       // prevent unnecessary updates by blocking repaints for a sec
+    bool vertical = IsVertical();
+
+    // prevent unnecessary updates by blocking repaints for a sec
+
+    Freeze();
 
-       Freeze();
+    // force this panel to take the width of the parent panel and the y of the
+    // user or calulated width (which will be recalculated by the contents here
 
-       // force this panel to take the width of the parent panel and the y of the
-       // user or calulated width (which will be recalculated by the contents here 
+    wxSize size;
+    if(m_captionBar->IsCollapsed())
+    {
+        size = m_captionBar->GetSize();
+        m_panelSize = vertical ? size.GetHeight() : size.GetWidth();
+    }
+    else
+    {
+        size = GetBestSize();
+        m_panelSize = vertical ? size.GetHeight() : size.GetWidth();
 
-       wxSize size;
-       if(_captionBar->IsCollapsed())
-       {
-               size = _captionBar->GetSize();
-               _yPanelSize = size.GetHeight();
-       }
-       else
-       {
-               size = GetBestSize();
-               _yPanelSize = size.GetHeight();
+        if(m_userSized)
+        {
+            if ( vertical )
+                size.SetHeight(m_userSize);
+            else
+                size.SetWidth(m_userSize);
+        }
+    }
 
-               if(_userSized)
-                       size.SetHeight(_yUserSize);
-       }
+    wxSize pnlsize = GetParent()->GetSize();
+    if ( vertical )
+        size.SetWidth(pnlsize.GetWidth());
+    else
+        size.SetHeight(pnlsize.GetHeight());
 
-       wxSize pnlsize = GetParent()->GetSize();
-       size.SetWidth(pnlsize.GetWidth());
+    // resize caption bar
+    m_captionBar->SetSize( vertical ? size.GetWidth() : wxDefaultCoord,
+                          vertical ? wxDefaultCoord : size.GetHeight());
 
-       // resize caption bar
-       _captionBar->SetSize(wxSize(size.GetWidth(), -1));
-       
-       // resize the panel
-       SetSize(size);
+    // resize the panel
+    SetSize(size);
 
-       // go by all the controls and call Layout
+    // go by all the controls and call Layout
 
-       for(size_t i = 0; i < _items.GetCount(); i++)
-               _items.Item(i).ResizeItem(size.GetWidth());
+    for(size_t i = 0; i < m_items.GetCount(); i++)
+        m_items.Item(i).ResizeItem( vertical ? size.GetWidth() : size.GetHeight() , vertical );
 
-       // and draw all
+    // and draw all
 
-       Thaw();
+    Thaw();
 }
 
 void wxFoldPanelItem::OnPaint(wxPaintEvent& WXUNUSED(event))
 {
-       // draw all the items that are lines
-
-       wxPaintDC dc(this);
-       
-       for(size_t i = 0; i < _items.GetCount(); i++)
-       {
-               wxFoldWindowItem &item = _items.Item(i);
-               wxPen pen(item.GetLineColour(), 1, wxSOLID);
-               if(item.GetType() == wxFoldWindowItem::SEPARATOR)
-               {
-                       dc.SetPen(pen);
-                       dc.DrawLine(item.GetLeftSpacing(), item.GetLineY() + item.GetYSpacing(), 
-                                       item.GetLineWidth() + item.GetLeftSpacing(), item.GetLineY() + item.GetYSpacing());
-               }
-       }
+    // draw all the items that are lines
+    wxPaintDC dc(this);
+    bool vertical = IsVertical();
+
+    for(size_t i = 0; i < m_items.GetCount(); i++)
+    {
+        wxFoldWindowItem &item = m_items.Item(i);
+        wxPen pen(item.GetLineColour(), 1, wxSOLID);
+        if(item.GetType() == wxFoldWindowItem::SEPARATOR)
+        {
+            dc.SetPen(pen);
+            int a = item.GetLeftSpacing();
+            int b = item.GetLineY() + item.GetSpacing();
+            int c = item.GetLineLength();
+            int d = a + c;
+            if (vertical)
+                dc.DrawLine(a, b, d, b);
+            else
+                dc.DrawLine(b, a, b, d);
+        }
+    }
+}
+
+bool wxFoldPanelItem::IsVertical() const
+{
+    // grandparent of wxFoldPanelItem is wxFoldPanelBar
+    // default is vertical
+    wxPanel *panel = wxDynamicCast(GetParent(), wxPanel);
+    wxCHECK_MSG( panel, true, _T("wrong parent") );
+    wxFoldPanelBar *bar = wxDynamicCast(panel->GetParent(), wxFoldPanelBar);
+    wxCHECK_MSG( bar, true, _T("wrong parent") );
+    return bar->IsVertical();
 }