Merge branch 'master' into qt5
authorgregor herrmann <gregor@toastfreeware.priv.at>
Wed, 30 Aug 2017 18:38:27 +0000 (20:38 +0200)
committergregor herrmann <gregor@toastfreeware.priv.at>
Wed, 30 Aug 2017 18:38:27 +0000 (20:38 +0200)
82 files changed:
.gitignore [new file with mode: 0644]
NEWS
README
confclerk.pro
data/confclerk.pod
src/alarm/alarm.cpp
src/alarm/alarm.h
src/app/application.cpp
src/app/application.h
src/app/appsettings.cpp
src/app/appsettings.h
src/app/main.cpp
src/dbschema001.sql
src/global.pri
src/gui/about.ui
src/gui/conferenceeditor.cpp
src/gui/conferenceeditor.h
src/gui/conflictdialogcontainer.cpp
src/gui/conflictdialogcontainer.h
src/gui/conflictsdialog.cpp
src/gui/conflictsdialog.h
src/gui/daynavigatorwidget.cpp
src/gui/daynavigatorwidget.h
src/gui/dayviewtabcontainer.cpp
src/gui/dayviewtabcontainer.h
src/gui/errormessage.cpp
src/gui/errormessage.h
src/gui/eventdialog.cpp
src/gui/eventdialog.h
src/gui/eventdialog.ui
src/gui/favtabcontainer.cpp
src/gui/favtabcontainer.h
src/gui/mainwindow.cpp
src/gui/mainwindow.h
src/gui/roomstabcontainer.cpp
src/gui/roomstabcontainer.h
src/gui/searchhead.cpp
src/gui/searchhead.h
src/gui/searchtabcontainer.cpp
src/gui/searchtabcontainer.h
src/gui/settingsdialog.cpp
src/gui/settingsdialog.h
src/gui/tabcontainer.cpp
src/gui/tabcontainer.h
src/gui/trackstabcontainer.cpp
src/gui/trackstabcontainer.h
src/gui/urlinputdialog.cpp
src/gui/urlinputdialog.h
src/icons.qrc
src/icons/alarm-off.png
src/icons/alarm-on.png
src/icons/alarm.blend
src/icons/favourite-no.png [new file with mode: 0644]
src/icons/favourite-off.png [deleted file]
src/icons/favourite-on.png [deleted file]
src/icons/favourite-strong.png [new file with mode: 0644]
src/icons/favourite-weak.png [new file with mode: 0644]
src/icons/favourite.blend
src/mvc/conference.cpp
src/mvc/conference.h
src/mvc/conferencemodel.cpp
src/mvc/conferencemodel.h
src/mvc/delegate.cpp
src/mvc/delegate.h
src/mvc/event.cpp
src/mvc/event.h
src/mvc/eventmodel.cpp
src/mvc/eventmodel.h
src/mvc/room.cpp
src/mvc/room.h
src/mvc/track.cpp
src/mvc/track.h
src/mvc/treeview.cpp
src/mvc/treeview.h
src/orm/ormrecord.h
src/sql/schedulexmlparser.cpp
src/sql/schedulexmlparser.h
src/sql/sqlengine.cpp
src/sql/sqlengine.h
src/test/main.cpp
src/test/mvc/eventtest.cpp
src/test/mvc/eventtest.h

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..af9b95b
--- /dev/null
@@ -0,0 +1,9 @@
+*.o
+*.a
+*.pro.user
+*.blend1
+ui_*.h
+moc_*.cpp
+qrc_*.cpp
+Makefile
+src/bin/confclerk
diff --git a/NEWS b/NEWS
index 6f3591f030d2efa75ed8366c1b2ba42c9d627a6f..02bc8c80827f11dc6cc1dc02e34fbe5e9416d86f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,9 +1,21 @@
 This is the NEWS file for ConfClerk. ConfClerk is the successor of
 fosdem-schedule; cf. docs/fosdem-schedule for the historic documentation.
 
-version 0.6.2, $DATE
+version 0.6.3, 20xx-xx-xx
 * ...
 
+version 0.6.2, 2017-01-24
+* Event dialog: don't unconditionally assume plain text for description and
+  abstract, can be rich text as well (i.e. contain HTML tags).
+* Favourites: change from boolean to tri-strate: no favourite, weak/fallback
+  favourite, strong favourite.  Adapt buttons and conflict markers.
+  Thanks to Elena ``of Valhalla'' for the bug report.
+  (Fixes: #54)
+* Handle SSL errors.
+  Present SSL error messages during download in a warning dialog and ask
+  user about how to proceed.
+  (In practice seen on Maemo due to ancient certificates.)
+
 version 0.6.1, 2014-09-11
 * Fix typos in documentation.
 * Add Keyword entry to .desktop file.  
diff --git a/README b/README
index 5a05772106faa91ac2aa47eaf8f54b0aa52fb517..d4736ba8e14ad1360b95f3bde5a0b657d4fcca4d 100644 (file)
--- a/README
+++ b/README
@@ -24,7 +24,7 @@ See the file ./INSTALL for building and installation instructions, and
 Copyright and License:
 
   Copyright (C) 2010 Ixonos Plc.
-  Copyright (C) 2011-2015, Philipp Spitzer, gregor herrmann, Stefan Strahl
+  Copyright (C) 2011-2017, Philipp Spitzer, gregor herrmann, Stefan Strahl
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -60,7 +60,7 @@ data/confclerk.*:
 
 src/icons/favourite*, src/icons/alarm*, src/icons/collapse*, src/icons/expand*:
 
-  Copyright (C) 2012, Philipp Spitzer, Stefan Strahl
+  Copyright (C) 2012-2017, Philipp Spitzer, Stefan Strahl
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -122,11 +122,13 @@ Toastfreeware
 http://www.toastfreeware.priv.at/confclerk/
 
 
-Tested pentabarf (or frab, or summit with patches) instances:
+Tested pentabarf (or frab, or summit/wafer with patches) instances:
 
-- 30C3: https://events.ccc.de/congress/2013/Fahrplan/schedule.xml
+- 33C3: https://fahrplan.events.ccc.de/congress/2016/Fahrplan/schedule.xml
 - DebConf (2013, pentbarf): https://penta.debconf.org/dc13_schedule/schedule.en.xml
 - DebConf (2014, summit): https://summit.debconf.org/debconf14.xml
+- DebConf (2015, summit): https://summit.debconf.org/debconf15.xml
+- DebConf (2016, wafer): https://debconf16.debconf.org/schedule/pentabarf.xml
 - FOSDEM: http://fosdem.org/schedule/xml
-- FrOSCon (2014): http://programm.froscon.org/2014/schedule.xml
-- Grazer Linuxtage (2014): http://glt14-programm.linuxtage.at/schedule.de.xml
+- FrOSCon (2016): http://programm.froscon.org/2016/schedule.xml
+- Grazer Linuxtage (2016): https://glt16-programm.linuxtage.at/schedule.xml
index 788430840fcb5c74ad6e70809b0d34103d644a4c..22f8f79afc7d441ac529a28e581dd8b6468be044 100644 (file)
@@ -20,7 +20,7 @@ changelog.commands = \
 changelog.CONFIG = phony
 
 icon.target = data/$${TARGET}.png
-icon.commands = convert data/$${TARGET}.svg data/$${TARGET}.png
+icon.commands = convert -transparent white data/$${TARGET}.svg data/$${TARGET}.png
 icon.depends = data/$${TARGET}.svg
 
 man.target = data/$${TARGET}.1
index d9134805ae8e54faec28468104cda37f6f99cc5d..03e0a8e6882510f279cd3f589a47c4a982aac577 100644 (file)
@@ -65,9 +65,9 @@ F<~/.local/share/data/Toastfreeware/ConfClerk/ConfClerk.sqlite>.
 =head2 Main code
 
     Copyright (C) 2010 Ixonos Plc.
-    Copyright (C) 2011-2015, Philipp Spitzer <philipp@toastfreeware.priv.at>
-    Copyright (C) 2011-2015, gregor herrmann <gregor@toastfreeware.priv.at>
-    Copyright (C) 2011-2015, Stefan Strahl <stefan@toastfreeware.priv.at>
+    Copyright (C) 2011-2017, Philipp Spitzer <philipp@toastfreeware.priv.at>
+    Copyright (C) 2011-2017, gregor herrmann <gregor@toastfreeware.priv.at>
+    Copyright (C) 2011-2017, Stefan Strahl <stefan@toastfreeware.priv.at>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -119,8 +119,8 @@ the following notice (as of 2011-06-24):
 
 =item src/icons/favourite*, src/icons/alarm*, src/icons/collapse*, src/icons/expand*:
 
-    Copyright (C) 2012, Philipp Spitzer <philipp@toastfreeware.priv.at>
-    Copyright (C) 2012, Stefan Strahl <stefan@toastfreeware.priv.at>
+    Copyright (C) 2012-2017, Philipp Spitzer <philipp@toastfreeware.priv.at>
+    Copyright (C) 2012-2017, Stefan Strahl <stefan@toastfreeware.priv.at>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
index c2b8aff6568b0ed0f3a899c938b5b9ee691613e8..69c38a7bee5b2090d2297a22dcf89805cd62040b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 84cce9ccc61dcd08786792336a629aaccbfc9302..6620d74ba91211fad0f8ef513b823acdcbb7ba42 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 49c6d91916ca7e536d4123b366727fc64abfe315..386b681a0389d1b4d6a7e554af4eee4f903fa114 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
  * You should have received a copy of the GNU General Public License along with
  * ConfClerk.  If not, see <http://www.gnu.org/licenses/>.
  */
+#if defined(__GNUC__) || defined(__llvm__) || defined(__clang__)
+#include <cxxabi.h>
+#endif
+#include <exception>
+
 #include "application.h"
 #include "errormessage.h"
 
@@ -32,8 +37,21 @@ bool Application::notify(QObject* receiver, QEvent* event)
     } catch (OrmException& e) {
         error_message("UNCAUGHT OrmException: " + e.text());
         return false;
+    } catch (std::exception& e) {
+        error_message("UNCAUGHT exception: " + QString(e.what()));
+        return false;
     } catch (...) {
-        error_message("UNCAUGHT EXCEPTION: unknown");
+#if defined(__GNUC__) || defined(__llvm__) || defined(__clang__)
+        int status = 0;
+        char *buff = __cxxabiv1::__cxa_demangle(
+                __cxxabiv1::__cxa_current_exception_type()->name(),
+                NULL, NULL, &status);
+        QString exception_name = QString(buff);
+        std::free(buff);
+#else
+        QString exception_name = QString("unknown");
+#endif
+        error_message("UNCAUGHT exception: " + exception_name);
         return false;
     }
 }
index 03540a056c0096a533b8737cc81219ff34764ad2..53727dbe891658a896b195a5a38e14d34c162b60 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 5bdb4443443b891a8265d63596f6e462d76089f4..b98060dd6d893d8c6d041a8c724d0490fa8a4582 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index b7d31396f0f8ccce0cc394750239edef07ce25a9..8e5822e01d5c8a2163ed91262d7f3d49bb9aaba9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 24ce24c9a7c23663a5930857f6016b2fd27cd94c..3c6f24ae9f2c21bdfce661e8c2ab6a7a691302bb 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index eca2c39d42ca219f928927e486e8300d38b36e4c..e909baed086a10e0b75626fc3b73ead15e2e270a 100644 (file)
@@ -49,7 +49,7 @@ CREATE TABLE event (
        subtitle VARCHAR,
        abstract VARCHAR,
        description VARCHAR,
-       favourite INTEGER DEFAULT 0,
+       favourite INTEGER DEFAULT 0, -- 0 ... no favourite, 1 ... strong favourite, 2 ... weak favourite/alternative to strong favourite
        alarm INTEGER DEFAULT 0,
        PRIMARY KEY (xid_conference, id)
 );
index 86126e6c290eab193fae09f46ce995d52e1cc312..fc4a0e6561e0f7f30e9f5d629bc3bb1ece8cd50d 100644 (file)
@@ -4,7 +4,7 @@
 # USAGE: include(./global.pri)
 
 # VERSION
-VERSION = 0.6.2
+VERSION = 0.6.3
 DEFINES += VERSION=\\\"$$VERSION\\\"
 
 # Define 'MAEMO' specific CONFIG/DEFINE
index c5ea7ddf6b78fb8aa3de2dd851c52eeea60512f0..62225977b6ca0bb561b2b70057138b2ed0a21020 100644 (file)
@@ -137,7 +137,7 @@ p, li { white-space: pre-wrap; }
 &lt;p style=&quot; margin-top:16px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:x-large; font-weight:600;&quot;&gt;Copyright and license&lt;/span&gt;&lt;/p&gt;
 &lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;ConfClerk is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version.&lt;/p&gt;
 &lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;ConfClerk is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.&lt;/p&gt;
-&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Copyright (C) 2010 Ixonos Plc.&lt;br /&gt;Copyright (C) 2011-2015 Philipp Spitzer &amp;amp; gregor herrmann &amp;amp; Stefan Strahl&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Copyright (C) 2010 Ixonos Plc.&lt;br /&gt;Copyright (C) 2011-2017 Philipp Spitzer &amp;amp; gregor herrmann &amp;amp; Stefan Strahl&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
          </property>
          <property name="textFormat">
           <enum>Qt::RichText</enum>
index 6a364453bf16cd1439834a9c4e5f1e3c418c6f18..e1328496c2ab1b1385affa8d41fdbc6a83e64b8f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 268d540af0ad1f0b0fd9c60c9f9685f5819bce2a..00d6ae1fa024e3bdcec7d656d4507654f45e813a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 258f143860ac92954c21e38d7411539495efd22d..474690c4ac4529a16fb9f24f7f29c7b9d4bdb49f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 3d7b670899bcfec2c6fb4d969d33e29b1e2fd8d5..bb621cf70d899b11e3e32e262b89c9a60d9fb1d2 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index b1c140bc9031a97f70725ef1a21df5a5b3c3fb0f..e149a879d280d5e8b0d67cdf5584debf9e05275c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 42e11830375e12b4cd0e6e6be704a709759e1fc4..1725ef94d3c9434c693b5643552061e396b7f6bc 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 47bdba93ccaaf212b42bbbe759243de984691427..0aa3a8401d945cd4a997469af8eb3fc1fc92ae8d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 6b1c59a906ccc5788878737aee9130dc2b053ab0..8fb9de9034932b66614d7a24a107f3e3be245242 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index c66754f6cb1549c016dc7b1c2d715ec681a96359..6a190d9d44a6dc73481a083bfc7dd79d012e5532 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 2d8e4a933b449e71c7c0f62b88f40a7193e1a817..422158551271506325f4c7697cfa3b30a555dfc1 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 6279d44159757ae9b33a2b45e8d7e90921097685..26cebd3055fa54244150f9beaba253667f14e8be 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 670cec2358f7ad5ea016652a22bc90264f25b0d1..a565747a29275e525338188bb4b627fc13c406be 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index fe9daba4745d721002c6006e70357d64979c05a9..90910c85d8834b0be3c6fe5632df8980779c039f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -48,11 +48,19 @@ EventDialog::EventDialog(int conferenceId, int eventId, QWidget *parent): QDialo
 
     // abstract
     info += QString("<h2>%1</h2>\n").arg(tr("Abstract"));
-    info += Qt::convertFromPlainText(event.abstract(), Qt::WhiteSpaceNormal);
+    if (Qt::mightBeRichText(event.abstract())) {
+        info += event.abstract();
+    } else {
+        info += Qt::convertFromPlainText(event.abstract(), Qt::WhiteSpaceNormal);
+    }
 
     // description
     info += QString("<h2>%1</h2>\n").arg(tr("Description"));
-    info += Qt::convertFromPlainText(event.description(), Qt::WhiteSpaceNormal);
+    if (Qt::mightBeRichText(event.description())) {
+        info += event.description();
+    } else {
+        info += Qt::convertFromPlainText(event.description(), Qt::WhiteSpaceNormal);
+    }
 
     // links
     info += QString("<h2>%1</h2>\n<ul>\n").arg(tr("Links"));
@@ -80,10 +88,7 @@ EventDialog::EventDialog(int conferenceId, int eventId, QWidget *parent): QDialo
     connect(favouriteButton, SIGNAL(clicked()), SLOT(favouriteClicked()));
     connect(alarmButton, SIGNAL(clicked()), SLOT(alarmClicked()));
 
-    if(event.isFavourite())
-    {
-        favouriteButton->setIcon(QIcon(":/icons/favourite-on.png"));
-    }
+    updateFavouriteButton(event);
 
     if(event.hasAlarm())
     {
@@ -94,25 +99,12 @@ EventDialog::EventDialog(int conferenceId, int eventId, QWidget *parent): QDialo
 void EventDialog::favouriteClicked()
 {
     Event event = Event::getById(mEventId, mConferenceId);
-
-    QList<Event> conflicts = Event::conflictEvents(event.id(), mConferenceId);
-    if(event.isFavourite())
-    {
-        event.setFavourite(false);
-        favouriteButton->setIcon(QIcon(":/icons/favourite-off.png"));
-    }
-    else
-    {
-        event.setFavourite(true);
-        favouriteButton->setIcon(QIcon(":/icons/favourite-on.png"));
-    }
+    event.cycleFavourite();
     event.update("favourite");
+    updateFavouriteButton(event);
 
-    if(event.isFavourite())
-    {
-        // event has became 'favourite' and so 'conflicts' list may have changed
-        conflicts = Event::conflictEvents(event.id(), mConferenceId);
-    }
+    // 'conflicts' list may have changed
+    QList<Event> conflicts = Event::conflictEvents(event.id(), mConferenceId);
 
     // have to emit 'eventChanged' signal on all events in conflict
     for(int i=0; i<conflicts.count(); i++)
@@ -154,3 +146,12 @@ void EventDialog::alarmClicked()
     emit eventChanged(event.id(), false);
 }
 
+
+void EventDialog::updateFavouriteButton(const Event& event) {
+    switch (event.favourite()) {
+        case Favourite_no: favouriteButton->setIcon(QIcon(":/icons/favourite-no.png")); break;
+        case Favourite_weak: favouriteButton->setIcon(QIcon(":/icons/favourite-weak.png")); break;
+        case Favourite_strong: favouriteButton->setIcon(QIcon(":/icons/favourite-strong.png")); break;
+    }
+}
+
index 6a0f0b4720c46c04a6ac20829611dc3cb73c0b8d..6d0e27518b78596f34540ae1ed0871d35ac1179d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -38,6 +38,7 @@ signals:
 private:
     int mConferenceId;
     int mEventId;
+    void updateFavouriteButton(const Event& event);
 };
 
 #endif /* EVENTDIALOG_H */
index 73e0f90320e51aa8056e1cfa1da5741de37312d8..b55c8798217846501434d2904c125c5be0c9fe04 100644 (file)
@@ -59,7 +59,7 @@
        </property>
        <property name="icon">
         <iconset resource="../icons.qrc">
-         <normaloff>:/icons/favourite-off.png</normaloff>:/icons/favourite-off.png</iconset>
+         <normaloff>:/icons/favourite-no.png</normaloff>:/icons/favourite-no.png</iconset>
        </property>
        <property name="iconSize">
         <size>
index c09548cbafeda37305f195c0d89231a3e6030d0a..bad98d1568ac03c69d26b7bab0e6cca2f0d094f7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 38fa3778bf6ef80c199342bea93735a993ac2907..5b9315be960857950cf5e852b21c42ee5fcdcf35 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 31ac95dac7239e25bc5b235553442412c1fdc617..3b2582a213eab1f72b0a87d5ac4e5c4283005957 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -24,6 +24,7 @@
 #include <QNetworkProxy>
 #include <QNetworkAccessManager>
 #include <QNetworkReply>
+#include <QSslConfiguration>
 
 #include "sqlengine.h"
 
@@ -130,6 +131,7 @@ MainWindow::MainWindow(QWidget* parent): QMainWindow(parent) {
         clearTabs();
     }
 
+    connect(mNetworkAccessManager, SIGNAL(sslErrors(QNetworkReply*, QList<QSslError>)), SLOT(sslErrors(QNetworkReply*, QList<QSslError>)));
     connect(mNetworkAccessManager, SIGNAL(finished(QNetworkReply*)), SLOT(networkQueryFinished(QNetworkReply*)));
     connect(mXmlParser, SIGNAL(parsingScheduleBegin()), conferenceModel, SLOT(newConferenceBegin()));
     connect(mXmlParser, SIGNAL(parsingScheduleEnd(int)), conferenceModel, SLOT(newConferenceEnd(int)));
@@ -269,7 +271,7 @@ void MainWindow::onAlarmTimerTimeout() {
     // show message
     systemTrayIcon->show();
     // The next two lines are to prevent a very strange position of the message box the first time at X11/aweseome (not Win32/XP)
-    systemTrayIcon->showMessage("ConfClerk", "Your upcoming events", QSystemTrayIcon::Information);
+    systemTrayIcon->showMessage("ConfClerk", tr("Your upcoming events"), QSystemTrayIcon::Information);
     qApp->processEvents();
     systemTrayIcon->showMessage(title, message, QSystemTrayIcon::Information, 60*60*24*1000);
     QApplication::alert(this);
@@ -308,7 +310,8 @@ void MainWindow::useConference(int conferenceId)
 
         // end of optimization
         // initTabs();
-    } catch (OrmException& e) {
+    } catch (const OrmException& e) {
+        qDebug() << "OrmException:" << e.text();
         // cannon set an active conference
         unsetConference();   // TODO: as no active conference is now correctly managed this should be handled as a fatal error
         return;
@@ -403,14 +406,35 @@ void MainWindow::on_conferencesAction_triggered()
     // optimization, see useConference() code
     try {
         initTabs();
-    } catch (OrmException) {
+    } catch (const OrmException& e) {
+        qDebug() << "OrmException:" << e.text();
         clearTabs();
     }
 }
 
+void MainWindow::sslErrors(QNetworkReply *aReply, const QList<QSslError> &errors) {
+    QString errorString;
+    foreach (const QSslError &error, errors) {
+        if (!errorString.isEmpty()) {
+            errorString += ", ";
+        }
+        errorString += error.errorString();
+    }
+
+    if (QMessageBox::warning(
+                this,
+                tr("SSL errors"),
+                tr("One or more SSL errors have occurred: %1", 0, errors.size()).arg(errorString),
+                QMessageBox::Ignore | QMessageBox::Cancel) == QMessageBox::Ignore) {
+        aReply->ignoreSslErrors();
+    } else {
+        aReply->abort();
+    }
+}
+
 void MainWindow::networkQueryFinished(QNetworkReply *aReply) {
     if (aReply->error() != QNetworkReply::NoError) {
-        error_message(QString("Error occured during download: ") + aReply->errorString());
+        error_message(tr("Error occurred during download: %1").arg(aReply->errorString()));
     } else {
         QUrl redirectUrl = aReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
         if (!redirectUrl.isEmpty()) {
@@ -418,7 +442,7 @@ void MainWindow::networkQueryFinished(QNetworkReply *aReply) {
                 importFromNetwork(redirectUrl.toString(), aReply->request().attribute(QNetworkRequest::User).toInt());
                 return; // don't enable controls
             } else {
-                error_message(QString("Error: Cyclic redirection from %1 to itself.").arg(redirectUrl.toString()));
+                error_message(tr("Error: Cyclic redirection from %1 to itself.").arg(redirectUrl.toString()));
             }
         } else {
             importData(aReply->readAll(), aReply->url().toEncoded(), aReply->request().attribute(QNetworkRequest::User).toInt());
@@ -435,7 +459,11 @@ void MainWindow::importData(const QByteArray &aData, const QString& url, int con
 void MainWindow::importFromNetwork(const QString& url, int conferenceId)
 {
     QNetworkRequest request;
+    QSslConfiguration qSslConfiguration = request.sslConfiguration();
+    qSslConfiguration.setProtocol(QSsl::AnyProtocol);
+    qSslConfiguration.setPeerVerifyMode(QSslSocket::QueryPeer);
     request.setUrl(QUrl(url));
+    request.setSslConfiguration(qSslConfiguration);
     request.setAttribute(QNetworkRequest::User, conferenceId);
 
     mNetworkAccessManager->setProxy(QNetworkProxy::applicationProxy());
index 5c657721fc23823a88bebbf3b75ff13b57d9a0e4..09203e406aa44bb830040dd102029c66fe7afb2a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -21,6 +21,7 @@
 #define MAINWINDOW_H
 
 #include <QtWidgets>
+#include <QSslError>
 
 #include "ui_mainwindow.h"
 
@@ -51,6 +52,7 @@ private slots:
     void onEventChanged(int aEventId, bool favouriteChanged);
     void onSearchResultChanged();
 
+    void sslErrors(QNetworkReply*,const QList<QSslError> &errors);
     void networkQueryFinished(QNetworkReply*);
     void importFromNetwork(const QString&, int conferenceId);
     void importFromFile(const QString&, int conferenceId);
index 1b17fb6e3c8a15a81190c0a875b21da19ddfdcd3..a5428f6bd28e95832ce7ae04fc1ed61903ae772d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 1381962dd441f3640d4aca77a6d2261e4f7b73f4..b17992de55e55e6cec985f95384a214fde22c8fe 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index ef04bc943f577b7508e7988c8c9da8fb55e3274c..51f8c29b799bca474b1eb1f3bfccb4e9d9f84405 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index d7ebd29558003e9bb59280329df64f815c465350..2a56d4b76f150035f29b14b95a9b01909399937e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 248725f611316c36c38d5fa35a9927da2b739d65..8b59153ec348274f381e1b63b70985ee41ce99c9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 08b15a9d5880e9b4dfa633d2cae73680adecf07a..101c66b21a191357745fce7830db5507f741f8fa 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 9afcf6583fc17787219e39bf33dcec51f90a3bb3..13e4e1d8436eac5986f3b852785a53f89e07c837 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 8a2bb528e9c8b16f1abdee1c782ab10c4fbdd82b..368b3caa5f88dc967f4adb11eafbd5d6ac9a3b5d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index e2a62e19b41079b0f96448c5e5fa036b9758f859..56338b4815bd1683a2849a3671616a2d7f831b03 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index ac7728ea48eb4a1d64a2894846761822e015f3d4..92372c47e4cd31be0402065d92781321ee6d42c4 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 1c1279fa5809036ca472d36b355eba07846fc29d..23617377675cdea03af2971c4dece4aad5801a4f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 8df3368207c197fbc7ab38e8ae44ed43275e3ea9..930411ccd243c4e7130834479390dc1e5fd2c5b3 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 79a67daa2b7ddb70720dbfcc8fc748fb66da6db2..20f138e2b5c0ae7b36c60c3ffcc610be8c2240a2 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index bd693fce38c060c2d6dbc3109000bb53b7d5bb09..c754e746b7546d01d1c320af306afb76f4a691e8 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 60b563453fc53d8d9f8bd66434601cb6a198ed1c..dacc91f28bda6c92b0ed5a2057f94a2f4417c633 100644 (file)
@@ -8,8 +8,9 @@
         <file>icons/dialog-warning.png</file>
         <file>icons/search.png</file>
         <file>icons/today.png</file>
-        <file>icons/favourite-off.png</file>
-        <file>icons/favourite-on.png</file>
+        <file>icons/favourite-no.png</file>
+        <file>icons/favourite-weak.png</file>
+        <file>icons/favourite-strong.png</file>
         <file>icons/alarm-on.png</file>
         <file>icons/alarm-off.png</file>
     </qresource>
index 34be22d4b35601c2e2b942aa9c111945a7971a62..2beeaed8f800058871cd01748d73c73d02c6c358 100644 (file)
Binary files a/src/icons/alarm-off.png and b/src/icons/alarm-off.png differ
index 2eb9a9f8c4658a7b9120a92d7fbf011f5f878698..e80036ed04f230c79fcd0b5b6e933ae2dc244ade 100644 (file)
Binary files a/src/icons/alarm-on.png and b/src/icons/alarm-on.png differ
index 19b1c741d7b48e756f66e80f2c91a566a6889ce4..20ac982af0ad7680488325dd2c89e7b85bcbc90c 100644 (file)
Binary files a/src/icons/alarm.blend and b/src/icons/alarm.blend differ
diff --git a/src/icons/favourite-no.png b/src/icons/favourite-no.png
new file mode 100644 (file)
index 0000000..656a19b
Binary files /dev/null and b/src/icons/favourite-no.png differ
diff --git a/src/icons/favourite-off.png b/src/icons/favourite-off.png
deleted file mode 100644 (file)
index 62ec510..0000000
Binary files a/src/icons/favourite-off.png and /dev/null differ
diff --git a/src/icons/favourite-on.png b/src/icons/favourite-on.png
deleted file mode 100644 (file)
index fed3ffc..0000000
Binary files a/src/icons/favourite-on.png and /dev/null differ
diff --git a/src/icons/favourite-strong.png b/src/icons/favourite-strong.png
new file mode 100644 (file)
index 0000000..a2b7dc5
Binary files /dev/null and b/src/icons/favourite-strong.png differ
diff --git a/src/icons/favourite-weak.png b/src/icons/favourite-weak.png
new file mode 100644 (file)
index 0000000..55bdb2c
Binary files /dev/null and b/src/icons/favourite-weak.png differ
index 0907b3c036f967cca1c32a6340c0dcdd4d47be50..21754164850d61ca09935a6bbcb0e061e4cdb0f5 100644 (file)
Binary files a/src/icons/favourite.blend and b/src/icons/favourite.blend differ
index 62973e3abbd76122bcb691b59e27a688d953d9ce..f3e90b26af5385aa935494bc65bc43fc03e5ac73 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index e975756f5a386c14739309577bd091f4dd623bd6..694fd48b1baca8e0a37d62ab4a5ed5a6a80b3c3f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 4d0e7f1649712589e2f5e0366cb6dbd89c082113..c03761cfd96d9c3193d87287600c0217b8264677 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index de4d282fb41b78e05e5ee894674c61e39fc235b7..b7297ba2c83218a2f2447df376f9596ce572d2cc 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index e6136598c41dfc9e46b3e297479d89cba7a84033..2d1f08524084873ea61ee03ad94879a50a826960 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -60,12 +60,28 @@ void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, cons
 
     if(hasParent(index))
     {
+        Event *event = static_cast<Event*>(index.internalPointer());
+
+        // determine severity of conflict
+        Favourite eventTimeConflict = event->timeConflict(); // cache value as event->timeConflict is expensive
+        enum ConflictSeverity {csNone, csWeak, csStrong} conflictSeverity = csNone;
+        switch (event->favourite()) {
+            case Favourite_strong:
+                conflictSeverity = (eventTimeConflict == Favourite_strong) ? csStrong : csNone;
+                break;
+            case Favourite_weak:
+                conflictSeverity = (eventTimeConflict == Favourite_no) ? csNone : csWeak;
+                break;
+            case Favourite_no:
+                conflictSeverity = csNone;
+                break;
+        }
+
         // entry horizontal layout:
         // * spacer (aka y position of image)
         // * image
         // * rest is text, which is 1 line of title with big letters and 2 lines of Presenter and Track
-        int aux = option.rect.height() - SPACER - mControls[FavouriteControlOn]->image()->height();
-        Event *event = static_cast<Event*>(index.internalPointer());
+        int aux = option.rect.height() - SPACER - mControls[FavouriteControlStrong]->image()->height();
 
         // font SMALL
         QFont fontSmall = option.font;
@@ -88,8 +104,8 @@ void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, cons
         QFontMetrics fmBigB(fontBigB);
 
         // background (in case of time conflicts)
-        if(event->hasTimeConflict()) {
-            painter->setBrush(Qt::yellow);
+        if (conflictSeverity != csNone) {
+            painter->setBrush(conflictSeverity == csStrong ? Qt::yellow : QColor("lightyellow"));
             painter->setPen(Qt::NoPen);
             painter->drawRect(option.rect);
         }
@@ -105,26 +121,33 @@ void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, cons
         foreach(Control* c, mControls.values()) {
             c->setEnabled(false);
         }
-        if(event->isFavourite())
-            mControls[FavouriteControlOn]->paint(painter, option.rect);
-        else
-            mControls[FavouriteControlOff]->paint(painter, option.rect);
+        switch (event->favourite()) {
+        case Favourite_strong:
+            mControls[FavouriteControlStrong]->paint(painter, option.rect);
+            break;
+        case Favourite_weak:
+            mControls[FavouriteControlWeak]->paint(painter, option.rect);
+            break;
+        case Favourite_no:
+            mControls[FavouriteControlNo]->paint(painter, option.rect);
+            break;
+        }
 
         if(event->hasAlarm())
             mControls[AlarmControlOn]->paint(painter, option.rect);
         else
             mControls[AlarmControlOff]->paint(painter, option.rect);
 
-        if(event->hasTimeConflict())
+        if(eventTimeConflict != Favourite_no)
             mControls[WarningControl]->paint(painter, option.rect);
 
         // draw texts
         // it starts just below the image
         // ("position of text" is lower-left angle of the first letter,
         //  so the first line is actually at the same height as the image)
-        painter->setPen(QPen(event->hasTimeConflict() ? Qt::black : textColor));
+        painter->setPen(QPen(conflictSeverity != csNone ? Qt::black : textColor));
         QPointF titlePointF(option.rect.x() + SPACER,
-                            option.rect.y() + SPACER + mControls[FavouriteControlOn]->image()->height());
+                            option.rect.y() + SPACER + mControls[FavouriteControlStrong]->image()->height());
         QTime start = event->start().time();
         painter->setFont(fontBig);
         painter->drawText(titlePointF,start.toString("hh:mm") + "-" + start.addSecs(event->duration()).toString("hh:mm") + ", " + event->roomName());
@@ -188,7 +211,7 @@ void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, cons
         // draw icons
         painter->setPen(QPen(textColor));
         painter->setFont(fontSmall);
-        QImage *image = mControls[numFav ? FavouriteControlOn : FavouriteControlOff]->image();
+        QImage *image = mControls[numFav ? FavouriteControlStrong : FavouriteControlNo]->image();
         QPoint drawPoint =
             option.rect.topRight()
             - QPoint(
@@ -306,18 +329,20 @@ void Delegate::Control::paint(QPainter* painter, const QRect rect)
 void Delegate::defineControls()
 {
     // FAVOURITE ICONs
-    // on
-    mControls.insert(FavouriteControlOn, new Control(FavouriteControlOn, QString(":icons/favourite-on.png"), NULL));
-    // off
-    mControls.insert(FavouriteControlOff, new Control(FavouriteControlOff, QString(":icons/favourite-off.png"), NULL));
+    // strong
+    mControls.insert(FavouriteControlStrong, new Control(FavouriteControlStrong, QString(":icons/favourite-strong.png"), NULL));
+    // weak
+    mControls.insert(FavouriteControlWeak, new Control(FavouriteControlWeak, QString(":icons/favourite-weak.png"), NULL));
+    // no
+    mControls.insert(FavouriteControlNo, new Control(FavouriteControlNo, QString(":icons/favourite-no.png"), NULL));
 
     // ALARM ICONs
     // on
     mControls.insert(AlarmControlOn,
-                    new Control(AlarmControlOn, QString(":icons/alarm-on.png"), mControls[FavouriteControlOn]));
+                    new Control(AlarmControlOn, QString(":icons/alarm-on.png"), mControls[FavouriteControlStrong]));
     // off
     mControls.insert(AlarmControlOff,
-                    new Control(AlarmControlOff, QString(":icons/alarm-off.png"), mControls[FavouriteControlOff]));
+                    new Control(AlarmControlOff, QString(":icons/alarm-off.png"), mControls[FavouriteControlNo]));
     // WARNING ICON
     mControls.insert(WarningControl,
                     new Control(WarningControl, QString(":icons/dialog-warning.png"), mControls[AlarmControlOff]));
@@ -338,7 +363,7 @@ int Delegate::numberOfFavourities(const QModelIndex &index) const
 
     int nrofFavs = 0;
     for(int i=0; i<index.model()->rowCount(index); i++)
-        if(static_cast<Event*>(index.child(i,0).internalPointer())->isFavourite())
+        if(static_cast<Event*>(index.child(i,0).internalPointer())->favourite() != Favourite_no)
             nrofFavs++;
 
     return nrofFavs;
index 75921215b0c31cb52c38277b4499bc52f05b1f42..e9f3439decc305e19f249efc7f4bb43c2a16292e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -31,8 +31,9 @@ class Delegate : public QItemDelegate
         enum ControlId
         {
             ControlNone = 0,
-            FavouriteControlOn,
-            FavouriteControlOff,
+            FavouriteControlStrong,
+            FavouriteControlWeak,
+            FavouriteControlNo,
             AlarmControlOn,
             AlarmControlOff,
             WarningControl
index 9529ef4b5d06341762b2c9742394fec64489f59d..d2075e784e30d6664029128dcf28a2e200b6a209 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -31,7 +31,7 @@ QSqlRecord const Event::sColumns = Event::toRecord(QList<QSqlField>()
     << QSqlField("xid_track", QVariant::Int)
     << QSqlField("type", QVariant::String)
     << QSqlField("language", QVariant::String)
-    << QSqlField("favourite", QVariant::Bool)
+    << QSqlField("favourite", QVariant::Int)
     << QSqlField("alarm", QVariant::Bool)
     << QSqlField("tag", QVariant::String)
     << QSqlField("title", QVariant::String)
@@ -90,7 +90,7 @@ QList<Event> Event::conflictEvents(int aEventId, int conferenceId) {
     query.prepare(selectQuery() + "WHERE xid_conference = :conf AND ( \
            ( start >= :s1 AND ( start + duration ) < :e1 ) \
         OR ( ( start + duration ) > :s2 AND start < :e2 ) ) \
-        AND favourite = 1 AND NOT id = :id ORDER BY start, duration");
+        AND favourite >= 1 AND NOT id = :id ORDER BY start, duration");
     query.bindValue(":conf", event.conferenceId());
     query.bindValue(":s1", convertToDb(event.start(), QVariant::DateTime));
     query.bindValue(":e1", convertToDb(event.start().toTime_t()+event.duration(), QVariant::DateTime));
@@ -116,7 +116,7 @@ QList<Event> Event::getFavByDate(const QDate& date, int conferenceId) {
     Conference conference = Conference::getById(conferenceId);
     QDateTime dayStart(date, conference.dayChangeTime(), Qt::UTC);
     QSqlQuery query;
-    query.prepare(selectQuery() + QString("WHERE xid_conference = :conf AND start >= :start AND start < :end AND favourite = 1 ORDER BY start, duration"));
+    query.prepare(selectQuery() + QString("WHERE xid_conference = :conf AND start >= :start AND start < :end AND favourite >= 1 ORDER BY start, duration"));
     query.bindValue(":conf", conferenceId);
     query.bindValue(":start", dayStart.toTime_t());
     query.bindValue(":end", dayStart.addDays(1).toTime_t());
@@ -192,12 +192,31 @@ QMap<QString,QString> Event::links()
     return mLinksList;
 }
 
-bool Event::hasTimeConflict() const
-{
-    if(!isFavourite()) // if it's not favourite, it can't have time-conflict
-        return false;
+Favourite Event::timeConflict() const {
+    if (favourite() == Favourite_no) // if it's not favourite, it can't have time-conflict
+        return Favourite_no;
+
+    QList<Event> events = conflictEvents(id(),conferenceId());
+
+    // find "strongest" conflict
+    Favourite f = Favourite_no;
+    for (int i = 0; i != events.size(); ++i) {
+        switch (events[i].favourite()) {
+        case Favourite_strong: f = Favourite_strong; break;
+        case Favourite_weak: if (f == Favourite_no) f = Favourite_weak; break;
+        case Favourite_no: break;
+        }
+    }
+    return f;
+
+}
 
-    return conflictEvents(id(),conferenceId()).count() > 0 ? true : false;
+void Event::cycleFavourite(bool back) {
+    switch (favourite()) {
+        case Favourite_no: setFavourite(back ? Favourite_weak : Favourite_strong); break;
+        case Favourite_strong: setFavourite(back ? Favourite_no : Favourite_weak); break;
+        case Favourite_weak: setFavourite(back ? Favourite_strong : Favourite_no); break;
+    }
 }
 
 void Event::setRoom(const QString &room)
index 5e3fa20e8ac788317cc029570218bb92a8fb1af2..ea85a0432f63fd56a8ba1fb2194cd1380226d8f2 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -35,6 +35,10 @@ class NoSuchEventException
 {
 };
 
+
+enum Favourite {Favourite_no=0, Favourite_weak=2, Favourite_strong=1};
+
+
 class Event : public OrmRecord<Event>
 {
 public:
@@ -59,9 +63,9 @@ public:
     int trackId() const { return value("xid_track").toInt(); }
     QString type() const { return value("type").toString(); }
     QString language() const { return value("language").toString(); }
-    bool isFavourite() const { return value("favourite").toBool(); }
+    Favourite favourite() const { return static_cast<Favourite>(value("favourite").toInt()); }
     bool hasAlarm() const { return value("alarm").toBool(); }
-    bool hasTimeConflict() const;
+    Favourite timeConflict() const;
     QString tag() const { return value("tag").toString(); }
     QString title() const { return value("title").toString(); }
     QString subtitle() const { return value("subtitle").toString(); }
@@ -81,7 +85,8 @@ public:
     void setTrackId(int trackId) { setValue("xid_track", trackId); }
     void setType(const QString & type) { setValue("type", type); }
     void setLanguage(const QString & language) { setValue("language", language); }
-    void setFavourite(bool favourite) { setValue("favourite", (int)((favourite))); }
+    void setFavourite(Favourite favourite) { setValue("favourite", (int) favourite); }
+    void cycleFavourite(bool back = false);
     void setHasAlarm(bool alarm) { setValue("alarm", (int)((alarm))); }
     void setTag(const QString& tag) { setValue("tag", tag); }
     void setTitle(const QString& title) { setValue("title", title); }
index e4e236795a88997cef2be967469b28d14edf92db..674bbcd5be62234296f354f199e285649262685a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 73fe1b5d0021af68f5ca8fc2bce4b45d2a42ab9f..e0be2692e06e19747582ccc7bc8aaf86d847702e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 27793e67d48e6184de75d7b3bfea58926ddd3872..61cff3b167c6dc62b9bdd988c6e029dcba92b678 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index fc8bb3601617debf63e68a514e6b65094d4a067a..87278bfd8794847bee3bd89b150af5078321d8bd 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 03645e82c9d11e01c6a279f2fff7a0cf76da9b0a..139b1990798034fa7de249e66c429dab04df4212 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -30,7 +30,7 @@ QSqlRecord const Track::sColumns = Track::toRecord(QList<QSqlField>()
     << QSqlField(CONFERENCEID, QVariant::Int)
     << QSqlField(NAME, QVariant::String));
 
-class TrackInsertException : OrmSqlException
+class TrackInsertException : public OrmSqlException
 {
 public:
     TrackInsertException(const QString& text) : OrmSqlException(text) {}
@@ -39,10 +39,17 @@ public:
 int Track::insert()
 {
     QSqlQuery query;
-    query.prepare("INSERT INTO " + sTableName + " (" + CONFERENCEID + "," + NAME + ")" + " VALUES " + "(\"" + QString::number(conferenceid()) + "\",\"" + name() + "\")");
+    QString trackname = name();
+    query.prepare(
+            QString("INSERT INTO %1 (%2, %3) VALUES (:xid_conference, :name)")
+            .arg(sTableName, CONFERENCEID, NAME));
+    query.bindValue(":xid_conference", conferenceid());
+    query.bindValue(":name", trackname);
     if (!query.exec())
     {
-        throw TrackInsertException("Exec Error");
+        throw TrackInsertException(
+                "Inserting track '" + trackname + "' into database failed: " +
+                query.lastError().text());
     }
     QVariant variant = query.lastInsertId();
     if (variant.isValid())
index 0841b67bdb30860ea5619e4a374e12610eaa715c..14c302862e40c6ad16b3c24be3f3844e5f48be0b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index a3c081adb8d222ea15e5c9f736a59f87f0a66fe3..3535eb39bff709f02ae059dd804771334047e33b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -44,7 +44,7 @@ void TreeView::mouseReleaseEvent(QMouseEvent *aEvent)
     QPoint point = aEvent->pos();
 
     // test whether we have handled the mouse event
-    if(!testForControlClicked(index,point))
+    if(!testForControlClicked(index, point, aEvent->button()))
     {
         // pass the event to the Base class, so item clicks/events are handled correctly
         QTreeView::mouseReleaseEvent(aEvent);
@@ -52,7 +52,7 @@ void TreeView::mouseReleaseEvent(QMouseEvent *aEvent)
 }
 
 // returns bool if some Control was clicked
-bool TreeView::testForControlClicked(const QModelIndex &aIndex, const QPoint &aPoint)
+bool TreeView::testForControlClicked(const QModelIndex &aIndex, const QPoint &aPoint, Qt::MouseButton button)
 {
     bool handled = false;
 
@@ -64,21 +64,19 @@ bool TreeView::testForControlClicked(const QModelIndex &aIndex, const QPoint &aP
     Delegate *delegate = static_cast<Delegate*>(itemDelegate(aIndex));
     switch(delegate->whichControlClicked(aIndex,aPoint))
     {
-        case Delegate::FavouriteControlOn:
-        case Delegate::FavouriteControlOff:
+        case Delegate::FavouriteControlStrong:
+        case Delegate::FavouriteControlWeak:
+        case Delegate::FavouriteControlNo:
             {
                 // handle Favourite Control clicked
                 Event event = Event::getById(aIndex.data().toInt(),confId);
 
                 QList<Event> conflicts = Event::conflictEvents(event.id(),Conference::activeConference());
-                event.setFavourite(!event.isFavourite());
+                event.cycleFavourite(button == Qt::RightButton);
                 event.update("favourite");
 
-                if(event.isFavourite())
-                {
-                    // event has became 'favourite' and so 'conflicts' list may have changed
-                    conflicts = Event::conflictEvents(event.id(),Conference::activeConference());
-                }
+                // event has became 'favourite' and so 'conflicts' list may have changed
+                conflicts = Event::conflictEvents(event.id(),Conference::activeConference());
 
                 // have to emit 'eventChanged' signal on all events in conflict
                 for(int i=0; i<conflicts.count(); i++)
index 31fc22d920e960c6362dd7d93159d16fc09b43d5..6f4f463be1bbd2ccfc8c9be982389967f57dc22a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -30,7 +30,7 @@ public:
     ~TreeView() {}
 private:
     void mouseReleaseEvent(QMouseEvent *aEvent);
-    bool testForControlClicked(const QModelIndex &aIndex, const QPoint &aPoint);
+    bool testForControlClicked(const QModelIndex &aIndex, const QPoint &aPoint, Qt::MouseButton button);
 public slots:
     void setAllExpanded(bool aExpanded); // (aExpanded==true) => expanded; (aExpanded==false) => collapsed
 private slots:
index 3ca3a2551b125aed4fa88a7a8ba3f76f3c13f5e3..30f569a947d2afe0fd905f51b36d44d08a14764d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
 #include <QStringList>
 #include <QDateTime>
 #include <QDebug>
+#include <stdexcept>
 
-class OrmException
+class OrmException : public std::runtime_error
 {
 public:
-    OrmException(const QString& text) : mText(text) {}
+    OrmException(const QString& text) : std::runtime_error(text.toStdString()), mText(text) {}
     virtual ~OrmException(){}
     virtual const QString& text() const { return mText; }
 private:
@@ -41,7 +42,7 @@ private:
 class OrmNoObjectException : public OrmException
 {
 public:
-    OrmNoObjectException() : OrmException("No object exception"){}
+    OrmNoObjectException() : OrmException("SQL query expects one record but found none."){}
     ~OrmNoObjectException(){}
 };
 
index 80d63f327a0586f9a1e07bd0c213b9d5c1a99532..90c7714bb490ec16ca89dd031fd578b9fad79309 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 46bb76957781ec0341ffba780993c169a2e59702..5d1442e9bac0d69211546b2bd72e3ccda6ced8e2 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index 01b5144c2cb3097be82bca2dd9ebb9c9467b4968..8c6294dbe1114219d7296b62f14cee474df25db2 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
@@ -179,6 +179,7 @@ void SqlEngine::addEventToDB(QHash<QString,QString> &aEvent) {
     Track track;
     int trackId;
     QString trackName = aEvent["track"];
+    if (trackName.isEmpty()) trackName = tr("No track");
     try
     {
         track = Track::retrieveByName(conferenceId, trackName);
index 2a0466812e4c57d001224c819a84514d3556ec0e..ae7bf06eab99106495d3217b842935ad14a14b8b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index c851e661f257414be54f40a83ca191f88c6dd120..f6bcd6fd7374a083dcdf6e427092a220d36610ae 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index ff1ebfbc2b030ac5babc23d6f2956adce9e1c702..412b5bbf1376b85ab7dcd73150d585bdde7f79e7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *
index c3ae70850f81e4e1ff0b4279e98acfbf731c5cf8..0da531ffa37b9084652f583b5e42213f34096c76 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2010 Ixonos Plc.
- * Copyright (C) 2011-2015 Philipp Spitzer, gregor herrmann, Stefan Stahl
+ * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl
  *
  * This file is part of ConfClerk.
  *