author | drw <drw> | 2005-08-09 22:24:10 (UTC) |
---|---|---|
committer | drw <drw> | 2005-08-09 22:24:10 (UTC) |
commit | 0c362cbc72dfbff246c0f11417d364b45b50ec94 (patch) (side-by-side diff) | |
tree | 6e1fcdc99ff40752343d7b4c99822eba591a2f15 | |
parent | 873a383cfc4f9184adfe9257500df8c03648b0fd (diff) | |
download | opie-0c362cbc72dfbff246c0f11417d364b45b50ec94.zip opie-0c362cbc72dfbff246c0f11417d364b45b50ec94.tar.gz opie-0c362cbc72dfbff246c0f11417d364b45b50ec94.tar.bz2 |
Several updates to Dagger, see /noncore/apps/dagger/ChangeLog for more information
-rw-r--r-- | noncore/apps/dagger/ChangeLog | 8 | ||||
-rw-r--r-- | noncore/apps/dagger/README | 8 | ||||
-rw-r--r-- | noncore/apps/dagger/TODO | 7 | ||||
-rw-r--r-- | noncore/apps/dagger/mainwindow.cpp | 68 | ||||
-rw-r--r-- | noncore/apps/dagger/opie-dagger.control | 2 | ||||
-rw-r--r-- | noncore/apps/dagger/searchbar.cpp | 2 |
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 ); } |