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:
Václav Slavík
2000-07-25 18:47:21 +00:00
parent ca7408bd9a
commit 56d2f75071
106 changed files with 8512 additions and 1 deletions

10
contrib/utils/Makefile.in Normal file
View 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

View 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
View 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");
}

View 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

View 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 */
"########################",
"########################",
"########################",
"########################",
"########################",
"########################",
"#######.####..##########",
"#######..##....#########",
"########..#...##########",
"########.....###########",
"#########...############",
"#########....###########",
"########......##########",
"########..#....#########",
"#######..###....########",
"#######.#####..#########",
"########################",
"########################",
"########################",
"########################",
"########################",
"########################",
"########################",
"########################"
};

View File

@@ -0,0 +1,21 @@
/* XPM */
static char * control_xpm[] = {
"16 14 4 1",
" c None",
". c #008000",
"+ c #FFFFFF",
"@ c #7F7F7F",
" ",
" ",
" ",
" ",
" ... ",
" .++.. ",
" .++..@ ",
" .....@ ",
" ...@@ ",
" @@@ ",
" ",
" ",
" ",
" "};

View File

@@ -0,0 +1,22 @@
/* XPM */
static char * hsizer_xpm[] = {
"16 16 3 1",
" c None",
". c #000000",
"+ c #FF0000",
" ",
" ",
" ",
" . . ",
" .. .. ",
" ..+......+.. ",
" ..++++++++++.. ",
"..++++++++++++..",
" ..++++++++++.. ",
" ..+......+.. ",
" .. .. ",
" . . ",
" ",
" ",
" ",
" "};

View 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 "};

View 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",
" ",
"................",
".++++++++++++++.",
".+@@@@@@@@@@@@#.",
".++++++++++++++.",
".+$$$$$$$$$$$$+.",
".%$$$$$$$$$$$$+.",
".+$$$$$$$$$$$$+.",
".+$$$$$$$$$$$$+.",
".+$$$$$$$$$$$$%.",
".+$$$$$$$$$$$$+.",
".+$$$$$$$$$$$$+.",
".%$$$$$$$$$$$$+.",
".++++++++++++++.",
"................",
" "};

View 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. "};

View 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. ",
" @+#+$+%+&.*. ",
" &+*+:.*. ",
" =+-+ "};

View File

@@ -0,0 +1,20 @@
/* XPM */
static char * unused_xpm[] = {
"16 16 1 1",
" c None",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" "};

View File

@@ -0,0 +1,21 @@
/* XPM */
static char * used_xpm[] = {
"16 16 2 1",
" c None",
". c #000000",
" ",
" ",
" ",
" ",
" . ",
" ... ",
" .... ",
" .... ",
" .. .... ",
" ....... ",
" ..... ",
" ... ",
" . ",
" ",
" ",
" "};

View File

@@ -0,0 +1,22 @@
/* XPM */
static char * vsizer_xpm[] = {
"16 16 3 1",
" c None",
". c #000000",
"+ c #FF0000",
" . ",
" ... ",
" ..+.. ",
" ..+++.. ",
" ..+++++.. ",
" .+++. ",
" .+++. ",
" .+++. ",
" .+++. ",
" .+++. ",
" .+++. ",
" ..+++++.. ",
" ..+++.. ",
" ..+.. ",
" ... ",
" . "};

View File

@@ -0,0 +1,6 @@
node boxsizer
type sizer
icon 2
childtype sizer_item
derived from panel_item
var orient of flags wxHORIZONTAL,wxVERTICAL

View File

@@ -0,0 +1,3 @@
node break
type normal
derived from menu_item

View File

@@ -0,0 +1,4 @@
node button
var label of text
var default of bool
derived from control

View File

@@ -0,0 +1,4 @@
node checkbox
var label of text
var checked of bool
derived from control

View File

@@ -0,0 +1,6 @@
node control
abstract
icon 0
derived from window
derived from panel_item
derived from toolbar_item

View 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

View 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

View 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

View 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

View File

@@ -0,0 +1,3 @@
# anything that may be placed into menu
node menu_item
abstract

View File

@@ -0,0 +1,5 @@
node menubar
type panel
icon 0
childtype menu
var style of flags wxMB_DOCKABLE

View 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

View File

@@ -0,0 +1,3 @@
node panel
derived from panel_item
derived from panelbase

View File

@@ -0,0 +1,4 @@
# anything that may be placed into panel
node panel_item
abstract
derived from sizer_item

View 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

View File

@@ -0,0 +1,5 @@
node radiobutton
var label of text
var value of bool
var style of flags wxRB_GROUP
derived from control

View File

@@ -0,0 +1,4 @@
node separator
icon 0
type normal
derived from menu_item

View File

@@ -0,0 +1,4 @@
# anything that may be placed into sizer
node sizer_item
abstract

View 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

View 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

View 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

View File

@@ -0,0 +1,3 @@
node button
var bitmap of text
derived from control

View File

@@ -0,0 +1,3 @@
node staticboxsizer
derived from boxsizer
var label of text

View File

@@ -0,0 +1,3 @@
node statictext
var label of text
derived from control

View 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

View File

@@ -0,0 +1,3 @@
# anything that may be placed into toolbar
node toolbar_item
abstract

View 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

View 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;
}

View 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;
}

View 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

View 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;
}

View 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

View 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);
}

View 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

View 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

View 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;
}

View 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