mainwindow.cpp Example File

mainwindows/dockwidgets/mainwindow.cpp

  /****************************************************************************
  **
  ** Copyright (C) 2016 The Qt Company Ltd.
  ** Contact: https://www.qt.io/licensing/
  **
  ** This file is part of the examples of the Qt Toolkit.
  **
  ** $QT_BEGIN_LICENSE:BSD$
  ** Commercial License Usage
  ** Licensees holding valid commercial Qt licenses may use this file in
  ** accordance with the commercial license agreement provided with the
  ** Software or, alternatively, in accordance with the terms contained in
  ** a written agreement between you and The Qt Company. For licensing terms
  ** and conditions see https://www.qt.io/terms-conditions. For further
  ** information use the contact form at https://www.qt.io/contact-us.
  **
  ** BSD License Usage
  ** Alternatively, you may use this file under the terms of the BSD license
  ** as follows:
  **
  ** "Redistribution and use in source and binary forms, with or without
  ** modification, are permitted provided that the following conditions are
  ** met:
  **   * Redistributions of source code must retain the above copyright
  **     notice, this list of conditions and the following disclaimer.
  **   * Redistributions in binary form must reproduce the above copyright
  **     notice, this list of conditions and the following disclaimer in
  **     the documentation and/or other materials provided with the
  **     distribution.
  **   * Neither the name of The Qt Company Ltd nor the names of its
  **     contributors may be used to endorse or promote products derived
  **     from this software without specific prior written permission.
  **
  **
  ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  **
  ** $QT_END_LICENSE$
  **
  ****************************************************************************/

  #include <QtWidgets>
  #ifndef QT_NO_PRINTDIALOG
  #include <QtPrintSupport>
  #endif

  #include "mainwindow.h"

  MainWindow::MainWindow()
      : textEdit(new QTextEdit)
  {
      setCentralWidget(textEdit);

      createActions();
      createStatusBar();
      createDockWindows();

      setWindowTitle(tr("Dock Widgets"));

      newLetter();
      setUnifiedTitleAndToolBarOnMac(true);
  }

  void MainWindow::newLetter()
  {
      textEdit->clear();

      QTextCursor cursor(textEdit->textCursor());
      cursor.movePosition(QTextCursor::Start);
      QTextFrame *topFrame = cursor.currentFrame();
      QTextFrameFormat topFrameFormat = topFrame->frameFormat();
      topFrameFormat.setPadding(16);
      topFrame->setFrameFormat(topFrameFormat);

      QTextCharFormat textFormat;
      QTextCharFormat boldFormat;
      boldFormat.setFontWeight(QFont::Bold);
      QTextCharFormat italicFormat;
      italicFormat.setFontItalic(true);

      QTextTableFormat tableFormat;
      tableFormat.setBorder(1);
      tableFormat.setCellPadding(16);
      tableFormat.setAlignment(Qt::AlignRight);
      cursor.insertTable(1, 1, tableFormat);
      cursor.insertText("The Firm", boldFormat);
      cursor.insertBlock();
      cursor.insertText("321 City Street", textFormat);
      cursor.insertBlock();
      cursor.insertText("Industry Park");
      cursor.insertBlock();
      cursor.insertText("Some Country");
      cursor.setPosition(topFrame->lastPosition());
      cursor.insertText(QDate::currentDate().toString("d MMMM yyyy"), textFormat);
      cursor.insertBlock();
      cursor.insertBlock();
      cursor.insertText("Dear ", textFormat);
      cursor.insertText("NAME", italicFormat);
      cursor.insertText(",", textFormat);
      for (int i = 0; i < 3; ++i)
          cursor.insertBlock();
      cursor.insertText(tr("Yours sincerely,"), textFormat);
      for (int i = 0; i < 3; ++i)
          cursor.insertBlock();
      cursor.insertText("The Boss", textFormat);
      cursor.insertBlock();
      cursor.insertText("ADDRESS", italicFormat);
  }

  void MainWindow::print()
  {
  #ifndef QT_NO_PRINTDIALOG
      QTextDocument *document = textEdit->document();
      QPrinter printer;

      QPrintDialog dlg(&printer, this);
      if (dlg.exec() != QDialog::Accepted) {
          return;
      }

      document->print(&printer);
      statusBar()->showMessage(tr("Ready"), 2000);
  #endif
  }

  void MainWindow::save()
  {
      QMimeDatabase mimeDatabase;
      QString fileName = QFileDialog::getSaveFileName(this,
                          tr("Choose a file name"), ".",
                          mimeDatabase.mimeTypeForName("text/html").filterString());
      if (fileName.isEmpty())
          return;
      QFile file(fileName);
      if (!file.open(QFile::WriteOnly | QFile::Text)) {
          QMessageBox::warning(this, tr("Dock Widgets"),
                               tr("Cannot write file %1:\n%2.")
                               .arg(QDir::toNativeSeparators(fileName), file.errorString()));
          return;
      }

      QTextStream out(&file);
      QApplication::setOverrideCursor(Qt::WaitCursor);
      out << textEdit->toHtml();
      QApplication::restoreOverrideCursor();

      statusBar()->showMessage(tr("Saved '%1'").arg(fileName), 2000);
  }

  void MainWindow::undo()
  {
      QTextDocument *document = textEdit->document();
      document->undo();
  }

  void MainWindow::insertCustomer(const QString &customer)
  {
      if (customer.isEmpty())
          return;
      QStringList customerList = customer.split(", ");
      QTextDocument *document = textEdit->document();
      QTextCursor cursor = document->find("NAME");
      if (!cursor.isNull()) {
          cursor.beginEditBlock();
          cursor.insertText(customerList.at(0));
          QTextCursor oldcursor = cursor;
          cursor = document->find("ADDRESS");
          if (!cursor.isNull()) {
              for (int i = 1; i < customerList.size(); ++i) {
                  cursor.insertBlock();
                  cursor.insertText(customerList.at(i));
              }
              cursor.endEditBlock();
          }
          else
              oldcursor.endEditBlock();
      }
  }

  void MainWindow::addParagraph(const QString &paragraph)
  {
      if (paragraph.isEmpty())
          return;
      QTextDocument *document = textEdit->document();
      QTextCursor cursor = document->find(tr("Yours sincerely,"));
      if (cursor.isNull())
          return;
      cursor.beginEditBlock();
      cursor.movePosition(QTextCursor::PreviousBlock, QTextCursor::MoveAnchor, 2);
      cursor.insertBlock();
      cursor.insertText(paragraph);
      cursor.insertBlock();
      cursor.endEditBlock();

  }

  void MainWindow::about()
  {
     QMessageBox::about(this, tr("About Dock Widgets"),
              tr("The <b>Dock Widgets</b> example demonstrates how to "
                 "use Qt's dock widgets. You can enter your own text, "
                 "click a customer to add a customer name and "
                 "address, and click standard paragraphs to add them."));
  }

  void MainWindow::createActions()
  {
      QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
      QToolBar *fileToolBar = addToolBar(tr("File"));

      const QIcon newIcon = QIcon::fromTheme("document-new", QIcon(":/images/new.png"));
      QAction *newLetterAct = new QAction(newIcon, tr("&New Letter"), this);
      newLetterAct->setShortcuts(QKeySequence::New);
      newLetterAct->setStatusTip(tr("Create a new form letter"));
      connect(newLetterAct, &QAction::triggered, this, &MainWindow::newLetter);
      fileMenu->addAction(newLetterAct);
      fileToolBar->addAction(newLetterAct);

      const QIcon saveIcon = QIcon::fromTheme("document-save", QIcon(":/images/save.png"));
      QAction *saveAct = new QAction(saveIcon, tr("&Save..."), this);
      saveAct->setShortcuts(QKeySequence::Save);
      saveAct->setStatusTip(tr("Save the current form letter"));
      connect(saveAct, &QAction::triggered, this, &MainWindow::save);
      fileMenu->addAction(saveAct);
      fileToolBar->addAction(saveAct);

      const QIcon printIcon = QIcon::fromTheme("document-print", QIcon(":/images/print.png"));
      QAction *printAct = new QAction(printIcon, tr("&Print..."), this);
      printAct->setShortcuts(QKeySequence::Print);
      printAct->setStatusTip(tr("Print the current form letter"));
      connect(printAct, &QAction::triggered, this, &MainWindow::print);
      fileMenu->addAction(printAct);
      fileToolBar->addAction(printAct);

      fileMenu->addSeparator();

      QAction *quitAct = fileMenu->addAction(tr("&Quit"), this, &QWidget::close);
      quitAct->setShortcuts(QKeySequence::Quit);
      quitAct->setStatusTip(tr("Quit the application"));

      QMenu *editMenu = menuBar()->addMenu(tr("&Edit"));
      QToolBar *editToolBar = addToolBar(tr("Edit"));
      const QIcon undoIcon = QIcon::fromTheme("edit-undo", QIcon(":/images/undo.png"));
      QAction *undoAct = new QAction(undoIcon, tr("&Undo"), this);
      undoAct->setShortcuts(QKeySequence::Undo);
      undoAct->setStatusTip(tr("Undo the last editing action"));
      connect(undoAct, &QAction::triggered, this, &MainWindow::undo);
      editMenu->addAction(undoAct);
      editToolBar->addAction(undoAct);

      viewMenu = menuBar()->addMenu(tr("&View"));

      menuBar()->addSeparator();

      QMenu *helpMenu = menuBar()->addMenu(tr("&Help"));

      QAction *aboutAct = helpMenu->addAction(tr("&About"), this, &MainWindow::about);
      aboutAct->setStatusTip(tr("Show the application's About box"));

      QAction *aboutQtAct = helpMenu->addAction(tr("About &Qt"), qApp, &QApplication::aboutQt);
      aboutQtAct->setStatusTip(tr("Show the Qt library's About box"));
  }

  void MainWindow::createStatusBar()
  {
      statusBar()->showMessage(tr("Ready"));
  }

  void MainWindow::createDockWindows()
  {
      QDockWidget *dock = new QDockWidget(tr("Customers"), this);
      dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
      customerList = new QListWidget(dock);
      customerList->addItems(QStringList()
              << "John Doe, Harmony Enterprises, 12 Lakeside, Ambleton"
              << "Jane Doe, Memorabilia, 23 Watersedge, Beaton"
              << "Tammy Shea, Tiblanka, 38 Sea Views, Carlton"
              << "Tim Sheen, Caraba Gifts, 48 Ocean Way, Deal"
              << "Sol Harvey, Chicos Coffee, 53 New Springs, Eccleston"
              << "Sally Hobart, Tiroli Tea, 67 Long River, Fedula");
      dock->setWidget(customerList);
      addDockWidget(Qt::RightDockWidgetArea, dock);
      viewMenu->addAction(dock->toggleViewAction());

      dock = new QDockWidget(tr("Paragraphs"), this);
      paragraphsList = new QListWidget(dock);
      paragraphsList->addItems(QStringList()
              << "Thank you for your payment which we have received today."
              << "Your order has been dispatched and should be with you "
                 "within 28 days."
              << "We have dispatched those items that were in stock. The "
                 "rest of your order will be dispatched once all the "
                 "remaining items have arrived at our warehouse. No "
                 "additional shipping charges will be made."
              << "You made a small overpayment (less than $5) which we "
                 "will keep on account for you, or return at your request."
              << "You made a small underpayment (less than $1), but we have "
                 "sent your order anyway. We'll add this underpayment to "
                 "your next bill."
              << "Unfortunately you did not send enough money. Please remit "
                 "an additional $. Your order will be dispatched as soon as "
                 "the complete amount has been received."
              << "You made an overpayment (more than $5). Do you wish to "
                 "buy more items, or should we return the excess to you?");
      dock->setWidget(paragraphsList);
      addDockWidget(Qt::RightDockWidgetArea, dock);
      viewMenu->addAction(dock->toggleViewAction());

      connect(customerList, &QListWidget::currentTextChanged,
              this, &MainWindow::insertCustomer);
      connect(paragraphsList, &QListWidget::currentTextChanged,
              this, &MainWindow::addParagraph);
  }