X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0915bc4d71a31bfa011b2f8705c17761216ecc4e..76b0f8384ed211c5f6b48597a62da743b604e666:/src/xrc/xmlres.cpp?ds=sidebyside diff --git a/src/xrc/xmlres.cpp b/src/xrc/xmlres.cpp index 95525ac90a..c514809b01 100644 --- a/src/xrc/xmlres.cpp +++ b/src/xrc/xmlres.cpp @@ -3,7 +3,6 @@ // Purpose: XRC resources // Author: Vaclav Slavik // Created: 2000/03/05 -// RCS-ID: $Id$ // Copyright: (c) 2000 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -73,6 +72,10 @@ wxDateTime GetXRCFileModTime(const wxString& filename) } // anonymous namespace +// Assign the given value to the specified entry or add a new value with this +// name. +static void XRCID_Assign(const wxString& str_id, int value); + class wxXmlResourceDataRecord { public: @@ -103,7 +106,7 @@ class wxXmlResourceDataRecords : public wxVector // this is a class so that it can be forward-declared }; -WX_DECLARE_HASH_SET(int, wxIntegerHash, wxIntegerEqual, wxHashSetInt); +WX_DECLARE_HASH_SET_PTR(int, wxIntegerHash, wxIntegerEqual, wxHashSetInt); class wxIdRange // Holds data for a particular rangename { @@ -152,9 +155,6 @@ public: void FinaliseRanges(const wxXmlNode* node) const; // Searches for a known IdRange matching 'name', returning its index or -1 int Find(const wxString& rangename) const; - // Removes, if it exists, an entry from the XRCID table. Used in id-ranges - // to replace defunct or statically-initialised entries with current values - static void RemoveXRCIDEntry(const wxString& idstr); protected: wxIdRange* FindRangeForItem(const wxXmlNode* node, @@ -430,16 +430,18 @@ bool wxXmlResource::Unload(const wxString& filename) } -IMPLEMENT_ABSTRACT_CLASS(wxXmlResourceHandler, wxObject) - void wxXmlResource::AddHandler(wxXmlResourceHandler *handler) { + wxXmlResourceHandlerImpl *impl = new wxXmlResourceHandlerImpl(handler); + handler->SetImpl(impl); m_handlers.push_back(handler); handler->SetParentResource(this); } void wxXmlResource::InsertHandler(wxXmlResourceHandler *handler) { + wxXmlResourceHandlerImpl *impl = new wxXmlResourceHandlerImpl(handler); + handler->SetImpl(impl); m_handlers.insert(m_handlers.begin(), handler); handler->SetParentResource(this); } @@ -1216,13 +1218,10 @@ void wxIdRange::Finalise(const wxXmlNode* node) // Create the XRCIDs for (int i=m_start; i <= m_end; ++i) { - // First clear any pre-existing XRCID - // Necessary for wxXmlResource::Unload() followed by Load() - wxIdRangeManager::RemoveXRCIDEntry( - m_name + wxString::Format("[%i]", i-m_start)); + // Ensure that we overwrite any existing value as otherwise + // wxXmlResource::Unload() followed by Load() wouldn't work correctly. + XRCID_Assign(m_name + wxString::Format("[%i]", i-m_start), i); - // Use the second parameter of GetXRCID to force it to take the value i - wxXmlResource::GetXRCID(m_name + wxString::Format("[%i]", i-m_start), i); wxLogTrace("xrcrange", "integer = %i %s now returns %i", i, @@ -1230,10 +1229,8 @@ void wxIdRange::Finalise(const wxXmlNode* node) XRCID((m_name + wxString::Format("[%i]", i-m_start)).mb_str())); } // and these special ones - wxIdRangeManager::RemoveXRCIDEntry(m_name + "[start]"); - wxXmlResource::GetXRCID(m_name + "[start]", m_start); - wxIdRangeManager::RemoveXRCIDEntry(m_name + "[end]"); - wxXmlResource::GetXRCID(m_name + "[end]", m_end); + XRCID_Assign(m_name + "[start]", m_start); + XRCID_Assign(m_name + "[end]", m_end); wxLogTrace("xrcrange","%s[start] = %i %s[end] = %i", m_name.mb_str(),XRCID(wxString(m_name+"[start]").mb_str()), m_name.mb_str(),XRCID(wxString(m_name+"[end]").mb_str())); @@ -1405,23 +1402,35 @@ public: -wxXmlResourceHandler::wxXmlResourceHandler() - : m_node(NULL), m_parent(NULL), m_instance(NULL), - m_parentAsWindow(NULL) -{} +wxXmlResourceHandlerImpl::wxXmlResourceHandlerImpl(wxXmlResourceHandler *handler) + :wxXmlResourceHandlerImplBase(handler) +{ +} + +wxObject *wxXmlResourceHandlerImpl::CreateResFromNode(wxXmlNode *node, + wxObject *parent, wxObject *instance) +{ + return m_handler->m_resource->CreateResFromNode(node, parent, instance); +} +#if wxUSE_FILESYSTEM +wxFileSystem& wxXmlResourceHandlerImpl::GetCurFileSystem() +{ + return m_handler->m_resource->GetCurFileSystem(); +} +#endif -wxObject *wxXmlResourceHandler::CreateResource(wxXmlNode *node, wxObject *parent, wxObject *instance) +wxObject *wxXmlResourceHandlerImpl::CreateResource(wxXmlNode *node, wxObject *parent, wxObject *instance) { - wxXmlNode *myNode = m_node; - wxString myClass = m_class; - wxObject *myParent = m_parent, *myInstance = m_instance; - wxWindow *myParentAW = m_parentAsWindow; + wxXmlNode *myNode = m_handler->m_node; + wxString myClass = m_handler->m_class; + wxObject *myParent = m_handler->m_parent, *myInstance = m_handler->m_instance; + wxWindow *myParentAW = m_handler->m_parentAsWindow; - m_instance = instance; - if (!m_instance && node->HasAttribute(wxT("subclass")) && - !(m_resource->GetFlags() & wxXRC_NO_SUBCLASSING)) + m_handler->m_instance = instance; + if (!m_handler->m_instance && node->HasAttribute(wxT("subclass")) && + !(m_handler->m_resource->GetFlags() & wxXRC_NO_SUBCLASSING)) { wxString subclass = node->GetAttribute(wxT("subclass"), wxEmptyString); if (!subclass.empty()) @@ -1429,12 +1438,12 @@ wxObject *wxXmlResourceHandler::CreateResource(wxXmlNode *node, wxObject *parent for (wxXmlSubclassFactories::iterator i = wxXmlResource::ms_subclassFactories->begin(); i != wxXmlResource::ms_subclassFactories->end(); ++i) { - m_instance = (*i)->Create(subclass); - if (m_instance) + m_handler->m_instance = (*i)->Create(subclass); + if (m_handler->m_instance) break; } - if (!m_instance) + if (!m_handler->m_instance) { wxString name = node->GetAttribute(wxT("name"), wxEmptyString); ReportError @@ -1450,62 +1459,28 @@ wxObject *wxXmlResourceHandler::CreateResource(wxXmlNode *node, wxObject *parent } } - m_node = node; - m_class = node->GetAttribute(wxT("class"), wxEmptyString); - m_parent = parent; - m_parentAsWindow = wxDynamicCast(m_parent, wxWindow); + m_handler->m_node = node; + m_handler->m_class = node->GetAttribute(wxT("class"), wxEmptyString); + m_handler->m_parent = parent; + m_handler->m_parentAsWindow = wxDynamicCast(m_handler->m_parent, wxWindow); - wxObject *returned = DoCreateResource(); + wxObject *returned = GetHandler()->DoCreateResource(); - m_node = myNode; - m_class = myClass; - m_parent = myParent; m_parentAsWindow = myParentAW; - m_instance = myInstance; + m_handler->m_node = myNode; + m_handler->m_class = myClass; + m_handler->m_parent = myParent; m_handler->m_parentAsWindow = myParentAW; + m_handler->m_instance = myInstance; return returned; } - -void wxXmlResourceHandler::AddStyle(const wxString& name, int value) -{ - m_styleNames.Add(name); - m_styleValues.Add(value); -} - - - -void wxXmlResourceHandler::AddWindowStyles() -{ - XRC_ADD_STYLE(wxCLIP_CHILDREN); - - // the border styles all have the old and new names, recognize both for now - XRC_ADD_STYLE(wxSIMPLE_BORDER); XRC_ADD_STYLE(wxBORDER_SIMPLE); - XRC_ADD_STYLE(wxSUNKEN_BORDER); XRC_ADD_STYLE(wxBORDER_SUNKEN); - XRC_ADD_STYLE(wxDOUBLE_BORDER); XRC_ADD_STYLE(wxBORDER_DOUBLE); // deprecated - XRC_ADD_STYLE(wxBORDER_THEME); - XRC_ADD_STYLE(wxRAISED_BORDER); XRC_ADD_STYLE(wxBORDER_RAISED); - XRC_ADD_STYLE(wxSTATIC_BORDER); XRC_ADD_STYLE(wxBORDER_STATIC); - XRC_ADD_STYLE(wxNO_BORDER); XRC_ADD_STYLE(wxBORDER_NONE); - - XRC_ADD_STYLE(wxTRANSPARENT_WINDOW); - XRC_ADD_STYLE(wxWANTS_CHARS); - XRC_ADD_STYLE(wxTAB_TRAVERSAL); - XRC_ADD_STYLE(wxNO_FULL_REPAINT_ON_RESIZE); - XRC_ADD_STYLE(wxFULL_REPAINT_ON_RESIZE); - XRC_ADD_STYLE(wxALWAYS_SHOW_SB); - XRC_ADD_STYLE(wxWS_EX_BLOCK_EVENTS); - XRC_ADD_STYLE(wxWS_EX_VALIDATE_RECURSIVELY); -} - - - -bool wxXmlResourceHandler::HasParam(const wxString& param) +bool wxXmlResourceHandlerImpl::HasParam(const wxString& param) { return (GetParamNode(param) != NULL); } -int wxXmlResourceHandler::GetStyle(const wxString& param, int defaults) +int wxXmlResourceHandlerImpl::GetStyle(const wxString& param, int defaults) { wxString s = GetParamValue(param); @@ -1518,10 +1493,10 @@ int wxXmlResourceHandler::GetStyle(const wxString& param, int defaults) while (tkn.HasMoreTokens()) { fl = tkn.GetNextToken(); - index = m_styleNames.Index(fl); + index = m_handler->m_styleNames.Index(fl); if (index != wxNOT_FOUND) { - style |= m_styleValues[index]; + style |= m_handler->m_styleValues[index]; } else { @@ -1537,19 +1512,19 @@ int wxXmlResourceHandler::GetStyle(const wxString& param, int defaults) -wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate) +wxString wxXmlResourceHandlerImpl::GetText(const wxString& param, bool translate) { wxXmlNode *parNode = GetParamNode(param); wxString str1(GetNodeContent(parNode)); wxString str2; // "\\" wasn't translated to "\" prior to 2.5.3.0: - const bool escapeBackslash = (m_resource->CompareVersion(2,5,3,0) >= 0); + const bool escapeBackslash = (m_handler->m_resource->CompareVersion(2,5,3,0) >= 0); // VS: First version of XRC resources used $ instead of & (which is // illegal in XML), but later I realized that '_' fits this purpose // much better (because &File means "File with F underlined"). - const wxChar amp_char = (m_resource->CompareVersion(2,3,0,1) < 0) + const wxChar amp_char = (m_handler->m_resource->CompareVersion(2,3,0,1) < 0) ? '$' : '_'; for ( wxString::const_iterator dt = str1.begin(); dt != str1.end(); ++dt ) @@ -1558,7 +1533,7 @@ wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate) // like "&File..." -- this is illegal in XML, so we use "_File..."): if ( *dt == amp_char ) { - if ( *(++dt) == amp_char ) + if ( dt+1 == str1.end() || *(++dt) == amp_char ) str2 << amp_char; else str2 << wxT('&') << *dt; @@ -1600,12 +1575,12 @@ wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate) } } - if (m_resource->GetFlags() & wxXRC_USE_LOCALE) + if (m_handler->m_resource->GetFlags() & wxXRC_USE_LOCALE) { if (translate && parNode && parNode->GetAttribute(wxT("translate"), wxEmptyString) != wxT("0")) { - return wxGetTranslation(str2, m_resource->GetDomain()); + return wxGetTranslation(str2, m_handler->m_resource->GetDomain()); } else { @@ -1627,53 +1602,71 @@ wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate) -long wxXmlResourceHandler::GetLong(const wxString& param, long defaultv) +long wxXmlResourceHandlerImpl::GetLong(const wxString& param, long defaultv) { - long value; + long value = defaultv; wxString str1 = GetParamValue(param); - if (!str1.ToLong(&value)) - value = defaultv; + if (!str1.empty()) + { + if (!str1.ToLong(&value)) + { + ReportParamError + ( + param, + wxString::Format("invalid long specification \"%s\"", str1) + ); + } + } return value; } -float wxXmlResourceHandler::GetFloat(const wxString& param, float defaultv) +float wxXmlResourceHandlerImpl::GetFloat(const wxString& param, float defaultv) { wxString str = GetParamValue(param); // strings in XRC always use C locale so make sure to use the // locale-independent wxString::ToCDouble() and not ToDouble() which uses // the current locale with a potentially different decimal point character - double value; - if (!str.ToCDouble(&value)) - value = defaultv; + double value = defaultv; + if (!str.empty()) + { + if (!str.ToCDouble(&value)) + { + ReportParamError + ( + param, + wxString::Format("invalid float specification \"%s\"", str) + ); + } + } return wx_truncate_cast(float, value); } -int wxXmlResourceHandler::GetID() +int wxXmlResourceHandlerImpl::GetID() { return wxXmlResource::GetXRCID(GetName()); } -wxString wxXmlResourceHandler::GetName() +wxString wxXmlResourceHandlerImpl::GetName() { - return m_node->GetAttribute(wxT("name"), wxT("-1")); + return m_handler->m_node->GetAttribute(wxT("name"), wxT("-1")); } -bool wxXmlResourceHandler::GetBoolAttr(const wxString& attr, bool defaultv) +bool wxXmlResourceHandlerImpl::GetBoolAttr(const wxString& attr, bool defaultv) { wxString v; - return m_node->GetAttribute(attr, &v) ? v == '1' : defaultv; + return m_handler->m_node->GetAttribute(attr, &v) ? v == '1' : defaultv; } -bool wxXmlResourceHandler::GetBool(const wxString& param, bool defaultv) +bool wxXmlResourceHandlerImpl::GetBool(const wxString& param, bool defaultv) { const wxString v = GetParamValue(param); @@ -1730,7 +1723,7 @@ static wxColour GetSystemColour(const wxString& name) return wxNullColour; } -wxColour wxXmlResourceHandler::GetColour(const wxString& param, const wxColour& defaultv) +wxColour wxXmlResourceHandlerImpl::GetColour(const wxString& param, const wxColour& defaultv) { wxString v = GetParamValue(param); @@ -1790,7 +1783,7 @@ bool GetStockArtAttrs(const wxXmlNode *paramNode, } // anonymous namespace -wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param, +wxBitmap wxXmlResourceHandlerImpl::GetBitmap(const wxString& param, const wxArtClient& defaultArtClient, wxSize size) { @@ -1811,7 +1804,7 @@ wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param, return GetBitmap(node, defaultArtClient, size); } -wxBitmap wxXmlResourceHandler::GetBitmap(const wxXmlNode* node, +wxBitmap wxXmlResourceHandlerImpl::GetBitmap(const wxXmlNode* node, const wxArtClient& defaultArtClient, wxSize size) { @@ -1861,7 +1854,7 @@ wxBitmap wxXmlResourceHandler::GetBitmap(const wxXmlNode* node, } -wxIcon wxXmlResourceHandler::GetIcon(const wxString& param, +wxIcon wxXmlResourceHandlerImpl::GetIcon(const wxString& param, const wxArtClient& defaultArtClient, wxSize size) { @@ -1879,7 +1872,7 @@ wxIcon wxXmlResourceHandler::GetIcon(const wxString& param, return GetIcon(node, defaultArtClient, size); } -wxIcon wxXmlResourceHandler::GetIcon(const wxXmlNode* node, +wxIcon wxXmlResourceHandlerImpl::GetIcon(const wxXmlNode* node, const wxArtClient& defaultArtClient, wxSize size) { @@ -1889,7 +1882,7 @@ wxIcon wxXmlResourceHandler::GetIcon(const wxXmlNode* node, } -wxIconBundle wxXmlResourceHandler::GetIconBundle(const wxString& param, +wxIconBundle wxXmlResourceHandlerImpl::GetIconBundle(const wxString& param, const wxArtClient& defaultArtClient) { wxString art_id, art_client; @@ -1937,14 +1930,14 @@ wxIconBundle wxXmlResourceHandler::GetIconBundle(const wxString& param, } -wxImageList *wxXmlResourceHandler::GetImageList(const wxString& param) +wxImageList *wxXmlResourceHandlerImpl::GetImageList(const wxString& param) { wxXmlNode * const imagelist_node = GetParamNode(param); if ( !imagelist_node ) return NULL; - wxXmlNode * const oldnode = m_node; - m_node = imagelist_node; + wxXmlNode * const oldnode = m_handler->m_node; + m_handler->m_node = imagelist_node; // Get the size if we have it, otherwise we will use the size of the first // list element. @@ -1956,7 +1949,7 @@ wxImageList *wxXmlResourceHandler::GetImageList(const wxString& param) wxString parambitmap = wxT("bitmap"); if ( HasParam(parambitmap) ) { - wxXmlNode *n = m_node->GetChildren(); + wxXmlNode *n = m_handler->m_node->GetChildren(); while (n) { if (n->GetType() == wxXML_ELEMENT_NODE && n->GetName() == parambitmap) @@ -1981,15 +1974,15 @@ wxImageList *wxXmlResourceHandler::GetImageList(const wxString& param) } } - m_node = oldnode; + m_handler->m_node = oldnode; return imagelist; } -wxXmlNode *wxXmlResourceHandler::GetParamNode(const wxString& param) +wxXmlNode *wxXmlResourceHandlerImpl::GetParamNode(const wxString& param) { - wxCHECK_MSG(m_node, NULL, wxT("You can't access handler data before it was initialized!")); + wxCHECK_MSG(m_handler->m_node, NULL, wxT("You can't access handler data before it was initialized!")); - wxXmlNode *n = m_node->GetChildren(); + wxXmlNode *n = m_handler->m_node->GetChildren(); while (n) { @@ -2008,15 +2001,14 @@ wxXmlNode *wxXmlResourceHandler::GetParamNode(const wxString& param) return NULL; } -/* static */ -bool wxXmlResourceHandler::IsOfClass(wxXmlNode *node, const wxString& classname) +bool wxXmlResourceHandlerImpl::IsOfClass(wxXmlNode *node, const wxString& classname) const { return node->GetAttribute(wxT("class")) == classname; } -wxString wxXmlResourceHandler::GetNodeContent(const wxXmlNode *node) +wxString wxXmlResourceHandlerImpl::GetNodeContent(const wxXmlNode *node) { const wxXmlNode *n = node; if (n == NULL) return wxEmptyString; @@ -2034,21 +2026,21 @@ wxString wxXmlResourceHandler::GetNodeContent(const wxXmlNode *node) -wxString wxXmlResourceHandler::GetParamValue(const wxString& param) +wxString wxXmlResourceHandlerImpl::GetParamValue(const wxString& param) { if (param.empty()) - return GetNodeContent(m_node); + return GetNodeContent(m_handler->m_node); else return GetNodeContent(GetParamNode(param)); } -wxString wxXmlResourceHandler::GetParamValue(const wxXmlNode* node) +wxString wxXmlResourceHandlerImpl::GetParamValue(const wxXmlNode* node) { return GetNodeContent(node); } -wxSize wxXmlResourceHandler::GetSize(const wxString& param, +wxSize wxXmlResourceHandlerImpl::GetSize(const wxString& param, wxWindow *windowToUse) { wxString s = GetParamValue(param); @@ -2076,9 +2068,9 @@ wxSize wxXmlResourceHandler::GetSize(const wxString& param, { return wxDLG_UNIT(windowToUse, wxSize(sx, sy)); } - else if (m_parentAsWindow) + else if (m_handler->m_parentAsWindow) { - return wxDLG_UNIT(m_parentAsWindow, wxSize(sx, sy)); + return wxDLG_UNIT(m_handler->m_parentAsWindow, wxSize(sx, sy)); } else { @@ -2096,7 +2088,7 @@ wxSize wxXmlResourceHandler::GetSize(const wxString& param, -wxPoint wxXmlResourceHandler::GetPosition(const wxString& param) +wxPoint wxXmlResourceHandlerImpl::GetPosition(const wxString& param) { wxSize sz = GetSize(param); return wxPoint(sz.x, sz.y); @@ -2104,7 +2096,7 @@ wxPoint wxXmlResourceHandler::GetPosition(const wxString& param) -wxCoord wxXmlResourceHandler::GetDimension(const wxString& param, +wxCoord wxXmlResourceHandlerImpl::GetDimension(const wxString& param, wxCoord defaultv, wxWindow *windowToUse) { @@ -2132,9 +2124,9 @@ wxCoord wxXmlResourceHandler::GetDimension(const wxString& param, { return wxDLG_UNIT(windowToUse, wxSize(sx, 0)).x; } - else if (m_parentAsWindow) + else if (m_handler->m_parentAsWindow) { - return wxDLG_UNIT(m_parentAsWindow, wxSize(sx, 0)).x; + return wxDLG_UNIT(m_handler->m_parentAsWindow, wxSize(sx, 0)).x; } else { @@ -2150,6 +2142,40 @@ wxCoord wxXmlResourceHandler::GetDimension(const wxString& param, return sx; } +wxDirection +wxXmlResourceHandlerImpl::GetDirection(const wxString& param, wxDirection dirDefault) +{ + wxDirection dir; + + const wxString dirstr = GetParamValue(param); + if ( dirstr.empty() ) + dir = dirDefault; + else if ( dirstr == "wxLEFT" ) + dir = wxLEFT; + else if ( dirstr == "wxRIGHT" ) + dir = wxRIGHT; + else if ( dirstr == "wxTOP" ) + dir = wxTOP; + else if ( dirstr == "wxBOTTOM" ) + dir = wxBOTTOM; + else + { + ReportError + ( + GetParamNode(param), + wxString::Format + ( + "Invalid direction \"%s\": must be one of " + "wxLEFT|wxRIGHT|wxTOP|wxBOTTOM.", + dirstr + ) + ); + + dir = dirDefault; + } + + return dir; +} // Get system font index using indexname static wxFont GetSystemFont(const wxString& name) @@ -2171,7 +2197,7 @@ static wxFont GetSystemFont(const wxString& name) return wxNullFont; } -wxFont wxXmlResourceHandler::GetFont(const wxString& param) +wxFont wxXmlResourceHandlerImpl::GetFont(const wxString& param, wxWindow* parent) { wxXmlNode *font_node = GetParamNode(param); if (font_node == NULL) @@ -2181,8 +2207,8 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param) return wxNullFont; } - wxXmlNode *oldnode = m_node; - m_node = font_node; + wxXmlNode *oldnode = m_handler->m_node; + m_handler->m_node = font_node; // font attributes: @@ -2202,6 +2228,14 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param) istyle = wxITALIC; else if (style == wxT("slant")) istyle = wxSLANT; + else if (style != wxT("normal")) + { + ReportParamError + ( + param, + wxString::Format("unknown font style \"%s\"", style) + ); + } } // weight @@ -2214,6 +2248,14 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param) iweight = wxBOLD; else if (weight == wxT("light")) iweight = wxLIGHT; + else if (weight != wxT("normal")) + { + ReportParamError + ( + param, + wxString::Format("unknown font weight \"%s\"", weight) + ); + } } // underline @@ -2232,6 +2274,14 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param) else if (family == wxT("swiss")) ifamily = wxSWISS; else if (family == wxT("modern")) ifamily = wxMODERN; else if (family == wxT("teletype")) ifamily = wxTELETYPE; + else + { + ReportParamError + ( + param, + wxString::Format("unknown font family \"%s\"", family) + ); + } } @@ -2274,13 +2324,50 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param) } #endif // wxUSE_FONTMAP + wxFont font; + // is this font based on a system font? - wxFont font = GetSystemFont(GetParamValue(wxT("sysfont"))); + if (HasParam(wxT("sysfont"))) + { + font = GetSystemFont(GetParamValue(wxT("sysfont"))); + if (HasParam(wxT("inherit"))) + { + ReportParamError + ( + param, + "double specification of \"sysfont\" and \"inherit\"" + ); + } + } + // or should the font of the widget be used? + else if (GetBool(wxT("inherit"), false)) + { + if (parent) + font = parent->GetFont(); + else + { + ReportParamError + ( + param, + "no parent window specified to derive the font from" + ); + } + } if (font.IsOk()) { if (hasSize && isize != -1) + { font.SetPointSize(isize); + if (HasParam(wxT("relativesize"))) + { + ReportParamError + ( + param, + "double specification of \"size\" and \"relativesize\"" + ); + } + } else if (HasParam(wxT("relativesize"))) font.SetPointSize(int(font.GetPointSize() * GetFloat(wxT("relativesize")))); @@ -2305,12 +2392,12 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param) underlined, facename, enc); } - m_node = oldnode; + m_handler->m_node = oldnode; return font; } -void wxXmlResourceHandler::SetupWindow(wxWindow *wnd) +void wxXmlResourceHandlerImpl::SetupWindow(wxWindow *wnd) { //FIXME : add cursor @@ -2338,36 +2425,36 @@ void wxXmlResourceHandler::SetupWindow(wxWindow *wnd) wnd->SetToolTip(GetText(wxT("tooltip"))); #endif if (HasParam(wxT("font"))) - wnd->SetFont(GetFont(wxT("font"))); + wnd->SetFont(GetFont(wxT("font"), wnd)); if (HasParam(wxT("ownfont"))) - wnd->SetOwnFont(GetFont(wxT("ownfont"))); + wnd->SetOwnFont(GetFont(wxT("ownfont"), wnd)); if (HasParam(wxT("help"))) wnd->SetHelpText(GetText(wxT("help"))); } -void wxXmlResourceHandler::CreateChildren(wxObject *parent, bool this_hnd_only) +void wxXmlResourceHandlerImpl::CreateChildren(wxObject *parent, bool this_hnd_only) { - for ( wxXmlNode *n = m_node->GetChildren(); n; n = n->GetNext() ) + for ( wxXmlNode *n = m_handler->m_node->GetChildren(); n; n = n->GetNext() ) { if ( IsObjectNode(n) ) { - m_resource->DoCreateResFromNode(*n, parent, NULL, - this_hnd_only ? this : NULL); - } + m_handler->m_resource->DoCreateResFromNode(*n, parent, NULL, + this_hnd_only ? this->GetHandler() : NULL); + } } } -void wxXmlResourceHandler::CreateChildrenPrivately(wxObject *parent, wxXmlNode *rootnode) +void wxXmlResourceHandlerImpl::CreateChildrenPrivately(wxObject *parent, wxXmlNode *rootnode) { wxXmlNode *root; - if (rootnode == NULL) root = m_node; else root = rootnode; + if (rootnode == NULL) root = m_handler->m_node; else root = rootnode; wxXmlNode *n = root->GetChildren(); while (n) { - if (n->GetType() == wxXML_ELEMENT_NODE && CanHandle(n)) + if (n->GetType() == wxXML_ELEMENT_NODE && GetHandler()->CanHandle(n)) { CreateResource(n, parent, NULL); } @@ -2380,21 +2467,21 @@ void wxXmlResourceHandler::CreateChildrenPrivately(wxObject *parent, wxXmlNode * // errors reporting //----------------------------------------------------------------------------- -void wxXmlResourceHandler::ReportError(const wxString& message) +void wxXmlResourceHandlerImpl::ReportError(const wxString& message) { - m_resource->ReportError(m_node, message); + m_handler->m_resource->ReportError(m_handler->m_node, message); } -void wxXmlResourceHandler::ReportError(wxXmlNode *context, +void wxXmlResourceHandlerImpl::ReportError(wxXmlNode *context, const wxString& message) { - m_resource->ReportError(context ? context : m_node, message); + m_handler->m_resource->ReportError(context ? context : m_handler->m_node, message); } -void wxXmlResourceHandler::ReportParamError(const wxString& param, +void wxXmlResourceHandlerImpl::ReportParamError(const wxString& param, const wxString& message) { - m_resource->ReportError(GetParamNode(param), message); + m_handler->m_resource->ReportError(GetParamNode(param), message); } void wxXmlResource::ReportError(const wxXmlNode *context, const wxString& message) @@ -2461,6 +2548,31 @@ static inline unsigned XRCIdHash(const char *str_id) return index; } +static void XRCID_Assign(const wxString& str_id, int value) +{ + const wxCharBuffer buf_id(str_id.mb_str()); + const unsigned index = XRCIdHash(buf_id); + + + XRCID_record *oldrec = NULL; + for (XRCID_record *rec = XRCID_Records[index]; rec; rec = rec->next) + { + if (wxStrcmp(rec->key, buf_id) == 0) + { + rec->id = value; + return; + } + oldrec = rec; + } + + XRCID_record **rec_var = (oldrec == NULL) ? + &XRCID_Records[index] : &oldrec->next; + *rec_var = new XRCID_record; + (*rec_var)->key = wxStrdup(str_id); + (*rec_var)->id = value; + (*rec_var)->next = NULL; +} + static int XRCID_Lookup(const char *str_id, int value_if_not_found = wxID_NONE) { const unsigned index = XRCIdHash(str_id); @@ -2532,11 +2644,14 @@ void AddStdXRCID_Records() stdID(wxID_PREVIEW); stdID(wxID_ABOUT); stdID(wxID_HELP_CONTENTS); + stdID(wxID_HELP_INDEX), + stdID(wxID_HELP_SEARCH), stdID(wxID_HELP_COMMANDS); stdID(wxID_HELP_PROCEDURES); stdID(wxID_HELP_CONTEXT); stdID(wxID_CLOSE_ALL); stdID(wxID_PREFERENCES); + stdID(wxID_EDIT); stdID(wxID_CUT); stdID(wxID_COPY); @@ -2549,6 +2664,7 @@ void AddStdXRCID_Records() stdID(wxID_REPLACE); stdID(wxID_REPLACE_ALL); stdID(wxID_PROPERTIES); + stdID(wxID_VIEW_DETAILS); stdID(wxID_VIEW_LARGEICONS); stdID(wxID_VIEW_SMALLICONS); @@ -2557,6 +2673,8 @@ void AddStdXRCID_Records() stdID(wxID_VIEW_SORTNAME); stdID(wxID_VIEW_SORTSIZE); stdID(wxID_VIEW_SORTTYPE); + + stdID(wxID_FILE1); stdID(wxID_FILE2); stdID(wxID_FILE3); @@ -2566,6 +2684,8 @@ void AddStdXRCID_Records() stdID(wxID_FILE7); stdID(wxID_FILE8); stdID(wxID_FILE9); + + stdID(wxID_OK); stdID(wxID_CANCEL); stdID(wxID_APPLY); @@ -2586,12 +2706,14 @@ void AddStdXRCID_Records() stdID(wxID_IGNORE); stdID(wxID_ADD); stdID(wxID_REMOVE); + stdID(wxID_UP); stdID(wxID_DOWN); stdID(wxID_HOME); stdID(wxID_REFRESH); stdID(wxID_STOP); stdID(wxID_INDEX); + stdID(wxID_BOLD); stdID(wxID_ITALIC); stdID(wxID_JUSTIFY_CENTER); @@ -2607,13 +2729,6 @@ void AddStdXRCID_Records() stdID(wxID_ZOOM_OUT); stdID(wxID_UNDELETE); stdID(wxID_REVERT_TO_SAVED); - stdID(wxID_SYSTEM_MENU); - stdID(wxID_CLOSE_FRAME); - stdID(wxID_MOVE_FRAME); - stdID(wxID_RESIZE_FRAME); - stdID(wxID_MAXIMIZE_FRAME); - stdID(wxID_ICONIZE_FRAME); - stdID(wxID_RESTORE_FRAME); stdID(wxID_CDROM); stdID(wxID_CONVERT); stdID(wxID_EXECUTE); @@ -2633,6 +2748,23 @@ void AddStdXRCID_Records() stdID(wxID_SPELL_CHECK); stdID(wxID_STRIKETHROUGH); + + stdID(wxID_SYSTEM_MENU); + stdID(wxID_CLOSE_FRAME); + stdID(wxID_MOVE_FRAME); + stdID(wxID_RESIZE_FRAME); + stdID(wxID_MAXIMIZE_FRAME); + stdID(wxID_ICONIZE_FRAME); + stdID(wxID_RESTORE_FRAME); + + + + stdID(wxID_MDI_WINDOW_CASCADE); + stdID(wxID_MDI_WINDOW_TILE_HORZ); + stdID(wxID_MDI_WINDOW_TILE_VERT); + stdID(wxID_MDI_WINDOW_ARRANGE_ICONS); + stdID(wxID_MDI_WINDOW_PREV); + stdID(wxID_MDI_WINDOW_NEXT); #undef stdID } @@ -2666,30 +2798,6 @@ wxString wxXmlResource::FindXRCIDById(int numId) return wxString(); } -/* static */ -void wxIdRangeManager::RemoveXRCIDEntry(const wxString& idstr) -{ - const char *str_id = idstr.mb_str(); - - const unsigned index = XRCIdHash(str_id); - - XRCID_record **p_previousrec = &XRCID_Records[index]; - for (XRCID_record *rec = XRCID_Records[index]; rec; rec = rec->next) - { - if (wxStrcmp(rec->key, str_id) == 0) - { - // Found the item to be removed so delete its record; but first - // remove it from the linked list. - *p_previousrec = rec->next; - free(rec->key); - delete rec; - return; - } - - p_previousrec = &rec->next; - } -} - static void CleanXRCID_Record(XRCID_record *rec) { if (rec) @@ -2763,8 +2871,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxXmlResourceModule, wxModule) void wxXmlInitResourceModule() { wxModule* module = new wxXmlResourceModule; - module->Init(); wxModule::RegisterModule(module); + wxModule::InitializeModules(); } #endif // wxUSE_XRC