-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathxml2objectwidget.cpp
More file actions
108 lines (85 loc) · 2.87 KB
/
xml2objectwidget.cpp
File metadata and controls
108 lines (85 loc) · 2.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "xml2objectwidget.h"
Xml2ObjectWidget::Xml2ObjectWidget(QWidget *parent, Qt::WindowFlags f) : QDialog(parent,f)
{
setupUi(this);
code_hl=new SyntaxHighlighter(code_txt);
code_hl->loadConfiguration(GlobalAttributes::getXMLHighlightConfPath());
connect(close_btn, SIGNAL(clicked(void)), this, SLOT(close(void)));
connect(clear_btn, SIGNAL(clicked(void)), this, SLOT(clearSource(void)));
connect(load_btn, SIGNAL(clicked(void)), this, SLOT(loadXML(void)));
connect(generate_btn, SIGNAL(clicked(void)), this, SLOT(generateObject(void)));
}
void Xml2ObjectWidget::clearSource(void)
{
code_txt->setPlainText(QString("<dbmodel>\n\n</dbmodel>"));
}
void Xml2ObjectWidget::loadXML(void)
{
QFileDialog file_dlg;
file_dlg.setNameFilter(trUtf8("Database model (*.dbm);;XML file (*.xml);;All files (*.*)"));
file_dlg.setWindowTitle(trUtf8("Load file"));
file_dlg.setFileMode(QFileDialog::ExistingFiles);
file_dlg.setAcceptMode(QFileDialog::AcceptOpen);
if(file_dlg.exec()==QFileDialog::Accepted)
{
QFile f(file_dlg.selectedFiles().at(0));
f.open(QFile::ReadOnly);
if(!f.isOpen())
throw Exception(Exception::getErrorMessage(ErrorCode::FileDirectoryNotAccessed).arg(file_dlg.selectedFiles().at(0)),
ErrorCode::FileDirectoryNotAccessed,__PRETTY_FUNCTION__,__FILE__,__LINE__);
code_txt->setPlainText(QString::fromUtf8(f.readAll()));
f.close();
}
}
void Xml2ObjectWidget::show(DatabaseModel *model, OperationList *op_list)
{
clearSource();
this->setEnabled(model!=nullptr && op_list!=nullptr);
this->op_list=op_list;
this->model=model;
QDialog::show();
}
void Xml2ObjectWidget::generateObject(void)
{
try
{
BaseObject *object=nullptr;
ObjectType obj_type;
QString elem_name;
XmlParser *xmlparser=model->getXMLParser();
if(!op_list->isOperationChainStarted())
op_list->startOperationChain();
xmlparser->restartParser();
xmlparser->loadXMLBuffer(code_txt->toPlainText().toUtf8());
if(xmlparser->accessElement(XmlParser::ChildElement))
{
do
{
if(xmlparser->getElementType()==XML_ELEMENT_NODE)
{
elem_name=xmlparser->getElementName();
obj_type=BaseObject::getObjectType(elem_name);
xmlparser->savePosition();
object=model->createObject(obj_type);
if(object && !dynamic_cast<TableObject *>(object) &&
obj_type!=ObjectType::Relationship && obj_type!=ObjectType::BaseRelationship)
{
model->addObject(object);
op_list->registerObject(object, Operation::ObjectCreated, -1, model);
}
xmlparser->restorePosition();
}
}
while(xmlparser->accessElement(xmlparser->NextElement));
}
op_list->finishOperationChain();
}
catch(Exception &e)
{
if(op_list->isOperationChainStarted())
op_list->finishOperationChain();
op_list->undoOperation();
op_list->removeLastOperation();
throw Exception(e.getErrorMessage(), e.getErrorCode(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e);
}
}