summaryrefslogtreecommitdiff
path: root/src/bibletime.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/bibletime.cpp')
-rw-r--r--src/bibletime.cpp204
1 files changed, 112 insertions, 92 deletions
diff --git a/src/bibletime.cpp b/src/bibletime.cpp
index f2478d9..d4fa90d 100644
--- a/src/bibletime.cpp
+++ b/src/bibletime.cpp
@@ -2,16 +2,13 @@
*
* This file is part of BibleTime's source code, http://www.bibletime.info/.
*
-* Copyright 1999-2009 by the BibleTime developers.
+* Copyright 1999-2011 by the BibleTime developers.
* The BibleTime source code is licensed under the GNU General Public License version 2.0.
*
**********/
#include "bibletime.h"
-#include <cstdlib>
-#include <iostream>
-#include <ctime>
#include <QAction>
#include <QApplication>
#include <QCloseEvent>
@@ -19,8 +16,10 @@
#include <QDebug>
#include <QInputDialog>
#include <QMdiSubWindow>
+#include <QMessageBox>
#include <QSplashScreen>
#include <QSplitter>
+#include <ctime>
#include "backend/config/cbtconfig.h"
#include "backend/drivers/cswordbiblemoduleinfo.h"
#include "backend/drivers/cswordbookmoduleinfo.h"
@@ -38,17 +37,22 @@
#include "frontend/displaywindow/cwritewindow.h"
#include "frontend/keychooser/ckeychooser.h"
#include "frontend/searchdialog/csearchdialog.h"
-#include "util/cpointers.h"
#include "util/cresmgr.h"
#include "util/directory.h"
using namespace Profile;
-BibleTime::BibleTime()
- : m_WindowWasMaximizedBeforeFullScreen(false) {
+BibleTime *BibleTime::m_instance = 0;
+
+BibleTime::BibleTime(QWidget *parent, Qt::WindowFlags flags)
+ : QMainWindow(parent, flags), m_WindowWasMaximizedBeforeFullScreen(false)
+{
namespace DU = util::directory;
+ Q_ASSERT(m_instance == 0);
+ m_instance = this;
+
QSplashScreen splash;
bool showSplash = CBTConfig::get(CBTConfig::logo);
QString splashHtml;
@@ -90,16 +94,23 @@ BibleTime::BibleTime()
Qt::AlignCenter);
}
initActions();
+ initMenubar();
+ initToolbars();
initConnections();
readSettings();
setWindowTitle("BibleTime " BT_VERSION);
setWindowIcon(DU::getIcon(CResMgr::mainWindow::icon));
+ retranslateUi();
}
BibleTime::~BibleTime() {
// delete m_dcopInterface;
// The backend is deleted by the BibleTimeApp instance
+#ifdef BT_DEBUG
+ deleteDebugWindow();
+#endif
+ saveSettings();
}
/** Saves the properties of BibleTime to the application wide configfile */
@@ -107,17 +118,18 @@ void BibleTime::saveSettings() {
/// \todo how to write settings?
//accel()->writeSettings(CBTConfig::getConfig());
- CBTConfig::set(CBTConfig::toolbar, m_viewToolbar_action->isChecked());
+ CBTConfig::set(CBTConfig::toolbar, m_viewToolbarAction->isChecked());
// set the default to false
/* CBTConfig::set(CBTConfig::autoTileVertical, false);
CBTConfig::set(CBTConfig::autoTileHorizontal, false);
CBTConfig::set(CBTConfig::autoCascade, false);
*/
- CBTConfig::set(CBTConfig::autoTileVertical, m_windowAutoTileVertical_action->isChecked());
- CBTConfig::set(CBTConfig::autoTileHorizontal, m_windowAutoTileHorizontal_action->isChecked());
- CBTConfig::set(CBTConfig::autoTile, m_windowAutoTile_action->isChecked());
- CBTConfig::set(CBTConfig::autoCascade, m_windowAutoCascade_action->isChecked());
+ CBTConfig::set(CBTConfig::autoTileVertical, m_windowAutoTileVerticalAction->isChecked());
+ CBTConfig::set(CBTConfig::autoTileHorizontal, m_windowAutoTileHorizontalAction->isChecked());
+ CBTConfig::set(CBTConfig::autoTile, m_windowAutoTileAction->isChecked());
+ CBTConfig::set(CBTConfig::autoTabbed, m_windowAutoTabbedAction->isChecked());
+ CBTConfig::set(CBTConfig::autoCascade, m_windowAutoCascadeAction->isChecked());
CProfile* p = m_profileMgr.startupProfile();
if (p) {
@@ -131,31 +143,36 @@ void BibleTime::readSettings() {
// accel()->readSettings(CBTConfig::getConfig());
CBTConfig::setupAccelSettings(CBTConfig::application, m_actionCollection);
- m_viewToolbar_action->setChecked( CBTConfig::get(CBTConfig::toolbar) );
- slotToggleToolbar();
+ m_viewToolbarAction->setChecked( CBTConfig::get(CBTConfig::toolbar) );
+ slotToggleMainToolbar();
if ( CBTConfig::get(CBTConfig::autoTileVertical) ) {
- m_windowAutoTileVertical_action->setChecked( true );
- m_windowManualMode_action->setChecked(false);
+ m_windowAutoTileVerticalAction->setChecked( true );
+ m_windowManualModeAction->setChecked(false);
slotAutoTileVertical();
}
else if ( CBTConfig::get(CBTConfig::autoTileHorizontal) ) {
- m_windowAutoTileHorizontal_action->setChecked( true );
- m_windowManualMode_action->setChecked(false);
+ m_windowAutoTileHorizontalAction->setChecked( true );
+ m_windowManualModeAction->setChecked(false);
slotAutoTileHorizontal();
}
else if ( CBTConfig::get(CBTConfig::autoTile) ) {
- m_windowAutoTile_action->setChecked(true);
- m_windowManualMode_action->setChecked(false);
+ m_windowAutoTileAction->setChecked(true);
+ m_windowManualModeAction->setChecked(false);
slotAutoTile();
}
+ else if ( CBTConfig::get(CBTConfig::autoTabbed) ) {
+ m_windowAutoTabbedAction->setChecked(true);
+ m_windowManualModeAction->setChecked(false);
+ slotAutoTabbed();
+ }
else if ( CBTConfig::get(CBTConfig::autoCascade) ) {
- m_windowAutoCascade_action->setChecked(true);
- m_windowManualMode_action->setChecked(false);
+ m_windowAutoCascadeAction->setChecked(true);
+ m_windowManualModeAction->setChecked(false);
slotAutoCascade();
}
else {
- m_windowManualMode_action->setChecked(true);
+ m_windowManualModeAction->setChecked(true);
slotManualArrangementMode();
}
}
@@ -167,10 +184,8 @@ CDisplayWindow* BibleTime::createReadDisplayWindow(QList<CSwordModuleInfo*> modu
CDisplayWindow* displayWindow = CDisplayWindowFactory::createReadInstance(modules, m_mdi);
if ( displayWindow ) {
displayWindow->init();
- if (m_mdi->subWindowList().count() == 0)
- displayWindow->showMaximized();
- else
- displayWindow->show();
+ m_mdi->addSubWindow(displayWindow);
+ displayWindow->show();
// if (!key.isEmpty())
displayWindow->lookupKey(key);
}
@@ -192,7 +207,7 @@ CDisplayWindow* BibleTime::createReadDisplayWindow(CSwordModuleInfo* module, con
return createReadDisplayWindow(list, key);
}
-CDisplayWindow* BibleTime::createWriteDisplayWindow(CSwordModuleInfo* module, const QString& key, const CDisplayWindow::WriteWindowType& type) {
+CDisplayWindow* BibleTime::createWriteDisplayWindow(CSwordModuleInfo* module, const QString& key, const CWriteWindow::WriteWindowType& type) {
qApp->setOverrideCursor( QCursor(Qt::WaitCursor) );
QList<CSwordModuleInfo*> modules;
@@ -201,6 +216,7 @@ CDisplayWindow* BibleTime::createWriteDisplayWindow(CSwordModuleInfo* module, co
CDisplayWindow* displayWindow = CDisplayWindowFactory::createWriteInstance(modules, m_mdi, type);
if ( displayWindow ) {
displayWindow->init();
+ m_mdi->addSubWindow(displayWindow);
if (m_mdi->subWindowList().count() == 0)
displayWindow->showMaximized();
else
@@ -216,45 +232,64 @@ CDisplayWindow* BibleTime::moduleEditPlain(CSwordModuleInfo *module) {
/// \todo Refactor this.
return createWriteDisplayWindow(module,
QString::null,
- CDisplayWindow::PlainTextWindow);
+ CWriteWindow::PlainTextWindow);
}
CDisplayWindow* BibleTime::moduleEditHtml(CSwordModuleInfo *module) {
/// \todo Refactor this.
return createWriteDisplayWindow(module,
QString::null,
- CDisplayWindow::HTMLWindow);
+ CWriteWindow::HTMLWindow);
}
void BibleTime::searchInModule(CSwordModuleInfo *module) {
/// \todo Refactor this.
- QList<CSwordModuleInfo *> modules;
+ QList<const CSwordModuleInfo *> modules;
modules.append(module);
Search::CSearchDialog::openDialog(modules, QString::null);
}
-void BibleTime::moduleUnlock(CSwordModuleInfo *module) {
+bool BibleTime::moduleUnlock(CSwordModuleInfo *module, QWidget *parent) {
+ /// \todo Write a proper unlocking dialog with integrated error messages.
+ QString unlockKey;
bool ok;
- const QString unlockKey =
- QInputDialog::getText(
- this,
- tr("Unlock Work"),
- tr("Enter the unlock key for this work."),
- QLineEdit::Normal,
- module->config(CSwordModuleInfo::CipherKey),
- &ok
+ for (;;) {
+ unlockKey = QInputDialog::getText(
+ parent, tr("Unlock Work"), tr("Enter the unlock key for %1.").arg(module->name()),
+ QLineEdit::Normal, module->config(CSwordModuleInfo::CipherKey), &ok
);
- if (ok) {
- /// \todo Refactor. Unlock the module via a global modules model.
- if (module->unlock(unlockKey)) {
- CPointers::backend()->reloadModules(CSwordBackend::OtherChange);
+ if (!ok) return false;
+ module->unlock(unlockKey);
+
+ /// \todo refactor this module reload
+ /* There is currently a deficiency in sword 1.6.1 in that backend->setCipherKey() does
+ * not work correctly for modules from which data was already fetched. Therefore we have to
+ * reload the modules.
+ */
+ {
+ const QString moduleName(module->name());
+ CSwordBackend *backend = CSwordBackend::instance();
+ backend->reloadModules(CSwordBackend::OtherChange);
+ module = backend->findModuleByName(moduleName);
+ Q_ASSERT(module != 0);
}
+
+ if (!module->isLocked()) break;
+ QMessageBox::warning(parent, tr("Warning: Invalid unlock key!"),
+ tr("The unlock key you provided did not properly unlock this "
+ "module. Please try again."));
}
+ return true;
+}
+
+void BibleTime::slotModuleUnlock(CSwordModuleInfo *module) {
+ moduleUnlock(module, this);
}
void BibleTime::moduleAbout(CSwordModuleInfo *module) {
- BTAboutModuleDialog *dialog(new BTAboutModuleDialog(this, module));
+ BTAboutModuleDialog *dialog = new BTAboutModuleDialog(module, this);
+ dialog->setAttribute(Qt::WA_DeleteOnClose); // Destroy dialog when closed
dialog->show();
dialog->raise();
}
@@ -269,28 +304,25 @@ void BibleTime::refreshDisplayWindows() {
}
/** Refresh main window accelerators */
-void::BibleTime::refreshBibleTimeAccel() {
+void BibleTime::refreshBibleTimeAccel() {
CBTConfig::setupAccelSettings(CBTConfig::application, m_actionCollection);
}
-/** Called before quit. */
-void BibleTime::slot_aboutToQuit() {
- saveSettings();
-}
-
-/** Called before a window is closed */
-bool BibleTime::queryClose() {
- qDebug() << "BibleTime::queryClose";
- bool ret = true;
-
- foreach(QMdiSubWindow* subWindow, m_mdi->subWindowList()) {
+void BibleTime::closeEvent(QCloseEvent *event) {
+ /*
+ Sequentially queries all open subwindows whether its fine to close them. If some sub-
+ window returns false, the querying is stopped and the close event is ignored. If all
+ subwindows return true, the close event is accepted.
+ */
+ Q_FOREACH(QMdiSubWindow *subWindow, m_mdi->subWindowList()) {
if (CDisplayWindow* window = dynamic_cast<CDisplayWindow*>(subWindow->widget())) {
- ret = ret && window->queryClose();
+ if (!window->queryClose()) {
+ event->ignore();
+ return;
+ }
}
- qDebug() << "return value:" << ret;
}
- qDebug() << "final return value:" << ret;
- return ret;
+ event->accept();
}
/** Restores the workspace if the flag for this is set in the config. */
@@ -300,32 +332,20 @@ void BibleTime::restoreWorkspace() {
}
}
-/** Processes the commandline options given to BibleTime. */
-void BibleTime::processCommandline() {
- QStringList args = qApp->QCoreApplication::arguments();
-
- if (args.contains("--help") || args.contains("-h") || args.contains("/h") || args.contains("/?")) {
- std::cout << "BibleTime" << std::endl << "--help (-h, /h, /?): Show this help message and exit"
- << std::endl << "--ignore-session: open a clean session" << std:: endl << "--open-default-bible <ref>: "
- << "Open the default Bible with the reference <ref>" << std::endl;
- std::cout << "Some Qt arguments:" << std::endl << "-reverse: reverse the UI layout direction"
- << std::endl;
- exit(0);
- //printHelpAndExit();
+void BibleTime::processCommandline(bool ignoreSession, const QString &bibleKey) {
+ if (CBTConfig::get(CBTConfig::crashedTwoTimes)) {
+ return;
}
- if ( !CBTConfig::get(CBTConfig::crashedTwoTimes) &&
- !args.contains("--ignore-session") ) {
+
+ if (!ignoreSession) {
restoreWorkspace();
}
- if ( args.contains("--open-default-bible") &&
- !CBTConfig::get(CBTConfig::crashedLastTime) &&
- !CBTConfig::get(CBTConfig::crashedTwoTimes)) {
- int index = args.indexOf("--open-default-bible");
- QString bibleKey;
- if (index >= 0 && (index + 1) < args.size()) {
- bibleKey = args.at(index + 1);
- }
+ if (CBTConfig::get(CBTConfig::crashedLastTime)) {
+ return;
+ }
+
+ if (!bibleKey.isNull()) {
CSwordModuleInfo* bible = CBTConfig::get(CBTConfig::standardBible);
if (bibleKey == "random") {
CSwordVerseKey vk(0);
@@ -336,10 +356,16 @@ void BibleTime::processCommandline() {
int newIndex = rand() % maxIndex;
vk.setPosition(sword::TOP);
vk.Index(newIndex);
- bibleKey = vk.key();
+ createReadDisplayWindow(bible, vk.key());
+ } else {
+ createReadDisplayWindow(bible, bibleKey);
}
- createReadDisplayWindow(bible, bibleKey);
- m_mdi->myTileVertical();//we are sure only one window is open, which should be displayed fullscreen in the working area
+
+ /*
+ We are sure only one window is open - it should be displayed
+ fullscreen in the working area:
+ */
+ m_mdi->myTileVertical();
}
}
@@ -348,9 +374,3 @@ bool BibleTime::event(QEvent* event) {
Search::CSearchDialog::closeDialog();
return QMainWindow::event(event);
}
-
-QAction* BibleTime::getAction(const QString& actionName)
-{
- return m_actionCollection->action(actionName);
-}
-