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>
17 #include "ProgramStructureDialog.h"
18 #include "UnitStructureDialog.h"
19 #include "PreferencesDialog.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]);
43 compiler_path.sprintf("%s/%s", HomeDir, "compile/logcomp");
44 gen_path.sprintf("%s/%s", HomeDir, "compile/gen");
45 file_path.sprintf("%s", HomeDir);
48 connect(editor, SIGNAL(cursorPositionChanged()), this, SLOT(on_editor_cursorPositionChanged()));
59 * Displays line:column position of cursor
61 void Editor::on_editor_cursorPositionChanged()
67 cx = editor->textCursor().blockNumber();
68 cy = editor->textCursor().columnNumber();
69 position.sprintf("%d:%d", cx, cy);
71 statusBar()->showMessage(position);
75 * Loads given file content to the editor.
77 * @param fileName Filename of file which will be read.
79 void Editor::load(const char *fileName)
81 fname.sprintf("%s", fileName);
84 if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
89 QTextStream textStream(&file);
90 while (!file.atEnd()) {
91 editor->append(textStream.readLine());
97 setWindowTitle(fileName);
101 * Saves editor content to the given filename.
102 * @param fileName File name of the file where content should be saved.
104 void Editor::save(const char *fileName)
106 QFile file(fileName);
107 if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
111 file.write(editor->toPlainText().toAscii().data(), editor->toPlainText().length());
116 * Invokes compiler in the giving mode.
117 * @param mode Mode of compilation. Possible values:
118 * - COMP_MODE - compilation mode
119 * - GEN_MODE - program generation mode
120 * - ALL_MODE - compilation & generation mode.
122 void Editor::compile(int mode)
125 messages->setReadOnly(FALSE);
129 /*i = fname.find('.');*/
135 sprintf(cmd, "%s %s > comp_data!", compiler_path.toStdString().c_str(),
136 fname.toStdString().c_str());
139 sprintf(cmd, "%s %s > comp_data!", gen_path.toStdString().c_str(),
140 fname.toStdString().c_str());
143 sprintf(cmd, "%s %s > comp_data!", compiler_path.toStdString().c_str(),
144 fname.toStdString().c_str());
146 sprintf(cmd, "%s %s >> comp_data!", gen_path.toStdString().c_str(),
147 fname.toStdString().c_str());
152 QFile f("comp_data!");
153 if (!f.open(QIODevice::ReadOnly | QIODevice::Text))
158 QString s = t.readLine();
163 messages->setReadOnly(TRUE);
166 unlink("comp_data!");
171 * Empties editor content.
173 void Editor::on_actionNew_triggered()
175 on_actionClear_all_triggered();
176 fname.sprintf("%s", "");}
179 * Displays additional window
181 void Editor::on_actionOpen_triggered()
183 QString fn = QFileDialog::getOpenFileName(this, "Load file", file_path, "*.log");
185 load(fn.toAscii().data());
189 * Saves editor content to the file.
190 * If content has been read from file, it is written to this file. Otherwise
191 * dialog is shown to save content to the specified by user, file.
193 void Editor::on_actionSave_triggered()
195 if (fname.isEmpty()) {
196 QString fn = QFileDialog::getSaveFileName(this, "Save file",
199 fname.sprintf("%s", fn.toAscii().data());
200 save(fn.toAscii().data());
203 save(fname.toAscii().data());
205 setWindowTitle(fname);
209 * Saves editor content to the file.
210 * Forces saving editor content to the new file. Special dialog is shown for
213 void Editor::on_actionSave_as_triggered()
215 QString fn = QFileDialog::getSaveFileName(this, "Save file as",
218 fname.sprintf("%s", fn.toAscii().data());
219 save(fn.toAscii().data());
221 setWindowTitle(fname);
223 void Editor::on_actionQuit_triggered()
225 QApplication::instance()->quit();
227 void Editor::on_actionCopy_triggered()
231 void Editor::on_actionPaste_triggered()
235 void Editor::on_actionCut_triggered()
239 void Editor::on_actionClear_all_triggered()
245 * Searches for given text in editor content.
246 * Displays window to set search parameters. If text is found sets cursor
249 void Editor::on_actionFind_triggered()
251 QDialog dlg(this, Qt::Dialog);
253 QLineEdit *tmpQLineEdit;
254 tmpQLineEdit = new QLineEdit("", &dlg);
255 tmpQLineEdit->setGeometry(60, 10, 180, 30);
258 tmpQLabel = new QLabel(&dlg);
259 tmpQLabel->setGeometry(10, 10, 50, 30);
261 tmpQLabel->setText("Text:");
263 QCheckBox *tmpQRadioButton;
264 tmpQRadioButton = new QCheckBox("Case sensitive", &dlg);
265 tmpQRadioButton->setGeometry(70, 50, 150, 30);
266 tmpQRadioButton->setAutoRepeat(FALSE);
268 QPushButton *okbtn, *cbtn;
269 okbtn = new QPushButton("Find", &dlg);
270 okbtn->setGeometry(260, 10, 100, 30);
271 okbtn->setDefault(TRUE);
272 connect(okbtn,SIGNAL(clicked()), &dlg, SLOT(accept()));
274 cbtn = new QPushButton("Close", &dlg);
275 cbtn->setGeometry(260, 50, 100, 30);
276 connect(cbtn, SIGNAL(clicked()), &dlg, SLOT(reject()));
281 sensitive = tmpQRadioButton->isChecked();
282 find_text = tmpQLineEdit->text();
284 QTextDocument::FindFlags flags = 0;
287 flags |= QTextDocument::FindCaseSensitively;
289 editor->find(find_text, flags);
294 * Searches for next occurence of given text in editor content.
295 * Displays window to set search parameters. If text is found sets cursor
298 void Editor::on_actionFind_Next_triggered()
300 if (!find_text.isEmpty()) {
301 QTextDocument::FindFlags flags = 0;
304 flags |= QTextDocument::FindCaseSensitively;
306 editor->find(find_text, flags);
311 * Displays window with editor properties
313 void Editor::on_actionPreferences_triggered()
315 dialog::PreferencesDialog dialog(this);
317 dialog.setCompilerPath(compiler_path);
318 dialog.setFilesPath(file_path);
319 dialog.setGenPath(gen_path);
322 compiler_path.sprintf("%s", dialog.getCompilerPath().toStdString().c_str());
323 gen_path.sprintf("%s",dialog.getGenPath().toStdString().c_str());
324 file_path.sprintf("%s", dialog.getFilesPath().toStdString().c_str());
329 * Saves and compiles code.
331 void Editor::on_actionCompile_triggered()
333 on_actionSave_triggered();
340 void Editor::on_actionGen_triggered()
346 * Saves, compiles and generates code.
348 void Editor::on_actionCompile_Gen_triggered()
350 on_actionSave_triggered();
354 void Editor::on_actionProgram_structure_triggered()
356 dialog::ProgramStructureDialog dialog(this);
359 editor->textCursor().insertText(dialog.getCode());
363 void Editor::on_actionUnit_structure_triggered()
365 dialog::UnitStructureDialog dialog(this);
368 editor->textCursor().insertText(dialog.getCode());
376 * Program main function.
377 * argv[1] is mandatory and should be a path to the home directory of
378 * application (same as in configuration file).
380 * @param argc Number of program arguments
381 * @param argv Program arguments
383 int main(int argc, char **argv)
385 QApplication app(argc, argv);
386 loglan::vlp::Editor * editor = new loglan::vlp::Editor(argc, argv);