Mercurial > octave-nkf
view gui/src/FileEditorMdiSubWindow.cpp @ 13524:8c143d6d0330
gui-editor: improved behaviour when closing a modified file
author | ttl (Torsten) <ttl@justmail.de> |
---|---|
date | Wed, 20 Jul 2011 21:23:07 +0200 |
parents | c70511cf64ee |
children | 8e87f3ba3beb |
line wrap: on
line source
/* OctaveGUI - A graphical user interface for Octave * Copyright (C) 2011 Jacob Dawid * jacob.dawid@googlemail.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "FileEditorMdiSubWindow.h" #include <QVBoxLayout> #include <QApplication> #include <QFile> #include <QFileDialog> #include <QMessageBox> #include <QAction> #include <QStyle> #include <QTextStream> FileEditorMdiSubWindow::FileEditorMdiSubWindow (QWidget * parent):QMdiSubWindow (parent) { construct (); } FileEditorMdiSubWindow::~FileEditorMdiSubWindow () { } void FileEditorMdiSubWindow::closeEvent(QCloseEvent *event) { // ignore close event if file is not saved and user cancels closing this window // TODO: This does not work if the main window is closed! if (checkFileModified ("Close File")==QMessageBox::Cancel) { event->ignore(); } else { event->accept(); } } void FileEditorMdiSubWindow::loadFile (QString fileName) { QFile file (fileName); if (!file.open (QFile::ReadOnly)) { QMessageBox::warning (this, tr ("File Editor"), tr ("Cannot read file %1:\n%2.").arg (fileName). arg (file.errorString ())); return; } QTextStream in (&file); QApplication::setOverrideCursor (Qt::WaitCursor); m_editor->setText (in.readAll ()); QApplication::restoreOverrideCursor (); m_fileName = fileName; setWindowTitle (fileName); m_statusBar->showMessage (tr ("File loaded."), 2000); m_editor->setModified (false); // loaded file is not modified yet } void FileEditorMdiSubWindow::newFile () { if (checkFileModified ("Open New File")==QMessageBox::Cancel) { return; // existing file not saved and creating new file canceled by user } m_fileName = "<unnamed>"; setWindowTitle (m_fileName); m_editor->setText (""); m_editor->setModified (false); // new file is not modified yet } int FileEditorMdiSubWindow::checkFileModified (QString msg) { int decision = QMessageBox::Yes; if (m_editor->isModified ()) { // file is modified but not saved, aks user what to do decision = QMessageBox::question (this, msg, tr ("Do you want to save the current file\n%1 ?"). arg (m_fileName), QMessageBox::Cancel, QMessageBox::No, QMessageBox::Yes); if (decision == QMessageBox::Yes) { saveFile (); if (m_editor->isModified ()) { // If the user attempted to save the file, but it's still // modified, then probably something went wrong, so return cancel // for cancel this operation return (QMessageBox::Cancel); } } } return (decision); } void FileEditorMdiSubWindow::saveFile () { if (m_fileName.isEmpty ()) { m_fileName = QFileDialog::getSaveFileName (this, "Save File", m_fileName); if (m_fileName.isEmpty ()) return; } QFile file (m_fileName); if (!file.open (QFile::WriteOnly)) { QMessageBox::warning (this, tr ("File Editor"), tr ("Cannot write file %1:\n%2."). arg (m_fileName).arg (file.errorString ())); return; } QTextStream out (&file); QApplication::setOverrideCursor (Qt::WaitCursor); out << m_editor->text (); QApplication::restoreOverrideCursor (); m_statusBar->showMessage (tr ("File saved"), 2000); m_editor->setModified (false); // files is save -> not modified } void FileEditorMdiSubWindow::saveFileAs () { /* QString saveFileName = QFileDialog::getSaveFileName(this, "Save File", m_fileName); if(saveFileName.isEmpty()) return; QFile file(saveFileName); file.open(QFile::WriteOnly); if(file.write(m_simpleEditor->toPlainText().toLocal8Bit()) == -1) { QMessageBox::warning(this, "Error Saving File", QString("The file could not be saved: %1.").arg(file.errorString())); } else { m_simpleEditor->document()->setModified(false); m_fileName = saveFileName; setWindowTitle(m_fileName); } file.close(); */ } void FileEditorMdiSubWindow::showToolTipNew () { m_statusBar->showMessage ("Create a new file.", 2000); } void FileEditorMdiSubWindow::showToolTipSave () { m_statusBar->showMessage ("Save the file.", 2000); } void FileEditorMdiSubWindow::showToolTipSaveAs () { m_statusBar->showMessage ("Save the file as.", 2000); } void FileEditorMdiSubWindow::showToolTipUndo () { m_statusBar->showMessage ("Revert previous changes.", 2000); } void FileEditorMdiSubWindow::showToolTipRedo () { m_statusBar->showMessage ("Append previous changes.", 2000); } void FileEditorMdiSubWindow::registerModified (bool modified) { m_modified = modified; } void FileEditorMdiSubWindow::construct () { QStyle *style = QApplication::style (); setWidget (new QWidget ()); m_toolBar = new QToolBar (this); m_statusBar = new QStatusBar (this); m_editor = new QsciScintilla (this); // Not available in the Debian repos yet! /* m_lexer = new QsciLexerOctave(m_editor); m_lexer->setDefaultFont(QFont("Monospace",9)); m_lexer->setAutoIndentStyle(QsciScintilla::AiMaintain || QsciScintilla::AiOpening || QsciScintilla::AiClosing); m_editor->setLexer(m_lexer); */ m_editor->setMarginType (1, QsciScintilla::TextMargin); m_editor->setMarginType (2, QsciScintilla::SymbolMargin); m_editor->setFolding (QsciScintilla::BoxedTreeFoldStyle, 2); m_editor->setMarginLineNumbers (1, true); m_editor->setMarginWidth (1, "99999"); m_editor->setBraceMatching (QsciScintilla::SloppyBraceMatch); m_editor->setAutoIndent (true); m_editor->setIndentationWidth (2); m_editor->setIndentationsUseTabs (false); m_editor->setAutoCompletionThreshold (2); QAction *newAction = new QAction (style->standardIcon (QStyle::SP_FileIcon), "", m_toolBar); QAction *saveAction = new QAction (style->standardIcon (QStyle::SP_DriveHDIcon), "", m_toolBar); QAction *saveActionAs = new QAction (style->standardIcon (QStyle::SP_DriveFDIcon), "", m_toolBar); QAction *undoAction = new QAction (style->standardIcon (QStyle::SP_ArrowLeft), "", m_toolBar); QAction *redoAction = new QAction (style->standardIcon (QStyle::SP_ArrowRight), "", m_toolBar); m_toolBar->addAction (newAction); m_toolBar->addAction (saveAction); m_toolBar->addAction (saveActionAs); m_toolBar->addAction (undoAction); m_toolBar->addAction (redoAction); QVBoxLayout *layout = new QVBoxLayout (); layout->addWidget (m_toolBar); layout->addWidget (m_editor); layout->addWidget (m_statusBar); layout->setMargin (2); widget ()->setLayout (layout); connect (newAction, SIGNAL (triggered ()), this, SLOT (newFile ())); connect (undoAction, SIGNAL (triggered ()), m_editor, SLOT (undo ())); connect (redoAction, SIGNAL (triggered ()), m_editor, SLOT (redo ())); connect (saveAction, SIGNAL (triggered ()), this, SLOT (saveFile ())); connect (saveActionAs, SIGNAL (triggered ()), this, SLOT (saveFileAs ())); connect (newAction, SIGNAL (hovered ()), this, SLOT (showToolTipNew ())); connect (undoAction, SIGNAL (hovered ()), this, SLOT (showToolTipUndo ())); connect (redoAction, SIGNAL (hovered ()), this, SLOT (showToolTipRedo ())); connect (saveAction, SIGNAL (hovered ()), this, SLOT (showToolTipSave ())); connect (saveActionAs, SIGNAL (hovered ()), this, SLOT (showToolTipSaveAs ())); m_fileName = ""; setWindowTitle (m_fileName); show (); }