www.pudn.com > chap06.rar > editor.cpp


#include  
 
#include "editor.h" 
 
Editor::Editor(QWidget *parent) 
    : QTextEdit(parent) 
{ 
    action = new QAction(this); 
    action->setCheckable(true); 
    connect(action, SIGNAL(triggered()), this, SLOT(show())); 
    connect(action, SIGNAL(triggered()), this, SLOT(setFocus())); 
 
    isUntitled = true; 
    fileFilters = tr("Text files (*.txt)\n" 
                     "All files (*)"); 
 
    connect(document(), SIGNAL(contentsChanged()), 
            this, SLOT(documentWasModified())); 
 
    setWindowIcon(QPixmap(":/images/document.png")); 
    setAttribute(Qt::WA_DeleteOnClose); 
} 
 
void Editor::newFile() 
{ 
    static int documentNumber = 1; 
 
    curFile = tr("document%1.txt").arg(documentNumber); 
    setWindowTitle(curFile + "[*]"); 
    action->setText(curFile); 
    isUntitled = true; 
    ++documentNumber; 
} 
 
bool Editor::open() 
{ 
    QString fileName = 
            QFileDialog::getOpenFileName(this, tr("Open"), ".", 
                                         fileFilters); 
    if (fileName.isEmpty()) 
        return false; 
 
    return openFile(fileName); 
} 
 
bool Editor::openFile(const QString &fileName) 
{ 
    if (readFile(fileName)) { 
        setCurrentFile(fileName); 
        return true; 
    } else { 
        return false; 
    } 
} 
 
bool Editor::save() 
{ 
    if (isUntitled) { 
        return saveAs(); 
    } else { 
        return saveFile(curFile); 
    } 
} 
 
bool Editor::saveAs() 
{ 
    QString fileName = 
            QFileDialog::getSaveFileName(this, tr("Save As"), curFile, 
                                         fileFilters); 
    if (fileName.isEmpty()) 
        return false; 
 
    return saveFile(fileName); 
} 
 
QSize Editor::sizeHint() const 
{ 
    return QSize(72 * fontMetrics().width('x'), 
                 25 * fontMetrics().lineSpacing()); 
} 
 
void Editor::closeEvent(QCloseEvent *event) 
{ 
    if (okToContinue()) { 
        event->accept(); 
    } else { 
        event->ignore(); 
    } 
} 
 
void Editor::documentWasModified() 
{ 
    setWindowModified(true); 
} 
 
bool Editor::okToContinue() 
{ 
    if (document()->isModified()) { 
        int r = QMessageBox::warning(this, tr("MDI Editor"), 
                        tr("File %1 has been modified.\n" 
                           "Do you want to save your changes?") 
                        .arg(strippedName(curFile)), 
                        QMessageBox::Yes | QMessageBox::Default, 
                        QMessageBox::No, 
                        QMessageBox::Cancel | QMessageBox::Escape); 
        if (r == QMessageBox::Yes) { 
            return save(); 
        } else if (r == QMessageBox::Cancel) { 
            return false; 
        } 
    } 
    return true; 
} 
 
bool Editor::saveFile(const QString &fileName) 
{ 
    if (writeFile(fileName)) { 
        setCurrentFile(fileName); 
        return true; 
    } else { 
        return false; 
    } 
} 
 
void Editor::setCurrentFile(const QString &fileName) 
{ 
    curFile = fileName; 
    isUntitled = false; 
    action->setText(strippedName(curFile)); 
    document()->setModified(false); 
    setWindowTitle(strippedName(curFile) + "[*]"); 
    setWindowModified(false); 
} 
 
bool Editor::readFile(const QString &fileName) 
{ 
    QFile file(fileName); 
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { 
        QMessageBox::warning(this, tr("MDI Editor"), 
                             tr("Cannot read file %1:\n%2.") 
                             .arg(file.fileName()) 
                             .arg(file.errorString())); 
        return false; 
    } 
 
    QTextStream in(&file); 
    QApplication::setOverrideCursor(Qt::WaitCursor); 
    setPlainText(in.readAll()); 
    QApplication::restoreOverrideCursor(); 
    return true; 
} 
 
bool Editor::writeFile(const QString &fileName) 
{ 
    QFile file(fileName); 
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { 
        QMessageBox::warning(this, tr("MDI Editor"), 
                             tr("Cannot write file %1:\n%2.") 
                             .arg(file.fileName()) 
                             .arg(file.errorString())); 
        return false; 
    } 
 
    QTextStream out(&file); 
    QApplication::setOverrideCursor(Qt::WaitCursor); 
    out << document()->toPlainText(); 
    QApplication::restoreOverrideCursor(); 
    return true; 
} 
 
QString Editor::strippedName(const QString &fullFileName) 
{ 
    return QFileInfo(fullFileName).fileName(); 
}