2 * Copyright (C) 2010 Ixonos Plc.
3 * Copyright (C) 2011 Philipp Spitzer, gregor herrmann
5 * This file is part of ConfClerk.
7 * ConfClerk is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation, either version 2 of the License, or (at your option)
12 * ConfClerk is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17 * You should have received a copy of the GNU General Public License along with
18 * ConfClerk. If not, see <http://www.gnu.org/licenses/>.
20 #include "mainwindow.h"
24 #include <QNetworkProxy>
25 #include <QNetworkAccessManager>
26 #include <QNetworkReply>
28 #include <sqlengine.h>
31 #include <eventmodel.h>
34 #include <conference.h>
37 #include <QMessageBox>
40 #include <eventdialog.h>
41 #include "daynavigatorwidget.h"
42 #include "settingsdialog.h"
43 #include "conferenceeditor.h"
44 #include "schedulexmlparser.h"
45 #include "errormessage.h"
47 #include <tabcontainer.h>
48 #include <appsettings.h>
50 const QString PROXY_USERNAME;
51 const QString PROXY_PASSWD;
53 MainWindow::MainWindow(int aEventId, QWidget *aParent)
54 : QMainWindow(aParent)
55 , conferenceModel(new ConferenceModel(this))
56 , mXmlParser(new ScheduleXmlParser(this))
57 , mNetworkAccessManager(new QNetworkAccessManager(this))
61 saved_title = windowTitle();
64 tabWidget->setTabText(1,"Favs");
65 //tabWidget->setTabText(2,"Day");
68 // first time run aplication: -> let's have it direct connection in this case
69 if(!AppSettings::contains("proxyIsDirectConnection"))
70 AppSettings::setDirectConnection(true);
72 if(AppSettings::isDirectConnection())
74 qDebug() << "Setting-up proxy: " << AppSettings::proxyAddress() << ":" << AppSettings::proxyPort();
77 AppSettings::isDirectConnection() ? QNetworkProxy::NoProxy : QNetworkProxy::HttpProxy,
78 AppSettings::proxyAddress(),
79 AppSettings::proxyPort(),
82 QNetworkProxy::setApplicationProxy(proxy);
84 // event details have changed
85 connect(dayTabContainer, SIGNAL(eventHasChanged(int,bool)), SLOT(eventHasChanged(int,bool)));
86 connect(favsTabContainer, SIGNAL(eventHasChanged(int,bool)), SLOT(eventHasChanged(int,bool)));
87 connect(tracksTabContainer, SIGNAL(eventHasChanged(int,bool)), SLOT(eventHasChanged(int,bool)));
88 connect(roomsTabContainer, SIGNAL(eventHasChanged(int,bool)), SLOT(eventHasChanged(int,bool)));
89 connect(nowTabContainer, SIGNAL(eventHasChanged(int,bool)), SLOT(eventHasChanged(int,bool)));
90 connect(searchTabContainer, SIGNAL(eventHasChanged(int,bool)), SLOT(eventHasChanged(int,bool)));
92 connect(aboutAction, SIGNAL(triggered()), SLOT(aboutApp()));
93 connect(settingsAction, SIGNAL(triggered()), SLOT(setup()));
94 connect(conferencesAction, SIGNAL(triggered()), SLOT(showConferences()));
96 useConference(Conference::activeConference());
97 // optimization, see useConference() code
100 } catch (const OrmException& e) {
101 qDebug() << "OrmException:" << e.text();
105 // TODO: open conferences at startup?
108 tabWidget->setCurrentIndex(6); // 6 - conference tab
112 // open dialog for given Event ID
113 // this is used in case Alarm Dialog request application to start
118 EventDialog dialog(aEventId,this);
121 catch(OrmNoObjectException&) {} // just start application
122 catch(...) {} // just start application
125 connect(mNetworkAccessManager, SIGNAL(finished(QNetworkReply*)), SLOT(networkQueryFinished(QNetworkReply*)));
127 connect(mXmlParser, SIGNAL(parsingScheduleBegin()), conferenceModel, SLOT(newConferenceBegin()));
128 connect(mXmlParser, SIGNAL(parsingScheduleEnd(const QString&)), conferenceModel, SLOT(newConferenceEnd(const QString&)));
131 void MainWindow::aboutApp()
133 QDialog dialog(this);
137 dialog.setFixedWidth(width());
142 void MainWindow::eventHasChanged(int aEventId, bool aReloadModel)
144 dayTabContainer->updateTreeViewModel(aEventId);
145 favsTabContainer->updateTreeViewModel(aEventId,aReloadModel);
146 tracksTabContainer->updateTreeViewModel(aEventId);
147 nowTabContainer->updateTreeViewModel(aEventId);
148 roomsTabContainer->updateTreeViewModel(aEventId);
149 searchTabContainer->updateTreeViewModel(aEventId);
152 void MainWindow::useConference(int id)
155 Conference::getById(Conference::activeConference()).update("active",0);
156 Conference new_active = Conference::getById(id);
157 new_active.update("active",1);
159 // looks like it does not work at n900
160 setWindowTitle(new_active.title());
163 // dont run initTabs() here
164 // it takes much CPU, making travelling between conferences in ConferenceEditor longer
165 // and is not seen in maemo WM anyway
166 // instead run it explicitly
168 // 2. when ConferenceEditor finished
169 // dont forget to protect the calls by try-catch!
171 // just in case, clear conference selection instead
174 // end of optimization
176 } catch (OrmException& e) {
177 // cannon set an active conference
184 void MainWindow::initTabs()
186 int confId = Conference::activeConference();
187 Conference active = Conference::getById(confId);
188 QDate startDate = active.start();
189 QDate endDate = active.end();
191 // 'dayNavigator' emits signal 'dateChanged' after setting valid START:END dates
192 dayTabContainer->setDates(startDate, endDate);
193 tracksTabContainer->setDates(startDate, endDate);
194 roomsTabContainer->setDates(startDate, endDate);
195 favsTabContainer->setDates(startDate, endDate);
196 searchTabContainer->setDates(startDate, endDate);
197 searchTabContainer->searchAgainClicked();
198 nowTabContainer->updateTreeView(QDate::currentDate());
201 void MainWindow::clearTabs()
203 dayTabContainer->clearModel();
204 tracksTabContainer->clearModel();
205 roomsTabContainer->clearModel();
206 favsTabContainer->clearModel();
207 searchTabContainer->clearModel();
208 searchTabContainer->searchAgainClicked();
209 nowTabContainer->clearModel();
212 void MainWindow::unsetConference()
215 setWindowTitle(saved_title);
218 void MainWindow::setup()
220 SettingsDialog dialog;
223 qDebug() << "Setting-up proxy: " << AppSettings::proxyAddress() << ":" << AppSettings::proxyPort();
225 AppSettings::isDirectConnection() ? QNetworkProxy::NoProxy : QNetworkProxy::HttpProxy,
226 AppSettings::proxyAddress(),
227 AppSettings::proxyPort(),
230 QNetworkProxy::setApplicationProxy(proxy);
233 /** Create and run ConferenceEditor dialog, making required connections for it.
235 This method manages, which classes actually perform changes in conference list.
237 There are several classes that modify the conferences:
239 deletion and URL update.
240 this, mXmlParser and mNetworkAccessManager:
241 addition and refresh.
243 void MainWindow::showConferences()
245 ConferenceEditor dialog(conferenceModel, this);
247 connect(&dialog, SIGNAL(haveConferenceUrl(const QString&)), SLOT(importFromNetwork(const QString&)));
248 connect(&dialog, SIGNAL(haveConferenceFile(const QString&)), SLOT(importFromFile(const QString&)));
249 connect(&dialog, SIGNAL(removeConferenceRequested(int)), SLOT(removeConference(int)));
250 connect(&dialog, SIGNAL(changeUrlRequested(int, const QString&)),
251 SLOT(changeConferenceUrl(int, const QString&)));
253 connect(&dialog, SIGNAL(haveConferenceSelected(int)), SLOT(useConference(int)));
254 connect(&dialog, SIGNAL(noneConferenceSelected()), SLOT(unsetConference()));
256 connect(mXmlParser, SIGNAL(parsingScheduleBegin()), &dialog, SLOT(importStarted()));
257 connect(mXmlParser, SIGNAL(progressStatus(int)), &dialog, SLOT(showParsingProgress(int)));
258 connect(mXmlParser, SIGNAL(parsingScheduleEnd(const QString&)), &dialog, SLOT(importFinished(const QString&)));
260 connect(this, SIGNAL(conferenceRemoved()), &dialog, SLOT(conferenceRemoved()));
264 // optimization, see useConference() code
267 } catch (OrmException) {
272 void MainWindow::networkQueryFinished(QNetworkReply *aReply)
274 if ( aReply->error() != QNetworkReply::NoError )
276 error_message(QString("Error occured during download: ") + aReply->errorString());
280 qDebug() << __PRETTY_FUNCTION__ << ": have data";
281 importData(aReply->readAll(), aReply->url().toEncoded());
285 void MainWindow::importData(const QByteArray &aData, const QString& url)
287 mXmlParser->parseData(aData, url);
290 void MainWindow::importFromNetwork(const QString& url)
292 qDebug() << __PRETTY_FUNCTION__;
293 QNetworkRequest request;
294 request.setUrl(QUrl(url));
296 mNetworkAccessManager->setProxy(QNetworkProxy::applicationProxy());
297 mNetworkAccessManager->get(request);
300 void MainWindow::importFromFile(const QString& filename)
302 qDebug() << __PRETTY_FUNCTION__;
303 QFile file(filename);
304 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
305 static const QString format("Cannot read \"%1\": error %2");
306 error_message(format.arg(filename, QString::number(file.error())));
309 importData(file.readAll(), "");
312 void MainWindow::removeConference(int id)
314 Conference::deleteConference(id);
315 conferenceModel->conferenceRemoved();
317 emit conferenceRemoved();
320 void MainWindow::changeConferenceUrl(int id, const QString& url)
322 Conference::getById(id).setUrl(url);