1 // Thomas Nagy 2007-2021 GPLV3
2
3 #include <QtGui>
4 #include <QFile>
5 # include <QDir>
6 #include <QTextBrowser>
7 #include <QProgressDialog>
8 #include <KDE/KStatusBar>
9 #include <QFileDialog>
10 #include <KConfigGroup>
11 #include <QMenuBar>
12 #include <KDE/KApplication>
13 #include <KStandardAction>
14 #include <KRecentFilesAction>
15 #include <KActionCollection>
16 #include <KToolBar>
17 #include <QMenu>
18 #include <QIcon>
19 #include <KMessageBox>
20 #include <ktip.h>
21 #include <windef.h>
22 #include <QFrame>
23 #include <QtWidgets>
24 #include <QUuid>
25 #include <QStandardPaths>
26
27 #include "box_view.h"
28 #include "sembind.h"
29 #include "semantik.h"
30 #include "canvas_view.h"
31 #include "sem_mediator.h"
32 #include "image_view.h"
33 #include "config_dialog.h"
34 #include "text_view.h"
35 #include "table_view.h"
36 #include "vars_view.h"
37 #include "pre_view.h"
38 #include "linear_container.h"
39 #include "template_entry.h"
40 #include "generator_dialog.h"
41 #include "data_view.h"
42 #include "doc_dialog.h"
43 #include "aux.h"
44 #include "linear_view.h"
45 #include "mem_command.h"
46
slot_generate()47 void semantik_win::slot_generate()
48 {
49 if (m_oMediator->choose_root() <= 0)
50 {
51 KMessageBox::sorry(this, i18n("The map is empty, Semantik\ncannot create documents from it"), i18n("Empty map"));
52 return;
53 }
54
55 QDir l_oDir(TEMPLATE_DIR);
56 if (!l_oDir.exists() || !l_oDir.isReadable())
57 {
58 slot_message(i18n("Template folder %1 is not readable", TEMPLATE_DIR), 5000);
59 return;
60 }
61 QFileInfoList l_o = l_oDir.entryInfoList(QStringList()<<"*.py", QDir::Files, QDir::Name);
62 //qDebug()<<l_o.size();
63
64 QList<template_entry> l_oLst;
65 foreach (QFileInfo l_oInfo, l_o)
66 {
67 template_entry l_oTemplate;
68 int l_iCnt = 0;
69 if (l_oInfo.isReadable())
70 {
71 QFile l_oFile(l_oInfo.absoluteFilePath());
72 if (!l_oFile.open(QIODevice::ReadOnly))
73 {
74 //qDebug()<<"could not open the file"<<l_oInfo.absoluteFilePath();
75 continue;
76 }
77
78 if (l_oFile.fileName().contains(notr("semantik.sem.py")))
79 {
80 continue;
81 }
82
83 l_oTemplate.m_sFile = l_oInfo.absoluteFilePath();
84
85 QTextStream l_oS(&l_oFile);
86 while (!l_oS.atEnd())
87 {
88 QString l_sLine = l_oS.readLine(1000);
89 if (l_sLine.length() < 2)
90 {
91 continue;
92 }
93 else if (l_sLine.startsWith("#"))
94 {
95 if (l_sLine.startsWith(notr("#sem:name:")))
96 {
97 l_oTemplate.m_sName = l_sLine.mid(11);
98 l_iCnt++;
99 }
100 else if (l_sLine.startsWith(notr("#sem:tip:")))
101 {
102 l_oTemplate.m_sTip = l_sLine.mid(10);
103 l_iCnt++;
104 }
105 }
106 else
107 {
108 break;
109 }
110
111 }
112 l_oFile.close();
113
114 if (l_iCnt<2) continue;
115 l_oLst.push_front(l_oTemplate);
116 //qDebug()<<l_oTemplate.m_sFile;
117 //qDebug()<<l_oTemplate.m_sName;
118 //qDebug()<<l_oTemplate.m_sTip;
119 }
120 }
121
122 generator_dialog l_oGen(this, l_oLst);
123 l_oGen.m_oName->setText(m_oMediator->m_sOutProject);
124 l_oGen.m_oLocation->setText(m_oMediator->m_sOutDir);
125 if (l_oGen.m_oLocation->text().length()<2) l_oGen.m_oLocation->setText(bind_node::get_var(notr("outdir")));
126
127 l_oGen.activate_from_name(m_oMediator->m_sOutTemplate);
128 if (l_oGen.exec() == QDialog::Accepted)
129 {
130 m_oMediator->m_sOutDir = l_oGen.m_oLocation->text();
131 m_oMediator->m_sOutProject = l_oGen.m_oName->text();
132 m_oMediator->m_sOutTemplate = l_oGen.m_sShortName;
133 m_oMediator->generate_docs(l_oGen.m_sCurrent, l_oGen.m_oName->text(), l_oGen.m_oLocation->text());
134 }
135 }
136
semantik_win(QWidget * i_oParent)137 semantik_win::semantik_win(QWidget *i_oParent) : KXmlGuiWindow(i_oParent)
138 {
139 setObjectName("semantik_win");
140
141 setWindowIcon(QIcon("semantik"));
142
143 m_oWindef = new windef();
144 m_oMediator = new sem_mediator(this);
145 m_oMediator->m_oWindef = m_oWindef;
146 connect(m_oMediator, SIGNAL(sig_message(const QString&, int)), this, SLOT(slot_message(const QString&, int)));
147 connect(m_oMediator, SIGNAL(sig_update_title()), this, SLOT(update_title()));
148
149 m_oColorMenu = new QMenu(i18n("Colors"), this);
150
151 QFrame *fr = new QFrame(this);
152 fr->setLineWidth(0);
153 fr->setFrameStyle(QFrame::NoFrame);
154 m_oCanvas = new canvas_view(fr, m_oMediator, m_oColorMenu);
155 setCentralWidget(fr);
156 QGridLayout *ll = new QGridLayout(fr);
157 ll->addWidget(m_oCanvas);
158 m_oCanvas->m_oSemantikWindow = this;
159 m_oCanvas->setupActions(actionCollection());
160
161 connect(m_oCanvas, SIGNAL(sig_message(const QString&, int)), this, SLOT(slot_message(const QString&, int)));
162
163 //BEGIN setup_actions();
164 KStandardAction::quit(this, SLOT(close()), actionCollection());
165 KStandardAction::save(this, SLOT(slot_save()), actionCollection());
166 KStandardAction::saveAs(this, SLOT(slot_save_as()), actionCollection());
167 KStandardAction::open(this, SLOT(slot_open()), actionCollection());
168 KStandardAction::print(m_oCanvas, SLOT(slot_print()), actionCollection());
169 KStandardAction::tipOfDay(this, SLOT(slot_tip_of_day()), actionCollection());
170 m_oUndoAct = KStandardAction::undo(m_oMediator, SLOT(slot_undo()), actionCollection());
171 m_oUndoAct->setEnabled(false);
172 m_oRedoAct = KStandardAction::redo(m_oMediator, SLOT(slot_redo()), actionCollection());
173 m_oRedoAct->setEnabled(false);
174
175 m_oRecentFilesAct = KStandardAction::openRecent(this, SLOT(slot_recent(const QUrl&)), actionCollection());
176
177 m_oReorgAct = new QAction(i18n("&Reorganize the map"), this);
178 actionCollection()->addAction(notr("reorganize_map"), m_oReorgAct);
179 actionCollection()->setDefaultShortcut(m_oReorgAct, i18n("Ctrl+R"));
180 connect(m_oReorgAct, SIGNAL(triggered(bool)), m_oCanvas, SLOT(reorganize()));
181
182 m_oExportSizeAct = new QAction(i18n("&Export the map..."), this);
183 actionCollection()->addAction(notr("export_map_size"), m_oExportSizeAct);
184 actionCollection()->setDefaultShortcut(m_oExportSizeAct, i18n("Ctrl+Shift+E"));
185 connect(m_oExportSizeAct, SIGNAL(triggered(bool)), m_oCanvas, SLOT(export_map_size()));
186
187 KStandardAction::preferences(this, SLOT(slot_properties()), actionCollection());
188
189 m_oGenerateAct = new QAction(i18n("&Generate..."), this);
190 actionCollection()->addAction(notr("generate_doc"), m_oGenerateAct);
191 m_oGenerateAct->setIcon(QIcon(notr("run-build-file")));
192 actionCollection()->setDefaultShortcut(m_oGenerateAct, i18n("Ctrl+G"));
193 connect(m_oGenerateAct, SIGNAL(triggered(bool)), SLOT(slot_generate()));
194
195 //m_oCanvasFitZoom = new QAction(i18n("Fit zoom"), this);
196 //actionCollection()->addAction(notr("zoom_map"), m_oCanvasFitZoom);
197 //m_oCanvasFitZoom->setIcon(QIcon(notr("zoom-best-fit")));
198 //connect(m_oCanvasFitZoom, SIGNAL(triggered(bool)), m_oCanvas, SLOT(fit_zoom()));
199 m_oCanvasFitZoom = KStandardAction::fitToPage(this, SLOT(fit_zoom()), actionCollection());
200 m_oCanvasFitZoom->setIcon(QIcon(notr("zoom-best-fit")));
201 actionCollection()->setDefaultShortcut(m_oCanvasFitZoom, i18n("Ctrl+H"));
202
203 KStandardAction::zoomIn(m_oCanvas, SLOT(zoom_in()), actionCollection());
204 KStandardAction::zoomOut(m_oCanvas, SLOT(zoom_out()), actionCollection());
205
206 //END setupActions()
207 //setStandardToolBarMenuEnabled(true);
208
209
210 QDockWidget *l_oDockData = new QDockWidget(i18n("Data"), this);
211 l_oDockData->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea);
212 m_oDataView = new data_view(l_oDockData, m_oMediator);
213 l_oDockData->setWidget(m_oDataView);
214 addDockWidget(Qt::BottomDockWidgetArea, l_oDockData);
215 actionCollection()->addAction(notr("show_dock_data"), l_oDockData->toggleViewAction());
216 l_oDockData->setObjectName(notr("DataDock"));
217
218 m_oTextView = new text_view(m_oDataView, m_oMediator);
219 m_oDataView->addWidget(m_oTextView);
220
221 m_oImageView = new image_view(m_oDataView, m_oMediator);
222 m_oDataView->addWidget(m_oImageView);
223
224 m_oTableView = new table_view(m_oDataView, m_oMediator);
225 m_oDataView->addWidget(m_oTableView);
226
227 m_oDiagramView = new box_view(m_oDataView, m_oMediator);
228 m_oDiagramView->m_bShowFileMenu = true;
229 m_oDiagramView->m_oColorMenu = m_oColorMenu;
230 m_oDataView->addWidget(m_oDiagramView);
231 connect(m_oDiagramView, SIGNAL(sig_message(const QString&, int)), this, SLOT(slot_message(const QString&, int)));
232
233
234 QDockWidget *l_oDockVars = new QDockWidget(i18n("Variables"), this);
235 l_oDockVars->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea);
236 m_oVarsView = new vars_view(l_oDockVars, m_oMediator);
237 l_oDockVars->setWidget(m_oVarsView);
238 addDockWidget(Qt::BottomDockWidgetArea, l_oDockVars);
239 l_oDockVars->setObjectName(notr("VarsDock"));
240 actionCollection()->addAction(notr("show_dock_vars"), l_oDockVars->toggleViewAction());
241 m_oVarsView->init_completer();
242
243 QDockWidget *l_oDockPreview = new QDockWidget(i18n("Preview"), this);
244 l_oDockPreview->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea);
245 m_oPreView = new pre_view(l_oDockPreview, m_oMediator);
246 l_oDockPreview->setWidget(m_oPreView);
247 addDockWidget(Qt::RightDockWidgetArea, l_oDockPreview);
248 actionCollection()->addAction(notr("show_dock_preview"), l_oDockPreview->toggleViewAction());
249 l_oDockPreview->setObjectName(notr("PreviewDock"));
250
251
252 tabifyDockWidget(l_oDockData, l_oDockVars);
253
254
255 QDockWidget *l_oDock = new QDockWidget(i18n("Linear view"), this);
256 m_oTree = new linear_container(l_oDock, m_oMediator);
257 l_oDock->setWidget(m_oTree);
258 addDockWidget(Qt::LeftDockWidgetArea, l_oDock);
259 actionCollection()->addAction(notr("show_dock_linear"), l_oDock->toggleViewAction());
260 l_oDock->setObjectName(notr("LinearDock"));
261
262 flag_scheme l_oScheme(notr("crsc-app-colors"), "");
263 m_oColorGroup = new QActionGroup(this);
264 for (int i = 0; i < 9; ++i)
265 {
266 QAction *l_oAct = new QAction(QIcon(), i18n("Color"), m_oColorGroup);
267 m_oColorGroup->addAction(l_oAct);
268 actionCollection()->addAction(QString("color_%1").arg(QString::number(i)), l_oAct);
269 if (i != 0)
270 {
271 m_oColorMenu->addAction(l_oAct);
272 }
273 }
274
275 m_oCustomColorAct = new QAction(l_oScheme._icon(), i18n("Custom color"), m_oColorGroup);
276 m_oColorMenu->addAction(m_oCustomColorAct);
277 m_oColorGroup->setExclusive(true);
278 actionCollection()->addAction(notr("color_custom"), m_oCustomColorAct);
279
280 m_oFlagGroup = new QActionGroup(this);
281 m_oFlagGroup->setExclusive(false);
282 connect(m_oFlagGroup, SIGNAL(triggered(QAction*)), m_oCanvas, SLOT(change_flags(QAction*)));
283
284 for (int i = 0; i < 16; ++i)
285 {
286 QAction *l_oAct = new QAction(QIcon(notr("crsc-app-colors")), i18n("Flag"), m_oFlagGroup);
287 l_oAct->setCheckable(true);
288 m_oFlagGroup->addAction(l_oAct);
289 actionCollection()->addAction(QString("flag_%1").arg(QString::number(i)), l_oAct);
290 }
291
292 setupGUI(QSize(800, 800), Default, notr("semantikui.rc"));
293
294 connect(m_oMediator, SIGNAL(sync_colors()), this, SLOT(sync_colors()));
295 connect(m_oMediator, SIGNAL(sync_font()), m_oCanvas, SLOT(notify_font()));
296 connect(m_oColorGroup, SIGNAL(triggered(QAction*)), m_oDiagramView, SLOT(change_colors(QAction*)));
297 connect(m_oColorGroup, SIGNAL(triggered(QAction*)), m_oCanvas, SLOT(change_colors(QAction*)));
298
299 connect(m_oMediator, SIGNAL(sync_background_color()), m_oCanvas, SLOT(slot_background_color()));
300
301 m_oMediator->m_oCurrentUrl = QUrl();
302 update_title();
303
304 linear_view* ln = m_oTree->m_oView;
305 connect(m_oMediator, SIGNAL(sig_preview()), m_oPreView, SLOT(notify_preview()));
306 connect(m_oMediator, SIGNAL(sig_add_item(int)), m_oCanvas, SLOT(notify_add_item(int)));
307 connect(m_oMediator, SIGNAL(sig_add_item(int)), ln, SLOT(notify_add_item(int)));
308 connect(m_oMediator, SIGNAL(sig_add_item(int)), m_oDiagramView, SLOT(notify_add_item(int)));
309
310 connect(m_oMediator, SIGNAL(sig_delete_item(int)), m_oCanvas, SLOT(notify_delete_item(int)));
311 connect(m_oMediator, SIGNAL(sig_delete_item(int)), ln, SLOT(notify_delete_item(int)));
312 connect(m_oMediator, SIGNAL(sig_link_items(int, int)), m_oCanvas, SLOT(notify_link_items(int, int)));
313 connect(m_oMediator, SIGNAL(sig_link_items(int, int)), ln, SLOT(notify_link_items(int, int)));
314 connect(m_oMediator, SIGNAL(sig_unlink_items(int, int)), m_oCanvas, SLOT(notify_unlink_items(int, int)));
315 connect(m_oMediator, SIGNAL(sig_unlink_items(int, int)), ln, SLOT(notify_unlink_items(int, int)));
316 connect(m_oMediator, SIGNAL(sig_ref_items(int, int)), m_oCanvas, SLOT(notify_ref_items(int, int)));
317 connect(m_oMediator, SIGNAL(sig_unref_items(int, int)), m_oCanvas, SLOT(notify_unref_items(int, int)));
318 connect(m_oMediator, SIGNAL(sig_repaint(int)), m_oCanvas, SLOT(notify_repaint(int)));
319 connect(m_oMediator, SIGNAL(sig_repaint(int)), ln, SLOT(notify_repaint(int)));
320
321 connect(m_oMediator, SIGNAL(sig_edit(int)), m_oCanvas, SLOT(notify_edit(int)));
322 connect(m_oMediator, SIGNAL(sig_edit(int)), ln, SLOT(notify_edit(int)));
323 connect(m_oMediator, SIGNAL(sig_text(int)), m_oTextView, SLOT(notify_text(int)));
324 connect(m_oMediator, SIGNAL(sig_vars(int)), m_oVarsView, SLOT(notify_vars(int)));
325
326 connect(m_oMediator, SIGNAL(sig_table(int)), m_oTableView, SLOT(notify_table(int)));
327
328 connect(m_oMediator, SIGNAL(sig_flag(int)), m_oCanvas, SLOT(notify_flag(int)));
329 connect(m_oMediator, SIGNAL(sig_select(const QList<int>&, const QList<int>&)), m_oCanvas, SLOT(notify_select(const QList<int>&, const QList<int>&)));
330 connect(m_oMediator, SIGNAL(sig_select(const QList<int>&, const QList<int>&)), ln, SLOT(notify_select(const QList<int>&, const QList<int>&)));
331 connect(m_oMediator, SIGNAL(sig_select(const QList<int>&, const QList<int>&)), m_oDataView, SLOT(notify_select(const QList<int>&, const QList<int>&)));
332 connect(m_oMediator, SIGNAL(sig_select(const QList<int>&, const QList<int>&)), m_oTextView, SLOT(notify_select(const QList<int>&, const QList<int>&)));
333 connect(m_oMediator, SIGNAL(sig_select(const QList<int>&, const QList<int>&)), m_oVarsView, SLOT(notify_select(const QList<int>&, const QList<int>&)));
334 connect(m_oMediator, SIGNAL(sig_select(const QList<int>&, const QList<int>&)), m_oImageView, SLOT(notify_select(const QList<int>&, const QList<int>&)));
335 connect(m_oMediator, SIGNAL(sig_select(const QList<int>&, const QList<int>&)), m_oTableView, SLOT(notify_select(const QList<int>&, const QList<int>&)));
336 connect(m_oMediator, SIGNAL(sig_select(const QList<int>&, const QList<int>&)), m_oDiagramView, SLOT(notify_select(const QList<int>&, const QList<int>&)));
337 connect(m_oMediator, SIGNAL(sig_select(const QList<int>&, const QList<int>&)), ln, SLOT(notify_select(const QList<int>&, const QList<int>&)));
338
339 connect(m_oMediator, SIGNAL(sig_sort(int, bool)), m_oCanvas, SLOT(notify_sort(int, bool)));
340 connect(m_oMediator, SIGNAL(sig_sort(int, bool)), ln, SLOT(notify_sort(int, bool)));
341
342
343 connect(m_oMediator, SIGNAL(sig_datatype(int)), m_oDataView, SLOT(notify_datatype(int)));
344 connect(m_oMediator, SIGNAL(sig_datatype(int)), m_oCanvas, SLOT(notify_datatype(int)));
345 connect(m_oMediator, SIGNAL(sig_datatype(int)), ln, SLOT(notify_datatype(int)));
346
347 connect(m_oMediator, SIGNAL(sig_pic(int)), m_oCanvas, SLOT(notify_pic(int)));
348 connect(m_oMediator, SIGNAL(sig_pic(int)), m_oImageView, SLOT(notify_pic(int)));
349
350 connect(m_oMediator, SIGNAL(sig_move(const QList<int>&, const QList<QPointF>&)), m_oCanvas, SLOT(notify_move(const QList<int>&, const QList<QPointF>&)));
351
352 connect(m_oMediator, SIGNAL(sync_flags()), this, SLOT(sync_flags()));
353 connect(m_oImageView, SIGNAL(sig_message(const QString&, int)), this, SLOT(slot_message(const QString&, int)));
354
355 connect(m_oMediator, SIGNAL(sig_open_map()), m_oCanvas, SLOT(notify_open_map()));
356 connect(m_oMediator, SIGNAL(sig_open_map()), m_oVarsView, SLOT(notify_open_map()));
357 connect(m_oMediator, SIGNAL(sig_change_data(int)), m_oCanvas, SLOT(notify_change_data(int)));
358
359 connect(m_oMediator, SIGNAL(sig_export_doc()), m_oCanvas, SLOT(notify_export_doc()));
360 connect(m_oMediator, SIGNAL(sig_export_item(int)), m_oDiagramView, SLOT(notify_export_item(int)));
361 connect(m_oMediator, SIGNAL(sig_export_item(int)), m_oImageView, SLOT(notify_export_item(int)));
362
363 connect(m_oMediator, SIGNAL(sig_add_box(int, int)), m_oDiagramView, SLOT(notify_add_box(int, int)));
364 connect(m_oMediator, SIGNAL(sig_del_box(int, int)), m_oDiagramView, SLOT(notify_del_box(int, int)));
365 connect(m_oMediator, SIGNAL(sig_edit_box(int, int)), m_oDiagramView, SLOT(notify_edit_box(int, int)));
366 connect(m_oMediator, SIGNAL(sig_link_box(int, data_link*)), m_oDiagramView, SLOT(notify_link_box(int, data_link*)));
367 connect(m_oMediator, SIGNAL(sig_unlink_box(int, data_link*)), m_oDiagramView, SLOT(notify_unlink_box(int, data_link*)));
368 connect(m_oMediator, SIGNAL(sig_change_link_box(int, data_link*)), m_oDiagramView, SLOT(notify_change_link_box(int, data_link*)));
369 connect(m_oMediator, SIGNAL(sig_box_props(int, const QList<diagram_item*>&)), m_oDiagramView, SLOT(notify_box_props(int, const QList<diagram_item*>&)));
370 connect(m_oMediator, SIGNAL(sig_pos_box(int, const QList<data_box*>&)), m_oDiagramView, SLOT(notify_pos_box(int, const QList<data_box*>&)));
371 connect(m_oMediator, SIGNAL(sig_size_box(int, const QList<data_box*>&)), m_oDiagramView, SLOT(notify_size_box(int, const QList<data_box*>&)));
372 connect(m_oMediator, SIGNAL(sig_text_align(int, const QList<data_box>&)), m_oDiagramView, SLOT(notify_text_align(int, const QList<data_box>&)));
373 connect(m_oMediator, SIGNAL(sig_sequence_box(int, int)), m_oDiagramView, SLOT(notify_sequence_box(int, int)));
374 connect(m_oMediator, SIGNAL(sig_focus(void *)), m_oDiagramView, SLOT(notify_focus(void *)));
375 connect(m_oMediator, SIGNAL(sig_focus(void *)), m_oCanvas, SLOT(notify_focus(void *)));
376 connect(m_oMediator, SIGNAL(sig_change_properties(void *)), m_oDiagramView, SLOT(notify_change_properties(void *)));
377
378 m_oTree->m_oView->addAction(m_oCanvas->m_oDeleteAction); // FIXME
379
380 //qDebug()<<"instance is "<<l_oInst<<endl;
381
382 m_oMediator->init_colors();
383 m_oMediator->init_flags();
384
385 read_config();
386 m_oMediator->notify_background_color();
387 statusBar()->showMessage(i18n("Welcome to Semantik"), 2000);
388 setAutoSaveSettings();
389
390 connect(m_oMediator, SIGNAL(enable_undo(bool, bool)), this, SLOT(slot_enable_undo(bool, bool)));
391 KTipDialog::showTip(this, notr("semantik/tips"));
392 }
393
fit_zoom()394 void semantik_win::fit_zoom()
395 {
396 if (m_oCanvas->hasFocus())
397 {
398 m_oCanvas->fit_zoom();
399 }
400 else if (m_oDiagramView->hasFocus())
401 {
402 m_oDiagramView->fit_zoom();
403 }
404 }
405
read_config()406 void semantik_win::read_config()
407 {
408 KConfig l_oCfg("semantik");
409 KConfigGroup l_oConfig(&l_oCfg, notr("General Options"));
410
411 KConfigGroup l_oSaveConfig(&l_oCfg, notr("Recent Files"));
412 m_oRecentFilesAct->loadEntries(l_oSaveConfig);
413
414 move(l_oConfig.readEntry(notr("winpos"), QPoint(0, 0)));
415 m_oMediator->m_oColor = QColor(l_oConfig.readEntry(notr("bgcolor"), notr("#FFFDE8")));
416 m_oMediator->m_oArrowColor = QColor(l_oConfig.readEntry(notr("arrowcolor"), notr("#000000")));
417 m_oMediator->m_oAltArrowColor = QColor(l_oConfig.readEntry(notr("altarrowcolor"), notr("#e0e0e0")));
418 m_oMediator->m_sOutDir = l_oConfig.readEntry(notr("outdir"), QDir::homePath());
419 m_oMediator->m_sGlobalHints = l_oConfig.readEntry(notr("global_hints"));
420 bind_node::set_var(notr("outdir"), m_oMediator->m_sOutDir);
421 m_oWindef->m_bUseTouchpad = l_oConfig.readEntry(notr("touchpad"), false);
422
423 QString l_oGuidString = l_oConfig.readEntry(notr("guid"));
424 if (!l_oGuidString.isEmpty())
425 {
426 m_oQUuid = QUuid(l_oGuidString);
427 }
428 else
429 {
430 m_oQUuid = QUuid::createUuid();
431 write_config();
432 }
433
434 //QString lang_code(config.readEntry("currentLanguageCode", QVariant(QString())).toString());
435 //if (lang_code.isEmpty()) lang_code = "en_US"; // null-string are saved as empty-strings
436 //setCurrentLanguage(lang_code);
437 }
438
write_config()439 void semantik_win::write_config()
440 {
441 KConfig l_oCfg("semantik");
442 KConfigGroup l_oConfig(&l_oCfg, notr("General Options"));
443 l_oConfig.writeEntry(notr("winpos"), pos());
444 l_oConfig.writeEntry(notr("outdir"), bind_node::get_var(notr("outdir")));
445 l_oConfig.writeEntry(notr("guid"), m_oQUuid.toString());
446 l_oConfig.sync();
447
448 KConfigGroup l_oSaveConfig(&l_oCfg, notr("Recent Files"));
449 m_oRecentFilesAct->saveEntries(l_oSaveConfig);
450 l_oSaveConfig.sync();
451 }
452
~semantik_win()453 semantik_win::~semantik_win()
454 {
455
456 }
457
print_to_file(const QUrl & url,QPair<int,int> p)458 int semantik_win::print_to_file(const QUrl & url, QPair<int, int> p)
459 {
460 return m_oCanvas->batch_print_map(url, p);
461 }
462
slot_save_as()463 bool semantik_win::slot_save_as()
464 {
465 choose:
466 QUrl l_o = QFileDialog::getSaveFileUrl(this, i18n("Choose a file name"),
467 QUrl(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)),
468 i18n("*.sem|Semantik file (*.sem)"));
469
470 if (l_o.path().isEmpty()) return false;
471 if (!l_o.path().endsWith(notr(".sem")))
472 {
473 l_o = QUrl(l_o.path()+notr(".sem"));
474 }
475
476 if (m_oMediator->save_file(l_o.path()))
477 {
478 statusBar()->showMessage(i18n("Saved '%1'", l_o.path()), 2000);
479 m_oMediator->m_oCurrentUrl = l_o;
480 update_title();
481 return true;
482 }
483 else
484 {
485 m_oMediator->m_oCurrentUrl = QUrl();
486 update_title();
487
488 int mu = KMessageBox::questionYesNo(NULL, //this,
489 i18n("The file \"%1\" could not be saved because an error happened.\nTry again?", l_o.path()),
490 i18n("Try again?"),
491 KStandardGuiItem::yes(),
492 KStandardGuiItem::no(),
493 notr("ContinueSaveAs"));
494 if (!mu) {
495 goto choose;
496 }
497 else
498 {
499 return false;
500 }
501 }
502
503 return false;
504 }
505
slot_save()506 bool semantik_win::slot_save()
507 {
508 if (m_oMediator->m_sLastSaved.isEmpty())
509 {
510 return slot_save_as();
511 }
512 if (m_oMediator->save_file(m_oMediator->m_sLastSaved))
513 {
514 statusBar()->showMessage(i18n("Saved '%1'", m_oMediator->m_sLastSaved), 2000);
515 return true;
516 }
517 else
518 {
519 int mu = KMessageBox::questionYesNo(NULL, //this,
520 i18n("The file \"%1\" could not be saved because an error happened.\nTry again?", m_oMediator->m_sLastSaved),
521 i18n("Try again?"),
522 KStandardGuiItem::yes(),
523 KStandardGuiItem::no(),
524 notr("ContinueSaveAs"));
525 if (!mu) {
526 return slot_save_as();
527 }
528 else
529 {
530 return false;
531 }
532 }
533 return false;
534 }
535
slot_open()536 void semantik_win::slot_open()
537 {
538 if (m_oMediator->m_bDirty)
539 {
540 if (!proceed_save()) return;
541 }
542
543 QUrl l_o = QFileDialog::getOpenFileUrl(this, i18n("Choose a file name"),
544 QUrl(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)),
545 i18n("*.sem *.kdi *.mm *.vym|All Supported Files (*.sem *.kdi *.mm *.vym)"));
546 if (l_o.isValid() && m_oMediator->open_file(l_o.path()))
547 {
548 m_oMediator->m_oCurrentUrl = l_o;
549 }
550 update_title();
551 }
552
update_title()553 void semantik_win::update_title()
554 {
555 QString mod;
556 if (m_oMediator->m_bDirty) mod = i18n(" [Modified] ");
557
558 QString txt;
559 if (m_oMediator->m_oCurrentUrl.path().isEmpty())
560 {
561 txt = i18n("Semantik %1", mod);
562 }
563 else
564 {
565 txt = i18n("%1 %2 - Semantik", m_oMediator->m_oCurrentUrl.path(), mod);
566 m_oRecentFilesAct->addUrl(m_oMediator->m_oCurrentUrl); // TODO
567 }
568 setWindowTitle(txt);
569
570 }
571
slot_properties()572 void semantik_win::slot_properties()
573 {
574 config_dialog l_oGen(this);
575
576 KConfig l_oCfg("semantik");
577 KConfigGroup l_oSettings(&l_oCfg, notr("General Options"));
578 l_oGen.m_oConnType->setCurrentIndex(l_oSettings.readEntry(notr("conn"), 0));
579 l_oGen.m_oReorgType->setCurrentIndex(l_oSettings.readEntry(notr("reorg"), 0));
580 l_oGen.m_oAutoSave->setValue(l_oSettings.readEntry(notr("auto"), 5));
581 l_oGen.m_oAutoReorg->setCurrentIndex(l_oSettings.readEntry(notr("autoReorg"), 1));
582 l_oGen.m_oUseTouchpad->setChecked(l_oSettings.readEntry(notr("touchpad"), false));
583 l_oGen.m_oPreviewPics->setChecked(m_oMediator->m_bShowPics);
584
585 QString l_sHint1 = i18n("Uncomment to set defaults to all documents");
586 QString l_sHint2 = i18n("Commands can only be defined here");
587 l_oGen.m_oTextEdit->setText(l_oSettings.readEntry(notr("global_hints"), notr("# %1\n# %2\n#\n# doc_company=XYZ\n# doc_author=Myself\n# command_pdflatex=cd %s/../ && ./run.sh\n# command_beamer=cd %s/../ && ./run.sh\n# command_html=firefox %s\n# command_s5=firefox %s\n# command_odt=oowriter %s\n# command_odp=ooimpress %s\n").arg(l_sHint1, l_sHint2)));
588
589 l_oGen.m_oColorWidget->setText(m_oMediator->m_oColor.name());
590 l_oGen.m_oArrowWidget->setText(m_oMediator->m_oArrowColor.name());
591 l_oGen.m_oAltArrowWidget->setText(m_oMediator->m_oAltArrowColor.name());
592
593 {
594 QPalette l_oPalette = l_oGen.m_oColorWidget->palette();
595 l_oGen.m_oColor = m_oMediator->m_oColor;
596 l_oPalette.setBrush(QPalette::Active, QPalette::Button, l_oGen.m_oColor);
597 l_oGen.m_oColorWidget->setPalette(l_oPalette);
598 }
599 {
600 QPalette l_oPalette = l_oGen.m_oArrowWidget->palette();
601 l_oGen.m_oArrowColor = m_oMediator->m_oArrowColor;
602 l_oPalette.setBrush(QPalette::Active, QPalette::Button, l_oGen.m_oArrowColor);
603 l_oGen.m_oArrowWidget->setPalette(l_oPalette);
604 }
605 {
606 QPalette l_oPalette = l_oGen.m_oAltArrowWidget->palette();
607 l_oGen.m_oAltArrowColor = m_oMediator->m_oAltArrowColor;
608 l_oPalette.setBrush(QPalette::Active, QPalette::Button, l_oGen.m_oAltArrowColor);
609 l_oGen.m_oAltArrowWidget->setPalette(l_oPalette);
610 }
611
612 if (l_oGen.exec() == QDialog::Accepted)
613 {
614 //m_oMediator->m_iConnType = l_oGen.m_oConnType->currentIndex();
615 //m_oMediator->m_iReorgType = l_oGen.m_oReorgType->currentIndex();
616 l_oSettings.writeEntry(notr("conn"), m_oMediator->m_iConnType = l_oGen.m_oConnType->currentIndex());
617 l_oSettings.writeEntry(notr("reorg"), m_oMediator->m_oWindef->m_iReorgType = l_oGen.m_oReorgType->currentIndex());
618 l_oSettings.writeEntry(notr("auto"), m_oMediator->m_iTimerValue = l_oGen.m_oAutoSave->value());
619 l_oSettings.writeEntry(notr("bgcolor"), l_oGen.m_oColor.name());
620 l_oSettings.writeEntry(notr("arrowcolor"), l_oGen.m_oArrowColor.name());
621 l_oSettings.writeEntry(notr("altarrowcolor"), l_oGen.m_oAltArrowColor.name());
622 l_oSettings.writeEntry(notr("autoReorg"), m_oMediator->m_iAutoReorg = l_oGen.m_oAutoReorg->currentIndex());
623 l_oSettings.writeEntry(notr("touchpad"), m_oMediator->m_oWindef->m_bUseTouchpad = l_oGen.m_oUseTouchpad->isChecked());
624 QString l_sText = m_oMediator->m_sGlobalHints = l_oGen.m_oTextEdit->toPlainText();
625 if (l_sText.isEmpty())
626 {
627 l_oSettings.deleteEntry(notr("global_hints"));
628 }
629 else
630 {
631 l_oSettings.writeEntry(notr("global_hints"), l_sText);
632 }
633
634 m_oMediator->set_show_pics(l_oGen.m_oPreviewPics->isChecked());
635
636 if (l_oGen.m_oColor != m_oMediator->m_oColor || m_oMediator->m_oArrowColor != l_oGen.m_oArrowColor || l_oGen.m_oAltArrowColor != m_oMediator->m_oAltArrowColor)
637 {
638 mem_all_color *l_oMem = new mem_all_color(m_oMediator);
639 l_oMem->m_oColor = l_oGen.m_oColor;
640 l_oMem->m_oArrowColor = l_oGen.m_oArrowColor;
641 l_oMem->m_oAltArrowColor = l_oGen.m_oAltArrowColor;
642
643 l_oMem->m_oOldColor = m_oMediator->m_oColor;
644 l_oMem->m_oOldArrowColor = m_oMediator->m_oArrowColor;
645 l_oMem->m_oOldAltArrowColor = m_oMediator->m_oAltArrowColor;
646 l_oMem->apply();
647 }
648 m_oMediator->init_timer();
649 l_oCfg.sync();
650 }
651 }
652
queryClose()653 bool semantik_win::queryClose()
654 {
655 write_config();
656 if (!m_oMediator->m_bDirty)
657 {
658 return true;
659 }
660 bool l_bRet = proceed_save();
661 write_config();
662 return l_bRet;
663 }
664
proceed_save()665 bool semantik_win::proceed_save()
666 {
667 QString l_oTitle = m_oMediator->m_sLastSaved;
668 if (l_oTitle.isEmpty()) l_oTitle = i18n("Untitled");
669
670 int l_o = KMessageBox::warningYesNoCancel(NULL, //this,
671 i18n("The document \"%1\" has been modified.\nDo you want to save your changes or discard them?", l_oTitle),
672 i18n("Close Document"),
673 KStandardGuiItem::save(), KStandardGuiItem::discard());
674
675 switch (l_o)
676 {
677 case KMessageBox::Yes:
678 return slot_save();
679 case KMessageBox::No:
680 return true;
681 default:
682 return false;
683 }
684 return false;
685 }
686
slot_recent(const QUrl & i_oBadUrl)687 void semantik_win::slot_recent(const QUrl& i_oBadUrl)
688 {
689 // deep copy or it will crash
690 QUrl i_oUrl = i_oBadUrl;
691 if (i_oUrl.path().isEmpty()) return;
692 if (m_oMediator->open_file(i_oUrl.path()))
693 {
694 m_oMediator->m_oCurrentUrl = i_oUrl;
695 }
696 update_title();
697 }
698
slot_message(const QString & i_sMsg,int i_iDur)699 void semantik_win::slot_message(const QString & i_sMsg, int i_iDur)
700 {
701 statusBar()->showMessage(i_sMsg, i_iDur);
702 }
703
slot_tip_of_day()704 void semantik_win::slot_tip_of_day()
705 {
706 KTipDialog::showTip(this, notr("semantik/tips"), true);
707 }
708
slot_enable_undo(bool undo,bool redo)709 void semantik_win::slot_enable_undo(bool undo, bool redo) {
710 m_oUndoAct->setEnabled(undo);
711 m_oRedoAct->setEnabled(redo);
712 }
713
process_icon(QIcon * i_oIcon,const QColor & i_oColor,int i_iSize)714 void process_icon(QIcon* i_oIcon, const QColor& i_oColor, int i_iSize)
715 {
716 QPixmap l_oPix(i_iSize, i_iSize);
717 QPainter l_oP(&l_oPix);
718 l_oPix.fill(i_oColor);
719 l_oP.drawRect(0, 0, i_iSize -1, i_iSize -1);
720 i_oIcon->addPixmap(l_oPix);
721 }
722
sync_colors()723 void semantik_win::sync_colors()
724 {
725 for (int i=0; i<m_oMediator->m_oColorSchemes.size(); ++i)
726 {
727 color_scheme l_oScheme = m_oMediator->m_oColorSchemes[i];
728 QAction *l_oAction = m_oColorGroup->actions().at(i);
729
730 QIcon l_oIcon;
731 process_icon(&l_oIcon, l_oScheme.m_oInnerColor, 22);
732 process_icon(&l_oIcon, l_oScheme.m_oInnerColor, 32);
733 process_icon(&l_oIcon, l_oScheme.m_oInnerColor, 64);
734 process_icon(&l_oIcon, l_oScheme.m_oInnerColor, 128);
735 l_oAction->setText(l_oScheme.m_sName);
736 l_oAction->setIcon(l_oIcon);
737 }
738 }
739
sync_flags()740 void semantik_win::sync_flags()
741 {
742 for (int i=0; i<m_oMediator->m_oFlagSchemes.size(); ++i)
743 {
744 flag_scheme &l_oScheme = m_oMediator->m_oFlagSchemes[i];
745 QAction *l_oAction = m_oFlagGroup->actions().at(i);
746 l_oAction->setText(l_oScheme.m_sName);
747 l_oAction->setIcon(l_oScheme._icon());
748 l_oAction->setToolTip(i18n("Flag"));
749 }
750 }
751
752