From 30b5fc118f6fa8bad8cd3692ca42c164aa5007f9 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Fri, 21 Jan 2000 17:01:44 +0000 Subject: [PATCH 1/1] Misc. Dialog Editor/resource bugs fixed git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5570 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/html/faqgen.htm | 6 +-- docs/html/faqmac.htm | 2 +- src/common/resource.cpp | 56 ++++++++++++----------- src/generic/prop.cpp | 45 ++++++++++++++++++- utils/dialoged/src/reseditr.cpp | 67 ++++++++++++++-------------- utils/dialoged/src/reseditr.h | 5 ++- utils/dialoged/src/winprop.cpp | 78 ++++++++++++++++++++++++++------- utils/dialoged/src/winprop.h | 1 + 8 files changed, 177 insertions(+), 83 deletions(-) diff --git a/docs/html/faqgen.htm b/docs/html/faqgen.htm index 2cf955358a..69ab062525 100644 --- a/docs/html/faqgen.htm +++ b/docs/html/faqgen.htm @@ -88,7 +88,7 @@ applications.

How can I prepare for wxWindows 2?

To make porting to wxWindows 2 easier in the future, take a look at some -tips for writing existing code in a 2-compatible way.

+tips for writing existing code in a 2-compatible way.

How much has the API changed since 1.xx?

@@ -224,8 +224,8 @@ from Java, and the level of interest in wxWindows is as high as ever.

How can I help the project?

-Please check out the Backroom pages, -in particular the suggested projects, and +Please check out the Backroom pages, +in particular the suggested projects, and mail Julian Smart or the developers' mailing list with your own suggestions.

diff --git a/docs/html/faqmac.htm b/docs/html/faqmac.htm index 182e458cbc..c5ad70a4b3 100644 --- a/docs/html/faqmac.htm +++ b/docs/html/faqmac.htm @@ -25,7 +25,7 @@ See also top-level FAQ page.

When is wxMac 2 due to be released?

-There is a preview available. +There is a preview available. A beta release can be expected by early Q2 1999. The author of this port is Stefan Csomor (csomor@advancedconcepts.ch).

diff --git a/src/common/resource.cpp b/src/common/resource.cpp index c32447bfa7..b0945819f7 100644 --- a/src/common/resource.cpp +++ b/src/common/resource.cpp @@ -537,7 +537,18 @@ wxControl *wxResourceTable::CreateItem(wxWindow *parent, const wxItemResource* c else { if (control && childResource->GetFont().Ok()) + { control->SetFont(childResource->GetFont()); + +#ifdef __WXMSW__ + // Force the layout algorithm since the size changes the layout + if (control->IsKindOf(CLASSINFO(wxRadioBox))) + { + wxSize sz = control->GetSize(); + control->SetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH|wxSIZE_AUTO_HEIGHT); + } +#endif + } } return control; } @@ -962,12 +973,10 @@ wxItemResource *wxResourceInterpretControl(wxResourceTable& table, wxExpr *expr) if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList) { - // controlItem->SetLabelFont(wxResourceInterpretFontSpec(expr->Nth(count))); - // Do nothing - count ++; - - if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList) - controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count))); + // Skip past the obsolete label font spec if there are two consecutive specs + if (expr->Nth(count+1) && expr->Nth(count+1)->Type() == PrologList) + count ++; + controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count))); } } } @@ -1067,10 +1076,10 @@ wxItemResource *wxResourceInterpretControl(wxResourceTable& table, wxExpr *expr) } if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList) { - // controlItem->SetLabelFont(wxResourceInterpretFontSpec(expr->Nth(count))); - count ++; - if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList) - controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count))); + // Skip past the obsolete label font spec if there are two consecutive specs + if (expr->Nth(count+1) && expr->Nth(count+1)->Type() == PrologList) + count ++; + controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count))); } } } @@ -1093,11 +1102,10 @@ wxItemResource *wxResourceInterpretControl(wxResourceTable& table, wxExpr *expr) if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList) { - // controlItem->SetLabelFont(wxResourceInterpretFontSpec(expr->Nth(count))); - count ++; - - if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList) - controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count))); + // Skip past the obsolete label font spec if there are two consecutive specs + if (expr->Nth(count+1) && expr->Nth(count+1)->Type() == PrologList) + count ++; + controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count))); } } } @@ -1129,11 +1137,10 @@ wxItemResource *wxResourceInterpretControl(wxResourceTable& table, wxExpr *expr) if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList) { - // controlItem->SetLabelFont(wxResourceInterpretFontSpec(expr->Nth(count))); - count ++; - - if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList) - controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count))); + // Skip past the obsolete label font spec if there are two consecutive specs + if (expr->Nth(count+1) && expr->Nth(count+1)->Type() == PrologList) + count ++; + controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count))); } } } @@ -1167,11 +1174,10 @@ wxItemResource *wxResourceInterpretControl(wxResourceTable& table, wxExpr *expr) if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList) { - // controlItem->SetLabelFont(wxResourceInterpretFontSpec(expr->Nth(count))); - count ++; - - if (expr->Nth(count) && expr->Nth(count)->Type() == PrologList) - controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count))); + // Skip past the obsolete label font spec if there are two consecutive specs + if (expr->Nth(count+1) && expr->Nth(count+1)->Type() == PrologList) + count ++; + controlItem->SetFont(wxResourceInterpretFontSpec(expr->Nth(count))); } } } diff --git a/src/generic/prop.cpp b/src/generic/prop.cpp index 25fc02ce07..12d9626903 100644 --- a/src/generic/prop.cpp +++ b/src/generic/prop.cpp @@ -47,6 +47,7 @@ wxPropertyValue::wxPropertyValue(void) wxPropertyValue::wxPropertyValue(const wxPropertyValue& copyFrom) { + m_value.string = (wxChar*) NULL; m_modifiedFlag = FALSE; Copy((wxPropertyValue& )copyFrom); } @@ -336,6 +337,11 @@ wxPropertyValue *wxPropertyValue::NewCopy(void) const void wxPropertyValue::Copy(wxPropertyValue& copyFrom) { + if (m_type == wxPropertyValueString) + { + delete[] m_value.string ; + m_value.string = NULL; + } m_type = copyFrom.Type(); switch (m_type) @@ -587,6 +593,14 @@ void wxPropertyValue::operator=(const wxString& 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; @@ -599,8 +613,7 @@ void wxPropertyValue::operator=(const wxString& val1) } else if (m_type == wxPropertyValueStringPtr) { - if (*m_value.stringPtr) - delete[] *m_value.stringPtr; + wxFAIL_MSG( "Shouldn't try to assign a wxString reference to a char* pointer."); if (val) *m_value.stringPtr = copystring(val); else @@ -615,6 +628,13 @@ void wxPropertyValue::operator=(const wxString& val1) 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; @@ -634,6 +654,13 @@ void wxPropertyValue::operator=(const long val) 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; @@ -649,6 +676,13 @@ void wxPropertyValue::operator=(const bool val) 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; @@ -668,6 +702,13 @@ void wxPropertyValue::operator=(const float 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; diff --git a/utils/dialoged/src/reseditr.cpp b/utils/dialoged/src/reseditr.cpp index e6a647f698..14166498d4 100644 --- a/utils/dialoged/src/reseditr.cpp +++ b/utils/dialoged/src/reseditr.cpp @@ -486,6 +486,8 @@ bool wxResourceManager::New(bool loadFromFile, const wxString& filename) bool wxResourceManager::Clear(bool WXUNUSED(deleteWindows), bool force) { + wxPropertyInfo::CloseWindow(); + if (!force && Modified()) { int ans = wxMessageBox("Save modified resource file?", "Dialog Editor", wxYES_NO | wxCANCEL); @@ -927,6 +929,8 @@ bool wxResourceManager::EditSelectedResource() bool wxResourceManager::Edit(wxItemResource *res) { + wxPropertyInfo::CloseWindow(); + ClearCurrentDialog(); wxString resType(res->GetType()); @@ -966,6 +970,8 @@ bool wxResourceManager::Edit(wxItemResource *res) bool wxResourceManager::CreateNewPanel() { + wxPropertyInfo::CloseWindow(); + ClearCurrentDialog(); char buf[256]; @@ -1456,6 +1462,25 @@ void wxResourceManager::RemoveSelection(wxWindow *win) m_selections.DeleteObject(win); } +void wxResourceManager::DeselectItemIfNecessary(wxWindow *win) +{ + if (win->IsKindOf(CLASSINFO(wxControl)) && (win->GetEventHandler() != win)) + { + // Deselect and refresh window in case we leave selection + // handles behind + wxControl *item = (wxControl *)win; + wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler(); + if (childHandler->IsSelected()) + { + wxResourceManager::GetCurrentResourceManager()->RemoveSelection(item); + childHandler->SelectItem(FALSE); +#ifndef __WXGTK__ + item->GetParent()->Refresh(); +#endif + } + } +} + // Need to search through resource table removing this from // any resource which has this as a parent. bool wxResourceManager::RemoveResourceFromParent(wxItemResource *res) @@ -1515,24 +1540,7 @@ bool wxResourceManager::DeleteResource(wxItemResource *res) bool wxResourceManager::DeleteResource(wxWindow *win) { - if (win->IsKindOf(CLASSINFO(wxControl)) && (win->GetEventHandler() != win)) - { - // Deselect and refresh window in case we leave selection - // handles behind - wxControl *item = (wxControl *)win; - wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler(); - - wxASSERT_MSG( win->GetEventHandler()->IsKindOf(CLASSINFO(wxResourceEditorControlHandler)), "Wrong kind of handler in DeleteResource" ); - - if (childHandler->IsSelected()) - { - RemoveSelection(item); - childHandler->SelectItem(FALSE); -#ifndef __WXGTK__ - item->GetParent()->Refresh(); -#endif - } - } + DeselectItemIfNecessary(win); wxItemResource *res = FindResourceForWindow(win); @@ -1803,7 +1811,7 @@ bool wxResourceManager::RepairResourceIds() // Deletes 'win' and creates a new window from the resource that // was associated with it. E.g. if you can't change properties on the // fly, you'll need to delete the window and create it again. -wxWindow *wxResourceManager::RecreateWindowFromResource(wxWindow *win, wxWindowPropertyInfo *info) +wxWindow *wxResourceManager::RecreateWindowFromResource(wxWindow *win, wxWindowPropertyInfo *info, bool instantiateFirst) { wxItemResource *resource = FindResourceForWindow(win); @@ -1816,7 +1824,9 @@ wxWindow *wxResourceManager::RecreateWindowFromResource(wxWindow *win, wxWindowP info = newInfo; } - info->InstantiateResource(resource); + // May not always want to copy values back from the resource + if (instantiateFirst) + info->InstantiateResource(resource); wxWindow *newWin = NULL; wxWindow *parent = win->GetParent(); @@ -2175,6 +2185,7 @@ void wxResourceEditorFrame::OnRecreateSelection(wxCommandEvent& WXUNUSED(event)) void wxResourceEditorFrame::OnCloseWindow(wxCloseEvent& event) { + wxPropertyInfo::CloseWindow(); if (manager->Modified()) { if (!manager->Clear(TRUE, FALSE)) @@ -2273,21 +2284,7 @@ void ObjectMenuProc(wxMenu *menu, wxCommandEvent& event) } case OBJECT_MENU_DELETE: { - if (data->IsKindOf(CLASSINFO(wxControl)) && (data->GetEventHandler() != data)) - { - // Deselect and refresh window in case we leave selection - // handles behind - wxControl *item = (wxControl *)data; - wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler(); - if (childHandler->IsSelected()) - { - wxResourceManager::GetCurrentResourceManager()->RemoveSelection(item); - childHandler->SelectItem(FALSE); -#ifndef __WXGTK__ - item->GetParent()->Refresh(); -#endif - } - } + wxResourceManager::GetCurrentResourceManager()->DeselectItemIfNecessary(data); wxResourceManager::GetCurrentResourceManager()->SaveInfoAndDeleteHandler(data); wxResourceManager::GetCurrentResourceManager()->DeleteResource(data); diff --git a/utils/dialoged/src/reseditr.h b/utils/dialoged/src/reseditr.h index 00e57587cb..021b867195 100644 --- a/utils/dialoged/src/reseditr.h +++ b/utils/dialoged/src/reseditr.h @@ -252,10 +252,13 @@ public: // Deletes 'win' and creates a new window from the resource that // was associated with it. E.g. if you can't change properties on the // fly, you'll need to delete the window and create it again. - virtual wxWindow *RecreateWindowFromResource(wxWindow *win, wxWindowPropertyInfo *info = NULL); + virtual wxWindow *RecreateWindowFromResource(wxWindow *win, wxWindowPropertyInfo *info = NULL, bool instantiateFirst = TRUE); virtual bool RecreateSelection(); + // Remove selection handles if this control is selected + void DeselectItemIfNecessary(wxWindow *win); + // Need to search through resource table removing this from // any resource which has this as a parent. virtual bool RemoveResourceFromParent(wxItemResource *res); diff --git a/utils/dialoged/src/winprop.cpp b/utils/dialoged/src/winprop.cpp index 1d9318bc95..dde79ec61c 100644 --- a/utils/dialoged/src/winprop.cpp +++ b/utils/dialoged/src/winprop.cpp @@ -123,18 +123,7 @@ bool wxPropertyInfo::Edit(wxWindow *WXUNUSED(parent), const wxString& title) } else { - int w, h, x, y; - sm_propertyWindow->GetSize(& w, & h); - sm_propertyWindow->GetPosition(& x, & y); - - wxResourceManager::GetCurrentResourceManager()->GetPropertyWindowSize().width = w; - wxResourceManager::GetCurrentResourceManager()->GetPropertyWindowSize().height = h; - wxResourceManager::GetCurrentResourceManager()->GetPropertyWindowSize().x = x; - wxResourceManager::GetCurrentResourceManager()->GetPropertyWindowSize().y = y; - - // Close the window, so we can create a new one for the different window - sm_propertyWindow->Destroy(); - sm_propertyWindow = (wxDialogEditorPropertyListFrame *) NULL; + CloseWindow(); // Close the window so we can open a new one } } @@ -164,7 +153,7 @@ bool wxPropertyInfo::Edit(wxWindow *WXUNUSED(parent), const wxString& title) propSheet->SetAllModified(FALSE); wxResourcePropertyListView *view = new wxResourcePropertyListView(this, NULL, - wxPROP_BUTTON_OK | wxPROP_BUTTON_CANCEL | + wxPROP_BUTTON_OK | // wxPROP_BUTTON_CANCEL | wxPROP_BUTTON_CHECK_CROSS|wxPROP_DYNAMIC_VALUE_FIELD|wxPROP_PULLDOWN|wxPROP_SHOWVALUES); wxDialogEditorPropertyListFrame *propWin = new wxDialogEditorPropertyListFrame(view, @@ -200,6 +189,24 @@ bool wxPropertyInfo::Edit(wxWindow *WXUNUSED(parent), const wxString& title) return TRUE; } +void wxPropertyInfo::CloseWindow() +{ + if (sm_propertyWindow) + { + int w, h, x, y; + sm_propertyWindow->GetSize(& w, & h); + sm_propertyWindow->GetPosition(& x, & y); + + wxResourceManager::GetCurrentResourceManager()->GetPropertyWindowSize().width = w; + wxResourceManager::GetCurrentResourceManager()->GetPropertyWindowSize().height = h; + wxResourceManager::GetCurrentResourceManager()->GetPropertyWindowSize().x = x; + wxResourceManager::GetCurrentResourceManager()->GetPropertyWindowSize().y = y; + + sm_propertyWindow->Destroy(); + sm_propertyWindow = (wxDialogEditorPropertyListFrame *) NULL; + } +} + /* * wxWindowPropertyInfo */ @@ -376,7 +383,15 @@ bool wxWindowPropertyInfo::SetProperty(wxString& name, wxProperty *property) { wxFont *newFont = SetFontProperty(name, property, font); if (newFont) + { m_propertyWindow->SetFont(* newFont); + wxItemResource* resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(m_propertyWindow); + if (resource) + { + resource->SetFont(* newFont); + } + } + return TRUE; } else if (name == "name") @@ -771,6 +786,7 @@ wxProperty *wxItemPropertyInfo::GetProperty(wxString& name) bool wxItemPropertyInfo::SetProperty(wxString& name, wxProperty *property) { wxControl *itemWindow = (wxControl *)m_propertyWindow; +#if 0 wxFont *font = & itemWindow->GetFont(); if (font && (name == "fontPoints" || name == "fontFamily" || name == "fontStyle" || name == "fontWeight" || name == "fontUnderlined" )) @@ -780,7 +796,9 @@ bool wxItemPropertyInfo::SetProperty(wxString& name, wxProperty *property) itemWindow->SetFont(* newFont); return TRUE; } - else if (name == "label") + else +#endif + if (name == "label") { itemWindow->SetLabel(property->GetValue().StringValue()); return TRUE; @@ -1460,6 +1478,8 @@ bool wxRadioBoxPropertyInfo::SetProperty(wxString& name, wxProperty *property) wxRadioBox *radioBox = (wxRadioBox *)m_propertyWindow; if (name == "numberRowsOrCols") { + wxResourceManager::GetCurrentResourceManager()->DeselectItemIfNecessary(radioBox); + radioBox->SetNumberOfRowsOrCols((int)property->GetValue().IntegerValue()); m_propertyWindow = wxResourceManager::GetCurrentResourceManager()->RecreateWindowFromResource(radioBox, this); return TRUE; @@ -1480,11 +1500,14 @@ bool wxRadioBoxPropertyInfo::SetProperty(wxString& name, wxProperty *property) windowStyle -= wxRA_SPECIFY_COLS; windowStyle |= wxRA_SPECIFY_ROWS; } + wxResourceManager::GetCurrentResourceManager()->DeselectItemIfNecessary(radioBox); + radioBox->SetWindowStyleFlag(windowStyle); wxItemResource *resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(radioBox); resource->SetStyle(windowStyle); + resource->SetSize(resource->GetX(), resource->GetY(), -1, -1); // Let it calculate it's own size - m_propertyWindow = wxResourceManager::GetCurrentResourceManager()->RecreateWindowFromResource(radioBox, this); + m_propertyWindow = wxResourceManager::GetCurrentResourceManager()->RecreateWindowFromResource(radioBox, this, FALSE); return TRUE; } else if (name == "values") @@ -1506,9 +1529,32 @@ bool wxRadioBoxPropertyInfo::SetProperty(wxString& name, wxProperty *property) expr = expr->GetNext(); } resource->SetStringValues(stringList); - m_propertyWindow = wxResourceManager::GetCurrentResourceManager()->RecreateWindowFromResource(radioBox, this); + resource->SetSize(resource->GetX(), resource->GetY(), -1, -1); // Let it calculate it's own size + m_propertyWindow = wxResourceManager::GetCurrentResourceManager()->RecreateWindowFromResource(radioBox, this, FALSE); return TRUE; } + else if (name == "fontPoints" || name == "fontFamily" || name == "fontStyle" || name == "fontWeight" || name == "fontUnderlined" ) + { + wxFont *font = & m_propertyWindow->GetFont(); + if (!font) + return FALSE; + wxFont *newFont = SetFontProperty(name, property, font); + if (newFont) + { + wxItemResource* resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(m_propertyWindow); + if (resource) + { + resource->SetFont(* newFont); + } + + wxResourceManager::GetCurrentResourceManager()->DeselectItemIfNecessary(radioBox); + + radioBox->SetFont(* newFont); + radioBox->SetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT); + return TRUE; + } + } + return wxItemPropertyInfo::SetProperty(name, property); } diff --git a/utils/dialoged/src/winprop.h b/utils/dialoged/src/winprop.h index 9869fe3aef..27d1ea5a61 100644 --- a/utils/dialoged/src/winprop.h +++ b/utils/dialoged/src/winprop.h @@ -74,6 +74,7 @@ class wxPropertyInfo: public wxObject virtual bool SetProperty(wxString& propName, wxProperty *property) = 0; virtual void GetPropertyNames(wxStringList& names) = 0; virtual bool Edit(wxWindow *parent, const wxString& title); + static void CloseWindow(); // Close the current window if open. }; // For all windows -- 2.45.2