// Author: Jaakko Salli
// Modified by:
// Created: 2008-08-24
-// RCS-ID: $Id$
// Copyright: (c) Jaakko Salli
-// Licence: wxWindows license
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PROPGRID_PROPGRIDPAGESTATE_H_
#define _WX_PROPGRID_PROPGRIDPAGESTATE_H_
+#include "wx/defs.h"
+
#if wxUSE_PROPGRID
#include "wx/propgrid/property.h"
A return value from wxPropertyGrid::HitTest(),
contains all you need to know about an arbitrary location on the grid.
*/
-struct WXDLLIMPEXP_PROPGRID wxPropertyGridHitTestResult
+class WXDLLIMPEXP_PROPGRID wxPropertyGridHitTestResult
{
friend class wxPropertyGridPageState;
public:
+ wxPropertyGridHitTestResult()
+ {
+ m_property = NULL;
+ m_column = -1;
+ m_splitter = -1;
+ m_splitterHitOffset = 0;
+ }
- wxPGProperty* GetProperty() const { return property; }
+ ~wxPropertyGridHitTestResult()
+ {
+ }
- /** Column. -1 for margin. */
- int column;
+ /**
+ Returns column hit. -1 for margin.
+ */
+ int GetColumn() const { return m_column; }
- /** Index of splitter hit, -1 for none. */
- int splitter;
+ /**
+ Returns property hit. NULL if empty space below
+ properties was hit instead.
+ */
+ wxPGProperty* GetProperty() const
+ {
+ return m_property;
+ }
- /** If splitter hit, offset to that */
- int splitterHitOffset;
+ /**
+ Returns index of splitter hit, -1 for none.
+ */
+ int GetSplitter() const { return m_splitter; }
+
+ /**
+ If splitter hit, then this member function
+ returns offset to the exact splitter position.
+ */
+ int GetSplitterHitOffset() const { return m_splitterHitOffset; }
private:
/** Property. NULL if empty space below properties was hit */
- wxPGProperty* property;
+ wxPGProperty* m_property;
+
+ /** Column. -1 for margin. */
+ int m_column;
+
+ /** Index of splitter hit, -1 for none. */
+ int m_splitter;
+
+ /** If splitter hit, offset to that */
+ int m_splitterHitOffset;
};
// -----------------------------------------------------------------------
/** Base class to derive new viterators.
*/
-class WXDLLIMPEXP_PROPGRID wxPGVIteratorBase
+class WXDLLIMPEXP_PROPGRID wxPGVIteratorBase : public wxObjectRefData
{
friend class wxPGVIterator;
public:
- wxPGVIteratorBase() { m_refCount = 1; }
+ wxPGVIteratorBase() { }
virtual void Next() = 0;
- void IncRef()
- {
- m_refCount++;
- }
- void DecRef()
- {
- m_refCount--;
- if ( m_refCount <= 0 )
- delete this;
- }
protected:
virtual ~wxPGVIteratorBase() { }
wxPropertyGridIterator m_it;
-private:
- int m_refCount;
};
/** @class wxPGVIterator
m_pIt = it.m_pIt;
m_pIt->IncRef();
}
-#ifndef SWIG
const wxPGVIterator& operator=( const wxPGVIterator& it )
{
if (this != &it)
}
return *this;
}
-#endif
void Next() { m_pIt->Next(); }
bool AtEnd() const { return m_pIt->m_it.AtEnd(); }
wxPGProperty* GetProperty() const { return m_pIt->m_it.GetProperty(); }
// -----------------------------------------------------------------------
-#ifndef SWIG
-// We won't need this class from wxPython
-
/** @class wxPropertyGridPageState
Contains low-level property page information (properties, column widths,
void CheckColumnWidths( int widthChange = 0 );
/**
- Override this member function to add custom behavior on property
+ Override this member function to add custom behaviour on property
deletion.
*/
virtual void DoDelete( wxPGProperty* item, bool doDelete = true );
wxPGProperty* DoGetItemAtY( int y ) const;
/**
- Override this member function to add custom behavior on property
+ Override this member function to add custom behaviour on property
insertion.
*/
virtual wxPGProperty* DoInsert( wxPGProperty* parent,
*/
virtual void DoSetSplitterPosition( int pos,
int splitterColumn = 0,
- bool allPages = false,
- bool fromAutoCenter = false );
+ int flags = 0 );
bool EnableCategories( bool enable );
}
}
- /** Enables or disables given property and its subproperties. */
- bool DoEnableProperty( wxPGProperty* p, bool enable );
-
/** Returns (precalculated) height of contained visible properties.
*/
unsigned int GetVirtualHeight() const
return (unsigned int) m_colWidths.size();
}
- wxPGProperty* GetSelection() const
- {
- return m_selected;
- }
-
int GetColumnMinWidth( int column ) const;
int GetColumnWidth( unsigned int column ) const
return ((wxPropertyGridPageState*)this)->GetLastItem(flags);
}
+ /**
+ Returns currently selected property.
+ */
+ wxPGProperty* GetSelection() const
+ {
+ if ( m_selection.size() == 0 )
+ return NULL;
+ return m_selection[0];
+ }
+
+ void DoSetSelection( wxPGProperty* prop )
+ {
+ m_selection.clear();
+ if ( prop )
+ m_selection.push_back(prop);
+ }
+
+ bool DoClearSelection()
+ {
+ return DoSelectProperty(NULL);
+ }
+
+ void DoRemoveFromSelection( wxPGProperty* prop );
+
+ void DoSetColumnProportion( unsigned int column, int proportion );
+
+ int DoGetColumnProportion( unsigned int column ) const
+ {
+ return m_columnProportions[column];
+ }
+
+ void ResetColumnSizes( int setSplitterFlags );
+
wxPropertyCategory* GetPropertyCategory( const wxPGProperty* p ) const;
wxPGProperty* GetPropertyByLabel( const wxString& name,
unsigned int col,
bool subProps) const;
- /** Returns information about arbitrary position in the grid.
-
- wxPropertyGridHitTestResult definition:
- @code
- struct wxPropertyGridHitTestResult
- {
- wxPGProperty* GetProperty() const;
+ int GetColumnFullWidth(wxClientDC &dc, wxPGProperty *p, unsigned int col);
- // column. -1 for margin
- int column;
-
- // Index of splitter hit, -1 for none.
- int splitter;
+ /**
+ Returns information about arbitrary position in the grid.
- // If splitter hit, then offset to that.
- int splitterHitOffset;
- };
- @endcode
+ @param pt
+ Logical coordinates in the virtual grid space. Use
+ wxScrolled<T>::CalcUnscrolledPosition() if you need to
+ translate a scrolled position into a logical one.
*/
wxPropertyGridHitTestResult HitTest( const wxPoint& pt ) const;
bool IsInNonCatMode() const { return (bool)(m_properties == m_abcArray); }
- /** Only inits arrays, doesn't migrate things or such. */
- void InitNonCatMode ();
-
void DoLimitPropertyEditing( wxPGProperty* p, bool limit = true )
{
p->SetFlagRecursively(wxPG_PROP_NOEDITOR, limit);
void DoSetPropertyValues( const wxVariantList& list,
wxPGProperty* default_category );
- void DoSetPropertyValueUnspecified( wxPGProperty* p );
-
void SetSplitterLeft( bool subProps = false );
/** Set virtual width for this particular page. */
void SetVirtualWidth( int width );
- void DoSortChildren( wxPGProperty* p, bool recursively = false );
- void DoSort();
+ void DoSortChildren( wxPGProperty* p, int flags = 0 );
+ void DoSort( int flags = 0 );
- void SetSelection( wxPGProperty* p ) { m_selected = p; }
+ bool PrepareAfterItemsAdded();
/** Called after virtual height needs to be recalculated.
*/
/** Returns property by its name. */
wxPGProperty* BaseGetPropertyByName( const wxString& name ) const;
- void DoClearSelection()
- {
- m_selected = NULL;
- }
-
/** Called in, for example, wxPropertyGrid::Clear. */
void DoClear();
+ bool DoIsPropertySelected( wxPGProperty* prop ) const;
+
bool DoCollapse( wxPGProperty* p );
bool DoExpand( wxPGProperty* p );
protected:
+ // Utility to check if two properties are visibly next to each other
+ bool ArePropertiesAdjacent( wxPGProperty* prop1,
+ wxPGProperty* prop2,
+ int iterFlags = wxPG_ITERATE_VISIBLE ) const;
+
int DoGetSplitterPosition( int splitterIndex = 0 ) const;
/** Returns column at x coordinate (in GetGrid()->GetPanel()).
/** List of column widths (first column does not include margin). */
wxArrayInt m_colWidths;
+ /** List of indices of columns the user can edit by clicking it. */
+ wxArrayInt m_editableColumns;
+
+ /** Column proportions */
+ wxArrayInt m_columnProportions;
+
double m_fSplitterX;
/** Most recently added category. */
wxPropertyCategory* m_currentCategory;
- /** Pointer to selected property. */
- wxPGProperty* m_selected;
+ /** Array of selected property. */
+ wxArrayPGProperty m_selection;
/** Virtual width. */
int m_width;
unsigned char m_anyModified;
unsigned char m_vhCalcPending;
-};
-#endif // #ifndef SWIG
+ /** True if splitter has been pre-set by the application. */
+ bool m_isSplitterPreSet;
+
+ /** Used to (temporarily) disable splitter centering. */
+ bool m_dontCenterSplitter;
+
+private:
+ /** Only inits arrays, doesn't migrate things or such. */
+ void InitNonCatMode();
+};
// -----------------------------------------------------------------------