summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/dagger/mainwindow.cpp61
1 files changed, 46 insertions, 15 deletions
diff --git a/noncore/apps/dagger/mainwindow.cpp b/noncore/apps/dagger/mainwindow.cpp
index e886bd8..3dd9eff 100644
--- a/noncore/apps/dagger/mainwindow.cpp
+++ b/noncore/apps/dagger/mainwindow.cpp
@@ -1,129 +1,130 @@
1/* 1/*
2Dagger - A Bible study program utilizing the Sword library. 2Dagger - A Bible study program utilizing the Sword library.
3Copyright (c) 2004 Dan Williams <drw@handhelds.org> 3Copyright (c) 2004 Dan Williams <drw@handhelds.org>
4 4
5This file is free software; you can redistribute it and/or modify it under 5This file is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License as published by the Free Software 6the terms of the GNU General Public License as published by the Free Software
7Foundation; either version 2 of the License, or (at your option) any later version. 7Foundation; either version 2 of the License, or (at your option) any later version.
8 8
9This file is distributed in the hope that it will be useful, but WITHOUT ANY 9This file is distributed in the hope that it will be useful, but WITHOUT ANY
10WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A 10WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
11PARTICULAR PURPOSE. See the GNU General Public License for more details. 11PARTICULAR PURPOSE. See the GNU General Public License for more details.
12 12
13You should have received a copy of the GNU General Public License along with this 13You should have received a copy of the GNU General Public License along with this
14file; see the file COPYING. If not, write to the Free Software Foundation, Inc., 14file; see the file COPYING. If not, write to the Free Software Foundation, Inc.,
1559 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 1559 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16*/ 16*/
17 17
18#include "mainwindow.h" 18#include "mainwindow.h"
19#include "navbar.h" 19#include "navbar.h"
20#include "searchbar.h" 20#include "searchbar.h"
21#include "opentextdlg.h" 21#include "opentextdlg.h"
22#include "configuredlg.h" 22#include "configuredlg.h"
23#include "textwidget.h" 23#include "textwidget.h"
24 24
25#include <opie2/odebug.h> 25#include <opie2/odebug.h>
26 26
27#include <qpe/qcopenvelope_qws.h> 27#include <qpe/qcopenvelope_qws.h>
28#include <qpe/qpeapplication.h> 28#include <qpe/qpeapplication.h>
29#include <qpe/resource.h> 29#include <qpe/resource.h>
30 30
31#include <qaction.h> 31#include <qaction.h>
32#include <qclipboard.h> 32#include <qclipboard.h>
33#include <qmenubar.h> 33#include <qmenubar.h>
34#include <qmessagebox.h>
34#include <qobjectlist.h> 35#include <qobjectlist.h>
35#include <qpopupmenu.h> 36#include <qpopupmenu.h>
36#include <qtimer.h> 37#include <qtimer.h>
37#include <qtoolbar.h> 38#include <qtoolbar.h>
38 39
39#include <markupfiltmgr.h> 40#include <markupfiltmgr.h>
40 41
41MainWindow::MainWindow( QWidget *parent, const char *name, WFlags /*fl*/ ) 42MainWindow::MainWindow( QWidget *parent, const char *name, WFlags /*fl*/ )
42 : QMainWindow( parent, name, WStyle_ContextHelp ) 43 : QMainWindow( parent, name, WStyle_ContextHelp )
43 , m_config( "dagger" ) 44 , m_config( "dagger" )
44 , m_tabs( this ) 45 , m_tabs( this )
45 , m_autoScrollTimer( this ) 46 , m_autoScrollTimer( this )
46{ 47{
47 // Initialize sword library manager 48 // Initialize sword library manager
48 m_config.setGroup( "Sword" ); 49 m_config.setGroup( "Sword" );
49 m_modulePath = m_config.readEntry( "ModPath", "/usr/local/share/sword" ); 50 m_modulePath = m_config.readEntry( "ModPath", "/usr/local/share/sword" );
50 m_swordMgr = new sword::SWMgr( m_modulePath.latin1(), true, 51 m_swordMgr = new sword::SWMgr( m_modulePath.latin1(), true,
51 new sword::MarkupFilterMgr( sword::FMT_HTMLHREF ) ); 52 new sword::MarkupFilterMgr( sword::FMT_HTMLHREF ) );
52 53
53 // Retrieve list of available Sword module options (e.g. footnotes, Strong's numbers, etc.) 54 // Retrieve list of available Sword module options (e.g. footnotes, Strong's numbers, etc.)
54 sword::StringList swordOpts = m_swordMgr->getGlobalOptions(); 55 sword::StringList swordOpts = m_swordMgr->getGlobalOptions();
55 for ( sword::StringList::iterator it = swordOpts.begin(); it != swordOpts.end(); it++ ) 56 for ( sword::StringList::iterator it = swordOpts.begin(); it != swordOpts.end(); it++ )
56 m_actionSwordOpts.append( new QAction( (*it).c_str(), QString::null, 0, this, 0 ) ); 57 m_actionSwordOpts.append( new QAction( (*it).c_str(), QString::null, 0, this, 0 ) );
57 m_actionSwordOpts.sort(); 58 m_actionSwordOpts.sort();
58 59
59 // Initialize user interface 60 // Initialize user interface
60 setCaption( tr( "Dagger" ) ); 61 setCaption( tr( "Dagger" ) );
61 initUI(); 62 initUI();
62 63
63 connect( &m_tabs, SIGNAL(currentChanged(QWidget *)), this, SLOT( slotTextDisplayed(QWidget *)) ); 64 connect( &m_tabs, SIGNAL(currentChanged(QWidget *)), this, SLOT( slotTextDisplayed(QWidget *)) );
64 connect( &m_autoScrollTimer, SIGNAL(timeout()), this, SLOT(slotNavNextVerse()) ); 65 connect( &m_autoScrollTimer, SIGNAL(timeout()), this, SLOT(slotNavNextVerse()) );
65 66
66 m_bibleIcon = new QPixmap( Resource::loadPixmap( "dagger/bibletext" ) ); 67 m_bibleIcon = new QPixmap( Resource::loadPixmap( "dagger/bibletext" ) );
67 m_commentaryIcon = new QPixmap( Resource::loadPixmap( "dagger/commentary" ) ); 68 m_commentaryIcon = new QPixmap( Resource::loadPixmap( "dagger/commentary" ) );
68 m_lexiconIcon = new QPixmap( Resource::loadPixmap( "dagger/lexicon" ) ); 69 m_lexiconIcon = new QPixmap( Resource::loadPixmap( "dagger/lexicon" ) );
69 70
70 // Load initial configuration 71 // Load initial configuration
71 QTimer::singleShot( 100, this, SLOT( initConfig() ) ); 72 QTimer::singleShot( 100, this, SLOT( initConfig() ) );
72} 73}
73 74
74MainWindow::~MainWindow() 75MainWindow::~MainWindow()
75{ 76{
76 // Re-enable screen blanking if it was disabled 77 // Re-enable screen blanking if it was disabled
77 QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; 78 QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
78 79
79 // Save Sword options 80 // Save Sword options
80 m_config.setGroup( "Sword" ); 81 m_config.setGroup( "Sword" );
81 m_config.writeEntry( "ModPath", m_modulePath ); 82 m_config.writeEntry( "ModPath", m_modulePath );
82 83
83 for ( QAction *a = m_actionSwordOpts.first(); a; a = m_actionSwordOpts.next() ) 84 for ( QAction *a = m_actionSwordOpts.first(); a; a = m_actionSwordOpts.next() )
84 m_config.writeEntry( a->text(), a->isOn() ); 85 m_config.writeEntry( a->text(), a->isOn() );
85 86
86 // Save configuration options 87 // Save configuration options
87 m_config.setGroup( "Config" ); 88 m_config.setGroup( "Config" );
88 m_config.writeEntry( "AlwaysOpenNew", m_alwaysOpenNew ); 89 m_config.writeEntry( "AlwaysOpenNew", m_alwaysOpenNew );
89 m_config.writeEntry( "AutoScroll", m_navToolbar->autoScrollRate() ); 90 m_config.writeEntry( "AutoScroll", m_navToolbar->autoScrollRate() );
90 m_config.writeEntry( "DisableScreenBlanking", m_disableScreenBlank ); 91 m_config.writeEntry( "DisableScreenBlanking", m_disableScreenBlank );
91 m_config.writeEntry( "CopyFormat", m_copyFormat ); 92 m_config.writeEntry( "CopyFormat", m_copyFormat );
92 m_config.writeEntry( "NavBar", m_actionViewNavToolbar->isOn() ); 93 m_config.writeEntry( "NavBar", m_actionViewNavToolbar->isOn() );
93 m_config.writeEntry( "NumVerses", m_numVerses ); 94 m_config.writeEntry( "NumVerses", m_numVerses );
94 m_config.writeEntry( "SearchBar", m_actionViewSearchToolbar->isOn() ); 95 m_config.writeEntry( "SearchBar", m_actionViewSearchToolbar->isOn() );
95 96
96 // Save text font 97 // Save text font
97 m_config.setGroup( "Font"); 98 m_config.setGroup( "Font");
98 m_config.writeEntry( "Family", m_textFont.family() ); 99 m_config.writeEntry( "Family", m_textFont.family() );
99 m_config.writeEntry( "Italic", m_textFont.italic() ); 100 m_config.writeEntry( "Italic", m_textFont.italic() );
100 m_config.writeEntry( "Size", m_textFont.pointSize() ); 101 m_config.writeEntry( "Size", m_textFont.pointSize() );
101 m_config.writeEntry( "Weight", m_textFont.weight() ); 102 m_config.writeEntry( "Weight", m_textFont.weight() );
102 103
103 // Save bookmarks 104 // Save bookmarks
104 m_config.setGroup( "Bookmarks"); 105 m_config.setGroup( "Bookmarks");
105 m_config.clearGroup(); 106 m_config.clearGroup();
106 int index = 3; 107 int index = 3;
107 int id = m_bookmarkMenu->idAt( index ); 108 int id = m_bookmarkMenu->idAt( index );
108 while ( id != -1 ) 109 while ( id != -1 )
109 { 110 {
110 QString bookmark = m_bookmarkMenu->text( id ); 111 QString bookmark = m_bookmarkMenu->text( id );
111 int pos = bookmark.find( " (" ); 112 int pos = bookmark.find( " (" );
112 QString key = bookmark.left( pos ); 113 QString key = bookmark.left( pos );
113 pos += 2; 114 pos += 2;
114 QString module = bookmark.mid( pos, bookmark.find( ")", pos ) - pos ); 115 QString module = bookmark.mid( pos, bookmark.find( ")", pos ) - pos );
115 QString modkey; 116 QString modkey;
116 modkey.sprintf( "%s/%s", module.latin1(), key.latin1() ); 117 modkey.sprintf( "%s/%s", module.latin1(), key.latin1() );
117 m_config.writeEntry( QString::number( index - 2 ), modkey ); 118 m_config.writeEntry( QString::number( index - 2 ), modkey );
118 119
119 ++index; 120 ++index;
120 id = m_bookmarkMenu->idAt( index ); 121 id = m_bookmarkMenu->idAt( index );
121 } 122 }
122 123
123 // Save opened modules 124 // Save opened modules
124 m_config.setGroup( "Session"); 125 m_config.setGroup( "Session");
125 m_config.clearGroup(); 126 m_config.clearGroup();
126 QObjectList *childlist = queryList( "TextWidget" ); 127 QObjectList *childlist = queryList( "TextWidget" );
127 QObjectListIt it( *childlist ); 128 QObjectListIt it( *childlist );
128 TextWidget *module; 129 TextWidget *module;
129 int count = 1; 130 int count = 1;
@@ -594,120 +595,150 @@ void MainWindow::slotViewNavToolbar( bool enabled )
594 : m_navToolbar->hide(); 595 : m_navToolbar->hide();
595} 596}
596 597
597void MainWindow::slotViewSearchToolbar( bool enabled ) 598void MainWindow::slotViewSearchToolbar( bool enabled )
598{ 599{
599 enabled ? m_searchToolbar->show() 600 enabled ? m_searchToolbar->show()
600 : m_searchToolbar->hide(); 601 : m_searchToolbar->hide();
601} 602}
602 603
603void MainWindow::slotNavPrevPage() 604void MainWindow::slotNavPrevPage()
604{ 605{
605 TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget()); 606 TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget());
606 if ( text ) 607 if ( text )
607 { 608 {
608 text->prevPage(); 609 text->prevPage();
609 setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) ); 610 setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) );
610 m_navToolbar->setKey( text->getAbbrevKey() ); 611 m_navToolbar->setKey( text->getAbbrevKey() );
611 } 612 }
612} 613}
613 614
614void MainWindow::slotNavPrevVerse() 615void MainWindow::slotNavPrevVerse()
615{ 616{
616 TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget()); 617 TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget());
617 if ( text ) 618 if ( text )
618 { 619 {
619 text->prevVerse(); 620 text->prevVerse();
620 setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) ); 621 setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) );
621 m_navToolbar->setKey( text->getAbbrevKey() ); 622 m_navToolbar->setKey( text->getAbbrevKey() );
622 } 623 }
623} 624}
624 625
625void MainWindow::slotNavKeyChanged( const QString &newKey ) 626void MainWindow::slotNavKeyChanged( const QString &newKey )
626{ 627{
627 QString key = newKey; 628 QString key = newKey;
628 key.replace( QRegExp( "[-=.]" ), ":" ); 629 key.replace( QRegExp( "[-=.]" ), ":" );
629 630
630 TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget()); 631 TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget());
631 if ( text ) 632 if ( text )
632 { 633 {
633 text->setKey( key ); 634 text->setKey( key );
634 setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) ); 635 setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) );
635 } 636 }
636} 637}
637 638
638void MainWindow::slotNavNextVerse() 639void MainWindow::slotNavNextVerse()
639{ 640{
640 TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget()); 641 TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget());
641 if ( text ) 642 if ( text )
642 { 643 {
643 text->nextVerse(); 644 text->nextVerse();
644 setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) ); 645 setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) );
645 m_navToolbar->setKey( text->getAbbrevKey() ); 646 m_navToolbar->setKey( text->getAbbrevKey() );
646 } 647 }
647} 648}
648 649
649void MainWindow::slotNavNextPage() 650void MainWindow::slotNavNextPage()
650{ 651{
651 TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget()); 652 TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget());
652 if ( text ) 653 if ( text )
653 { 654 {
654 text->nextPage(); 655 text->nextPage();
655 setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) ); 656 setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) );
656 m_navToolbar->setKey( text->getAbbrevKey() ); 657 m_navToolbar->setKey( text->getAbbrevKey() );
657 } 658 }
658} 659}
659 660
660void MainWindow::slotNavAutoScroll( bool enabled ) 661void MainWindow::slotNavAutoScroll( bool enabled )
661{ 662{
662 m_autoScrollTimer.stop(); 663 m_autoScrollTimer.stop();
663 664
664 if ( enabled ) 665 if ( enabled )
665 m_autoScrollTimer.start( m_navToolbar->autoScrollRate() * 100 ); 666 m_autoScrollTimer.start( m_navToolbar->autoScrollRate() * 100 );
666} 667}
667 668
668void MainWindow::slotNavScrollRateChanged( int newRate ) 669void MainWindow::slotNavScrollRateChanged( int newRate )
669{ 670{
670 if ( m_autoScrollTimer.isActive() ) 671 if ( m_autoScrollTimer.isActive() )
671 { 672 {
672 m_autoScrollTimer.stop(); 673 m_autoScrollTimer.stop();
673 m_autoScrollTimer.start( newRate * 100 ); 674 m_autoScrollTimer.start( newRate * 100 );
674 } 675 }
675} 676}
676 677
677void MainWindow::slotSearchResultClicked( const QString &key ) 678void MainWindow::slotSearchResultClicked( const QString &key )
678{ 679{
679 TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget()); 680 TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget());
680 if ( text ) 681 if ( text )
681 { 682 {
682 text->setKey( key ); 683 text->setKey( key );
683 setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) ); 684 setCaption( QString( "%1 - Dagger" ).arg( text->getFullKey() ) );
684 m_navToolbar->setKey( text->getAbbrevKey() ); 685 m_navToolbar->setKey( text->getAbbrevKey() );
685 } 686 }
686} 687}
687 688
688void MainWindow::slotTextRefClicked( const QString &ref ) 689void MainWindow::slotTextRefClicked( const QString &ref )
689{ 690{
691//printf( "Ref clicked: '%s'\n", ref.latin1() );
692/*
693Ref clicked: 'type=Strongs value=G3482'
694Ref clicked: 'type=Strongs value=H07225'
695Ref clicked: 'type=morph class=x-Robinson:N-PRI value=N-PRI'
696Ref clicked: 'type=morph class=x-StrongsMorph:TH8804 value=TH8804'
697*/
690 //owarn << "Reference: " << ref << oendl; 698 //owarn << "Reference: " << ref << oendl;
691 if ( !ref.isNull() ) 699 if ( !ref.isNull() )
692 { 700 {
693 TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget()); 701 TextWidget *text = reinterpret_cast<TextWidget *>(m_tabs.currentWidget());
694 if ( text ) 702 if ( text )
695 { 703 {
696 QString module; 704 // Parse type
697 QString key( ref ); 705 int pos = ref.find( "type=", 0, false ) + 5;
698 key.remove( 0, 2 ); 706 QString typeStr = ref.mid( pos, ref.find( ' ', pos ) - pos );
699 707
700 QChar book = ref.at( 1 ); 708 // Parse class (for morph. only)
701 // TODO- this is ugly, need better way to determine type of reference 709 QString classStr;
702 // take a look at SWModule::getRawEntry() 710 if ( typeStr == "morph" )
703 int keyValue = key.toInt(); 711 {
704 if ( book == 'H' && keyValue <= 8674 ) 712 pos = ref.find( "class=", 0, false ) + 5;
705 module = "StrongsHebrew"; 713 QString classStr = ref.mid( pos, ref.find( ' ', pos ) - pos );
706 else if ( book == 'G' && keyValue <= 5624 ) 714
707 module = "StrongsGreek"; 715 // TODO - need to strip 'x-' from beginning and ':key' at end?
708 716 }
709 if ( !module.isEmpty() ) 717
710 openModule( module, key ); 718 // Parse value
719 pos = ref.find( "value=", 0, false ) + 6;
720 QString valueStr = ref.mid( pos, ref.find( ' ', pos ) - pos );
721
722 if ( typeStr == "Strongs" )
723 {
724 //Determine if is a Hebrew or Greek reference
725 QString module;
726 if ( valueStr.at( 0 ) == 'H' )
727 module = "StrongsHebrew";
728 else
729 module = "StrongsGreek";
730
731 // Get key
732 QString key( valueStr );
733 key.remove( 0, 1 );
734 // Open reference
735 openModule( module, key );
736 }
737 else if ( typeStr == "morph" )
738 {
739 QMessageBox::information( this, tr( "Morphological Tags" ),
740 tr( "Morphological tag cross-referencing not implemented yet." ) );
741 }
711 } 742 }
712 } 743 }
713} 744}