added XML resources library
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@7831 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
10
contrib/utils/Makefile.in
Normal file
10
contrib/utils/Makefile.in
Normal file
@@ -0,0 +1,10 @@
|
||||
# $Id$
|
||||
|
||||
CONTRIB_UTILS=wxrc wxrcedit
|
||||
|
||||
all:
|
||||
@for d in $(CONTRIB_UTILS); do (cd $$d && $(MAKE)); done
|
||||
|
||||
clean:
|
||||
@for d in $(CONTRIB_UTILS); do (cd $$d && $(MAKE) clean); done
|
||||
|
16
contrib/utils/wxrc/Makefile.in
Normal file
16
contrib/utils/wxrc/Makefile.in
Normal file
@@ -0,0 +1,16 @@
|
||||
# $Id$
|
||||
|
||||
top_srcdir = @top_srcdir@/..
|
||||
top_builddir = ../../..
|
||||
program_dir = contrib/utils/wxrc
|
||||
|
||||
PROGRAM=wxrc
|
||||
|
||||
OBJECTS=wxrc.o
|
||||
|
||||
|
||||
APPEXTRALIBS=$(top_builddir)/lib/libwxxml.@WX_TARGET_LIBRARY_TYPE@
|
||||
APPEXTRADEFS=-I$(top_srcdir)/contrib/include
|
||||
|
||||
include $(top_builddir)/src/makeprog.env
|
||||
|
292
contrib/utils/wxrc/wxrc.cpp
Normal file
292
contrib/utils/wxrc/wxrc.cpp
Normal file
@@ -0,0 +1,292 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: wxrc.cpp
|
||||
// Purpose: XML resource compiler
|
||||
// Author: Vaclav Slavik
|
||||
// Created: 2000/03/05
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2000 Vaclav Slavik
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
// for all others, include the necessary headers (this file is usually all you
|
||||
// need because it includes almost all "standard" wxWindows headers
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/wx.h"
|
||||
#endif
|
||||
|
||||
#include "wx/cmdline.h"
|
||||
#include "wx/xml/xml.h"
|
||||
#include "wx/ffile.h"
|
||||
|
||||
|
||||
#if wxUSE_GUI
|
||||
#error "You must compile the resource compiler with wxBase!"
|
||||
#endif
|
||||
|
||||
|
||||
class XmlResApp : public wxApp
|
||||
{
|
||||
public:
|
||||
virtual int OnRun();
|
||||
|
||||
private:
|
||||
|
||||
void ParseParams(const wxCmdLineParser& cmdline);
|
||||
void CompileRes();
|
||||
wxArrayString PrepareTempFiles();
|
||||
void DeleteTempFiles(const wxArrayString& flist);
|
||||
void MakePackageZIP(const wxArrayString& flist);
|
||||
void MakePackageCPP(const wxArrayString& flist);
|
||||
|
||||
bool flagVerbose, flagCPP, flagCompress;
|
||||
wxString parOutput, parFuncname, parOutputPath;
|
||||
wxArrayString parFiles;
|
||||
int retCode;
|
||||
};
|
||||
|
||||
IMPLEMENT_APP(XmlResApp)
|
||||
|
||||
int XmlResApp::OnRun()
|
||||
{
|
||||
static const wxCmdLineEntryDesc cmdLineDesc[] =
|
||||
{
|
||||
{ wxCMD_LINE_SWITCH, "v", "verbose", "be verbose" },
|
||||
{ wxCMD_LINE_SWITCH, "c", "cpp-code", "output C++ source rather than .rsc file" },
|
||||
{ wxCMD_LINE_SWITCH, "u", "uncompressed", "do not compress .xml files (C++ only)" },
|
||||
{ wxCMD_LINE_OPTION, "n", "function", "C++ function name (with -c) [InitXmlResource]" },
|
||||
{ wxCMD_LINE_OPTION, "o", "output", "output file [resource.rsc/cpp]" },
|
||||
{ wxCMD_LINE_OPTION, "h", "handlers", "output list of neccessary handlers to this file" },
|
||||
|
||||
{ wxCMD_LINE_PARAM, NULL, NULL, "input file",
|
||||
wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE },
|
||||
|
||||
{ wxCMD_LINE_NONE }
|
||||
};
|
||||
|
||||
wxCmdLineParser parser(cmdLineDesc, argc, argv);
|
||||
|
||||
switch (parser.Parse())
|
||||
{
|
||||
case -1:
|
||||
return 0;
|
||||
break;
|
||||
|
||||
case 0:
|
||||
retCode = 0;
|
||||
ParseParams(parser);
|
||||
CompileRes();
|
||||
return retCode;
|
||||
break;
|
||||
|
||||
default:
|
||||
return 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void XmlResApp::ParseParams(const wxCmdLineParser& cmdline)
|
||||
{
|
||||
flagVerbose = cmdline.Found("v");
|
||||
flagCPP = cmdline.Found("c");
|
||||
flagCompress = flagCPP && !cmdline.Found("u");
|
||||
|
||||
if (!cmdline.Found("o", &parOutput))
|
||||
parOutput = flagCPP ? "resource.cpp" : "resource.rsc";
|
||||
parOutputPath = wxPathOnly(parOutput);
|
||||
if (!parOutputPath) parOutputPath = ".";
|
||||
|
||||
if (!cmdline.Found("n", &parFuncname))
|
||||
parFuncname = "InitXmlResource";
|
||||
|
||||
for (size_t i = 0; i < cmdline.GetParamCount(); i++)
|
||||
parFiles.Add(cmdline.GetParam(i));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void XmlResApp::CompileRes()
|
||||
{
|
||||
wxArrayString files = PrepareTempFiles();
|
||||
|
||||
wxRemoveFile(parOutput);
|
||||
|
||||
printf("TODO: include bitmaps, list of handlers\n");
|
||||
|
||||
if (!retCode)
|
||||
{
|
||||
if (flagCPP)
|
||||
MakePackageCPP(files);
|
||||
else
|
||||
MakePackageZIP(files);
|
||||
}
|
||||
|
||||
DeleteTempFiles(files);
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxArrayString XmlResApp::PrepareTempFiles()
|
||||
{
|
||||
wxArrayString flist;
|
||||
|
||||
for (size_t i = 0; i < parFiles.Count(); i++)
|
||||
{
|
||||
if (flagVerbose)
|
||||
wxPrintf("processing " + parFiles[i] + "...\n");
|
||||
|
||||
wxXmlDocument doc;
|
||||
|
||||
if (!doc.Load(parFiles[i]))
|
||||
{
|
||||
wxLogError("Error parsing file " + parFiles[i]);
|
||||
retCode = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
wxString name, ext;
|
||||
wxSplitPath(parFiles[i], NULL, &name, &ext);
|
||||
|
||||
doc.Save(parOutputPath + "/" + name + ".xmb", flagCompress ? wxXML_IO_BINZ : wxXML_IO_BIN);
|
||||
flist.Add(name + ".xmb");
|
||||
}
|
||||
|
||||
return flist;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void XmlResApp::DeleteTempFiles(const wxArrayString& flist)
|
||||
{
|
||||
for (size_t i = 0; i < flist.Count(); i++)
|
||||
wxRemoveFile(parOutputPath + "/" + flist[i]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void XmlResApp::MakePackageZIP(const wxArrayString& flist)
|
||||
{
|
||||
wxString files;
|
||||
|
||||
for (size_t i = 0; i < flist.Count(); i++)
|
||||
files += flist[i] + " ";
|
||||
files.RemoveLast();
|
||||
|
||||
if (flagVerbose)
|
||||
wxPrintf("compressing " + parOutput + "...\n");
|
||||
|
||||
if (wxExecute("zip -9 -j " + wxString(flagVerbose ? "" : "-q ") +
|
||||
parOutput + " " + files, TRUE) == -1)
|
||||
{
|
||||
wxLogError("Unable to execute zip program. Make sure it is in the path.");
|
||||
wxLogError("You can download it at http://www.cdrom.com/pub/infozip/");
|
||||
retCode = 1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static wxString FileToCppArray(wxString filename, int num)
|
||||
{
|
||||
wxString output;
|
||||
wxString snum;
|
||||
wxString tmp;
|
||||
wxFFile file(filename, "rb");
|
||||
size_t lng = file.Length();
|
||||
|
||||
snum.Printf("%i", num);
|
||||
output.Printf("static size_t xml_res_size_" + snum + " = %i;\n", lng);
|
||||
output += "static unsigned char xml_res_file_" + snum + "[] = {";
|
||||
|
||||
unsigned char *buffer = new unsigned char[lng];
|
||||
file.Read(buffer, lng);
|
||||
|
||||
for (size_t i = 0; i < lng; i++)
|
||||
{
|
||||
if (i % 16 == 0) output += "\n";
|
||||
tmp.Printf("0x%02X", buffer[i]);
|
||||
output += tmp;
|
||||
if (i != lng-1) output += ",";
|
||||
}
|
||||
|
||||
delete[] buffer;
|
||||
|
||||
output += "\n};\n\n";
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
|
||||
void XmlResApp::MakePackageCPP(const wxArrayString& flist)
|
||||
{
|
||||
wxFFile file(parOutput, "wt");
|
||||
size_t i;
|
||||
|
||||
if (flagVerbose)
|
||||
wxPrintf("creating C++ source file " + parOutput + "...\n");
|
||||
|
||||
file.Write("\
|
||||
#include \"wx/wxprec.h\"\n\
|
||||
\n\
|
||||
#ifdef __BORLANDC__\n\
|
||||
#pragma hdrstop\n\
|
||||
#endif\n\
|
||||
\n\
|
||||
#ifndef WX_PRECOMP\n\
|
||||
#include \"wx/wx.h\"\n\
|
||||
#endif\n\
|
||||
\
|
||||
#include \"wx/filesys.h\"\n\
|
||||
#include \"wx/fs_mem.h\"\n\
|
||||
#include \"wx/xml/xmlres.h\"\n\
|
||||
#include \"wx/xml/xh_all.h\"\n\
|
||||
\n");
|
||||
|
||||
for (i = 0; i < flist.Count(); i++)
|
||||
file.Write(FileToCppArray(flist[i], i));
|
||||
|
||||
file.Write("\
|
||||
void " + parFuncname + "()\n\
|
||||
{\n\
|
||||
\n\
|
||||
// Check for memory FS. If not present, load the handler:\n\
|
||||
{\n\
|
||||
wxMemoryFSHandler::AddFile(\"xml_resource/dummy_file\", \"dummy one\");\n\
|
||||
wxFileSystem fsys;\n\
|
||||
wxFSFile *f = fsys.OpenFile(\"xml_resource/dummy_file\");\n\
|
||||
wxMemoryFSHandler::RemoveFile(\"xml_resource/dummy_file\");\n\
|
||||
if (f) delete f;\n\
|
||||
else wxFileSystem::AddHandler(new wxMemoryFSHandler);\n\
|
||||
}\n\
|
||||
\n");
|
||||
|
||||
for (i = 0; i < flist.Count(); i++)
|
||||
{
|
||||
wxString s;
|
||||
s.Printf(" wxMemoryFSHandler::AddFile(\"xml_resource/" + flist[i] +
|
||||
"\", xml_res_file_%i, xml_res_size_%i);\n"
|
||||
" wxTheXmlResource->Read(\"xml_resource/" + flist[i] +
|
||||
"\", wxXML_BINARY);\n", i, i);
|
||||
file.Write(s);
|
||||
}
|
||||
|
||||
file.Write("\n}\n");
|
||||
|
||||
}
|
23
contrib/utils/wxrcedit/Makefile.in
Normal file
23
contrib/utils/wxrcedit/Makefile.in
Normal file
@@ -0,0 +1,23 @@
|
||||
# $Id$
|
||||
|
||||
top_srcdir = @top_srcdir@/..
|
||||
top_builddir = ../../..
|
||||
program_dir = contrib/utils/wxrcedit
|
||||
|
||||
PROGRAM=wxrcedit
|
||||
|
||||
OBJECTS=edapp.o editor.o nodehnd.o prophnd.o xmlhelpr.o
|
||||
|
||||
DATADIRS = df
|
||||
DATAFILES = df/boxsizer.df df/break.df df/button.df df/checkbox.df \
|
||||
df/control.df df/dialog.df df/gauge.df df/htmlwindow.df \
|
||||
df/menu.df df/menu_item.df df/menubar.df df/menuitem.df \
|
||||
df/panel.df df/panel_item.df df/panelbase.df df/radiobutton.df \
|
||||
df/separator.df df/sizer_item.df df/sizeritem.df df/slider.df \
|
||||
df/spacer.df df/staticbitmap.df df/staticboxsizer.df \
|
||||
df/statictext.df df/textctrl.df df/toolbar_item.df df/window.df
|
||||
|
||||
APPEXTRALIBS=$(top_builddir)/lib/libwxxml.@WX_TARGET_LIBRARY_TYPE@
|
||||
APPEXTRADEFS=-I$(top_srcdir)/contrib/include
|
||||
|
||||
include $(top_builddir)/src/makeprog.env
|
33
contrib/utils/wxrcedit/bitmaps/close.xpm
Normal file
33
contrib/utils/wxrcedit/bitmaps/close.xpm
Normal file
@@ -0,0 +1,33 @@
|
||||
/* XPM */
|
||||
static char *close_xpm[] = {
|
||||
/* width height num_colors chars_per_pixel */
|
||||
" 24 24 2 1",
|
||||
/* colors */
|
||||
". c #000000",
|
||||
"# c none",
|
||||
/* pixels */
|
||||
"########################",
|
||||
"########################",
|
||||
"########################",
|
||||
"########################",
|
||||
"########################",
|
||||
"########################",
|
||||
"#######.####..##########",
|
||||
"#######..##....#########",
|
||||
"########..#...##########",
|
||||
"########.....###########",
|
||||
"#########...############",
|
||||
"#########....###########",
|
||||
"########......##########",
|
||||
"########..#....#########",
|
||||
"#######..###....########",
|
||||
"#######.#####..#########",
|
||||
"########################",
|
||||
"########################",
|
||||
"########################",
|
||||
"########################",
|
||||
"########################",
|
||||
"########################",
|
||||
"########################",
|
||||
"########################"
|
||||
};
|
21
contrib/utils/wxrcedit/bitmaps/control.xpm
Normal file
21
contrib/utils/wxrcedit/bitmaps/control.xpm
Normal file
@@ -0,0 +1,21 @@
|
||||
/* XPM */
|
||||
static char * control_xpm[] = {
|
||||
"16 14 4 1",
|
||||
" c None",
|
||||
". c #008000",
|
||||
"+ c #FFFFFF",
|
||||
"@ c #7F7F7F",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ... ",
|
||||
" .++.. ",
|
||||
" .++..@ ",
|
||||
" .....@ ",
|
||||
" ...@@ ",
|
||||
" @@@ ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" "};
|
22
contrib/utils/wxrcedit/bitmaps/hsizer.xpm
Normal file
22
contrib/utils/wxrcedit/bitmaps/hsizer.xpm
Normal file
@@ -0,0 +1,22 @@
|
||||
/* XPM */
|
||||
static char * hsizer_xpm[] = {
|
||||
"16 16 3 1",
|
||||
" c None",
|
||||
". c #000000",
|
||||
"+ c #FF0000",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" . . ",
|
||||
" .. .. ",
|
||||
" ..+......+.. ",
|
||||
" ..++++++++++.. ",
|
||||
"..++++++++++++..",
|
||||
" ..++++++++++.. ",
|
||||
" ..+......+.. ",
|
||||
" .. .. ",
|
||||
" . . ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" "};
|
229
contrib/utils/wxrcedit/bitmaps/open.xpm
Normal file
229
contrib/utils/wxrcedit/bitmaps/open.xpm
Normal file
@@ -0,0 +1,229 @@
|
||||
/* XPM */
|
||||
static char * open_xpm[] = {
|
||||
"24 24 202 2",
|
||||
" c None",
|
||||
". c #020202",
|
||||
"+ c #5A5226",
|
||||
"@ c #9A8A46",
|
||||
"# c #C6AE52",
|
||||
"$ c #EEDE7E",
|
||||
"% c #FEB26A",
|
||||
"& c #06060A",
|
||||
"* c #B6AE7A",
|
||||
"= c #CEA272",
|
||||
"- c #E2D27E",
|
||||
"; c #FEDEA2",
|
||||
"> c #7A6E4E",
|
||||
", c #BEAA56",
|
||||
"' c #1E1E22",
|
||||
") c #826A4E",
|
||||
"! c #FEDEA6",
|
||||
"~ c #F6F6F2",
|
||||
"{ c #9A7E5A",
|
||||
"] c #C2BE86",
|
||||
"^ c #3E3A2A",
|
||||
"/ c #7E5E3A",
|
||||
"( c #EADA82",
|
||||
"_ c #FEDEAE",
|
||||
": c #FEBE7A",
|
||||
"< c #BABAB6",
|
||||
"[ c #7E7E7E",
|
||||
"} c #625A3A",
|
||||
"| c #E2DA9A",
|
||||
"1 c #322212",
|
||||
"2 c #D2BA5A",
|
||||
"3 c #9E9E9E",
|
||||
"4 c #9E7A52",
|
||||
"5 c #EAEAE6",
|
||||
"6 c #969262",
|
||||
"7 c #AEAEAA",
|
||||
"8 c #826E52",
|
||||
"9 c #FED69A",
|
||||
"0 c #DEBE8A",
|
||||
"a c #DEB67E",
|
||||
"b c #9E8A66",
|
||||
"c c #6E5A42",
|
||||
"d c #C2C2BE",
|
||||
"e c #32322E",
|
||||
"f c #EEA256",
|
||||
"g c #664226",
|
||||
"h c #BEA67A",
|
||||
"i c #8A8A8A",
|
||||
"j c #969692",
|
||||
"k c #C68246",
|
||||
"l c #CECECA",
|
||||
"m c #7A7256",
|
||||
"n c #DEDEDE",
|
||||
"o c #362E22",
|
||||
"p c #6E563A",
|
||||
"q c #A66A3A",
|
||||
"r c #625E4A",
|
||||
"s c #DADAD6",
|
||||
"t c #4A4A4A",
|
||||
"u c #FEC282",
|
||||
"v c #D2BE6A",
|
||||
"w c #464646",
|
||||
"x c #363636",
|
||||
"y c #A6A6A2",
|
||||
"z c #6E6E72",
|
||||
"A c #666666",
|
||||
"B c #261A12",
|
||||
"C c #B6B6B2",
|
||||
"D c #FECE92",
|
||||
"E c #4E3A2A",
|
||||
"F c #DECA6A",
|
||||
"G c #DEAE76",
|
||||
"H c #2A2A26",
|
||||
"I c #CACAC6",
|
||||
"J c #3E2A1A",
|
||||
"K c #5E4A3A",
|
||||
"L c #F2F2EE",
|
||||
"M c #929292",
|
||||
"N c #767676",
|
||||
"O c #5A5242",
|
||||
"P c #EEE692",
|
||||
"Q c #D2D2CE",
|
||||
"R c #766A3E",
|
||||
"S c #3E2E1A",
|
||||
"T c #E6E6E6",
|
||||
"U c #FAFAFA",
|
||||
"V c #121212",
|
||||
"W c #5A5A56",
|
||||
"X c #EEE69A",
|
||||
"Y c #968A4E",
|
||||
"Z c #3E321E",
|
||||
"` c #867642",
|
||||
" . c #FEC686",
|
||||
".. c #423626",
|
||||
"+. c #3E3E3E",
|
||||
"@. c #4E4E52",
|
||||
"#. c #A69246",
|
||||
"$. c #4A3E36",
|
||||
"%. c #6E5E3A",
|
||||
"&. c #E2E2E2",
|
||||
"*. c #5E5E5A",
|
||||
"=. c #565246",
|
||||
"-. c #BEBEBA",
|
||||
";. c #DAC666",
|
||||
">. c #4E422A",
|
||||
",. c #E2D272",
|
||||
"'. c #8E8E8A",
|
||||
"). c #D6D6D2",
|
||||
"!. c #AAAAA6",
|
||||
"~. c #C6C6C6",
|
||||
"{. c #FEBA76",
|
||||
"]. c #868686",
|
||||
"^. c #969266",
|
||||
"/. c #F6AA62",
|
||||
"(. c #9A9A96",
|
||||
"_. c #5A523A",
|
||||
":. c #5E5236",
|
||||
"<. c #525252",
|
||||
"[. c #A2A29E",
|
||||
"}. c #7A7A76",
|
||||
"|. c #FEFEFE",
|
||||
"1. c #7E6A4E",
|
||||
"2. c #FEDA9E",
|
||||
"3. c #EADE8E",
|
||||
"4. c #EEEEEA",
|
||||
"5. c #42321E",
|
||||
"6. c #7E7672",
|
||||
"7. c #FED296",
|
||||
"8. c #2E2E2E",
|
||||
"9. c #F2EA96",
|
||||
"0. c #826E56",
|
||||
"a. c #7E6A42",
|
||||
"b. c #FECA8A",
|
||||
"c. c #3E3226",
|
||||
"d. c #5E5E5E",
|
||||
"e. c #82764E",
|
||||
"f. c #4E4236",
|
||||
"g. c #626262",
|
||||
"h. c #020206",
|
||||
"i. c #423A2E",
|
||||
"j. c #422E1A",
|
||||
"k. c #CEA672",
|
||||
"l. c #7E6242",
|
||||
"m. c #727272",
|
||||
"n. c #6A6A6E",
|
||||
"o. c #CACACA",
|
||||
"p. c #F2F2F6",
|
||||
"q. c #C6C286",
|
||||
"r. c #828286",
|
||||
"s. c #F2EAA2",
|
||||
"t. c #5A564A",
|
||||
"u. c #565656",
|
||||
"v. c #AEAEAE",
|
||||
"w. c #EEE696",
|
||||
"x. c #8E8E92",
|
||||
"y. c #7A7A7E",
|
||||
"z. c #FEDAA6",
|
||||
"A. c #423226",
|
||||
"B. c #B6B6B6",
|
||||
"C. c #AAAAAA",
|
||||
"D. c #BABABA",
|
||||
"E. c #DADADA",
|
||||
"F. c #422A16",
|
||||
"G. c #F2E68E",
|
||||
"H. c #16120E",
|
||||
"I. c #DEC666",
|
||||
"J. c #EAEAEA",
|
||||
"K. c #969696",
|
||||
"L. c #CECECE",
|
||||
"M. c #BEBEBE",
|
||||
"N. c #F6F6F6",
|
||||
"O. c #F2F2F2",
|
||||
"P. c #C2C2C2",
|
||||
"Q. c #42362A",
|
||||
"R. c #FECA8E",
|
||||
"S. c #8A8A8E",
|
||||
"T. c #D2D2D2",
|
||||
"U. c #3E3222",
|
||||
"V. c #8E8E8E",
|
||||
"W. c #D6D6D6",
|
||||
"X. c #A2A2A2",
|
||||
"Y. c #423222",
|
||||
"Z. c #422E1E",
|
||||
"`. c #FED69E",
|
||||
" + c #323232",
|
||||
".+ c #362E26",
|
||||
"++ c #46464A",
|
||||
"@+ c #FECE96",
|
||||
"#+ c #9A9A9A",
|
||||
"$+ c #7A7A7A",
|
||||
"%+ c #2E2E32",
|
||||
"&+ c #5E5E62",
|
||||
"*+ c #CACACE",
|
||||
"=+ c #9A8A4A",
|
||||
"-+ c #DEBE8E",
|
||||
";+ c #DECA6E",
|
||||
">+ c #2A2A2A",
|
||||
",+ c #5A5A5A",
|
||||
"'+ c #FEDAA2",
|
||||
")+ c #EEEEEE",
|
||||
"!+ c #FED29A",
|
||||
"~+ c #727276",
|
||||
" .+i.c. ",
|
||||
" 0._ -+8 o ",
|
||||
" 1.9 c .k.{ h. ",
|
||||
" H / S ] ^ 4 k.b.a.>. c.Q.o ",
|
||||
">+x.A . g 1 - w.^.m l.G a 1.0 9 h ) ",
|
||||
"x n T 3 6.8.+ F G.| * :.p b.D ! ; ; h c ",
|
||||
" +*+|.L 5 E.g.} Y ,.P X ] ^ 4 = @+2.! b ",
|
||||
" N N.|.N.p.T.C.+.#.;.$ 9.9.6 > l.G `.z.Q. ",
|
||||
" n.O.|.|.N.J.W.K.=.R # , e.v 3.* :. .`.i. ",
|
||||
" W &.U O.O.J.&.T.~.x.u.> $+@.` ;+w.Y.7.Q. ",
|
||||
" . v.U L )+5 &.E.T.*+P.S.< !.W =+( U.@+i. ",
|
||||
" . X.O.J.T &.n W.T.L.~.P.D.v.y.} ;.S D Q. ",
|
||||
" $+4.5 &.E.s T.o.~.P.D.B.7 r._.2 S b.Q. ",
|
||||
" . n &.n s Q l I ~.-.C C 7 S.O =+U. ... ",
|
||||
" . T.E.W.T.l ~.d -.< C v.y K.&+%.Z b.Q. ",
|
||||
" . M v.~.l ~.d D.C B.C.y y M &+%.S u .. ",
|
||||
" V t ,+B.-.M.B.C v.C.y X.M ~+O S {.A. ",
|
||||
" +N y v.C.!.X.X.#+M i ++S {.Y. ",
|
||||
" ' z ].3 #+3 (.j i ++J % Y. ",
|
||||
" . %+<.M M j j '.d.E /.Z. ",
|
||||
" >+,+].i '.}.K f j.h.h. ",
|
||||
" . *.m.}.$.k J . . h.",
|
||||
" & %+w $.q 1 h.. ",
|
||||
" H.B "};
|
26
contrib/utils/wxrcedit/bitmaps/panel.xpm
Normal file
26
contrib/utils/wxrcedit/bitmaps/panel.xpm
Normal file
@@ -0,0 +1,26 @@
|
||||
/* XPM */
|
||||
static char * panel_xpm[] = {
|
||||
"16 16 7 1",
|
||||
" c None",
|
||||
". c #000000",
|
||||
"+ c #808080",
|
||||
"@ c #0000FF",
|
||||
"# c #A0A0A4",
|
||||
"$ c #FFFFFF",
|
||||
"% c #595959",
|
||||
" ",
|
||||
"................",
|
||||
".++++++++++++++.",
|
||||
".+@@@@@@@@@@@@#.",
|
||||
".++++++++++++++.",
|
||||
".+$$$$$$$$$$$$+.",
|
||||
".%$$$$$$$$$$$$+.",
|
||||
".+$$$$$$$$$$$$+.",
|
||||
".+$$$$$$$$$$$$+.",
|
||||
".+$$$$$$$$$$$$%.",
|
||||
".+$$$$$$$$$$$$+.",
|
||||
".+$$$$$$$$$$$$+.",
|
||||
".%$$$$$$$$$$$$+.",
|
||||
".++++++++++++++.",
|
||||
"................",
|
||||
" "};
|
267
contrib/utils/wxrcedit/bitmaps/preview.xpm
Normal file
267
contrib/utils/wxrcedit/bitmaps/preview.xpm
Normal file
@@ -0,0 +1,267 @@
|
||||
/* XPM */
|
||||
static char * preview_xpm[] = {
|
||||
"24 24 240 2",
|
||||
" c None",
|
||||
". c #060606",
|
||||
"+ c #1E767E",
|
||||
"@ c #2AA2A2",
|
||||
"# c #92C6E6",
|
||||
"$ c #0E0E12",
|
||||
"% c #AADAF2",
|
||||
"& c #4A8282",
|
||||
"* c #5A9AEA",
|
||||
"= c #0E3A3A",
|
||||
"- c #52667A",
|
||||
"; c #9A9A96",
|
||||
"> c #D6DEE6",
|
||||
", c #727272",
|
||||
"' c #DEE6E6",
|
||||
") c #2A3E42",
|
||||
"! c #0A36BE",
|
||||
"~ c #9ECAEA",
|
||||
"{ c #7EB2E2",
|
||||
"] c #565652",
|
||||
"^ c #8A8A86",
|
||||
"/ c #96B2BE",
|
||||
"( c #A2CAE2",
|
||||
"_ c #DEEEF6",
|
||||
": c #2A36BA",
|
||||
"< c #06262A",
|
||||
"[ c #4A4A4A",
|
||||
"} c #E6EEF2",
|
||||
"| c #0E3ABA",
|
||||
"1 c #2276C6",
|
||||
"2 c #B2C6DE",
|
||||
"3 c #6E72BA",
|
||||
"4 c #566EBE",
|
||||
"5 c #A6A6B2",
|
||||
"6 c #9EBEDE",
|
||||
"7 c #2A2A2A",
|
||||
"8 c #3A72BE",
|
||||
"9 c #F6F6F2",
|
||||
"0 c #6E8EBE",
|
||||
"a c #727E86",
|
||||
"b c #0A8AFA",
|
||||
"c c #3E92D6",
|
||||
"d c #C6C6C2",
|
||||
"e c #BADAEE",
|
||||
"f c #D2D6DA",
|
||||
"g c #6E76B2",
|
||||
"h c #464642",
|
||||
"i c #469AF2",
|
||||
"j c #86A2C2",
|
||||
"k c #B6B6B2",
|
||||
"l c #52AADE",
|
||||
"m c #BED2EA",
|
||||
"n c #1252BE",
|
||||
"o c #222E2E",
|
||||
"p c #9696B2",
|
||||
"q c #6EAADA",
|
||||
"r c #126ECA",
|
||||
"s c #F2FAFA",
|
||||
"t c #AEBED6",
|
||||
"u c #92928E",
|
||||
"v c #1E1E1E",
|
||||
"w c #3E7EF6",
|
||||
"x c #1686F6",
|
||||
"y c #3E3E3E",
|
||||
"z c #C6DAE6",
|
||||
"A c #4A86D2",
|
||||
"B c #3AAAF6",
|
||||
"C c #0A76F6",
|
||||
"D c #62625E",
|
||||
"E c #B2C2D6",
|
||||
"F c #C2CEEA",
|
||||
"G c #7E7E7E",
|
||||
"H c #62BED6",
|
||||
"I c #828AAE",
|
||||
"J c #2E2E2E",
|
||||
"K c #CAD2DE",
|
||||
"L c #D2E6F2",
|
||||
"M c #4E4E4E",
|
||||
"N c #CECECA",
|
||||
"O c #5E86C2",
|
||||
"P c #6A6A6A",
|
||||
"Q c #F2EEEA",
|
||||
"R c #5E5E5A",
|
||||
"S c #767676",
|
||||
"T c #AEAEAA",
|
||||
"U c #363636",
|
||||
"V c #868686",
|
||||
"W c #A2A2A2",
|
||||
"X c #E2E2DA",
|
||||
"Y c #4A6EBE",
|
||||
"Z c #92AEF6",
|
||||
"` c #E6E6E2",
|
||||
" . c #226EFE",
|
||||
".. c #F6FAFA",
|
||||
"+. c #8A96AE",
|
||||
"@. c #96A2BE",
|
||||
"#. c #3A3A36",
|
||||
"$. c #BEBEBE",
|
||||
"%. c #8AD2EE",
|
||||
"&. c #8AB2CE",
|
||||
"*. c #3292F6",
|
||||
"=. c #225ABE",
|
||||
"-. c #76B6DE",
|
||||
";. c #FAFEFE",
|
||||
">. c #222222",
|
||||
",. c #96B2DA",
|
||||
"'. c #0296F6",
|
||||
"). c #CACAC6",
|
||||
"!. c #BAE6FA",
|
||||
"~. c #9E9EAA",
|
||||
"{. c #5A5A5A",
|
||||
"]. c #B2B2BE",
|
||||
"^. c #8E8E8E",
|
||||
"/. c #7A8286",
|
||||
"(. c #BABAB6",
|
||||
"_. c #D2D2CE",
|
||||
":. c #9E9E9A",
|
||||
"<. c #DADAD6",
|
||||
"[. c #D2DAEE",
|
||||
"}. c #3276CA",
|
||||
"|. c #AEC6EE",
|
||||
"1. c #96D2EE",
|
||||
"2. c #52524E",
|
||||
"3. c #7A7A76",
|
||||
"4. c #42423E",
|
||||
"5. c #DADEDE",
|
||||
"6. c #323232",
|
||||
"7. c #9A9696",
|
||||
"8. c #0A0A0E",
|
||||
"9. c #161616",
|
||||
"0. c #9AD2EE",
|
||||
"a. c #B2CED6",
|
||||
"b. c #3EB2F6",
|
||||
"c. c #666662",
|
||||
"d. c #82827E",
|
||||
"e. c #B2B2AE",
|
||||
"f. c #B6B6C2",
|
||||
"g. c #524A4A",
|
||||
"h. c #BEC2C2",
|
||||
"i. c #7292CE",
|
||||
"j. c #92B2DE",
|
||||
"k. c #969696",
|
||||
"l. c #EEEEEA",
|
||||
"m. c #FAF2EE",
|
||||
"n. c #EAEAEA",
|
||||
"o. c #262626",
|
||||
"p. c #F2F2F6",
|
||||
"q. c #5E6EBA",
|
||||
"r. c #76AEE6",
|
||||
"s. c #FEFEFE",
|
||||
"t. c #3A7AD2",
|
||||
"u. c #3A3E3A",
|
||||
"v. c #7A7A7A",
|
||||
"w. c #86A2CE",
|
||||
"x. c #76B2EA",
|
||||
"y. c #DEF2FA",
|
||||
"z. c #6E6E6E",
|
||||
"A. c #56565A",
|
||||
"B. c #E2E2DE",
|
||||
"C. c #CACACE",
|
||||
"D. c #464646",
|
||||
"E. c #3A3A3A",
|
||||
"F. c #96CAEA",
|
||||
"G. c #DEEAEE",
|
||||
"H. c #E6F2F6",
|
||||
"I. c #AAAAAA",
|
||||
"J. c #BABABA",
|
||||
"K. c #828286",
|
||||
"L. c #B2B2B6",
|
||||
"M. c #CAC6C6",
|
||||
"N. c #D6D2CE",
|
||||
"O. c #464242",
|
||||
"P. c #C2C2C2",
|
||||
"Q. c #121212",
|
||||
"R. c #AADEEE",
|
||||
"S. c #9ECEEE",
|
||||
"T. c #6A7AAA",
|
||||
"U. c #D2EAFA",
|
||||
"V. c #CEDEEA",
|
||||
"W. c #DEDEDA",
|
||||
"X. c #E6E2E2",
|
||||
"Y. c #36363A",
|
||||
"Z. c #46464A",
|
||||
"`. c #3A3A3E",
|
||||
" + c #FAFAF6",
|
||||
".+ c #D6D6D2",
|
||||
"++ c #EAE6E6",
|
||||
"@+ c #DAE6EE",
|
||||
"#+ c #C6C6CA",
|
||||
"$+ c #5E5E62",
|
||||
"%+ c #9E9EA2",
|
||||
"&+ c #FAFAFE",
|
||||
"*+ c #BAB6B6",
|
||||
"=+ c #DEDADA",
|
||||
"-+ c #9A9A9A",
|
||||
";+ c #8A8A8A",
|
||||
">+ c #2A2A2E",
|
||||
",+ c #F6F6F6",
|
||||
"'+ c #CACACA",
|
||||
")+ c #565656",
|
||||
"!+ c #828282",
|
||||
"~+ c #7A7A7E",
|
||||
"{+ c #E2E2E2",
|
||||
"]+ c #DEDEDE",
|
||||
"^+ c #0E36BE",
|
||||
"/+ c #EAEEEE",
|
||||
"(+ c #F6F2F6",
|
||||
"_+ c #727276",
|
||||
":+ c #525252",
|
||||
"<+ c #D2D2D2",
|
||||
"[+ c #424242",
|
||||
"}+ c #C2C2C6",
|
||||
"|+ c #C6C6C6",
|
||||
"1+ c #86868A",
|
||||
"2+ c #929292",
|
||||
"3+ c #626262",
|
||||
"4+ c #CECECE",
|
||||
"5+ c #4A4A4E",
|
||||
"6+ c #7E7E82",
|
||||
"7+ c #A2A2A6",
|
||||
"8+ c #8E8E92",
|
||||
"9+ c #BABABE",
|
||||
"0+ c #3E3E42",
|
||||
"a+ c #4E4E52",
|
||||
"b+ c #5E5E5E",
|
||||
"c+ c #AEAEAE",
|
||||
"d+ c #E6E6E6",
|
||||
"e+ c #9E9E9E",
|
||||
"f+ c #666666",
|
||||
"g+ c #B2B2B2",
|
||||
"h+ c #FAFAFA",
|
||||
"i+ c #D6D6D6",
|
||||
"j+ c #06060A",
|
||||
"k+ c #B6B6B6",
|
||||
"l+ c #1E1E22",
|
||||
"m+ c #BEBEC2",
|
||||
"n+ c #225AC2",
|
||||
"o+ c #DADADA",
|
||||
"p+ c #96CAEE",
|
||||
"q+ c #AAAAAE",
|
||||
" 3.D S v., P c.R )+:+[ h Z.Z.) 7 ",
|
||||
"v.<+!+]+s.s.s.s.s.s.s.s.s.;.U.1.a ",
|
||||
"3+!+c.]+s.s.s.s.s.s.s.s. +!.B i - 8.8. ",
|
||||
"v.o+]+n.s.s.s.s.p.W.<.i+X F.x .T.2+; 8. ",
|
||||
"3.s.s.s.s.s.9 ).^ )+2.)+M a O Z ~.;+2+8. ",
|
||||
"P s.s.s.s.s.W [+3.'+#+4+J.R J I.T ^ 2+8. ",
|
||||
"b+ +s.s.9 W D <+ +H.% [.n./+h.M {.G ^ 8. ",
|
||||
"{.s.s.s.(.)+<+s.s.G.# 2 a.-.m c+6.f+^ 8. ",
|
||||
"M s.s.p.G ^. +s.s.,+> > &.r i..+$+)+V 8. ",
|
||||
"h s.s.).[+<+s.s.s.y.~ j.h.@.]._.; U V 8. ",
|
||||
"h s. +).4.<+s y._ e r.}.@.j 0 ).:.7 V 8. ",
|
||||
"D.h+ +P.`._._ F.S.{ A n+4 8 ! f.k.7 G 8. ",
|
||||
"D.9 9 4+D.).U.l c 8 =.! g I 3 (.V U v.8. ",
|
||||
"D.p.p.l.G V @+q 1 n | : 5 e.k c+2.[ 3.8. ",
|
||||
"D.9 p.R./ [ $.> w.Y q.p c+L.$._+Q.g.S 8. ",
|
||||
"O.m.%.'.*.+.:+e+4+_.P.m+$.c+, 7 @ = d.8. ",
|
||||
"[+Q # C w f -+U M v.8+^.P 5+6.+ & :+h v ",
|
||||
"[+++' |.F {+=+J.^ D.o.J )+!+7.< 7 {.:+$ ",
|
||||
"[+` {+{+B.H f K <+P.(.(.g+k+h.N , 6.{.:+ ",
|
||||
"4.{+B.5.~ x.6 t _.C.'+'+#+'+P.}+k.:+E.b+:+ ",
|
||||
"0+{+{+z b.b * ,.E '+'+'+|+}+P.P.;+P b+7 {.)+ ",
|
||||
"8.j+. >.l+6.E.y y y E.U 6.6.J >+7 4.V >.o.{.:+ ",
|
||||
" . I.e+e+:.-+7.; k.u u ;+V !+G v.!+8. 7 {.v ",
|
||||
" 8.E.E.E.Y.E.E.Y.#.Y.Y.E.U U Y.U J 8. Q. "};
|
222
contrib/utils/wxrcedit/bitmaps/save.xpm
Normal file
222
contrib/utils/wxrcedit/bitmaps/save.xpm
Normal file
@@ -0,0 +1,222 @@
|
||||
/* XPM */
|
||||
static char * save_xpm[] = {
|
||||
"24 24 195 2",
|
||||
" c None",
|
||||
". c #2B2B3B",
|
||||
"+ c #3F3F55",
|
||||
"@ c #9191DF",
|
||||
"# c #51516D",
|
||||
"$ c #A4A4DF",
|
||||
"% c #B2B2FF",
|
||||
"& c #47479C",
|
||||
"* c #525252",
|
||||
"= c #28283B",
|
||||
"- c #9C9CEF",
|
||||
"; c #5252B0",
|
||||
"> c #F2F2F2",
|
||||
", c #E7E7E7",
|
||||
"' c #585858",
|
||||
") c #373755",
|
||||
"! c #9292DF",
|
||||
"~ c #9494EF",
|
||||
"{ c #6969BE",
|
||||
"] c #DDDDED",
|
||||
"^ c #DFDFDF",
|
||||
"/ c #EEEEEE",
|
||||
"( c #24243B",
|
||||
"_ c #8989DF",
|
||||
": c #9E9EFF",
|
||||
"< c #4E4EAF",
|
||||
"[ c #C6C6D6",
|
||||
"} c #FAFAFA",
|
||||
"| c #D6D6D6",
|
||||
"1 c #21213B",
|
||||
"2 c #9292FF",
|
||||
"3 c #8181EF",
|
||||
"4 c #4C4CB0",
|
||||
"5 c #F3F3F3",
|
||||
"6 c #FFFFFF",
|
||||
"7 c #DCDCDC",
|
||||
"8 c #F0F0F0",
|
||||
"9 c #FDFDFD",
|
||||
"0 c #2C2C55",
|
||||
"a c #7777DF",
|
||||
"b c #8989FF",
|
||||
"c c #4444C0",
|
||||
"d c #BFBFDF",
|
||||
"e c #EFEFEF",
|
||||
"f c #FEFEFE",
|
||||
"g c #E6E6E6",
|
||||
"h c #1D1D3B",
|
||||
"i c #6E6EDF",
|
||||
"j c #7F7FFF",
|
||||
"k c #6E6EEF",
|
||||
"l c #4747B0",
|
||||
"m c #FBFBFB",
|
||||
"n c #D7D7D7",
|
||||
"o c #19193B",
|
||||
"p c #7373FF",
|
||||
"q c #5F5FE7",
|
||||
"r c #4444B0",
|
||||
"s c #DFDFEF",
|
||||
"t c #DBDBDB",
|
||||
"u c #34344C",
|
||||
"v c #222255",
|
||||
"w c #5B5BDF",
|
||||
"x c #6969FF",
|
||||
"y c #5050DF",
|
||||
"z c #7E7ED7",
|
||||
"A c #5555A7",
|
||||
"B c #5B5BEF",
|
||||
"C c #5959C0",
|
||||
"D c #ECECEC",
|
||||
"E c #4646BF",
|
||||
"F c #2B2B6D",
|
||||
"G c #16163B",
|
||||
"H c #5353DF",
|
||||
"I c #6060FF",
|
||||
"J c #4E4EE7",
|
||||
"K c #5454A8",
|
||||
"L c #B3B3BB",
|
||||
"M c #9494A9",
|
||||
"N c #5353EF",
|
||||
"O c #4141B0",
|
||||
"P c #E0E0E0",
|
||||
"Q c #CFCFE7",
|
||||
"R c #4343C0",
|
||||
"S c #5959F7",
|
||||
"T c #1382C7",
|
||||
"U c #000060",
|
||||
"V c #101C3C",
|
||||
"W c #4A63F8",
|
||||
"X c #4545E7",
|
||||
"Y c #54549C",
|
||||
"Z c #A8A8B7",
|
||||
"` c #3232A1",
|
||||
" . c #4949CF",
|
||||
".. c #9798B2",
|
||||
"+. c #5454FF",
|
||||
"@. c #3E3EB0",
|
||||
"#. c #2424B8",
|
||||
"$. c #4A63F7",
|
||||
"%. c #108CD4",
|
||||
"&. c #0000C5",
|
||||
"*. c #000052",
|
||||
"=. c #001934",
|
||||
"-. c #1445C8",
|
||||
";. c #5151A7",
|
||||
">. c #3F3FAD",
|
||||
",. c #3636E7",
|
||||
"'. c #656BD2",
|
||||
"). c #9FA1BC",
|
||||
"!. c #BFBFBF",
|
||||
"~. c #3939DF",
|
||||
"{. c #4A4AFF",
|
||||
"]. c #4040EF",
|
||||
"^. c #5151C0",
|
||||
"/. c #3A3ABF",
|
||||
"(. c #415AF8",
|
||||
"_. c #1477D9",
|
||||
":. c #0019D0",
|
||||
"<. c #00005C",
|
||||
"[. c #B3B3D3",
|
||||
"}. c #A5A8BA",
|
||||
"|. c #474ECB",
|
||||
"1. c #5A62D2",
|
||||
"2. c #B1B4BD",
|
||||
"3. c #5050A8",
|
||||
"4. c #3434E7",
|
||||
"5. c #4040FF",
|
||||
"6. c #3737EF",
|
||||
"7. c #3B3BB0",
|
||||
"8. c #8F8FD7",
|
||||
"9. c #3737C0",
|
||||
"0. c #3C3CF7",
|
||||
"a. c #0D89D4",
|
||||
"b. c #000056",
|
||||
"c. c #666666",
|
||||
"d. c #E1E1E1",
|
||||
"e. c #A5AABE",
|
||||
"f. c #A7A9B3",
|
||||
"g. c #B3B3B3",
|
||||
"h. c #A8A8B0",
|
||||
"i. c #4444A4",
|
||||
"j. c #0000A0",
|
||||
"k. c #2B2BE7",
|
||||
"l. c #3434FF",
|
||||
"m. c #2E47F7",
|
||||
"n. c #0A86D4",
|
||||
"o. c #757575",
|
||||
"p. c #D5D5D5",
|
||||
"q. c #A8A8A8",
|
||||
"r. c #4141A0",
|
||||
"s. c #0303DF",
|
||||
"t. c #0202FF",
|
||||
"u. c #0606BF",
|
||||
"v. c #2121DF",
|
||||
"w. c #2B2BFF",
|
||||
"x. c #263FF8",
|
||||
"y. c #0C6FD9",
|
||||
"z. c #DEDEDE",
|
||||
"A. c #9C9C9C",
|
||||
"B. c #46468E",
|
||||
"C. c #0808E7",
|
||||
"D. c #0707FF",
|
||||
"E. c #0505FF",
|
||||
"F. c #0202DF",
|
||||
"G. c #1111C0",
|
||||
"H. c #2121FF",
|
||||
"I. c #0783D4",
|
||||
"J. c #CBCBD2",
|
||||
"K. c #393996",
|
||||
"L. c #0D0DE7",
|
||||
"M. c #0D0DFF",
|
||||
"N. c #0C0CFF",
|
||||
"O. c #0808B8",
|
||||
"P. c #132CF7",
|
||||
"Q. c #0480D4",
|
||||
"R. c #404060",
|
||||
"S. c #0536B1",
|
||||
"T. c #112AF8",
|
||||
"U. c #1111FF",
|
||||
"V. c #0C0CDF",
|
||||
"W. c #0404BF",
|
||||
"X. c #0A23F8",
|
||||
"Y. c #0467D9",
|
||||
"Z. c #001988",
|
||||
"`. c #1111E7",
|
||||
" + c #0202C0",
|
||||
".+ c #0101F7",
|
||||
"++ c #017DD4",
|
||||
"@+ c #00009D",
|
||||
"#+ c #000C9C",
|
||||
"$+ c #0031F0",
|
||||
"%+ c #007CD4",
|
||||
"&+ c #001B6A",
|
||||
"*+ c #0068C2",
|
||||
"=+ c #000230",
|
||||
"-+ c #000032",
|
||||
" . ",
|
||||
" + @ # ",
|
||||
" . $ % & * ",
|
||||
" = % - ; > , ' ",
|
||||
" ) ! ~ { ] ^ / , * ",
|
||||
" ( _ : < [ > } ^ > | * ",
|
||||
" 1 2 3 4 5 6 7 8 9 7 > , ' ",
|
||||
" 0 a b c d ^ e 6 ^ / f ^ e g * ",
|
||||
" h i j j k l m ^ 5 m ^ e } ^ 5 n * ",
|
||||
" o p p p q p p r s 7 5 6 7 > 9 t 5 , u ",
|
||||
" v w x y z A y x B C s ^ e 6 ^ D f , d E F ",
|
||||
"G H I J K L M K J I N O m P 5 m ^ 5 Q R S T U ",
|
||||
"V W X Y Z ` ...Y X +.+.@.s 7 5 6 Q #.$.%.&.*. ",
|
||||
"=.-.;.Z >.,.'.).!.;.~.{.].^.s , d /.(._.:.*. ",
|
||||
" <.[.}.|.1.2.!.!.L 3.4.5.6.7.8.9.0.a.:.b. ",
|
||||
" c.d.e.f.g.g.g.h.i.j.k.l.l.l.m.n.&.*. ",
|
||||
" o.p.g.q.q.q.r.s.t.u.v.w.x.y.:.*. ",
|
||||
" o.z.A.A.B.C.D.E.F.G.H.I.:.b. ",
|
||||
" c.J.K.L.M.N.C.O.P.Q.&.*. ",
|
||||
" R.S.T.U.V.W.X.Y.:.*. ",
|
||||
" Z.Q.`. +.+++:.b. ",
|
||||
" @+#+$+%+&.*. ",
|
||||
" &+*+:.*. ",
|
||||
" =+-+ "};
|
20
contrib/utils/wxrcedit/bitmaps/unused.xpm
Normal file
20
contrib/utils/wxrcedit/bitmaps/unused.xpm
Normal file
@@ -0,0 +1,20 @@
|
||||
/* XPM */
|
||||
static char * unused_xpm[] = {
|
||||
"16 16 1 1",
|
||||
" c None",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" "};
|
21
contrib/utils/wxrcedit/bitmaps/used.xpm
Normal file
21
contrib/utils/wxrcedit/bitmaps/used.xpm
Normal file
@@ -0,0 +1,21 @@
|
||||
/* XPM */
|
||||
static char * used_xpm[] = {
|
||||
"16 16 2 1",
|
||||
" c None",
|
||||
". c #000000",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" . ",
|
||||
" ... ",
|
||||
" .... ",
|
||||
" .... ",
|
||||
" .. .... ",
|
||||
" ....... ",
|
||||
" ..... ",
|
||||
" ... ",
|
||||
" . ",
|
||||
" ",
|
||||
" ",
|
||||
" "};
|
22
contrib/utils/wxrcedit/bitmaps/vsizer.xpm
Normal file
22
contrib/utils/wxrcedit/bitmaps/vsizer.xpm
Normal file
@@ -0,0 +1,22 @@
|
||||
/* XPM */
|
||||
static char * vsizer_xpm[] = {
|
||||
"16 16 3 1",
|
||||
" c None",
|
||||
". c #000000",
|
||||
"+ c #FF0000",
|
||||
" . ",
|
||||
" ... ",
|
||||
" ..+.. ",
|
||||
" ..+++.. ",
|
||||
" ..+++++.. ",
|
||||
" .+++. ",
|
||||
" .+++. ",
|
||||
" .+++. ",
|
||||
" .+++. ",
|
||||
" .+++. ",
|
||||
" .+++. ",
|
||||
" ..+++++.. ",
|
||||
" ..+++.. ",
|
||||
" ..+.. ",
|
||||
" ... ",
|
||||
" . "};
|
6
contrib/utils/wxrcedit/df/boxsizer.df
Normal file
6
contrib/utils/wxrcedit/df/boxsizer.df
Normal file
@@ -0,0 +1,6 @@
|
||||
node boxsizer
|
||||
type sizer
|
||||
icon 2
|
||||
childtype sizer_item
|
||||
derived from panel_item
|
||||
var orient of flags wxHORIZONTAL,wxVERTICAL
|
3
contrib/utils/wxrcedit/df/break.df
Normal file
3
contrib/utils/wxrcedit/df/break.df
Normal file
@@ -0,0 +1,3 @@
|
||||
node break
|
||||
type normal
|
||||
derived from menu_item
|
4
contrib/utils/wxrcedit/df/button.df
Normal file
4
contrib/utils/wxrcedit/df/button.df
Normal file
@@ -0,0 +1,4 @@
|
||||
node button
|
||||
var label of text
|
||||
var default of bool
|
||||
derived from control
|
4
contrib/utils/wxrcedit/df/checkbox.df
Normal file
4
contrib/utils/wxrcedit/df/checkbox.df
Normal file
@@ -0,0 +1,4 @@
|
||||
node checkbox
|
||||
var label of text
|
||||
var checked of bool
|
||||
derived from control
|
6
contrib/utils/wxrcedit/df/control.df
Normal file
6
contrib/utils/wxrcedit/df/control.df
Normal file
@@ -0,0 +1,6 @@
|
||||
node control
|
||||
abstract
|
||||
icon 0
|
||||
derived from window
|
||||
derived from panel_item
|
||||
derived from toolbar_item
|
4
contrib/utils/wxrcedit/df/dialog.df
Normal file
4
contrib/utils/wxrcedit/df/dialog.df
Normal file
@@ -0,0 +1,4 @@
|
||||
node dialog
|
||||
var title of text
|
||||
var style of flags wxSTAY_ON_TOP,wxCAPTION,wxDEFAULT_DIALOG_STYLE,wxTHICK_FRAME,wxSYSTEM_MENU,wxRESIZE_BORDER,wxRESIZE_BOX,wxDIALOG_MODAL,wxDIALOG_MODELESS
|
||||
derived from panelbase
|
7
contrib/utils/wxrcedit/df/gauge.df
Normal file
7
contrib/utils/wxrcedit/df/gauge.df
Normal file
@@ -0,0 +1,7 @@
|
||||
node gauge
|
||||
var style of flags wxGA_HORIZONTAL,wxGA_VERTICAL,wxGA_PROGRESSBAR,wxGA_SMOOTH
|
||||
var range of integer
|
||||
var value of integer
|
||||
var shadow of integer
|
||||
var bezel of integer
|
||||
derived from control
|
6
contrib/utils/wxrcedit/df/htmlwindow.df
Normal file
6
contrib/utils/wxrcedit/df/htmlwindow.df
Normal file
@@ -0,0 +1,6 @@
|
||||
node htmlwindow
|
||||
var url of text
|
||||
var htmlcode of text
|
||||
var borders of integer
|
||||
var style of flags wxHW_SCROLLBAR_NEVER,wxHW_SCROLLBAR_AUTO
|
||||
derived from control
|
8
contrib/utils/wxrcedit/df/menu.df
Normal file
8
contrib/utils/wxrcedit/df/menu.df
Normal file
@@ -0,0 +1,8 @@
|
||||
node menu
|
||||
type panel
|
||||
icon 0
|
||||
childtype menu_item
|
||||
var label of text
|
||||
var style of flags wxMENU_TEAROFF
|
||||
var help of text
|
||||
derived from menu_item
|
3
contrib/utils/wxrcedit/df/menu_item.df
Normal file
3
contrib/utils/wxrcedit/df/menu_item.df
Normal file
@@ -0,0 +1,3 @@
|
||||
# anything that may be placed into menu
|
||||
node menu_item
|
||||
abstract
|
5
contrib/utils/wxrcedit/df/menubar.df
Normal file
5
contrib/utils/wxrcedit/df/menubar.df
Normal file
@@ -0,0 +1,5 @@
|
||||
node menubar
|
||||
type panel
|
||||
icon 0
|
||||
childtype menu
|
||||
var style of flags wxMB_DOCKABLE
|
9
contrib/utils/wxrcedit/df/menuitem.df
Normal file
9
contrib/utils/wxrcedit/df/menuitem.df
Normal file
@@ -0,0 +1,9 @@
|
||||
node menuitem
|
||||
type normal
|
||||
icon 0
|
||||
var label of text
|
||||
var help of text
|
||||
var checkable of bool
|
||||
var checked of bool
|
||||
var enabled of bool
|
||||
derived from menu_item
|
3
contrib/utils/wxrcedit/df/panel.df
Normal file
3
contrib/utils/wxrcedit/df/panel.df
Normal file
@@ -0,0 +1,3 @@
|
||||
node panel
|
||||
derived from panel_item
|
||||
derived from panelbase
|
4
contrib/utils/wxrcedit/df/panel_item.df
Normal file
4
contrib/utils/wxrcedit/df/panel_item.df
Normal file
@@ -0,0 +1,4 @@
|
||||
# anything that may be placed into panel
|
||||
node panel_item
|
||||
abstract
|
||||
derived from sizer_item
|
9
contrib/utils/wxrcedit/df/panelbase.df
Normal file
9
contrib/utils/wxrcedit/df/panelbase.df
Normal file
@@ -0,0 +1,9 @@
|
||||
# base "class" for panel and dialog
|
||||
node panelbase
|
||||
type panel
|
||||
icon 1
|
||||
childtype panel_item
|
||||
abstract
|
||||
var style of flags wxNO_3D,wxTAB_TRAVERSAL
|
||||
var exstyle of flags wxWS_EX_VALIDATE_RECURSIVELY
|
||||
derived from window
|
5
contrib/utils/wxrcedit/df/radiobutton.df
Normal file
5
contrib/utils/wxrcedit/df/radiobutton.df
Normal file
@@ -0,0 +1,5 @@
|
||||
node radiobutton
|
||||
var label of text
|
||||
var value of bool
|
||||
var style of flags wxRB_GROUP
|
||||
derived from control
|
4
contrib/utils/wxrcedit/df/separator.df
Normal file
4
contrib/utils/wxrcedit/df/separator.df
Normal file
@@ -0,0 +1,4 @@
|
||||
node separator
|
||||
icon 0
|
||||
type normal
|
||||
derived from menu_item
|
4
contrib/utils/wxrcedit/df/sizer_item.df
Normal file
4
contrib/utils/wxrcedit/df/sizer_item.df
Normal file
@@ -0,0 +1,4 @@
|
||||
# anything that may be placed into sizer
|
||||
node sizer_item
|
||||
abstract
|
||||
|
8
contrib/utils/wxrcedit/df/sizeritem.df
Normal file
8
contrib/utils/wxrcedit/df/sizeritem.df
Normal file
@@ -0,0 +1,8 @@
|
||||
# don't delete this file!
|
||||
# it servers as helper df for sizer items
|
||||
|
||||
node sizeritem
|
||||
type sizeritem
|
||||
var option of integer
|
||||
var flag of flags wxEXPAND,wxALL,wxLEFT,wxRIGHT,wxTOP,wxBOTTOM,wxALIGN_CENTER,wxALIGN_LEFT,wxALIGN_TOP,wxALIGN_RIGHT,wxALIGN_BOTTOM,wxALIGN_CENTER_HORIZONTAL,wxALIGN_CENTER_VERTICAL,wxNORTH,wxSOUTH,wxEAST,wxWEST,wxGROW,wxSHAPED,wxSTRETCH_NOT
|
||||
var border of integer
|
13
contrib/utils/wxrcedit/df/slider.df
Normal file
13
contrib/utils/wxrcedit/df/slider.df
Normal file
@@ -0,0 +1,13 @@
|
||||
node slider
|
||||
var value of integer
|
||||
var min of integer
|
||||
var max of integer
|
||||
var style of flags wxSL_HORIZONTAL,wxSL_VERTICAL,wxSL_AUTOTICKS,wxSL_LABELS,wxSL_LEFT,wxSL_TOP,wxSL_RIGHT,wxSL_BOTTOM,wxSL_BOTH,wxSL_SELRANGE
|
||||
var tickfreq of integer
|
||||
var pagesize of integer
|
||||
var linesize of integer
|
||||
var thumb of integer
|
||||
var tick of integer
|
||||
var selmin of integer
|
||||
var selmax of integer
|
||||
derived from control
|
10
contrib/utils/wxrcedit/df/spacer.df
Normal file
10
contrib/utils/wxrcedit/df/spacer.df
Normal file
@@ -0,0 +1,10 @@
|
||||
# don't delete this file!
|
||||
# it servers as helper df for sizer items
|
||||
|
||||
node spacer
|
||||
type normal
|
||||
var option of integer
|
||||
var flag of flags wxEXPAND,wxALL,wxLEFT,wxRIGHT,wxTOP,wxBOTTOM,wxALIGN_CENTER,wxALIGN_LEFT,wxALIGN_TOP,wxALIGN_RIGHT,wxALIGN_BOTTOM,wxALIGN_CENTER_HORIZONTAL,wxALIGN_CENTER_VERTICAL,wxNORTH,wxSOUTH,wxEAST,wxWEST,wxGROW,wxSHAPED,wxSTRETCH_NOT
|
||||
var border of integer
|
||||
var size of coord
|
||||
derived from sizer_item
|
3
contrib/utils/wxrcedit/df/staticbitmap.df
Normal file
3
contrib/utils/wxrcedit/df/staticbitmap.df
Normal file
@@ -0,0 +1,3 @@
|
||||
node button
|
||||
var bitmap of text
|
||||
derived from control
|
3
contrib/utils/wxrcedit/df/staticboxsizer.df
Normal file
3
contrib/utils/wxrcedit/df/staticboxsizer.df
Normal file
@@ -0,0 +1,3 @@
|
||||
node staticboxsizer
|
||||
derived from boxsizer
|
||||
var label of text
|
3
contrib/utils/wxrcedit/df/statictext.df
Normal file
3
contrib/utils/wxrcedit/df/statictext.df
Normal file
@@ -0,0 +1,3 @@
|
||||
node statictext
|
||||
var label of text
|
||||
derived from control
|
4
contrib/utils/wxrcedit/df/textctrl.df
Normal file
4
contrib/utils/wxrcedit/df/textctrl.df
Normal file
@@ -0,0 +1,4 @@
|
||||
node textctrl
|
||||
var value of text
|
||||
var style of flags wxTE_PROCESS_ENTER,wxTE_PROCESS_TAB,wxTE_MULTILINE,wxTE_PASSWORD,wxTE_READONLY,wxHSCROLL
|
||||
derived from control
|
3
contrib/utils/wxrcedit/df/toolbar_item.df
Normal file
3
contrib/utils/wxrcedit/df/toolbar_item.df
Normal file
@@ -0,0 +1,3 @@
|
||||
# anything that may be placed into toolbar
|
||||
node toolbar_item
|
||||
abstract
|
11
contrib/utils/wxrcedit/df/window.df
Normal file
11
contrib/utils/wxrcedit/df/window.df
Normal file
@@ -0,0 +1,11 @@
|
||||
node window
|
||||
type normal
|
||||
abstract
|
||||
var pos of coord
|
||||
var size of coord
|
||||
var tooltip of text
|
||||
var fg of color
|
||||
var bg of color
|
||||
var enabled of bool
|
||||
var focused of bool
|
||||
var hidden of bool
|
56
contrib/utils/wxrcedit/edapp.cpp
Normal file
56
contrib/utils/wxrcedit/edapp.cpp
Normal file
@@ -0,0 +1,56 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Purpose: XML resources editor
|
||||
// Author: Vaclav Slavik
|
||||
// Created: 2000/05/05
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2000 Vaclav Slavik
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
// for all others, include the necessary headers (this file is usually all you
|
||||
// need because it includes almost all "standard" wxWindows headers
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/wx.h"
|
||||
#endif
|
||||
|
||||
#include "wx/xml/xml.h"
|
||||
#include "wx/image.h"
|
||||
|
||||
|
||||
#include "editor.h"
|
||||
|
||||
|
||||
|
||||
// -- Application
|
||||
|
||||
class MyApp : public wxApp
|
||||
{
|
||||
public:
|
||||
virtual bool OnInit();
|
||||
};
|
||||
|
||||
IMPLEMENT_APP(MyApp)
|
||||
|
||||
|
||||
bool MyApp::OnInit()
|
||||
{
|
||||
wxString arg = (argc >= 1) ? argv[1] : "";
|
||||
wxInitAllImageHandlers();
|
||||
wxFrame *frame = new EditorFrame(NULL, arg);
|
||||
SetTopWindow(frame);
|
||||
frame->Show(TRUE);
|
||||
return TRUE;
|
||||
}
|
||||
|
885
contrib/utils/wxrcedit/editor.cpp
Normal file
885
contrib/utils/wxrcedit/editor.cpp
Normal file
@@ -0,0 +1,885 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Author: Vaclav Slavik
|
||||
// Created: 2000/05/05
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2000 Vaclav Slavik
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "editor.h"
|
||||
#pragma implementation "treedt.h"
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#include "wx/wx.h"
|
||||
#include "wx/xml/xml.h"
|
||||
#include "wx/xml/xmlres.h"
|
||||
#include "wx/splitter.h"
|
||||
#include "wx/config.h"
|
||||
#include "wx/dir.h"
|
||||
|
||||
#include "treedt.h"
|
||||
#include "editor.h"
|
||||
#include "nodehnd.h"
|
||||
#include "xmlhelpr.h"
|
||||
|
||||
|
||||
|
||||
class EditorTreeCtrl : public wxTreeCtrl
|
||||
{
|
||||
public:
|
||||
EditorTreeCtrl(wxWindow *parent, int id, EditorFrame *frame)
|
||||
: wxTreeCtrl(parent, id), m_EdFrame(frame) {}
|
||||
|
||||
private:
|
||||
EditorFrame *m_EdFrame;
|
||||
|
||||
void OnRightClick(wxMouseEvent &event)
|
||||
{
|
||||
wxTreeItemId item =
|
||||
m_EdFrame->m_TreeCtrl->HitTest(event.GetPosition());
|
||||
if (item.IsOk())
|
||||
{
|
||||
m_EdFrame->m_TreeCtrl->SelectItem(item);
|
||||
m_EdFrame->OnRightClickTree(event.GetPosition());
|
||||
}
|
||||
}
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
BEGIN_EVENT_TABLE(EditorTreeCtrl, wxTreeCtrl)
|
||||
EVT_RIGHT_DOWN(EditorTreeCtrl::OnRightClick)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
ID_PREVIEW = wxID_HIGHEST + 100,
|
||||
ID_NEW,
|
||||
ID_OPEN,
|
||||
ID_CLOSE,
|
||||
ID_SAVE,
|
||||
ID_SAVEAS,
|
||||
ID_DELETE_NODE,
|
||||
ID_EXIT,
|
||||
ID_TREE,
|
||||
ID_XMLIDEDIT,
|
||||
ID_XMLIDPICK,
|
||||
ID_EDITCODE,
|
||||
ID_PROPSLIST,
|
||||
ID_CLEARPROP,
|
||||
|
||||
ID_NEWDIALOG,
|
||||
ID_NEWPANEL,
|
||||
ID_NEWMENU,
|
||||
ID_NEWMENUBAR,
|
||||
ID_NEWTOOLBAR,
|
||||
ID_NEWNODE = wxID_HIGHEST + 1000,
|
||||
ID_NEWSYBNODE = ID_NEWNODE + 2000
|
||||
};
|
||||
|
||||
#ifdef __UNIX__
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
BEGIN_EVENT_TABLE(EditorFrame, wxFrame)
|
||||
EVT_TREE_SEL_CHANGED(ID_TREE, EditorFrame::OnTreeSel)
|
||||
EVT_TOOL_RANGE(ID_PREVIEW, ID_EXIT, EditorFrame::OnToolbar)
|
||||
EVT_MENU_RANGE(ID_NEWDIALOG, ID_NEWSYBNODE + 1000, EditorFrame::OnNewNode)
|
||||
EVT_TEXT(ID_XMLIDEDIT, EditorFrame::OnXMLIDEdit)
|
||||
EVT_BUTTON(ID_XMLIDPICK, EditorFrame::OnXMLIDPick)
|
||||
EVT_BUTTON(ID_EDITCODE, EditorFrame::OnEditCode)
|
||||
EVT_BUTTON(ID_CLEARPROP, EditorFrame::OnClearProp)
|
||||
EVT_LIST_ITEM_SELECTED(ID_PROPSLIST, EditorFrame::OnPropSel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
|
||||
#ifdef __UNIX__
|
||||
#include "bitmaps/preview.xpm"
|
||||
#include "bitmaps/close.xpm"
|
||||
#include "bitmaps/save.xpm"
|
||||
#include "bitmaps/open.xpm"
|
||||
|
||||
#include "bitmaps/control.xpm"
|
||||
#include "bitmaps/vsizer.xpm"
|
||||
#include "bitmaps/hsizer.xpm"
|
||||
#include "bitmaps/panel.xpm"
|
||||
|
||||
#include "bitmaps/unused.xpm"
|
||||
#include "bitmaps/used.xpm"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
EditorFrame *EditorFrame::ms_Instance = NULL;
|
||||
|
||||
EditorFrame::EditorFrame(wxFrame *parent, const wxString& filename)
|
||||
: wxFrame(parent, -1, filename + _("- wxWindows resources editor"))
|
||||
{
|
||||
ms_Instance = this;
|
||||
|
||||
wxConfigBase *cfg = wxConfigBase::Get();
|
||||
|
||||
SetSize(wxRect(wxPoint(cfg->Read("editor_x", -1), cfg->Read("editor_y", -1)),
|
||||
wxSize(cfg->Read("editor_w", 400), cfg->Read("editor_h", 400))));
|
||||
|
||||
m_SelectedNode = NULL;
|
||||
m_Resource = NULL;
|
||||
m_FileName = wxEmptyString;
|
||||
m_Preview = NULL;
|
||||
m_SelectedProp = -1;
|
||||
|
||||
wxMenu *menuFile = new wxMenu;
|
||||
menuFile->Append(ID_NEW, "&New");
|
||||
menuFile->Append(ID_OPEN, "&Open\tCtrl-O");
|
||||
menuFile->Append(ID_SAVE, "&Save\tCtrl-S");
|
||||
menuFile->Append(ID_SAVEAS, "Save &as...");
|
||||
menuFile->AppendSeparator();
|
||||
menuFile->Append(ID_EXIT, "E&xit\tAlt-X");
|
||||
|
||||
wxMenuBar *menuBar = new wxMenuBar();
|
||||
menuBar->Append(menuFile, "&File");
|
||||
SetMenuBar(menuBar);
|
||||
|
||||
// handlers:
|
||||
m_Handlers.DeleteContents(TRUE);
|
||||
RegisterHandlers(".");
|
||||
RegisterHandlers("./df");
|
||||
m_Handlers.Append(new NodeHandlerUnknown(this));
|
||||
|
||||
#ifdef __UNIX__
|
||||
RegisterHandlers(wxGetHomeDir() + "/.wxrcedit");
|
||||
//FIXME - add $(prefix)/share/wx/wxrcedit
|
||||
#endif
|
||||
|
||||
// Create toolbar:
|
||||
wxToolBar *toolBar = CreateToolBar(wxNO_BORDER | wxTB_HORIZONTAL | wxTB_FLAT);
|
||||
toolBar->SetMargins(2, 2);
|
||||
toolBar -> AddTool(ID_EXIT, wxBITMAP(close), wxNullBitmap,
|
||||
FALSE, -1, -1, (wxObject *) NULL,
|
||||
_("Quit the editor"));
|
||||
toolBar -> AddTool(ID_OPEN, wxBITMAP(open), wxNullBitmap,
|
||||
FALSE, -1, -1, (wxObject *) NULL,
|
||||
_("Open XML resource file"));
|
||||
toolBar -> AddTool(ID_SAVE, wxBITMAP(save), wxNullBitmap,
|
||||
FALSE, -1, -1, (wxObject *) NULL,
|
||||
_("Save XML file"));
|
||||
toolBar -> AddTool(ID_PREVIEW, wxBITMAP(preview), wxNullBitmap,
|
||||
FALSE, -1, -1, (wxObject *) NULL,
|
||||
_("Preview"));
|
||||
toolBar -> Realize();
|
||||
|
||||
// Create layout:
|
||||
wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
|
||||
wxPanel *p = new wxPanel(this);
|
||||
sizer->Add(p, 1, wxEXPAND);
|
||||
wxSizer *sizer2 = new wxBoxSizer(wxVERTICAL);
|
||||
|
||||
m_Splitter = new wxSplitterWindow(p);
|
||||
sizer2->Add(m_Splitter, 1, wxEXPAND);
|
||||
|
||||
|
||||
// Create tree control:
|
||||
m_TreeCtrl = new EditorTreeCtrl(m_Splitter, ID_TREE, this);
|
||||
m_ImgList = new wxImageList(16, 16);
|
||||
m_ImgList->Add(wxICON(control));
|
||||
m_ImgList->Add(wxICON(panel));
|
||||
m_ImgList->Add(wxICON(vsizer));
|
||||
m_ImgList->Add(wxICON(hsizer));
|
||||
|
||||
m_TreeCtrl->SetImageList(m_ImgList);
|
||||
|
||||
|
||||
// Create properties panel:
|
||||
m_Splitter2 = new wxSplitterWindow(m_Splitter);
|
||||
m_PropsPanel = new wxPanel(m_Splitter2, -1, wxDefaultPosition,
|
||||
wxDefaultSize, wxTAB_TRAVERSAL);
|
||||
|
||||
wxSizer *sizer3 = new wxBoxSizer(wxVERTICAL);
|
||||
|
||||
wxSizer *sz = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
||||
sizer3->Add(new wxButton(m_PropsPanel, ID_EDITCODE, "Edit XML code"),
|
||||
0, wxALL | wxEXPAND, 2);
|
||||
sz->Add(new wxStaticText(m_PropsPanel, -1, _("XMLID name:")),
|
||||
0, wxLEFT | wxALIGN_CENTER_VERTICAL, 2);
|
||||
m_XMLIDCtrl = new wxTextCtrl(m_PropsPanel, ID_XMLIDEDIT, "");
|
||||
sz->Add(m_XMLIDCtrl, 1, wxLEFT|wxRIGHT, 2);
|
||||
sz->Add(new wxButton(m_PropsPanel, ID_XMLIDPICK, "...", wxDefaultPosition, wxSize(16,-1)),
|
||||
0, wxRIGHT, 2);
|
||||
sizer3->Add(sz, 0, wxTOP|wxEXPAND, 2);
|
||||
|
||||
m_PropsList = new wxListCtrl(m_PropsPanel, ID_PROPSLIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_SINGLE_SEL);
|
||||
|
||||
m_ImgListProp = new wxImageList(16, 16);
|
||||
m_ImgListProp->Add(wxICON(unused));
|
||||
m_ImgListProp->Add(wxICON(used));
|
||||
m_PropsList->SetImageList(m_ImgListProp, wxIMAGE_LIST_SMALL);
|
||||
|
||||
m_PropsList->InsertColumn(0, _("Property"));
|
||||
m_PropsList->InsertColumn(1, _("Value"));
|
||||
m_PropsList->SetColumnWidth(0, cfg->Read("editor_col0", wxLIST_AUTOSIZE_USEHEADER));
|
||||
m_PropsList->SetColumnWidth(1, cfg->Read("editor_col1", wxLIST_AUTOSIZE_USEHEADER));
|
||||
|
||||
sizer3->Add(m_PropsList, 1, wxALL | wxEXPAND, 2);
|
||||
|
||||
m_PropsPanel->SetAutoLayout(TRUE);
|
||||
m_PropsPanel->SetSizer(sizer3);
|
||||
m_PropsPanel->Layout();
|
||||
|
||||
m_PropsEditPanel = new wxScrolledWindow(m_Splitter2, -1, wxDefaultPosition,
|
||||
wxDefaultSize, wxTAB_TRAVERSAL);
|
||||
|
||||
m_Splitter->SplitVertically(m_TreeCtrl, m_Splitter2);
|
||||
m_Splitter->SetSashPosition(cfg->Read("editor_sash", 140));
|
||||
|
||||
m_Splitter2->SplitHorizontally(m_PropsPanel, m_PropsEditPanel);
|
||||
m_Splitter2->SetSashPosition(cfg->Read("editor_sash2", 100));
|
||||
|
||||
p->SetAutoLayout(TRUE);
|
||||
p->SetSizer(sizer2);
|
||||
|
||||
|
||||
|
||||
SetAutoLayout(TRUE);
|
||||
SetSizer(sizer);
|
||||
|
||||
// Load file:
|
||||
if (!filename)
|
||||
NewFile();
|
||||
else
|
||||
LoadFile(filename);
|
||||
}
|
||||
|
||||
|
||||
|
||||
EditorFrame::~EditorFrame()
|
||||
{
|
||||
wxConfigBase *cfg = wxConfigBase::Get();
|
||||
|
||||
cfg->Write("editor_x", (long)GetPosition().x);
|
||||
cfg->Write("editor_y", (long)GetPosition().y);
|
||||
cfg->Write("editor_w", (long)GetSize().x);
|
||||
cfg->Write("editor_h", (long)GetSize().y);
|
||||
cfg->Write("editor_sash", (long)m_Splitter->GetSashPosition());
|
||||
cfg->Write("editor_sash2", (long)m_Splitter2->GetSashPosition());
|
||||
cfg->Write("editor_col0", (long)m_PropsList->GetColumnWidth(0));
|
||||
cfg->Write("editor_col1", (long)m_PropsList->GetColumnWidth(1));
|
||||
|
||||
delete m_ImgList;
|
||||
delete m_ImgListProp;
|
||||
RefreshProps(NULL);
|
||||
}
|
||||
|
||||
|
||||
|
||||
NodeHandler *EditorFrame::FindHandler(wxXmlNode *node)
|
||||
{
|
||||
wxNode *n = m_Handlers.GetFirst();
|
||||
while (n)
|
||||
{
|
||||
NodeHandler *h = (NodeHandler*) n->GetData();
|
||||
if (h->CanHandle(node))
|
||||
return h;
|
||||
n = n->GetNext();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::RegisterHandlers(const wxString& dirname)
|
||||
{
|
||||
if (!wxDirExists(dirname)) return;
|
||||
|
||||
wxDir dir(dirname);
|
||||
wxString filename;
|
||||
bool cont;
|
||||
NodeHandler *hnd;
|
||||
|
||||
cont = dir.GetFirst(&filename, "*.df");
|
||||
while (cont)
|
||||
{
|
||||
hnd = NodeHandler::CreateFromFile(filename, this);
|
||||
if (hnd) m_Handlers.Append(hnd);
|
||||
cont = dir.GetNext(&filename);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::LoadFile(const wxString& filename)
|
||||
{
|
||||
delete m_Resource;
|
||||
|
||||
m_FileName = "";
|
||||
m_Resource = new wxXmlDocument;
|
||||
|
||||
if (!m_Resource->Load(filename))
|
||||
{
|
||||
delete m_Resource;
|
||||
m_Resource = NULL;
|
||||
NewFile();
|
||||
wxLogError("Error parsing " + filename);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_FileName = filename;
|
||||
RefreshTree();
|
||||
SetTitle(m_FileName);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::SaveFile(const wxString& filename)
|
||||
{
|
||||
m_FileName = filename;
|
||||
SetTitle(filename);
|
||||
|
||||
if (!m_Resource->Save(filename, wxXML_IO_LIBXML))
|
||||
wxLogError("Error saving " + filename);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::NewFile()
|
||||
{
|
||||
delete m_Resource;
|
||||
|
||||
m_FileName = "";
|
||||
m_Resource = new wxXmlDocument;
|
||||
m_Resource->SetRoot(new wxXmlNode(wxXML_ELEMENT_NODE, "resource"));
|
||||
|
||||
RefreshTree();
|
||||
SetTitle("unnamed");
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::RefreshPreview(wxXmlNode *node)
|
||||
{
|
||||
wxBusyCursor bcur;
|
||||
wxXmlResource *res = new wxXmlResource;
|
||||
wxString tempfile;
|
||||
wxPoint pos = wxDefaultPosition;
|
||||
|
||||
while (node->GetParent() != m_Resource->GetRoot())
|
||||
node = node->GetParent();
|
||||
|
||||
if (m_Preview) pos = m_Preview->GetPosition();
|
||||
|
||||
res->InitAllHandlers();
|
||||
|
||||
wxGetTempFileName("xmleditor", tempfile);
|
||||
m_Resource->Save(tempfile, wxXML_IO_BIN);
|
||||
res->Load(tempfile, wxXML_BINARY);
|
||||
|
||||
if (node->GetName() == "dialog")
|
||||
{
|
||||
wxDialog *dlg = new wxDialog;
|
||||
if (res->LoadDialog(dlg, this, node->GetPropVal("name", "-1")))
|
||||
{
|
||||
if (pos.x != -1) dlg->Move(pos);
|
||||
dlg->Show(TRUE);
|
||||
if (m_Preview) m_Preview->Close(TRUE);
|
||||
m_Preview = dlg;
|
||||
}
|
||||
else
|
||||
{
|
||||
delete dlg;
|
||||
wxLogError(_("Cannot preview the dialog -- XML resource corrupted."));
|
||||
}
|
||||
}
|
||||
delete res;
|
||||
wxRemoveFile(tempfile);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::RefreshTree()
|
||||
{
|
||||
wxXmlNode *sel = m_SelectedNode;
|
||||
|
||||
m_TreeCtrl->DeleteAllItems();
|
||||
wxTreeItemId root = m_TreeCtrl->AddRoot("Resource: " + m_FileName);
|
||||
|
||||
wxXmlNode *n = m_Resource->GetRoot()->GetChildren();
|
||||
while (n)
|
||||
{
|
||||
if (n->GetType() == wxXML_ELEMENT_NODE)
|
||||
CreateTreeNode(m_TreeCtrl, root, n);
|
||||
n = n->GetNext();
|
||||
}
|
||||
|
||||
m_TreeCtrl->Expand(root);
|
||||
SelectNode(sel);
|
||||
}
|
||||
|
||||
|
||||
void EditorFrame::RefreshProps(wxXmlNode *node)
|
||||
{
|
||||
m_SelectedProp = -1;
|
||||
|
||||
for (int i = 0; i < m_PropsList->GetItemCount(); i++)
|
||||
delete (wxObject*)(m_PropsList->GetItemData(i));
|
||||
|
||||
m_PropsList->DeleteAllItems();
|
||||
|
||||
if (node == NULL) return;
|
||||
|
||||
m_XMLIDCtrl->SetValue(FindHandler(node)->GetRealNode(node)->
|
||||
GetPropVal("name", "-1"));
|
||||
CreatePropsList(m_PropsList, node);
|
||||
|
||||
RefreshPropsEdit();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::RefreshPropsEdit()
|
||||
{
|
||||
m_PropsEditPanel->DestroyChildren();
|
||||
m_PropsEditPanel->SetSizer(NULL);
|
||||
|
||||
if (!m_SelectedNode || m_SelectedProp == -1 ||
|
||||
m_PropsList->GetItemData(m_SelectedProp) == 0) return;
|
||||
|
||||
wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
|
||||
|
||||
sizer->Add(new wxButton(m_PropsEditPanel, ID_CLEARPROP, _("Clear")),
|
||||
0, wxALL, 5);
|
||||
|
||||
sizer->Add(
|
||||
FindHandler(m_SelectedNode)->CreatePropEditPanel(m_PropsEditPanel, m_PropsList, m_SelectedProp),
|
||||
1, wxEXPAND, 0);
|
||||
|
||||
m_PropsEditPanel->SetAutoLayout(TRUE);
|
||||
m_PropsEditPanel->SetSizer(sizer);
|
||||
m_PropsEditPanel->Layout();
|
||||
|
||||
wxSize winsz = m_PropsEditPanel->GetSize();
|
||||
sizer->SetMinSize(winsz.x, winsz.y);
|
||||
|
||||
wxSize minsz = sizer->GetMinSize();
|
||||
|
||||
m_PropsEditPanel->SetScrollbars(8, 8, 1/*minsz.x/8*/, minsz.y/8);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool EditorFrame::SelectNode(wxXmlNode *node, wxTreeItemId *root)
|
||||
{
|
||||
if (root == NULL)
|
||||
{
|
||||
wxTreeItemId rootitem = m_TreeCtrl->GetRootItem();
|
||||
return SelectNode(node, &rootitem);
|
||||
}
|
||||
|
||||
wxTreeItemId item;
|
||||
XmlTreeData *dt;
|
||||
wxXmlNode *nd;
|
||||
long cookie;
|
||||
|
||||
item = m_TreeCtrl->GetFirstChild(*root, cookie);
|
||||
while (item.IsOk())
|
||||
{
|
||||
dt = (XmlTreeData*)(m_TreeCtrl->GetItemData(item));
|
||||
nd = (dt) ? dt->Node : NULL;
|
||||
if (nd == node)
|
||||
{
|
||||
m_TreeCtrl->SelectItem(item);
|
||||
m_TreeCtrl->EnsureVisible(item);
|
||||
return TRUE;
|
||||
}
|
||||
if (m_TreeCtrl->ItemHasChildren(item) && SelectNode(node, &item))
|
||||
return TRUE;
|
||||
item = m_TreeCtrl->GetNextChild(*root, cookie);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxTreeItemId EditorFrame::CreateTreeNode(wxTreeCtrl *treectrl, wxTreeItemId parent, wxXmlNode *node)
|
||||
{
|
||||
if (!node)
|
||||
{
|
||||
wxTreeItemId invalid;
|
||||
return invalid;
|
||||
}
|
||||
|
||||
return FindHandler(node)->CreateTreeNode(treectrl, parent, node);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::CreatePropsList(wxListCtrl *treectrl, wxXmlNode *node)
|
||||
{
|
||||
if (!node) return;
|
||||
|
||||
FindHandler(node)->CreatePropsList(treectrl, node);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::NotifyChanged(int change_type)
|
||||
{
|
||||
if (change_type & CHANGED_TREE)
|
||||
RefreshTree();
|
||||
|
||||
if (change_type & CHANGED_TREE_SELECTED)
|
||||
{
|
||||
wxTreeItemId sel = m_TreeCtrl->GetSelection();
|
||||
m_TreeCtrl->SetItemText(sel,
|
||||
FindHandler(m_SelectedNode)->GetTreeString(m_SelectedNode));
|
||||
}
|
||||
|
||||
if (change_type & CHANGED_TREE_SELECTED_ICON)
|
||||
{
|
||||
wxTreeItemId sel = m_TreeCtrl->GetSelection();
|
||||
int icon = FindHandler(m_SelectedNode)->GetTreeIcon(m_SelectedNode);
|
||||
m_TreeCtrl->SetItemImage(sel, icon);
|
||||
}
|
||||
|
||||
if (change_type & CHANGED_PROPS_PANEL)
|
||||
RefreshProps(m_SelectedNode);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::OnTreeSel(wxTreeEvent& event)
|
||||
{
|
||||
XmlTreeData *dt = (XmlTreeData*)(m_TreeCtrl->GetItemData(event.GetItem()));
|
||||
wxXmlNode *node = (dt) ? dt->Node : NULL;
|
||||
|
||||
m_SelectedNode = node;
|
||||
RefreshProps(node);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::OnXMLIDEdit(wxCommandEvent& event)
|
||||
{
|
||||
if (!m_SelectedNode) return;
|
||||
wxXmlNode *node = FindHandler(m_SelectedNode)->GetRealNode(m_SelectedNode);
|
||||
|
||||
node->DeleteProperty("name");
|
||||
wxString s = m_XMLIDCtrl->GetValue();
|
||||
if (!(s == "-1")) node->AddProperty("name", s);
|
||||
NotifyChanged(CHANGED_TREE_SELECTED);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::OnXMLIDPick(wxCommandEvent& event)
|
||||
{
|
||||
if (!m_SelectedNode) return;
|
||||
wxXmlNode *node = FindHandler(m_SelectedNode)->GetRealNode(m_SelectedNode);
|
||||
|
||||
wxString choices[] = {wxString("-1")
|
||||
#define stdID(id) , wxString(#id)
|
||||
stdID(wxID_OK) stdID(wxID_CANCEL)
|
||||
stdID(wxID_YES) stdID(wxID_NO)
|
||||
stdID(wxID_APPLY) stdID(wxID_HELP)
|
||||
stdID(wxID_HELP_CONTEXT)
|
||||
|
||||
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_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_STATIC) stdID(wxID_FORWARD) stdID(wxID_BACKWARD)
|
||||
stdID(wxID_DEFAULT) stdID(wxID_MORE) stdID(wxID_SETUP)
|
||||
stdID(wxID_RESET)
|
||||
#undef stdID
|
||||
};
|
||||
|
||||
wxString s =
|
||||
wxGetSingleChoice(_("Choose from predefined IDs:"), _("XMLID"),
|
||||
38/*sizeof choices*/, choices);
|
||||
if (!s) return;
|
||||
|
||||
m_XMLIDCtrl->SetValue(s);
|
||||
node->DeleteProperty("name");
|
||||
if (!(s == "-1")) node->AddProperty("name", s);
|
||||
NotifyChanged(CHANGED_TREE_SELECTED);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::OnEditCode(wxCommandEvent& event)
|
||||
{
|
||||
if (!m_SelectedNode) return;
|
||||
|
||||
wxBusyCursor bcur;
|
||||
wxDialog dlg(this, -1, _("XML code editor"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
|
||||
wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
|
||||
wxTextCtrl *tc = new wxTextCtrl(&dlg, -1, "", wxDefaultPosition,
|
||||
wxDefaultSize, wxTE_MULTILINE);
|
||||
sizer->Add(tc, 1, wxEXPAND | wxALL, 10);
|
||||
|
||||
wxSizer *sz2 = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
||||
sz2->Add(new wxButton(&dlg, wxID_OK, _("Save")), 0);
|
||||
sz2->Add(new wxButton(&dlg, wxID_CANCEL, _("Cancel")), 0, wxLEFT, 10);
|
||||
|
||||
sizer->Add(sz2, 0, wxALIGN_RIGHT | wxRIGHT|wxBOTTOM, 10);
|
||||
|
||||
dlg.SetAutoLayout(TRUE);
|
||||
dlg.SetSizer(sizer);
|
||||
|
||||
wxConfigBase *cfg = wxConfigBase::Get();
|
||||
|
||||
dlg.SetSize(wxRect(wxPoint(cfg->Read("xmleditor_x", -1), cfg->Read("xmleditor_y", -1)),
|
||||
wxSize(cfg->Read("xmleditor_w", 400), cfg->Read("xmleditor_h", 400))));
|
||||
|
||||
wxString tempfile;
|
||||
wxGetTempFileName("xmleditor", tempfile);
|
||||
|
||||
{
|
||||
wxXmlDocument doc;
|
||||
doc.SetRoot(new wxXmlNode(*m_SelectedNode));
|
||||
doc.Save(tempfile, wxXML_IO_LIBXML);
|
||||
}
|
||||
tc->LoadFile(tempfile);
|
||||
|
||||
if (dlg.ShowModal() == wxID_OK)
|
||||
{
|
||||
tc->SaveFile(tempfile);
|
||||
wxXmlDocument doc;
|
||||
if (doc.Load(tempfile))
|
||||
{
|
||||
(*m_SelectedNode) = *doc.GetRoot();
|
||||
NotifyChanged(CHANGED_TREE);
|
||||
//FIXME-instead, regenerate only children
|
||||
}
|
||||
else wxLogError(_("Illegal XML file, canceled."));
|
||||
}
|
||||
wxRemoveFile(tempfile);
|
||||
|
||||
cfg->Write("xmleditor_x", (long)dlg.GetPosition().x);
|
||||
cfg->Write("xmleditor_y", (long)dlg.GetPosition().y);
|
||||
cfg->Write("xmleditor_w", (long)dlg.GetSize().x);
|
||||
cfg->Write("xmleditor_h", (long)dlg.GetSize().y);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::OnClearProp(wxCommandEvent& event)
|
||||
{
|
||||
m_PropsList->SetItemImage(m_SelectedProp, 0, 0);
|
||||
m_PropsList->SetItem(m_SelectedProp, 1, "");
|
||||
|
||||
PropsListInfo *pli = (PropsListInfo*)m_PropsList->GetItemData(m_SelectedProp);
|
||||
|
||||
wxXmlNode *nd = XmlFindNode(pli->m_Node, pli->m_PropInfo->Name);
|
||||
|
||||
if (nd == NULL) return;
|
||||
nd->GetParent()->RemoveChild(nd);
|
||||
delete nd;
|
||||
RefreshPropsEdit();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::OnPropSel(wxListEvent& event)
|
||||
{
|
||||
m_SelectedProp = event.GetIndex();
|
||||
RefreshPropsEdit();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::OnToolbar(wxCommandEvent& event)
|
||||
{
|
||||
switch (event.GetId())
|
||||
{
|
||||
case ID_PREVIEW :
|
||||
{
|
||||
XmlTreeData* dt = (XmlTreeData*)m_TreeCtrl->GetItemData(m_TreeCtrl->GetSelection());;
|
||||
if (dt != NULL && dt->Node != NULL)
|
||||
RefreshPreview(dt->Node);
|
||||
break;
|
||||
}
|
||||
|
||||
case ID_EXIT :
|
||||
Close(TRUE);
|
||||
break;
|
||||
|
||||
case ID_NEW :
|
||||
NewFile();
|
||||
break;
|
||||
|
||||
case ID_OPEN :
|
||||
{
|
||||
wxString name = wxFileSelector("Open XML resource", "", "", "", "XML resources|*.xml", wxOPEN | wxFILE_MUST_EXIST);
|
||||
if (!name.IsEmpty())
|
||||
LoadFile(name);
|
||||
break;
|
||||
}
|
||||
|
||||
case ID_SAVE :
|
||||
if (m_FileName != "") { SaveFile(m_FileName); break;}
|
||||
// else go to SAVEAS
|
||||
|
||||
case ID_SAVEAS :
|
||||
{
|
||||
wxString name = wxFileSelector("Save as", "", m_FileName, "", "XML resources|*.xml", wxSAVE | wxOVERWRITE_PROMPT);
|
||||
if (!name.IsEmpty())
|
||||
SaveFile((m_FileName = name));
|
||||
break;
|
||||
}
|
||||
|
||||
case ID_DELETE_NODE :
|
||||
{
|
||||
XmlTreeData *dt = (XmlTreeData*)
|
||||
(m_TreeCtrl->GetItemData(m_TreeCtrl->GetParent(m_TreeCtrl->GetSelection())));
|
||||
wxXmlNode *n = (dt) ? dt->Node : NULL;
|
||||
|
||||
m_SelectedNode->GetParent()->RemoveChild(m_SelectedNode);
|
||||
NotifyChanged(CHANGED_TREE);
|
||||
SelectNode(n);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::OnNewNode(wxCommandEvent& event)
|
||||
{
|
||||
if (event.GetId() >= ID_NEWSYBNODE)
|
||||
{
|
||||
XmlTreeData *pardt =
|
||||
(XmlTreeData*)(m_TreeCtrl->GetItemData(
|
||||
m_TreeCtrl->GetParent(m_TreeCtrl->GetSelection())));
|
||||
|
||||
if (pardt && pardt->Node && pardt->Node != m_Resource->GetRoot())
|
||||
{
|
||||
wxXmlNode *nd = pardt->Node;
|
||||
|
||||
wxXmlNode *realnode = FindHandler(nd)->GetRealNode(nd);
|
||||
NodeHandler *hnd = FindHandler(realnode);
|
||||
wxString name = hnd->GetChildTypes()[event.GetId()-ID_NEWSYBNODE];
|
||||
|
||||
wxXmlNode *node = new wxXmlNode(wxXML_ELEMENT_NODE, name);
|
||||
hnd->InsertNode(realnode, node, m_SelectedNode);
|
||||
wxTreeItemId root = m_TreeCtrl->GetSelection();
|
||||
SelectNode(node, &root);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
else if (event.GetId() >= ID_NEWNODE)
|
||||
{
|
||||
wxXmlNode *realnode = FindHandler(m_SelectedNode)->GetRealNode(m_SelectedNode);
|
||||
NodeHandler *hnd = FindHandler(realnode);
|
||||
wxString name = hnd->GetChildTypes()[event.GetId()-ID_NEWNODE];
|
||||
|
||||
wxXmlNode *node = new wxXmlNode(wxXML_ELEMENT_NODE, name);
|
||||
hnd->InsertNode(realnode, node);
|
||||
wxTreeItemId root = m_TreeCtrl->GetSelection();
|
||||
SelectNode(node, &root);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
wxString name;
|
||||
switch (event.GetId())
|
||||
{
|
||||
case ID_NEWDIALOG : name = "dialog"; break;
|
||||
case ID_NEWPANEL : name = "panel"; break;
|
||||
case ID_NEWMENU : name = "menu"; break;
|
||||
case ID_NEWMENUBAR : name = "menubar"; break;
|
||||
case ID_NEWTOOLBAR : name = "toolbar"; break;
|
||||
default : return; // never occurs
|
||||
}
|
||||
|
||||
wxXmlNode *node = new wxXmlNode(wxXML_ELEMENT_NODE, name);
|
||||
m_Resource->GetRoot()->AddChild(node);
|
||||
NotifyChanged(CHANGED_TREE);
|
||||
SelectNode(node);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void EditorFrame::OnRightClickTree(wxPoint pos)
|
||||
{
|
||||
wxMenu *popup = new wxMenu;
|
||||
|
||||
if (m_SelectedNode == NULL || m_SelectedNode == m_Resource->GetRoot())
|
||||
{
|
||||
popup->Append(ID_NEWDIALOG, _("New dialog"));
|
||||
popup->Append(ID_NEWPANEL, _("New panel"));
|
||||
popup->Append(ID_NEWMENU, _("New menu"));
|
||||
popup->Append(ID_NEWMENUBAR, _("New menubar"));
|
||||
popup->Append(ID_NEWTOOLBAR, _("New toolbar"));
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
{
|
||||
wxArrayString& arr =
|
||||
FindHandler(FindHandler(m_SelectedNode)->GetRealNode(m_SelectedNode))->
|
||||
GetChildTypes();
|
||||
|
||||
if (!arr.IsEmpty())
|
||||
{
|
||||
wxMenu *news = new wxMenu;
|
||||
for (size_t i = 0; i < arr.GetCount(); i++)
|
||||
{
|
||||
news->Append(i + ID_NEWNODE, arr[i]);
|
||||
if (i % 16 == 15) news->Break();
|
||||
}
|
||||
popup->Append(ID_NEWNODE-1, _("New child"), news);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
XmlTreeData *pardt =
|
||||
(XmlTreeData*)(m_TreeCtrl->GetItemData(
|
||||
m_TreeCtrl->GetParent(m_TreeCtrl->GetSelection())));
|
||||
if (pardt && pardt->Node && pardt->Node != m_Resource->GetRoot())
|
||||
{
|
||||
wxXmlNode *nd = pardt->Node;
|
||||
wxArrayString& arr =
|
||||
FindHandler(FindHandler(nd)->GetRealNode(nd))->
|
||||
GetChildTypes();
|
||||
|
||||
if (!arr.IsEmpty())
|
||||
{
|
||||
wxMenu *news = new wxMenu;
|
||||
for (size_t i = 0; i < arr.GetCount(); i++)
|
||||
{
|
||||
news->Append(i + ID_NEWSYBNODE, arr[i]);
|
||||
if (i % 16 == 15) news->Break();
|
||||
}
|
||||
popup->Append(ID_NEWSYBNODE-1, _("New sybling"), news);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
popup->AppendSeparator();
|
||||
popup->Append(ID_DELETE_NODE, _("Delete"));
|
||||
}
|
||||
|
||||
m_TreeCtrl->PopupMenu(popup, pos);
|
||||
delete popup;
|
||||
}
|
107
contrib/utils/wxrcedit/editor.h
Normal file
107
contrib/utils/wxrcedit/editor.h
Normal file
@@ -0,0 +1,107 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Purpose: XML resources editor
|
||||
// Author: Vaclav Slavik
|
||||
// Created: 2000/05/05
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2000 Vaclav Slavik
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface "editor.h"
|
||||
#endif
|
||||
|
||||
#ifndef _EDITOR_H_
|
||||
#define _EDITOR_H_
|
||||
|
||||
|
||||
class wxXmlNode;
|
||||
class wxTreeCtrl;
|
||||
class wxScrolledWindow;
|
||||
class wxSplitterWindow;
|
||||
|
||||
#include "wx/frame.h"
|
||||
|
||||
|
||||
|
||||
class NodeHandler;
|
||||
class wxXmlNode;
|
||||
class wxXmlDocument;
|
||||
class EditorTreeCtrl;
|
||||
|
||||
enum ChangeType
|
||||
{
|
||||
CHANGED_NOTHING = 0,
|
||||
CHANGED_TREE = 1,
|
||||
CHANGED_TREE_SELECTED = 2,
|
||||
CHANGED_TREE_SELECTED_ICON = 4,
|
||||
CHANGED_PROPS = 8,
|
||||
CHANGED_PROPS_PANEL = 16,
|
||||
CHANGED_EVERYTHING = CHANGED_TREE | CHANGED_PROPS | CHANGED_PROPS_PANEL,
|
||||
};
|
||||
|
||||
|
||||
class EditorFrame : public wxFrame
|
||||
{
|
||||
public:
|
||||
friend class EditorTreeCtrl;
|
||||
|
||||
EditorFrame(wxFrame *parent, const wxString& filename);
|
||||
~EditorFrame();
|
||||
|
||||
void LoadFile(const wxString& filename);
|
||||
void NewFile();
|
||||
void SaveFile(const wxString& filename);
|
||||
|
||||
void RefreshTree();
|
||||
void RefreshPreview(wxXmlNode *node);
|
||||
void RefreshProps(wxXmlNode *node);
|
||||
void RefreshPropsEdit();
|
||||
bool SelectNode(wxXmlNode *node, wxTreeItemId *root = NULL);
|
||||
|
||||
wxTreeItemId CreateTreeNode(wxTreeCtrl *treectrl, wxTreeItemId parent, wxXmlNode *node);
|
||||
void CreatePropsList(wxListCtrl *listctrl, wxXmlNode *node);
|
||||
|
||||
void NotifyChanged(int change_type);
|
||||
|
||||
void RegisterHandlers(const wxString& dir);
|
||||
|
||||
NodeHandler *FindHandler(wxXmlNode *node);
|
||||
|
||||
static EditorFrame *Get() { return ms_Instance; }
|
||||
|
||||
private:
|
||||
static EditorFrame *ms_Instance;
|
||||
|
||||
wxTreeCtrl *m_TreeCtrl;
|
||||
wxTextCtrl *m_XMLIDCtrl;
|
||||
wxImageList *m_ImgList, *m_ImgListProp;
|
||||
wxPanel *m_PropsPanel;
|
||||
wxScrolledWindow *m_PropsEditPanel;
|
||||
wxSplitterWindow *m_Splitter, *m_Splitter2;
|
||||
wxListCtrl *m_PropsList;
|
||||
int m_SelectedProp;
|
||||
|
||||
wxList m_Handlers;
|
||||
|
||||
wxXmlNode *m_SelectedNode;
|
||||
|
||||
wxString m_FileName;
|
||||
wxXmlDocument *m_Resource;
|
||||
wxWindow *m_Preview;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
void OnTreeSel(wxTreeEvent& event);
|
||||
void OnToolbar(wxCommandEvent& event);
|
||||
void OnNew(wxCommandEvent& event);
|
||||
void OnXMLIDEdit(wxCommandEvent& event);
|
||||
void OnXMLIDPick(wxCommandEvent& event);
|
||||
void OnEditCode(wxCommandEvent& event);
|
||||
void OnClearProp(wxCommandEvent& event);
|
||||
void OnPropSel(wxListEvent& event);
|
||||
void OnNewNode(wxCommandEvent& event);
|
||||
void OnRightClickTree(wxPoint pos);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
437
contrib/utils/wxrcedit/nodehnd.cpp
Normal file
437
contrib/utils/wxrcedit/nodehnd.cpp
Normal file
@@ -0,0 +1,437 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Author: Vaclav Slavik
|
||||
// Created: 2000/05/05
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2000 Vaclav Slavik
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "nodehnd.h"
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#include "nodehnd.h"
|
||||
#include "wx/xml/xml.h"
|
||||
#include "wx/filefn.h"
|
||||
#include "wx/wx.h"
|
||||
#include "wx/arrimpl.cpp"
|
||||
#include "wx/textfile.h"
|
||||
#include "wx/tokenzr.h"
|
||||
#include "wx/listctrl.h"
|
||||
#include "editor.h"
|
||||
#include "treedt.h"
|
||||
#include "xmlhelpr.h"
|
||||
|
||||
|
||||
WX_DEFINE_OBJARRAY(NodeInfoArray);
|
||||
|
||||
|
||||
|
||||
void NodeInfo::Read(const wxString& filename)
|
||||
{
|
||||
HandlerType tp = HANDLER_NONE;
|
||||
wxString nd, cht;
|
||||
bool ab = FALSE;
|
||||
long icn = -1;
|
||||
|
||||
Node.Empty();
|
||||
|
||||
wxPathList list;
|
||||
list.Add(".");
|
||||
list.Add("./df");
|
||||
#ifdef __UNIX__
|
||||
list.Add(wxGetHomeDir() + "/.wxrcedit");
|
||||
#endif
|
||||
|
||||
wxString path = list.FindValidPath(filename);
|
||||
if (path.IsEmpty()) return;
|
||||
|
||||
wxTextFile tf;
|
||||
tf.Open(path);
|
||||
if (!tf.IsOpened()) return;
|
||||
|
||||
for (size_t i = 0; i < tf.GetLineCount(); i++)
|
||||
{
|
||||
if (tf[i].IsEmpty() || tf[i][0] == '#') continue;
|
||||
wxStringTokenizer tkn(tf[i], ' ');
|
||||
wxString s = tkn.GetNextToken();
|
||||
if (s == "node")
|
||||
nd = tkn.GetNextToken();
|
||||
else if (s == "childtype")
|
||||
cht = tkn.GetNextToken();
|
||||
else if (s == "icon")
|
||||
tkn.GetNextToken().ToLong(&icn);
|
||||
else if (s == "derived")
|
||||
{
|
||||
if (tkn.GetNextToken() == "from")
|
||||
{
|
||||
s = tkn.GetNextToken();
|
||||
DerivedFrom.Add(s);
|
||||
Read(s + ".df");
|
||||
}
|
||||
}
|
||||
else if (s == "abstract")
|
||||
ab = true;
|
||||
else if (s == "type")
|
||||
{
|
||||
s = tkn.GetNextToken();
|
||||
if (s == "sizer") tp = HANDLER_SIZER;
|
||||
else if (s == "sizeritem") tp = HANDLER_SIZERITEM;
|
||||
else if (s == "panel") tp = HANDLER_PANEL;
|
||||
else /*if (s == "normal")*/ tp = HANDLER_NORMAL;
|
||||
}
|
||||
else if (s == "var")
|
||||
{
|
||||
PropertyInfo pi;
|
||||
pi.Name = tkn.GetNextToken();
|
||||
tkn.GetNextToken();
|
||||
wxString typ = tkn.GetNextToken();
|
||||
if (tkn.HasMoreTokens()) pi.MoreInfo = tkn.GetNextToken();
|
||||
if (typ == "color") pi.Type = PROP_COLOR;
|
||||
else if (typ == "flags") pi.Type = PROP_FLAGS;
|
||||
else if (typ == "bool") pi.Type = PROP_BOOL;
|
||||
else if (typ == "integer") pi.Type = PROP_INTEGER;
|
||||
else if (typ == "coord") pi.Type = PROP_COORD;
|
||||
else /*if (typ == "text")*/ pi.Type = PROP_TEXT;
|
||||
|
||||
bool fnd = FALSE;
|
||||
for (size_t j = 0; j < Props.GetCount(); j++)
|
||||
{
|
||||
if (Props[j].Name == pi.Name)
|
||||
{
|
||||
if (Props[j].Type == pi.Type && pi.Type == PROP_FLAGS)
|
||||
Props[j].MoreInfo << ',' << pi.MoreInfo;
|
||||
else
|
||||
Props[j] = pi;
|
||||
fnd = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (!fnd) Props.Add(pi);
|
||||
}
|
||||
}
|
||||
|
||||
if (!nd.IsEmpty()) Node = nd;
|
||||
if (!cht.IsEmpty()) ChildType = cht;
|
||||
if (tp != HANDLER_NONE) Type = tp;
|
||||
if (icn != -1) Icon = icn;
|
||||
Abstract = ab;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NodeHandler *NodeHandler::CreateFromFile(const wxString& filename, EditorFrame *frame)
|
||||
{
|
||||
NodeHandler *hnd = NULL;
|
||||
|
||||
if (s_AllNodes == NULL) s_AllNodes = new NodeInfoArray;
|
||||
|
||||
NodeInfo *ni = new NodeInfo;
|
||||
ni->Type = HANDLER_NONE;
|
||||
ni->Icon = 0;
|
||||
ni->Read(filename);
|
||||
s_AllNodes->Add(*ni); // add a copy
|
||||
|
||||
if (ni->Type == HANDLER_NONE || ni->Node.IsEmpty() || ni->Abstract)
|
||||
return NULL;
|
||||
|
||||
switch (ni->Type)
|
||||
{
|
||||
case HANDLER_PANEL:
|
||||
hnd = new NodeHandlerPanel(frame, ni);
|
||||
break;
|
||||
case HANDLER_SIZER:
|
||||
hnd = new NodeHandlerSizer(frame, ni);
|
||||
break;
|
||||
case HANDLER_SIZERITEM:
|
||||
hnd = new NodeHandlerSizerItem(frame, ni);
|
||||
break;
|
||||
default:
|
||||
hnd = new NodeHandler(frame, ni);
|
||||
break;
|
||||
}
|
||||
|
||||
return hnd;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
PropertyHandler* NodeHandler::s_PropHandlers[PROP_TYPES_CNT] = {NULL};
|
||||
int NodeHandler::s_RefCnt = 0;
|
||||
NodeInfoArray* NodeHandler::s_AllNodes = NULL;
|
||||
|
||||
|
||||
NodeHandler::NodeHandler(EditorFrame *frame, NodeInfo *ni) :
|
||||
m_NodeInfo(ni)
|
||||
{
|
||||
if (s_RefCnt++ == 0) CreatePropHandlers();
|
||||
}
|
||||
|
||||
|
||||
void NodeHandler::CreatePropHandlers()
|
||||
{
|
||||
s_PropHandlers[PROP_TEXT] = new TextPropertyHandler;
|
||||
s_PropHandlers[PROP_FLAGS] = new FlagsPropertyHandler;
|
||||
s_PropHandlers[PROP_COLOR] = new TextPropertyHandler;
|
||||
s_PropHandlers[PROP_BOOL] = new BoolPropertyHandler;
|
||||
s_PropHandlers[PROP_INTEGER] = new TextPropertyHandler;
|
||||
s_PropHandlers[PROP_COORD] = new CoordPropertyHandler;
|
||||
}
|
||||
|
||||
|
||||
NodeHandler::~NodeHandler()
|
||||
{
|
||||
if (--s_RefCnt == 0)
|
||||
{
|
||||
for (int i = 0; i < PROP_TYPES_CNT; i++)
|
||||
delete s_PropHandlers[i];
|
||||
delete s_AllNodes; s_AllNodes = NULL;
|
||||
}
|
||||
delete m_NodeInfo;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool NodeHandler::CanHandle(wxXmlNode *node)
|
||||
{
|
||||
return (m_NodeInfo->Node == node->GetName());
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxTreeItemId NodeHandler::CreateTreeNode(wxTreeCtrl *treectrl,
|
||||
wxTreeItemId parent,
|
||||
wxXmlNode *node)
|
||||
{
|
||||
int icon = GetTreeIcon(node);
|
||||
wxTreeItemId item =
|
||||
treectrl->AppendItem(parent, GetTreeString(node),
|
||||
icon, icon, new XmlTreeData(node));
|
||||
if (parent == treectrl->GetRootItem())
|
||||
treectrl->SetItemBold(item);
|
||||
return item;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxString NodeHandler::GetTreeString(wxXmlNode *node)
|
||||
{
|
||||
wxString xmlid = node->GetPropVal("name", "");
|
||||
if (xmlid.IsEmpty())
|
||||
return node->GetName();
|
||||
else
|
||||
return (node->GetName() + " '" + xmlid + "'");
|
||||
}
|
||||
|
||||
|
||||
|
||||
void NodeHandler::CreatePropsList(wxListCtrl *listctrl, wxXmlNode *node)
|
||||
{
|
||||
int index;
|
||||
|
||||
for (size_t i = 0; i < m_NodeInfo->Props.GetCount(); i++)
|
||||
{
|
||||
PropertyInfo *p = &(m_NodeInfo->Props[i]);
|
||||
index = s_PropHandlers[p->Type]->CreateListItem(listctrl, node, p);
|
||||
listctrl->SetItemData(index, (long)new PropsListInfo(
|
||||
index, s_PropHandlers[p->Type], node,
|
||||
p, listctrl));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxPanel *NodeHandler::CreatePropEditPanel(wxWindow *parent, wxListCtrl *listctrl, int index)
|
||||
{
|
||||
PropsListInfo *pli = (PropsListInfo*)listctrl->GetItemData(index);
|
||||
|
||||
return pli->m_Handler->CreateEditPanel(parent, pli);
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxArrayString& NodeHandler::GetChildTypes()
|
||||
{
|
||||
if (m_ChildTypes.IsEmpty())
|
||||
{
|
||||
wxString basetype = m_NodeInfo->ChildType;
|
||||
|
||||
for (size_t i = 0; i < s_AllNodes->GetCount(); i++)
|
||||
{
|
||||
NodeInfo &ni = (*s_AllNodes)[i];
|
||||
|
||||
if (ni.Node == basetype && !ni.Abstract)
|
||||
m_ChildTypes.Add(ni.Node);
|
||||
|
||||
if (ni.DerivedFrom.Index(basetype) != wxNOT_FOUND && !ni.Abstract)
|
||||
m_ChildTypes.Add(ni.Node);
|
||||
}
|
||||
m_ChildTypes.Sort();
|
||||
}
|
||||
|
||||
return m_ChildTypes;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void NodeHandler::InsertNode(wxXmlNode *parent, wxXmlNode *node, wxXmlNode *insert_before)
|
||||
{
|
||||
delete node;
|
||||
wxLogError(_("Cannot insert child into this type of node!"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
wxTreeItemId NodeHandlerPanel::CreateTreeNode(wxTreeCtrl *treectrl,
|
||||
wxTreeItemId parent,
|
||||
wxXmlNode *node)
|
||||
{
|
||||
wxTreeItemId root = NodeHandler::CreateTreeNode(treectrl, parent, node);
|
||||
|
||||
wxXmlNode *n = XmlFindNode(node, "children");
|
||||
|
||||
if (n) n = n->GetChildren();
|
||||
|
||||
while (n)
|
||||
{
|
||||
if (n->GetType() == wxXML_ELEMENT_NODE)
|
||||
EditorFrame::Get()->CreateTreeNode(treectrl, root, n);
|
||||
n = n->GetNext();
|
||||
}
|
||||
treectrl->Expand(root);
|
||||
return root;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void NodeHandlerPanel::InsertNode(wxXmlNode *parent, wxXmlNode *node, wxXmlNode *insert_before)
|
||||
{
|
||||
wxXmlNode *cnd = XmlFindNode(parent, "children");
|
||||
if (cnd == NULL)
|
||||
{
|
||||
cnd = new wxXmlNode(wxXML_ELEMENT_NODE, "children");
|
||||
parent->AddChild(cnd);
|
||||
}
|
||||
if (insert_before)
|
||||
cnd->InsertChild(node, insert_before);
|
||||
else
|
||||
cnd->AddChild(node);
|
||||
EditorFrame::Get()->NotifyChanged(CHANGED_TREE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void NodeHandlerSizer::InsertNode(wxXmlNode *parent, wxXmlNode *node, wxXmlNode *insert_before)
|
||||
{
|
||||
wxXmlNode *cnd = XmlFindNode(parent, "children");
|
||||
if (cnd == NULL)
|
||||
{
|
||||
cnd = new wxXmlNode(wxXML_ELEMENT_NODE, "children");
|
||||
parent->AddChild(cnd);
|
||||
}
|
||||
|
||||
if (node->GetName() == "spacer")
|
||||
{
|
||||
if (insert_before)
|
||||
cnd->InsertChild(node, insert_before);
|
||||
else
|
||||
cnd->AddChild(node);
|
||||
}
|
||||
else
|
||||
{
|
||||
wxXmlNode *itemnode = new wxXmlNode(wxXML_ELEMENT_NODE, "sizeritem");
|
||||
wxXmlNode *winnode = new wxXmlNode(wxXML_ELEMENT_NODE, "window");
|
||||
itemnode->AddChild(winnode);
|
||||
winnode->AddChild(node);
|
||||
|
||||
if (insert_before)
|
||||
cnd->InsertChild(itemnode, insert_before);
|
||||
else
|
||||
cnd->AddChild(itemnode);
|
||||
}
|
||||
EditorFrame::Get()->NotifyChanged(CHANGED_TREE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
int NodeHandlerSizer::GetTreeIcon(wxXmlNode *node)
|
||||
{
|
||||
if (XmlReadValue(node, "orient") == "wxVERTICAL") return 2;
|
||||
else return 3;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxTreeItemId NodeHandlerSizerItem::CreateTreeNode(wxTreeCtrl *treectrl,
|
||||
wxTreeItemId parent,
|
||||
wxXmlNode *node)
|
||||
{
|
||||
wxTreeItemId root;
|
||||
|
||||
root = EditorFrame::Get()->CreateTreeNode(treectrl, parent, GetRealNode(node));
|
||||
((XmlTreeData*)treectrl->GetItemData(root))->Node = node;
|
||||
|
||||
treectrl->Expand(root);
|
||||
return root;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void NodeHandlerSizerItem::CreatePropsList(wxListCtrl *listctrl, wxXmlNode *node)
|
||||
{
|
||||
NodeHandler::CreatePropsList(listctrl, node);
|
||||
int item = listctrl->GetItemCount();
|
||||
listctrl->InsertItem(item, "------");
|
||||
listctrl->SetItemImage(item, 0, 0);
|
||||
EditorFrame::Get()->CreatePropsList(listctrl, GetRealNode(node));
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxString NodeHandlerSizerItem::GetTreeString(wxXmlNode *node)
|
||||
{
|
||||
wxXmlNode *n = GetRealNode(node);
|
||||
return EditorFrame::Get()->FindHandler(n)->GetTreeString(n);
|
||||
}
|
||||
|
||||
|
||||
|
||||
int NodeHandlerSizerItem::GetTreeIcon(wxXmlNode *node)
|
||||
{
|
||||
wxXmlNode *n = GetRealNode(node);
|
||||
return EditorFrame::Get()->FindHandler(n)->GetTreeIcon(n);
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxXmlNode *NodeHandlerSizerItem::GetRealNode(wxXmlNode *node)
|
||||
{
|
||||
wxXmlNode *n = XmlFindNode(node, "window");
|
||||
|
||||
if (n) n = n->GetChildren();
|
||||
|
||||
while (n)
|
||||
{
|
||||
if (n->GetType() == wxXML_ELEMENT_NODE)
|
||||
return n;
|
||||
n = n->GetNext();
|
||||
}
|
||||
return NULL;
|
||||
}
|
138
contrib/utils/wxrcedit/nodehnd.h
Normal file
138
contrib/utils/wxrcedit/nodehnd.h
Normal file
@@ -0,0 +1,138 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Purpose: XML resources editor
|
||||
// Author: Vaclav Slavik
|
||||
// Created: 2000/05/05
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2000 Vaclav Slavik
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface "nodehnd.h"
|
||||
#endif
|
||||
|
||||
#ifndef _NODEHND_H_
|
||||
#define _NODEHND_H_
|
||||
|
||||
|
||||
class wxXmlNode;
|
||||
class wxList;
|
||||
class wxListCtrl;
|
||||
|
||||
class EditorFrame;
|
||||
|
||||
#include "wx/treectrl.h"
|
||||
#include "wx/xml/xml.h"
|
||||
#include "prophnd.h"
|
||||
|
||||
|
||||
|
||||
enum HandlerType
|
||||
{
|
||||
HANDLER_NONE = 0,
|
||||
HANDLER_PANEL = 1,
|
||||
HANDLER_NORMAL,
|
||||
HANDLER_SIZER,
|
||||
HANDLER_SIZERITEM
|
||||
};
|
||||
|
||||
|
||||
class NodeInfo
|
||||
{
|
||||
public:
|
||||
wxString Node;
|
||||
HandlerType Type;
|
||||
PropertyInfoArray Props;
|
||||
wxArrayString DerivedFrom;
|
||||
bool Abstract;
|
||||
wxString ChildType;
|
||||
int Icon;
|
||||
|
||||
void Read(const wxString& filename);
|
||||
};
|
||||
|
||||
WX_DECLARE_OBJARRAY(NodeInfo, NodeInfoArray);
|
||||
|
||||
|
||||
|
||||
|
||||
class NodeHandler : public wxObject
|
||||
{
|
||||
public:
|
||||
static NodeHandler *CreateFromFile(const wxString& filename, EditorFrame *frame);
|
||||
|
||||
NodeHandler(EditorFrame *frame, NodeInfo *ni);
|
||||
virtual ~NodeHandler();
|
||||
|
||||
virtual bool CanHandle(wxXmlNode *node);
|
||||
virtual wxTreeItemId CreateTreeNode(wxTreeCtrl *treectrl, wxTreeItemId parent,
|
||||
wxXmlNode *node);
|
||||
virtual void CreatePropsList(wxListCtrl *listctrl, wxXmlNode *node);
|
||||
virtual int GetTreeIcon(wxXmlNode * WXUNUSED(node)) {return m_NodeInfo->Icon;}
|
||||
virtual wxString GetTreeString(wxXmlNode *node);
|
||||
wxPanel *CreatePropEditPanel(wxWindow *parent, wxListCtrl *listctrl, int index);
|
||||
wxArrayString& GetChildTypes();
|
||||
virtual void InsertNode(wxXmlNode *parent, wxXmlNode *node, wxXmlNode *insert_before = NULL);
|
||||
virtual wxXmlNode *GetRealNode(wxXmlNode *node) { return node; }
|
||||
|
||||
protected:
|
||||
NodeInfo *m_NodeInfo;
|
||||
wxArrayString m_ChildTypes;
|
||||
|
||||
static PropertyHandler* s_PropHandlers[PROP_TYPES_CNT];
|
||||
static int s_RefCnt;
|
||||
static NodeInfoArray* s_AllNodes;
|
||||
|
||||
void CreatePropHandlers();
|
||||
};
|
||||
|
||||
// wxPanel handler
|
||||
class NodeHandlerPanel : public NodeHandler
|
||||
{
|
||||
public:
|
||||
NodeHandlerPanel(EditorFrame *frame, NodeInfo *ni) : NodeHandler(frame, ni) {}
|
||||
|
||||
virtual wxTreeItemId CreateTreeNode(wxTreeCtrl *treectrl, wxTreeItemId parent,
|
||||
wxXmlNode *node);
|
||||
virtual void InsertNode(wxXmlNode *parent, wxXmlNode *node, wxXmlNode *insert_before = NULL);
|
||||
};
|
||||
|
||||
|
||||
// wxSizers handler
|
||||
class NodeHandlerSizer : public NodeHandlerPanel
|
||||
{
|
||||
public:
|
||||
NodeHandlerSizer(EditorFrame *frame, NodeInfo *ni) : NodeHandlerPanel(frame, ni) {}
|
||||
|
||||
virtual void InsertNode(wxXmlNode *parent, wxXmlNode *node, wxXmlNode *insert_before = NULL);
|
||||
virtual int GetTreeIcon(wxXmlNode *node);
|
||||
};
|
||||
|
||||
|
||||
// item of wxSizer handler
|
||||
class NodeHandlerSizerItem : public NodeHandler
|
||||
{
|
||||
public:
|
||||
NodeHandlerSizerItem(EditorFrame *frame, NodeInfo *ni) : NodeHandler(frame, ni) {}
|
||||
|
||||
virtual wxTreeItemId CreateTreeNode(wxTreeCtrl *treectrl, wxTreeItemId parent,
|
||||
wxXmlNode *node);
|
||||
virtual void CreatePropsList(wxListCtrl *listctrl, wxXmlNode *node);
|
||||
virtual wxString GetTreeString(wxXmlNode *node);
|
||||
virtual int GetTreeIcon(wxXmlNode *node);
|
||||
virtual wxXmlNode *GetRealNode(wxXmlNode *node);
|
||||
};
|
||||
|
||||
|
||||
|
||||
// Generic handler which handles everything
|
||||
class NodeHandlerUnknown : public NodeHandler
|
||||
{
|
||||
public:
|
||||
NodeHandlerUnknown(EditorFrame *frame) : NodeHandler(frame, new NodeInfo) {}
|
||||
|
||||
virtual bool CanHandle(wxXmlNode *node) { return TRUE; }
|
||||
};
|
||||
|
||||
|
||||
#endif
|
332
contrib/utils/wxrcedit/prophnd.cpp
Normal file
332
contrib/utils/wxrcedit/prophnd.cpp
Normal file
@@ -0,0 +1,332 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Author: Vaclav Slavik
|
||||
// Created: 2000/05/05
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2000 Vaclav Slavik
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "prophnd.h"
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#include "prophnd.h"
|
||||
#include "wx/xml/xml.h"
|
||||
#include "wx/wx.h"
|
||||
#include "wx/arrimpl.cpp"
|
||||
#include "wx/valtext.h"
|
||||
#include "wx/tokenzr.h"
|
||||
#include "wx/checklst.h"
|
||||
#include "xmlhelpr.h"
|
||||
#include "editor.h"
|
||||
|
||||
|
||||
WX_DEFINE_OBJARRAY(PropertyInfoArray);
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
ID_EDITCTRL = wxID_HIGHEST + 1000,
|
||||
ID_XEDIT,
|
||||
ID_YEDIT,
|
||||
ID_USEDLG,
|
||||
ID_BOOLVAL,
|
||||
ID_CHECKLIST
|
||||
};
|
||||
|
||||
|
||||
|
||||
class PropertyPanel : public wxPanel
|
||||
{
|
||||
public:
|
||||
PropertyPanel(wxWindow *parent, PropertyHandler *hnd, PropsListInfo *pli)
|
||||
: wxPanel(parent, -1), m_Handler(hnd), m_PLI(pli) {}
|
||||
|
||||
void Update(const wxString& value)
|
||||
{
|
||||
XmlWriteValue(m_PLI->m_Node, m_PLI->m_PropInfo->Name, value);
|
||||
m_PLI->m_ListCtrl->SetItemImage(m_PLI->m_Index, 1, 1);
|
||||
m_PLI->m_ListCtrl->SetItem(m_PLI->m_Index, 1,
|
||||
m_Handler->GetBriefValue(m_PLI->m_Node, m_PLI->m_PropInfo));
|
||||
}
|
||||
|
||||
protected:
|
||||
PropertyHandler *m_Handler;
|
||||
PropsListInfo *m_PLI;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int PropertyHandler::CreateListItem(wxListCtrl *listctrl, wxXmlNode *node, PropertyInfo *pi)
|
||||
{
|
||||
wxString name, value;
|
||||
int iconnum;
|
||||
|
||||
if (XmlFindNode(node, pi->Name) == NULL) iconnum = 0; else iconnum = 1;
|
||||
name = pi->Name;
|
||||
value = GetBriefValue(node, pi);
|
||||
|
||||
long pos = listctrl->GetItemCount();
|
||||
listctrl->InsertItem(pos, name, iconnum);
|
||||
listctrl->SetItem(pos, 1, value);
|
||||
return pos;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxString PropertyHandler::GetBriefValue(wxXmlNode *node, PropertyInfo *pi)
|
||||
{
|
||||
return XmlReadValue(node, pi->Name);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class TextPropPanel : public PropertyPanel
|
||||
{
|
||||
public:
|
||||
TextPropPanel(wxWindow *parent, PropertyHandler *hnd, PropsListInfo *pli) : PropertyPanel(parent, hnd, pli)
|
||||
{
|
||||
wxSizer *sz = new wxBoxSizer(wxVERTICAL);
|
||||
wxTextCtrl *tc;
|
||||
|
||||
sz->Add(new wxStaticText(this, -1, _("Value:")), 0, wxLEFT, 5);
|
||||
sz->Add(tc = new wxTextCtrl(this, ID_EDITCTRL, XmlReadValue(pli->m_Node, pli->m_PropInfo->Name)), 0, wxALL|wxEXPAND, 5);
|
||||
tc->SetFocus();
|
||||
|
||||
SetAutoLayout(TRUE);
|
||||
SetSizer(sz);
|
||||
Layout();
|
||||
}
|
||||
|
||||
void OnEdit(wxCommandEvent &event)
|
||||
{
|
||||
Update(((wxTextCtrl*)event.GetEventObject())->GetValue());
|
||||
}
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
BEGIN_EVENT_TABLE(TextPropPanel, PropertyPanel)
|
||||
EVT_TEXT(ID_EDITCTRL, TextPropPanel::OnEdit)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
wxPanel *TextPropertyHandler::CreateEditPanel(wxWindow *parent, PropsListInfo *pli)
|
||||
{
|
||||
return new TextPropPanel(parent, this, pli);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class CoordPropPanel : public PropertyPanel
|
||||
{
|
||||
public:
|
||||
CoordPropPanel(wxWindow *parent, PropertyHandler *hnd, PropsListInfo *pli) : PropertyPanel(parent, hnd, pli)
|
||||
{
|
||||
wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
|
||||
wxSizer *sz = new wxBoxSizer(wxHORIZONTAL);
|
||||
m_ed1 = m_ed2 = NULL; m_chb = NULL;
|
||||
|
||||
sz->Add(new wxStaticText(this, -1, _("X:")), 0, wxLEFT|wxRIGHT|wxALIGN_CENTER, 5);
|
||||
sz->Add(m_ed1 = new wxTextCtrl(this, ID_XEDIT, "",
|
||||
wxDefaultPosition, wxDefaultSize, 0,
|
||||
wxTextValidator(wxFILTER_NUMERIC)),
|
||||
1, wxRIGHT, 5);
|
||||
m_ed1->SetFocus();
|
||||
|
||||
sz->Add(new wxStaticText(this, -1, _("Y:")), 0, wxLEFT|wxRIGHT|wxALIGN_CENTER, 5);
|
||||
sz->Add(m_ed2 = new wxTextCtrl(this, ID_YEDIT, "",
|
||||
wxDefaultPosition, wxDefaultSize, 0,
|
||||
wxTextValidator(wxFILTER_NUMERIC)),
|
||||
1, wxRIGHT, 5);
|
||||
sizer->Add(sz, 0, wxEXPAND|wxTOP, 5);
|
||||
|
||||
sizer->Add(m_chb = new wxCheckBox(this, ID_USEDLG, _("Use dialog units")), 0, wxLEFT|wxTOP, 5);
|
||||
|
||||
SetAutoLayout(TRUE);
|
||||
SetSizer(sizer);
|
||||
Layout();
|
||||
|
||||
wxString val = XmlReadValue(pli->m_Node, pli->m_PropInfo->Name);
|
||||
m_chb->SetValue(val.Len()==0 || val[val.Len()-1] == 'd');
|
||||
m_ed1->SetValue(val.BeforeFirst(','));
|
||||
m_ed2->SetValue(val.AfterFirst(',').BeforeFirst('d'));
|
||||
}
|
||||
|
||||
void OnEdit(wxCommandEvent &event)
|
||||
{
|
||||
wxString val, v1, v2;
|
||||
|
||||
if (m_ed1 == NULL || m_ed2 == NULL || m_chb == NULL) return;
|
||||
|
||||
v1 = m_ed1->GetValue();
|
||||
v2 = m_ed2->GetValue();
|
||||
if (v1.IsEmpty() || v2.IsEmpty()) return;
|
||||
val = v1 + "," + v2;
|
||||
if (m_chb->GetValue()) val << 'd';
|
||||
Update(val);
|
||||
}
|
||||
|
||||
wxTextCtrl *m_ed1, *m_ed2;
|
||||
wxCheckBox *m_chb;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
BEGIN_EVENT_TABLE(CoordPropPanel, PropertyPanel)
|
||||
EVT_TEXT(ID_XEDIT, CoordPropPanel::OnEdit)
|
||||
EVT_TEXT(ID_YEDIT, CoordPropPanel::OnEdit)
|
||||
EVT_CHECKBOX(ID_USEDLG, CoordPropPanel::OnEdit)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
wxPanel *CoordPropertyHandler::CreateEditPanel(wxWindow *parent, PropsListInfo *pli)
|
||||
{
|
||||
return new CoordPropPanel(parent, this, pli);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class BoolPropPanel : public PropertyPanel
|
||||
{
|
||||
public:
|
||||
BoolPropPanel(wxWindow *parent, PropertyHandler *hnd, PropsListInfo *pli) : PropertyPanel(parent, hnd, pli)
|
||||
{
|
||||
m_chb = NULL;
|
||||
wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
|
||||
sizer->Add(m_chb = new wxCheckBox(this, ID_BOOLVAL, _("On/Yes/True")), 0, wxLEFT|wxTOP, 5);
|
||||
SetAutoLayout(TRUE);
|
||||
SetSizer(sizer);
|
||||
Layout();
|
||||
m_chb->SetValue(XmlReadValue(pli->m_Node, pli->m_PropInfo->Name) == "1");
|
||||
}
|
||||
|
||||
void OnEdit(wxCommandEvent &event)
|
||||
{
|
||||
if (m_chb == NULL) return;
|
||||
if (m_chb->GetValue()) Update("1");
|
||||
else Update("0");
|
||||
}
|
||||
|
||||
wxCheckBox *m_chb;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
BEGIN_EVENT_TABLE(BoolPropPanel, PropertyPanel)
|
||||
EVT_CHECKBOX(ID_BOOLVAL, BoolPropPanel::OnEdit)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
wxPanel *BoolPropertyHandler::CreateEditPanel(wxWindow *parent, PropsListInfo *pli)
|
||||
{
|
||||
return new BoolPropPanel(parent, this, pli);
|
||||
}
|
||||
|
||||
wxString BoolPropertyHandler::GetBriefValue(wxXmlNode *node, PropertyInfo *pi)
|
||||
{
|
||||
wxString v = XmlReadValue(node, pi->Name);
|
||||
if (v.IsEmpty()) return wxEmptyString;
|
||||
else if (v == "1") return "true";
|
||||
else return "false";
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class FlagsPropPanel : public PropertyPanel
|
||||
{
|
||||
public:
|
||||
FlagsPropPanel(wxWindow *parent, PropertyHandler *hnd, PropsListInfo *pli) : PropertyPanel(parent, hnd, pli)
|
||||
{
|
||||
m_chl = NULL;
|
||||
wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
|
||||
sizer->Add(m_chl = new wxCheckListBox(this, ID_CHECKLIST), 1, wxEXPAND|wxALL, 5);
|
||||
SetAutoLayout(TRUE);
|
||||
SetSizer(sizer);
|
||||
Layout();
|
||||
|
||||
{
|
||||
wxStringTokenizer tkn(pli->m_PropInfo->MoreInfo, ",");
|
||||
wxString s;
|
||||
while (tkn.HasMoreTokens())
|
||||
{
|
||||
s = tkn.GetNextToken();
|
||||
m_chl->Append(s);
|
||||
m_flags.Add(s);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
wxStringTokenizer tkn(XmlReadValue(pli->m_Node, pli->m_PropInfo->Name), "| ");
|
||||
int index;
|
||||
while (tkn.HasMoreTokens())
|
||||
{
|
||||
index = m_flags.Index(tkn.GetNextToken());
|
||||
if (index != wxNOT_FOUND)
|
||||
m_chl->Check(index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OnEdit(wxCommandEvent &event)
|
||||
{
|
||||
wxString s;
|
||||
bool first = TRUE;
|
||||
|
||||
for (size_t i = 0; i < m_flags.GetCount(); i++)
|
||||
{
|
||||
if (m_chl->IsChecked(i))
|
||||
{
|
||||
if (!first) s << '|';
|
||||
s << m_flags[i];
|
||||
first = FALSE;
|
||||
}
|
||||
}
|
||||
Update(s);
|
||||
if (m_PLI->m_PropInfo->Name == "orient")
|
||||
// FIXME - dirty hack related to sizers
|
||||
EditorFrame::Get()->NotifyChanged(CHANGED_TREE_SELECTED_ICON);
|
||||
}
|
||||
|
||||
wxCheckListBox *m_chl;
|
||||
wxArrayString m_flags;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
BEGIN_EVENT_TABLE(FlagsPropPanel, PropertyPanel)
|
||||
EVT_CHECKLISTBOX(ID_CHECKLIST, FlagsPropPanel::OnEdit)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
wxPanel *FlagsPropertyHandler::CreateEditPanel(wxWindow *parent, PropsListInfo *pli)
|
||||
{
|
||||
return new FlagsPropPanel(parent, this, pli);
|
||||
}
|
116
contrib/utils/wxrcedit/prophnd.h
Normal file
116
contrib/utils/wxrcedit/prophnd.h
Normal file
@@ -0,0 +1,116 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Purpose: XML resources editor
|
||||
// Author: Vaclav Slavik
|
||||
// Created: 2000/05/05
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2000 Vaclav Slavik
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface "prophnd.h"
|
||||
#endif
|
||||
|
||||
#ifndef _PROPHND_H_
|
||||
#define _PROPHND_H_
|
||||
|
||||
|
||||
class wxXmlNode;
|
||||
class wxList;
|
||||
class wxListCtrl;
|
||||
class wxPanel;
|
||||
class wxWindow;
|
||||
|
||||
#include "wx/xml/xml.h"
|
||||
#include "wx/dynarray.h"
|
||||
|
||||
enum PropertyType
|
||||
{
|
||||
PROP_TEXT = 0,
|
||||
PROP_FLAGS = 1,
|
||||
PROP_COLOR = 2,
|
||||
PROP_BOOL = 3,
|
||||
PROP_INTEGER = 4,
|
||||
PROP_COORD = 5
|
||||
};
|
||||
#define PROP_TYPES_CNT 6
|
||||
|
||||
class PropertyInfo
|
||||
{
|
||||
public:
|
||||
PropertyType Type;
|
||||
wxString Name;
|
||||
wxString MoreInfo;
|
||||
};
|
||||
|
||||
WX_DECLARE_OBJARRAY(PropertyInfo, PropertyInfoArray);
|
||||
|
||||
|
||||
class PropertyHandler;
|
||||
|
||||
class PropsListInfo : public wxObject
|
||||
{
|
||||
public:
|
||||
PropsListInfo(int index, PropertyHandler *hnd, wxXmlNode *node,
|
||||
PropertyInfo *pi, wxListCtrl *listctrl) :
|
||||
m_Index(index), m_Handler(hnd), m_Node(node),
|
||||
m_PropInfo(pi), m_ListCtrl(listctrl) {}
|
||||
virtual ~PropsListInfo() {}
|
||||
|
||||
int m_Index;
|
||||
PropertyHandler *m_Handler;
|
||||
wxXmlNode *m_Node;
|
||||
PropertyInfo *m_PropInfo;
|
||||
wxListCtrl *m_ListCtrl;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
class PropertyHandler
|
||||
{
|
||||
public:
|
||||
PropertyHandler() {}
|
||||
|
||||
int CreateListItem(wxListCtrl *listctrl, wxXmlNode *node, PropertyInfo *pi);
|
||||
|
||||
virtual wxString GetBriefValue(wxXmlNode *node, PropertyInfo *pi);
|
||||
virtual wxPanel *CreateEditPanel(wxWindow *parent, PropsListInfo *pli) = 0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
class TextPropertyHandler : public PropertyHandler
|
||||
{
|
||||
public:
|
||||
TextPropertyHandler() {}
|
||||
virtual wxPanel *CreateEditPanel(wxWindow *parent, PropsListInfo *pli);
|
||||
};
|
||||
|
||||
|
||||
class CoordPropertyHandler : public PropertyHandler
|
||||
{
|
||||
public:
|
||||
CoordPropertyHandler() {}
|
||||
virtual wxPanel *CreateEditPanel(wxWindow *parent, PropsListInfo *pli);
|
||||
};
|
||||
|
||||
|
||||
class BoolPropertyHandler : public PropertyHandler
|
||||
{
|
||||
public:
|
||||
BoolPropertyHandler() {}
|
||||
virtual wxString GetBriefValue(wxXmlNode *node, PropertyInfo *pi);
|
||||
virtual wxPanel *CreateEditPanel(wxWindow *parent, PropsListInfo *pli);
|
||||
};
|
||||
|
||||
|
||||
class FlagsPropertyHandler : public PropertyHandler
|
||||
{
|
||||
public:
|
||||
FlagsPropertyHandler() {}
|
||||
virtual wxPanel *CreateEditPanel(wxWindow *parent, PropsListInfo *pli);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
30
contrib/utils/wxrcedit/treedt.h
Normal file
30
contrib/utils/wxrcedit/treedt.h
Normal file
@@ -0,0 +1,30 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Purpose: XML resources editor
|
||||
// Author: Vaclav Slavik
|
||||
// Created: 2000/05/05
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2000 Vaclav Slavik
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface "treedt.h"
|
||||
#endif
|
||||
|
||||
#ifndef _TREEDT_H_
|
||||
#define _TREEDT_H_
|
||||
|
||||
|
||||
#include "wx/treectrl.h"
|
||||
|
||||
class wxXmlNode;
|
||||
|
||||
class XmlTreeData : public wxTreeItemData
|
||||
{
|
||||
public:
|
||||
XmlTreeData(wxXmlNode *n) : Node(n) {}
|
||||
wxXmlNode *Node;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
84
contrib/utils/wxrcedit/xmlhelpr.cpp
Normal file
84
contrib/utils/wxrcedit/xmlhelpr.cpp
Normal file
@@ -0,0 +1,84 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Author: Vaclav Slavik
|
||||
// Created: 2000/05/05
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2000 Vaclav Slavik
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "xmlhelpr.h"
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#include "wx/xml/xml.h"
|
||||
#include "wx/wx.h"
|
||||
#include "xmlhelpr.h"
|
||||
|
||||
|
||||
|
||||
wxXmlNode *XmlFindNode(wxXmlNode *parent, const wxString& param)
|
||||
{
|
||||
wxXmlNode *n = parent->GetChildren();
|
||||
|
||||
while (n)
|
||||
{
|
||||
if (n->GetType() == wxXML_ELEMENT_NODE && n->GetName() == param)
|
||||
return n;
|
||||
n = n->GetNext();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void XmlWriteValue(wxXmlNode *parent, const wxString& name, const wxString& value)
|
||||
{
|
||||
wxXmlNode *n = XmlFindNode(parent, name);
|
||||
if (n == NULL)
|
||||
{
|
||||
n = new wxXmlNode(wxXML_ELEMENT_NODE, name);
|
||||
parent->AddChild(n);
|
||||
n->AddChild(new wxXmlNode(wxXML_TEXT_NODE, ""));
|
||||
}
|
||||
|
||||
n = n->GetChildren();
|
||||
|
||||
while (n)
|
||||
{
|
||||
if (n->GetType() == wxXML_TEXT_NODE ||
|
||||
n->GetType() == wxXML_CDATA_SECTION_NODE)
|
||||
{
|
||||
n->SetContent(value);
|
||||
break;
|
||||
}
|
||||
n = n->GetNext();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxString XmlReadValue(wxXmlNode *parent, const wxString& name)
|
||||
{
|
||||
wxXmlNode *n = XmlFindNode(parent, name);
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
23
contrib/utils/wxrcedit/xmlhelpr.h
Normal file
23
contrib/utils/wxrcedit/xmlhelpr.h
Normal file
@@ -0,0 +1,23 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Purpose: XML resources editor
|
||||
// Author: Vaclav Slavik
|
||||
// Created: 2000/05/05
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2000 Vaclav Slavik
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface "xmlhelpr.h"
|
||||
#endif
|
||||
|
||||
#ifndef _XMLHELPR_H_
|
||||
#define _XMLHELPR_H_
|
||||
|
||||
// some helper functions:
|
||||
|
||||
void XmlWriteValue(wxXmlNode *parent, const wxString& name, const wxString& value);
|
||||
wxString XmlReadValue(wxXmlNode *parent, const wxString& name);
|
||||
wxXmlNode *XmlFindNode(wxXmlNode *parent, const wxString& name);
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user