📄 propgrid.cpp
字号:
m_value = 0;
if ( labels )
{
m_constants = wxPropertyGrid::AddConstantsArray(labels,values,itemcount);
wxASSERT ( GetItemCount() );
DoSetValue( value );
//Init ( value );
}
else
{
m_constants = &wxPGGlobalVars->m_emptyConstants;
}
}
wxFlagsPropertyClass::wxFlagsPropertyClass ( const wxString& label, const wxString& name,
wxPGConstants& constants, long value )
: wxPGPropertyWithChildren(label,name)
{
m_constants = wxPropertyGrid::AddConstantsArray(constants);
wxASSERT ( GetItemCount() );
//Init ( value );
DoSetValue( value );
}
wxFlagsPropertyClass::~wxFlagsPropertyClass ()
{
wxPGUnRefChoices(m_constants);
}
void wxFlagsPropertyClass::DoSetValue ( wxPGVariant value )
{
wxASSERT_MSG( GetItemCount(),
wxT("wxFlagsPropertyClass::DoSetValue must not be called with zero items"));
long val = value.GetLong();
long full_flags = 0;
// normalize the value (i.e. remove extra flags)
unsigned int i;
const wxArrayInt& values = GetValues();
if ( values.GetCount() )
{
for ( i = 0; i < GetItemCount(); i++ )
full_flags |= values[i];
}
else
{
for ( i = 0; i < GetItemCount(); i++ )
full_flags |= (1<<i);
}
val &= full_flags;
m_value = val;
// Need to (re)init now?
/*if ( m_constants != m_oldConstants ||
GetCount() != GetItemCount() )
Init();
else*/
if ( !GetCount() )
Init();
RefreshChildren();
}
wxPGVariant wxFlagsPropertyClass::DoGetValue () const
{
return wxPGVariant((long)m_value);
}
wxString wxFlagsPropertyClass::GetValueAsString ( int ) const
{
wxString text;
long flags = m_value;
unsigned int i;
const wxArrayInt& values = GetValues();
if ( values.GetCount() )
{
for ( i = 0; i < GetItemCount(); i++ )
{
if ( flags & values[i] )
{
text += GetLabel(i);
text += wxT(", ");
}
}
}
else
{
for ( i = 0; i < GetItemCount(); i++ )
if ( flags & (1<<i) )
{
text += GetLabel(i);
text += wxT(", ");
}
}
// remove last comma
if ( text.Len() > 1 )
text.Truncate ( text.Len() - 2 );
return text;
}
// Translate string into flag tokens
bool wxFlagsPropertyClass::SetValueFromString ( const wxString& text, int )
{
// Need to (re)init now?
//if ( GetCount() != GetItemCount() )
// Init(0);
long new_flags = 0;
// semicolons are no longer valid delimeters
WX_PG_TOKENIZER1_BEGIN(text,wxT(','))
if ( token.length() )
{
// Determine which one it is
long bit = IdToBit( token );
if ( bit != -1 )
{
// Changed?
new_flags |= bit;
}
else
{
// Unknown identifier
wxString s;
s.Printf ( wxT("! %s: Unknown flag identifier \"%s\""), m_label.c_str(), token.c_str() );
ShowError(s);
}
}
WX_PG_TOKENIZER1_END()
//wxLogDebug ( wxT("new_flags = 0x%X, old_flags = 0x%X"),new_flags,m_value);
if ( new_flags != m_value )
{
// Set child modified states
if ( GetItemCount() )
{
unsigned int i;
const wxArrayInt& values = GetValues();
if ( values.GetCount() )
for ( i = 0; i < GetItemCount(); i++ )
{
long flag = values[i];
if ( (new_flags & flag) != (m_value & flag) )
((wxPGProperty*)m_children.Item( i ))->SetFlag ( wxPG_PROP_MODIFIED );
}
else
for ( i = 0; i < GetItemCount(); i++ )
{
long flag = (1<<i);
if ( (new_flags & flag) != (m_value & flag) )
((wxPGProperty*)m_children.Item( i ))->SetFlag ( wxPG_PROP_MODIFIED );
}
}
DoSetValue ( new_flags );
return TRUE;
}
return FALSE;
}
// Converts string id to a relevant bit.
long wxFlagsPropertyClass::IdToBit ( const wxString& id ) const
{
unsigned int i;
const wxArrayInt& values = GetValues();
for ( i = 0; i < GetItemCount(); i++ )
{
const wxChar* ptr = GetLabel(i);
if ( id == ptr
/*wxStrncmp(id,ptr,id_len) == 0 &&
ptr[id_len] == 0*/
)
{
//*pindex = i;
if ( values.GetCount() )
return values[i];
return (1<<i);
}
}
return -1;
}
void wxFlagsPropertyClass::RefreshChildren()
{
if ( !GetCount() ) return;
const wxArrayInt& values = GetValues();
long flags = m_value;
unsigned int i;
if ( values.GetCount() )
for ( i = 0; i < GetItemCount(); i++ )
Item(i)->DoSetValue ( ((long)((flags & values[i])?TRUE:FALSE)) );
else
for ( i = 0; i < GetItemCount(); i++ )
Item(i)->DoSetValue ( ((long)((flags & (1<<i))?TRUE:FALSE)) );
}
void wxFlagsPropertyClass::ChildChanged ( wxPGProperty* p )
{
wxASSERT ( this == p->GetParent() );
const wxArrayInt& values = GetValues();
long val = p->DoGetValue().GetRawLong(); // bypass type checking
unsigned int iip = p->GetIndexInParent();
unsigned long vi = (1<<iip);
if ( values.GetCount() ) vi = values[iip];
if ( val )
m_value |= vi;
else
m_value &= ~(vi);
}
int wxFlagsPropertyClass::GetChoiceInfo ( wxPGChoiceInfo* choiceinfo )
{
if ( choiceinfo )
choiceinfo->m_constants = &m_constants;
return -1;
}
// -----------------------------------------------------------------------
// wxDirProperty
// -----------------------------------------------------------------------
WX_PG_IMPLEMENT_STRING_PROPERTY(wxDirProperty)
bool wxDirPropertyClass::OnButtonClick ( wxPropertyGrid* propgrid, wxString& value )
{
wxSize dlg_sz(300,400);
wxDirDialog dlg(propgrid,_("Choose a directory:"),
value,0,
propgrid->GetGoodEditorDialogPosition (this,dlg_sz),dlg_sz );
/*#if defined(__WXGTK__) && !defined(__WXGTK20__)
dlg.SetFont(*wxNORMAL_FONT);
#endif*/
if ( dlg.ShowModal() == wxID_OK )
{
value = dlg.GetPath();
return TRUE;
}
return FALSE;
}
// -----------------------------------------------------------------------
// wxFileProperty
// -----------------------------------------------------------------------
// Class body is in propdev.h.
WX_PG_IMPLEMENT_PROPERTY_CLASS(wxFileProperty,wxString,const wxString&,TextCtrlAndButton)
wxFilePropertyClass::wxFilePropertyClass ( const wxString& label, const wxString& name,
const wxString& value ) : wxPGProperty(label,name)
{
m_wildcard = _("All files (*.*)|*.*");
m_flags |= wxPG_PROP_SHOW_FULL_FILENAME;
m_indFilter = -1;
DoSetValue(value);
}
wxFilePropertyClass::~wxFilePropertyClass () {}
void wxFilePropertyClass::DoSetValue ( wxPGVariant value )
{
const wxString& str = wxPGVariantToString(value);
m_filename = str;
m_fnstr = str;
wxPG_SetVariantValue(str);
// Find index for extension.
if ( m_indFilter < 0 && m_fnstr.length() )
{
wxChar a = wxT(' ');
const wxChar* p = m_wildcard.c_str();
wxString ext = m_filename.GetExt();
int curind = 0;
do
{
while ( a && a != '|' ) { a = *p; p++; }
if ( !a ) break;
a = *p;
p++;
if ( !a ) break;
a = *p;
p++;
const wxChar* ext_begin = p;
if ( *ext_begin == wxT('*') )
{
m_indFilter = curind;
break;
}
while ( a && a != '|' ) { a = *p; p++; }
a = wxT(' ');
int count = p-ext_begin-1;
if ( count > 0 )
{
wxASSERT ( count < 32 );
wxString found_ext = m_wildcard.Mid(ext_begin-m_wildcard.c_str(),count);
if ( ext.CmpNoCase(found_ext) == 0 )
{
m_indFilter = curind;
break;
}
}
curind++;
} while ( a );
}
}
wxPGVariant wxFilePropertyClass::DoGetValue () const
{
return wxPGVariant(m_fnstr);
}
wxString wxFilePropertyClass::GetValueAsString ( int arg_flags ) const
{
if ( (m_flags & wxPG_PROP_SHOW_FULL_FILENAME) || (arg_flags & wxPG_FULL_VALUE) )
return m_filename.GetFullPath();
else
return m_filename.GetFullName();
}
bool wxFilePropertyClass::OnEvent ( wxPropertyGrid* propgrid, wxPGCtrlClass* primary,
wxEvent& event )
{
if ( event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED )
{
// If text in control is changed, then update it to value.
PrepareValueForDialogEditing(propgrid);
wxString path;
path = m_filename.GetPath();
wxFileDialog dlg(propgrid,_("Choose a file"),m_filename.GetPath(),
wxEmptyString, m_wildcard, 0, wxDefaultPosition );
if ( m_indFilter >= 0 )
dlg.SetFilterIndex( m_indFilter );
if ( dlg.ShowModal() == wxID_OK )
{
m_indFilter = dlg.GetFilterIndex();
wxString path = dlg.GetPath();
SetValueFromString ( path, wxPG_FULL_VALUE );
if ( primary )
GetEditorClass()->SetControlStringValue( primary, GetValueAsString(0) );
return TRUE;
}
}
return FALSE;
}
bool wxFilePropertyClass::SetValueFromString ( const wxString& text, int arg_flags )
{
if ( (m_flags & wxPG_PROP_SHOW_FULL_FILENAME) || (arg_flags & wxPG_FULL_VALUE) )
{
if ( m_filename != text )
{
return StdValidationProcedure( text );
}
}
else
{
if ( m_filename.GetFullName() != text )
{
wxFileName fn = m_filename;
fn.SetFullName(text);
wxString val = fn.GetFullPath();
return StdValidationProcedure( val );
}
}
return FALSE;
}
void wxFilePropertyClass::SetAttribute ( int id, wxVariant value )
{
if ( id == wxPG_FILE_SHOW_FULL_PATH )
{
if ( value.GetLong() )
m_flags |= wxPG_PROP_SHOW_FULL_FILENAME;
else
m_flags &= ~(wxPG_PROP_SHOW_FULL_FILENAME);
}
else if ( id == wxPG_FILE_WILDCARD )
{
m_wildcard = value.GetString();
}
}
// -----------------------------------------------------------------------
// wxLongStringProperty
// -----------------------------------------------------------------------
// Class body is in propdev.h.
WX_PG_IMPLEMENT_PROPERTY_CLASS(wxLongStringProperty,wxString,const wxString&,TextCtrlAndButton)
wxLongStringPropertyClass::wxLongStringPropertyClass ( const wxString& label, const wxString& name,
const wxString& value ) : wxPGProperty(label,name)
{
DoSetValue(value);
}
wxLongStringPropertyClass::~wxLongStringPropertyClass () {}
void wxLongStringPropertyClass::DoSetValue ( wxPGVariant value )
{
m_value = wxPGVariantToString(value);
wxPG_SetVar
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -