|  | Home · Examples

# Code for Application Example

    /****************************************************************************
    **
    ** Copyright (C) 1992-2008 Nokia. All rights reserved.
    **
    ** This file is part of Qt Jambi.
    **
    ** * Commercial Usage
    * Licensees holding valid Qt Commercial licenses may use this file in
    * accordance with the Qt Commercial License Agreement provided with the
    * Software or, alternatively, in accordance with the terms contained in
    * a written agreement between you and Nokia.
    *
    *
    * GNU General Public License Usage
    * Alternatively, this file may be used under the terms of the GNU
    * General Public License versions 2.0 or 3.0 as published by the Free
    * Software Foundation and appearing in the file LICENSE.GPL included in
    * the packaging of this file.  Please review the following information
    * to ensure GNU General Public Licensing requirements will be met:
    * http://www.fsf.org/licensing/licenses/info/GPLv2.html and
    * http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
    * exception, Nokia gives you certain additional rights. These rights
    * are described in the Nokia Qt GPL Exception version 1.2, included in
    * the file GPL_EXCEPTION.txt in this package.
    *
    * Qt for Windows(R) Licensees
    * As a special exception, Nokia, as the sole copyright holder for Qt
    * Designer, grants users of the Qt/Eclipse Integration plug-in the
    * right for the Qt/Eclipse Integration to link to functionality
    * provided by Qt Designer and its related libraries.
    *
    *
    * If you are unsure which license is appropriate for your use, please
    * contact the sales department at qt-sales@nokia.com.

    **
    ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
    ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
    **
    ****************************************************************************/

    package com.trolltech.examples;

    import com.trolltech.qt.QVariant;
    import com.trolltech.qt.core.*;
    import com.trolltech.qt.gui.*;

    @QtJambiExample(name = "Application")
    public class Application extends QMainWindow {

        private String curFile;
        private QTextEdit textEdit;
        private QMenu fileMenu;
        private QMenu editMenu;
        private QMenu helpMenu;

        private QToolBar fileToolBar;
        private QToolBar editToolBar;

        private QAction newAct;
        private QAction openAct;
        private QAction saveAct;
        private QAction saveAsAct;
        private QAction exitAct;
        private QAction cutAct;
        private QAction copyAct;
        private QAction pasteAct;
        private QAction aboutAct;
        private QAction aboutQtJambiAct;
        private QAction aboutQtAct;

        private String rsrcPath = "classpath:com/trolltech/images";

        public Application()
        {
            QMenuBar menuBar = new QMenuBar();
            setMenuBar(menuBar);

            setWindowIcon(new QIcon("classpath:com/trolltech/images/qt-logo.png"));

            textEdit = new QTextEdit();
            setCentralWidget(textEdit);

            try {
                createActions();
            } catch (Exception e) {
                e.printStackTrace();
            }
            createMenus();
            createToolBars();
            createStatusBar();

            readSettings();

            textEdit.document().contentsChanged.connect(this, "documentWasModified()");

            setCurrentFile("");
        }

        @Override
        public void closeEvent(QCloseEvent event)
        {
            if (maybeSave()) {
                writeSettings();
                event.accept();
            } else {
                event.ignore();
            }
        }

        public void newFile()
        {
            if (maybeSave()) {
                textEdit.clear();
                setCurrentFile("");
            }
        }

        public void open()
        {
            if (maybeSave()) {
                String fileName = QFileDialog.getOpenFileName(this);
                if (fileName.length() != 0)
                    loadFile(fileName);
            }
        }

        public boolean save()
        {
            if (curFile.length() == 0) {
                return saveAs();
            } else {
                return saveFile(curFile);
            }
        }

        public boolean saveAs()
        {
            String fileName = QFileDialog.getSaveFileName(this);
            if (fileName.length() == 0)
                return false;

            return saveFile(fileName);
        }

        public void about()
        {
            QMessageBox.about(this,
                             tr("About Application"),
                             tr("The <b>Application</b> example demonstrates how to " +
                                "write modern GUI applications using Qt, with a menu bar, " +
                                "toolbars, and a status bar."));
        }

        public void documentWasModified()
        {
            setWindowModified(textEdit.document().isModified());
        }

        private void createActions()
        {
            newAct = new QAction(new QIcon(rsrcPath + "/new.png"), tr("&New"), this);
            newAct.setShortcut(new QKeySequence(tr("Ctrl+N")));
            newAct.setStatusTip(tr("Create a new file"));
            newAct.triggered.connect(this, "newFile()");

            openAct = new QAction(new QIcon(rsrcPath + "/open.png"), tr("&Open..."), this);
            openAct.setShortcut(tr("Ctrl+O"));
            openAct.setStatusTip(tr("Open an existing file"));
            openAct.triggered.connect(this, "open()");

            saveAct = new QAction(new QIcon(rsrcPath + "/save.png"), tr("&Save"), this);
            saveAct.setShortcut(tr("Ctrl+S"));
            saveAct.setStatusTip(tr("Save the document to disk"));
            saveAct.triggered.connect(this, "save()");

            saveAsAct = new QAction(tr("Save &As..."), this);
            saveAsAct.setStatusTip(tr("Save the document under a new name"));
            saveAsAct.triggered.connect(this, "saveAs()");

            exitAct = new QAction(tr("E&xit"), this);
            exitAct.setShortcut(tr("Ctrl+Q"));
            exitAct.setStatusTip(tr("Exit the application"));
            exitAct.triggered.connect(this, "close()");

            cutAct = new QAction(new QIcon(rsrcPath + "/cut.png"), tr("Cu&t"), this);
            cutAct.setShortcut(tr("Ctrl+X"));
            cutAct.setStatusTip(tr("Cut the current selection's contents to the clipboard"));
            cutAct.triggered.connect(textEdit, "cut()");

            copyAct = new QAction(new QIcon(rsrcPath + "/copy.png"), tr("&Copy"), this);
            copyAct.setShortcut(tr("Ctrl+C"));
            copyAct.setStatusTip(tr("Copy the current selection's contents to the clipboard"));
            copyAct.triggered.connect(textEdit, "copy()");

            pasteAct = new QAction(new QIcon(rsrcPath + "/paste.png"), tr("&Paste"), this);
            pasteAct.setShortcut(tr("Ctrl+V"));
            pasteAct.setStatusTip(tr("Paste the clipboard's contents into the current selection"));
            pasteAct.triggered.connect(textEdit, "paste()");

            aboutAct = new QAction(tr("&About"), this);
            aboutAct.setStatusTip(tr("Show the application's About box"));
            aboutAct.triggered.connect(this, "about()");

            aboutQtJambiAct = new QAction(tr("About &Qt Jambi"), this);
            aboutQtJambiAct.setStatusTip(tr("Show the Qt Jambi library's About box"));
            aboutQtJambiAct.triggered.connect(QApplication.instance(), "aboutQtJambi()");

            aboutQtAct = new QAction(tr("About Q&t"), this);
            aboutQtAct.setStatusTip(tr("Show the Qt library's About box"));
            aboutQtAct.triggered.connect(QApplication.instance(), "aboutQt()");

            cutAct.setEnabled(false);
            copyAct.setEnabled(false);
            textEdit.copyAvailable.connect(cutAct, "setEnabled(boolean)");
            textEdit.copyAvailable.connect(copyAct, "setEnabled(boolean)");
        }

        private void createMenus()
        {
            fileMenu = menuBar().addMenu(tr("&File"));
            fileMenu.addAction(newAct);
            fileMenu.addAction(openAct);
            fileMenu.addAction(saveAct);
            fileMenu.addAction(saveAsAct);
            fileMenu.addSeparator();
            fileMenu.addAction(exitAct);

            editMenu = menuBar().addMenu(tr("&Edit"));
            editMenu.addAction(cutAct);
            editMenu.addAction(copyAct);
            editMenu.addAction(pasteAct);

            menuBar().addSeparator();

            helpMenu = menuBar().addMenu(tr("&Help"));
            helpMenu.addAction(aboutAct);
            helpMenu.addSeparator();
            helpMenu.addAction(aboutQtJambiAct);
            helpMenu.addAction(aboutQtAct);
        }

        private void createToolBars()
        {
            fileToolBar = addToolBar(tr("File"));
            fileToolBar.addAction(newAct);
            fileToolBar.addAction(openAct);
            fileToolBar.addAction(saveAct);

            editToolBar = addToolBar(tr("Edit"));
            editToolBar.addAction(cutAct);
            editToolBar.addAction(copyAct);
            editToolBar.addAction(pasteAct);
        }

        private void createStatusBar()
        {
            statusBar().showMessage(tr("Ready"));
        }

        private void readSettings()
        {
            QSettings settings = new QSettings("Nokia", "Application Example");
            QPoint pos = QVariant.toPoint(settings.value("pos", new QPoint(200, 200)));
            QSize size = QVariant.toSize(settings.value("size", new QSize(400, 400)));
            resize(size);
            move(pos);
        }

        private void writeSettings()
        {
            QSettings settings = new QSettings("Nokia", "Application Example");
            settings.setValue("pos", pos());
            settings.setValue("size", size());
        }

        private boolean maybeSave()
        {
            if (textEdit.document().isModified()) {
                QMessageBox.StandardButton ret = QMessageBox.warning(this, tr("Application"),
                                                                     tr("The document has been modified.\n" +
                                                                        "Save your changes?"),
                                                                     new QMessageBox.StandardButtons(QMessageBox.StandardButton.Ok,
                                                                                                     QMessageBox.StandardButton.Discard,
                                                                                                     QMessageBox.StandardButton.Cancel));
                if (ret == QMessageBox.StandardButton.Ok) {
                    return save();
                } else if (ret == QMessageBox.StandardButton.Cancel) {
                    return false;
                }
            }
            return true;
        }

        public void loadFile(String fileName)
        {
            QFile file = new QFile(fileName);
            if (!file.open(new QFile.OpenMode(QFile.OpenModeFlag.ReadOnly, QFile.OpenModeFlag.Text))) {
                QMessageBox.warning(this, tr("Application"), String.format(tr("Cannot read file %1$s:\n%2$s."), fileName, file.errorString()));
                return;
            }

            QTextStream in = new QTextStream(file);
            QApplication.setOverrideCursor(new QCursor(Qt.CursorShape.WaitCursor));
            textEdit.setPlainText(in.readAll());
            QApplication.restoreOverrideCursor();

            setCurrentFile(fileName);
            statusBar().showMessage(tr("File loaded"), 2000);
        }

        public boolean saveFile(String fileName)
        {
            QFile file = new QFile(fileName);
            if (!file.open(new QFile.OpenMode(QFile.OpenModeFlag.WriteOnly, QFile.OpenModeFlag.Text))) {
                QMessageBox.warning(this, tr("Application"), String.format(tr("Cannot write file %1$s:\n%2$s."), fileName, file.errorString()));
                return false;
            }

            QTextStream out = new QTextStream(file);
            QApplication.setOverrideCursor(new QCursor(Qt.CursorShape.WaitCursor));
            out.writeString(textEdit.toPlainText());
            QApplication.restoreOverrideCursor();

            setCurrentFile(fileName);
            statusBar().showMessage(tr("File saved"), 2000);
            file.close();
            return true;
        }

        public void setCurrentFile(String fileName)
        {
            curFile = fileName;
            textEdit.document().setModified(false);
            setWindowModified(false);

            String shownName;
            if (curFile.length() == 0)
                shownName = "untitled.txt";
            else
                shownName = strippedName(curFile);

            setWindowTitle(String.format(tr("%1$s[*] - %2$s"), shownName, tr("Application")));
        }

        private static String strippedName(String fullFileName)
        {
            return new QFileInfo(fullFileName).fileName();
        }

        public static void main(String[] args) {
            QApplication.initialize(args);

            Application application = new Application();
            application.show();

            QApplication.exec();
        }

    }