📄 foldpanelitem.cpp
字号:
/////////////////////////////////////////////////////////////////////////////// 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: foldpanelitem.cpp,v 1.4 2004/12/10 12:01:04 ABX Exp $// Copyright: (c) Jorgen Bodde// Licence: wxWindows licence/////////////////////////////////////////////////////////////////////////////// For compilers that support precompilation, includes "wx/wx.h".#include "wx/wxprec.h"#ifdef __BORLANDC__ #pragma hdrstop#endif#ifndef WX_PRECOMP #include "wx/wx.h"#endif#include "wx/foldbar/foldpanelbar.h"#include <wx/arrimpl.cpp>WX_DEFINE_OBJARRAY(wxFoldWindowItemArray);//----------------------------------------------------------------------------// wxFoldPanelItem//----------------------------------------------------------------------------IMPLEMENT_CLASS( wxFoldPanelItem, wxPanel )BEGIN_EVENT_TABLE(wxFoldPanelItem,wxPanel) 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 ) : m_controlCreated(false) , m_userSize(0) , m_panelSize(0) , m_lastInsertPos(0) , m_itemPos(0) , m_userSized(false){ wxCHECK2(parent, return); 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); 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(m_lastInsertPos, color, ySpacing, leftSpacing, rightSpacing); m_items.Add(wi); m_lastInsertPos += wi->GetWindowLength( this->IsVertical() ); ResizePanel();}wxFoldPanelItem::~wxFoldPanelItem(){ 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 event.SetTag((void *)this); event.Skip();}/* Inactive */void wxFoldPanelItem::OnSize(wxSizeEvent &event){ // deny access to pointers (yet) 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(); //wxSize size(0,wxDefaultCoord); //size.SetWidth(rect.GetWidth()); //m_captionBar->SetSize(size);}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(); 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(){ bool vertical = IsVertical(); // prevent unnecessary updates by blocking repaints for a sec 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 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(); if(m_userSized) { if ( vertical ) size.SetHeight(m_userSize); else size.SetWidth(m_userSize); } } wxSize pnlsize = GetParent()->GetSize(); if ( vertical ) size.SetWidth(pnlsize.GetWidth()); else size.SetHeight(pnlsize.GetHeight()); // resize caption bar m_captionBar->SetSize( vertical ? size.GetWidth() : wxDefaultCoord, vertical ? wxDefaultCoord : size.GetHeight()); // resize the panel SetSize(size); // go by all the controls and call Layout for(size_t i = 0; i < m_items.GetCount(); i++) m_items.Item(i).ResizeItem( vertical ? size.GetWidth() : size.GetHeight() , vertical ); // and draw all Thaw();}void wxFoldPanelItem::OnPaint(wxPaintEvent& WXUNUSED(event)){ // 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();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -