📄 xmlres.cpp
字号:
wxART_MAKE_CLIENT_ID_FROM_STR(scl), size); if ( stockArt.Ok() ) return stockArt; } } /* ...or load the bitmap from file: */ wxString name = GetParamValue(param); if (name.IsEmpty()) return wxNullBitmap;#if wxUSE_FILESYSTEM wxFSFile *fsfile = GetCurFileSystem().OpenFile(name); if (fsfile == NULL) { wxLogError(_("XRC resource: Cannot create bitmap from '%s'."), param.c_str()); return wxNullBitmap; } wxImage img(*(fsfile->GetStream())); delete fsfile;#else wxImage img(GetParamValue(wxT("bitmap")));#endif if (!img.Ok()) { wxLogError(_("XRC resource: Cannot create bitmap from '%s'."), param.c_str()); return wxNullBitmap; } if (!(size == wxDefaultSize)) img.Rescale(size.x, size.y); return wxBitmap(img);}wxIcon wxXmlResourceHandler::GetIcon(const wxString& param, const wxArtClient& defaultArtClient, wxSize size){ wxIcon icon; icon.CopyFromBitmap(GetBitmap(param, defaultArtClient, size)); return icon;}wxXmlNode *wxXmlResourceHandler::GetParamNode(const wxString& param){ wxCHECK_MSG(m_node, NULL, wxT("You can't access handler data before it was initialized!")); wxXmlNode *n = m_node->GetChildren(); while (n) { if (n->GetType() == wxXML_ELEMENT_NODE && n->GetName() == param) return n; n = n->GetNext(); } return NULL;}wxString wxXmlResourceHandler::GetNodeContent(wxXmlNode *node){ wxXmlNode *n = node; if (n == NULL) return wxEmptyString; n = n->GetChildren(); while (n) { if (n->GetType() == wxXML_TEXT_NODE || n->GetType() == wxXML_CDATA_SECTION_NODE) return n->GetContent(); n = n->GetNext(); } return wxEmptyString;}wxString wxXmlResourceHandler::GetParamValue(const wxString& param){ if (param.IsEmpty()) return GetNodeContent(m_node); else return GetNodeContent(GetParamNode(param));}wxSize wxXmlResourceHandler::GetSize(const wxString& param){ wxString s = GetParamValue(param); if (s.IsEmpty()) s = wxT("-1,-1"); bool is_dlg; long sx, sy; is_dlg = s[s.Length()-1] == wxT('d'); if (is_dlg) s.RemoveLast(); if (!s.BeforeFirst(wxT(',')).ToLong(&sx) || !s.AfterLast(wxT(',')).ToLong(&sy)) { wxLogError(_("Cannot parse coordinates from '%s'."), s.c_str()); return wxDefaultSize; } if (is_dlg) { if (m_instanceAsWindow) return wxDLG_UNIT(m_instanceAsWindow, wxSize(sx, sy)); else if (m_parentAsWindow) return wxDLG_UNIT(m_parentAsWindow, wxSize(sx, sy)); else { wxLogError(_("Cannot convert dialog units: dialog unknown.")); return wxDefaultSize; } } else return wxSize(sx, sy);}wxPoint wxXmlResourceHandler::GetPosition(const wxString& param){ wxSize sz = GetSize(param); return wxPoint(sz.x, sz.y);}wxCoord wxXmlResourceHandler::GetDimension(const wxString& param, wxCoord defaultv){ wxString s = GetParamValue(param); if (s.IsEmpty()) return defaultv; bool is_dlg; long sx; is_dlg = s[s.Length()-1] == wxT('d'); if (is_dlg) s.RemoveLast(); if (!s.ToLong(&sx)) { wxLogError(_("Cannot parse dimension from '%s'."), s.c_str()); return defaultv; } if (is_dlg) { if (m_instanceAsWindow) return wxDLG_UNIT(m_instanceAsWindow, wxSize(sx, 0)).x; else if (m_parentAsWindow) return wxDLG_UNIT(m_parentAsWindow, wxSize(sx, 0)).x; else { wxLogError(_("Cannot convert dialog units: dialog unknown.")); return defaultv; } } else return sx;}wxFont wxXmlResourceHandler::GetFont(const wxString& param){ wxXmlNode *font_node = GetParamNode(param); if (font_node == NULL) { wxLogError(_("Cannot find font node '%s'."), param.c_str()); return wxNullFont; } wxXmlNode *oldnode = m_node; m_node = font_node; long size = GetLong(wxT("size"), 12); wxString style = GetParamValue(wxT("style")); wxString weight = GetParamValue(wxT("weight")); int istyle = wxNORMAL, iweight = wxNORMAL; if (style == wxT("italic")) istyle = wxITALIC; else if (style == wxT("slant")) istyle = wxSLANT; if (weight == wxT("bold")) iweight = wxBOLD; else if (weight == wxT("light")) iweight = wxLIGHT; wxString family = GetParamValue(wxT("family")); int ifamily = wxDEFAULT; if (family == wxT("decorative")) ifamily = wxDECORATIVE; else if (family == wxT("roman")) ifamily = wxROMAN; else if (family == wxT("script")) ifamily = wxSCRIPT; else if (family == wxT("swiss")) ifamily = wxSWISS; else if (family == wxT("modern")) ifamily = wxMODERN; bool underlined = GetBool(wxT("underlined"), FALSE); wxString encoding = GetParamValue(wxT("encoding")); wxFontMapper mapper; wxFontEncoding enc = wxFONTENCODING_DEFAULT; if (!encoding.IsEmpty()) enc = mapper.CharsetToEncoding(encoding); if (enc == wxFONTENCODING_SYSTEM) enc = wxFONTENCODING_DEFAULT; wxString faces = GetParamValue(wxT("face")); wxString facename = wxEmptyString; wxFontEnumerator enu; enu.EnumerateFacenames(); wxStringTokenizer tk(faces, wxT(",")); while (tk.HasMoreTokens()) { int index = enu.GetFacenames()->Index(tk.GetNextToken(), FALSE); if (index != wxNOT_FOUND) { facename = (*enu.GetFacenames())[index]; break; } } m_node = oldnode; wxFont font(size, ifamily, istyle, iweight, underlined, facename, enc); return font;}void wxXmlResourceHandler::SetupWindow(wxWindow *wnd){ //FIXME : add cursor if (HasParam(wxT("exstyle"))) wnd->SetExtraStyle(GetStyle(wxT("exstyle"))); if (HasParam(wxT("bg"))) wnd->SetBackgroundColour(GetColour(wxT("bg"))); if (HasParam(wxT("fg"))) wnd->SetForegroundColour(GetColour(wxT("fg"))); if (GetBool(wxT("enabled"), 1) == 0) wnd->Enable(FALSE); if (GetBool(wxT("focused"), 0) == 1) wnd->SetFocus(); if (GetBool(wxT("hidden"), 0) == 1) wnd->Show(FALSE);#if wxUSE_TOOLTIPS if (HasParam(wxT("tooltip"))) wnd->SetToolTip(GetText(wxT("tooltip")));#endif if (HasParam(wxT("font"))) wnd->SetFont(GetFont());}void wxXmlResourceHandler::CreateChildren(wxObject *parent, bool this_hnd_only){ wxXmlNode *n = m_node->GetChildren(); while (n) { if (n->GetType() == wxXML_ELEMENT_NODE && (n->GetName() == wxT("object") || n->GetName() == wxT("object_ref"))) { m_resource->CreateResFromNode2(n, parent, NULL, this_hnd_only ? this : NULL); } n = n->GetNext(); }}void wxXmlResourceHandler::CreateChildrenPrivately(wxObject *parent, wxXmlNode *rootnode){ wxXmlNode *root; if (rootnode == NULL) root = m_node; else root = rootnode; wxXmlNode *n = root->GetChildren(); while (n) { if (n->GetType() == wxXML_ELEMENT_NODE && CanHandle(n)) { CreateResource(n, parent, NULL); } n = n->GetNext(); }}// --------------- XRCID implementation -----------------------------#define XRCID_TABLE_SIZE 1024struct XRCID_record{ int id; wxChar *key; XRCID_record *next;};static XRCID_record *XRCID_Records[XRCID_TABLE_SIZE] = {NULL};static int XRCID_Lookup(const wxChar *str_id, int value_if_not_found = -2){ static int XRCID_LastID = wxID_HIGHEST; int index = 0; for (const wxChar *c = str_id; *c != wxT('\0'); c++) index += (int)*c; index %= XRCID_TABLE_SIZE; XRCID_record *oldrec = NULL; int matchcnt = 0; for (XRCID_record *rec = XRCID_Records[index]; rec; rec = rec->next) { if (wxStrcmp(rec->key, str_id) == 0) { return rec->id; } matchcnt++; 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)->next = NULL; wxChar *end; if (value_if_not_found != -2) (*rec_var)->id = value_if_not_found; else { int asint = wxStrtol(str_id, &end, 10); if (*str_id && *end == 0) { // if str_id was integer, keep it verbosely: (*rec_var)->id = asint; } else { (*rec_var)->id = ++XRCID_LastID; } } return (*rec_var)->id;}/*static*/ int wxXmlResource::GetXRCID(const wxChar *str_id){ return XRCID_Lookup(str_id);}static void CleanXRCID_Record(XRCID_record *rec){ if (rec) { CleanXRCID_Record(rec->next); free(rec->key); delete rec; }}static void CleanXRCID_Records(){ for (int i = 0; i < XRCID_TABLE_SIZE; i++) { CleanXRCID_Record(XRCID_Records[i]); XRCID_Records[i] = NULL; }}static void AddStdXRCID_Records(){#define stdID(id) XRCID_Lookup(wxT(#id), id) stdID(-1); stdID(wxID_OPEN); stdID(wxID_CLOSE); stdID(wxID_NEW); stdID(wxID_SAVE); stdID(wxID_SAVEAS); stdID(wxID_REVERT); stdID(wxID_EXIT); stdID(wxID_UNDO); stdID(wxID_REDO); stdID(wxID_HELP); stdID(wxID_PRINT); stdID(wxID_PRINT_SETUP); stdID(wxID_PREVIEW); stdID(wxID_ABOUT); stdID(wxID_HELP_CONTENTS); stdID(wxID_HELP_COMMANDS); stdID(wxID_HELP_PROCEDURES); stdID(wxID_CUT); stdID(wxID_COPY); stdID(wxID_PASTE); stdID(wxID_CLEAR); stdID(wxID_FIND); stdID(wxID_DUPLICATE); stdID(wxID_SELECTALL); stdID(wxID_OK); stdID(wxID_CANCEL); stdID(wxID_APPLY); stdID(wxID_YES); stdID(wxID_NO); stdID(wxID_STATIC); stdID(wxID_FORWARD); stdID(wxID_BACKWARD); stdID(wxID_DEFAULT); stdID(wxID_MORE); stdID(wxID_SETUP); stdID(wxID_RESET); stdID(wxID_HELP_CONTEXT); stdID(wxID_CLOSE_ALL);#undef stdID}// --------------- module and globals -----------------------------class wxXmlResourceModule: public wxModule{DECLARE_DYNAMIC_CLASS(wxXmlResourceModule)public: wxXmlResourceModule() {} bool OnInit() { AddStdXRCID_Records(); wxXmlResource::AddSubclassFactory(new wxXmlSubclassFactoryCXX); return TRUE; } void OnExit() { delete wxXmlResource::Set(NULL); CleanXRCID_Records(); }};IMPLEMENT_DYNAMIC_CLASS(wxXmlResourceModule, wxModule)// When wxXml is loaded dynamically after the application is already running// then the built-in module system won't pick this one up. Add it manually.void wxXmlInitResourceModule(){ wxModule* module = new wxXmlResourceModule; module->Init(); wxModule::RegisterModule(module);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -