📄 props.cpp
字号:
// Special constructor for caching choices (used by derived class)
wxEditEnumPropertyClass( const wxString& label, const wxString& name, const wxChar** labels,
const long* values, wxPGChoices* choicesCache, const wxString& value );
WX_PG_DECLARE_BASIC_TYPE_METHODS()
int GetChoiceInfo( wxPGChoiceInfo* choiceinfo );
virtual ~wxEditEnumPropertyClass ();
protected:
wxString m_value_wxString;
};
wxPGProperty* wxEditEnumProperty( const wxString& label, const wxString& name, const wxChar** labels,
const long* values, const wxString& value )
{
return new wxEditEnumPropertyClass(label,name,labels,values,value);
}
wxPGProperty* wxEditEnumProperty( const wxString& label, const wxString& name,
const wxArrayString& labels, const wxArrayInt& values, const wxString& value )
{
return new wxEditEnumPropertyClass(label,name,labels,values,value);
}
wxPGProperty* wxEditEnumProperty( const wxString& label, const wxString& name,
const wxArrayString& labels, const wxString& value )
{
return new wxEditEnumPropertyClass(label,name,labels,*((const wxArrayInt*)NULL),value);
}
wxPGProperty* wxEditEnumProperty( const wxString& label, const wxString& name,
wxPGChoices& choices, const wxString& value )
{
return new wxEditEnumPropertyClass(label,name,choices,value);
}
WX_PG_IMPLEMENT_CLASSINFO(wxEditEnumProperty,wxBasePropertyClass)
WX_PG_IMPLEMENT_PROPERTY_CLASS_PLAIN(wxEditEnumProperty,wxString,ComboBox)
wxEditEnumPropertyClass::wxEditEnumPropertyClass( const wxString& label, const wxString& name, const wxChar** labels,
const long* values, const wxString& value )
: wxEnumPropertyClass(label,name,labels,values,0)
{
wxEditEnumPropertyClass::DoSetValue( value );
}
wxEditEnumPropertyClass::wxEditEnumPropertyClass( const wxString& label, const wxString& name, const wxChar** labels,
const long* values, wxPGChoices* choicesCache, const wxString& value )
: wxEnumPropertyClass(label,name,labels,values,choicesCache,0)
{
wxEditEnumPropertyClass::DoSetValue( value );
}
wxEditEnumPropertyClass::wxEditEnumPropertyClass( const wxString& label, const wxString& name,
const wxArrayString& labels, const wxArrayInt& values, const wxString& value )
: wxEnumPropertyClass(label,name,labels,values,0)
{
wxEditEnumPropertyClass::DoSetValue( value );
}
wxEditEnumPropertyClass::wxEditEnumPropertyClass( const wxString& label, const wxString& name,
wxPGChoices& choices, const wxString& value )
: wxEnumPropertyClass(label,name,choices,0)
{
wxEditEnumPropertyClass::DoSetValue( value );
}
wxEditEnumPropertyClass::~wxEditEnumPropertyClass()
{
}
void wxEditEnumPropertyClass::DoSetValue( wxPGVariant value )
{
m_value_wxString = wxPGVariantToString(value);
}
wxPGVariant wxEditEnumPropertyClass::DoGetValue() const
{
return wxPGVariant(m_value_wxString);
}
wxString wxEditEnumPropertyClass::GetValueAsString( int ) const
{
return m_value_wxString;
}
bool wxEditEnumPropertyClass::SetValueFromString( const wxString& text, int )
{
if ( m_value_wxString != text )
return StdValidationProcedure(text);
return false;
}
int wxEditEnumPropertyClass::GetChoiceInfo( wxPGChoiceInfo* choiceinfo )
{
wxEnumPropertyClass::GetChoiceInfo(choiceinfo);
// However, select index using the current value
wxPGChoices& choices = m_choices;
const wxString& value = m_value_wxString;
int index = -1;
unsigned int k;
for ( k=0; k<choices.GetCount(); k++ )
{
if ( choices.GetLabel(k) == value )
{
index = (int) k;
break;
}
}
return index;
}
// -----------------------------------------------------------------------
// wxFlagsProperty
// -----------------------------------------------------------------------
// Class body is in propdev.h.
wxPGProperty* wxFlagsProperty( const wxString& label, const wxString& name, const wxChar** labels,
const long* values, int value )
{
return new wxFlagsPropertyClass(label,name,labels,values,value);
}
wxPGProperty* wxFlagsProperty( const wxString& label, const wxString& name,
const wxArrayString& labels, const wxArrayInt& values, int value )
{
return new wxFlagsPropertyClass(label,name,labels,values,value);
}
wxPGProperty* wxFlagsProperty( const wxString& label, const wxString& name,
const wxArrayString& labels, int value )
{
return new wxFlagsPropertyClass(label,name,labels,*((const wxArrayInt*)NULL),value);
}
wxPGProperty* wxFlagsProperty( const wxString& label, const wxString& name,
wxPGChoices& constants, int value )
{
return new wxFlagsPropertyClass(label,name,constants,value);
}
WX_PG_IMPLEMENT_CLASSINFO(wxFlagsProperty,wxBaseParentPropertyClass)
WX_PG_IMPLEMENT_PROPERTY_CLASS_PLAIN(wxFlagsProperty,long,TextCtrl)
void wxFlagsPropertyClass::Init()
{
long value = m_value;
//
// Generate children
//
unsigned int i;
unsigned int prevChildCount = m_children.GetCount();
int oldSel = -1;
if ( prevChildCount )
{
wxPropertyGridState* state = GetParentState();
// State safety check (it may be NULL in immediate parent)
//wxPGPropertyWithChildren* parent = GetParent();
//while ( !state ) { wxASSERT(parent); state = parent->GetParentState(); parent = parent->GetParent(); }
wxASSERT( state );
if ( state )
{
wxPGProperty* selected = state->GetSelection();
if ( selected )
{
if ( selected->GetParent() == this )
oldSel = selected->GetArrIndex();
else if ( selected == this )
oldSel = -2;
}
}
state->ClearSelection();
}
// Delete old children
for ( i=0; i<prevChildCount; i++ )
delete ( (wxPGProperty*) m_children[i] );
m_children.Empty();
if ( m_choices.IsOk() )
{
const wxArrayInt& values = GetValues();
for ( i=0; i<GetItemCount(); i++ )
{
bool child_val;
if ( values.GetCount() )
child_val = ( value & values[i] )?TRUE:FALSE;
else
child_val = ( value & (1<<i) )?TRUE:FALSE;
wxPGProperty* bool_prop;
#if wxUSE_INTL
if ( wxPGGlobalVars->m_autoGetTranslation )
{
bool_prop = wxBoolProperty( ::wxGetTranslation ( GetLabel(i) ), wxEmptyString, child_val );
}
else
#endif
{
bool_prop = wxBoolProperty( GetLabel(i), wxEmptyString, child_val );
}
AddChild(bool_prop);
}
m_oldChoicesData = m_choices.GetDataPtr();
}
if ( prevChildCount )
SubPropsChanged(oldSel);
}
wxFlagsPropertyClass::wxFlagsPropertyClass ( const wxString& label, const wxString& name,
const wxChar** labels, const long* values, long value ) : wxPGPropertyWithChildren(label,name)
{
m_value = 0;
m_oldChoicesData = (wxPGChoicesData*) NULL;
if ( labels )
{
m_choices.Set(labels,values);
wxASSERT ( GetItemCount() );
DoSetValue( value );
}
}
wxFlagsPropertyClass::wxFlagsPropertyClass ( const wxString& label, const wxString& name,
const wxArrayString& labels, const wxArrayInt& values, int value )
: wxPGPropertyWithChildren(label,name)
{
m_value = 0;
m_oldChoicesData = (wxPGChoicesData*) NULL;
if ( &labels )
{
m_choices.Set(labels,values);
wxASSERT( GetItemCount() );
DoSetValue( (long)value );
}
}
wxFlagsPropertyClass::wxFlagsPropertyClass ( const wxString& label, const wxString& name,
wxPGChoices& choices, long value )
: wxPGPropertyWithChildren(label,name)
{
m_oldChoicesData = (wxPGChoicesData*) NULL;
m_choices.Assign(choices);
wxASSERT ( GetItemCount() );
DoSetValue( value );
}
wxFlagsPropertyClass::~wxFlagsPropertyClass ()
{
//wxPGUnRefChoices(m_choices);
}
void wxFlagsPropertyClass::DoSetValue ( wxPGVariant value )
{
if ( !m_choices.IsOk() || !GetItemCount() )
{
m_value = 0;
return;
}
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 ( GetCount() != GetItemCount() ||
m_choices.GetDataPtr() != m_oldChoicesData )
{
Init();
}
RefreshChildren();
}
wxPGVariant wxFlagsPropertyClass::DoGetValue () const
{
return wxPGVariant((long)m_value);
}
wxString wxFlagsPropertyClass::GetValueAsString ( int ) const
{
wxString text;
if ( !m_choices.IsOk() )
return 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 )
{
if ( !m_choices.IsOk() || !GetItemCount() )
return false;
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()
if ( new_flags != m_value )
{
// Set child modified states
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 ( !m_choices.IsOk() || !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() );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -