summaryrefslogtreecommitdiff
authordrw <drw>2005-08-09 22:24:10 (UTC)
committer drw <drw>2005-08-09 22:24:10 (UTC)
commit0c362cbc72dfbff246c0f11417d364b45b50ec94 (patch) (side-by-side diff)
tree6e1fcdc99ff40752343d7b4c99822eba591a2f15
parent873a383cfc4f9184adfe9257500df8c03648b0fd (diff)
downloadopie-0c362cbc72dfbff246c0f11417d364b45b50ec94.zip
opie-0c362cbc72dfbff246c0f11417d364b45b50ec94.tar.gz
opie-0c362cbc72dfbff246c0f11417d364b45b50ec94.tar.bz2
Several updates to Dagger, see /noncore/apps/dagger/ChangeLog for more information
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/dagger/ChangeLog8
-rw-r--r--noncore/apps/dagger/README8
-rw-r--r--noncore/apps/dagger/TODO7
-rw-r--r--noncore/apps/dagger/mainwindow.cpp68
-rw-r--r--noncore/apps/dagger/opie-dagger.control2
-rw-r--r--noncore/apps/dagger/searchbar.cpp2
6 files changed, 51 insertions, 44 deletions
diff --git a/noncore/apps/dagger/ChangeLog b/noncore/apps/dagger/ChangeLog
index 108419e..22b20d4 100644
--- a/noncore/apps/dagger/ChangeLog
+++ b/noncore/apps/dagger/ChangeLog
@@ -1,11 +1,19 @@
+2005-08-09 Dan Williams <drw@handhelds.org>
+
+ * Released version 0.9.2
+ * Added support for Sword v1.5.8
+ * Implemented morph tag cross-referencing
+ * Fix crash when last module is closed
+ * Fix display of key when module is opened
+
2004-04-22 Dan Williams <drw@handhelds.org>
* Released version 0.9.1
* Fixed the disabling of screen blanking
* Implement previous/next page scrolling
* Animate search OWait
2004-04-06 Dan Williams <drw@handhelds.org>
* Released version 0.9.0
* Initial check-in of new application
diff --git a/noncore/apps/dagger/README b/noncore/apps/dagger/README
index 00e9eed..47b8eee 100644
--- a/noncore/apps/dagger/README
+++ b/noncore/apps/dagger/README
@@ -1,61 +1,61 @@
/************************************************************************
/*
/* Opie - Dagger
/* ===============
-/* Version 0.9.1
+/* Version 0.9.2
/*
/* A Bible study/reader application
/*
/************************************************************************
---------------------------------------------
- Release Notes for Opie-Dagger - April, 2004
+ Release Notes for Opie-Dagger - August, 2005
---------------------------------------------
======================
= To-do =
======================
- See $OPIEDIR/noncore/apps/dagger/TODO for more info.
======================
= Build =
======================
In order to build opie-dagger, libsword needs to be present on
the build system along with the appropriate headers.
-- libsword source (best to use version 1.5.x or greater):
+- libsword source (requires version 1.5.8 or greater):
- http://www.crosswire.org/sword/
- the Sword library headers need to be located in an appropriate
include directory
======================
= Run =
======================
- In order to use opie-dagger, libsword must be installed
on the system.
- One or more Sword modules need to be installed, see
http://www.crosswire.org/sword/ to download modules
- When run for the first time, the path needs to be set to the
directory where the Sword modules are located. Select 'Edit->Configure'
from the menu bar and enter the path on the 'General' tab. Restart
Dagger.
======================
= Credits =
======================
-- Opie-Dagger is (C) 2004 Dan Williams
+- Opie-Dagger is (C) 2004, 2005 Dan Williams
======================
= Links =
======================
- Opie Project: http://opie.handhelds.org
- OpenZaurus Project: http://openzaurus.org
- Familiar Project: http://familiar.handhelds.org
- Crosswire Society http://www.crosswire.org/
- The Sword Project http://www.crosswire.org/sword/
diff --git a/noncore/apps/dagger/TODO b/noncore/apps/dagger/TODO
index 1530bd6..21426aa 100644
--- a/noncore/apps/dagger/TODO
+++ b/noncore/apps/dagger/TODO
@@ -1,25 +1,28 @@
/************************************************************************
/*
/* Opie - Dagger
/* ===============
-/* Version 0.9.1
+/* Version 0.9.2
/*
/* A Bible study/reader application
/*
/************************************************************************
------------------------------------
-To-do for Opie-Dagger - April, 2004
+To-do for Opie-Dagger - August, 2005
------------------------------------
======================
= Current release =
======================
1. Implement module installation
+2. Fix support for other languages
+3. Fix display sleep prevention
+4. Implement footnote cross-referencing
======================
= Future releases =
======================
1. Margin notes \ No newline at end of file
diff --git a/noncore/apps/dagger/mainwindow.cpp b/noncore/apps/dagger/mainwindow.cpp
index 1f2d521..f61df68 100644
--- a/noncore/apps/dagger/mainwindow.cpp
+++ b/noncore/apps/dagger/mainwindow.cpp
@@ -264,128 +264,130 @@ void MainWindow::initUI()
m_actionViewSearchToolbar = new QAction( tr( "Search toolbar" ), QString::null, 0, this, 0 );
m_actionViewSearchToolbar->setToggleAction( true );
connect( m_actionViewSearchToolbar, SIGNAL(toggled(bool)), this, SLOT(slotViewSearchToolbar(bool)) );
m_actionViewSearchToolbar->addTo( popup );
m_menuBar->insertItem( tr( "View" ), popup );
}
void MainWindow::openModule( const QString &modulename, const QString &key )
{
sword::SWModule *module = m_swordMgr->Modules[ modulename.latin1() ];
if ( module )
{
TextWidget *tw = 0x0;
if ( !m_alwaysOpenNew )
{
// Try to find if the module is already opened, if so will use that TextWidget
QObjectList *childlist = queryList( "TextWidget" );
QObjectListIt it( *childlist );
while ( ( tw = reinterpret_cast<TextWidget *>(it.current()) ) != 0 &&
tw->getModuleName() != modulename )
++it;
if ( tw && tw->getModuleName() == modulename )
{
// Set key if one is present
if ( !key.isNull() )
tw->setKey( key );
// Raise tab
m_tabs.setCurrentTab( tw );
}
}
if ( m_alwaysOpenNew || !tw )
{
// Open module in new tab
QString icon;
QString type = module->Type();
if ( type == "Biblical Texts" )
icon = "dagger/bibletext";
else if ( type == "Commentaries" )
icon = "dagger/commentary";
else if ( type == "Lexicons / Dictionaries" )
icon = "dagger/lexicon";
tw = new TextWidget( this, module, m_numVerses, &m_textFont );
connect( tw, SIGNAL(sigRefClicked(const QString &)),
this, SLOT(slotTextRefClicked(const QString &)) );
connect( this, SIGNAL(sigNumVersesChanged(int)), tw, SLOT(slotNumVersesChanged(int)) );
connect( this, SIGNAL(sigFontChanged(const QFont *)), tw, SLOT(slotFontChanged(const QFont *)) );
connect( this, SIGNAL(sigOptionChanged()), tw, SLOT(slotOptionChanged()) );
m_tabs.addTab( tw, icon, modulename );
m_actionTextClose->setEnabled( true );
m_actionEditCopy->setEnabled( true );
m_actionBookmarkAdd->setEnabled( true );
// Set key if one is present
if ( !key.isNull() )
tw->setKey( key );
+ setCaption( QString( "%1 - Dagger" ).arg( tw->getFullKey() ) );
+ m_navToolbar->setKey( tw->getAbbrevKey() );
}
}
}
int MainWindow::findBookmark( const QString &bookmark )
{
int index = 3;
int id = m_bookmarkMenu->idAt( index );
while ( ( id != -1 ) && ( m_bookmarkMenu->text( id ) != bookmark ) )
{
++index;
id = m_bookmarkMenu->idAt( index );
}
return id;
}
void MainWindow::enableScreenBlanking( bool enable )
{
enable ? QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable
: QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::DisableSuspend;
}
void MainWindow::initConfig()
{
bool show;
m_config.setGroup( "Sword" );
for ( QAction *a = m_actionSwordOpts.first(); a; a = m_actionSwordOpts.next() )
{
show = m_config.readBoolEntry( a->text(), false );
a->setOn( show );
m_swordMgr->setGlobalOption ( a->text(), show ? "On" : "Off" );
}
// Display/hide toolbars based on last run
m_config.setGroup( "Config" );
m_alwaysOpenNew = m_config.readBoolEntry( "AlwaysOpenNew", false );
m_navToolbar->setAutoScrollRate( m_config.readNumEntry( "AutoScroll", 50 ) );
m_disableScreenBlank = m_config.readBoolEntry( "DisableScreenBlanking", false );
enableScreenBlanking( !m_disableScreenBlank );
m_copyFormat = m_config.readNumEntry( "CopyFormat", 0 );
show = m_config.readBoolEntry( "NavBar", false );
m_actionViewNavToolbar->setOn( show );
slotViewNavToolbar( show );
m_numVerses = m_config.readNumEntry( "NumVerses", 5 );
show = m_config.readBoolEntry( "SearchBar", false );
m_actionViewSearchToolbar->setOn( show );
slotViewSearchToolbar( show );
// Set text font
m_config.setGroup( "Font" );
QString fontFamily = m_config.readEntry( "Family", QString::null );
!fontFamily.isNull() ? m_textFont = QFont( fontFamily,
m_config.readNumEntry( "Size", -1 ),
m_config.readNumEntry( "Weight", QFont::Normal ),
m_config.readBoolEntry( "Italic", false ) )
: m_textFont = font(); // If font is not configured, set to default widget font
// Load bookmarks
@@ -573,181 +575,175 @@ void MainWindow::slotBookmarkRemove()
m_actionBookmarkRemove->setEnabled( false );
}
}
}
void MainWindow::slotBookmarkSelected()
{
const QAction *action = reinterpret_cast<const QAction *>(sender());
if ( action )
{
QString bookmark = action->text();
int pos = bookmark.find( " (" );
QString key = bookmark.left( pos );
pos += 2;
QString module = bookmark.mid( pos, bookmark.find( ")", pos ) - pos );
openModule( module, key );
}
}
void MainWindow::slotViewSwordOption( bool enabled )
{
const QAction *action = reinterpret_cast<const QAction*>(sender());
m_swordMgr->setGlobalOption ( action->text(), enabled ? "On" : "Off" );
emit sigOptionChanged();
}
void MainWindow::slotViewNavToolbar( bool enabled )
{
enabled ? m_navToolbar->show()
: m_navToolbar->hide();
}
void MainWindow::slotViewSearchToolbar( bool enabled )
{
enabled ? m_searchToolbar->show()
: m_searchToolbar->hide();
}
void MainWindow::slotNavPrevPage()
{
TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget());
if ( text )
{
text->prevPage();
setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) );
m_navToolbar->setKey( text->getAbbrevKey() );
}
}
void MainWindow::slotNavPrevVerse()
{
TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget());
if ( text )
{
text->prevVerse();
setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) );
m_navToolbar->setKey( text->getAbbrevKey() );
}
}
void MainWindow::slotNavKeyChanged( const QString &newKey )
{
- QString key = newKey;
- key.replace( QRegExp( "[-=.]" ), ":" );
-
TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget());
if ( text )
{
+ QString key = newKey;
+ if ( text->isBibleText() )
+ key.replace( QRegExp( "[-=.]" ), ":" );
+
text->setKey( key );
setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) );
}
}
void MainWindow::slotNavNextVerse()
{
TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget());
if ( text )
{
text->nextVerse();
setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) );
m_navToolbar->setKey( text->getAbbrevKey() );
}
}
void MainWindow::slotNavNextPage()
{
TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget());
if ( text )
{
text->nextPage();
setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) );
m_navToolbar->setKey( text->getAbbrevKey() );
}
}
void MainWindow::slotNavAutoScroll( bool enabled )
{
m_autoScrollTimer.stop();
if ( enabled )
m_autoScrollTimer.start( m_navToolbar->autoScrollRate() * 100 );
}
void MainWindow::slotNavScrollRateChanged( int newRate )
{
if ( m_autoScrollTimer.isActive() )
{
m_autoScrollTimer.stop();
m_autoScrollTimer.start( newRate * 100 );
}
}
void MainWindow::slotSearchResultClicked( const QString &key )
{
TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget());
if ( text )
{
text->setKey( key );
setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) );
m_navToolbar->setKey( text->getAbbrevKey() );
}
}
void MainWindow::slotTextRefClicked( const QString &ref )
{
//printf( "Ref clicked: '%s'\n", ref.latin1() );
/*
-Ref clicked: 'type=Strongs value=G3482'
-Ref clicked: 'type=Strongs value=H07225'
-Ref clicked: 'type=morph class=x-Robinson:N-PRI value=N-PRI'
-Ref clicked: 'type=morph class=x-StrongsMorph:TH8804 value=TH8804'
+Ref clicked: 'passagestudy.jsp?action=showStrongs&type=Hebrew&value=07225'
+Ref clicked: 'passagestudy.jsp?action=showStrongs&type=Greek&value=602'
+Ref clicked: 'passagestudy.jsp?action=showMorph&type=x-Robinson%3AN-NSF&value=N-NSF'
+Ref clicked: 'passagestudy.jsp?action=showNote&type=n&value=1&module=KJV&passage=Genesis+1%3A5'
*/
//owarn << "Reference: " << ref << oendl;
if ( !ref.isNull() )
{
TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget());
if ( text )
{
+ // Parse action
+ int pos = ref.find( '&', 28 );
+ QString actionStr = ref.mid( 28, pos - 28 );
+
// Parse type
- int pos = ref.find( "type=", 0, false ) + 5;
- QString typeStr = ref.mid( pos, ref.find( ' ', pos ) - pos );
-
- // Parse class (for morph. only)
- QString classStr;
- if ( typeStr == "morph" )
- {
- pos = ref.find( "class=", 0, false ) + 5;
- QString classStr = ref.mid( pos, ref.find( ' ', pos ) - pos );
-
- // TODO - need to strip 'x-' from beginning and ':key' at end?
- }
-
+ pos = ref.find( "type=", pos, false ) + 5;
+ QString typeStr = ref.mid( pos, ref.find( '&', pos ) - pos );
+
// Parse value
pos = ref.find( "value=", 0, false ) + 6;
QString valueStr = ref.mid( pos, ref.find( ' ', pos ) - pos );
-
- if ( typeStr == "Strongs" )
+
+ if ( actionStr == "Strongs" )
+ {
+ QString module = actionStr;
+ module.append( typeStr );
+
+ // Open reference
+ openModule( module, valueStr );
+ }
+ else if ( actionStr == "Morph" )
{
- //Determine if is a Hebrew or Greek reference
- QString module;
- if ( valueStr.at( 0 ) == 'H' )
- module = "StrongsHebrew";
- else
- module = "StrongsGreek";
-
- // Get key
- QString key( valueStr );
- key.remove( 0, 1 );
+ QString module = typeStr.mid( 2, typeStr.find( '%', 2 ) - 2 );
+
// Open reference
- openModule( module, key );
+ openModule( module, valueStr );
}
- else if ( typeStr == "morph" )
+ else if ( actionStr == "Note" )
{
- QMessageBox::information( this, tr( "Morphological Tags" ),
- tr( "Morphological tag cross-referencing not implemented yet." ) );
+ // TODO
}
}
}
}
diff --git a/noncore/apps/dagger/opie-dagger.control b/noncore/apps/dagger/opie-dagger.control
index 4ded1f2..e613ddb 100644
--- a/noncore/apps/dagger/opie-dagger.control
+++ b/noncore/apps/dagger/opie-dagger.control
@@ -1,9 +1,9 @@
Package: opie-dagger
Files: plugins/application/libdagger.so* bin/dagger pics/dagger apps/Applications/dagger.desktop
Priority: optional
Section: opie/applications
Depends: task-opie-minimal, libopiecore2, libopieui2
Architecture: arm
Maintainer: Dan Williams (drw@handhelds.org)
Description: A Bible study program utilizing the Sword library.
-Version: 0.9.1$EXTRAVERSION
+Version: 0.9.2$EXTRAVERSION
diff --git a/noncore/apps/dagger/searchbar.cpp b/noncore/apps/dagger/searchbar.cpp
index b195f67..463a19f 100644
--- a/noncore/apps/dagger/searchbar.cpp
+++ b/noncore/apps/dagger/searchbar.cpp
@@ -30,129 +30,129 @@ file; see the file COPYING. If not, write to the Free Software Foundation, Inc.,
#include <listkey.h>
#include <regex.h>
#include <versekey.h>
void searchCallback( char /*percent*/, void */*userData*/ )
{
qApp->processEvents();
}
SearchBar::SearchBar( QMainWindow *parent )
: QToolBar( QString::null, parent, QMainWindow::Top, true )
, m_currText( 0x0 )
{
// Initialize UI
m_searchText = new QLineEdit( this );
setStretchableWidget( m_searchText );
QWhatsThis::add( m_searchText, tr( "Enter text to search for here." ) );
connect(m_searchText, SIGNAL(textChanged(const QString &)),
this, SLOT(slotTextChanged(const QString &)) );
m_actionFind = new QAction( tr( "Find" ),
Opie::Core::OResource::loadPixmap( "find", Opie::Core::OResource::SmallIcon ),
QString::null, 0, this, 0 );
m_actionFind->setEnabled( false );
m_actionFind->addTo( this );
m_actionFind->setWhatsThis( tr( "Tap here search the current module for the text entered to the left." ) );
connect( m_actionFind, SIGNAL(activated()), this, SLOT(slotFind()) );
addSeparator();
m_actionPrev = new QAction( tr( "Previous result" ),
Opie::Core::OResource::loadPixmap( "back", Opie::Core::OResource::SmallIcon ),
QString::null, 0, this, 0 );
m_actionPrev->setEnabled( false );
m_actionPrev->addTo( this );
m_actionPrev->setWhatsThis( tr( "Tap here to view the previous search result." ) );
connect( m_actionPrev, SIGNAL(activated()), this, SLOT(slotPrev()) );
m_resultList = new QComboBox( this );
m_resultList->setEnabled( false );
QWhatsThis::add( m_resultList, tr( "Select the desired search result here." ) );
connect( m_resultList, SIGNAL(activated(const QString &)), this, SIGNAL(sigResultClicked(const QString &)) );
m_actionNext = new QAction( tr( "Next result" ),
Opie::Core::OResource::loadPixmap( "forward", Opie::Core::OResource::SmallIcon ),
QString::null, 0, this, 0 );
m_actionNext->setEnabled( false );
m_actionNext->addTo( this );
m_actionNext->setWhatsThis( tr( "Tap here to view the next search result." ) );
connect( m_actionNext, SIGNAL(activated()), this, SLOT(slotNext()) );
if ( parent )
{
installEventFilter( parent );
// TODO - install for all controls
m_searchText->installEventFilter( parent );
}
}
void SearchBar::setCurrModule( TextWidget *currText )
{
m_actionFind->setEnabled( ( m_searchText->text() != "" ) && currText );
- if ( !m_currText || ( currText->getModuleName() != m_currText->getModuleName() ) )
+ if ( !m_currText || !currText || ( currText->getModuleName() != m_currText->getModuleName() ) )
{
m_actionPrev->setEnabled( false );
m_resultList->clear();
m_resultList->setEnabled( false );
m_actionNext->setEnabled( false );
}
m_currText = currText;
}
void SearchBar::slotTextChanged( const QString &newText )
{
m_actionFind->setEnabled( ( newText != "" ) && m_currText );
}
void SearchBar::slotFind()
{
m_resultList->clear();
// Change application title and display Opie wait dialog to indicate search is beginning
QWidget *pWidget = reinterpret_cast<QWidget *>(parent());
QString caption = pWidget->caption();
pWidget->setCaption( "Searching..." );
Opie::Ui::OWait wait( pWidget );
wait.show();
qApp->processEvents();
// Perform search
// TODO - implement search callback function to animate wait cursor
sword::ListKey results = m_currText->getModule()->Search( m_searchText->text().latin1(), 0, REG_ICASE, 0, 0,
&searchCallback );
// Process results
int count = results.Count();
bool found = count > 0;
if ( found )
{
// Populate results combo box
sword::VerseKey key;
for ( int i = 0; i < count; i++ )
{
key.setText( results.GetElement( i )->getText() );
m_resultList->insertItem( key.getShortText() );
}
// Goto first result in list
m_resultList->setCurrentItem( 0 );
emit sigResultClicked( m_resultList->currentText() );
}
else
{
// Reset application title
pWidget->setCaption( caption );
}
// UI clean-up
wait.hide();
m_actionPrev->setEnabled( false );
m_resultList->setEnabled( found );
m_actionNext->setEnabled( count > 1 );
}