[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