3
* This file is part of BibleTime's source code, http://www.bibletime.info/.
5
* Copyright 1999-2006 by the BibleTime developers.
6
* The BibleTime source code is licensed under the GNU General Public License version 2.0.
13
#include "bibletime.h"
15
#include "backend/btstringmgr.h"
16
#include "backend/cswordbackend.h"
18
#include "frontend/mainindex/cmainindex.h"
19
#include "frontend/cprofilemgr.h"
20
#include "frontend/cprofile.h"
21
#include "frontend/cmdiarea.h"
22
#include "frontend/kstartuplogo.h"
23
#include "frontend/cswordsetupdialog.h"
24
#include "frontend/cprinter.h"
25
#include "frontend/cmanageindiceswidget.h"
27
#include "backend/clanguagemgr.h"
31
#include "frontend/cbtconfig.h"
32
#include "frontend/cinfodisplay.h"
34
#include "util/cpointers.h"
35
#include "util/cresmgr.h"
41
#include <qpopupmenu.h>
42
#include <qsplitter.h>
43
#include <qguardedptr.h>
44
#include <qlistview.h>
50
#include <kaboutdata.h>
53
#include <kapplication.h>
54
#include <kconfigbase.h>
55
#include <kdeversion.h>
57
#include <khelpmenu.h>
58
#include <kiconloader.h>
61
#include <kstdaction.h>
64
#include <kpopupmenu.h>
65
#include <kdeversion.h>
70
using namespace InfoDisplay;
71
using namespace Profile;
73
/**Initializes the view of this widget*/
74
void BibleTime::initView() {
75
KStartupLogo::setStatusMessage(i18n("Creating BibleTime's GUI") + QString("..."));
77
m_mainSplitter = new QSplitter(this, "mainsplitter");
78
m_mainSplitter->setChildrenCollapsible(false);
79
setCentralWidget(m_mainSplitter);
81
m_leftPaneSplitter = new QSplitter(Qt::Vertical, m_mainSplitter);
82
m_leftPaneSplitter->setChildrenCollapsible(false);
84
QVBox* vBox = new QVBox(m_leftPaneSplitter);
85
vBox->setMinimumSize(100, 100);
87
QLabel* bookshelfLabel = new QLabel( i18n("Bookshelf"), vBox );
88
bookshelfLabel->setMargin(5);
90
m_mainIndex = new CMainIndex(vBox);
92
m_infoDisplay = new CInfoDisplay(m_leftPaneSplitter);
93
CPointers::setInfoDisplay(m_infoDisplay);
95
m_mdi = new CMDIArea(m_mainSplitter, "mdiarea" );
96
m_mdi->setMinimumSize(100, 100);
97
m_mdi->setFocusPolicy(ClickFocus);
99
m_helpMenu = new KHelpMenu(this, KGlobal::instance()->aboutData(), true, actionCollection());
102
/** Initializes the action objects of the GUI */
103
void BibleTime::initActions() {
104
KStartupLogo::setStatusMessage(i18n("Initializing menu- and toolbars") + QString("..."));
107
action = KStdAction::quit(kapp, SLOT( quit() ), actionCollection());
108
action->setToolTip( CResMgr::mainMenu::file::quit::tooltip );
110
#if KDE_VERSION_MINOR < 1
112
action->plugAccel( accel() );
115
action = new KAction(i18n("Search in &open work(s)"),
116
CResMgr::mainMenu::mainIndex::search::icon,
117
CResMgr::mainMenu::mainIndex::search::accel,
118
this, SLOT(slotSearchModules()), actionCollection(),
119
CResMgr::mainMenu::mainIndex::search::actionName
121
action->setToolTip( CResMgr::mainMenu::mainIndex::search::tooltip );
123
#if KDE_VERSION_MINOR < 1
125
action->plugAccel( accel() );
128
action = new KAction(i18n("Search in standard &Bible"),
129
CResMgr::mainMenu::mainIndex::searchdefaultbible::icon,
130
CResMgr::mainMenu::mainIndex::searchdefaultbible::accel,
131
this, SLOT(slotSearchDefaultBible()), actionCollection(),
132
CResMgr::mainMenu::mainIndex::searchdefaultbible::actionName
134
action->setToolTip( CResMgr::mainMenu::mainIndex::searchdefaultbible::tooltip );
136
#if KDE_VERSION_MINOR < 1
138
action->plugAccel( accel() );
141
m_viewToolbar_action = KStdAction::showToolbar(this, SLOT( slotToggleToolbar() ), actionCollection());
142
m_viewToolbar_action->setToolTip( CResMgr::mainMenu::view::showToolBar::tooltip );
144
#if KDE_VERSION_MINOR < 1
146
m_viewToolbar_action->plugAccel( accel() );
150
m_viewMainIndex_action = new KToggleAction(i18n("&Show bookshelf"),
151
CResMgr::mainMenu::view::showMainIndex::icon,
152
CResMgr::mainMenu::view::showMainIndex::accel,
153
this, SLOT(slotToggleMainIndex()), actionCollection(),
154
CResMgr::mainMenu::view::showMainIndex::actionName);
155
m_viewMainIndex_action->setToolTip( CResMgr::mainMenu::view::showMainIndex::tooltip );
157
#if KDE_VERSION_MINOR < 1
159
m_viewMainIndex_action->plugAccel( accel() );
162
m_viewInfoDisplay_action = new KToggleAction(i18n("Show &mag"),
163
CResMgr::mainMenu::view::showInfoDisplay::icon,
164
CResMgr::mainMenu::view::showInfoDisplay::accel,
165
this, SLOT(slotToggleInfoDisplay()), actionCollection(),
166
CResMgr::mainMenu::view::showInfoDisplay::actionName);
167
m_viewMainIndex_action->setToolTip( CResMgr::mainMenu::view::showInfoDisplay::tooltip );
169
#if KDE_VERSION_MINOR < 1
171
m_viewInfoDisplay_action->plugAccel( accel() );
174
action = KStdAction::preferences(this, SLOT( slotSettingsOptions() ), actionCollection());
175
action->setToolTip( CResMgr::mainMenu::settings::optionsDialog::tooltip );
177
#if KDE_VERSION_MINOR < 1
179
action->plugAccel( accel() );
182
action = new KAction(i18n("Bookshelf &Manager"),
183
CResMgr::mainMenu::settings::swordSetupDialog::icon,
184
CResMgr::mainMenu::settings::swordSetupDialog::accel,
185
this, SLOT( slotSwordSetupDialog() ), actionCollection(),
186
CResMgr::mainMenu::settings::swordSetupDialog::actionName
188
action->setToolTip( CResMgr::mainMenu::settings::swordSetupDialog::tooltip );
189
#if KDE_VERSION_MINOR < 1
191
action->plugAccel( accel() );
194
//delete help action if KDE created it
195
if ( actionCollection()->action( KStdAction::stdName(KStdAction::ConfigureToolbars) )) {
196
actionCollection()->remove
197
(actionCollection()->action(
198
KStdAction::stdName(KStdAction::ConfigureToolbars))
201
action = KStdAction::configureToolbars(this, SLOT( slotSettingsToolbar() ), actionCollection());
202
action->setToolTip( CResMgr::mainMenu::settings::editToolBar::tooltip );
203
#if KDE_VERSION_MINOR < 1
205
action->plugAccel( accel() );
208
m_windowArrangementMode_action = new KActionMenu(i18n("&Arrangement mode"),
209
CResMgr::mainMenu::window::arrangementMode::icon,
211
CResMgr::mainMenu::window::arrangementMode::actionName);
212
m_windowArrangementMode_action->setDelayed( false );
214
m_windowManualMode_action = new KToggleAction(i18n("&Manual mode"),
215
CResMgr::mainMenu::window::arrangementMode::manual::icon,
216
CResMgr::mainMenu::window::arrangementMode::manual::accel,
217
this, SLOT(slotManualArrangementMode()), actionCollection(),
218
CResMgr::mainMenu::window::arrangementMode::manual::actionName
220
m_windowManualMode_action->setToolTip(
221
CResMgr::mainMenu::window::arrangementMode::manual::tooltip
223
#if KDE_VERSION_MINOR < 1
225
m_windowManualMode_action->plugAccel( accel() );
228
m_windowArrangementMode_action->insert( m_windowManualMode_action );
231
m_windowAutoTileVertical_action = new KToggleAction(i18n("Auto-tile &vertically"),
232
CResMgr::mainMenu::window::arrangementMode::autoTileVertical::icon,
233
CResMgr::mainMenu::window::arrangementMode::autoTileVertical::accel,
234
this, SLOT(slotAutoTileVertical()), actionCollection(),
235
CResMgr::mainMenu::window::arrangementMode::autoTileVertical::actionName
237
m_windowAutoTileVertical_action->setToolTip(
238
CResMgr::mainMenu::window::arrangementMode::autoTileVertical::tooltip
240
#if KDE_VERSION_MINOR < 1
242
m_windowAutoTileVertical_action->plugAccel( accel() );
245
m_windowArrangementMode_action->insert( m_windowAutoTileVertical_action );
248
m_windowAutoTileHorizontal_action = new KToggleAction(i18n("Auto-tile &horizontally"),
249
CResMgr::mainMenu::window::arrangementMode::autoTileHorizontal::icon,
250
CResMgr::mainMenu::window::arrangementMode::autoTileHorizontal::accel,
251
this, SLOT(slotAutoTileHorizontal()), actionCollection(),
252
CResMgr::mainMenu::window::arrangementMode::autoTileHorizontal::actionName
254
m_windowAutoTileHorizontal_action->setToolTip(
255
CResMgr::mainMenu::window::arrangementMode::autoTileHorizontal::tooltip
257
#if KDE_VERSION_MINOR < 1
259
m_windowAutoTileHorizontal_action->plugAccel( accel() );
262
m_windowArrangementMode_action->insert( m_windowAutoTileHorizontal_action );
265
m_windowAutoCascade_action = new KToggleAction(i18n("Auto-&cascade"),
266
CResMgr::mainMenu::window::arrangementMode::autoCascade::icon,
267
CResMgr::mainMenu::window::arrangementMode::autoCascade::accel,
268
this, SLOT(slotAutoCascade()), actionCollection(),
269
CResMgr::mainMenu::window::arrangementMode::autoCascade::actionName
271
m_windowAutoCascade_action->setToolTip(
272
CResMgr::mainMenu::window::arrangementMode::autoCascade::tooltip
274
#if KDE_VERSION_MINOR < 1
275
// qWarning("Plug accel");
276
m_windowAutoCascade_action->plugAccel( accel() );
279
m_windowArrangementMode_action->insert( m_windowAutoCascade_action );
281
m_windowCascade_action = new KAction(i18n("&Cascade"),
282
CResMgr::mainMenu::window::cascade::icon,
283
CResMgr::mainMenu::window::cascade::accel,
284
this, SLOT(slotCascade()), actionCollection(),
285
CResMgr::mainMenu::window::cascade::actionName
287
m_windowCascade_action->setToolTip( CResMgr::mainMenu::window::cascade::tooltip );
289
#if KDE_VERSION_MINOR < 1
291
m_windowCascade_action->plugAccel( accel() );
295
m_windowTileVertical_action = new KAction(i18n("Tile &vertically"),
296
CResMgr::mainMenu::window::tileVertical::icon,
297
CResMgr::mainMenu::window::tileVertical::accel,
298
this, SLOT(slotTileVertical()), actionCollection(),
299
CResMgr::mainMenu::window::tileVertical::actionName
301
m_windowTileVertical_action->setToolTip( CResMgr::mainMenu::window::tileVertical::tooltip );
302
#if KDE_VERSION_MINOR < 1
304
m_windowTileVertical_action->plugAccel( accel() );
307
m_windowTileHorizontal_action = new KAction(i18n("Tile &horizontally"),
308
CResMgr::mainMenu::window::tileHorizontal::icon,
309
CResMgr::mainMenu::window::tileHorizontal::accel,
310
this, SLOT(slotTileHorizontal()), actionCollection(),
311
CResMgr::mainMenu::window::tileHorizontal::actionName
313
m_windowTileHorizontal_action->setToolTip( CResMgr::mainMenu::window::tileHorizontal::tooltip );
315
#if KDE_VERSION_MINOR < 1
317
m_windowTileHorizontal_action->plugAccel( accel() );
321
m_windowCloseAll_action = new KAction(i18n("Cl&ose all"),
322
CResMgr::mainMenu::window::closeAll::icon,
323
CResMgr::mainMenu::window::closeAll::accel,
324
m_mdi, SLOT(deleteAll()), actionCollection(),
325
CResMgr::mainMenu::window::closeAll::actionName
327
m_windowCloseAll_action->setToolTip( CResMgr::mainMenu::window::closeAll::tooltip );
328
#if KDE_VERSION_MINOR < 1
330
m_windowCloseAll_action->plugAccel( accel() );
334
m_windowSaveProfile_action = new KActionMenu(i18n("&Save session"),
335
CResMgr::mainMenu::window::saveProfile::icon,
337
CResMgr::mainMenu::window::saveProfile::actionName
339
m_windowSaveProfile_action->setToolTip( CResMgr::mainMenu::window::saveProfile::tooltip );
340
m_windowSaveProfile_action->setDelayed( false );
341
#if KDE_VERSION_MINOR < 1
343
m_windowSaveProfile_action->plugAccel( accel() );
347
m_windowSaveToNewProfile_action = new KAction(i18n("Save as &new session"),
348
CResMgr::mainMenu::window::saveToNewProfile::icon,
349
CResMgr::mainMenu::window::saveToNewProfile::accel,
350
this, SLOT(saveToNewProfile()), actionCollection(),
351
CResMgr::mainMenu::window::saveToNewProfile::actionName
353
m_windowSaveToNewProfile_action->setToolTip( CResMgr::mainMenu::window::saveToNewProfile::tooltip );
354
#if KDE_VERSION_MINOR < 1
356
m_windowSaveToNewProfile_action->plugAccel( accel() );
360
m_windowLoadProfile_action = new KActionMenu(i18n("&Load session"),
361
CResMgr::mainMenu::window::loadProfile::icon,
363
CResMgr::mainMenu::window::loadProfile::actionName
365
m_windowLoadProfile_action->setToolTip( CResMgr::mainMenu::window::loadProfile::tooltip );
366
m_windowLoadProfile_action->setDelayed( false );
367
#if KDE_VERSION_MINOR < 1
369
m_windowLoadProfile_action->plugAccel( accel() );
372
m_windowDeleteProfile_action = new KActionMenu(i18n("&Delete session"),
373
CResMgr::mainMenu::window::deleteProfile::icon,
375
CResMgr::mainMenu::window::deleteProfile::actionName
377
m_windowLoadProfile_action->setToolTip( CResMgr::mainMenu::window::deleteProfile::tooltip );
378
m_windowLoadProfile_action->setDelayed( false );
379
#if KDE_VERSION_MINOR < 1
381
m_windowDeleteProfile_action->plugAccel( accel() );
384
m_windowFullscreen_action = new KToggleAction(i18n("&Fullscreen mode"),
385
CResMgr::mainMenu::window::showFullscreen::icon,
386
CResMgr::mainMenu::window::showFullscreen::accel,
387
this, SLOT(toggleFullscreen()), actionCollection(),
388
CResMgr::mainMenu::window::showFullscreen::actionName
390
m_windowFullscreen_action->setToolTip( CResMgr::mainMenu::window::showFullscreen::tooltip );
391
m_windowFullscreen_action->setShortcutConfigurable(true);
392
#if KDE_VERSION_MINOR < 1
394
m_windowFullscreen_action->plugAccel( accel() );
397
//connect the profile popups to the right slots
398
KPopupMenu* loadPopup = m_windowLoadProfile_action->popupMenu();
399
KPopupMenu* savePopup = m_windowSaveProfile_action->popupMenu();
400
KPopupMenu* deletePopup = m_windowDeleteProfile_action->popupMenu();
402
connect(loadPopup, SIGNAL(activated(int)), SLOT(loadProfile(int)));
403
connect(savePopup, SIGNAL(activated(int)), SLOT(saveProfile(int)));
404
connect(deletePopup, SIGNAL(activated(int)), SLOT(deleteProfile(int)));
406
refreshProfileMenus();
408
if ( actionCollection()->action( KStdAction::stdName(KStdAction::HelpContents) )) { //delete help action if KDE created it
409
actionCollection()->remove
410
(actionCollection()->action(KStdAction::stdName(KStdAction::HelpContents)) );
413
action = new KAction(i18n("&Handbook"),
414
CResMgr::mainMenu::help::handbook::icon,
415
CResMgr::mainMenu::help::handbook::accel,
416
this, SLOT(openOnlineHelp_Handbook()), actionCollection(),
417
CResMgr::mainMenu::help::handbook::actionName
419
action->setToolTip( CResMgr::mainMenu::help::handbook::tooltip );
421
#if KDE_VERSION_MINOR < 1
423
action->plugAccel( accel() );
426
action = new KAction(i18n("&Bible Study Howto"),
427
CResMgr::mainMenu::help::bibleStudyHowTo::icon,
428
CResMgr::mainMenu::help::bibleStudyHowTo::accel,
429
this, SLOT(openOnlineHelp_Howto()), actionCollection(),
430
CResMgr::mainMenu::help::bibleStudyHowTo::actionName
432
action->setToolTip( CResMgr::mainMenu::help::bibleStudyHowTo::tooltip );
434
#if KDE_VERSION_MINOR < 1
436
action->plugAccel( accel() );
439
if ( actionCollection()->action( KStdAction::stdName( KStdAction::WhatsThis ) ) ) { //delete "What's this" action if KDE created it already
440
KAction* action = actionCollection()->action(KStdAction::stdName( KStdAction::WhatsThis ));
441
actionCollection()->remove
446
if ( actionCollection()->action( KStdAction::stdName( KStdAction::ReportBug ) ) ) { //delete Report Bug action if KDE created it
447
actionCollection()->remove
448
(actionCollection()->action(KStdAction::stdName( KStdAction::ReportBug )));
450
action = KStdAction::reportBug(m_helpMenu, SLOT(reportBug()), actionCollection());
451
action->setToolTip(CResMgr::mainMenu::help::bugreport::tooltip);
452
#if KDE_VERSION_MINOR < 1
454
action->plugAccel( accel() );
457
action = new KAction(i18n("&Daily tip"),
458
CResMgr::mainMenu::help::dailyTip::icon,
459
CResMgr::mainMenu::help::dailyTip::accel,
460
this, SLOT(slotHelpTipOfDay()), actionCollection(),
461
CResMgr::mainMenu::help::dailyTip::actionName
463
action->setToolTip(CResMgr::mainMenu::help::dailyTip::tooltip);
464
#if KDE_VERSION_MINOR < 1
466
action->plugAccel( accel() );
469
if ( actionCollection()->action( KStdAction::stdName( KStdAction::AboutApp ) ) ) { //delete About KDE action if KDE created it
470
actionCollection()->remove
471
(actionCollection()->action(KStdAction::stdName( KStdAction::AboutApp )));
473
action = KStdAction::aboutApp(m_helpMenu, SLOT(aboutApplication()), actionCollection());
474
action->setToolTip(CResMgr::mainMenu::help::aboutBibleTime::tooltip);
476
//delete About KDE action if KDE created it already
477
if ( actionCollection()->action( KStdAction::stdName( KStdAction::AboutKDE ) ) ) { //delete About KDE action if KDE created it
478
actionCollection()->remove
479
(actionCollection()->action(KStdAction::stdName( KStdAction::AboutKDE )));
481
action = KStdAction::aboutKDE(m_helpMenu, SLOT(aboutKDE()), actionCollection());
482
action->setToolTip(CResMgr::mainMenu::help::aboutKDE::tooltip);
485
/** Initializes the menubar of BibleTime. */
486
void BibleTime::initMenubar() {
487
//get the window and edit menus using the actions and their properties
488
m_windowMenu = dynamic_cast<QPopupMenu*>(m_windowCloseAll_action->container(0));
491
/** Initializes the SIGNAL / SLOT connections */
492
void BibleTime::initConnections() {
493
connect(m_mdi, SIGNAL(sigSetToplevelCaption(const QString&)),
494
this, SLOT(setPlainCaption(const QString&)));
495
connect(m_mdi, SIGNAL(createReadDisplayWindow(ListCSwordModuleInfo, const QString&)),
496
this, SLOT(createReadDisplayWindow(ListCSwordModuleInfo, const QString&)));
498
Q_ASSERT(m_windowMenu);
500
connect(m_windowMenu, SIGNAL(aboutToShow()),
501
this, SLOT(slotWindowMenuAboutToShow()));
504
qWarning("Main window: can't find window menu");
509
m_mainIndex, SIGNAL(createReadDisplayWindow(ListCSwordModuleInfo, const QString&)),
510
this, SLOT(createReadDisplayWindow(ListCSwordModuleInfo,const QString&))
513
m_mainIndex, SIGNAL(createWriteDisplayWindow(CSwordModuleInfo*, const QString&, const CDisplayWindow::WriteWindowType&)),
514
this, SLOT(createWriteDisplayWindow(CSwordModuleInfo*,const QString&, const CDisplayWindow::WriteWindowType&))
516
connect(m_mainIndex, SIGNAL(signalSwordSetupChanged()), this, SLOT(slotSwordSetupChanged()));
519
/** Initializes the backend */
520
void BibleTime::initBackends() {
521
KStartupLogo::setStatusMessage(i18n("Initializing Sword") + QString("..."));
523
StringMgr::setSystemStringMgr( new BTStringMgr() );
524
SWLog::getSystemLog()->setLogLevel(1);
526
m_backend = new CSwordBackend();
527
m_backend->booknameLanguage( CBTConfig::get
528
(CBTConfig::language) );
530
CPointers::setBackend(m_backend);
531
const CSwordBackend::LoadError errorCode = m_backend->initModules();
534
if ( errorCode == CSwordBackend::NoError ) { //no error
535
m_moduleList = &(m_backend->moduleList());
539
//show error message that initBackend failed
541
case CSwordBackend::NoSwordConfig: //mods.d or mods.conf missing
543
KStartupLogo::hideSplash();
544
BookshelfManager::CSwordSetupDialog dlg;
545
dlg.showPart( BookshelfManager::CSwordSetupDialog::Sword );
550
case CSwordBackend::NoModules: //no modules installed, but config exists
552
KStartupLogo::hideSplash();
553
BookshelfManager::CSwordSetupDialog dlg;
554
dlg.showPart( BookshelfManager::CSwordSetupDialog::Install );
559
default: //unknown error
561
KStartupLogo::hideSplash();
562
BookshelfManager::CSwordSetupDialog dlg;
563
dlg.showPart( BookshelfManager::CSwordSetupDialog::Sword );
570
KStartupLogo::setStatusMessage(i18n("Checking indices") + QString("..."));
572
// - delete all orphaned indexes (no module present) if autoDeleteOrphanedIndices is true
573
// - delete all indices of modules where hasIndex() returns false
574
BookshelfManager::CManageIndicesWidget::deleteOrphanedIndices();
578
/** Apply the settings given by the profile p*/
579
void BibleTime::applyProfileSettings( CProfile* p ) {
583
if (m_initialized) { //on startup KDE sets the main geometry
584
//see polish(), where m_initialized is set and the KDE methods are called for window resize
586
//first Main Window state
587
m_windowFullscreen_action->setChecked( p->fullscreen() ); //set the fullscreen button state
588
toggleFullscreen(); //either showFullscreen or showNormal
589
if (p->maximized()) KMainWindow::showMaximized(); //if maximized, then also call showMaximized
591
//Then Main Window geometry
592
KMainWindow::resize( p->geometry().size() ); //Don't use KMainWindowInterface::resize
593
KMainWindow::move( p->geometry().topLeft() );//Don't use KMainWindowInterface::move
597
/** Stores the settings of the mainwindow in the profile p */
598
void BibleTime::storeProfileSettings( CProfile* p ) {
599
Q_ASSERT(p && m_windowFullscreen_action);
600
if (!p || !m_windowFullscreen_action) return;
602
p->setFullscreen( m_windowFullscreen_action->isChecked() );
603
p->setMaximized( this->KMainWindow::isMaximized() );
606
geometry.setTopLeft(pos());
607
geometry.setSize(size());
608
p->setGeometry(geometry);