Added wxPropertyGridManager header support; Refactored wxPropertyGrid DoSetSplitterPosition() code

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62867 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Jaakko Salli
2009-12-13 12:00:04 +00:00
parent 9804064630
commit f525476870
10 changed files with 491 additions and 74 deletions

View File

@@ -209,18 +209,197 @@ void wxPropertyGridPage::SetSplitterPosition( int splitterPos, int col )
void wxPropertyGridPage::DoSetSplitterPosition( int pos,
int splitterColumn,
bool allPages,
bool fromAutoCenter )
int flags )
{
if ( allPages && m_manager->GetPageCount() )
if ( (flags & wxPG_SPLITTER_ALL_PAGES) && m_manager->GetPageCount() )
m_manager->SetSplitterPosition( pos, splitterColumn );
else
wxPropertyGridPageState::DoSetSplitterPosition( pos,
splitterColumn,
allPages,
fromAutoCenter );
flags );
}
// -----------------------------------------------------------------------
// wxPGHeaderCtrl
// -----------------------------------------------------------------------
#if wxUSE_HEADERCTRL
class wxPGHeaderCtrl : public wxHeaderCtrl
{
public:
wxPGHeaderCtrl(wxPropertyGridManager* manager) :
wxHeaderCtrl()
{
m_manager = manager;
EnsureColumnCount(2);
// Seed titles with defaults
m_columns[0]->SetTitle(_("Property"));
m_columns[1]->SetTitle(_("Value"));
}
virtual ~wxPGHeaderCtrl()
{
for (unsigned int i=0; i<m_columns.size(); i++ )
delete m_columns[i];
}
int DetermineColumnWidth(unsigned int idx, int* pMinWidth) const
{
const wxPropertyGridPage* page = m_page;
int colWidth = page->GetColumnWidth(idx);
int colMinWidth = page->GetColumnMinWidth(idx);
if ( idx == 0 )
{
wxPropertyGrid* pg = m_manager->GetGrid();
int margin = pg->GetMarginWidth();
// Compensate for the internal border
margin += (pg->GetSize().x - pg->GetClientSize().x) / 2;
colWidth += margin;
colMinWidth += margin;
}
*pMinWidth = colMinWidth;
return colWidth;
}
void OnPageChanged(const wxPropertyGridPage* page)
{
m_page = page;
OnPageUpdated();
}
void OnPageUpdated()
{
// Get column info from the page
const wxPropertyGridPage* page = m_page;
unsigned int colCount = page->GetColumnCount();
EnsureColumnCount(colCount);
for ( unsigned int i=0; i<colCount; i++ )
{
wxHeaderColumnSimple* colInfo = m_columns[i];
int colMinWidth = 0;
int colWidth = DetermineColumnWidth(i, &colMinWidth);
colInfo->SetWidth(colWidth);
colInfo->SetMinWidth(colMinWidth);
}
SetColumnCount(colCount);
}
void OnColumWidthsChanged()
{
const wxPropertyGridPage* page = m_page;
unsigned int colCount = page->GetColumnCount();
for ( unsigned int i=0; i<colCount; i++ )
{
wxHeaderColumnSimple* colInfo = m_columns[i];
int colMinWidth = 0;
int colWidth = DetermineColumnWidth(i, &colMinWidth);
colInfo->SetWidth(colWidth);
colInfo->SetMinWidth(colMinWidth);
UpdateColumn(i);
}
}
virtual const wxHeaderColumn& GetColumn(unsigned int idx) const
{
return *m_columns[idx];
}
void SetColumnTitle(unsigned int idx, const wxString& title)
{
EnsureColumnCount(idx+1);
m_columns[idx]->SetTitle(title);
}
private:
void EnsureColumnCount(unsigned int count)
{
while ( m_columns.size() < count )
{
wxHeaderColumnSimple* colInfo = new wxHeaderColumnSimple("");
m_columns.push_back(colInfo);
}
}
void OnSetColumnWidth(int col, int colWidth)
{
wxPropertyGrid* pg = m_manager->GetGrid();
// Compensate for the internal border
int x = -((pg->GetSize().x - pg->GetClientSize().x) / 2);
for ( int i=0; i<col; i++ )
x += m_columns[i]->GetWidth();
x += colWidth;
pg->DoSetSplitterPosition(x, col,
wxPG_SPLITTER_REFRESH |
wxPG_SPLITTER_FROM_EVENT);
}
virtual bool ProcessEvent( wxEvent& event )
{
if ( event.IsKindOf(CLASSINFO(wxHeaderCtrlEvent)) )
{
wxHeaderCtrlEvent& hcEvent =
static_cast<wxHeaderCtrlEvent&>(event);
wxPropertyGrid* pg = m_manager->GetGrid();
int col = hcEvent.GetColumn();
int evtType = event.GetEventType();
if ( evtType == wxEVT_COMMAND_HEADER_RESIZING )
{
int colWidth = hcEvent.GetWidth();
OnSetColumnWidth(col, colWidth);
pg->SendEvent(wxEVT_PG_COL_DRAGGING,
NULL, NULL, 0,
(unsigned int)col);
return true;
}
else if ( evtType == wxEVT_COMMAND_HEADER_BEGIN_RESIZE )
{
// Never allow column resize if layout is static
if ( m_manager->HasFlag(wxPG_STATIC_SPLITTER) )
hcEvent.Veto();
// Allow application to veto dragging
else if ( pg->SendEvent(wxEVT_PG_COL_BEGIN_DRAG,
NULL, NULL, 0,
(unsigned int)col) )
hcEvent.Veto();
return true;
}
else if ( evtType == wxEVT_COMMAND_HEADER_END_RESIZE )
{
pg->SendEvent(wxEVT_PG_COL_END_DRAG,
NULL, NULL, 0,
(unsigned int)col);
return true;
}
}
return wxHeaderCtrl::ProcessEvent(event);
}
wxPropertyGridManager* m_manager;
const wxPropertyGridPage* m_page;
wxVector<wxHeaderColumnSimple*> m_columns;
};
#endif // wxUSE_HEADERCTRL
// -----------------------------------------------------------------------
// wxPropertyGridManager
// -----------------------------------------------------------------------
@@ -235,7 +414,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_ADVHEADERCTRL_OFFSET 4
#define ID_ADVTBITEMSBASE_OFFSET 5 // Must be last.
// -----------------------------------------------------------------------
@@ -309,6 +488,10 @@ void wxPropertyGridManager::Init1()
#if wxUSE_TOOLBAR
m_pToolbar = NULL;
#endif
#if wxUSE_HEADERCTRL
m_pHeaderCtrl = NULL;
m_showHeader = false;
#endif
m_pTxtHelpCaption = NULL;
m_pTxtHelpContent = NULL;
@@ -413,9 +596,13 @@ void wxPropertyGridManager::Init2( int style )
// Connect to property grid onselect event.
// NB: Even if wxID_ANY is used, this doesn't connect properly in wxPython
// (see wxPropertyGridManager::ProcessEvent).
Connect(m_pPropGrid->GetId()/*wxID_ANY*/,
wxEVT_PG_SELECTED,
wxPropertyGridEventHandler(wxPropertyGridManager::OnPropertyGridSelect) );
Connect(m_pPropGrid->GetId(),
wxEVT_PG_SELECTED,
wxPropertyGridEventHandler(wxPropertyGridManager::OnPropertyGridSelect));
Connect(m_pPropGrid->GetId(),
wxEVT_PG_COL_DRAGGING,
wxPropertyGridEventHandler(wxPropertyGridManager::OnPGColDrag));
// Connect to toolbar button events.
Connect(baseId+ID_ADVTBITEMSBASE_OFFSET,baseId+ID_ADVTBITEMSBASE_OFFSET+50,
@@ -616,6 +803,11 @@ bool wxPropertyGridManager::DoSelectPage( int index )
}
#endif
#if wxUSE_HEADERCTRL
if ( m_showHeader )
m_pHeaderCtrl->OnPageChanged(nextPage);
#endif
return true;
}
@@ -733,6 +925,11 @@ void wxPropertyGridManager::SetColumnCount( int colCount, int page )
GetPageState(page)->SetColumnCount( colCount );
GetGrid()->Refresh();
#if wxUSE_HEADERCTRL
if ( m_showHeader )
m_pHeaderCtrl->OnPageUpdated();
#endif
}
// -----------------------------------------------------------------------
@@ -899,6 +1096,31 @@ bool wxPropertyGridManager::IsPageModified( size_t index ) const
// -----------------------------------------------------------------------
#if wxUSE_HEADERCTRL
void wxPropertyGridManager::ShowHeader(bool show)
{
if ( show != m_showHeader)
{
m_showHeader = show;
RecreateControls();
}
}
#endif
// -----------------------------------------------------------------------
#if wxUSE_HEADERCTRL
void wxPropertyGridManager::SetColumnTitle( int idx, const wxString& title )
{
if ( !m_pHeaderCtrl )
ShowHeader();
m_pHeaderCtrl->SetColumnTitle(idx, title);
}
#endif
// -----------------------------------------------------------------------
bool wxPropertyGridManager::IsPropertySelected( wxPGPropArg id ) const
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
@@ -1110,6 +1332,15 @@ void wxPropertyGridManager::RecalculatePositions( int width, int height )
}
#endif
// Header comes after the tool bar
#if wxUSE_HEADERCTRL
if ( m_showHeader )
{
m_pHeaderCtrl->SetSize(0, propgridY, width, -1);
propgridY += m_pHeaderCtrl->GetSize().y;
}
#endif
// Help box.
if ( m_pTxtHelpCaption )
{
@@ -1311,6 +1542,31 @@ void wxPropertyGridManager::RecreateControls()
}
#endif
#if wxUSE_HEADERCTRL
if ( m_showHeader )
{
wxPGHeaderCtrl* hc;
if ( !m_pHeaderCtrl )
{
hc = new wxPGHeaderCtrl(this);
hc->Create(this, baseId+ID_ADVHEADERCTRL_OFFSET);
m_pHeaderCtrl = hc;
}
else
{
m_pHeaderCtrl->Show();
}
m_pHeaderCtrl->OnPageChanged(GetCurrentPage());
}
else
{
if ( m_pHeaderCtrl )
m_pHeaderCtrl->Hide();
}
#endif
if ( m_windowStyle & wxPG_DESCRIPTION )
{
// Has help box.
@@ -1557,6 +1813,11 @@ void wxPropertyGridManager::SetSplitterLeft( bool subProps, bool allPages )
if ( highest > 0 )
m_pPropGrid->SetSplitterPosition( highest );
}
#if wxUSE_HEADERCTRL
if ( m_showHeader )
m_pHeaderCtrl->OnColumWidthsChanged();
#endif
}
// -----------------------------------------------------------------------
@@ -1573,6 +1834,19 @@ void wxPropertyGridManager::OnPropertyGridSelect( wxPropertyGridEvent& event )
// -----------------------------------------------------------------------
void
wxPropertyGridManager::OnPGColDrag( wxPropertyGridEvent& WXUNUSED(event) )
{
#if wxUSE_HEADERCTRL
if ( !m_showHeader )
return;
m_pHeaderCtrl->OnColumWidthsChanged();
#endif
}
// -----------------------------------------------------------------------
void wxPropertyGridManager::OnResize( wxSizeEvent& WXUNUSED(event) )
{
int width, height;
@@ -1737,9 +2011,28 @@ void wxPropertyGridManager::SetSplitterPosition( int pos, int splitterColumn )
for ( i=0; i<GetPageCount(); i++ )
{
wxPropertyGridPage* page = GetPage(i);
page->DoSetSplitterPosition( pos, splitterColumn, false );
page->m_isSplitterPreSet = true;
page->DoSetSplitterPosition( pos, splitterColumn,
wxPG_SPLITTER_REFRESH );
}
#if wxUSE_HEADERCTRL
if ( m_showHeader )
m_pHeaderCtrl->OnColumWidthsChanged();
#endif
}
// -----------------------------------------------------------------------
void wxPropertyGridManager::SetPageSplitterPosition( int page,
int pos,
int column )
{
GetPage(page)->DoSetSplitterPosition( pos, column );
#if wxUSE_HEADERCTRL
if ( m_showHeader )
m_pHeaderCtrl->OnColumWidthsChanged();
#endif
}
// -----------------------------------------------------------------------