view gui/src/FileEditorDockWidget.cpp @ 13495:11e03a76d8c0

Added source files.
author Jacob Dawid <jacob.dawid@googlemail.com>
date Fri, 29 Apr 2011 23:51:33 +0200
parents
children
line wrap: on
line source

/* Quint - 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 "FileEditorDockWidget.h"
#include <QVBoxLayout>
#include <QApplication>
#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
#include <QAction>

FileEditorDockWidget::FileEditorDockWidget(QWidget *parent)
    : QDockWidget(parent) {
    construct();
}

void FileEditorDockWidget::loadFile(QString fileName) {
    m_fileName = fileName;
    setWindowTitle(fileName);
    m_simpleEditor->load(fileName);
}

void FileEditorDockWidget::newFile() {
    if(m_modified) {
        int decision
                = QMessageBox::question(this,
                                        "Open New File",
                                        "Do you want to save the current file?",
                                        QMessageBox::Yes, QMessageBox::No);

        if(decision == QMessageBox::Yes) {
            saveFile();
            if(m_modified) {
                // If the user attempted to save the file, but it's still
                // modified, then probably something went wrong, so we quit here.
                return;
            }
        }
    }

    m_fileName = "<unnamed>";
    setWindowTitle(m_fileName);
    m_simpleEditor->setPlainText("");
}

void FileEditorDockWidget::saveFile() {
    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);
    }

    file.close();
}

void FileEditorDockWidget::showToolTipNew() {
    m_statusBar->showMessage("Create a new file.", 2000);
}

void FileEditorDockWidget::showToolTipSave() {
    m_statusBar->showMessage("Save the file.", 2000);
}

void FileEditorDockWidget::showToolTipUndo() {
    m_statusBar->showMessage("Revert previous changes.", 2000);
}

void FileEditorDockWidget::showToolTipRedo() {
    m_statusBar->showMessage("Append previous changes.", 2000);
}

void FileEditorDockWidget::registerModified(bool modified) {
    m_modified = modified;
}

void FileEditorDockWidget::construct() {
    QStyle *style = QApplication::style();
    setWidget(new QWidget());
    m_toolBar = new QToolBar(this);
    m_simpleEditor = new SimpleEditor(this);
    m_statusBar = new QStatusBar(this);
    m_numberedTextView = new NumberedCodeEdit(this, m_simpleEditor);

    m_simpleEditor->setFont(QFont("Courier"));
    m_simpleEditor->setLineWrapMode(QPlainTextEdit::NoWrap);

    QAction *newAction = new QAction(style->standardIcon(QStyle::SP_FileIcon),
        "", m_toolBar);
    QAction *saveAction = new QAction(style->standardIcon(QStyle::SP_DriveHDIcon),
        "", 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(undoAction);
    m_toolBar->addAction(redoAction);

    QVBoxLayout *layout = new QVBoxLayout();
    layout->addWidget(m_toolBar);
    layout->addWidget(m_numberedTextView);
    layout->addWidget(m_statusBar);
    layout->setMargin(2);
    widget()->setLayout(layout);

    connect(newAction, SIGNAL(triggered()), this, SLOT(newFile()));
    connect(undoAction, SIGNAL(triggered()), m_simpleEditor, SLOT(undo()));
    connect(redoAction, SIGNAL(triggered()), m_simpleEditor, SLOT(redo()));
    connect(saveAction, SIGNAL(triggered()), this, SLOT(saveFile()));

    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(m_simpleEditor, SIGNAL(modificationChanged(bool)), this, SLOT(registerModified(bool)));

    m_fileName = "";
    setWindowTitle(m_fileName);
}