// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart
-// Licence: wxWindows licence
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma hdrstop
#endif
+#if wxUSE_PROPSHEET
+
#ifndef WX_PRECOMP
-#include "wx/wx.h"
#endif
+#include "wx/debug.h"
+#include "wx/prop.h"
+
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
-#if wxUSE_IOSTREAMH
-#if defined(__WXMSW__) && !defined(__GNUWIN32__)
-#include <strstrea.h>
-#else
-#include <strstream.h>
-#endif
-#else
-#include <strstream>
-#endif
-
-#include "wx/window.h"
-#include "wx/utils.h"
-#include "wx/list.h"
-#include "wx/prop.h"
IMPLEMENT_DYNAMIC_CLASS(wxPropertyValue, wxObject)
wxPropertyValue::wxPropertyValue(const wxPropertyValue& copyFrom)
{
+ m_value.string = (wxChar*) NULL;
m_modifiedFlag = FALSE;
Copy((wxPropertyValue& )copyFrom);
}
-wxPropertyValue::wxPropertyValue(const char *val)
+wxPropertyValue::wxPropertyValue(const wxChar *val)
{
m_modifiedFlag = FALSE;
m_type = wxPropertyValueString;
m_modifiedFlag = FALSE;
m_type = wxPropertyValueString;
- m_value.string = copystring((const char *)val);
+ m_value.string = copystring((const wxChar *)val);
m_clientData = NULL;
m_next = NULL;
m_last = NULL;
}
// Pointer versions: we have a pointer to the real C++ value.
-wxPropertyValue::wxPropertyValue(char **val)
+wxPropertyValue::wxPropertyValue(wxChar **val)
{
m_modifiedFlag = FALSE;
m_type = wxPropertyValueStringPtr;
wxNode *node = the_list->First();
while (node)
{
- char *s = (char *)node->Data();
+ wxChar *s = (wxChar *)node->Data();
Append(new wxPropertyValue(s));
node = node->Next();
}
void wxPropertyValue::Delete(wxPropertyValue *node)
{
wxPropertyValue *expr = GetFirst();
-
+
wxPropertyValue *previous = NULL;
while (expr && (expr != node))
{
{
if (previous)
previous->m_next = expr->m_next;
-
+
// If node was the first in the list,
// make the list point to the NEXT one.
if (GetFirst() == expr)
case wxPropertyValueStringPtr:
return new wxPropertyValue(m_value.stringPtr);
- case wxPropertyValueNull:
-#ifdef __X__
- cerr << "Should never get here!\n";
-#endif
+ case wxPropertyValueNull:
+ wxFAIL_MSG( wxT("Should never get here!\n" ) );
break;
}
return NULL;
void wxPropertyValue::Copy(wxPropertyValue& copyFrom)
{
+ if (m_type == wxPropertyValueString)
+ {
+ delete[] m_value.string ;
+ m_value.string = NULL;
+ }
m_type = copyFrom.Type();
switch (m_type)
case wxPropertyValueReal:
(*this) = copyFrom.RealValue();
return ;
-
+
case wxPropertyValueString:
(*this) = wxString(copyFrom.StringValue());
return ;
-
+
case wxPropertyValuebool:
(*this) = copyFrom.BoolValue();
return ;
return ;
case wxPropertyValueStringPtr:
{
- char** s = copyFrom.StringValuePtr();
+ wxChar** s = copyFrom.StringValuePtr();
+
+#if 0
+ // what is this? are you trying to assign a bool or a string? VA can't figure it out..
+#if defined(__VISAGECPP__) || defined( __VISUALC__ )
(*this) = s;
+#else
+ (*this) = s != 0;
+#endif
+#endif // if 0
+
+ (*this) = (bool)(s != 0);
+
return ;
}
-
+
case wxPropertyValueList:
{
m_value.first = NULL;
}
return;
}
- case wxPropertyValueNull:
-#ifdef __X__
- cerr << "Should never get here!\n";
-#endif
+ case wxPropertyValueNull:
+ wxFAIL_MSG( wxT("Should never get here!\n" ) );
break;
}
}
return i;
}
-void wxPropertyValue::WritePropertyClause(ostream& stream) // Write this expression as a top-level clause
+void wxPropertyValue::WritePropertyClause(wxString& stream) // Write this expression as a top-level clause
{
if (m_type != wxPropertyValueList)
return;
if (node)
{
node->WritePropertyType(stream);
- stream << "(";
+ stream.Append( wxT("(") );
node = node->m_next;
bool first = TRUE;
while (node)
{
if (!first)
- stream << " ";
+ stream.Append( wxT(" ") );
node->WritePropertyType(stream);
node = node->m_next;
- if (node) stream << ",\n";
+ if (node)
+ stream.Append( wxT(",\n" ) );
first = FALSE;
}
- stream << ").\n\n";
+ stream.Append( wxT(").\n\n") );
}
}
-void wxPropertyValue::WritePropertyType(ostream& stream) // Write as any other subexpression
+void wxPropertyValue::WritePropertyType(wxString& stream) // Write as any other subexpression
{
+ wxString tmp;
switch (m_type)
{
case wxPropertyValueInteger:
{
- stream << m_value.integer;
+ tmp.Printf( wxT("%ld"), m_value.integer );
+ stream.Append( tmp );
break;
}
case wxPropertyValueIntegerPtr:
{
- stream << *m_value.integerPtr;
+ tmp.Printf( wxT("%ld"), *m_value.integerPtr );
+ stream.Append( tmp );
break;
}
case wxPropertyValuebool:
{
if (m_value.integer)
- stream << "True";
+ stream.Append( wxT("True") );
else
- stream << "False";
+ stream.Append( wxT("False") );
break;
}
case wxPropertyValueboolPtr:
{
if (*m_value.integerPtr)
- stream << "True";
+ stream.Append( wxT("True") );
else
- stream << "False";
+ stream.Append( wxT("False") );
break;
}
case wxPropertyValueReal:
{
- float f = m_value.real;
- sprintf(wxBuffer, "%.6g", (double)f);
- stream << wxBuffer;
+ double d = m_value.real;
+ tmp.Printf( wxT("%.6g"), d );
+ stream.Append( tmp );
break;
}
case wxPropertyValueRealPtr:
{
- float f = *m_value.realPtr;
-/* Now the parser can cope with this.
- // Prevent printing in 'e' notation. Any better way?
- if (fabs(f) < 0.00001)
- f = 0.0;
-*/
- sprintf(wxBuffer, "%.6g", f);
- stream << wxBuffer;
+ double d = *m_value.realPtr;
+ tmp.Printf( wxT("%.6g"), d );
+ stream.Append( tmp );
break;
}
case wxPropertyValueString:
{
-// stream << "\"";
- int i;
- int len = strlen(m_value.string);
- for (i = 0; i < len; i++)
- {
- char ch = m_value.string[i];
-// if (ch == '"' || ch == '\\')
-// stream << "\\";
- stream << ch;
- }
-
-// stream << "\"";
+ stream.Append( m_value.string );
break;
}
case wxPropertyValueStringPtr:
{
+ wxFAIL_MSG( wxT("wxPropertyValue::WritePropertyType( wxPropertyValueStringPtr ) not implemented") );
+ /*
int i;
int len = strlen(*(m_value.stringPtr));
for (i = 0; i < len; i++)
char ch = *(m_value.stringPtr)[i];
}
+ */
break;
}
case wxPropertyValueList:
{
if (!m_value.first)
- stream << "[]";
+ stream.Append( wxT("[]") );
else
{
wxPropertyValue *expr = m_value.first;
- stream << "[";
+ stream.Append( wxT("[") );
while (expr)
{
expr->WritePropertyType(stream);
expr = expr->m_next;
- if (expr) stream << ", ";
+ if (expr)
+ stream.Append( wxT(", ") );
}
- stream << "]";
+ stream.Append( wxT("]") );
}
break;
}
wxString wxPropertyValue::GetStringRepresentation(void)
{
- char buf[500];
- buf[0] = 0;
-
- ostrstream str((char *)buf, (int)500, ios::out);
+ wxString str;
WritePropertyType(str);
- str << '\0';
- str.flush();
-
- wxString theString(buf);
- return theString;
+ return str;
}
void wxPropertyValue::operator=(const wxPropertyValue& val)
// void wxPropertyValue::operator=(const char *val)
void wxPropertyValue::operator=(const wxString& val1)
{
- const char *val = (const char *)val1;
+ const wxChar *val = (const wxChar *)val1;
m_modifiedFlag = TRUE;
+
+ wxPropertyValueType oldType = m_type;
+ if (oldType == wxPropertyValueString)
+ {
+ delete[] m_value.string ;
+ m_value.string = NULL;
+ }
+
if (m_type == wxPropertyValueNull)
m_type = wxPropertyValueString;
}
else if (m_type == wxPropertyValueStringPtr)
{
- if (*m_value.stringPtr)
- delete[] *m_value.stringPtr;
+ wxFAIL_MSG( wxT("Shouldn't try to assign a wxString reference to a char* pointer.") );
if (val)
*m_value.stringPtr = copystring(val);
else
*m_value.stringPtr = NULL;
}
-
+
m_clientData = NULL;
m_next = NULL;
m_last = NULL;
void wxPropertyValue::operator=(const long val)
{
+ wxPropertyValueType oldType = m_type;
+ if (oldType == wxPropertyValueString)
+ {
+ delete[] m_value.string ;
+ m_value.string = NULL;
+ }
+
m_modifiedFlag = TRUE;
if (m_type == wxPropertyValueNull)
m_type = wxPropertyValueInteger;
void wxPropertyValue::operator=(const bool val)
{
+ wxPropertyValueType oldType = m_type;
+ if (oldType == wxPropertyValueString)
+ {
+ delete[] m_value.string ;
+ m_value.string = NULL;
+ }
+
m_modifiedFlag = TRUE;
if (m_type == wxPropertyValueNull)
m_type = wxPropertyValuebool;
void wxPropertyValue::operator=(const float val)
{
+ wxPropertyValueType oldType = m_type;
+ if (oldType == wxPropertyValueString)
+ {
+ delete[] m_value.string ;
+ m_value.string = NULL;
+ }
+
m_modifiedFlag = TRUE;
if (m_type == wxPropertyValueNull)
m_type = wxPropertyValueReal;
m_next = NULL;
}
-void wxPropertyValue::operator=(const char **val)
+void wxPropertyValue::operator=(const wxChar **val)
{
+ wxPropertyValueType oldType = m_type;
+ if (oldType == wxPropertyValueString)
+ {
+ delete[] m_value.string ;
+ m_value.string = NULL;
+ }
+
m_modifiedFlag = TRUE;
m_type = wxPropertyValueStringPtr;
if (val)
- m_value.stringPtr = (char **)val;
+ m_value.stringPtr = (wxChar **)val;
else
m_value.stringPtr = NULL;
m_clientData = NULL;
return m_value.boolPtr;
}
-char *wxPropertyValue::StringValue(void) const {
+wxChar *wxPropertyValue::StringValue(void) const {
if (m_type == wxPropertyValueString)
return m_value.string;
else if (m_type == wxPropertyValueStringPtr)
else return NULL;
}
-char **wxPropertyValue::StringValuePtr(void) const
+wxChar **wxPropertyValue::StringValuePtr(void) const
{
return m_value.stringPtr;
}
/*
* A property (name plus value)
*/
-
+
IMPLEMENT_DYNAMIC_CLASS(wxProperty, wxObject)
wxProperty::wxProperty(void)
{
- m_propertyRole = (char *)NULL;
+ m_propertyRole = wxEmptyString;
m_propertyValidator = NULL;
m_propertyWindow = NULL;
m_enabled = TRUE;
}
wxProperty::wxProperty(wxString nm, const wxPropertyValue& val, wxString role, wxPropertyValidator *ed):
- m_name(nm), m_value(val), m_propertyRole(role)
+ m_value(val), m_name(nm), m_propertyRole(role)
{
m_propertyValidator = ed;
m_propertyWindow = NULL;
/*
* Base property view class
*/
-
+
IMPLEMENT_DYNAMIC_CLASS(wxPropertyView, wxEvtHandler)
wxPropertyView::wxPropertyView(long flags)
{
if (property->GetValidator())
return property->GetValidator();
-
+
wxNode *node = m_validatorRegistryList.First();
while (node)
{
IMPLEMENT_DYNAMIC_CLASS(wxPropertySheet, wxObject)
-wxPropertySheet::wxPropertySheet(void):m_properties(wxKEY_STRING)
+wxPropertySheet::wxPropertySheet(const wxString& name)
+:m_properties(wxKEY_STRING),m_name(name)
{
}
Clear();
}
-bool wxPropertySheet::Save( ostream& WXUNUSED(str) )
-{
- return FALSE;
-}
-
-bool wxPropertySheet::Load( ostream& WXUNUSED(str) )
-{
- return FALSE;
-}
-
void wxPropertySheet::UpdateAllViews( wxPropertyView *WXUNUSED(thisView) )
{
}
// Add a property
void wxPropertySheet::AddProperty(wxProperty *property)
{
- m_properties.Append((const char*) property->GetName(), property);
+ m_properties.Append((const wxChar*) property->GetName(), property);
}
// Get property by name
-wxProperty *wxPropertySheet::GetProperty(wxString name)
+wxProperty *wxPropertySheet::GetProperty(const wxString& name) const
{
- wxNode *node = m_properties.Find((const char*) name);
+ wxNode *node = m_properties.Find((const wxChar*) name);
if (!node)
return NULL;
else
return (wxProperty *)node->Data();
}
+bool wxPropertySheet::SetProperty(const wxString& name, const wxPropertyValue& value)
+{
+ wxProperty* prop = GetProperty(name);
+ if(prop){
+ prop->SetValue(value);
+ return TRUE;
+ }else{
+ return FALSE;
+ }
+}
+
+void wxPropertySheet::RemoveProperty(const wxString& name)
+{
+ wxNode *node = m_properties.Find(name);
+ if(node)
+ {
+ wxProperty *prop = (wxProperty *)node->Data();
+ delete prop;
+ m_properties.DeleteNode(node);
+ }
+}
+
+bool wxPropertySheet::HasProperty(const wxString& name) const
+{
+ return (GetProperty(name)?TRUE:FALSE);
+}
+
// Clear all properties
void wxPropertySheet::Clear(void)
{
wxProperty *prop = (wxProperty *)node->Data();
prop->GetValue().SetModified(flag);
node = node->Next();
- }
+ }
}
/*
void wxPropertyValidatorRegistry::RegisterValidator(const wxString& typeName, wxPropertyValidator *validator)
{
- Put((const char*) typeName, validator);
+ Put((const wxChar*) typeName, validator);
}
wxPropertyValidator *wxPropertyValidatorRegistry::GetValidator(const wxString& typeName)
{
- return (wxPropertyValidator *)Get((const char*) typeName);
+ return (wxPropertyValidator *)Get((const wxChar*) typeName);
}
void wxPropertyValidatorRegistry::ClearRegistry(void)
{
BeginFind();
wxNode *node;
- while (node = Next())
+ while ((node = Next()) != NULL)
{
delete (wxPropertyValidator *)node->Data();
}
wxPropertyValidator::~wxPropertyValidator(void)
{}
-bool wxPropertyValidator::StringToFloat (char *s, float *number) {
- double num;
- bool ok = StringToDouble (s, &num);
- *number = (float) num;
- return ok;
+bool wxPropertyValidator::StringToFloat (wxChar *s, float *number) {
+ double num;
+ bool ok = StringToDouble (s, &num);
+ *number = (float) num;
+ return ok;
}
-bool wxPropertyValidator::StringToDouble (char *s, double *number) {
+bool wxPropertyValidator::StringToDouble (wxChar *s, double *number) {
bool ok = TRUE;
- char *value_ptr;
- *number = strtod (s, &value_ptr);
+ wxChar *value_ptr;
+ *number = wxStrtod (s, &value_ptr);
if (value_ptr) {
- int len = strlen (value_ptr);
- for (int i = 0; i < len; i++) {
- ok = (isspace (value_ptr[i]) != 0);
- if (!ok) return FALSE;
- }
+ int len = wxStrlen (value_ptr);
+ for (int i = 0; i < len; i++) {
+ ok = (wxIsspace (value_ptr[i]) != 0);
+ if (!ok) return FALSE;
+ }
}
return ok;
}
-bool wxPropertyValidator::StringToInt (char *s, int *number) {
- long num;
- bool ok = StringToLong (s, &num);
- *number = (int) num;
- return ok;
+bool wxPropertyValidator::StringToInt (wxChar *s, int *number) {
+ long num;
+ bool ok = StringToLong (s, &num);
+ *number = (int) num;
+ return ok;
}
-bool wxPropertyValidator::StringToLong (char *s, long *number) {
+bool wxPropertyValidator::StringToLong (wxChar *s, long *number) {
bool ok = TRUE;
- char *value_ptr;
- *number = strtol (s, &value_ptr, 10);
+ wxChar *value_ptr;
+ *number = wxStrtol (s, &value_ptr, 10);
if (value_ptr) {
- int len = strlen (value_ptr);
- for (int i = 0; i < len; i++) {
- ok = (isspace (value_ptr[i]) != 0);
- if (!ok) return FALSE;
- }
+ int len = wxStrlen (value_ptr);
+ for (int i = 0; i < len; i++) {
+ ok = (wxIsspace (value_ptr[i]) != 0);
+ if (!ok) return FALSE;
+ }
}
return ok;
}
-char *wxPropertyValidator::FloatToString (float number) {
- static char buf[20];
- sprintf (buf, "%.6g", number);
- return buf;
+wxChar *wxPropertyValidator::FloatToString (float number) {
+ static wxChar buf[20];
+ wxSprintf (buf, wxT("%.6g"), number);
+ return buf;
}
-char *wxPropertyValidator::DoubleToString (double number) {
- static char buf[20];
- sprintf (buf, "%.6g", number);
- return buf;
+wxChar *wxPropertyValidator::DoubleToString (double number) {
+ static wxChar buf[20];
+ wxSprintf (buf, wxT("%.6g"), number);
+ return buf;
}
-char *wxPropertyValidator::IntToString (int number) {
- return ::IntToString (number);
+wxChar *wxPropertyValidator::IntToString (int number) {
+ return ::IntToString (number);
}
-char *wxPropertyValidator::LongToString (long number) {
- return ::LongToString (number);
+wxChar *wxPropertyValidator::LongToString (long number) {
+ return ::LongToString (number);
}
-
+#endif // wxUSE_PROPSHEET