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/QTextDocument>
9 #include <QtGui/QMainWindow>
10 #include <QtGui/QStatusBar>
11 #include <QtGui/QCheckBox>
12 #include <QtGui/QVBoxLayout>
13 #include <QtGui/QListWidget>
14 #include <QtGui/QListWidgetItem>
16 #include "ProgramStructureDialog.h"
17 #include "UnitStructureDialog.h"
18 #include "PreferencesDialog.h"
19 #include "FindDialog.h"
27 * Editor constructor. Initializes and sets variables of Loglan Editor.
29 * @param argc command line argc parameter
30 * @param argv command line argv parameter
32 Editor::Editor(int argc, char **argv)
37 strcpy(HomeDir, argv[1]);
38 fprintf(stderr, "EDIT: HomeDir inited with: %s (%s)\n", HomeDir, argv[1]);
44 compiler_path.sprintf("%s/%s", HomeDir, "compile/logcomp");
45 gen_path.sprintf("%s/%s", HomeDir, "compile/gen");
46 file_path.sprintf("%s", HomeDir);
49 connect(editor, SIGNAL(cursorPositionChanged()), this, SLOT(on_editor_cursorPositionChanged()));
60 * Displays line:column position of cursor
62 void Editor::on_editor_cursorPositionChanged()
68 cx = editor->textCursor().blockNumber();
69 cy = editor->textCursor().columnNumber();
70 position.sprintf("%d:%d", cx, cy);
72 statusBar()->showMessage(position);
76 * Loads given file content to the editor.
78 * @param fileName Filename of file which will be read.
80 void Editor::load(const char *fileName)
82 fname.sprintf("%s", fileName);
85 if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
90 QTextStream textStream(&file);
91 editor->append(textStream.readAll());
92 // while (!file.atEnd()) {
93 // editor->append(textStream.readLine());
99 setWindowTitle(fileName);
103 * Saves editor content to the given filename.
104 * @param fileName File name of the file where content should be saved.
106 void Editor::save(const char *fileName)
108 QFile file(fileName);
109 if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
113 file.write(editor->toPlainText().toAscii().data(), editor->toPlainText().length());
118 * Invokes compiler in the giving mode.
119 * @param mode Mode of compilation. Possible values:
120 * - COMP_MODE - compilation mode
121 * - GEN_MODE - program generation mode
122 * - ALL_MODE - compilation & generation mode.
124 void Editor::compile(int mode)
127 messages->setReadOnly(FALSE);
131 /*i = fname.find('.');*/
137 sprintf(cmd, "%s %s > comp_data!", compiler_path.toStdString().c_str(),
138 fname.toStdString().c_str());
141 sprintf(cmd, "%s %s > comp_data!", gen_path.toStdString().c_str(),
142 fname.toStdString().c_str());
145 sprintf(cmd, "%s %s > comp_data!", compiler_path.toStdString().c_str(),
146 fname.toStdString().c_str());
148 sprintf(cmd, "%s %s >> comp_data!", gen_path.toStdString().c_str(),
149 fname.toStdString().c_str());
154 QFile f("comp_data!");
155 if (!f.open(QIODevice::ReadOnly | QIODevice::Text))
160 QString s = t.readLine();
165 messages->setReadOnly(TRUE);
168 unlink("comp_data!");
173 * Empties editor content.
175 void Editor::on_actionNew_triggered()
177 on_actionClear_all_triggered();
178 fname.sprintf("%s", "");
182 * Displays additional window
184 void Editor::on_actionOpen_triggered()
186 QString fn = QFileDialog::getOpenFileName(this, "Load file", file_path, "*.log");
188 load(fn.toAscii().data());
192 * Saves editor content to the file.
193 * If content has been read from file, it is written to this file. Otherwise
194 * dialog is shown to save content to the specified by user, file.
196 void Editor::on_actionSave_triggered()
198 if (fname.isEmpty()) {
199 QString fn = QFileDialog::getSaveFileName(this, "Save file",
202 fname.sprintf("%s", fn.toAscii().data());
203 save(fn.toAscii().data());
206 save(fname.toAscii().data());
208 setWindowTitle(fname);
212 * Saves editor content to the file.
213 * Forces saving editor content to the new file. Special dialog is shown for
216 void Editor::on_actionSave_as_triggered()
218 QString fn = QFileDialog::getSaveFileName(this, "Save file as",
221 fname.sprintf("%s", fn.toAscii().data());
222 save(fn.toAscii().data());
224 setWindowTitle(fname);
226 void Editor::on_actionQuit_triggered()
228 QApplication::instance()->quit();
230 void Editor::on_actionCopy_triggered()
234 void Editor::on_actionPaste_triggered()
238 void Editor::on_actionCut_triggered()
242 void Editor::on_actionClear_all_triggered()
248 * Searches for given text in editor content.
249 * Displays window to set search parameters. If text is found sets cursor
252 void Editor::on_actionFind_triggered()
254 dialog::FindDialog dialog(this);
257 sensitive = dialog.isCaseSensitive();
258 find_text = dialog.getSearchText();
260 QTextDocument::FindFlags flags = 0;
263 flags |= QTextDocument::FindCaseSensitively;
266 editor->find(find_text, flags);
271 * Searches for next occurence of given text in editor content.
272 * Displays window to set search parameters. If text is found sets cursor
275 void Editor::on_actionFind_Next_triggered()
277 if (!find_text.isEmpty()) {
278 QTextDocument::FindFlags flags = 0;
281 flags |= QTextDocument::FindCaseSensitively;
283 editor->find(find_text, flags);
288 * Displays window with editor properties
290 void Editor::on_actionPreferences_triggered()
292 dialog::PreferencesDialog dialog(this);
294 dialog.setCompilerPath(compiler_path);
295 dialog.setFilesPath(file_path);
296 dialog.setGenPath(gen_path);
299 compiler_path.sprintf("%s", dialog.getCompilerPath().toStdString().c_str());
300 gen_path.sprintf("%s",dialog.getGenPath().toStdString().c_str());
301 file_path.sprintf("%s", dialog.getFilesPath().toStdString().c_str());
306 * Saves and compiles code.
308 void Editor::on_actionCompile_triggered()
310 on_actionSave_triggered();
317 void Editor::on_actionGen_triggered()
323 * Saves, compiles and generates code.
325 void Editor::on_actionCompile_Gen_triggered()
327 on_actionSave_triggered();
331 void Editor::on_actionProgram_structure_triggered()
333 dialog::ProgramStructureDialog dialog(this);
336 editor->textCursor().insertText(dialog.getCode());
340 void Editor::on_actionUnit_structure_triggered()
342 dialog::UnitStructureDialog dialog(this);
345 editor->textCursor().insertText(dialog.getCode());
353 * Program main function.
354 * argv[1] is mandatory and should be a path to the home directory of
355 * application (same as in configuration file).
357 * @param argc Number of program arguments
358 * @param argv Program arguments
360 int main(int argc, char **argv)
362 QApplication app(argc, argv);
363 loglan::vlp::Editor * editor = new loglan::vlp::Editor(argc, argv);