2 #include <QtCore/QTextStream>
3 #include <QtGui/QApplication>
4 #include <QtGui/QMenuBar>
5 #include <QtGui/QFileDialog>
6 #include <QtGui/QColor>
7 #include <QtGui/QPalette>
8 #include <QtGui/QCloseEvent>
9 #include <QtGui/QTextDocument>
10 #include <QtGui/QMainWindow>
11 #include <QtGui/QStatusBar>
12 #include <QtGui/QCheckBox>
13 #include <QtGui/QVBoxLayout>
14 #include <QtGui/QListWidget>
15 #include <QtGui/QListWidgetItem>
22 * @attention Currently not in use
24 char *UnitTypes[TYPENUM] = {
33 * Editor constructor. Initializes and sets variables of Loglan Editor.
35 * @param argc command line argc parameter
36 * @param argv command line argv parameter
38 Editor::Editor(int argc, char **argv)
43 strcpy(HomeDir, argv[1]);
49 compiler_path.sprintf("%s/%s", HomeDir, "compile/logcomp");
50 gen_path.sprintf("%s/%s", HomeDir, "compile/gen");
51 file_path.sprintf("%s", HomeDir);
54 connect(editor, SIGNAL(cursorPositionChanged()), this, SLOT(on_editor_cursorPositionChanged()));
65 * Displays line:column position of cursor
67 void Editor::on_editor_cursorPositionChanged()
73 cx = editor->textCursor().blockNumber();
74 cy = editor->textCursor().columnNumber();
75 position.sprintf("%d:%d", cx, cy);
77 statusBar()->showMessage(position);
81 * Loads given file content to the editor.
83 * @param fileName Filename of file which will be read.
85 void Editor::load(const char *fileName)
87 fname.sprintf("%s", fileName);
90 if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
95 QTextStream textStream(&file);
96 while (!file.atEnd()) {
97 editor->append(textStream.readLine());
103 setWindowTitle(fileName);
107 * Saves editor content to the given filename.
108 * @param fileName File name of the file where content should be saved.
110 void Editor::save(const char *fileName)
112 QFile file(fileName);
113 if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
117 file.write(editor->toPlainText().toAscii().data(), editor->toPlainText().length());
122 * Invokes compiler in the giving mode.
123 * @param mode Mode of compilation. Possible values:
124 * - COMP_MODE - compilation mode
125 * - GEN_MODE - program generation mode
126 * - ALL_MODE - compilation & generation mode.
128 void Editor::compile(int mode)
131 messages->setReadOnly(FALSE);
135 /*i = fname.find('.');*/
141 sprintf(cmd, "%s %s > comp_data!", compiler_path.toAscii().data(),
142 fname.toAscii().data());
145 sprintf(cmd, "%s %s > comp_data!", gen_path.toAscii().data(),
146 fname.toAscii().data());
149 sprintf(cmd, "%s %s > comp_data!", compiler_path.toAscii().data(),
150 fname.toAscii().data());
152 sprintf(cmd, "%s %s >> comp_data!", gen_path.toAscii().data(),
153 fname.toAscii().data());
158 QFile f("comp_data!");
159 if (!f.open(QIODevice::ReadOnly | QIODevice::Text))
164 QString s = t.readLine();
169 messages->setReadOnly(TRUE);
172 unlink("comp_data!");
177 * Empties editor content.
179 void Editor::on_actionNew_triggered()
182 fname.sprintf("%s", "");}
185 * Displays additional window
187 void Editor::on_actionOpen_triggered()
189 QString fn = QFileDialog::getOpenFileName(this, "Load file", file_path, "*.log");
191 load(fn.toAscii().data());
195 * Saves editor content to the file.
196 * If content has been read from file, it is written to this file. Otherwise
197 * dialog is shown to save content to the specified by user, file.
199 void Editor::on_actionSave_triggered()
201 if (fname.isEmpty()) {
202 QString fn = QFileDialog::getSaveFileName(this, "Save file",
205 fname.sprintf("%s", fn.toAscii().data());
206 save(fn.toAscii().data());
209 save(fname.toAscii().data());
211 setWindowTitle(fname);
215 * Saves editor content to the file.
216 * Forces saving editor content to the new file. Special dialog is shown for
219 void Editor::on_actionSave_as_triggered()
221 QString fn = QFileDialog::getSaveFileName(this, "Save file as",
224 fname.sprintf("%s", fn.toAscii().data());
225 save(fn.toAscii().data());
227 setWindowTitle(fname);
229 void Editor::on_actionQuit_triggered()
231 QApplication::instance()->quit();
233 void Editor::on_actionCopy_triggered()
236 void Editor::on_actionPaste_triggered()
239 void Editor::on_actionCut_triggered()
242 void Editor::on_actionClear_all_triggered()
247 * Searches for given text in editor content.
248 * Displays window to set search parameters. If text is found sets cursor
251 void Editor::on_actionFind_triggered()
253 QDialog dlg(this, Qt::Dialog);
255 QLineEdit *tmpQLineEdit;
256 tmpQLineEdit = new QLineEdit("", &dlg);
257 tmpQLineEdit->setGeometry(60, 10, 180, 30);
260 tmpQLabel = new QLabel(&dlg);
261 tmpQLabel->setGeometry(10, 10, 50, 30);
263 tmpQLabel->setText("Text:");
265 QCheckBox *tmpQRadioButton;
266 tmpQRadioButton = new QCheckBox("Case sensitive", &dlg);
267 tmpQRadioButton->setGeometry(70, 50, 150, 30);
268 tmpQRadioButton->setAutoRepeat(FALSE);
270 QPushButton *okbtn, *cbtn;
271 okbtn = new QPushButton("Find", &dlg);
272 okbtn->setGeometry(260, 10, 100, 30);
273 okbtn->setDefault(TRUE);
274 connect(okbtn,SIGNAL(clicked()), &dlg, SLOT(accept()));
276 cbtn = new QPushButton("Close", &dlg);
277 cbtn->setGeometry(260, 50, 100, 30);
278 connect(cbtn, SIGNAL(clicked()), &dlg, SLOT(reject()));
283 sensitive = tmpQRadioButton->isChecked();
284 find_text = tmpQLineEdit->text();
286 QTextDocument::FindFlags flags = 0;
289 flags |= QTextDocument::FindCaseSensitively;
291 editor->find(find_text, flags);
296 * Searches for next occurence of given text in editor content.
297 * Displays window to set search parameters. If text is found sets cursor
300 void Editor::on_actionFind_Next_triggered()
302 if (!find_text.isEmpty()) {
303 QTextDocument::FindFlags flags = 0;
306 flags |= QTextDocument::FindCaseSensitively;
308 editor->find(find_text, flags);
313 * Displays window with editor properties
315 void Editor::on_actionPreferences_triggered()
317 QDialog dlg(this, Qt::Dialog);
320 files = new QLineEdit(&dlg);
321 files->setGeometry(130, 20, 250, 30);
322 files->setText(file_path);
323 files->setMaxLength(32767);
324 files->setEchoMode(QLineEdit::Normal);
325 files->setFrame(TRUE);
328 tmpQLabel = new QLabel("Path to files:", &dlg);
329 tmpQLabel->setGeometry(10, 20, 100, 30);
330 tmpQLabel->setAlignment(Qt::AlignLeft);
331 tmpQLabel->setMargin(-1);
333 tmpQLabel = new QLabel("Path to compiler:", &dlg);
334 tmpQLabel->setGeometry(10, 60, 100, 30);
335 tmpQLabel->setAlignment(Qt::AlignLeft);
336 tmpQLabel->setMargin(-1);
339 tmpQLabel = new QLabel(&dlg, "Label_3");
340 tmpQLabel->setGeometry(10, 100, 100, 30);
341 tmpQLabel->setText("Path to gen:");
342 tmpQLabel->setAlignment(289);
343 tmpQLabel->setMargin(-1);
347 compp = new QLineEdit(compiler_path, &dlg);
348 compp->setGeometry(130, 60, 250, 30);
349 compp->setMaxLength(32767);
350 compp->setEchoMode(QLineEdit::Normal);
351 compp->setFrame(TRUE);
355 genp = new QLineEdit(&dlg, "g_path");
356 genp->setGeometry(130, 100, 250, 30);
357 genp->setText(gen_path.data());
358 genp->setMaxLength(32767);
359 genp->setEchoMode(QLineEdit::Normal);
360 genp->setFrame(TRUE);
363 QPushButton* tmpQPushButton;
364 tmpQPushButton = new QPushButton("Ok", &dlg);
365 tmpQPushButton->setGeometry(90, 100, 70, 30);
366 tmpQPushButton->setAutoRepeat(FALSE);
367 connect(tmpQPushButton,SIGNAL(clicked()), &dlg, SLOT(accept()));
369 tmpQPushButton = new QPushButton("Cancel", &dlg);
370 tmpQPushButton->setGeometry(180, 100, 70, 30);
371 tmpQPushButton->setAutoRepeat(FALSE);
372 connect(tmpQPushButton,SIGNAL(clicked()), &dlg, SLOT(reject()));
374 dlg.resize(400, 140);
377 compiler_path.sprintf("%s", compp->text().toAscii().data());
378 /* gen_path.sprintf("%s",genp->text()); */
379 file_path.sprintf("%s", files->text().toAscii().data());
384 * Saves and compiles code.
386 void Editor::on_actionCompile_triggered()
388 on_actionSave_triggered();
395 void Editor::on_actionGen_triggered()
401 * Saves, compiles and generates code.
403 void Editor::on_actionCompile_Gen_triggered()
405 on_actionSave_triggered();
409 void Editor::on_actionProgram_structure_triggered()
411 QDialog dlg(this, "unit", TRUE);
415 files = new QLineEdit(&dlg, "f_path");
416 files->setGeometry(130, 20, 250, 30);
418 files->setMaxLength(32767);
419 files->setEchoMode(QLineEdit::Normal);
420 files->setFrame(TRUE);
423 tmpQLabel = new QLabel(&dlg);
424 tmpQLabel->setGeometry(10, 20, 100, 30);
425 tmpQLabel->setText("Program name:");
427 QPushButton* tmpQPushButton;
428 tmpQPushButton = new QPushButton(&dlg);
429 tmpQPushButton->setGeometry(40, 70, 70, 30);
430 tmpQPushButton->setText("Ok");
431 tmpQPushButton->setAutoRepeat(FALSE);
432 connect(tmpQPushButton,SIGNAL(clicked()), &dlg, SLOT(accept()));
434 tmpQPushButton = new QPushButton(&dlg);
435 tmpQPushButton->setGeometry(130, 70, 100, 30);
436 tmpQPushButton->setText("Cancel");
437 tmpQPushButton->setAutoRepeat(FALSE);
438 connect(tmpQPushButton,SIGNAL(clicked()), &dlg, SLOT(reject()));
441 strcpy(uname, files->text());
444 txt.sprintf("PROGRAM %s\n\nBEGIN\n\nEND", uname);
446 editor->textCursor().insertText(txt);
450 void Editor::on_actionUnit_structure_triggered()
452 QDialog dlg(this, Qt::Dialog);
457 files = new QLineEdit(&dlg, "f_path");
458 files->setGeometry(130, 20, 250, 30);
460 files->setMaxLength(32767);
461 files->setEchoMode(QLineEdit::Normal);
462 files->setFrame(TRUE);
465 tmpQLabel = new QLabel(&dlg);
466 tmpQLabel->setGeometry(10, 20, 100, 30);
467 tmpQLabel->setText("Unit name:");
468 tmpQLabel->setAlignment(289);
469 tmpQLabel->setMargin(-1);
471 QPushButton* tmpQPushButton;
472 tmpQPushButton = new QPushButton(&dlg);
473 tmpQPushButton->setGeometry(40, 170, 70, 30);
474 tmpQPushButton->setText("Ok");
475 tmpQPushButton->setAutoRepeat(FALSE);
476 connect(tmpQPushButton,SIGNAL(clicked()), &dlg, SLOT(accept()));
478 tmpQPushButton = new QPushButton(&dlg);
479 tmpQPushButton->setGeometry(130, 170, 100, 30);
480 tmpQPushButton->setText("Cancel");
481 tmpQPushButton->setAutoRepeat(FALSE);
482 connect(tmpQPushButton,SIGNAL(clicked()), &dlg, SLOT(reject()));
484 tmpQLabel = new QLabel(&dlg);
485 tmpQLabel->setGeometry(10, 50, 100, 60);
486 tmpQLabel->setText("Unit type:");
488 QListWidget *listWidget = new QListWidget(&dlg);
489 for(i = 0; i < TYPENUM; i++) {
490 QListWidgetItem *newItem = new QListWidgetItem;
491 newItem->setText(UnitTypes[i]);
492 listWidget->insertItem(i, newItem);
494 listWidget->setCurrentItem(0);
497 strcpy(uname, files->text());
500 txt.sprintf("UNIT %s : %s( <params> );\nBEGIN\n\nEND %s;",
502 listWidget->currentItem()->text().toStdString().c_str(),
506 editor->textCursor().insertText(txt);
511 * Program main function.
512 * argv[1] is mandatory and should be a path to the home directory of
513 * application (same as in configuration file).
514 * @param argc Number of program arguments
515 * @param argv Program arguments
517 int main(int argc, char **argv)
519 QApplication app(argc, argv);
520 Editor * editor = new Editor(argc, argv);