📄 resource.cpp
字号:
// Further keywords/attributes to follow sometime... if (expr->Number() == 0) { // item->SetType(wxRESOURCE_TYPE_SEPARATOR); item->SetType(wxT("wxMenuSeparator")); return item; } else { // item->SetType(wxTYPE_MENU); // Well, menu item, but doesn't matter. item->SetType(wxT("wxMenu")); // Well, menu item, but doesn't matter. if (labelExpr) { wxString str(labelExpr->StringValue()); item->SetTitle(str); } if (idExpr) { int id = 0; // If a string or word, must look up in identifier table. if ((idExpr->Type() == PrologString) || (idExpr->Type() == PrologWord)) { wxString str(idExpr->StringValue()); id = wxResourceGetIdentifier(str, &table); if (id == 0) { wxLogWarning(_("Could not resolve menu id '%s'. Use (non-zero) integer instead\nor provide #define (see manual for caveats)"), (const wxChar*) idExpr->StringValue()); } } else if (idExpr->Type() == PrologInteger) id = (int)idExpr->IntegerValue(); item->SetValue1(id); } if (helpExpr) { wxString str(helpExpr->StringValue()); item->SetValue4(str); } if (checkableExpr) item->SetValue2(checkableExpr->IntegerValue()); // Find the first expression that's a list, for submenu wxExpr *subMenuExpr = expr->GetFirst(); while (subMenuExpr && (subMenuExpr->Type() != PrologList)) subMenuExpr = subMenuExpr->GetNext(); while (subMenuExpr) { wxItemResource *child = wxResourceInterpretMenuItem(table, subMenuExpr); item->GetChildren().Append(child); subMenuExpr = subMenuExpr->GetNext(); } } return item;}/** Interpret a nested list as a menu*//*wxItemResource *wxResourceInterpretMenu1(wxResourceTable& table, wxExpr *expr){wxItemResource *menu = new wxItemResource;// menu->SetType(wxTYPE_MENU);menu->SetType("wxMenu");wxExpr *element = expr->GetFirst();while (element){wxItemResource *item = wxResourceInterpretMenuItem(table, element);if (item)menu->GetChildren().Append(item);element = element->GetNext();}return menu;}*/wxItemResource *wxResourceInterpretMenu(wxResourceTable& table, wxExpr *expr){ wxExpr *listExpr = (wxExpr *) NULL; expr->GetAttributeValue(wxT("menu"), &listExpr); if (!listExpr) return (wxItemResource *) NULL; wxItemResource *menuResource = wxResourceInterpretMenuItem(table, listExpr); if (!menuResource) return (wxItemResource *) NULL; wxString name; if (expr->GetAttributeValue(wxT("name"), name)) { menuResource->SetName(name); } return menuResource;}wxItemResource *wxResourceInterpretMenuBar(wxResourceTable& table, wxExpr *expr){ wxExpr *listExpr = (wxExpr *) NULL; expr->GetAttributeValue(wxT("menu"), &listExpr); if (!listExpr) return (wxItemResource *) NULL; wxItemResource *resource = new wxItemResource; resource->SetType(wxT("wxMenu")); // resource->SetType(wxTYPE_MENU); wxExpr *element = listExpr->GetFirst(); while (element) { wxItemResource *menuResource = wxResourceInterpretMenuItem(table, listExpr); resource->GetChildren().Append(menuResource); element = element->GetNext(); } wxString name; if (expr->GetAttributeValue(wxT("name"), name)) { resource->SetName(name); } return resource;}wxItemResource *wxResourceInterpretString(wxResourceTable& WXUNUSED(table), wxExpr *WXUNUSED(expr)){ return (wxItemResource *) NULL;}wxItemResource *wxResourceInterpretBitmap(wxResourceTable& WXUNUSED(table), wxExpr *expr){ wxItemResource *bitmapItem = new wxItemResource; // bitmapItem->SetType(wxTYPE_BITMAP); bitmapItem->SetType(wxT("wxBitmap")); wxString name; if (expr->GetAttributeValue(wxT("name"), name)) { bitmapItem->SetName(name); } // Now parse all bitmap specifications wxExpr *bitmapExpr = expr->GetFirst(); while (bitmapExpr) { if (bitmapExpr->Number() == 3) { wxString bitmapKeyword(bitmapExpr->Nth(1)->StringValue()); if (bitmapKeyword == wxT("bitmap") || bitmapKeyword == wxT("icon")) { // The value part: always a list. wxExpr *listExpr = bitmapExpr->Nth(2); if (listExpr->Type() == PrologList) { wxItemResource *bitmapSpec = new wxItemResource; // bitmapSpec->SetType(wxTYPE_BITMAP); bitmapSpec->SetType(wxT("wxBitmap")); // List is of form: [filename, bitmaptype, platform, colours, xresolution, yresolution] // where everything after 'filename' is optional. wxExpr *nameExpr = listExpr->Nth(0); wxExpr *typeExpr = listExpr->Nth(1); wxExpr *platformExpr = listExpr->Nth(2); wxExpr *coloursExpr = listExpr->Nth(3); wxExpr *xresExpr = listExpr->Nth(4); wxExpr *yresExpr = listExpr->Nth(5); if (nameExpr && !nameExpr->StringValue().empty()) { bitmapSpec->SetName(nameExpr->StringValue()); } if (typeExpr && !typeExpr->StringValue().empty()) { bitmapSpec->SetValue1(wxParseWindowStyle(typeExpr->StringValue())); } else bitmapSpec->SetValue1(0); if (platformExpr && !platformExpr->StringValue().empty()) { wxString plat(platformExpr->StringValue()); if (plat == wxT("windows") || plat == wxT("WINDOWS")) bitmapSpec->SetValue2(RESOURCE_PLATFORM_WINDOWS); else if (plat == wxT("x") || plat == wxT("X")) bitmapSpec->SetValue2(RESOURCE_PLATFORM_X); else if (plat == wxT("mac") || plat == wxT("MAC")) bitmapSpec->SetValue2(RESOURCE_PLATFORM_MAC); else bitmapSpec->SetValue2(RESOURCE_PLATFORM_ANY); } else bitmapSpec->SetValue2(RESOURCE_PLATFORM_ANY); if (coloursExpr) bitmapSpec->SetValue3(coloursExpr->IntegerValue()); int xres = 0; int yres = 0; if (xresExpr) xres = (int)xresExpr->IntegerValue(); if (yresExpr) yres = (int)yresExpr->IntegerValue(); bitmapSpec->SetSize(0, 0, xres, yres); bitmapItem->GetChildren().Append(bitmapSpec); } } } bitmapExpr = bitmapExpr->GetNext(); } return bitmapItem;}wxItemResource *wxResourceInterpretIcon(wxResourceTable& table, wxExpr *expr){ wxItemResource *item = wxResourceInterpretBitmap(table, expr); if (item) { // item->SetType(wxTYPE_ICON); item->SetType(wxT("wxIcon")); return item; } else return (wxItemResource *) NULL;}// Interpret list expression as a fontwxFont wxResourceInterpretFontSpec(wxExpr *expr){ if (expr->Type() != PrologList) return wxNullFont; int point = 10; int family = wxSWISS; int style = wxNORMAL; int weight = wxNORMAL; int underline = 0; wxString faceName; wxExpr *pointExpr = expr->Nth(0); wxExpr *familyExpr = expr->Nth(1); wxExpr *styleExpr = expr->Nth(2); wxExpr *weightExpr = expr->Nth(3); wxExpr *underlineExpr = expr->Nth(4); wxExpr *faceNameExpr = expr->Nth(5); if (pointExpr) point = (int)pointExpr->IntegerValue(); wxString str; if (familyExpr) { str = familyExpr->StringValue(); family = (int)wxParseWindowStyle(str); } if (styleExpr) { str = styleExpr->StringValue(); style = (int)wxParseWindowStyle(str); } if (weightExpr) { str = weightExpr->StringValue(); weight = (int)wxParseWindowStyle(str); } if (underlineExpr) underline = (int)underlineExpr->IntegerValue(); if (faceNameExpr) faceName = faceNameExpr->StringValue(); return *wxTheFontList->FindOrCreateFont(point, family, style, weight, (underline != 0), faceName);}/** (Re)allocate buffer for reading in from resource file*/bool wxReallocateResourceBuffer(){ if (!wxResourceBuffer) { wxResourceBufferSize = 1000; wxResourceBuffer = new char[wxResourceBufferSize]; return true; } if (wxResourceBuffer) { long newSize = wxResourceBufferSize + 1000; char *tmp = new char[(int)newSize]; strncpy(tmp, wxResourceBuffer, (int)wxResourceBufferCount); delete[] wxResourceBuffer; wxResourceBuffer = tmp; wxResourceBufferSize = newSize; } return true;}static bool wxEatWhiteSpace(FILE *fd){ int ch; while ((ch = getc(fd)) != EOF) { switch (ch) { case ' ': case 0x0a: case 0x0d: case 0x09: break; case '/': { int prev_ch = ch; ch = getc(fd); if (ch == EOF) { ungetc(prev_ch, fd); return true; } if (ch == '*') { // Eat C comment prev_ch = 0; while ((ch = getc(fd)) != EOF) { if (ch == '/' && prev_ch == '*') break; prev_ch = ch; } } else if (ch == '/') { // Eat C++ comment static char buffer[255]; fgets(buffer, 255, fd); } else { ungetc(prev_ch, fd); ungetc(ch, fd); return true; } } break; default: ungetc(ch, fd); return true; } } return false;}static bool wxEatWhiteSpace(wxInputStream *is){ char ch = is->GetC() ; if ((ch != ' ') && (ch != '/') && (ch != ' ') && (ch != 10) && (ch != 13) && (ch != 9)) { is->Ungetch(ch); return true; } // Eat whitespace while (ch == ' ' || ch == 10 || ch == 13 || ch == 9) ch = is->GetC(); // Check for comment if (ch == '/') { ch = is->GetC(); if (ch == '*') { bool finished = false; while (!finished) { ch = is->GetC(); if (is->LastRead() == 0) return false; if (ch == '*') { int newCh = is->GetC(); if (newCh == '/') finished = true; else { is->Ungetch(ch); } } } } else // False alarm return false; } else is->Ungetch(ch); return wxEatWhiteSpace(is);}bool wxGetResourceToken(FILE *fd){ if (!wxResourceBuffer) wxReallocateResourceBuffer(); wxResourceBuffer[0] = 0; wxEatWhiteSpace(fd); int ch = getc(fd); if (ch == '"') { // Get string wxResourceBufferCount = 0; ch = getc(fd); while (ch != '"') { int actualCh = ch; if (ch == EOF) { wxResourceBuffer[wxResourceBufferCount] = 0; return false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -