xmlres.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 1,711 行 · 第 1/4 页
CPP
1,711 行
// font attributes:
// size
int isize = wxDEFAULT;
bool hasSize = HasParam(wxT("size"));
if (hasSize)
isize = GetLong(wxT("size"), wxDEFAULT);
// style
int istyle = wxNORMAL;
bool hasStyle = HasParam(wxT("style"));
if (hasStyle)
{
wxString style = GetParamValue(wxT("style"));
if (style == wxT("italic"))
istyle = wxITALIC;
else if (style == wxT("slant"))
istyle = wxSLANT;
}
// weight
int iweight = wxNORMAL;
bool hasWeight = HasParam(wxT("weight"));
if (hasWeight)
{
wxString weight = GetParamValue(wxT("weight"));
if (weight == wxT("bold"))
iweight = wxBOLD;
else if (weight == wxT("light"))
iweight = wxLIGHT;
}
// underline
bool hasUnderlined = HasParam(wxT("underlined"));
bool underlined = hasUnderlined ? GetBool(wxT("underlined"), false) : false;
// family and facename
int ifamily = wxDEFAULT;
bool hasFamily = HasParam(wxT("family"));
if (hasFamily)
{
wxString family = GetParamValue(wxT("family"));
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;
else if (family == wxT("teletype")) ifamily = wxTELETYPE;
}
wxString facename;
bool hasFacename = HasParam(wxT("face"));
if (hasFacename)
{
wxString faces = GetParamValue(wxT("face"));
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;
}
}
}
// encoding
wxFontEncoding enc = wxFONTENCODING_DEFAULT;
bool hasEncoding = HasParam(wxT("encoding"));
if (hasEncoding)
{
wxString encoding = GetParamValue(wxT("encoding"));
wxFontMapper mapper;
if (!encoding.empty())
enc = mapper.CharsetToEncoding(encoding);
if (enc == wxFONTENCODING_SYSTEM)
enc = wxFONTENCODING_DEFAULT;
}
// is this font based on a system font?
wxFont sysfont = GetSystemFont(GetParamValue(wxT("sysfont")));
if (sysfont.Ok())
{
if (hasSize)
sysfont.SetPointSize(isize);
else if (HasParam(wxT("relativesize")))
sysfont.SetPointSize(int(sysfont.GetPointSize() *
GetFloat(wxT("relativesize"))));
if (hasStyle)
sysfont.SetStyle(istyle);
if (hasWeight)
sysfont.SetWeight(iweight);
if (hasUnderlined)
sysfont.SetUnderlined(underlined);
if (hasFamily)
sysfont.SetFamily(ifamily);
if (hasFacename)
sysfont.SetFaceName(facename);
if (hasEncoding)
sysfont.SetDefaultEncoding(enc);
m_node = oldnode;
return sysfont;
}
m_node = oldnode;
return wxFont(isize, ifamily, istyle, iweight,
underlined, facename, enc);
}
void wxXmlResourceHandler::SetupWindow(wxWindow *wnd)
{
//FIXME : add cursor
if (HasParam(wxT("exstyle")))
// Have to OR it with existing style, since
// some implementations (e.g. wxGTK) use the extra style
// during creation
wnd->SetExtraStyle(wnd->GetExtraStyle() | 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());
if (HasParam(wxT("help")))
wnd->SetHelpText(GetText(wxT("help")));
}
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->CreateResFromNode(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 1024
struct 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)
{
int index = 0;
for (const wxChar *c = str_id; *c != wxT('\0'); c++) index += (int)*c;
index %= XRCID_TABLE_SIZE;
XRCID_record *oldrec = NULL;
for (XRCID_record *rec = XRCID_Records[index]; rec; rec = rec->next)
{
if (wxStrcmp(rec->key, str_id) == 0)
{
return rec->id;
}
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 = wxNewId();
}
}
return (*rec_var)->id;
}
static void AddStdXRCID_Records();
/*static*/ int wxXmlResource::GetXRCID(const wxChar *str_id)
{
static bool s_stdIDsAdded = false;
if ( !s_stdIDsAdded )
{
s_stdIDsAdded = true;
AddStdXRCID_Records();
}
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_ANY);
stdID(wxID_SEPARATOR);
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_HELP_CONTEXT);
stdID(wxID_CLOSE_ALL);
stdID(wxID_PREFERENCES);
stdID(wxID_CUT);
stdID(wxID_COPY);
stdID(wxID_PASTE);
stdID(wxID_CLEAR);
stdID(wxID_FIND);
stdID(wxID_DUPLICATE);
stdID(wxID_SELECTALL);
stdID(wxID_DELETE);
stdID(wxID_REPLACE);
stdID(wxID_REPLACE_ALL);
stdID(wxID_PROPERTIES);
stdID(wxID_VIEW_DETAILS);
stdID(wxID_VIEW_LARGEICONS);
stdID(wxID_VIEW_SMALLICONS);
stdID(wxID_VIEW_LIST);
stdID(wxID_VIEW_SORTDATE);
stdID(wxID_VIEW_SORTNAME);
stdID(wxID_VIEW_SORTSIZE);
stdID(wxID_VIEW_SORTTYPE);
stdID(wxID_FILE1);
stdID(wxID_FILE2);
stdID(wxID_FILE3);
stdID(wxID_FILE4);
stdID(wxID_FILE5);
stdID(wxID_FILE6);
stdID(wxID_FILE7);
stdID(wxID_FILE8);
stdID(wxID_FILE9);
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_CONTEXT_HELP);
stdID(wxID_YESTOALL);
stdID(wxID_NOTOALL);
stdID(wxID_ABORT);
stdID(wxID_RETRY);
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);
stdID(wxID_JUSTIFY_FILL);
stdID(wxID_JUSTIFY_RIGHT);
stdID(wxID_JUSTIFY_LEFT);
stdID(wxID_UNDERLINE);
stdID(wxID_INDENT);
stdID(wxID_UNINDENT);
stdID(wxID_ZOOM_100);
stdID(wxID_ZOOM_FIT);
stdID(wxID_ZOOM_IN);
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);
#undef stdID
}
// --------------- module and globals -----------------------------
class wxXmlResourceModule: public wxModule
{
DECLARE_DYNAMIC_CLASS(wxXmlResourceModule)
public:
wxXmlResourceModule() {}
bool OnInit()
{
wxXmlResource::AddSubclassFactory(new wxXmlSubclassFactoryCXX);
return true;
}
void OnExit()
{
delete wxXmlResource::Set(NULL);
if(wxXmlResource::ms_subclassFactories)
WX_CLEAR_LIST(wxXmlSubclassFactoriesList, *wxXmlResource::ms_subclassFactories);
wxDELETE(wxXmlResource::ms_subclassFactories);
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);
}
#endif // wxUSE_XRC
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?