X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4b5d2be39657bb364c9111c4d13b1eecb8f3b69f..d169fa6aef264c5dfc300dd6666236d59f4e169a:/src/propgrid/manager.cpp diff --git a/src/propgrid/manager.cpp b/src/propgrid/manager.cpp index 5253c01369..f7604ca745 100644 --- a/src/propgrid/manager.cpp +++ b/src/propgrid/manager.cpp @@ -4,7 +4,7 @@ // Author: Jaakko Salli // Modified by: // Created: 2005-01-14 -// RCS-ID: $Id: +// RCS-ID: $Id$ // Copyright: (c) Jaakko Salli // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// @@ -41,9 +41,9 @@ // This define is necessary to prevent macro clearing #define __wxPG_SOURCE_FILE__ -#include +#include "wx/propgrid/propgrid.h" -#include +#include "wx/propgrid/manager.h" #define wxPG_MAN_ALTERNATE_BASE_ID 11249 // Needed for wxID_ANY madnesss @@ -72,7 +72,7 @@ // wxPropertyGridManager // ----------------------------------------------------------------------- -const wxChar *wxPropertyGridManagerNameStr = wxT("wxPropertyGridManager"); +const char wxPropertyGridManagerNameStr[] = "wxPropertyGridManager"; // Categoric Mode Icon @@ -153,8 +153,6 @@ static const char* gs_xpm_defpage[] = { "................" }; -#define GETPAGESTATE(page) ((wxPropertyGridPage*)m_arrPages.Item(page))->GetStatePtr() - // ----------------------------------------------------------------------- // wxPropertyGridPage // ----------------------------------------------------------------------- @@ -209,12 +207,18 @@ void wxPropertyGridPage::SetSplitterPosition( int splitterPos, int col ) DoSetSplitterPosition(splitterPos, col, false); } -void wxPropertyGridPage::DoSetSplitterPosition( int pos, int splitterColumn, bool allPages ) +void wxPropertyGridPage::DoSetSplitterPosition( int pos, + int splitterColumn, + bool allPages, + bool fromAutoCenter ) { if ( allPages && m_manager->GetPageCount() ) m_manager->SetSplitterPosition( pos, splitterColumn ); else - DoSetSplitterPositionThisPage( pos, splitterColumn ); + wxPropertyGridPageState::DoSetSplitterPosition( pos, + splitterColumn, + allPages, + fromAutoCenter ); } // ----------------------------------------------------------------------- @@ -231,7 +235,7 @@ IMPLEMENT_CLASS(wxPropertyGridManager, wxPanel) #define ID_ADVTOOLBAR_OFFSET 1 #define ID_ADVHELPCAPTION_OFFSET 2 #define ID_ADVHELPCONTENT_OFFSET 3 -#define ID_ADVBUTTON_OFFSET 4 +//#define ID_ADVBUTTON_OFFSET 4 #define ID_ADVTBITEMSBASE_OFFSET 5 // Must be last. // ----------------------------------------------------------------------- @@ -261,7 +265,7 @@ wxPropertyGridManager::wxPropertyGridManager( wxWindow *parent, const wxPoint& pos, const wxSize& size, long style, - const wxChar* name ) + const wxString& name ) : wxPanel() { Init1(); @@ -275,7 +279,7 @@ bool wxPropertyGridManager::Create( wxWindow *parent, const wxPoint& pos, const wxSize& size, long style, - const wxChar* name ) + const wxString& name ) { bool res = wxPanel::Create( parent, id, pos, size, @@ -360,7 +364,7 @@ void wxPropertyGridManager::Init2( int style ) pd->m_manager = this; wxPropertyGridPageState* state = pd->GetStatePtr(); state->m_pPropGrid = m_pPropGrid; - m_arrPages.Add( (void*)pd ); + m_arrPages.push_back( pd ); m_pPropGrid->m_pState = state; wxWindowID baseId = GetId(); @@ -373,7 +377,7 @@ void wxPropertyGridManager::Init2( int style ) #ifdef __WXMAC__ // Smaller controls on Mac SetWindowVariant(wxWINDOW_VARIANT_SMALL); -#endif +#endif // Create propertygrid. m_pPropGrid->Create(this,baseId,wxPoint(0,0),csz, @@ -422,9 +426,9 @@ wxPropertyGridManager::~wxPropertyGridManager() m_pPropGrid->m_pState = NULL; size_t i; - for ( i=0; iSetWindowStyleFlag( (m_pPropGrid->GetWindowStyleFlag()&~(wxPG_MAN_PASS_FLAGS_MASK)) | (style&wxPG_MAN_PASS_FLAGS_MASK) ); + + // Need to re-position windows? + if ( (oldWindowStyle & (wxPG_TOOLBAR|wxPG_DESCRIPTION)) != + (style & (wxPG_TOOLBAR|wxPG_DESCRIPTION)) ) + { + RecreateControls(); + } } // ----------------------------------------------------------------------- @@ -544,7 +557,7 @@ bool wxPropertyGridManager::DoSelectPage( int index ) if ( index >= 0 ) { - nextPage = (wxPropertyGridPage*)m_arrPages.Item(index); + nextPage = m_arrPages[index]; nextPage->OnShow(); } @@ -595,7 +608,7 @@ int wxPropertyGridManager::GetPageByName( const wxString& name ) const size_t i; for ( i=0; im_label == name ) + if ( m_arrPages[i]->m_label == name ) return i; } return wxNOT_FOUND; @@ -610,7 +623,7 @@ int wxPropertyGridManager::GetPageByState( const wxPropertyGridPageState* pState size_t i; for ( i=0; iGetStatePtr() ) + if ( pState == m_arrPages[i]->GetStatePtr() ) return i; } @@ -622,7 +635,7 @@ int wxPropertyGridManager::GetPageByState( const wxPropertyGridPageState* pState const wxString& wxPropertyGridManager::GetPageName( int index ) const { wxASSERT( index >= 0 && index < (int)GetPageCount() ); - return ((wxPropertyGridPage*)m_arrPages.Item(index))->m_label; + return m_arrPages[index]->m_label; } // ----------------------------------------------------------------------- @@ -636,7 +649,7 @@ wxPropertyGridPageState* wxPropertyGridManager::GetPageState( int page ) const if ( page == -1 ) return m_pState; - return GETPAGESTATE(page); + return m_arrPages[page]; } // ----------------------------------------------------------------------- @@ -664,7 +677,7 @@ void wxPropertyGridManager::ClearPage( int page ) if ( page >= 0 && page < (int)GetPageCount() ) { - wxPropertyGridPageState* state = GETPAGESTATE(page); + wxPropertyGridPageState* state = m_arrPages[page]; if ( state == m_pPropGrid->GetState() ) m_pPropGrid->Clear(); @@ -700,18 +713,20 @@ size_t wxPropertyGridManager::GetPageCount() const if ( !(m_iFlags & wxPG_MAN_FL_PAGE_INSERTED) ) return 0; - return m_arrPages.GetCount(); + return m_arrPages.size(); } // ----------------------------------------------------------------------- -int wxPropertyGridManager::InsertPage( int index, const wxString& label, - const wxBitmap& bmp, wxPropertyGridPage* pageObj ) +wxPropertyGridPage* wxPropertyGridManager::InsertPage( int index, + const wxString& label, + const wxBitmap& bmp, + wxPropertyGridPage* pageObj ) { if ( index < 0 ) index = GetPageCount(); - wxCHECK_MSG( (size_t)index == GetPageCount(), -1, + wxCHECK_MSG( (size_t)index == GetPageCount(), NULL, wxT("wxPropertyGridManager currently only supports appending pages (due to wxToolBar limitation).")); bool needInit = true; @@ -773,7 +788,7 @@ int wxPropertyGridManager::InsertPage( int index, const wxString& label, pageObj->m_id = m_nextTbInd; if ( isPageInserted ) - m_arrPages.Add( (void*)pageObj ); + m_arrPages.push_back( pageObj ); #if wxUSE_TOOLBAR if ( m_windowStyle & wxPG_TOOLBAR ) @@ -826,7 +841,7 @@ int wxPropertyGridManager::InsertPage( int index, const wxString& label, wxASSERT( pageObj->GetGrid() ); - return index; + return pageObj; } // ----------------------------------------------------------------------- @@ -836,7 +851,7 @@ bool wxPropertyGridManager::IsAnyModified() const size_t i; for ( i=0; iGetStatePtr()->m_anyModified ) + if ( m_arrPages[i]->GetStatePtr()->m_anyModified ) return true; } return false; @@ -846,7 +861,7 @@ bool wxPropertyGridManager::IsAnyModified() const bool wxPropertyGridManager::IsPageModified( size_t index ) const { - if ( ((wxPropertyGridPage*)m_arrPages.Item(index))->GetStatePtr()->m_anyModified ) + if ( m_arrPages[index]->GetStatePtr()->m_anyModified ) return true; return false; } @@ -856,9 +871,9 @@ bool wxPropertyGridManager::IsPageModified( size_t index ) const wxPGProperty* wxPropertyGridManager::GetPageRoot( int index ) const { wxASSERT( index >= 0 ); - wxASSERT( index < (int)m_arrPages.GetCount() ); + wxASSERT( index < (int)m_arrPages.size() ); - return ((wxPropertyGridPage*)m_arrPages.Item(index))->GetStatePtr()->m_properties; + return m_arrPages[index]->GetStatePtr()->m_properties; } // ----------------------------------------------------------------------- @@ -869,9 +884,9 @@ bool wxPropertyGridManager::RemovePage( int page ) false, wxT("invalid page index") ); - wxPropertyGridPage* pd = (wxPropertyGridPage*)m_arrPages.Item(page); + wxPropertyGridPage* pd = m_arrPages[page]; - if ( m_arrPages.GetCount() == 1 ) + if ( m_arrPages.size() == 1 ) { // Last page: do not remove page entry m_pPropGrid->Clear(); @@ -879,6 +894,7 @@ bool wxPropertyGridManager::RemovePage( int page ) m_iFlags &= ~wxPG_MAN_FL_PAGE_INSERTED; pd->m_label.clear(); } + // Change selection if current is page else if ( page == m_selPage ) { @@ -911,9 +927,9 @@ bool wxPropertyGridManager::RemovePage( int page ) } #endif - if ( m_arrPages.GetCount() > 1 ) + if ( m_arrPages.size() > 1 ) { - m_arrPages.RemoveAt(page); + m_arrPages.erase(m_arrPages.begin() + page); delete pd; } @@ -988,20 +1004,11 @@ void wxPropertyGridManager::RepaintSplitter( wxDC& dc, int new_splittery, int ne // ----------------------------------------------------------------------- -void wxPropertyGridManager::RefreshHelpBox( int new_splittery, int new_width, int new_height ) +void wxPropertyGridManager::UpdateDescriptionBox( int new_splittery, int new_width, int new_height ) { - //if ( new_splittery == m_splitterY && new_width == m_width ) - // return; - int use_hei = new_height; use_hei--; - //wxRendererNative::Get().DrawSplitterSash(this,dc, - //wxSize(width,m_splitterHeight),new_splittery,wxHORIZONTAL); - - //wxRendererNative::Get().DrawSplitterBorder(this,dc, - // wxRect(0,new_splittery,new_width,m_splitterHeight)); - // Fix help control positions. int cap_hei = m_pPropGrid->m_fontHeight; int cap_y = new_splittery+m_splitterHeight+5; @@ -1034,8 +1041,8 @@ void wxPropertyGridManager::RefreshHelpBox( int new_splittery, int new_width, in } } - wxClientDC dc(this); - RepaintSplitter( dc, new_splittery, new_width, new_height, true ); + wxRect r(0, new_splittery, new_width, new_height-new_splittery); + RefreshRect(r); m_splitterY = new_splittery; @@ -1104,7 +1111,7 @@ void wxPropertyGridManager::RecalculatePositions( int width, int height ) propgridBottomY = new_splittery; - RefreshHelpBox( new_splittery, width, height ); + UpdateDescriptionBox( new_splittery, width, height ); } if ( m_iFlags & wxPG_FL_INITIALIZED ) @@ -1125,9 +1132,12 @@ void wxPropertyGridManager::SetDescBoxHeight( int ht, bool refresh ) { if ( m_windowStyle & wxPG_DESCRIPTION ) { - m_nextDescBoxSize = ht; - if ( refresh ) - RecalculatePositions(m_width, m_height); + if ( ht != GetDescBoxHeight() ) + { + m_nextDescBoxSize = ht; + if ( refresh ) + RecalculatePositions(m_width, m_height); + } } } @@ -1135,7 +1145,7 @@ void wxPropertyGridManager::SetDescBoxHeight( int ht, bool refresh ) int wxPropertyGridManager::GetDescBoxHeight() const { - return GetClientSize().y - m_splitterY; + return GetClientSize().y - m_splitterY - m_splitterHeight; } // ----------------------------------------------------------------------- @@ -1264,16 +1274,27 @@ void wxPropertyGridManager::RecreateControls() if ( !m_pTxtHelpCaption ) { - m_pTxtHelpCaption = new wxStaticText (this,baseId+ID_ADVHELPCAPTION_OFFSET,wxEmptyString); + m_pTxtHelpCaption = new wxStaticText(this, + baseId+ID_ADVHELPCAPTION_OFFSET, + wxT(""), + wxDefaultPosition, + wxDefaultSize, + wxALIGN_LEFT|wxST_NO_AUTORESIZE); m_pTxtHelpCaption->SetFont( m_pPropGrid->m_captionFont ); - m_pTxtHelpCaption->SetCursor ( *wxSTANDARD_CURSOR ); + m_pTxtHelpCaption->SetCursor( *wxSTANDARD_CURSOR ); } if ( !m_pTxtHelpContent ) { - m_pTxtHelpContent = new wxStaticText (this,baseId+ID_ADVHELPCONTENT_OFFSET, - wxEmptyString,wxDefaultPosition,wxDefaultSize,wxALIGN_LEFT|wxST_NO_AUTORESIZE); - m_pTxtHelpContent->SetCursor ( *wxSTANDARD_CURSOR ); + m_pTxtHelpContent = new wxStaticText(this, + baseId+ID_ADVHELPCONTENT_OFFSET, + wxT(""), + wxDefaultPosition, + wxDefaultSize, + wxALIGN_LEFT|wxST_NO_AUTORESIZE); + m_pTxtHelpContent->SetCursor( *wxSTANDARD_CURSOR ); } + + SetDescribedProperty(GetSelection()); } else { @@ -1308,7 +1329,7 @@ wxPGProperty* wxPropertyGridManager::DoGetPropertyByName( const wxString& name ) size_t i; for ( i=0; iGetStatePtr(); + wxPropertyGridPageState* pState = m_arrPages[i]->GetStatePtr(); wxPGProperty* p = pState->BaseGetPropertyByName(name); if ( p ) { @@ -1335,13 +1356,6 @@ bool wxPropertyGridManager::EnsureVisible( wxPGPropArg id ) // ----------------------------------------------------------------------- -size_t wxPropertyGridManager::GetChildrenCount( int page_index ) -{ - return GetChildrenCount( GetPage(page_index)->GetStatePtr()->m_properties ); -} - -// ----------------------------------------------------------------------- - void wxPropertyGridManager::OnToolbarClick( wxCommandEvent &event ) { int id = event.GetId(); @@ -1355,13 +1369,25 @@ void wxPropertyGridManager::OnToolbarClick( wxCommandEvent &event ) { // Categorized mode. if ( m_pPropGrid->m_windowStyle & wxPG_HIDE_CATEGORIES ) + { + if ( !m_pPropGrid->HasInternalFlag(wxPG_FL_CATMODE_AUTO_SORT) ) + m_pPropGrid->m_windowStyle &= ~wxPG_AUTO_SORT; m_pPropGrid->EnableCategories( true ); + } } else if ( id == ( baseId + ID_ADVTBITEMSBASE_OFFSET + 1 ) ) { // Alphabetic mode. if ( !(m_pPropGrid->m_windowStyle & wxPG_HIDE_CATEGORIES) ) + { + if ( m_pPropGrid->HasFlag(wxPG_AUTO_SORT) ) + m_pPropGrid->SetInternalFlag(wxPG_FL_CATMODE_AUTO_SORT); + else + m_pPropGrid->ClearInternalFlag(wxPG_FL_CATMODE_AUTO_SORT); + + m_pPropGrid->m_windowStyle |= wxPG_AUTO_SORT; m_pPropGrid->EnableCategories( false ); + } } else { @@ -1374,7 +1400,7 @@ void wxPropertyGridManager::OnToolbarClick( wxCommandEvent &event ) // Find page with given id. for ( i=0; im_id == id ) { index = i; @@ -1402,6 +1428,29 @@ void wxPropertyGridManager::OnToolbarClick( wxCommandEvent &event ) // ----------------------------------------------------------------------- +bool wxPropertyGridManager::SetEditableStateItem( const wxString& name, wxVariant value ) +{ + if ( name == wxS("descboxheight") ) + { + SetDescBoxHeight(value.GetLong(), true); + return true; + } + return false; +} + +// ----------------------------------------------------------------------- + +wxVariant wxPropertyGridManager::GetEditableStateItem( const wxString& name ) const +{ + if ( name == wxS("descboxheight") ) + { + return (long) GetDescBoxHeight(); + } + return wxNullVariant; +} + +// ----------------------------------------------------------------------- + void wxPropertyGridManager::SetDescription( const wxString& label, const wxString& content ) { if ( m_pTxtHelpCaption ) @@ -1415,8 +1464,7 @@ void wxPropertyGridManager::SetDescription( const wxString& label, const wxStrin m_pTxtHelpCaption->SetSize(-1,osz1.y); m_pTxtHelpContent->SetSize(-1,osz2.y); - if ( (m_iFlags & wxPG_FL_DESC_REFRESH_REQUIRED) || (osz2.x<(m_width-10)) ) - RefreshHelpBox( m_splitterY, m_width, m_height ); + UpdateDescriptionBox( m_splitterY, m_width, m_height ); } } @@ -1432,8 +1480,7 @@ void wxPropertyGridManager::SetDescribedProperty( wxPGProperty* p ) } else { - m_pTxtHelpCaption->SetLabel(wxEmptyString); - m_pTxtHelpContent->SetLabel(wxEmptyString); + SetDescription( wxEmptyString, wxEmptyString ); } } } @@ -1456,7 +1503,7 @@ void wxPropertyGridManager::SetSplitterLeft( bool subProps, bool allPages ) for ( i=0; iGetColumnFitWidth(dc, GETPAGESTATE(i)->m_properties, 0, subProps ); + int maxW = m_pState->GetColumnFitWidth(dc, m_arrPages[i]->m_properties, 0, subProps ); maxW += m_pPropGrid->m_marginWidth; if ( maxW > highest ) highest = maxW; @@ -1534,7 +1581,7 @@ void wxPropertyGridManager::OnMouseMove( wxMouseEvent &event ) m_splitterY = sy; m_pPropGrid->SetSize( m_width, m_splitterY - m_pPropGrid->GetPosition().y ); - RefreshHelpBox( m_splitterY, m_width, m_height ); + UpdateDescriptionBox( m_splitterY, m_width, m_height ); m_extraHeight -= change; InvalidateBestSize(); @@ -1629,7 +1676,7 @@ void wxPropertyGridManager::SetSplitterPosition( int pos, int splitterColumn ) for ( i=0; iDoSetSplitterPositionThisPage( pos, splitterColumn ); + page->DoSetSplitterPosition( pos, splitterColumn, false ); } m_pPropGrid->SetInternalFlag(wxPG_FL_SPLITTER_PRE_SET);