// Categoric Mode Icon
-static const char* gs_xpm_catmode[] = {
+static const char* const gs_xpm_catmode[] = {
"16 16 5 1",
". c none",
"B c black",
};
// Alphabetic Mode Icon
-static const char* gs_xpm_noncatmode[] = {
+static const char* const gs_xpm_noncatmode[] = {
"16 16 5 1",
". c none",
"B c black",
};
// Default Page Icon.
-static const char* gs_xpm_defpage[] = {
+static const char* const gs_xpm_defpage[] = {
"16 16 5 1",
". c none",
"B c black",
long style,
const wxString& name )
{
+ if ( !m_pPropGrid )
+ m_pPropGrid = CreatePropertyGrid();
bool res = wxPanel::Create( parent, id, pos, size,
(style&0xFFFF0000)|wxWANTS_CHARS,
name );
Init2(style);
+ // FIXME: this changes call ordering so wxPropertyGrid is created
+ // immediately, before SetExtraStyle has a chance to be called. However,
+ // without it, we may get assertions if size is wxDefaultSize.
+ //SetInitialSize(size);
+
return res;
}
void wxPropertyGridManager::Init1()
{
- //m_pPropGrid = NULL;
- m_pPropGrid = CreatePropertyGrid();
+ m_pPropGrid = NULL;
#if wxUSE_TOOLBAR
m_pToolbar = NULL;
// -----------------------------------------------------------------------
// These flags are always used in wxPropertyGrid integrated in wxPropertyGridManager.
-#ifndef __WXMAC__
- #define wxPG_MAN_PROPGRID_FORCED_FLAGS (wxSIMPLE_BORDER| \
- wxNO_FULL_REPAINT_ON_RESIZE| \
- wxCLIP_CHILDREN)
-#else
- #define wxPG_MAN_PROPGRID_FORCED_FLAGS (wxNO_BORDER| \
+#define wxPG_MAN_PROPGRID_FORCED_FLAGS ( wxBORDER_THEME | \
wxNO_FULL_REPAINT_ON_RESIZE| \
wxCLIP_CHILDREN)
-#endif
// Which flags can be passed to underlying wxPropertyGrid.
#define wxPG_MAN_PASS_FLAGS_MASK (0xFFF0|wxTAB_TRAVERSAL)
SetWindowVariant(wxWINDOW_VARIANT_SMALL);
#endif
+ long propGridFlags = (m_windowStyle&wxPG_MAN_PASS_FLAGS_MASK)
+ |wxPG_MAN_PROPGRID_FORCED_FLAGS;
+
+ propGridFlags &= ~wxBORDER_MASK;
+
+ if ((style & wxPG_NO_INTERNAL_BORDER) == 0)
+ {
+ propGridFlags |= wxBORDER_THEME;
+ }
+ else
+ {
+ propGridFlags |= wxBORDER_NONE;
+ wxWindow::SetExtraStyle(wxPG_EX_TOOLBAR_SEPARATOR);
+ }
+
// Create propertygrid.
- m_pPropGrid->Create(this,baseId,wxPoint(0,0),csz,
- (m_windowStyle&wxPG_MAN_PASS_FLAGS_MASK)
- |wxPG_MAN_PROPGRID_FORCED_FLAGS);
+ m_pPropGrid->Create(this,baseId,wxPoint(0,0),csz, propGridFlags);
m_pPropGrid->m_eventObject = this;
{
END_MOUSE_CAPTURE
- m_pPropGrid->DoSelectProperty(NULL);
- m_pPropGrid->m_pState = NULL;
+ //m_pPropGrid->ClearSelection();
+ delete m_pPropGrid;
+ m_pPropGrid = NULL;
size_t i;
for ( i=0; i<m_arrPages.size(); i++ )
// -----------------------------------------------------------------------
+bool wxPropertyGridManager::Reparent( wxWindowBase *newParent )
+{
+ if ( m_pPropGrid )
+ m_pPropGrid->OnTLPChanging((wxWindow*)newParent);
+
+ bool res = wxPanel::Reparent(newParent);
+
+ return res;
+}
+
+// -----------------------------------------------------------------------
+
// Actually shows given page.
bool wxPropertyGridManager::DoSelectPage( int index )
{
if ( m_selPage == index )
return true;
- if ( m_pPropGrid->m_selected )
+ if ( m_pPropGrid->GetSelection() )
{
if ( !m_pPropGrid->ClearSelection() )
return false;
void wxPropertyGridManager::Clear()
{
+ m_pPropGrid->ClearSelection(false);
+
m_pPropGrid->Freeze();
int i;
size_t wxPropertyGridManager::GetPageCount() const
{
- if ( !(m_iFlags & wxPG_MAN_FL_PAGE_INSERTED) )
- return 0;
+ if ( !(m_iFlags & wxPG_MAN_FL_PAGE_INSERTED) )
+ return 0;
- return m_arrPages.size();
+ return m_arrPages.size();
}
// -----------------------------------------------------------------------
pageObj->m_id = m_nextTbInd;
+ if ( !HasFlag(wxPG_SPLITTER_AUTO_CENTER) )
+ pageObj->m_dontCenterSplitter = true;
+
if ( isPageInserted )
m_arrPages.push_back( pageObj );
m_pToolbar->AddTool(m_nextTbInd,label,bmp,label,wxITEM_RADIO);
//m_pToolbar->InsertTool(index+3,m_nextTbInd,bmp);
else
- m_pToolbar->AddTool(m_nextTbInd,label,wxBitmap( (const char**)gs_xpm_defpage ),
+ m_pToolbar->AddTool(m_nextTbInd,label,wxBitmap(gs_xpm_defpage),
label,wxITEM_RADIO);
m_nextTbInd++;
// -----------------------------------------------------------------------
+bool wxPropertyGridManager::IsPropertySelected( wxPGPropArg id ) const
+{
+ wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
+ for ( unsigned int i=0; i<GetPageCount(); i++ )
+ {
+ if ( GetPageState(i)->DoIsPropertySelected(p) )
+ return true;
+ }
+ return false;
+}
+
+// -----------------------------------------------------------------------
+
wxPGProperty* wxPropertyGridManager::GetPageRoot( int index ) const
{
wxASSERT( index >= 0 );
// -----------------------------------------------------------------------
-void wxPropertyGridManager::RepaintSplitter( wxDC& dc, int new_splittery, int new_width,
- int new_height, bool desc_too )
+void wxPropertyGridManager::RepaintDescBoxDecorations( wxDC& dc,
+ int newSplitterY,
+ int newWidth,
+ int newHeight )
{
- int use_hei = new_height;
-
// Draw background
wxColour bgcol = GetBackgroundColour();
- dc.SetBrush( bgcol );
- dc.SetPen( bgcol );
- int rect_hei = use_hei-new_splittery;
- if ( !desc_too )
- rect_hei = m_splitterHeight;
- dc.DrawRectangle(0,new_splittery,new_width,rect_hei);
- dc.SetPen ( wxSystemSettings::GetColour ( wxSYS_COLOUR_3DDKSHADOW ) );
- int splitter_bottom = new_splittery+m_splitterHeight - 1;
- int box_height = use_hei-splitter_bottom;
- if ( box_height > 1 )
- dc.DrawRectangle(0,splitter_bottom,new_width,box_height);
+ dc.SetBrush(bgcol);
+ dc.SetPen(bgcol);
+ int rectHeight = m_splitterHeight;
+ dc.DrawRectangle(0, newSplitterY, newWidth, rectHeight);
+ dc.SetPen( wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW) );
+ int splitterBottom = newSplitterY + m_splitterHeight - 1;
+ int boxHeight = newHeight - splitterBottom;
+ if ( boxHeight > 1 )
+ dc.DrawRectangle(0, splitterBottom, newWidth, boxHeight);
else
- dc.DrawLine(0,splitter_bottom,new_width,splitter_bottom);
+ dc.DrawLine(0, splitterBottom, newWidth, splitterBottom);
}
// -----------------------------------------------------------------------
#if wxUSE_TOOLBAR
if ( m_pToolbar )
{
- int tbHeight;
-
- #if ( wxMINOR_VERSION < 6 || (wxMINOR_VERSION == 6 && wxRELEASE_NUMBER < 2) )
- tbHeight = -1;
- #else
- // In wxWidgets 2.6.2+, Toolbar default height may be broken
- #if defined(__WXMSW__)
- tbHeight = 24;
- #elif defined(__WXGTK__)
- tbHeight = -1; // 22;
- #elif defined(__WXMAC__)
- tbHeight = 22;
- #else
- tbHeight = 22;
- #endif
- #endif
-
- m_pToolbar->SetSize(0,0,width,tbHeight);
+ m_pToolbar->SetSize(0, 0, width, -1);
propgridY += m_pToolbar->GetSize().y;
+
+ if (GetExtraStyle() & wxPG_EX_TOOLBAR_SEPARATOR)
+ propgridY += 1;
}
#endif
if ( m_iFlags & wxPG_FL_INITIALIZED )
{
int pgh = propgridBottomY - propgridY;
+ if ( pgh < 0 )
+ pgh = 0;
m_pPropGrid->SetSize( 0, propgridY, width, pgh );
m_extraHeight = height - pgh;
// Update everything inside the box
wxRect r = GetUpdateRegion().GetBox();
- // Repaint splitter?
- int r_bottom = r.y + r.height;
- int splitter_bottom = m_splitterY + m_splitterHeight;
- if ( r.y < splitter_bottom && r_bottom >= m_splitterY )
- RepaintSplitter( dc, m_splitterY, m_width, m_height, false );
+ if (GetExtraStyle() & wxPG_EX_TOOLBAR_SEPARATOR)
+ {
+ if (m_pToolbar && m_pPropGrid)
+ {
+ wxPen marginPen(m_pPropGrid->GetMarginColour());
+ dc.SetPen(marginPen);
+
+ int y = m_pPropGrid->GetPosition().y-1;
+ dc.DrawLine(0, y, GetClientSize().x, y);
+ }
+ }
+
+ // Repaint splitter and any other description box decorations
+ if ( (r.y + r.height) >= m_splitterY && m_splitterY != -1)
+ RepaintDescBoxDecorations( dc, m_splitterY, m_width, m_height );
}
// -----------------------------------------------------------------------
// Has toolbar.
if ( !m_pToolbar )
{
+ long toolBarFlags = ((GetExtraStyle()&wxPG_EX_NO_FLAT_TOOLBAR)?0:wxTB_FLAT);
+ if (GetExtraStyle() & wxPG_EX_NO_TOOLBAR_DIVIDER)
+ toolBarFlags |= wxTB_NODIVIDER;
+
m_pToolbar = new wxToolBar(this,baseId+ID_ADVTOOLBAR_OFFSET,
wxDefaultPosition,wxDefaultSize,
- ((GetExtraStyle()&wxPG_EX_NO_FLAT_TOOLBAR)?0:wxTB_FLAT)
- /*| wxTB_HORIZONTAL | wxNO_BORDER*/ );
+ toolBarFlags);
+ m_pToolbar->SetToolBitmapSize(wxSize(16, 15));
#if defined(__WXMSW__)
// Eliminate toolbar flicker on XP
wxString desc1(_("Categorized Mode"));
wxString desc2(_("Alphabetic Mode"));
m_pToolbar->AddTool(baseId+ID_ADVTBITEMSBASE_OFFSET+0,
- desc1,wxBitmap ( (const char**)gs_xpm_catmode ),
+ desc1,wxBitmap (gs_xpm_catmode),
desc1,wxITEM_RADIO);
m_pToolbar->AddTool(baseId+ID_ADVTBITEMSBASE_OFFSET+1,
- desc2,wxBitmap ( (const char**)gs_xpm_noncatmode ),
+ desc2,wxBitmap (gs_xpm_noncatmode),
desc2,wxITEM_RADIO);
m_pToolbar->Realize();
}
else
{
wxClientDC dc(this);
- dc.SetFont(m_pPropGrid->m_font);
+ dc.SetFont(m_pPropGrid->GetFont());
int highest = 0;
unsigned int i;
maxW += m_pPropGrid->m_marginWidth;
if ( maxW > highest )
highest = maxW;
+ m_pState->m_dontCenterSplitter = true;
}
if ( highest > 0 )
m_pPropGrid->SetSplitterPosition( highest );
-
- m_pPropGrid->m_iFlags |= wxPG_FL_DONT_CENTER_SPLITTER;
}
}
{
int width, height;
- GetClientSize(&width,&height);
+ GetClientSize(&width, &height);
if ( m_width == -12345 )
RecreateControls();
- RecalculatePositions(width,height);
+ RecalculatePositions(width, height);
+
+ if ( m_pPropGrid && m_pPropGrid->m_parent )
+ {
+ int pgWidth, pgHeight;
+ m_pPropGrid->GetClientSize(&pgWidth, &pgHeight);
+
+ // Regenerate splitter positions for non-current pages
+ for ( unsigned int i=0; i<GetPageCount(); i++ )
+ {
+ wxPropertyGridPage* page = GetPage(i);
+ if ( page != m_pPropGrid->GetState() )
+ {
+ page->OnClientWidthChange(pgWidth,
+ pgWidth - page->m_width,
+ true);
+ }
+ }
+ }
}
// -----------------------------------------------------------------------
{
wxPropertyGridPage* page = GetPage(i);
page->DoSetSplitterPosition( pos, splitterColumn, false );
+ page->m_isSplitterPreSet = true;
}
-
- m_pPropGrid->SetInternalFlag(wxPG_FL_SPLITTER_PRE_SET);
}
// -----------------------------------------------------------------------