/********* * * This file is part of BibleTime's source code, http://www.bibletime.info/. * * Copyright 1999-2006 by the BibleTime developers. * The BibleTime source code is licensed under the GNU General Public License version 2.0. * **********/ #include "cbiblereadwindow.h" #include "ccommentaryreadwindow.h" #include "cbuttons.h" #include "backend/cswordversekey.h" #include "backend/cswordbiblemoduleinfo.h" #include "frontend/cprofilewindow.h" #include "frontend/cexportmanager.h" #include "frontend/cbtconfig.h" #include "frontend/cmdiarea.h" #include "util/cresmgr.h" #include "frontend/display/creaddisplay.h" #include "frontend/keychooser/ckeychooser.h" #include "util/ctoolclass.h" #include //TQt includes #include #include //KDE includes #include #include #include using namespace Profile; CBibleReadWindow::CBibleReadWindow(ListCSwordModuleInfo moduleList, CMDIArea* parent, const char *name ) : CLexiconReadWindow(moduleList, parent,name) { } CBibleReadWindow::~CBibleReadWindow() {} void CBibleReadWindow::applyProfileSettings( CProfileWindow* const settings ) { CLexiconReadWindow::applyProfileSettings(settings); const int count = displaySettingsButton()->menuItemCount(); int result = settings->windowSettings(); for (int i = count-1; i>=1; i--) { if (result-(int)pow((double)2,i-1)>= 0) { //2^i was added before, so item with index i is set result -= (int)pow((double)2,i-1); displaySettingsButton()->setItemStatus(i,true); } else { displaySettingsButton()->setItemStatus(i,false); } } displaySettingsButton()->setChanged(); }; void CBibleReadWindow::storeProfileSettings( CProfileWindow* const settings ) { CLexiconReadWindow::storeProfileSettings(settings); const int count = displaySettingsButton()->menuItemCount(); int result = 0; //now check every item for (int i = 1; i < count; i++) { //first item is a title if (displaySettingsButton()->itemStatus(i)) //item is checked result += (int)pow((double)2,i-1);//add 2^i (the i. digit in binary) } settings->setWindowSettings(result); }; /** Reimplementation. */ void CBibleReadWindow::insertKeyboardActions( TDEActionCollection* const a ) { new TDEAction( i18n("Next book"), CResMgr::displaywindows::bibleWindow::nextBook::accel, a, "nextBook" ); new TDEAction( i18n("Previous book"), CResMgr::displaywindows::bibleWindow::previousBook::accel, a, "previousBook" ); new TDEAction( i18n("Next chapter"), CResMgr::displaywindows::bibleWindow::nextChapter::accel, a, "nextChapter" ); new TDEAction( i18n("Previous chapter"), CResMgr::displaywindows::bibleWindow::previousChapter::accel, a, "previousChapter" ); new TDEAction( i18n("Next verse"), CResMgr::displaywindows::bibleWindow::nextVerse::accel, a, "nextVerse" ); new TDEAction( i18n("Previous verse"), CResMgr::displaywindows::bibleWindow::previousVerse::accel, a, "previousVerse" ); //popup menu items // new TDEAction(i18n("Select all"), TDEStdAccel::selectAll(), a, "selectAll"); //copy menu items // new TDEAction(i18n("Copy reference only"), TDEShortcut(0), a, "copyReferenceOnly"); // new TDEAction(i18n("Text of reference"), TDEShortcut(0), a, "copyTextOfReference"); // new TDEAction(i18n("Reference with text"), TDEShortcut(0), a, "copyReferenceWithText"); new TDEAction(i18n("Copy chapter"), TDEShortcut(0), a, "copyChapter"); // new TDEAction(i18n("Copy selected text"), TDEStdAccel::copy(), a, "copySelectedText"); //save menu // new TDEAction(i18n("Reference with text"), TDEShortcut(0), a, "saveReferenceWithText"); new TDEAction(i18n("Save chapter as plain text"), TDEShortcut(0), a, "saveChapterAsPlainText"); new TDEAction(i18n("Save chapter as HTML"), TDEShortcut(0), a, "saveChapterAsHTML"); // new TDEAction(i18n("Reference with text"), TDEShortcut(0), a, "saveReferenceWithText"); //print new TDEAction(i18n("Print chapter"), TDEStdAccel::print(), a, "printChapter"); } void CBibleReadWindow::initActions() { CLexiconReadWindow::initActions(); //make sure the predefined actions are available //cleanup, not a clean oo-solution actionCollection()->action("nextEntry")->setEnabled(false); actionCollection()->action("previousEntry")->setEnabled(false); new TDEAction( i18n("Next book"), CResMgr::displaywindows::bibleWindow::nextBook::accel, TQT_TQOBJECT(this), TQT_SLOT(nextBook()), actionCollection(), "nextBook" ); new TDEAction( i18n("Previous book"), CResMgr::displaywindows::bibleWindow::previousBook::accel, TQT_TQOBJECT(this), TQT_SLOT(previousBook()), actionCollection(), "previousBook" ); new TDEAction( i18n("Next chapter"), CResMgr::displaywindows::bibleWindow::nextChapter::accel, TQT_TQOBJECT(this), TQT_SLOT(nextChapter()), actionCollection(), "nextChapter" ); new TDEAction( i18n("Previous chapter"), CResMgr::displaywindows::bibleWindow::previousChapter::accel, TQT_TQOBJECT(this), TQT_SLOT(previousChapter()), actionCollection(), "previousChapter" ); new TDEAction( i18n("Next verse"), CResMgr::displaywindows::bibleWindow::nextVerse::accel, TQT_TQOBJECT(this), TQT_SLOT(nextVerse()), actionCollection(), "nextVerse" ); new TDEAction( i18n("Previous verse"), CResMgr::displaywindows::bibleWindow::previousVerse::accel, TQT_TQOBJECT(this), TQT_SLOT(previousVerse()), actionCollection(), "previousVerse" ); m_actions.selectAll = actionCollection()->action("selectAll"); Q_ASSERT(m_actions.selectAll); m_actions.findText = actionCollection()->action("findText"); Q_ASSERT(m_actions.findText); m_actions.findStrongs = new TDEAction( i18n("Strong's Search"), CResMgr::displaywindows::general::findStrongs::icon, CResMgr::displaywindows::general::findStrongs::accel, TQT_TQOBJECT(this), TQT_SLOT(openSearchStrongsDialog()), actionCollection(), CResMgr::displaywindows::general::findStrongs::actionName); m_actions.copy.referenceOnly = new TDEAction(i18n("Reference only"), TDEShortcut(0), displayWidget()->connectionsProxy(), TQT_SLOT(copyAnchorOnly()), actionCollection(), "copyReferenceOnly"); m_actions.copy.referenceTextOnly = new TDEAction(i18n("Text of reference"), TDEShortcut(0),displayWidget()->connectionsProxy(), TQT_SLOT(copyAnchorTextOnly()), actionCollection(), "copyTextOfReference"); m_actions.copy.referenceAndText = new TDEAction(i18n("Reference with text"), TDEShortcut(0), displayWidget()->connectionsProxy(), TQT_SLOT(copyAnchorWithText()), actionCollection(), "copyReferenceWithText"); m_actions.copy.chapter = new TDEAction(i18n("Chapter"), TDEShortcut(0), TQT_TQOBJECT(this), TQT_SLOT(copyDisplayedText()), actionCollection(), "copyChapter"); m_actions.copy.selectedText = actionCollection()->action("copySelectedText"); Q_ASSERT(m_actions.copy.selectedText); m_actions.save.referenceAndText = new TDEAction(i18n("Reference with text"), TDEShortcut(0), displayWidget()->connectionsProxy(), TQT_SLOT(saveAnchorWithText()), actionCollection(), "saveReferenceWithText"); m_actions.save.chapterAsPlain = new TDEAction(i18n("Chapter as plain text"), TDEShortcut(0), TQT_TQOBJECT(this), TQT_SLOT(saveChapterPlain()), actionCollection(), "saveChapterAsPlainText"); m_actions.save.chapterAsHTML = new TDEAction(i18n("Chapter as HTML"), TDEShortcut(0), TQT_TQOBJECT(this), TQT_SLOT(saveChapterHTML()), actionCollection(), "saveChapterAsHTML"); m_actions.print.reference = new TDEAction(i18n("Reference with text"), TDEShortcut(0), TQT_TQOBJECT(this), TQT_SLOT(printAnchorWithText()), actionCollection(), "saveReferenceWithText"); m_actions.print.chapter = new TDEAction(i18n("Chapter"), TDEShortcut(0), TQT_TQOBJECT(this), TQT_SLOT(printAll()), actionCollection(), "printChapter"); CBTConfig::setupAccelSettings(CBTConfig::bibleWindow, actionCollection()); } void CBibleReadWindow::initConnections() { CLexiconReadWindow::initConnections(); /* if (m_transliterationButton) { // Transliteration is not always available connect(m_transliterationButton, TQT_SIGNAL(sigChanged()), TQT_SLOT(lookup())); }*/ } void CBibleReadWindow::initToolbars() { CLexiconReadWindow::initToolbars(); } void CBibleReadWindow::initView() { CLexiconReadWindow::initView(); parentWidget()->installEventFilter( this ); } /** Reimplementation. */ void CBibleReadWindow::setupPopupMenu() { popup()->insertTitle(CToolClass::getIconForModule(modules().first()), i18n("Bible window")); m_actions.findText->plug(popup()); m_actions.findStrongs->plug(popup()); m_actions.selectAll->plug(popup()); (new TDEActionSeparator(TQT_TQOBJECT(this)))->plug( popup() ); m_actions.copyMenu = new TDEActionMenu(i18n("Copy..."), CResMgr::displaywindows::bibleWindow::copyMenu::icon, TQT_TQOBJECT(popup())); m_actions.copyMenu->setDelayed( false ); m_actions.copyMenu->insert(m_actions.copy.referenceOnly); m_actions.copyMenu->insert(m_actions.copy.referenceTextOnly); m_actions.copyMenu->insert(m_actions.copy.referenceAndText); m_actions.copyMenu->insert(m_actions.copy.chapter); m_actions.copyMenu->insert(new TDEActionSeparator(TQT_TQOBJECT(this))); m_actions.copyMenu->insert(m_actions.copy.selectedText); m_actions.copyMenu->plug(popup()); m_actions.saveMenu = new TDEActionMenu(i18n("Save..."),CResMgr::displaywindows::bibleWindow::saveMenu::icon,TQT_TQOBJECT(popup())); m_actions.saveMenu->setDelayed( false ); m_actions.saveMenu->insert(m_actions.save.referenceAndText); m_actions.saveMenu->insert(m_actions.save.chapterAsPlain); m_actions.saveMenu->insert(m_actions.save.chapterAsHTML); m_actions.saveMenu->plug(popup()); m_actions.printMenu = new TDEActionMenu(i18n("Print..."),CResMgr::displaywindows::bibleWindow::printMenu::icon, TQT_TQOBJECT(popup())); m_actions.printMenu->setDelayed(false); m_actions.printMenu->insert(m_actions.print.reference); m_actions.printMenu->insert(m_actions.print.chapter); m_actions.printMenu->plug(popup()); } /** Reimplemented. */ void CBibleReadWindow::updatePopupMenu() { tqWarning("CBibleReadWindow::updatePopupMenu()"); //enable the action depending on the supported module features // bool hasStrongs = false; // ListCSwordModuleInfo mods = modules(); // for (ListCSwordModuleInfo::iterator it = mods.begin(); it != mods.end(); ++it) { // if ( (*it)->has( CSwordModuleInfo::strongNumbers ) ) { // hasStrongs = true; // break; // } // } // // m_actions.findStrongs->setEnabled( hasStrongs ); m_actions.findStrongs->setEnabled( displayWidget()->getCurrentNodeInfo()[CDisplay::Lemma] != TQString() ); m_actions.copy.referenceOnly->setEnabled( displayWidget()->hasActiveAnchor() ); m_actions.copy.referenceTextOnly->setEnabled( displayWidget()->hasActiveAnchor() ); m_actions.copy.referenceAndText->setEnabled( displayWidget()->hasActiveAnchor() ); m_actions.copy.selectedText->setEnabled( displayWidget()->hasSelection() ); m_actions.save.referenceAndText->setEnabled( displayWidget()->hasActiveAnchor() ); m_actions.print.reference->setEnabled( displayWidget()->hasActiveAnchor() ); } /** Moves to the next book. */ void CBibleReadWindow::nextBook() { if (verseKey()->next(CSwordVerseKey::UseBook)) { keyChooser()->setKey(key()); } } /** Moves one book behind. */ void CBibleReadWindow::previousBook() { if (verseKey()->previous(CSwordVerseKey::UseBook)) { keyChooser()->setKey(key()); } } /** Moves to the next book. */ void CBibleReadWindow::nextChapter() { if (verseKey()->next(CSwordVerseKey::UseChapter)) { keyChooser()->setKey(key()); } } /** Moves one book behind. */ void CBibleReadWindow::previousChapter() { if (verseKey()->previous(CSwordVerseKey::UseChapter)) { keyChooser()->setKey(key()); } } /** Moves to the next book. */ void CBibleReadWindow::nextVerse() { if (verseKey()->next(CSwordVerseKey::UseVerse)) { keyChooser()->setKey(key()); } } /** Moves one book behind. */ void CBibleReadWindow::previousVerse() { if (verseKey()->previous(CSwordVerseKey::UseVerse)) { keyChooser()->setKey(key()); } } /** rapper around key() to return the right type of key. */ CSwordVerseKey* CBibleReadWindow::verseKey() { CSwordVerseKey* k = dynamic_cast(CDisplayWindow::key()); Q_ASSERT(k); return k; } /** Copies the current chapter into the clipboard. */ void CBibleReadWindow::copyDisplayedText() { CSwordVerseKey dummy(*verseKey()); dummy.Verse(1); CSwordVerseKey vk(*verseKey()); vk.LowerBound(dummy); CSwordBibleModuleInfo* bible = dynamic_cast(modules().first()); dummy.Verse(bible->verseCount(dummy.book(), dummy.Chapter())); vk.UpperBound(dummy); CExportManager mgr(i18n("Copy chapter to clipboard ..."), false, i18n("Copying"), filterOptions(), displayOptions()); mgr.copyKey(&vk, CExportManager::Text, true); } /** Saves the chapter as valid HTML page. */ void CBibleReadWindow::saveChapterHTML() { //saves the complete chapter to disk CSwordBibleModuleInfo* bible = dynamic_cast(modules().first()); Q_ASSERT(bible); if (!bible) //shouldn't happen return; CSwordVerseKey dummy(*verseKey()); dummy.Verse(1); CSwordVerseKey vk(*verseKey()); vk.LowerBound(dummy); dummy.Verse(bible->verseCount(dummy.book(), dummy.Chapter())); vk.UpperBound(dummy); CExportManager mgr(i18n("Saving chapter ..."), true, i18n("Saving"), filterOptions(), displayOptions()); mgr.saveKey(&vk, CExportManager::HTML, true); } /** Saves the chapter as valid HTML page. */ void CBibleReadWindow::saveChapterPlain() { //saves the complete chapter to disk CSwordVerseKey vk(*verseKey()); CSwordVerseKey dummy(*verseKey()); dummy.Verse(1); vk.LowerBound(dummy); CSwordBibleModuleInfo* bible = dynamic_cast(modules().first()); dummy.Verse(bible->verseCount(dummy.book(), dummy.Chapter())); vk.UpperBound(dummy); CExportManager mgr(i18n("Saving chapter ..."), true, i18n("Saving"), filterOptions(),displayOptions()); mgr.saveKey(&vk, CExportManager::Text, true); } void CBibleReadWindow::reload() { CLexiconReadWindow::reload(); if (m_modules.count() == 0) { close(); return; } //refresh the book lists // tqDebug("lang is %s",backend()->booknameLanguage().latin1()); verseKey()->setLocale( backend()->booknameLanguage().latin1() ); keyChooser()->refreshContent(); CBTConfig::setupAccelSettings(CBTConfig::readWindow, actionCollection()); //setup the predefined actions CBTConfig::setupAccelSettings(CBTConfig::bibleWindow, actionCollection()); } /** No descriptions */ bool CBibleReadWindow::eventFilter( TQObject* o, TQEvent* e) { const bool ret = CLexiconReadWindow::eventFilter(o,e); // Q_ASSERT(o->inherits("CDisplayWindow")); // tqWarning("class: %s", o->className()); if (e && (e->type() == TQEvent::FocusIn)) { //sync other windows to this active /* This is a hack to work around a TDEHTML problem (similair to the Drag&Drop problem we had): * If new HTML content is loaded from inside a kHTML event handler * the widget's state will be confused, i.e. it's scrolling without having * the mousebutton clicked. * * This is not really in a TDEHTML event handler but works anyway. * Sometime KDE/TQt is hard to use ... */ TQTimer::singleShot(0, TQT_TQOBJECT(this), TQT_SLOT(syncWindows())); } return ret; } void CBibleReadWindow::lookup( CSwordKey* newKey ) { CLexiconReadWindow::lookup(newKey); syncWindows(); } void CBibleReadWindow::syncWindows() { // tqWarning("syncing windows"); TQWidgetList windows = mdi()->windowList(); // Q_ASSERT(windows.count()); if (!windows.count()) { return; } for (windows.first(); windows.current(); windows.next()) { CDisplayWindow* w = dynamic_cast(windows.current()); // Q_ASSERT(w && w->syncAllowed()); if (w && w->syncAllowed()) { w->lookup( key()->key() ); } /* else { tqWarning("class sync: %s", w->className()); }*/ } }