[umbrello] /: Add welcome page as dock widget.

Ralf Habacker ralf.habacker at freenet.de
Wed Nov 9 11:48:00 UTC 2016


Git commit 52a9df263c45d5539bba881b259524c42702356f by Ralf Habacker.
Committed on 09/11/2016 at 11:33.
Pushed by habacker into branch 'master'.

Add welcome page as dock widget.

The welcome page is based on the file welcome.docbook
which is converted into a html file on building.

The implementation has support for loading a translated
welcome file installed in the directory where other umbrello
related docbook files lives.

BUG:372252
FIXED-IN:2.20.80 (KDE Applications 16.11.80)

Signed-off-by: Ralf Habacker <ralf.habacker at freenet.de>

M  +2    -1    CMakeLists.txt
M  +79   -0    doc/CMakeLists.txt
A  +73   -0    doc/welcome.docbook
M  +4    -0    umbrello/CMakeLists.txt
M  +4    -3    umbrello/cmds.h
M  +1    -0    umbrello/uml.cpp
M  +102  -1    umbrello/umlappprivate.cpp
M  +60   -0    umbrello/umlappprivate.h
M  +2    -0    unittests/CMakeLists.txt

http://commits.kde.org/umbrello/52a9df263c45d5539bba881b259524c42702356f

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 55df543..854fa39 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,7 +28,7 @@ if(NOT BUILD_KF5)
 
     set(CMAKE_AUTOMOC ON)
     set(CMAKE_INCLUDE_CURRENT_DIR ON)
-    find_package(Qt4 4.4.3 REQUIRED QtCore QtGui QtXml QtTest)
+    find_package(Qt4 4.4.3 REQUIRED QtCore QtGui QtXml QtTest QtWebKit)
 
     set(KDE4_BUILD_TESTS ON)  # for unit tests
 
@@ -148,6 +148,7 @@ else()
         Test
         Widgets
         Xml
+        WebKitWidgets
     )
 
     # search packages used by KDE
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
index 41e19c9..bd2a1d4 100644
--- a/doc/CMakeLists.txt
+++ b/doc/CMakeLists.txt
@@ -1,3 +1,73 @@
+if (NOT BUILD_KF5)
+    set(KDOCTOOLS_CUSTOMIZATION_DIR "${KDE4_DATA_INSTALL_DIR}/ksgmltools2/customization")
+    set(KDOCTOOLS_MEINPROC_EXECUTABLE meinproc4)
+else()
+    set(KDOCTOOLS_CUSTOMIZATION_DIR "${KDOCTOOLS_DATA_INSTALL_DIR}/kdoctools/customization")
+endif()
+
+function(_kdoctools_create_target_name out in)
+    string(REGEX REPLACE "^${CMAKE_BINARY_DIR}/?" "" in "${in}")
+    string(REGEX REPLACE "[^0-9a-zA-Z]+" "-" tmp "${in}")
+    set(${out} ${tmp} PARENT_SCOPE)
+endfunction()
+
+function (kdoctools_create_article docbook)
+    # Parse arguments
+    set(options)
+    set(oneValueArgs INSTALL_DESTINATION SUBDIR)
+    set(multiValueArgs)
+    cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+    if(NOT DEFINED ARGS_SUBDIR)
+        message(FATAL_ERROR "SUBDIR needs to be defined when calling kdoctools_create_article")
+    endif()
+
+    # Init vars
+    get_filename_component(docbook ${docbook} ABSOLUTE)
+    file(RELATIVE_PATH src_doc ${CMAKE_CURRENT_SOURCE_DIR} ${docbook})
+    get_filename_component(src_dir ${src_doc} DIRECTORY)
+    get_filename_component(_name ${docbook} NAME_WE)
+    set(build_dir ${CMAKE_CURRENT_BINARY_DIR}/${src_dir})
+    set(build_html ${build_dir}/${_name}.html)
+
+    # current directory is the docbook directory, but if this is empty, the
+    # globs which finds the docbooks and the images will be empty too as
+    # they will expand into "/*.docbook" and "/*.png"
+    if (src_dir STREQUAL "")
+        set(src_dir ".")
+    endif ()
+
+    # Create some place to store our files
+    file(MAKE_DIRECTORY ${build_dir})
+
+    #Bootstrap
+    if (_kdoctoolsBootStrapping)
+        set(_bootstrapOption "--srcdir=${KDocTools_BINARY_DIR}/src")
+    elseif (CMAKE_CROSSCOMPILING AND CMAKE_SYSTEM_NAME STREQUAL "Windows")
+        set(_bootstrapOption "--srcdir=${KDOCTOOLS_DATA_INSTALL_DIR}/kdoctools")
+    else ()
+        set(_bootstrapOption)
+    endif ()
+    set(_ssheet "${KDOCTOOLS_CUSTOMIZATION_DIR}/kde-chunk.xsl")
+
+    add_custom_command(OUTPUT ${build_html}
+        COMMAND ${KDOCTOOLS_MEINPROC_EXECUTABLE} --check ${_bootstrapOption} -o ${build_html} ${src_doc}
+        DEPENDS ${src_doc} ${_ssheet}
+        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+    )
+
+    _kdoctools_create_target_name(_targ_html ${build_html})
+    add_custom_target(${_targ_html} ALL DEPENDS ${build_html})
+
+    set(installDest "${ARGS_INSTALL_DESTINATION}")
+    if(installDest)
+        set(subdir "${ARGS_SUBDIR}")
+#        file(GLOB images ${src_dir}/*.png)
+#        install(FILES ${build_doc} ${src_docs} ${images} DESTINATION ${installDest}/${subdir})
+        install(FILES ${build_html} DESTINATION ${installDest}/${subdir})
+    endif()
+endfunction()
+
 ########### install files ###############
 if(BUILD_KF5)
     file(READ "index.docbook" index_file)
@@ -5,6 +75,15 @@ if(BUILD_KF5)
     string(REPLACE "kdex.dtd" "kdedbx45.dtd" index_file "${index_file}")
     file(WRITE "index-kf5.docbook" "${index_file}")
     kdoctools_create_handbook(index-kf5.docbook INSTALL_DESTINATION ${HTML_INSTALL_DIR}/en SUBDIR umbrello)
+
+    file(READ "welcome.docbook" index_file)
+    string(REPLACE "4.2" "4.5" index_file "${index_file}")
+    string(REPLACE "kdex.dtd" "kdedbx45.dtd" index_file "${index_file}")
+    file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/welcome.docbook "${index_file}")
+    kdoctools_create_article(${CMAKE_CURRENT_BINARY_DIR}/welcome.docbook INSTALL_DESTINATION ${HTML_INSTALL_DIR}/en SUBDIR umbrello)
+
 else()
     kde4_create_handbook(index.docbook INSTALL_DESTINATION ${HTML_INSTALL_DIR}/en SUBDIR umbrello)
+    kdoctools_create_article(welcome.docbook INSTALL_DESTINATION ${HTML_INSTALL_DIR}/en SUBDIR umbrello)
 endif()
+
diff --git a/doc/welcome.docbook b/doc/welcome.docbook
new file mode 100644
index 0000000..4890627
--- /dev/null
+++ b/doc/welcome.docbook
@@ -0,0 +1,73 @@
+<?xml version="1.0" ?>
+
+<!DOCTYPE article PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+ "dtd/kdex.dtd" [
+ <!ENTITY umbrello "<application>Umbrello &UML; Modeller</application>">
+ <!ENTITY kappname "&umbrello;">
+ <!ENTITY UML "<acronym>UML</acronym>">
+ <!ENTITY % addindex "IGNORE">
+ <!ENTITY % English "INCLUDE"><!-- change language only here -->
+  <!-- Do not define any other entities; instead, use the entities
+       from kde-genent.entities and $LANG/user.entities. -->
+]>
+
+<article id="Welcome" lang="&language;">
+<articleinfo>
+<title>Welcome</title>
+</articleinfo>
+
+<para>
+Welcome to &umbrello; an &UML; diagram tool that can support you
+in the software development process.
+Especially during the analysis and design phases of this process, &umbrello; will help you to
+get a high quality product. &UML; can also be used to document your software designs to help you and your
+fellow developers.
+</para>
+<para>
+To start working with UML you may create a new diagram from one of the following diagram types:
+</para>
+<itemizedlist>
+
+<listitem><para><emphasis><ulink url="use-case-diagram">Use Case
+Diagram</ulink></emphasis> - show actors (people or other users of the
+system), use cases (the scenarios when they use the system), and their
+relationships</para> </listitem>
+
+<listitem><para><emphasis><ulink url="class-diagram">Class
+Diagram</ulink></emphasis> - show classes and the relationships between
+them</para> </listitem>
+
+<listitem><para><emphasis><ulink url="sequence-diagram">Sequence
+Diagram</ulink></emphasis>  - show objects and a sequence of method calls
+they make to other objects.</para> </listitem>
+
+<listitem><para><emphasis><ulink
+url="collaboration-diagram">Collaboration
+Diagram</ulink></emphasis> - show objects and their relationship,
+ putting emphasis on the objects that participate in the message exchange</para>
+</listitem>
+
+<listitem><para><emphasis><ulink url="state-diagram">State
+Diagram</ulink></emphasis> - show states, state changes and events in an
+object or a part of the system</para> </listitem>
+
+<listitem><para><emphasis><ulink url="activity-diagram">Activity
+Diagram</ulink></emphasis> - show activities and the changes from one
+activity to another with the events occurring in some part of the
+system</para></listitem>
+
+<listitem><para><emphasis><ulink url="component-diagram">Component
+Diagram</ulink></emphasis> - show the high level programming components
+(such as KParts or Java Beans).</para></listitem>
+
+<listitem><para><emphasis><ulink
+url="deployment-diagram">Deployment Diagram</ulink></emphasis> - show
+the instances of the components and their
+relationships.</para></listitem>
+
+<listitem><para><emphasis><ulink
+url="entity-relationship-diagram">Entity Relationship Diagram</ulink></emphasis> - show
+data and the relationships and constraints between the data.</para></listitem>
+
+</itemizedlist>
+</article>
diff --git a/umbrello/CMakeLists.txt b/umbrello/CMakeLists.txt
index 6f3f529..64643bf 100644
--- a/umbrello/CMakeLists.txt
+++ b/umbrello/CMakeLists.txt
@@ -15,6 +15,8 @@ if(UNIX)
     add_definitions(-D_GLIBCXX_PERMIT_BACKWARD_HASH)
 endif()
 
+add_definitions(-DCMAKE_BINARY_DIR="${CMAKE_BINARY_DIR}")
+
 include_directories(
   ${LIBXML2_INCLUDE_DIR}
   ${LIBXSLT_INCLUDE_DIR}
@@ -516,6 +518,7 @@ if(NOT BUILD_KF5)
         Qt4::QtCore
         Qt4::QtGui
         Qt4::QtXml
+        Qt4::QtWebKit
         ${LIBXML2_LIBRARIES}
         ${LIBXSLT_LIBRARIES}
         ${KDE4_KTEXTEDITOR_LIBS}
@@ -537,6 +540,7 @@ else()
         Qt5::Xml
         Qt5::PrintSupport
         Qt5::Svg
+        Qt5::WebKitWidgets
         KF5::Archive
         KF5::Completion
         KF5::CoreAddons
diff --git a/umbrello/cmds.h b/umbrello/cmds.h
index 3c95312..1951bf7 100644
--- a/umbrello/cmds.h
+++ b/umbrello/cmds.h
@@ -11,9 +11,6 @@
 #ifndef CMDS_H
 #define CMDS_H
 
-#if QT_VERSION < 0x050000
-#include <kundostack.h>
-#endif
 
 #include <QUndoCommand>
 #include <QUndoStack>
@@ -49,4 +46,8 @@
 #include "cmds/widget/cmdsetname.h"
 #include "cmds/widget/cmdsettxt.h"
 
+#if QT_VERSION < 0x050000
+#include <kundostack.h>
+#endif
+
 #endif
diff --git a/umbrello/uml.cpp b/umbrello/uml.cpp
index b33a7d1..3fb5dce 100644
--- a/umbrello/uml.cpp
+++ b/umbrello/uml.cpp
@@ -936,6 +936,7 @@ void UMLApp::initView()
     m_d->createObjectsWindow();
 #endif
     m_d->createStereotypesWindow();
+    m_d->createWelcomeWindow();
 
     // create the tree viewer
     m_listDock = new QDockWidget(i18n("&Tree View"), this);
diff --git a/umbrello/umlappprivate.cpp b/umbrello/umlappprivate.cpp
index 80427f3..cf8a9b5 100644
--- a/umbrello/umlappprivate.cpp
+++ b/umbrello/umlappprivate.cpp
@@ -10,4 +10,105 @@
 
 #include "umlappprivate.h"
 
-// Empty file is required for signal/slot support provided by automoc4.
+#include "debug_utils.h"
+
+/**
+ * Find welcome.html file for displaying in the welcome window.
+ *
+ * @return path to welcome file or empty if not found
+ */
+QString UMLAppPrivate::findWelcomeFile()
+{
+    QStringList dirList;
+    // from build dir
+    dirList.append(QCoreApplication::applicationDirPath() + QLatin1String("/../doc"));
+
+    // determine path from installation
+#if QT_VERSION > 0x050000
+    QString name = QLocale().name();
+    QStringList lang = name.split(QLatin1Char('_'));
+    QStringList langList;
+    langList.append(lang[0]);
+    if (lang.size() > 1)
+        langList.append(name);
+
+    // from custom install
+    foreach(const QString &lang, langList) {
+        dirList.append(QCoreApplication::applicationDirPath() + QString(QLatin1String("/../share/doc/HTML/%1/umbrello")).arg(lang));
+    }
+    dirList.append(QCoreApplication::applicationDirPath() + QLatin1String("/../share/doc/HTML/en/umbrello"));
+
+    QStringList locations = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
+    // from real installation
+    foreach(const QString &location, locations) {
+        foreach(const QString &lang, langList) {
+            dirList.append(QString(QLatin1String("%1/doc/HTML/%2/umbrello")).arg(location).arg(lang));
+        }
+        dirList.append(QString(QLatin1String("%1/doc/HTML/en/umbrello")).arg(location));
+    }
+#else
+    KLocale *local = KGlobal::locale();
+    QString lang = local->language();
+    // from custom install
+    dirList.append(QCoreApplication::applicationDirPath() + QString(QLatin1String("/../share/doc/HTML/%1/umbrello")).arg(lang));
+    dirList.append(QCoreApplication::applicationDirPath() + QLatin1String("/../share/doc/HTML/en/umbrello"));
+
+    // /usr/share/doc/kde
+    dirList.append(KStandardDirs::installPath("html") + lang + QLatin1String("/umbrello"));
+#endif
+    foreach(const QString &dir, dirList) {
+        QString filePath = dir + QLatin1String("/welcome.html");
+        QFileInfo fi(filePath);
+        if (fi.exists()) {
+            uDebug() << "searching for" << filePath << "found";
+            return filePath;
+        } else
+            uDebug() << "searching for" << filePath;
+    }
+    return QString();
+}
+
+/**
+ * Read welcome file for displaying in the welcome window.
+ *
+ * This method also patches out some unrelated stuff from
+ * the html file intended or being displayed with khelpcenter.
+ *
+ * @return html content of welcome file
+ */
+QString UMLAppPrivate::readWelcomeFile(const QString &file)
+{
+    QFile f(file);
+    if (!f.open(QIODevice::ReadOnly))
+        return QString();
+    QTextStream in(&f);
+    QString html = in.readAll();
+
+    html.replace(QLatin1String("<FILENAME filename=\"index.html\">"),QLatin1String(""));
+    html.replace(QLatin1String("</FILENAME>"),QLatin1String(""));
+//#define WITH_HEADER
+#ifndef WITH_HEADER
+    html.replace(QLatin1String("<div id=\"header\""),QLatin1String("<div id=\"header\" hidden"));
+    html.replace(QLatin1String("<div class=\"navCenter\""),QLatin1String("<div id=\"navCenter\" hidden"));
+#else
+    // replace help:/ urls in html file to be able to find css files and images from kde help system
+#if QT_VERSION >= 0x050000
+    QString path;
+    QStringList locations = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
+    foreach(const QString &l, locations) {
+        QString a = QString(QLatin1String("%1/doc/HTML/en/")).arg(l);
+        QFileInfo fi(a);
+        if (fi.exists()) {
+            path = a;
+            break;
+        }
+    }
+#else
+    QString path = KStandardDirs::installPath("html") +  QLatin1String("en/");
+#endif
+    QUrl url(QUrl::fromLocalFile(path));
+    QByteArray a = url.toEncoded();
+    html.replace(QLatin1String("help:/"), QString::fromLocal8Bit(a));
+#endif
+    return html;
+}
diff --git a/umbrello/umlappprivate.h b/umbrello/umlappprivate.h
index 65775e1..ee9affe 100644
--- a/umbrello/umlappprivate.h
+++ b/umbrello/umlappprivate.h
@@ -12,15 +12,20 @@
 #define UMLAPPPRIVATE_H
 
 // app includes
+#include "cmds.h"
 #include "finddialog.h"
 #include "findresults.h"
 #include "uml.h"
+#include "umldoc.h"
 #include "diagramswindow.h"
 #include "objectswindow.h"
 #include "stereotypeswindow.h"
 
 // kde includes
 #include <KActionCollection>
+#if QT_VERSION < 0x050000
+#include <KStandardDirs>
+#endif
 #include <KToggleAction>
 #include <ktexteditor/configinterface.h>
 #include <ktexteditor/document.h>
@@ -31,13 +36,16 @@
 #include <ktexteditor/view.h>
 
 // qt includes
+#include <QDesktopServices>
 #include <QFile>
 #include <QFileInfo>
 #include <QListWidget>
 #include <QObject>
+#include <QWebView>
 
 class QWidget;
 
+
 /**
  * Class UMLAppPrivate holds private class members/methods
  * to reduce the size of the public class and to speed up
@@ -55,9 +63,11 @@ public:
     KToggleAction *viewDiagramsWindow;
     KToggleAction *viewObjectsWindow;
     KToggleAction *viewStereotypesWindow;
+    KToggleAction *viewWelcomeWindow;
     DiagramsWindow *diagramsWindow;
     ObjectsWindow *objectsWindow;
     StereotypesWindow *stereotypesWindow;
+    QDockWidget *welcomeWindow;
 
     KTextEditor::Editor *editor;
     KTextEditor::View *view;
@@ -69,9 +79,11 @@ public:
         viewDiagramsWindow(0),
         viewObjectsWindow(0),
         viewStereotypesWindow(0),
+        viewWelcomeWindow(0),
         diagramsWindow(0),
         objectsWindow(0),
         stereotypesWindow(0),
+        welcomeWindow(0),
         view(0),
         document(0)
     {
@@ -149,6 +161,54 @@ public slots:
         connect(viewStereotypesWindow, SIGNAL(triggered(bool)), stereotypesWindow, SLOT(setVisible(bool)));
     }
 
+    void createWelcomeWindow()
+    {
+        QString file = findWelcomeFile();
+        if (file.isEmpty())
+            return;
+        QString html = readWelcomeFile(file);
+        // qDebug() << html;
+        welcomeWindow = new QDockWidget(i18n("Welcome"), parent);
+        welcomeWindow->setObjectName(QLatin1String("WelcomeDock"));
+        QWebView *view = new QWebView;
+        view->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
+        view->setContextMenuPolicy(Qt::NoContextMenu);
+        connect(view, SIGNAL(linkClicked(const QUrl)), this, SLOT(slotWelcomeWindowLinkClicked(const QUrl)));
+        view->setHtml(html);
+        view->show();
+        welcomeWindow->setWidget(view);
+        parent->addDockWidget(Qt::LeftDockWidgetArea, welcomeWindow);
+
+        viewWelcomeWindow = parent->actionCollection()->add<KToggleAction>(QLatin1String("view_welcome_window"));
+        connect(viewWelcomeWindow, SIGNAL(triggered(bool)), welcomeWindow, SLOT(setVisible(bool)));
+    }
+
+    void slotWelcomeWindowLinkClicked(const QUrl &url)
+    {
+        //qDebug() << url;
+        if (url.scheme() == QLatin1String("mailto") || url.scheme().startsWith(QLatin1String("http"))) {
+            QDesktopServices::openUrl(url);
+            return;
+        }
+        QStringList list = url.toString().split(QLatin1Char('-'));
+        list.removeLast();
+        QString key;
+        foreach(const QString s, list) {
+            QString a = s;
+            a[0] = a[0].toUpper();
+            key.append(a);
+        }
+        Uml::DiagramType::Enum type = Uml::DiagramType::fromString(key);
+        if (type == Uml::DiagramType::Undefined)
+            return;
+        QString diagramName = UMLApp::app()->document()->createDiagramName(type);
+        if (!diagramName.isEmpty())
+            UMLApp::app()->executeCommand(new Uml::CmdCreateDiagram(UMLApp::app()->document(), type, diagramName));
+    }
+
+private:
+    QString findWelcomeFile();
+    QString readWelcomeFile(const QString &file);
 };
 
 #endif
diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt
index 28115e6..6f8d635 100644
--- a/unittests/CMakeLists.txt
+++ b/unittests/CMakeLists.txt
@@ -48,6 +48,7 @@ if(NOT BUILD_KF5)
         Qt4::QtGui
         Qt4::QtXml
         Qt4::QtTest
+        Qt4::QtWebKit
         ${KDE4_KFILE_LIBS}
         ${LIBXML2_LIBRARIES}
         ${LIBXSLT_LIBRARIES}
@@ -58,6 +59,7 @@ else()
         Qt5::Xml
         Qt5::Test
         Qt5::Widgets
+        Qt5::WebKitWidgets
         KF5::I18n
         ${LIBXML2_LIBRARIES}
         ${LIBXSLT_LIBRARIES}



More information about the kde-doc-english mailing list