Bibletime – a bible study tool
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

316 lines
7.6 KiB

/*********
*
* 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 "config.h"
//BibleTime includes
#include "cswordversekey.h"
#include "cswordbiblemoduleinfo.h"
#include "cswordcommentarymoduleinfo.h"
//TQt includes
#include <tqstringlist.h>
//Sword includes
#include <swmodule.h>
#include <localemgr.h>
// Boost includes
// TODO: Detect Boost in autoconf
#include <boost/scoped_ptr.hpp>
CSwordVerseKey::CSwordVerseKey( CSwordModuleInfo* const module ) : CSwordKey(module) {
if ( CSwordBibleModuleInfo* bible = dynamic_cast<CSwordBibleModuleInfo*>(module) ) {
key( bible->lowerBound().key() );
}
}
CSwordVerseKey::CSwordVerseKey( const CSwordVerseKey& k ) : CSwordKey(k), VerseKey(k) {}
CSwordVerseKey::CSwordVerseKey( const VerseKey* const k, CSwordModuleInfo* const module ) : CSwordKey(module), VerseKey(*k) {}
/** Clones this object. */
CSwordKey* CSwordVerseKey::copy() const {
return new CSwordVerseKey(*this);
}
/** Sets the module for this key */
CSwordModuleInfo* const CSwordVerseKey::module( CSwordModuleInfo* const newModule ) {
if (newModule && ((newModule->type() == CSwordModuleInfo::Bible) || (newModule->type() == CSwordModuleInfo::Commentary) ) ) {
m_module = newModule;
//check if the module contains the key we present
CSwordBibleModuleInfo* bible = dynamic_cast<CSwordBibleModuleInfo*>(newModule);
if (_compare(bible->lowerBound()) < 0) {
key( bible->lowerBound() );
}
if (_compare(bible->upperBound()) > 0) {
key( bible->upperBound() );
}
}
return dynamic_cast<CSwordBibleModuleInfo*>(m_module);
}
/** Returns the current book as Text, not as integer. */
const TQString CSwordVerseKey::book( const TQString& newBook ) {
int min = 0;
int max = 1;
if (CSwordBibleModuleInfo* bible = dynamic_cast<CSwordBibleModuleInfo*>(module())) {
const bool hasOT = bible->hasTestament(CSwordBibleModuleInfo::OldTestament);
const bool hasNT = bible->hasTestament(CSwordBibleModuleInfo::NewTestament);
if (hasOT && hasNT) {
min = 0;
max = 1;
}
else if (hasOT && !hasNT) {
min = 0;
max = 0;
}
else if (!hasOT && hasNT) {
min = 1;
max = 1;
}
else if (!hasOT && !hasNT) {
min = 0;
max = -1; //no loop
}
}
if (!newBook.isEmpty()) {
#ifdef SWORD_MULTIVERSE
setBookName(newBook.utf8().data());
#else
bool finished = false;
for (int testament = min; testament <= max && !finished; ++testament) {
for (int book = 0; book < BMAX[testament] && !finished; ++book) {
if ( !strcmp(newBook.utf8().data(), books[testament][book].name ) ) {
Testament(testament+1);
Book(book+1);
finished = true;
}
}
}
#endif
}
if ( (Testament() >= min+1) && (Testament() <= max+1) && (Book() <= BMAX[min]) ) {
return TQString::fromUtf8( getBookName() );
}
//return TQString::fromUtf8( books[min][0].name ); //return the first book, i.e. Genesis
return TQString();
}
/** Sets the key we use to the parameter. */
const TQString CSwordVerseKey::key() const {
return TQString::fromUtf8(getText());
}
const char * CSwordVerseKey::rawKey() const {
return getText();
}
const bool CSwordVerseKey::key( const TQString& newKey ) {
return key( (const char*)newKey.utf8() );
}
const bool CSwordVerseKey::key( const char* newKey ) {
if (newKey && (strlen(newKey)>0) ) {
VerseKey::operator = (newKey);
}
else if (newKey && !strlen(newKey)) {
CSwordBibleModuleInfo* bible = dynamic_cast<CSwordBibleModuleInfo*>(module());
if ( bible ) {
VerseKey::operator = ((const char*)bible->lowerBound().key().utf8());
}
}
return !Error();
}
const bool CSwordVerseKey::next( const JumpType type ) {
Error(); //clear Error status
bool ret = true;
switch (type) {
case UseBook: {
const int currentTestament = Testament();
const int currentBook = Book();
if ((currentTestament == 2) && (currentBook >= BMAX[currentTestament-1])) { //Revelation, i.e. end of navigation
return false;
}
else if ((currentTestament == 1) && (currentBook >= BMAX[currentTestament-1])) { //Malachi, switch to the NT
Testament(currentTestament+1);
Book(1);
}
else {
Book(Book()+1);
}
break;
}
case UseChapter: {
Chapter(Chapter()+1);
break;
}
case UseVerse: {
if (m_module && m_module->module()) {
const bool oldtqStatus = m_module->module()->getSkipConsecutiveLinks();
m_module->module()->setSkipConsecutiveLinks(true);
//disable headings for next verse
const bool useHeaders = (Verse() == 0);
const bool oldHeadingstqStatus = ((VerseKey*)(m_module->module()->getKey()))->Headings( useHeaders );
//don't use setKey(), that would create a new key without Headings set
m_module->module()->getKey()->setText( (const char*)key().utf8() );
(*(m_module->module()) )++;
((VerseKey*)(m_module->module()->getKey()))->Headings(oldHeadingstqStatus);
m_module->module()->setSkipConsecutiveLinks(oldtqStatus);
if (!m_module->module()->Error()) {
key( TQString::fromUtf8(m_module->module()->KeyText()) );
}
else {
// Verse(Verse()+1);
//don't change the key, restore the module's position
m_module->module()->getKey()->setText( (const char*)key().utf8() );
ret = false;
break;
}
}
else {
Verse(Verse()+1);
}
break;
}
default:
return false;
}
if ( CSwordBibleModuleInfo* bible = dynamic_cast<CSwordBibleModuleInfo*>(module()) ) {
if (_compare(bible->lowerBound()) < 0 ) {
key( bible->lowerBound() );
ret = false;
}
if (_compare(bible->upperBound()) > 0 ) {
key( bible->upperBound() );
ret = false;
}
return ret;
}
else if (Error()) { //we have no module, so take care of VerseKey::Error()
return false;
}
return ret;
}
const bool CSwordVerseKey::previous( const JumpType type ) {
bool ret = true;
switch (type) {
case UseBook: {
if ( (Book() == 1) && (Testament() == 1) ) { //Genesis
return false;
}
else if ( (Book() == 1) && (Testament() == 2) ){ //Matthew
Testament(1);
Book(BMAX[0]);
}
else{
Book( Book()-1 );
}
break;
}
case UseChapter: {
Chapter(Chapter()-1);
break;
}
case UseVerse: {
if (m_module && m_module->module()) {
const bool useHeaders = (Verse() == 0);
const bool oldHeadingstqStatus = ((VerseKey*)(m_module->module()->getKey()))->Headings( useHeaders );
m_module->module()->getKey()->setText( (const char*)key().utf8() );
const bool oldtqStatus = m_module->module()->getSkipConsecutiveLinks();
m_module->module()->setSkipConsecutiveLinks(true);
( *( m_module->module() ) )--;
((VerseKey*)(m_module->module()->getKey()))->Headings( oldHeadingstqStatus );
m_module->module()->setSkipConsecutiveLinks(oldtqStatus);
if (!m_module->module()->Error()) {
key( TQString::fromUtf8(m_module->module()->KeyText()) );//don't use fromUtf8
}
else {
ret = false;
// Verse(Verse()-1);
m_module->module()->getKey()->setText( (const char*)key().utf8() ); //restore module's key
}
}
else {
Verse(Verse()-1);
}
break;
}
default:
return false;
}
if ( CSwordBibleModuleInfo* bible = dynamic_cast<CSwordBibleModuleInfo*>(module()) ) {
if (_compare(bible->lowerBound()) < 0 ) {
key( bible->lowerBound() );
ret = false;
}
if (_compare(bible->upperBound()) > 0 ) {
key( bible->upperBound() );
ret = false;
}
return ret;
}
else if (Error()) {
return false;
}
return ret;
}
/** Assignment operator for more ease of use. */
CSwordVerseKey& CSwordVerseKey::operator = (const TQString& keyname) {
key(keyname);
return *this;
}