ultimatepp/uppsrc/ide/Designers/Xml.cpp
2025-01-20 09:39:16 +01:00

133 lines
2.8 KiB
C++

#include "Designers.h"
void CopyXmlPath(TreeCtrl& tree)
{
String path;
int id = tree.GetCursor();
while(id >= 0) {
String tag = tree.Get(id);
if(tag.GetCount())
path = "[" + AsCString(tag) + "]" + path;
id = tree.GetParent(id);
}
WriteClipboardText(path);
}
void CopyXmlNode(TreeCtrl& tree)
{
int id = tree.GetCursor();
if(id >= 0)
WriteClipboardText(~tree.GetValue(id));
}
void XmlViewDes::CopyPath()
{
CopyXmlPath(tree);
}
void XmlLoadTree(TreeCtrl& tree, int parent, XmlParser& p)
{
if(p.IsTag()) {
String tag = p.ReadTag();
String txt = tag;
for(int i = 0; i < p.GetAttrCount(); i++)
txt << ' ' << p.GetAttr(i) << "=\"" << p[i] << "\"";
parent = tree.Add(parent, IdeCommonImg::XmlTag(), tag, txt);
while(!p.End()) {
if(p.IsEof())
throw XmlError("Unexpected end of text");
XmlLoadTree(tree, parent, p);
}
}
else
if(p.IsText())
tree.Add(parent, IdeCommonImg::XmlText(), Null, NormalizeSpaces(p.ReadText()));
else
if(p.IsPI())
tree.Add(parent, IdeCommonImg::XmlPI(), Null, NormalizeSpaces(p.ReadPI()));
else
if(p.IsDecl())
tree.Add(parent, IdeCommonImg::XmlDecl(), Null, NormalizeSpaces(p.ReadDecl()));
else
if(p.IsComment())
tree.Add(parent, IdeCommonImg::XmlComment(), Null, NormalizeSpaces(p.ReadComment()));
else
throw XmlError("Unexpected input");
}
String XmlLoadTree(TreeCtrl& tree, XmlParser& p) {
String parsingError;
try {
while(!p.IsEof())
XmlLoadTree(tree, 0, p);
}
catch(const XmlError& e) {
parsingError = e;
}
if(!parsingError.GetCount() && !tree.GetChildCount(0))
parsingError = "Not found any XML tags";
return parsingError;
}
String XmlLoadTree(TreeCtrl& tree, const String& data) {
XmlParser p(data);
return XmlLoadTree(tree, p);
}
String XmlViewDes::Load0(const String& data) {
return XmlLoadTree(tree, data);
}
void XmlViewDes::Load0(int parent, XmlParser& p)
{
XmlLoadTree(tree, parent, p);
}
void XmlTreeMenu(Bar& bar, TreeCtrl& tree)
{
bar.Add(CtrlImg::copy(), "Copy", [=, &tree] { CopyXmlNode(tree); }).Key(K_CTRL_C);
bar.Add("Copy path\t[double-click]", [=, &tree] { CopyXmlPath(tree); });
}
void SetupXmlTree(TreeCtrl& tree)
{
tree.NoRoot();
tree.WhenLeftDouble = [=, &tree] { CopyJsonPath(tree); };
tree.WhenBar = [=, &tree](Bar& bar) { XmlTreeMenu(bar, tree); };
}
void XmlViewDes::EditMenu(Bar& menu)
{
XmlTreeMenu(menu, tree);
}
XmlViewDes::XmlViewDes()
{
SetupXmlTree(tree);
}
struct XmlDesModule : public IdeModule {
virtual String GetID() { return "XmlDesModule"; }
virtual bool AcceptsFile(const char *path) {
return ToLower(GetFileExt(path)) == ".xml";
}
virtual IdeDesigner *CreateDesigner(const char *path, byte) {
if(!AcceptsFile(path))
return NULL;
XmlViewDes *d = new XmlViewDes;
if(d->Load(path))
return d;
delete d;
return NULL;
}
};
INITIALIZER(XmlViewDes)
{
RegisterIdeModule(Single<XmlDesModule>());
}