X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/957f5ab77abb14c70c60f18196e1e0d39292ee59..209f3e1453dd576919bf1cc8f696218dae23c34b:/contrib/src/foldbar/foldpanelitem.cpp diff --git a/contrib/src/foldbar/foldpanelitem.cpp b/contrib/src/foldbar/foldpanelitem.cpp index 0b632863ba..48997c1372 100644 --- a/contrib/src/foldbar/foldpanelitem.cpp +++ b/contrib/src/foldbar/foldpanelitem.cpp @@ -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". @@ -12,7 +17,11 @@ #pragma hdrstop #endif -#include "wx/foldbar/foldpanelitem.h" +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include "wx/foldbar/foldpanelbar.h" #include 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(); }