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