|  | Home · Examples

# Code for Order Form Example

    /****************************************************************************
    **
    ** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
    **
    ** This file is part of Qt Jambi.
    **
    ** ** This file may be used under the terms of the GNU General Public
    ** License version 2.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.trolltech.com/products/qt/opensource.html
    **
    ** If you are unsure which license is appropriate for your use, please
    ** review the following information:
    ** http://www.trolltech.com/products/qt/licensing.html or contact the
    ** sales department at sales@trolltech.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.*;
    import com.trolltech.qt.core.*;
    import com.trolltech.qt.gui.*;

    import java.util.*;

    @QtJambiExample(name = "Order Form")
    public class OrderForm extends QMainWindow
    {
        private static class DetailsDialog extends QDialog
        {
            private QLabel nameLabel;
            private QLabel addressLabel;
            private QCheckBox offersCheckBox;
            private QLineEdit nameEdit;
            private List<String> items;
            private QTableWidget itemsTable;
            private QTextEdit addressEdit;
            private QDialogButtonBox buttonBox;

            public DetailsDialog(String title, QWidget parent)
            {
                nameLabel = new QLabel(tr("Name:"));
                addressLabel = new QLabel(tr("Address:"));
                addressLabel.setAlignment(Qt.AlignmentFlag.createQFlags
                            (Qt.AlignmentFlag.AlignLeft, Qt.AlignmentFlag.AlignTop));

                nameEdit = new QLineEdit();
                addressEdit = new QTextEdit();

                offersCheckBox = new QCheckBox(tr("Send information about products and "
                                                  + "special offers"));

                setupItemsTable();

                buttonBox = new QDialogButtonBox(new QDialogButtonBox.StandardButtons(
                                                 QDialogButtonBox.StandardButton.Ok,
                                                 QDialogButtonBox.StandardButton.Cancel));

                buttonBox.accepted.connect(this, "verify()");
                buttonBox.rejected.connect(this, "reject()");

                QGridLayout mainLayout = new QGridLayout();
                mainLayout.addWidget(nameLabel, 0, 0);
                mainLayout.addWidget(nameEdit, 0, 1);
                mainLayout.addWidget(addressLabel, 1, 0);
                mainLayout.addWidget(addressEdit, 1, 1);
                mainLayout.addWidget(itemsTable, 0, 2, 2, 1);
                mainLayout.addWidget(offersCheckBox, 2, 1, 1, 2);
                mainLayout.addWidget(buttonBox, 3, 0, 1, 3);
                setLayout(mainLayout);

                setWindowTitle(title);
            }

            public void verify()
            {
                if (!nameEdit.text().equals("") &&
                    !addressEdit.toPlainText().equals("")) {
                    accept();
                    return;
                }

                QMessageBox.StandardButton answer;
                answer = QMessageBox.warning(this, tr("Incomplete Form"),
                    tr("The form does not contain all the necessary information.\n"
                       + "Do you want to discard it?"),
                    new QMessageBox.StandardButtons(QMessageBox.StandardButton.Yes,
                                                    QMessageBox.StandardButton.No));

                if (answer.equals(QMessageBox.StandardButton.Yes))
                    reject();
            }

            public List<QPair<String, Integer>> orderItems()
            {
                List<QPair<String, Integer>> orderList = new Vector<QPair<String, Integer>>();

                for (int row = 0; row < items.size(); ++row) {
                    int quantity = Integer.parseInt(
                        (String) itemsTable.item(row, 1).data(Qt.ItemDataRole.DisplayRole));

                    orderList.add(new QPair<String, Integer>(itemsTable.item(row, 0).text(),
                                  Math.max(0, quantity)));
                }

                return orderList;
            }

            public String senderName()
            {
                return nameEdit.text();
            }

            public String senderAddress()
            {
                return addressEdit.toPlainText();
            }

            public boolean sendOffers()
            {
                return offersCheckBox.isChecked();
            }

            private void setupItemsTable()
            {
                items = new Vector<String>();
                items.add(tr("T-shirt"));
                items.add(tr("Badge"));
                items.add(tr("Reference book"));
                items.add(tr("Coffee cup"));

                itemsTable = new QTableWidget(items.size(), 2);

                for (int row = 0; row < items.size(); ++row) {
                    QTableWidgetItem name = new QTableWidgetItem(items.get(row));
                    name.setFlags(new Qt.ItemFlags(Qt.ItemFlag.ItemIsEnabled, Qt.ItemFlag.ItemIsSelectable));
                    itemsTable.setItem(row, 0, name);
                    QTableWidgetItem quantity = new QTableWidgetItem("1");
                    itemsTable.setItem(row, 1, quantity);
                }
            }
        }
        public OrderForm() {
            QMenu fileMenu = new QMenu(tr("&File"), this);
            QAction newAction = fileMenu.addAction(tr("&New..."));
            newAction.setShortcut(tr("Ctrl+N"));
            printAction = new QAction(tr("&Print..."), this);
            fileMenu.addAction(printAction);
            printAction.setShortcut(tr("Ctrl+P"));
            printAction.setEnabled(false);
            QAction quitAction = fileMenu.addAction(tr("E&xit"));
            quitAction.setShortcut(tr("Ctrl+Q"));
            menuBar().addMenu(fileMenu);

            letters = new QTabWidget();

            newAction.triggered.connect(this, "openDialog()");
            printAction.triggered.connect(this, "printFile()");
            quitAction.triggered.connect(this, "close()");

            setCentralWidget(letters);
            setWindowTitle(tr("Order Form"));

            createSample();
        }

        public void createSample()
        {
            DetailsDialog dialog =
                new DetailsDialog("Dialog with default values", this);
            createLetter("Mr. Smith", "12 High Street\nSmall Town\nThis country",
                         dialog.orderItems(), true);
        }

        public void openDialog() {
            DetailsDialog dialog =
                    new DetailsDialog(tr("Enter Customer Details"), this);

            if (dialog.exec() == QDialog.DialogCode.Accepted.value())
                createLetter(dialog.senderName(), dialog.senderAddress(),
                        dialog.orderItems(), dialog.sendOffers());
        }

        public void printFile() {
            QTextEdit editor = (QTextEdit) letters.currentWidget();
            QPrinter printer = new QPrinter();

            QPrintDialog dialog = new QPrintDialog(printer, this);
            dialog.setWindowTitle(tr("Print Document"));
            if (editor.textCursor().hasSelection())
                dialog.addEnabledOption(
                        QAbstractPrintDialog.PrintDialogOption.PrintSelection);

            if (dialog.exec() != QDialog.DialogCode.Accepted.value())
                return;

            editor.print(printer);
        }

        private void createLetter(String name, String address,
                                  List<QPair<String, Integer>> orderItems,
                                  boolean sendOffers) {
            QTextEdit editor = new QTextEdit();
            int tabIndex = letters.addTab(editor, name);
            letters.setCurrentIndex(tabIndex);

            QTextCursor cursor = new QTextCursor(editor.textCursor());
            cursor.movePosition(QTextCursor.MoveOperation.Start);
            QTextFrame topFrame = cursor.currentFrame();
            QTextFrameFormat topFrameFormat = topFrame.frameFormat();
            topFrameFormat.setPadding(16);
            topFrame.setFrameFormat(topFrameFormat);

            QTextCharFormat textFormat = new QTextCharFormat();
            QTextCharFormat boldFormat = new QTextCharFormat();
            boldFormat.setFontWeight(QFont.Weight.Bold.value());

            QTextFrameFormat referenceFrameFormat = new QTextFrameFormat();
            referenceFrameFormat.setBorder(1);
            referenceFrameFormat.setPadding(8);
            referenceFrameFormat.setPosition(QTextFrameFormat.Position.FloatRight);
            referenceFrameFormat.setWidth(new QTextLength(QTextLength.Type.PercentageLength, 40));
            cursor.insertFrame(referenceFrameFormat);

            cursor.insertText("A company", boldFormat);
            cursor.insertBlock();
            cursor.insertText("321 City Street");
            cursor.insertBlock();
            cursor.insertText("Industry Park");
            cursor.insertBlock();
            cursor.insertText("Another country");

            cursor.setPosition(topFrame.lastPosition());

            cursor.insertText(name, textFormat);

            for (String line : address.split("\n")) {
                cursor.insertBlock();
                cursor.insertText(line);
            }

            cursor.insertBlock();
            cursor.insertBlock();

            QDate date = QDate.currentDate();
            cursor.insertText(tr("Date: ") + date.toString("d MMMM yyyy"),
                    textFormat);
            cursor.insertBlock();

            QTextFrameFormat bodyFrameFormat = new QTextFrameFormat();
            bodyFrameFormat.setWidth(new QTextLength(QTextLength.Type.PercentageLength, 100));
            cursor.insertFrame(bodyFrameFormat);

            cursor.insertText(tr("I would like to place an order for the following "
                    + "items:"), textFormat);
            cursor.insertBlock();
            cursor.insertBlock();

            QTextTableFormat orderTableFormat = new QTextTableFormat();
            orderTableFormat.setAlignment(Qt.AlignmentFlag.AlignHCenter);
            QTextTable orderTable = cursor.insertTable(1, 2, orderTableFormat);

            QTextFrameFormat orderFrameFormat = cursor.currentFrame().frameFormat();
            orderFrameFormat.setBorder(1);
            cursor.currentFrame().setFrameFormat(orderFrameFormat);

            cursor = orderTable.cellAt(0, 0).firstCursorPosition();
            cursor.insertText(tr("Product"), boldFormat);
            cursor = orderTable.cellAt(0, 1).firstCursorPosition();
            cursor.insertText(tr("Quantity"), boldFormat);

            for (int i = 0; i < orderItems.size(); ++i) {
                QPair<String, Integer> item = orderItems.get(i);
                int row = orderTable.rows();

                orderTable.insertRows(row, 1);
                cursor = orderTable.cellAt(row, 0).firstCursorPosition();
                cursor.insertText(item.first, textFormat);
                cursor = orderTable.cellAt(row, 1).firstCursorPosition();
                cursor.insertText("" + item.second, textFormat);
            }

            cursor.setPosition(topFrame.lastPosition());

            cursor.insertBlock();
            cursor.insertText(tr("Please update my records to take account of the "
                    + "following privacy information:"));
            cursor.insertBlock();

            QTextTable offersTable = cursor.insertTable(2, 2);

            cursor = offersTable.cellAt(0, 1).firstCursorPosition();
            cursor.insertText(tr("I want to receive more information about your "
                    + "company's products and special offers."), textFormat);
            cursor = offersTable.cellAt(1, 1).firstCursorPosition();
            cursor.insertText(tr("I do not want to receive any promotional information "
                    + "from your company."), textFormat);

            if (sendOffers)
                cursor = offersTable.cellAt(0, 0).firstCursorPosition();
            else
                cursor = offersTable.cellAt(1, 0).firstCursorPosition();

            cursor.insertText("X", boldFormat);

            cursor.setPosition(topFrame.lastPosition());
            cursor.insertBlock();
            cursor.insertText(tr("Sincerely,"), textFormat);
            cursor.insertBlock();
            cursor.insertBlock();
            cursor.insertBlock();
            cursor.insertText(name);

            printAction.setEnabled(true);
        }

        @Override
        public QSize sizeHint() {
            return new QSize(500, 550);
        }

        private QAction printAction;
        private QTabWidget letters;

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

            OrderForm window = new OrderForm();
            window.show();

            QApplication.exec();
        }
    }