Implement wxEditorDialogProperty as a base class for wxPG properties with dialog editor
Properties using TextCtrlAndButton editor (like wxLongStringProperty, wxDirProperty, wxFileProperty) share some features, like button triggering the editor dialog, and share a data, like dialog window attributes, so for the sake of the clear design it would be good to derive them from the common base class in which all shared functions/data are implemented. This class is not intended to be instantiated so it's an abstract class.
This commit is contained in:
@@ -574,13 +574,23 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
class WXDLLIMPEXP_PROPGRID wxEditorDialogProperty : public wxPGProperty
|
||||||
class WXDLLIMPEXP_PROPGRID
|
|
||||||
wxPGFileDialogAdapter : public wxPGEditorDialogAdapter
|
|
||||||
{
|
{
|
||||||
|
friend class wxPGDialogAdapter;
|
||||||
|
wxDECLARE_ABSTRACT_CLASS(wxDialogProperty);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual bool DoShowDialog( wxPropertyGrid* propGrid,
|
virtual ~wxEditorDialogProperty();
|
||||||
wxPGProperty* property ) wxOVERRIDE;
|
|
||||||
|
virtual wxPGEditorDialogAdapter* GetEditorDialog() const wxOVERRIDE;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
wxEditorDialogProperty(const wxString& label, const wxString& name);
|
||||||
|
|
||||||
|
virtual bool DisplayEditorDialog(wxPropertyGrid* pg, wxVariant& value) = 0;
|
||||||
|
|
||||||
|
wxString m_dlgTitle; // Title for a dialog
|
||||||
|
long m_dlgStyle; // Dialog style
|
||||||
};
|
};
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
@@ -589,9 +599,8 @@ public:
|
|||||||
#define wxPG_PROP_SHOW_FULL_FILENAME wxPG_PROP_CLASS_SPECIFIC_1
|
#define wxPG_PROP_SHOW_FULL_FILENAME wxPG_PROP_CLASS_SPECIFIC_1
|
||||||
|
|
||||||
// Like wxLongStringProperty, but the button triggers file selector instead.
|
// Like wxLongStringProperty, but the button triggers file selector instead.
|
||||||
class WXDLLIMPEXP_PROPGRID wxFileProperty : public wxPGProperty
|
class WXDLLIMPEXP_PROPGRID wxFileProperty : public wxEditorDialogProperty
|
||||||
{
|
{
|
||||||
friend class wxPGFileDialogAdapter;
|
|
||||||
WX_PG_DECLARE_PROPERTY_CLASS(wxFileProperty)
|
WX_PG_DECLARE_PROPERTY_CLASS(wxFileProperty)
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -605,7 +614,6 @@ public:
|
|||||||
virtual bool StringToValue( wxVariant& variant,
|
virtual bool StringToValue( wxVariant& variant,
|
||||||
const wxString& text,
|
const wxString& text,
|
||||||
int argFlags = 0 ) const wxOVERRIDE;
|
int argFlags = 0 ) const wxOVERRIDE;
|
||||||
virtual wxPGEditorDialogAdapter* GetEditorDialog() const wxOVERRIDE;
|
|
||||||
virtual bool DoSetAttribute( const wxString& name, wxVariant& value ) wxOVERRIDE;
|
virtual bool DoSetAttribute( const wxString& name, wxVariant& value ) wxOVERRIDE;
|
||||||
|
|
||||||
static wxValidator* GetClassValidator();
|
static wxValidator* GetClassValidator();
|
||||||
@@ -615,36 +623,23 @@ public:
|
|||||||
wxFileName GetFileName() const;
|
wxFileName GetFileName() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool DisplayEditorDialog(wxPropertyGrid* propGrid, wxString& value);
|
virtual bool DisplayEditorDialog(wxPropertyGrid* pg, wxVariant& value) wxOVERRIDE;
|
||||||
|
|
||||||
wxString m_wildcard;
|
wxString m_wildcard;
|
||||||
wxString m_basePath; // If set, then show path relative to it
|
wxString m_basePath; // If set, then show path relative to it
|
||||||
wxString m_initialPath; // If set, start the file dialog here
|
wxString m_initialPath; // If set, start the file dialog here
|
||||||
wxString m_dlgTitle; // If set, used as title for file dialog
|
|
||||||
int m_indFilter; // index to the selected filter
|
int m_indFilter; // index to the selected filter
|
||||||
long m_dlgStyle; // File dialog style
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
#define wxPG_PROP_NO_ESCAPE wxPG_PROP_CLASS_SPECIFIC_1
|
|
||||||
// Flag used in wxLongStringProperty to mark that edit button
|
// Flag used in wxLongStringProperty to mark that edit button
|
||||||
// should be enabled even in the read-only mode.
|
// should be enabled even in the read-only mode.
|
||||||
#define wxPG_PROP_ACTIVE_BTN wxPG_PROP_CLASS_SPECIFIC_3
|
#define wxPG_PROP_ACTIVE_BTN wxPG_PROP_CLASS_SPECIFIC_1
|
||||||
|
|
||||||
|
|
||||||
class WXDLLIMPEXP_PROPGRID
|
|
||||||
wxPGLongStringDialogAdapter : public wxPGEditorDialogAdapter
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual bool DoShowDialog( wxPropertyGrid* propGrid,
|
|
||||||
wxPGProperty* property ) wxOVERRIDE;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Like wxStringProperty, but has a button that triggers a small text
|
// Like wxStringProperty, but has a button that triggers a small text
|
||||||
// editor dialog.
|
// editor dialog.
|
||||||
class WXDLLIMPEXP_PROPGRID wxLongStringProperty : public wxPGProperty
|
class WXDLLIMPEXP_PROPGRID wxLongStringProperty : public wxEditorDialogProperty
|
||||||
{
|
{
|
||||||
WX_PG_DECLARE_PROPERTY_CLASS(wxLongStringProperty)
|
WX_PG_DECLARE_PROPERTY_CLASS(wxLongStringProperty)
|
||||||
public:
|
public:
|
||||||
@@ -658,41 +653,32 @@ public:
|
|||||||
virtual bool StringToValue( wxVariant& variant,
|
virtual bool StringToValue( wxVariant& variant,
|
||||||
const wxString& text,
|
const wxString& text,
|
||||||
int argFlags = 0 ) const wxOVERRIDE;
|
int argFlags = 0 ) const wxOVERRIDE;
|
||||||
virtual bool OnEvent( wxPropertyGrid* propgrid,
|
|
||||||
wxWindow* primary, wxEvent& event ) wxOVERRIDE;
|
|
||||||
|
|
||||||
// Shows string editor dialog. Value to be edited should be read from
|
|
||||||
// value, and if dialog is not cancelled, it should be stored back and true
|
|
||||||
// should be returned if that was the case.
|
|
||||||
virtual bool OnButtonClick( wxPropertyGrid* propgrid, wxString& value );
|
|
||||||
|
|
||||||
static bool DisplayEditorDialog( wxPGProperty* prop,
|
|
||||||
wxPropertyGrid* propGrid,
|
|
||||||
wxString& value );
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
virtual bool DisplayEditorDialog(wxPropertyGrid* pg, wxVariant& value) wxOVERRIDE;
|
||||||
};
|
};
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
// Like wxLongStringProperty, but the button triggers dir selector instead.
|
// Like wxLongStringProperty, but the button triggers dir selector instead.
|
||||||
class WXDLLIMPEXP_PROPGRID wxDirProperty : public wxLongStringProperty
|
class WXDLLIMPEXP_PROPGRID wxDirProperty : public wxEditorDialogProperty
|
||||||
{
|
{
|
||||||
wxDECLARE_DYNAMIC_CLASS(wxDirProperty);
|
WX_PG_DECLARE_PROPERTY_CLASS(wxDirProperty)
|
||||||
public:
|
public:
|
||||||
wxDirProperty( const wxString& name = wxPG_LABEL,
|
wxDirProperty( const wxString& name = wxPG_LABEL,
|
||||||
const wxString& label = wxPG_LABEL,
|
const wxString& label = wxPG_LABEL,
|
||||||
const wxString& value = wxEmptyString );
|
const wxString& value = wxEmptyString );
|
||||||
virtual ~wxDirProperty();
|
virtual ~wxDirProperty();
|
||||||
|
|
||||||
virtual bool DoSetAttribute( const wxString& name, wxVariant& value ) wxOVERRIDE;
|
virtual wxString ValueToString(wxVariant& value, int argFlags = 0) const wxOVERRIDE;
|
||||||
|
virtual bool StringToValue(wxVariant& variant, const wxString& text,
|
||||||
|
int argFlags = 0) const wxOVERRIDE;
|
||||||
|
virtual bool DoSetAttribute(const wxString& name, wxVariant& value) wxOVERRIDE;
|
||||||
virtual wxValidator* DoGetValidator() const wxOVERRIDE;
|
virtual wxValidator* DoGetValidator() const wxOVERRIDE;
|
||||||
|
|
||||||
virtual bool OnButtonClick ( wxPropertyGrid* propGrid, wxString& value ) wxOVERRIDE;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
wxString m_dlgMessage;
|
virtual bool DisplayEditorDialog(wxPropertyGrid* pg, wxVariant& value) wxOVERRIDE;
|
||||||
};
|
};
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
@@ -546,17 +546,49 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** @class wxEditorDialogProperty
|
||||||
/** @class wxPGFileDialogAdapter
|
|
||||||
@ingroup classes
|
@ingroup classes
|
||||||
|
|
||||||
|
This is an abstract class which serves as a base class for the properties
|
||||||
|
having a button triggering an editor dialog, like e.g. wxLongStringProperty,
|
||||||
|
wxDirProperty, wxFileProperty.
|
||||||
|
|
||||||
|
@since 3.1.3
|
||||||
*/
|
*/
|
||||||
class wxPGFileDialogAdapter : public wxPGEditorDialogAdapter
|
class wxEditorDialogProperty : public wxPGProperty
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual bool DoShowDialog( wxPropertyGrid* propGrid,
|
virtual ~wxEditorDialogProperty();
|
||||||
wxPGProperty* property );
|
|
||||||
};
|
|
||||||
|
|
||||||
|
virtual wxPGEditorDialogAdapter* GetEditorDialog() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
Constructor is protected because wxEditorDialogProperty is only
|
||||||
|
the base class for other property classes.
|
||||||
|
*/
|
||||||
|
wxEditorDialogProperty(const wxString& label, const wxString& name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Shows editor dialog. Value to be edited should be read from
|
||||||
|
@a value, and if dialog is not cancelled, it should be stored back
|
||||||
|
and @true should be returned.
|
||||||
|
|
||||||
|
@param value
|
||||||
|
Value to be edited.
|
||||||
|
|
||||||
|
@param pg
|
||||||
|
Property grid in which property is displayed.
|
||||||
|
|
||||||
|
@return
|
||||||
|
Returns @true if editor dialog was not cancelled and @a value
|
||||||
|
was updated.
|
||||||
|
*/
|
||||||
|
virtual bool DisplayEditorDialog(wxPropertyGrid* pg, wxVariant& value) = 0;
|
||||||
|
|
||||||
|
wxString m_dlgTitle;
|
||||||
|
long m_dlgStyle;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// Indicates first bit useable by derived properties.
|
// Indicates first bit useable by derived properties.
|
||||||
@@ -578,7 +610,7 @@ public:
|
|||||||
- ::wxPG_FILE_DIALOG_STYLE: Sets a specific wxFileDialog style for the file
|
- ::wxPG_FILE_DIALOG_STYLE: Sets a specific wxFileDialog style for the file
|
||||||
dialog (since 2.9.4).
|
dialog (since 2.9.4).
|
||||||
*/
|
*/
|
||||||
class wxFileProperty : public wxPGProperty
|
class wxFileProperty : public wxEditorDialogProperty
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -592,7 +624,6 @@ public:
|
|||||||
virtual bool StringToValue( wxVariant& variant,
|
virtual bool StringToValue( wxVariant& variant,
|
||||||
const wxString& text,
|
const wxString& text,
|
||||||
int argFlags = 0 ) const;
|
int argFlags = 0 ) const;
|
||||||
virtual wxPGEditorDialogAdapter* GetEditorDialog() const;
|
|
||||||
virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
|
virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
|
||||||
|
|
||||||
static wxValidator* GetClassValidator();
|
static wxValidator* GetClassValidator();
|
||||||
@@ -604,37 +635,23 @@ public:
|
|||||||
wxFileName GetFileName() const;
|
wxFileName GetFileName() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool DisplayEditorDialog(wxPropertyGrid* propGrid, wxString& value);
|
virtual bool DisplayEditorDialog(wxPropertyGrid* pg, wxVariant& value);
|
||||||
|
|
||||||
wxString m_wildcard;
|
wxString m_wildcard;
|
||||||
wxString m_basePath;
|
wxString m_basePath;
|
||||||
wxString m_initialPath;
|
wxString m_initialPath;
|
||||||
wxString m_dlgTitle;
|
|
||||||
int m_indFilter;
|
int m_indFilter;
|
||||||
long m_dlgStyle;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define wxPG_PROP_ACTIVE_BTN wxPG_PROP_CLASS_SPECIFIC_1
|
||||||
#define wxPG_PROP_NO_ESCAPE wxPG_PROP_CLASS_SPECIFIC_1
|
|
||||||
|
|
||||||
/** @class wxPGLongStringDialogAdapter
|
|
||||||
@ingroup classes
|
|
||||||
*/
|
|
||||||
class wxPGLongStringDialogAdapter : public wxPGEditorDialogAdapter
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual bool DoShowDialog( wxPropertyGrid* propGrid,
|
|
||||||
wxPGProperty* property );
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/** @class wxLongStringProperty
|
/** @class wxLongStringProperty
|
||||||
@ingroup classes
|
@ingroup classes
|
||||||
Like wxStringProperty, but has a button that triggers a small text
|
Like wxStringProperty, but has a button that triggers a small text
|
||||||
editor dialog.
|
editor dialog.
|
||||||
*/
|
*/
|
||||||
class wxLongStringProperty : public wxPGProperty
|
class wxLongStringProperty : public wxEditorDialogProperty
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -647,30 +664,21 @@ public:
|
|||||||
virtual bool StringToValue( wxVariant& variant,
|
virtual bool StringToValue( wxVariant& variant,
|
||||||
const wxString& text,
|
const wxString& text,
|
||||||
int argFlags = 0 ) const;
|
int argFlags = 0 ) const;
|
||||||
virtual bool OnEvent( wxPropertyGrid* propgrid,
|
|
||||||
wxWindow* primary, wxEvent& event );
|
|
||||||
|
|
||||||
// Shows string editor dialog. Value to be edited should be read from
|
protected:
|
||||||
// value, and if dialog is not cancelled, it should be stored back and true
|
virtual bool DisplayEditorDialog(wxPropertyGrid* pg, wxVariant& value);
|
||||||
// should be returned if that was the case.
|
|
||||||
virtual bool OnButtonClick( wxPropertyGrid* propgrid, wxString& value );
|
|
||||||
|
|
||||||
static bool DisplayEditorDialog( wxPGProperty* prop,
|
|
||||||
wxPropertyGrid* propGrid,
|
|
||||||
wxString& value );
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @class wxDirProperty
|
/** @class wxDirProperty
|
||||||
@ingroup classes
|
@ingroup classes
|
||||||
Like wxLongStringProperty, but the button triggers dir selector instead.
|
Like wxLongStringProperty, but the button triggers directory selector
|
||||||
|
instead.
|
||||||
|
|
||||||
<b>Supported special attributes:</b>
|
<b>Supported special attributes:</b>
|
||||||
- ::wxPG_DIR_DIALOG_MESSAGE: Sets specific message in the dir selector.
|
- ::wxPG_DIR_DIALOG_MESSAGE: Sets specific message in the dir selector.
|
||||||
*/
|
*/
|
||||||
class wxDirProperty : public wxLongStringProperty
|
class wxDirProperty : public wxEditorDialogProperty
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
wxDirProperty( const wxString& name = wxPG_LABEL,
|
wxDirProperty( const wxString& name = wxPG_LABEL,
|
||||||
@@ -678,13 +686,14 @@ public:
|
|||||||
const wxString& value = wxEmptyString );
|
const wxString& value = wxEmptyString );
|
||||||
virtual ~wxDirProperty();
|
virtual ~wxDirProperty();
|
||||||
|
|
||||||
|
virtual wxString ValueToString(wxVariant& value, int argFlags = 0) const;
|
||||||
|
virtual bool StringToValue(wxVariant& variant, const wxString& text,
|
||||||
|
int argFlags = 0) const;
|
||||||
virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
|
virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
|
||||||
virtual wxValidator* DoGetValidator() const;
|
virtual wxValidator* DoGetValidator() const;
|
||||||
|
|
||||||
virtual bool OnButtonClick ( wxPropertyGrid* propGrid, wxString& value );
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
wxString m_dlgMessage;
|
virtual bool DisplayEditorDialog(wxPropertyGrid* pg, wxVariant& value);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1877,24 +1877,41 @@ bool wxFlagsProperty::DoSetAttribute( const wxString& name, wxVariant& value )
|
|||||||
// wxDirProperty
|
// wxDirProperty
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
wxIMPLEMENT_DYNAMIC_CLASS(wxDirProperty, wxLongStringProperty);
|
wxPG_IMPLEMENT_PROPERTY_CLASS(wxDirProperty, wxEditorDialogProperty, TextCtrlAndButton)
|
||||||
|
|
||||||
wxDirProperty::wxDirProperty( const wxString& name, const wxString& label, const wxString& value )
|
wxDirProperty::wxDirProperty( const wxString& name, const wxString& label, const wxString& value )
|
||||||
: wxLongStringProperty(name,label,value)
|
: wxEditorDialogProperty(name, label)
|
||||||
{
|
{
|
||||||
m_flags |= wxPG_PROP_NO_ESCAPE;
|
|
||||||
m_flags &= ~wxPG_PROP_ACTIVE_BTN; // Property button enabled only in not read-only mode.
|
m_flags &= ~wxPG_PROP_ACTIVE_BTN; // Property button enabled only in not read-only mode.
|
||||||
|
SetValue(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
wxDirProperty::~wxDirProperty() { }
|
wxDirProperty::~wxDirProperty() { }
|
||||||
|
|
||||||
|
wxString wxDirProperty::ValueToString(wxVariant& value, int WXUNUSED(argFlags)) const
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxDirProperty::StringToValue(wxVariant& variant, const wxString& text, int) const
|
||||||
|
{
|
||||||
|
if ( variant != text )
|
||||||
|
{
|
||||||
|
variant = text;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
wxValidator* wxDirProperty::DoGetValidator() const
|
wxValidator* wxDirProperty::DoGetValidator() const
|
||||||
{
|
{
|
||||||
return wxFileProperty::GetClassValidator();
|
return wxFileProperty::GetClassValidator();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxDirProperty::OnButtonClick( wxPropertyGrid* propGrid, wxString& value )
|
bool wxDirProperty::DisplayEditorDialog(wxPropertyGrid* pg, wxVariant& value)
|
||||||
{
|
{
|
||||||
|
wxASSERT_MSG(value.IsType(wxS("string")), "Function called for incompatible property");
|
||||||
|
|
||||||
// Update property value from editor, if necessary
|
// Update property value from editor, if necessary
|
||||||
wxSize dlg_sz;
|
wxSize dlg_sz;
|
||||||
wxPoint dlg_pos;
|
wxPoint dlg_pos;
|
||||||
@@ -1907,19 +1924,12 @@ bool wxDirProperty::OnButtonClick( wxPropertyGrid* propGrid, wxString& value )
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
dlg_sz.Set(300, 400);
|
dlg_sz.Set(300, 400);
|
||||||
dlg_pos = propGrid->GetGoodEditorDialogPosition(this, dlg_sz);
|
dlg_pos = pg->GetGoodEditorDialogPosition(this, dlg_sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString dlgMessage(m_dlgMessage);
|
wxDirDialog dlg(pg->GetPanel(),
|
||||||
if ( dlgMessage.empty() )
|
m_dlgTitle.empty() ? _("Choose a directory:") : m_dlgTitle,
|
||||||
dlgMessage = _("Choose a directory:");
|
value.GetString(), m_dlgStyle, dlg_pos, dlg_sz);
|
||||||
wxDirDialog dlg( propGrid,
|
|
||||||
dlgMessage,
|
|
||||||
value,
|
|
||||||
0,
|
|
||||||
dlg_pos, dlg_sz
|
|
||||||
);
|
|
||||||
|
|
||||||
if ( dlg.ShowModal() == wxID_OK )
|
if ( dlg.ShowModal() == wxID_OK )
|
||||||
{
|
{
|
||||||
value = dlg.GetPath();
|
value = dlg.GetPath();
|
||||||
@@ -1928,47 +1938,81 @@ bool wxDirProperty::OnButtonClick( wxPropertyGrid* propGrid, wxString& value )
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxDirProperty::DoSetAttribute( const wxString& name, wxVariant& value )
|
bool wxDirProperty::DoSetAttribute(const wxString& name, wxVariant& value)
|
||||||
{
|
{
|
||||||
if ( name == wxPG_DIR_DIALOG_MESSAGE )
|
if ( name == wxPG_DIR_DIALOG_MESSAGE )
|
||||||
{
|
{
|
||||||
m_dlgMessage = value.GetString();
|
m_dlgTitle = value.GetString();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return wxLongStringProperty::DoSetAttribute(name, value);
|
return wxEditorDialogProperty::DoSetAttribute(name, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
// wxPGFileDialogAdapter
|
// wxPGDialogAdapter
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
bool wxPGFileDialogAdapter::DoShowDialog( wxPropertyGrid* propGrid, wxPGProperty* property )
|
class WXDLLIMPEXP_PROPGRID wxPGDialogAdapter : public wxPGEditorDialogAdapter
|
||||||
{
|
{
|
||||||
wxFileProperty* prop = wxDynamicCast(property, wxFileProperty);
|
public:
|
||||||
wxCHECK_MSG( prop, false, "Function called for incompatible property" );
|
wxPGDialogAdapter() : wxPGEditorDialogAdapter()
|
||||||
|
|
||||||
wxString value = prop->GetValueAsString(0);
|
|
||||||
if ( prop->DisplayEditorDialog(propGrid, value) )
|
|
||||||
{
|
{
|
||||||
SetValue(value);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
virtual ~wxPGDialogAdapter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool DoShowDialog(wxPropertyGrid* pg, wxPGProperty* prop) wxOVERRIDE
|
||||||
|
{
|
||||||
|
wxEditorDialogProperty* dlgProp = wxDynamicCast(prop, wxEditorDialogProperty);
|
||||||
|
wxCHECK_MSG(dlgProp, false, "Function called for incompatible property");
|
||||||
|
|
||||||
|
wxVariant val = pg->GetUncommittedPropertyValue();
|
||||||
|
if ( dlgProp->DisplayEditorDialog(pg, val) )
|
||||||
|
{
|
||||||
|
SetValue(val);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------
|
||||||
|
// wxDialogProperty
|
||||||
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxIMPLEMENT_ABSTRACT_CLASS(wxEditorDialogProperty, wxPGProperty)
|
||||||
|
|
||||||
|
wxEditorDialogProperty::wxEditorDialogProperty(const wxString& label, const wxString& name)
|
||||||
|
: wxPGProperty(label, name)
|
||||||
|
, m_dlgStyle(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxEditorDialogProperty::~wxEditorDialogProperty()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPGEditorDialogAdapter* wxEditorDialogProperty::GetEditorDialog() const
|
||||||
|
{
|
||||||
|
return new wxPGDialogAdapter();
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
// wxFileProperty
|
// wxFileProperty
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
wxPG_IMPLEMENT_PROPERTY_CLASS(wxFileProperty,wxPGProperty,TextCtrlAndButton)
|
wxPG_IMPLEMENT_PROPERTY_CLASS(wxFileProperty,wxEditorDialogProperty,TextCtrlAndButton)
|
||||||
|
|
||||||
wxFileProperty::wxFileProperty( const wxString& label, const wxString& name,
|
wxFileProperty::wxFileProperty( const wxString& label, const wxString& name,
|
||||||
const wxString& value ) : wxPGProperty(label,name)
|
const wxString& value )
|
||||||
|
: wxEditorDialogProperty(label, name)
|
||||||
{
|
{
|
||||||
m_flags |= wxPG_PROP_SHOW_FULL_FILENAME;
|
m_flags |= wxPG_PROP_SHOW_FULL_FILENAME;
|
||||||
|
m_flags &= ~wxPG_PROP_ACTIVE_BTN; // Property button enabled only in not read-only mode.
|
||||||
m_indFilter = -1;
|
m_indFilter = -1;
|
||||||
m_dlgStyle = 0;
|
|
||||||
m_wildcard = wxALL_FILES;
|
m_wildcard = wxALL_FILES;
|
||||||
|
|
||||||
SetValue(value);
|
SetValue(value);
|
||||||
@@ -2089,11 +2133,6 @@ wxString wxFileProperty::ValueToString( wxVariant& value,
|
|||||||
return filename.GetFullName();
|
return filename.GetFullName();
|
||||||
}
|
}
|
||||||
|
|
||||||
wxPGEditorDialogAdapter* wxFileProperty::GetEditorDialog() const
|
|
||||||
{
|
|
||||||
return new wxPGFileDialogAdapter();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wxFileProperty::StringToValue( wxVariant& variant, const wxString& text, int argFlags ) const
|
bool wxFileProperty::StringToValue( wxVariant& variant, const wxString& text, int argFlags ) const
|
||||||
{
|
{
|
||||||
wxFileName filename = variant.GetString();
|
wxFileName filename = variant.GetString();
|
||||||
@@ -2155,21 +2194,24 @@ bool wxFileProperty::DoSetAttribute( const wxString& name, wxVariant& value )
|
|||||||
m_dlgStyle = value.GetLong();
|
m_dlgStyle = value.GetLong();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return wxPGProperty::DoSetAttribute(name, value);
|
return wxEditorDialogProperty::DoSetAttribute(name, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxFileProperty::DisplayEditorDialog(wxPropertyGrid* propGrid, wxString& value)
|
bool wxFileProperty::DisplayEditorDialog(wxPropertyGrid* pg, wxVariant& value)
|
||||||
{
|
{
|
||||||
wxFileName filename = value;
|
wxASSERT_MSG(value.IsType(wxS("string")), "Function called for incompatible property");
|
||||||
|
|
||||||
|
wxString strVal = value.GetString();
|
||||||
|
wxFileName filename = strVal;
|
||||||
wxString path = filename.GetPath();
|
wxString path = filename.GetPath();
|
||||||
|
|
||||||
if ( path.empty() && !m_basePath.empty() )
|
if ( path.empty() && !m_basePath.empty() )
|
||||||
path = m_basePath;
|
path = m_basePath;
|
||||||
|
|
||||||
wxFileDialog dlg(propGrid->GetPanel(),
|
wxFileDialog dlg(pg->GetPanel(),
|
||||||
m_dlgTitle.empty() ? _("Choose a file") : m_dlgTitle,
|
m_dlgTitle.empty() ? _("Choose a file") : m_dlgTitle,
|
||||||
m_initialPath.empty() ? path : m_initialPath,
|
m_initialPath.empty() ? path : m_initialPath,
|
||||||
value,
|
strVal,
|
||||||
m_wildcard.empty() ? wxALL_FILES : m_wildcard,
|
m_wildcard.empty() ? wxALL_FILES : m_wildcard,
|
||||||
m_dlgStyle,
|
m_dlgStyle,
|
||||||
wxDefaultPosition);
|
wxDefaultPosition);
|
||||||
@@ -2186,48 +2228,18 @@ bool wxFileProperty::DisplayEditorDialog(wxPropertyGrid* propGrid, wxString& val
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
// wxPGLongStringDialogAdapter
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
|
|
||||||
bool wxPGLongStringDialogAdapter::DoShowDialog( wxPropertyGrid* propGrid, wxPGProperty* property )
|
|
||||||
{
|
|
||||||
wxString val1 = property->GetValueAsString(0);
|
|
||||||
wxString val_orig = val1;
|
|
||||||
|
|
||||||
wxString value;
|
|
||||||
if ( !property->HasFlag(wxPG_PROP_NO_ESCAPE) )
|
|
||||||
wxPropertyGrid::ExpandEscapeSequences(value, val1);
|
|
||||||
else
|
|
||||||
value = wxString(val1);
|
|
||||||
|
|
||||||
// Run editor dialog.
|
|
||||||
if ( wxLongStringProperty::DisplayEditorDialog(property, propGrid, value) )
|
|
||||||
{
|
|
||||||
if ( !property->HasFlag(wxPG_PROP_NO_ESCAPE) )
|
|
||||||
wxPropertyGrid::CreateEscapeSequences(val1,value);
|
|
||||||
else
|
|
||||||
val1 = value;
|
|
||||||
|
|
||||||
if ( val1 != val_orig )
|
|
||||||
{
|
|
||||||
SetValue( val1 );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
// wxLongStringProperty
|
// wxLongStringProperty
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
wxPG_IMPLEMENT_PROPERTY_CLASS(wxLongStringProperty,wxPGProperty,TextCtrlAndButton)
|
wxPG_IMPLEMENT_PROPERTY_CLASS(wxLongStringProperty,wxEditorDialogProperty,TextCtrlAndButton)
|
||||||
|
|
||||||
wxLongStringProperty::wxLongStringProperty( const wxString& label, const wxString& name,
|
wxLongStringProperty::wxLongStringProperty( const wxString& label, const wxString& name,
|
||||||
const wxString& value ) : wxPGProperty(label,name)
|
const wxString& value )
|
||||||
|
: wxEditorDialogProperty(label, name)
|
||||||
{
|
{
|
||||||
m_flags |= wxPG_PROP_ACTIVE_BTN; // Property button always enabled.
|
m_flags |= wxPG_PROP_ACTIVE_BTN; // Property button always enabled.
|
||||||
|
m_dlgStyle = wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxCLIP_CHILDREN;
|
||||||
SetValue(value);
|
SetValue(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2239,73 +2251,36 @@ wxString wxLongStringProperty::ValueToString( wxVariant& value,
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxLongStringProperty::OnEvent( wxPropertyGrid* propGrid, wxWindow* WXUNUSED(primary),
|
bool wxLongStringProperty::DisplayEditorDialog(wxPropertyGrid* pg, wxVariant& value)
|
||||||
wxEvent& event )
|
|
||||||
{
|
{
|
||||||
if ( propGrid->IsMainButtonEvent(event) )
|
wxASSERT_MSG(value.IsType(wxS("string")), "Function called for incompatible property");
|
||||||
{
|
|
||||||
// Update the value
|
|
||||||
wxVariant useValue = propGrid->GetUncommittedPropertyValue();
|
|
||||||
|
|
||||||
wxString val1 = useValue.GetString();
|
|
||||||
wxString val_orig = val1;
|
|
||||||
|
|
||||||
wxString value;
|
|
||||||
if ( !(m_flags & wxPG_PROP_NO_ESCAPE) )
|
|
||||||
wxPropertyGrid::ExpandEscapeSequences(value,val1);
|
|
||||||
else
|
|
||||||
value = wxString(val1);
|
|
||||||
|
|
||||||
// Run editor dialog.
|
|
||||||
if ( OnButtonClick(propGrid,value) )
|
|
||||||
{
|
|
||||||
if ( !(m_flags & wxPG_PROP_NO_ESCAPE) )
|
|
||||||
wxPropertyGrid::CreateEscapeSequences(val1,value);
|
|
||||||
else
|
|
||||||
val1 = value;
|
|
||||||
|
|
||||||
if ( val1 != val_orig )
|
|
||||||
{
|
|
||||||
SetValueInEvent( val1 );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wxLongStringProperty::OnButtonClick( wxPropertyGrid* propGrid, wxString& value )
|
|
||||||
{
|
|
||||||
return DisplayEditorDialog(this, propGrid, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wxLongStringProperty::DisplayEditorDialog( wxPGProperty* prop, wxPropertyGrid* propGrid, wxString& value )
|
|
||||||
|
|
||||||
{
|
|
||||||
// launch editor dialog
|
// launch editor dialog
|
||||||
wxDialog* dlg = new wxDialog(propGrid, wxID_ANY, prop->GetLabel(), wxDefaultPosition, wxDefaultSize,
|
wxDialog* dlg = new wxDialog(pg->GetPanel(), wxID_ANY,
|
||||||
wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxCLIP_CHILDREN);
|
m_dlgTitle.empty() ? GetLabel() : m_dlgTitle,
|
||||||
|
wxDefaultPosition, wxDefaultSize, m_dlgStyle);
|
||||||
|
|
||||||
dlg->SetFont(propGrid->GetFont()); // To allow entering chars of the same set as the propGrid
|
dlg->SetFont(pg->GetFont()); // To allow entering chars of the same set as the propGrid
|
||||||
|
|
||||||
// Multi-line text editor dialog.
|
// Multi-line text editor dialog.
|
||||||
const int spacing = wxPropertyGrid::IsSmallScreen()? 4 : 8;
|
const int spacing = wxPropertyGrid::IsSmallScreen()? 4 : 8;
|
||||||
wxBoxSizer* topsizer = new wxBoxSizer( wxVERTICAL );
|
wxBoxSizer* topsizer = new wxBoxSizer( wxVERTICAL );
|
||||||
wxBoxSizer* rowsizer = new wxBoxSizer( wxHORIZONTAL );
|
wxBoxSizer* rowsizer = new wxBoxSizer( wxHORIZONTAL );
|
||||||
long edStyle = wxTE_MULTILINE;
|
long edStyle = wxTE_MULTILINE;
|
||||||
if ( prop->HasFlag(wxPG_PROP_READONLY) )
|
if ( HasFlag(wxPG_PROP_READONLY) )
|
||||||
edStyle |= wxTE_READONLY;
|
edStyle |= wxTE_READONLY;
|
||||||
wxTextCtrl* ed = new wxTextCtrl(dlg,wxID_ANY,value,
|
wxString strVal;
|
||||||
|
wxPropertyGrid::ExpandEscapeSequences(strVal, value.GetString());
|
||||||
|
wxTextCtrl* ed = new wxTextCtrl(dlg,wxID_ANY,strVal,
|
||||||
wxDefaultPosition,wxDefaultSize,edStyle);
|
wxDefaultPosition,wxDefaultSize,edStyle);
|
||||||
int maxLen = prop->GetMaxLength();
|
if ( m_maxLen > 0 )
|
||||||
if ( maxLen > 0 )
|
ed->SetMaxLength(m_maxLen);
|
||||||
ed->SetMaxLength(maxLen);
|
|
||||||
|
|
||||||
rowsizer->Add(ed, wxSizerFlags(1).Expand().Border(wxALL, spacing));
|
rowsizer->Add(ed, wxSizerFlags(1).Expand().Border(wxALL, spacing));
|
||||||
topsizer->Add(rowsizer, wxSizerFlags(1).Expand());
|
topsizer->Add(rowsizer, wxSizerFlags(1).Expand());
|
||||||
|
|
||||||
long btnSizerFlags = wxCANCEL;
|
long btnSizerFlags = wxCANCEL;
|
||||||
if ( !prop->HasFlag(wxPG_PROP_READONLY) )
|
if ( !HasFlag(wxPG_PROP_READONLY) )
|
||||||
btnSizerFlags |= wxOK;
|
btnSizerFlags |= wxOK;
|
||||||
wxStdDialogButtonSizer* buttonSizer = dlg->CreateStdDialogButtonSizer(btnSizerFlags);
|
wxStdDialogButtonSizer* buttonSizer = dlg->CreateStdDialogButtonSizer(btnSizerFlags);
|
||||||
topsizer->Add(buttonSizer, wxSizerFlags(0).Right().Border(wxBOTTOM|wxRIGHT, spacing));
|
topsizer->Add(buttonSizer, wxSizerFlags(0).Right().Border(wxBOTTOM|wxRIGHT, spacing));
|
||||||
@@ -2316,15 +2291,17 @@ bool wxLongStringProperty::DisplayEditorDialog( wxPGProperty* prop, wxPropertyGr
|
|||||||
if ( !wxPropertyGrid::IsSmallScreen())
|
if ( !wxPropertyGrid::IsSmallScreen())
|
||||||
{
|
{
|
||||||
dlg->SetSize(400,300);
|
dlg->SetSize(400,300);
|
||||||
|
dlg->Move( pg->GetGoodEditorDialogPosition(this,dlg->GetSize()) );
|
||||||
dlg->Move( propGrid->GetGoodEditorDialogPosition(prop,dlg->GetSize()) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int res = dlg->ShowModal();
|
int res = dlg->ShowModal();
|
||||||
|
|
||||||
if ( res == wxID_OK )
|
if ( res == wxID_OK )
|
||||||
{
|
{
|
||||||
value = ed->GetValue();
|
strVal = ed->GetValue();
|
||||||
|
wxString strValEscaped;
|
||||||
|
wxPropertyGrid::CreateEscapeSequences(strValEscaped, strVal);
|
||||||
|
value = strValEscaped;
|
||||||
dlg->Destroy();
|
dlg->Destroy();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user