summaryrefslogtreecommitdiff
path: root/bibletime
diff options
context:
space:
mode:
authorRoberto C. Sanchez <roberto@connexer.com>2014-10-21 22:48:10 -0400
committerRoberto C. Sanchez <roberto@connexer.com>2014-10-21 22:48:10 -0400
commit15ce9a1454eebac8cfd1eca41da70ae80ece1baa (patch)
treea8b8a5fe8b4cf48ef6eb8e72cc81139ad1d0eb9e /bibletime
Imported Upstream version 1.1
Diffstat (limited to 'bibletime')
-rw-r--r--bibletime/Makefile.am80
-rw-r--r--bibletime/Makefile.in753
-rw-r--r--bibletime/backend/Makefile.am47
-rw-r--r--bibletime/backend/Makefile.in622
-rw-r--r--bibletime/backend/bt_basicfilter.cpp202
-rw-r--r--bibletime/backend/bt_basicfilter.h76
-rw-r--r--bibletime/backend/bt_gbfhtml.cpp156
-rw-r--r--bibletime/backend/bt_gbfhtml.h48
-rw-r--r--bibletime/backend/bt_thmlhtml.cpp225
-rw-r--r--bibletime/backend/bt_thmlhtml.h35
-rw-r--r--bibletime/backend/chtmlbookdisplay.cpp81
-rw-r--r--bibletime/backend/chtmlbookdisplay.h44
-rw-r--r--bibletime/backend/chtmlchapterdisplay.cpp160
-rw-r--r--bibletime/backend/chtmlchapterdisplay.h43
-rw-r--r--bibletime/backend/chtmlentrydisplay.cpp179
-rw-r--r--bibletime/backend/chtmlentrydisplay.h110
-rw-r--r--bibletime/backend/creferencemanager.cpp255
-rw-r--r--bibletime/backend/creferencemanager.h83
-rw-r--r--bibletime/backend/cswordbackend.cpp368
-rw-r--r--bibletime/backend/cswordbackend.h215
-rw-r--r--bibletime/backend/cswordbiblemoduleinfo.cpp195
-rw-r--r--bibletime/backend/cswordbiblemoduleinfo.h96
-rw-r--r--bibletime/backend/cswordbookmoduleinfo.cpp100
-rw-r--r--bibletime/backend/cswordbookmoduleinfo.h63
-rw-r--r--bibletime/backend/cswordcommentarymoduleinfo.cpp31
-rw-r--r--bibletime/backend/cswordcommentarymoduleinfo.h45
-rw-r--r--bibletime/backend/cswordkey.cpp90
-rw-r--r--bibletime/backend/cswordkey.h64
-rw-r--r--bibletime/backend/cswordldkey.cpp103
-rw-r--r--bibletime/backend/cswordldkey.h102
-rw-r--r--bibletime/backend/cswordlexiconmoduleinfo.cpp122
-rw-r--r--bibletime/backend/cswordlexiconmoduleinfo.h72
-rw-r--r--bibletime/backend/cswordmoduleinfo.cpp258
-rw-r--r--bibletime/backend/cswordmoduleinfo.h197
-rw-r--r--bibletime/backend/cswordmodulesearch.cpp189
-rw-r--r--bibletime/backend/cswordmodulesearch.h159
-rw-r--r--bibletime/backend/cswordtreekey.cpp83
-rw-r--r--bibletime/backend/cswordtreekey.h56
-rw-r--r--bibletime/backend/cswordversekey.cpp172
-rw-r--r--bibletime/backend/cswordversekey.h119
-rw-r--r--bibletime/backend/st31vJFMbin0 -> 8146944 bytes
-rw-r--r--bibletime/bibletime.cpp266
-rw-r--r--bibletime/bibletime.h362
-rw-r--r--bibletime/bibletime_init.cpp365
-rw-r--r--bibletime/bibletime_slots.cpp429
-rw-r--r--bibletime/bt-printing98
-rw-r--r--bibletime/frontend/Makefile.am44
-rw-r--r--bibletime/frontend/Makefile.in720
-rw-r--r--bibletime/frontend/cbtconfig.cpp374
-rw-r--r--bibletime/frontend/cbtconfig.h131
-rw-r--r--bibletime/frontend/cexportmanager.cpp212
-rw-r--r--bibletime/frontend/cexportmanager.h53
-rw-r--r--bibletime/frontend/chtmldialog.cpp154
-rw-r--r--bibletime/frontend/chtmldialog.h67
-rw-r--r--bibletime/frontend/chtmlwidget.cpp747
-rw-r--r--bibletime/frontend/chtmlwidget.h291
-rw-r--r--bibletime/frontend/cinputdialog.cpp103
-rw-r--r--bibletime/frontend/cinputdialog.h49
-rw-r--r--bibletime/frontend/cmdiarea.cpp284
-rw-r--r--bibletime/frontend/cmdiarea.h143
-rw-r--r--bibletime/frontend/coptionsdialog.cpp806
-rw-r--r--bibletime/frontend/coptionsdialog.h210
-rw-r--r--bibletime/frontend/cpointers.cpp52
-rw-r--r--bibletime/frontend/cpointers.h48
-rw-r--r--bibletime/frontend/cprofile.cpp375
-rw-r--r--bibletime/frontend/cprofile.h95
-rw-r--r--bibletime/frontend/cprofilemgr.cpp115
-rw-r--r--bibletime/frontend/cprofilemgr.h71
-rw-r--r--bibletime/frontend/cprofilewindow.cpp105
-rw-r--r--bibletime/frontend/cprofilewindow.h110
-rw-r--r--bibletime/frontend/ctoolclass.cpp185
-rw-r--r--bibletime/frontend/ctoolclass.h84
-rw-r--r--bibletime/frontend/groupmanager/Makefile.am18
-rw-r--r--bibletime/frontend/groupmanager/Makefile.in608
-rw-r--r--bibletime/frontend/groupmanager/cgroupmanager.cpp1615
-rw-r--r--bibletime/frontend/groupmanager/cgroupmanager.h275
-rw-r--r--bibletime/frontend/groupmanager/cgroupmanageritem.cpp287
-rw-r--r--bibletime/frontend/groupmanager/cgroupmanageritem.h190
-rw-r--r--bibletime/frontend/keychooser/Makefile.am25
-rw-r--r--bibletime/frontend/keychooser/Makefile.in643
-rw-r--r--bibletime/frontend/keychooser/cbiblekeychooser.cpp290
-rw-r--r--bibletime/frontend/keychooser/cbiblekeychooser.h130
-rw-r--r--bibletime/frontend/keychooser/cbookkeychooser.cpp181
-rw-r--r--bibletime/frontend/keychooser/cbookkeychooser.h101
-rw-r--r--bibletime/frontend/keychooser/cbooktreechooser.cpp183
-rw-r--r--bibletime/frontend/keychooser/cbooktreechooser.h101
-rw-r--r--bibletime/frontend/keychooser/cfx_btn.cpp99
-rw-r--r--bibletime/frontend/keychooser/cfx_btn.h91
-rw-r--r--bibletime/frontend/keychooser/ckeychooser.cpp48
-rw-r--r--bibletime/frontend/keychooser/ckeychooser.h93
-rw-r--r--bibletime/frontend/keychooser/ckeychooserwidget.cpp458
-rw-r--r--bibletime/frontend/keychooser/ckeychooserwidget.h229
-rw-r--r--bibletime/frontend/keychooser/clexiconkeychooser.cpp101
-rw-r--r--bibletime/frontend/keychooser/clexiconkeychooser.h88
-rw-r--r--bibletime/frontend/kstartuplogo.cpp95
-rw-r--r--bibletime/frontend/kstartuplogo.h51
-rw-r--r--bibletime/frontend/presenters/Makefile.am28
-rw-r--r--bibletime/frontend/presenters/Makefile.in652
-rw-r--r--bibletime/frontend/presenters/cbiblepresenter.cpp431
-rw-r--r--bibletime/frontend/presenters/cbiblepresenter.h94
-rw-r--r--bibletime/frontend/presenters/cbookpresenter.cpp258
-rw-r--r--bibletime/frontend/presenters/cbookpresenter.h77
-rw-r--r--bibletime/frontend/presenters/ccommentarypresenter.cpp524
-rw-r--r--bibletime/frontend/presenters/ccommentarypresenter.h132
-rw-r--r--bibletime/frontend/presenters/cdisplaysettingsbutton.cpp138
-rw-r--r--bibletime/frontend/presenters/cdisplaysettingsbutton.h79
-rw-r--r--bibletime/frontend/presenters/clexiconpresenter.cpp280
-rw-r--r--bibletime/frontend/presenters/clexiconpresenter.h75
-rw-r--r--bibletime/frontend/presenters/cmodulechooserbar.cpp129
-rw-r--r--bibletime/frontend/presenters/cmodulechooserbar.h76
-rw-r--r--bibletime/frontend/presenters/cmodulechooserbutton.cpp145
-rw-r--r--bibletime/frontend/presenters/cmodulechooserbutton.h62
-rw-r--r--bibletime/frontend/presenters/cswordpresenter.cpp273
-rw-r--r--bibletime/frontend/presenters/cswordpresenter.h184
-rw-r--r--bibletime/frontend/searchdialog/Makefile.am26
-rw-r--r--bibletime/frontend/searchdialog/Makefile.in646
-rw-r--r--bibletime/frontend/searchdialog/csearchdialog.cpp290
-rw-r--r--bibletime/frontend/searchdialog/csearchdialog.h136
-rw-r--r--bibletime/frontend/searchdialog/csearchdialoganalysis.cpp446
-rw-r--r--bibletime/frontend/searchdialog/csearchdialoganalysis.h187
-rw-r--r--bibletime/frontend/searchdialog/csearchdialogmodulechooser.cpp215
-rw-r--r--bibletime/frontend/searchdialog/csearchdialogmodulechooser.h71
-rw-r--r--bibletime/frontend/searchdialog/csearchdialogresult.cpp182
-rw-r--r--bibletime/frontend/searchdialog/csearchdialogresult.h66
-rw-r--r--bibletime/frontend/searchdialog/csearchdialogresultview.cpp437
-rw-r--r--bibletime/frontend/searchdialog/csearchdialogresultview.h200
-rw-r--r--bibletime/frontend/searchdialog/csearchdialogscope.cpp373
-rw-r--r--bibletime/frontend/searchdialog/csearchdialogscope.h98
-rw-r--r--bibletime/frontend/searchdialog/csearchdialogtext.cpp216
-rw-r--r--bibletime/frontend/searchdialog/csearchdialogtext.h92
-rw-r--r--bibletime/frontend/thirdparty/Makefile.am10
-rw-r--r--bibletime/frontend/thirdparty/Makefile.in646
-rw-r--r--bibletime/frontend/thirdparty/dummy.cpp0
-rw-r--r--bibletime/frontend/thirdparty/qt3stuff/Makefile.am25
-rw-r--r--bibletime/frontend/thirdparty/qt3stuff/Makefile.in610
-rw-r--r--bibletime/frontend/thirdparty/qt3stuff/qcleanuphandler.h113
-rw-r--r--bibletime/frontend/thirdparty/qt3stuff/qcomplextext.cpp1313
-rw-r--r--bibletime/frontend/thirdparty/qt3stuff/qcomplextext_p.h102
-rw-r--r--bibletime/frontend/thirdparty/qt3stuff/qrichtext.cpp7124
-rw-r--r--bibletime/frontend/thirdparty/qt3stuff/qrichtext_p.h2446
-rw-r--r--bibletime/frontend/thirdparty/qt3stuff/qstylesheet.cpp1349
-rw-r--r--bibletime/frontend/thirdparty/qt3stuff/qstylesheet.h215
-rw-r--r--bibletime/frontend/thirdparty/qt3stuff/qt3stuff.h87
-rw-r--r--bibletime/frontend/thirdparty/qt3stuff/qtextedit.cpp539
-rw-r--r--bibletime/frontend/thirdparty/qt3stuff/qtextedit.h394
-rw-r--r--bibletime/frontend/thirdparty/qt3stuff/qtextview.cpp3155
-rw-r--r--bibletime/frontend/thirdparty/qt3stuff/qtextview.h377
-rw-r--r--bibletime/main.cpp220
-rw-r--r--bibletime/pics/Makefile.am29
-rw-r--r--bibletime/pics/Makefile.in494
-rwxr-xr-xbibletime/pics/gen_am.sh54
-rw-r--r--bibletime/pics/highcolor/16x16/Makefile.am7
-rw-r--r--bibletime/pics/highcolor/16x16/Makefile.in416
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_bible.pngbin0 -> 586 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_bible_add.pngbin0 -> 599 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_bible_locked.pngbin0 -> 716 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_book.pngbin0 -> 583 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_book_add.pngbin0 -> 599 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_book_locked.pngbin0 -> 683 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_cascade.pngbin0 -> 295 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_cascade_auto.pngbin0 -> 325 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_commentary.pngbin0 -> 622 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_commentary_add.pngbin0 -> 631 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_commentary_locked.pngbin0 -> 724 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_displayconfig.pngbin0 -> 742 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_lexicon.pngbin0 -> 672 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_lexicon_add.pngbin0 -> 689 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_lexicon_locked.pngbin0 -> 792 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_startconfig.pngbin0 -> 738 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_swordconfig.pngbin0 -> 538 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_tile.pngbin0 -> 288 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-action-bt_tile_auto.pngbin0 -> 324 bytes
-rw-r--r--bibletime/pics/highcolor/16x16/hi16-app-bibletime.pngbin0 -> 822 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/Makefile.am7
-rw-r--r--bibletime/pics/highcolor/22x22/Makefile.in423
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_bible.pngbin0 -> 866 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_bible_add.pngbin0 -> 925 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_bible_locked.htmlbin0 -> 996 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_book.pngbin0 -> 781 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_book_add.pngbin0 -> 830 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_book_locked.pngbin0 -> 908 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_cascade.pngbin0 -> 727 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_cascade_auto.pngbin0 -> 1042 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_commentary.pngbin0 -> 1076 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_commentary_add.pngbin0 -> 1098 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_commentary_locked.pngbin0 -> 1204 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_displayconfig.pngbin0 -> 1146 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_lexicon.pngbin0 -> 1155 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_lexicon_add.pngbin0 -> 1197 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_lexicon_locked.pngbin0 -> 1271 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_parallel.pngbin0 -> 454 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_startconfig.pngbin0 -> 1058 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_swordconfig.pngbin0 -> 800 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_sync.pngbin0 -> 629 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_tile.pngbin0 -> 418 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-action-bt_tile_auto.pngbin0 -> 745 bytes
-rw-r--r--bibletime/pics/highcolor/22x22/hi22-app-bibletime.pngbin0 -> 1235 bytes
-rw-r--r--bibletime/pics/highcolor/32x32/Makefile.am7
-rw-r--r--bibletime/pics/highcolor/32x32/Makefile.in408
-rw-r--r--bibletime/pics/highcolor/32x32/hi32-action-bt_bible.pngbin0 -> 1431 bytes
-rw-r--r--bibletime/pics/highcolor/32x32/hi32-action-bt_bible_add.pngbin0 -> 1504 bytes
-rw-r--r--bibletime/pics/highcolor/32x32/hi32-action-bt_book.pngbin0 -> 1182 bytes
-rw-r--r--bibletime/pics/highcolor/32x32/hi32-action-bt_book_add.pngbin0 -> 1252 bytes
-rw-r--r--bibletime/pics/highcolor/32x32/hi32-action-bt_cascade.pngbin0 -> 322 bytes
-rw-r--r--bibletime/pics/highcolor/32x32/hi32-action-bt_cascade_auto.pngbin0 -> 492 bytes
-rw-r--r--bibletime/pics/highcolor/32x32/hi32-action-bt_commentary.pngbin0 -> 1795 bytes
-rw-r--r--bibletime/pics/highcolor/32x32/hi32-action-bt_commentary_add.pngbin0 -> 1850 bytes
-rw-r--r--bibletime/pics/highcolor/32x32/hi32-action-bt_displayconfig.pngbin0 -> 1775 bytes
-rw-r--r--bibletime/pics/highcolor/32x32/hi32-action-bt_lexicon.pngbin0 -> 1877 bytes
-rw-r--r--bibletime/pics/highcolor/32x32/hi32-action-bt_lexicon_add.pngbin0 -> 1935 bytes
-rw-r--r--bibletime/pics/highcolor/32x32/hi32-action-bt_startconfig.pngbin0 -> 1745 bytes
-rw-r--r--bibletime/pics/highcolor/32x32/hi32-action-bt_swordconfig.pngbin0 -> 1305 bytes
-rw-r--r--bibletime/pics/highcolor/32x32/hi32-action-bt_tile.pngbin0 -> 315 bytes
-rw-r--r--bibletime/pics/highcolor/32x32/hi32-action-bt_tile_auto.pngbin0 -> 403 bytes
-rw-r--r--bibletime/pics/highcolor/32x32/hi32-app-bibletime.pngbin0 -> 2178 bytes
-rw-r--r--bibletime/pics/highcolor/48x48/Makefile.am7
-rw-r--r--bibletime/pics/highcolor/48x48/Makefile.in400
-rw-r--r--bibletime/pics/highcolor/48x48/hi48-action-bt_bible.pngbin0 -> 2745 bytes
-rw-r--r--bibletime/pics/highcolor/48x48/hi48-action-bt_bible_add.pngbin0 -> 2892 bytes
-rw-r--r--bibletime/pics/highcolor/48x48/hi48-action-bt_book.pngbin0 -> 2009 bytes
-rw-r--r--bibletime/pics/highcolor/48x48/hi48-action-bt_book_add.pngbin0 -> 2148 bytes
-rw-r--r--bibletime/pics/highcolor/48x48/hi48-action-bt_commentary.pngbin0 -> 3185 bytes
-rw-r--r--bibletime/pics/highcolor/48x48/hi48-action-bt_commentary_add.pngbin0 -> 3291 bytes
-rw-r--r--bibletime/pics/highcolor/48x48/hi48-action-bt_displayconfig.pngbin0 -> 3267 bytes
-rw-r--r--bibletime/pics/highcolor/48x48/hi48-action-bt_lexicon.pngbin0 -> 3601 bytes
-rw-r--r--bibletime/pics/highcolor/48x48/hi48-action-bt_lexicon_add.pngbin0 -> 3703 bytes
-rw-r--r--bibletime/pics/highcolor/48x48/hi48-action-bt_startconfig.pngbin0 -> 3059 bytes
-rw-r--r--bibletime/pics/highcolor/48x48/hi48-action-bt_swordconfig.pngbin0 -> 2376 bytes
-rw-r--r--bibletime/pics/highcolor/48x48/hi48-app-bibletime.pngbin0 -> 4063 bytes
-rw-r--r--bibletime/pics/highcolor/Makefile.am5
-rw-r--r--bibletime/pics/highcolor/Makefile.in467
-rw-r--r--bibletime/pics/lowcolor/16x16/Makefile.am7
-rw-r--r--bibletime/pics/lowcolor/16x16/Makefile.in420
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_bible.pngbin0 -> 806 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_bible_locked.pngbin0 -> 946 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark.pngbin0 -> 588 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark_change.pngbin0 -> 575 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark_export.pngbin0 -> 550 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark_import.pngbin0 -> 521 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark_new.pngbin0 -> 583 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_cascade.pngbin0 -> 295 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_cascade_auto.pngbin0 -> 325 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_commentary.pngbin0 -> 554 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_commentary_locked.pngbin0 -> 631 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_folder.pngbin0 -> 270 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_folder_change.pngbin0 -> 270 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_folder_new.pngbin0 -> 291 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_folder_open.pngbin0 -> 299 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_lexicon.pngbin0 -> 658 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_lexicon_locked.pngbin0 -> 604 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_search.pngbin0 -> 650 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_tile.pngbin0 -> 288 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_tile_auto.pngbin0 -> 324 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-action-bt_verseref.pngbin0 -> 811 bytes
-rw-r--r--bibletime/pics/lowcolor/16x16/lo16-app-bibletime.pngbin0 -> 806 bytes
-rw-r--r--bibletime/pics/lowcolor/22x22/Makefile.am7
-rw-r--r--bibletime/pics/lowcolor/22x22/Makefile.in383
-rw-r--r--bibletime/pics/lowcolor/22x22/lo22-action-bt_cascade.pngbin0 -> 727 bytes
-rw-r--r--bibletime/pics/lowcolor/22x22/lo22-action-bt_cascade_auto.pngbin0 -> 1042 bytes
-rw-r--r--bibletime/pics/lowcolor/22x22/lo22-action-bt_tile.pngbin0 -> 418 bytes
-rw-r--r--bibletime/pics/lowcolor/22x22/lo22-action-bt_tile_auto.pngbin0 -> 745 bytes
-rw-r--r--bibletime/pics/lowcolor/32x32/Makefile.am7
-rw-r--r--bibletime/pics/lowcolor/32x32/Makefile.in382
-rw-r--r--bibletime/pics/lowcolor/32x32/lo32-action-bt_tile.pngbin0 -> 223 bytes
-rw-r--r--bibletime/pics/lowcolor/32x32/lo32-action-bt_tile_auto.pngbin0 -> 382 bytes
-rw-r--r--bibletime/pics/lowcolor/32x32/lo32-app-bibletime.pngbin0 -> 555 bytes
-rw-r--r--bibletime/pics/lowcolor/Makefile.am5
-rw-r--r--bibletime/pics/lowcolor/Makefile.in467
-rw-r--r--bibletime/pics/startuplogo.pngbin0 -> 75361 bytes
-rw-r--r--bibletime/pics/startuplogo.xcfbin0 -> 453980 bytes
-rw-r--r--bibletime/printing/Makefile.am29
-rw-r--r--bibletime/printing/Makefile.in711
-rw-r--r--bibletime/printing/cprintdialogpages.cpp289
-rw-r--r--bibletime/printing/cprintdialogpages.h101
-rw-r--r--bibletime/printing/cprinter.cpp339
-rw-r--r--bibletime/printing/cprinter.h219
-rw-r--r--bibletime/printing/cprintitem.cpp412
-rw-r--r--bibletime/printing/cprintitem.h103
-rw-r--r--bibletime/printing/cprintitemlist.cpp126
-rw-r--r--bibletime/printing/cprintitemlist.h69
-rw-r--r--bibletime/printing/cstyle.cpp495
-rw-r--r--bibletime/printing/cstyle.h211
-rw-r--r--bibletime/printing/cstyleeditordialog.cpp344
-rw-r--r--bibletime/printing/cstyleeditordialog.h135
-rw-r--r--bibletime/printing/cstylelist.cpp156
-rw-r--r--bibletime/printing/cstylelist.h92
-rw-r--r--bibletime/printing/style-data/Makefile.am4
-rw-r--r--bibletime/printing/style-data/Makefile.in384
-rw-r--r--bibletime/printing/style-data/bw_muchtext.xml17
-rw-r--r--bibletime/printing/style-data/color_muchtext.xml17
-rw-r--r--bibletime/printing/style-data/standard.xml17
-rw-r--r--bibletime/resource.h219
-rw-r--r--bibletime/tooltipdef.h181
-rw-r--r--bibletime/util/Makefile.am6
-rw-r--r--bibletime/util/Makefile.in367
-rw-r--r--bibletime/util/scoped_resource.h160
-rw-r--r--bibletime/whatsthisdef.h191
-rw-r--r--bibletime/xml/Makefile.am3
-rw-r--r--bibletime/xml/Makefile.in384
-rw-r--r--bibletime/xml/bibletimeui.rc69
300 files changed, 55541 insertions, 0 deletions
diff --git a/bibletime/Makefile.am b/bibletime/Makefile.am
new file mode 100644
index 0000000..ecb8124
--- /dev/null
+++ b/bibletime/Makefile.am
@@ -0,0 +1,80 @@
+bibletime_SOURCES = \
+bibletime_init.cpp \
+bibletime_slots.cpp \
+bibletime.cpp \
+main.cpp
+
+bibletime_LDADD = \
+./printing/libprinting.a \
+./frontend/presenters/libpresenters.a \
+./frontend/keychooser/libkeychooser.a \
+./frontend/groupmanager/libgroupmanager.a \
+./frontend/searchdialog/libsearchdialog.a \
+./frontend/libfrontend.a \
+./frontend/thirdparty/qt3stuff/libqt3stuff.a \
+./frontend/thirdparty/libthirdparty.a \
+./backend/libbackend.a \
+-lXext \
+$(LIB_QT) \
+$(LIB_KDECORE) \
+$(LIB_KDEUI) \
+-lkdeprint \
+$(LIB_KFILE) \
+$(LIB_X11) \
+$(LIB_SWORD) \
+$(LIBSOCKET)
+
+SUBDIRS = backend printing frontend xml pics util
+
+all_headers = bibletime.h \
+resource.h \
+whatsthisdef.h \
+tooltipdef.h \
+bt-printing
+
+EXTRA_DIST = $(bibletime_SOURCES) $(all_headers)
+
+# this 10 paths are KDE specific. Use them:
+# kde_htmldir Where your docs should go to. (contains lang subdirs)
+# kde_appsdir Where your application file (.kdelnk) should go to.
+# kde_icondir Where your icon should go to.
+# kde_minidir Where your mini icon should go to.
+# kde_datadir Where you install application data. (Use a subdir)
+# kde_locale Where translation files should go to.(contains lang subdirs)
+# kde_cgidir Where cgi-bin executables should go to.
+# kde_confdir Where config files should go to.
+# kde_mimedir Where mimetypes should go to.
+# kde_toolbardir Where general toolbar icons should go to.
+# kde_wallpaperdir Where general wallpapers should go to.
+
+# set the include path for X, qt, KDE and Sword
+INCLUDES = $(all_includes)
+
+# claim, which subdirectories you want to install
+# you can add here more. This one gets installed
+bin_PROGRAMS = bibletime
+
+bibletime_METASOURCES = AUTO
+
+# the library search path.
+bibletime_LDFLAGS = $(BT_LDFLAGS) $(all_libraries) $(KDE_RPATH)
+
+# them while "make clean", use CLEANFILES
+DISTCLEANFILES = $(bibletime_METASOURCES)
+
+# make messages.po. Move this one to ../po/ and "make merge" in po
+# the -x is for skipping messages already translated in kdelibs
+#messages:
+# $(XGETTEXT) -C -ki18n -x $(KDEDIR)/include/kde.pot `find . -name \*.h -o -name \*.cpp -o -name \*.cc` -o ../po/bibletime.pot
+
+install-data-local:
+ $(mkinstalldirs) $(DESTDIR)$(kde_confdir)
+ $(INSTALL_DATA) bt-printing $(DESTDIR)$(kde_confdir)/bt-printing
+
+uninstall-local:
+ -rm -f $(DESTDIR)$(kde_confdir)/bt-printing
+
+rpm: dist
+
+
+
diff --git a/bibletime/Makefile.in b/bibletime/Makefile.in
new file mode 100644
index 0000000..36fd6cb
--- /dev/null
+++ b/bibletime/Makefile.in
@@ -0,0 +1,753 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+bibletime_SOURCES = bibletime_init.cpp bibletime_slots.cpp bibletime.cpp main.cpp
+
+
+bibletime_LDADD = ./printing/libprinting.a ./frontend/presenters/libpresenters.a ./frontend/keychooser/libkeychooser.a ./frontend/groupmanager/libgroupmanager.a ./frontend/searchdialog/libsearchdialog.a ./frontend/libfrontend.a ./frontend/thirdparty/qt3stuff/libqt3stuff.a ./frontend/thirdparty/libthirdparty.a ./backend/libbackend.a -lXext $(LIB_QT) $(LIB_KDECORE) $(LIB_KDEUI) -lkdeprint $(LIB_KFILE) $(LIB_X11) $(LIB_SWORD) $(LIBSOCKET)
+
+
+SUBDIRS = backend printing frontend xml pics util
+
+all_headers = bibletime.h resource.h whatsthisdef.h tooltipdef.h bt-printing
+
+
+EXTRA_DIST = $(bibletime_SOURCES) $(all_headers)
+
+# this 10 paths are KDE specific. Use them:
+# kde_htmldir Where your docs should go to. (contains lang subdirs)
+# kde_appsdir Where your application file (.kdelnk) should go to.
+# kde_icondir Where your icon should go to.
+# kde_minidir Where your mini icon should go to.
+# kde_datadir Where you install application data. (Use a subdir)
+# kde_locale Where translation files should go to.(contains lang subdirs)
+# kde_cgidir Where cgi-bin executables should go to.
+# kde_confdir Where config files should go to.
+# kde_mimedir Where mimetypes should go to.
+# kde_toolbardir Where general toolbar icons should go to.
+# kde_wallpaperdir Where general wallpapers should go to.
+
+# set the include path for X, qt, KDE and Sword
+INCLUDES = $(all_includes)
+
+# claim, which subdirectories you want to install
+# you can add here more. This one gets installed
+bin_PROGRAMS = bibletime
+
+#>- bibletime_METASOURCES = AUTO
+
+# the library search path.
+bibletime_LDFLAGS = $(BT_LDFLAGS) $(all_libraries) $(KDE_RPATH)
+
+# them while "make clean", use CLEANFILES
+DISTCLEANFILES = $(bibletime_METASOURCES)
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+bin_PROGRAMS = bibletime$(EXEEXT)
+PROGRAMS = $(bin_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+#>- bibletime_OBJECTS = bibletime_init.$(OBJEXT) bibletime_slots.$(OBJEXT) \
+#>- bibletime.$(OBJEXT) main.$(OBJEXT)
+#>+ 7
+bibletime_final_OBJECTS = bibletime.all_cpp.o
+bibletime_nofinal_OBJECTS = bibletime_init.$(OBJEXT) bibletime_slots.$(OBJEXT) \
+bibletime.$(OBJEXT) main.$(OBJEXT)\
+bibletime.moc.o \
+bibletime_meta_unload.o
+@KDE_USE_FINAL_FALSE@bibletime_OBJECTS = $(bibletime_nofinal_OBJECTS)
+@KDE_USE_FINAL_TRUE@bibletime_OBJECTS = $(bibletime_final_OBJECTS)
+bibletime_DEPENDENCIES = ./printing/libprinting.a \
+./frontend/presenters/libpresenters.a \
+./frontend/keychooser/libkeychooser.a \
+./frontend/groupmanager/libgroupmanager.a \
+./frontend/searchdialog/libsearchdialog.a ./frontend/libfrontend.a \
+./frontend/thirdparty/qt3stuff/libqt3stuff.a \
+./frontend/thirdparty/libthirdparty.a ./backend/libbackend.a
+CXXFLAGS = @CXXFLAGS@
+#>- CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+CXXLD = $(CXX)
+#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
+#>+ 1
+CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+#>- DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+#>+ 4
+KDE_DIST=bibletime.h resource.h whatsthisdef.h tooltipdef.h bt-printing
+
+DISTFILES= $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
+
+
+TAR = tar
+GZIP_ENV = --best
+#>- DEP_FILES = .deps/bibletime.P .deps/bibletime_init.P \
+#>- .deps/bibletime_slots.P .deps/main.P
+#>+ 6
+@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/bibletime.moc.P $(DEPDIR)/bibletime_meta_unload.P $(DEPDIR)/bibletime.all_cpp.P \
+ .deps/bibletime.P .deps/bibletime_init.P \
+.deps/bibletime_slots.P .deps/main.P
+@KDE_USE_FINAL_FALSE@DEP_FILES = $(DEPDIR)/bibletime.moc.P $(DEPDIR)/bibletime_meta_unload.P .deps/bibletime.P .deps/bibletime_init.P \
+.deps/bibletime_slots.P .deps/main.P
+
+SOURCES = $(bibletime_SOURCES)
+OBJECTS = $(bibletime_OBJECTS)
+
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .cpp .lo .o .obj .s
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-binPROGRAMS:
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+distclean-binPROGRAMS:
+
+maintainer-clean-binPROGRAMS:
+
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+ $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ list='$(bin_PROGRAMS)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ done
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.s.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+bibletime$(EXEEXT): $(bibletime_OBJECTS) $(bibletime_DEPENDENCIES)
+ @rm -f bibletime$(EXEEXT)
+ $(CXXLINK) $(bibletime_LDFLAGS) $(bibletime_OBJECTS) $(bibletime_LDADD) $(LIBS)
+.cpp.o:
+ $(CXXCOMPILE) -c $<
+.cpp.obj:
+ $(CXXCOMPILE) -c `cygpath -w $<`
+.cpp.lo:
+ $(LTCXXCOMPILE) -c $<
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+@SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+ rev="$$subdir $$rev"; \
+ test "$$subdir" = "." && dot_seen=yes; \
+ done; \
+ test "$$dot_seen" = "no" && rev=". $$rev"; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+ for subdir in $(SUBDIRS); do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ chmod 777 $(distdir)/$$subdir; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
+ || exit 1; \
+ fi; \
+ done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+ -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+ @echo '$(COMPILE) -c $<'; \
+ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.c
+ @echo '$(LTCOMPILE) -c $<'; \
+ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+
+%.o: %.cpp
+ @echo '$(CXXCOMPILE) -c $<'; \
+ $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.cpp
+ @echo '$(LTCXXCOMPILE) -c $<'; \
+ $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+install-exec-am: install-binPROGRAMS
+install-exec: install-exec-recursive
+
+install-data-am: install-data-local
+install-data: install-data-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am: uninstall-binPROGRAMS uninstall-local
+uninstall: uninstall-recursive
+all-am: Makefile $(PROGRAMS)
+all-redirect: all-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \
+ mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+#>- clean-am: clean-binPROGRAMS clean-compile clean-libtool clean-tags \
+#>- clean-depend clean-generic mostlyclean-am
+#>+ 2
+clean-am: clean-metasources clean-moc-classes clean-final clean-binPROGRAMS clean-compile clean-libtool clean-tags \
+ clean-depend clean-generic mostlyclean-am
+
+#>- clean: clean-recursive
+#>+ 1
+clean: kde-rpo-clean clean-recursive
+
+distclean-am: distclean-binPROGRAMS distclean-compile distclean-libtool \
+ distclean-tags distclean-depend distclean-generic \
+ clean-am
+ -rm -f libtool
+
+distclean: distclean-recursive
+
+maintainer-clean-am: maintainer-clean-binPROGRAMS \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-tags maintainer-clean-depend \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+
+.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
+maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool install-data-recursive \
+uninstall-data-recursive install-exec-recursive \
+uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
+all-recursive check-recursive installcheck-recursive info-recursive \
+dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-local install-data-am install-data install-am install \
+uninstall-local uninstall-am uninstall all-redirect all-am all \
+installdirs-am installdirs mostlyclean-generic distclean-generic \
+clean-generic maintainer-clean-generic clean mostlyclean distclean \
+maintainer-clean
+
+
+# make messages.po. Move this one to ../po/ and "make merge" in po
+# the -x is for skipping messages already translated in kdelibs
+#messages:
+# $(XGETTEXT) -C -ki18n -x $(KDEDIR)/include/kde.pot `find . -name \*.h -o -name \*.cpp -o -name \*.cc` -o ../po/bibletime.pot
+
+install-data-local:
+ $(mkinstalldirs) $(DESTDIR)$(kde_confdir)
+ $(INSTALL_DATA) bt-printing $(DESTDIR)$(kde_confdir)/bt-printing
+
+uninstall-local:
+ -rm -f $(DESTDIR)$(kde_confdir)/bt-printing
+
+rpm: dist
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 3
+bibletime.moc.cpp: $(srcdir)/bibletime.h
+ $(MOC) $(srcdir)/bibletime.h -o bibletime.moc.cpp
+
+#>+ 3
+clean-metasources:
+ -rm -f bibletime.moc.cpp
+
+#>+ 2
+docs-am:
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/Makefile.in
+
+
+#>+ 10
+bibletime_meta_unload.cpp: bibletime.moc.cpp
+ @echo 'creating bibletime_meta_unload.cpp'
+ @-rm -f bibletime_meta_unload.cpp
+ @echo 'static const char * _metalist_bibletime[] = {' > bibletime_meta_unload.cpp
+ @cat bibletime.moc.cpp | grep 'char.*className' | sed -e 's/.*[^A-Za-z0-9_:]\([A-Za-z0-9_:]*\)::className.*$$/\"\1\",/' | sort | uniq >> bibletime_meta_unload.cpp
+ @echo '0};' >> bibletime_meta_unload.cpp
+ @echo '#include <kunload.h>' >> bibletime_meta_unload.cpp
+ @echo '_UNLOAD(bibletime)' >> bibletime_meta_unload.cpp
+
+
+#>+ 3
+clean-moc-classes:
+ -rm -f bibletime_meta_unload.cpp
+
+#>+ 11
+bibletime.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/bibletime_init.cpp $(srcdir)/bibletime_slots.cpp $(srcdir)/bibletime.cpp $(srcdir)/main.cpp bibletime_meta_unload.cpp bibletime.moc.cpp
+ @echo 'creating bibletime.all_cpp.cpp ...'; \
+ rm -f bibletime.all_cpp.files bibletime.all_cpp.final; \
+ echo "#define KDE_USE_FINAL 1" >> bibletime.all_cpp.final; \
+ for file in bibletime_init.cpp bibletime_slots.cpp bibletime.cpp main.cpp bibletime_meta_unload.cpp bibletime.moc.cpp; do \
+ echo "#include \"$$file\"" >> bibletime.all_cpp.files; \
+ test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> bibletime.all_cpp.final; \
+ done; \
+ cat bibletime.all_cpp.final bibletime.all_cpp.files > bibletime.all_cpp.cpp; \
+ rm -f bibletime.all_cpp.final bibletime.all_cpp.files
+
+#>+ 3
+clean-final:
+ -rm -f bibletime.all_cpp.cpp
+
+#>+ 2
+final:
+ $(MAKE) bibletime_OBJECTS="$(bibletime_final_OBJECTS)" all-am
+#>+ 2
+no-final:
+ $(MAKE) bibletime_OBJECTS="$(bibletime_nofinal_OBJECTS)" all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/backend/Makefile.am b/bibletime/backend/Makefile.am
new file mode 100644
index 0000000..ca264b9
--- /dev/null
+++ b/bibletime/backend/Makefile.am
@@ -0,0 +1,47 @@
+KDE_OPTIONS = qt-only
+libbackend_a_METASOURCES = AUTO
+noinst_LIBRARIES = libbackend.a
+
+INCLUDES = $(all_includes)
+
+libbackend_a_SOURCES = \
+cswordmodulesearch.cpp \
+chtmlchapterdisplay.cpp \
+chtmlentrydisplay.cpp \
+chtmlbookdisplay.cpp \
+cswordbackend.cpp \
+cswordkey.cpp \
+cswordldkey.cpp \
+cswordversekey.cpp \
+cswordmoduleinfo.cpp \
+cswordlexiconmoduleinfo.cpp \
+cswordcommentarymoduleinfo.cpp \
+cswordbiblemoduleinfo.cpp \
+cswordbookmoduleinfo.cpp \
+cswordtreekey.cpp \
+creferencemanager.cpp \
+bt_thmlhtml.cpp \
+bt_gbfhtml.cpp \
+bt_basicfilter.cpp
+
+all_headers = cswordbiblemoduleinfo.h \
+cswordcommentarymoduleinfo.h \
+cswordlexiconmoduleinfo.h \
+cswordkey.h \
+cswordversekey.h \
+cswordldkey.h \
+cswordbackend.h \
+cswordmoduleinfo.h \
+chtmlentrydisplay.h \
+chtmlchapterdisplay.h \
+chtmlbookdisplay.h \
+cswordmodulesearch.h \
+creferencemanager.h \
+cswordbookmoduleinfo.h \
+cswordtreekey.h \
+bt_thmlhtml.h \
+bt_gbfhtml.h \
+bt_basicfilter.h
+
+EXTRA_DIST = $(libbackend_a_SOURCES) $(all_headers)
+
diff --git a/bibletime/backend/Makefile.in b/bibletime/backend/Makefile.in
new file mode 100644
index 0000000..9372c56
--- /dev/null
+++ b/bibletime/backend/Makefile.in
@@ -0,0 +1,622 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+KDE_OPTIONS = qt-only
+#>- libbackend_a_METASOURCES = AUTO
+noinst_LIBRARIES = libbackend.a
+
+INCLUDES = $(all_includes)
+
+libbackend_a_SOURCES = cswordmodulesearch.cpp chtmlchapterdisplay.cpp chtmlentrydisplay.cpp chtmlbookdisplay.cpp cswordbackend.cpp cswordkey.cpp cswordldkey.cpp cswordversekey.cpp cswordmoduleinfo.cpp cswordlexiconmoduleinfo.cpp cswordcommentarymoduleinfo.cpp cswordbiblemoduleinfo.cpp cswordbookmoduleinfo.cpp cswordtreekey.cpp creferencemanager.cpp bt_thmlhtml.cpp bt_gbfhtml.cpp bt_basicfilter.cpp
+
+
+all_headers = cswordbiblemoduleinfo.h cswordcommentarymoduleinfo.h cswordlexiconmoduleinfo.h cswordkey.h cswordversekey.h cswordldkey.h cswordbackend.h cswordmoduleinfo.h chtmlentrydisplay.h chtmlchapterdisplay.h chtmlbookdisplay.h cswordmodulesearch.h creferencemanager.h cswordbookmoduleinfo.h cswordtreekey.h bt_thmlhtml.h bt_gbfhtml.h bt_basicfilter.h
+
+
+EXTRA_DIST = $(libbackend_a_SOURCES) $(all_headers)
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I../..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libbackend_a_LIBADD =
+#>- libbackend_a_OBJECTS = cswordmodulesearch.$(OBJEXT) \
+#>- chtmlchapterdisplay.$(OBJEXT) chtmlentrydisplay.$(OBJEXT) \
+#>- chtmlbookdisplay.$(OBJEXT) cswordbackend.$(OBJEXT) cswordkey.$(OBJEXT) \
+#>- cswordldkey.$(OBJEXT) cswordversekey.$(OBJEXT) \
+#>- cswordmoduleinfo.$(OBJEXT) cswordlexiconmoduleinfo.$(OBJEXT) \
+#>- cswordcommentarymoduleinfo.$(OBJEXT) cswordbiblemoduleinfo.$(OBJEXT) \
+#>- cswordbookmoduleinfo.$(OBJEXT) cswordtreekey.$(OBJEXT) \
+#>- creferencemanager.$(OBJEXT) bt_thmlhtml.$(OBJEXT) bt_gbfhtml.$(OBJEXT) \
+#>- bt_basicfilter.$(OBJEXT)
+#>+ 12
+libbackend_a_final_OBJECTS = libbackend_a.all_cpp.o
+libbackend_a_nofinal_OBJECTS = cswordmodulesearch.$(OBJEXT) \
+chtmlchapterdisplay.$(OBJEXT) chtmlentrydisplay.$(OBJEXT) \
+chtmlbookdisplay.$(OBJEXT) cswordbackend.$(OBJEXT) cswordkey.$(OBJEXT) \
+cswordldkey.$(OBJEXT) cswordversekey.$(OBJEXT) \
+cswordmoduleinfo.$(OBJEXT) cswordlexiconmoduleinfo.$(OBJEXT) \
+cswordcommentarymoduleinfo.$(OBJEXT) cswordbiblemoduleinfo.$(OBJEXT) \
+cswordbookmoduleinfo.$(OBJEXT) cswordtreekey.$(OBJEXT) \
+creferencemanager.$(OBJEXT) bt_thmlhtml.$(OBJEXT) bt_gbfhtml.$(OBJEXT) \
+bt_basicfilter.$(OBJEXT)
+@KDE_USE_FINAL_FALSE@libbackend_a_OBJECTS = $(libbackend_a_nofinal_OBJECTS)
+@KDE_USE_FINAL_TRUE@libbackend_a_OBJECTS = $(libbackend_a_final_OBJECTS)
+AR = ar
+CXXFLAGS = @CXXFLAGS@
+#>- CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+CXXLD = $(CXX)
+#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
+#>+ 1
+CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+#>- DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+#>+ 4
+KDE_DIST=bt_thmlhtml.h creferencemanager.h cswordtreekey.h cswordbookmoduleinfo.h cswordversekey.h cswordmoduleinfo.h chtmlbookdisplay.h bt_basicfilter.h cswordbackend.h cswordbiblemoduleinfo.h cswordcommentarymoduleinfo.h chtmlentrydisplay.h st31vJFM cswordldkey.h cswordlexiconmoduleinfo.h chtmlchapterdisplay.h cswordmodulesearch.h bt_gbfhtml.h cswordkey.h
+
+DISTFILES= $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
+
+
+TAR = tar
+GZIP_ENV = --best
+#>- DEP_FILES = .deps/bt_basicfilter.P .deps/bt_gbfhtml.P \
+#>- .deps/bt_thmlhtml.P .deps/chtmlbookdisplay.P \
+#>- .deps/chtmlchapterdisplay.P .deps/chtmlentrydisplay.P \
+#>- .deps/creferencemanager.P .deps/cswordbackend.P \
+#>- .deps/cswordbiblemoduleinfo.P .deps/cswordbookmoduleinfo.P \
+#>- .deps/cswordcommentarymoduleinfo.P .deps/cswordkey.P \
+#>- .deps/cswordldkey.P .deps/cswordlexiconmoduleinfo.P \
+#>- .deps/cswordmoduleinfo.P .deps/cswordmodulesearch.P \
+#>- .deps/cswordtreekey.P .deps/cswordversekey.P
+#>+ 20
+@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/libbackend_a.all_cpp.P \
+ .deps/bt_basicfilter.P .deps/bt_gbfhtml.P \
+.deps/bt_thmlhtml.P .deps/chtmlbookdisplay.P \
+.deps/chtmlchapterdisplay.P .deps/chtmlentrydisplay.P \
+.deps/creferencemanager.P .deps/cswordbackend.P \
+.deps/cswordbiblemoduleinfo.P .deps/cswordbookmoduleinfo.P \
+.deps/cswordcommentarymoduleinfo.P .deps/cswordkey.P \
+.deps/cswordldkey.P .deps/cswordlexiconmoduleinfo.P \
+.deps/cswordmoduleinfo.P .deps/cswordmodulesearch.P \
+.deps/cswordtreekey.P .deps/cswordversekey.P
+@KDE_USE_FINAL_FALSE@DEP_FILES = .deps/bt_basicfilter.P .deps/bt_gbfhtml.P \
+.deps/bt_thmlhtml.P .deps/chtmlbookdisplay.P \
+.deps/chtmlchapterdisplay.P .deps/chtmlentrydisplay.P \
+.deps/creferencemanager.P .deps/cswordbackend.P \
+.deps/cswordbiblemoduleinfo.P .deps/cswordbookmoduleinfo.P \
+.deps/cswordcommentarymoduleinfo.P .deps/cswordkey.P \
+.deps/cswordldkey.P .deps/cswordlexiconmoduleinfo.P \
+.deps/cswordmoduleinfo.P .deps/cswordmodulesearch.P \
+.deps/cswordtreekey.P .deps/cswordversekey.P
+
+SOURCES = $(libbackend_a_SOURCES)
+OBJECTS = $(libbackend_a_OBJECTS)
+
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .cpp .lo .o .obj .s
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/backend/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/backend/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/backend/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.s.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libbackend.a: $(libbackend_a_OBJECTS) $(libbackend_a_DEPENDENCIES)
+ -rm -f libbackend.a
+ $(AR) cru libbackend.a $(libbackend_a_OBJECTS) $(libbackend_a_LIBADD)
+ $(RANLIB) libbackend.a
+.cpp.o:
+ $(CXXCOMPILE) -c $<
+.cpp.obj:
+ $(CXXCOMPILE) -c `cygpath -w $<`
+.cpp.lo:
+ $(LTCXXCOMPILE) -c $<
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/backend
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/backend/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+ -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+ @echo '$(COMPILE) -c $<'; \
+ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.c
+ @echo '$(LTCOMPILE) -c $<'; \
+ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+
+%.o: %.cpp
+ @echo '$(CXXCOMPILE) -c $<'; \
+ $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.cpp
+ @echo '$(LTCXXCOMPILE) -c $<'; \
+ $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
+ mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+#>- clean-am: clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+#>- clean-depend clean-generic mostlyclean-am
+#>+ 2
+clean-am: clean-final clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+ clean-depend clean-generic mostlyclean-am
+
+#>- clean: clean-am
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+distclean-am: distclean-noinstLIBRARIES distclean-compile \
+ distclean-libtool distclean-tags distclean-depend \
+ distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-tags maintainer-clean-depend \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 2
+docs-am:
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/backend/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/backend/Makefile.in
+
+
+#>+ 11
+libbackend_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/cswordmodulesearch.cpp $(srcdir)/chtmlchapterdisplay.cpp $(srcdir)/chtmlentrydisplay.cpp $(srcdir)/chtmlbookdisplay.cpp $(srcdir)/cswordbackend.cpp $(srcdir)/cswordkey.cpp $(srcdir)/cswordldkey.cpp $(srcdir)/cswordversekey.cpp $(srcdir)/cswordmoduleinfo.cpp $(srcdir)/cswordlexiconmoduleinfo.cpp $(srcdir)/cswordcommentarymoduleinfo.cpp $(srcdir)/cswordbiblemoduleinfo.cpp $(srcdir)/cswordbookmoduleinfo.cpp $(srcdir)/cswordtreekey.cpp $(srcdir)/creferencemanager.cpp $(srcdir)/bt_thmlhtml.cpp $(srcdir)/bt_gbfhtml.cpp $(srcdir)/bt_basicfilter.cpp
+ @echo 'creating libbackend_a.all_cpp.cpp ...'; \
+ rm -f libbackend_a.all_cpp.files libbackend_a.all_cpp.final; \
+ echo "#define KDE_USE_FINAL 1" >> libbackend_a.all_cpp.final; \
+ for file in cswordmodulesearch.cpp chtmlchapterdisplay.cpp chtmlentrydisplay.cpp chtmlbookdisplay.cpp cswordbackend.cpp cswordkey.cpp cswordldkey.cpp cswordversekey.cpp cswordmoduleinfo.cpp cswordlexiconmoduleinfo.cpp cswordcommentarymoduleinfo.cpp cswordbiblemoduleinfo.cpp cswordbookmoduleinfo.cpp cswordtreekey.cpp creferencemanager.cpp bt_thmlhtml.cpp bt_gbfhtml.cpp bt_basicfilter.cpp ; do \
+ echo "#include \"$$file\"" >> libbackend_a.all_cpp.files; \
+ test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libbackend_a.all_cpp.final; \
+ done; \
+ cat libbackend_a.all_cpp.final libbackend_a.all_cpp.files > libbackend_a.all_cpp.cpp; \
+ rm -f libbackend_a.all_cpp.final libbackend_a.all_cpp.files
+
+#>+ 3
+clean-final:
+ -rm -f libbackend_a.all_cpp.cpp
+
+#>+ 2
+final:
+ $(MAKE) libbackend_a_OBJECTS="$(libbackend_a_final_OBJECTS)" all-am
+#>+ 2
+no-final:
+ $(MAKE) libbackend_a_OBJECTS="$(libbackend_a_nofinal_OBJECTS)" all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/backend/bt_basicfilter.cpp b/bibletime/backend/bt_basicfilter.cpp
new file mode 100644
index 0000000..1ce15d7
--- /dev/null
+++ b/bibletime/backend/bt_basicfilter.cpp
@@ -0,0 +1,202 @@
+/***************************************************************************
+ bt_basicfilter.cpp - description
+ -------------------
+ begin : Thu Nov 1 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+//BIbleTime includes
+#include <stdlib.h>
+#include "bt_basicfilter.h"
+#include "creferencemanager.h"
+#include "cswordversekey.h"
+#include "../frontend/cbtconfig.h"
+
+//Qt includes
+#include <qregexp.h>
+#include <qstringlist.h>
+
+char BT_BASICFILTER::ProcessText (char *text, int maxlen, const SWKey *key, const SWModule *module){
+ m_module = module;
+ m_key = key;
+ updateSettings();
+ SWBasicFilter::ProcessText(text, maxlen, key, module);
+
+ return 0;
+}
+
+void BT_BASICFILTER::updateSettings(){
+ strcpy(footnote_color, CBTConfig::get(CBTConfig::footnotesColor ).name().utf8());
+ strcpy(strongs_color, CBTConfig::get(CBTConfig::strongsColor ).name().utf8());
+ strcpy(morph_color, CBTConfig::get(CBTConfig::morphsColor ).name().utf8());
+ strcpy(jesuswords_color,CBTConfig::get(CBTConfig::jesuswordsColor ).name().utf8());
+ strcpy(swordref_color, CBTConfig::get(CBTConfig::swordRefColor ).name().utf8());
+ strcpy(text_color, CBTConfig::get(CBTConfig::textColor ).name().utf8());
+ strcpy(standard_bible, CReferenceManager::preferredModule(CReferenceManager::Bible).utf8());
+
+ updateTokens();
+}
+
+
+/** Parses the verse reference ref and returns it. */
+const char* BT_BASICFILTER::parseSimpleRef(const char* ref) {
+ VerseKey parseKey;
+ SWModule* m = const_cast<SWModule*>(m_module);
+ const char* lang = m ? m->Lang() : "en";
+ parseKey.setLocale(lang);
+
+ parseKey = (m_key ? (const char*)*m_key : "Genesis 1:1");
+ ListKey list;
+ char* to = new char[5000];
+ char* ret = to;
+
+ QStringList refList = QStringList::split(QRegExp("[,.;]", false), QString::fromLocal8Bit(ref));
+ int pos = 0;
+ for ( QStringList::Iterator it = refList.begin(); it != refList.end(); ++it, pos++ ) {
+ list = parseKey.ParseVerseList((*it).local8Bit(), parseKey, true);
+
+ const int count = list.Count();
+ for(int i = 0; i < count; i++) {
+ SWKey* key = list.GetElement(i);
+ VerseKey* vk = dynamic_cast<VerseKey*>(key);
+
+ pushString(&to,"<font color=\"%s\"><a href=\"sword://Bible/%s/",
+ swordref_color,
+ standard_bible
+ );
+
+ if (vk) {
+ vk->setLocale(lang);
+ vk->LowerBound().setLocale(lang);
+ vk->UpperBound().setLocale(lang);
+ }
+ if (vk && (const char*)vk->UpperBound() != (const char*)vk->LowerBound()) {
+ pushString(&to, "%s-%s\">%s</a>",
+ (const char*)QString::fromLocal8Bit(vk->LowerBound()).utf8(),
+ (const char*)QString::fromLocal8Bit(vk->UpperBound()).utf8(),
+ (const char*)(*it).utf8()
+ );
+ }
+ else {
+ pushString(&to, "%s\">%s</a>",
+ (const char*)QString::fromLocal8Bit((const char*)*key).utf8(),
+ (const char*)(*it).utf8()
+ );
+ }
+ (pos+1 < (int)refList.count()) ? pushString(&to, "</font>, ") : pushString(&to, "</font>");
+ }
+ }
+ *to++ = '\0';
+ return ret; //don't forget to delete it!
+}
+
+const char* BT_BASICFILTER::parseThMLRef(const char* ref, const char* mod) {
+ char* to = new char[5000];
+ char* ret = to;
+ const char* module = (mod ? mod : standard_bible);
+// VerseKey parseKey = (m_key ? (const char*)*m_key : "Genesis 1:1");
+// ListKey list = parseKey.ParseVerseList(ref, parseKey, false);
+// const int count = list.Count();
+
+// for(int i = 0; i < count; i++) {
+// SWKey* key = list.GetElement(i);
+// VerseKey* vk = dynamic_cast<VerseKey*>(key);
+//
+ pushString(&to,"<font color=\"%s\"><a href=\"sword://Bible/%s/",
+ swordref_color,
+ module
+ );
+// if (vk && vk->UpperBound() != vk->LowerBound()) {
+// pushString(&to, "%s-%s\">",
+// (const char*)QString::fromLocal8Bit(vk->LowerBound()).utf8(),
+// (const char*)QString::fromLocal8Bit(vk->UpperBound()).utf8()
+// );
+// }
+// else {
+ pushString(&to, "%s\">",
+ (const char*)QString::fromLocal8Bit(ref).utf8()
+ );
+// }
+// (i+1 < refList.count()) ? pushString(&to, "</font>, ") : pushString(&to, "</font>");
+// }
+ *to++ = '\0';
+ return ret;
+}
+
+const char* BT_BASICFILTER::thmlRefEnd() {
+ return "</a></font>";
+}
+
+/** This filter converts the RWP #Gen 1:1| style bible references to HTML */
+char BT_BASICFILTER::ProcessRWPRefs(char* text, int maxlen){
+ char *to, *from, verse_str[500];
+ int len;
+
+ len = strlen(text) + 1; // shift string to right of buffer
+ if (len < maxlen) {
+ memmove(&text[maxlen - len], text, len);
+ from = &text[maxlen - len];
+ }
+ else
+ from = text;
+
+ for (to = text; *from; from++) {
+ if (*from == '#') {
+ int i=0;
+ bool is_verse = true;
+
+ for ( i=0; i < 500 || from[i]=='|'; i++){
+ if ( from[i] == '|' )
+ break; //We found a valid verse ref
+ if ( !isalnum(from[i]) && !isspace(from[i]) && from[i]!=':'
+ && from[i]!=';' && from[i]!=',' && from[i]!='-' && from[i]!='#'){
+ is_verse = false;
+ break; // can't be a verseref
+ }
+ }
+ if ( i==500 || !is_verse ){
+ *to++ = *from;
+ continue;
+ }
+ ++from;
+
+ i = 0;
+ verse_str[0] = '\0';
+ while (*from != '|' && i<500) { /* get the bible reference */
+ verse_str[i++] = *from;
+ verse_str[i + 1] = '\0';
+ from++;
+ }
+
+// cerr << verse_str << endl;
+ const char* ref = parseSimpleRef(verse_str);
+ pushString(&to,"%s ", ref);
+ delete [] ref;//delete now because it's unused
+
+ continue;
+ }
+ *to++ = *from;
+ }
+ *to++ = 0;
+ *to = 0;
+ return 0;
+}
+
+/** Replaces the token in the substitute map. */
+void BT_BASICFILTER::replaceTokenSubstitute(const char* findString, const char* replaceString){
+ tokenSubMap.erase( tokenSubMap.find(findString) ); //erase entry
+ addTokenSubstitute(findString, replaceString);
+}
+
+/** Updates the token for this filter if settings changed. */
+void BT_BASICFILTER::updateTokens(){
+}
diff --git a/bibletime/backend/bt_basicfilter.h b/bibletime/backend/bt_basicfilter.h
new file mode 100644
index 0000000..8e44f80
--- /dev/null
+++ b/bibletime/backend/bt_basicfilter.h
@@ -0,0 +1,76 @@
+/***************************************************************************
+ bt_basicfilter.h - description
+ -------------------
+ begin : Thu Nov 1 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef BT_BASICFILTER_H
+#define BT_BASICFILTER_H
+
+#include <swbasicfilter.h>
+
+class SWKey;
+class SWModule;
+
+/**
+ * This is the base class for all filters in BT
+ */
+
+class BT_BASICFILTER : public SWBasicFilter {
+public:
+ virtual char ProcessText (char *text, int maxlen, const SWKey *, const SWModule * = 0);
+
+protected:
+ /**
+ * updates the filter specific settings like colors
+ * the variables are used in the inherited filters
+ * in HandleToken()
+ */
+ void updateSettings();
+ /**
+ * This filter converts the RWP #Gen 1:1|
+ * style bible references to HTML
+ */
+ char ProcessRWPRefs(char * text, int maxlen = -1);
+ /**
+ * Parses the verse reference ref and returns it.
+ */
+ const char* parseSimpleRef(const char* ref);
+ /**
+ * Parses the verse reference ref and returns it.
+ */
+ const char* parseThMLRef(const char* ref, const char* mod = 0);
+ const char* thmlRefEnd();
+ /**
+ * Replaces the token in the substitute map.
+ */
+ void replaceTokenSubstitute(const char* findString, const char* replaceString);
+ /**
+ * Updates the token for this filter if settings changed.
+ */
+ virtual void updateTokens();
+
+ char footnote_color[8];
+ char strongs_color[8];
+ char morph_color[8];
+ char jesuswords_color[8];
+ char swordref_color[8];
+ char text_color[8];
+ char standard_bible[100];
+
+ const SWKey *m_key;
+ const SWModule* m_module;
+};
+
+#endif
diff --git a/bibletime/backend/bt_gbfhtml.cpp b/bibletime/backend/bt_gbfhtml.cpp
new file mode 100644
index 0000000..d575222
--- /dev/null
+++ b/bibletime/backend/bt_gbfhtml.cpp
@@ -0,0 +1,156 @@
+/***************************************************************************
+ gbfhtml.cpp - description
+ -------------------
+ begin : Thu Jun 24 1999
+ copyright : (C) 1999 by Torsten Uhlmann
+ email : TUhlmann@gmx.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+#include <qstring.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "bt_gbfhtml.h"
+
+BT_GBFHTML::BT_GBFHTML(){
+ setTokenStart("<");
+ setTokenEnd(">");
+
+ setTokenCaseSensitive(true);
+
+ addTokenSubstitute("Rf", ")</small></font>");// end of footnote
+ addTokenSubstitute("FI", "<i>"); // italics begin
+ addTokenSubstitute("Fi", "</i>");
+ addTokenSubstitute("FB", "<b>"); // bold begin
+ addTokenSubstitute("Fb", "</b>");
+
+ addTokenSubstitute("FR", QString::fromLatin1("<font color=\"%1\">").arg(jesuswords_color).latin1());
+ addTokenSubstitute("Fr", "</font>");
+ addTokenSubstitute("FU", "<u>"); // underline begin
+ addTokenSubstitute("Fu", "</u>");
+ addTokenSubstitute("FO", "<cite>"); // Old Testament quote begin
+ addTokenSubstitute("Fo", "</cite>");
+ addTokenSubstitute("FS", "<sup>"); // Superscript begin// Subscript begin
+ addTokenSubstitute("Fs", "</sup>");
+ addTokenSubstitute("FV", "<sub>"); // Subscript begin
+ addTokenSubstitute("Fv", "</sub>");
+
+ addTokenSubstitute("TT", QString::fromLatin1(" <h1><font color=\"%1\">").arg(text_color).local8Bit());
+ addTokenSubstitute("Tt", "</font></h1>");
+
+ addTokenSubstitute("Ts", "</font></h2>");
+ addTokenSubstitute("TS", QString::fromLatin1(" <H2><font color=\"%1\">").arg(text_color).local8Bit());
+
+ addTokenSubstitute("PP", "<cite>"); // poetry begin
+ addTokenSubstitute("Pp", "</cite>");
+ addTokenSubstitute("Fn", "</font>"); // font end
+ addTokenSubstitute("CL", "<br>"); // new line
+ addTokenSubstitute("CM", "<!p><br>"); // paragraph <!P> is a non showing comment that can be changed in the front end to <P> if desired
+ addTokenSubstitute("CG", ">"); // literal greater-than sign
+ addTokenSubstitute("CT", "<"); // literal less-than sign
+ addTokenSubstitute("JR", "<div align=\"right\">"); // right align begin
+ addTokenSubstitute("JC", "<div align=\"center\">"); // center align begin
+ addTokenSubstitute("JL", "</div>"); // align end
+}
+
+/** No descriptions */
+char BT_GBFHTML::ProcessText(char * text, int maxlen, const SWKey * key, const SWModule * module){
+ BT_BASICFILTER::ProcessText(text, maxlen, key, module);
+ BT_BASICFILTER::ProcessRWPRefs(text, maxlen);
+}
+
+
+bool BT_GBFHTML::handleToken(char **buf, const char *token, DualStringMap &userData) {
+ if (!substituteToken(buf, token)) { //more than a simple replace
+ const unsigned int tokenLength = strlen(token);
+ unsigned long i;
+ unsigned long len = strlen(token);
+
+ if (!strncmp(token, "WG", 2)){ // strong's numbers greek
+ char num[6];
+ for (i = 2; i < tokenLength; i++)
+ num[i-2] = token[i];
+ num[i-2]=0;
+
+ pushString(buf," <font color=\"%s\"><small><em><a href=\"strongs://Greek/%s\">&lt;%s&gt;</a></em></small></font> ",
+ strongs_color, num, num);
+ }
+
+ if (!strncmp(token, "WH", 2)){ // strong's numbers hebrew
+ char num[6];
+ for (i = 2; i < tokenLength; i++)
+ num[i-2] = token[i];
+ num[i-2]=0;
+
+ pushString(buf," <font color=\"%s\"><small><em><a href=\"strongs://Hebrew/%s\">&lt;%s&gt;</a></em></small></font> ",
+ strongs_color, num, num);
+ }
+
+ else if (!strncmp(token, "WTG", 3)) { // strong's numbers tense greek
+ char num[16];
+ for (i = 3; i < tokenLength; i++)
+ num[i-3] = token[i];
+ num[i-3]=0;
+
+ pushString(buf," <font color=\"%s\"><small><em><a href=\"morph://Greek/%s\">(%s)</a></em></small></font> ",
+ strongs_color, num, num);
+ }
+
+ else if (!strncmp(token, "WTH", 3)) { // strong's numbers tense hebrew
+
+ char num[6];
+ for (i = 3; i < tokenLength; i++)
+ num[i-3] = token[i];
+ num[i-3]=0;
+
+ pushString(buf," <font color=\"%s\"><small><em><a href=\"morph://Hebrew/%s\">(%s)</a></em></small></font> ",
+ strongs_color, num, num);
+ }
+
+ else if (!strncmp(token, "RB", 2)) {
+ pushString(buf, "<i>");
+ userData["hasFootnotePreTag"] = "true";
+ }
+
+ else if (!strncmp(token, "RF", 2)) {
+ if(userData["hasFootnotePreTag"] == "true") {
+ userData["hasFootnotePreTag"] = "false";
+ pushString(buf, "</i> ");
+ }
+ pushString(buf,"<font color=\"%s\"><small> (",footnote_color);
+ }
+
+ else if (!strncmp(token, "FN", 2)) {
+ pushString(buf, "<font face=\"");
+ for (i = 2; i < tokenLength; i++)
+ if(token[i] != '\"')
+ *(*buf)++ = token[i];
+ pushString(buf,"\">");
+ }
+ else if (!strncmp(token, "CA", 2)) { // ASCII value
+ *(*buf)++ = (char)atoi(&token[2]);
+ }
+ else {
+ return false;
+ }
+ }
+ return true;
+}
+
+/** Update the tokens which use changeable settings. */
+void BT_GBFHTML::updateTokens(){
+ replaceTokenSubstitute("TT", QString::fromLatin1(" <h1><font color=\"%1\">").arg(text_color).local8Bit());
+ replaceTokenSubstitute("TS", QString::fromLatin1(" <H2><font color=\"%1\">").arg(text_color).local8Bit());
+ replaceTokenSubstitute("FR", QString::fromLatin1("<font color=\"%1\">").arg(jesuswords_color).latin1());
+}
diff --git a/bibletime/backend/bt_gbfhtml.h b/bibletime/backend/bt_gbfhtml.h
new file mode 100644
index 0000000..0b3f983
--- /dev/null
+++ b/bibletime/backend/bt_gbfhtml.h
@@ -0,0 +1,48 @@
+/***************************************************************************
+ gbfhtml.h - description
+ -------------------
+ begin : Tue Jun 15 15:34:26 CEST 1999
+
+ copyright : (C) 1999 by Torsten Uhlmann
+ email : TUhlmann@gmx.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+/* $Header: /cvsroot/bibletime/bibletime/bibletime/backend/bt_gbfhtml.h,v 1.6 2002/02/17 00:27:58 joachim Exp $ */
+/* $Revision: 1.6 $ */
+
+#ifndef GBFHTML_H
+#define GBFHTML_H
+
+#include "bt_basicfilter.h"
+
+class SWKey;
+class SWModule;
+
+/**
+* This filter converts GBF Text into HTML
+*/
+class BT_GBFHTML : public BT_BASICFILTER{
+
+public:
+ BT_GBFHTML ();
+ virtual bool handleToken(char **buf, const char *token, DualStringMap &userData);
+ /** No descriptions */
+ virtual char ProcessText(char * text, int maxlen, const SWKey *, const SWModule * = 0);
+
+protected: // Protected methods
+ /**
+ * Update the tokens which use changeable setttings.
+ */
+ virtual void updateTokens();
+};
+
+#endif
diff --git a/bibletime/backend/bt_thmlhtml.cpp b/bibletime/backend/bt_thmlhtml.cpp
new file mode 100644
index 0000000..3be0374
--- /dev/null
+++ b/bibletime/backend/bt_thmlhtml.cpp
@@ -0,0 +1,225 @@
+/***************************************************************************
+ thmlhtml.cpp - ThML to HTML filter
+ -------------------
+ begin : 1999-10-27
+ copyright : 2001 by CrossWire Bible Society
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+#include <stdlib.h>
+#include "bt_thmlhtml.h"
+#include "versekey.h"
+
+//Sword includes
+#include <swmodule.h>
+
+//Qt includes
+#include <qstring.h>
+
+BT_ThMLHTML::BT_ThMLHTML() {
+ setEscapeStringCaseSensitive(true);
+ setPassThruUnknownEscapeString(true); //the HTML widget will render the HTML escape codes
+ setEscapeStart("&");
+ setEscapeEnd(";");
+ addEscapeStringSubstitute("raquo", QString::fromLatin1("»").utf8());
+ addEscapeStringSubstitute("laquo", QString::fromLatin1("«").utf8());
+// addEscapeStringSubstitute("uuml", QString::fromLatin1("ü").utf8());
+// addEscapeStringSubstitute("ouml", QString::fromLatin1("ö").utf8());
+// addEscapeStringSubstitute("auml", QString::fromLatin1("ä").utf8());
+
+ setTokenStart("<");
+ setTokenEnd(">");
+ setTokenCaseSensitive(true);
+ addTokenSubstitute("note", " <small>(");
+ addTokenSubstitute("/note", ")</small> ");
+
+// addTokenSubstitute("foreign lang=\"el\"", "<font face=\"SIL Galatia\">");
+// addTokenSubstitute("foreign lang=\"he\"", "<font face=\"SIL Ezra\">");
+// addTokenSubstitute("/foreign", "</font>");
+
+}
+
+bool BT_ThMLHTML::handleToken(char **buf, const char *token, DualStringMap &userData) {
+ unsigned long i = 0;
+ const unsigned int tokenLength = strlen(token);
+
+ if (!substituteToken(buf, token) && !substituteEscapeString(buf, token)) {
+
+ if (!strncmp(token, "sync type=\"lemma\"", 17)) { //LEMMA
+ pushString(buf," <small><em>&lt;");
+
+ for (int j = 17; j < tokenLength; j++) {
+ if (!strncmp(token+j, "value=\"", 7)) {
+ j += 7;
+ for (;token[j] != '\"'; j++)
+ *(*buf)++ = token[j];
+ break;
+ }
+ }
+ pushString(buf, "&gt;</em></small> ");
+ }
+
+ else if (!strncmp(token, "sync type=\"morph\"", 17)) { //Morph
+ char num[12];
+ for (int j = 17; j < tokenLength; j++) {
+ if (!strncmp(token+j, "value=\"", 7)) {
+ j += 7;
+ int idx=0;
+ for (;token[j] != '\"'; j++,idx++)
+ num[idx] = token[j];
+ num[idx] = 0;
+ break;
+ }
+ }
+ pushString(buf," <font color=\"%s\"><small><em><a href=\"morph://Greek/%s\">(%s)</a></em></small></font> ",
+ morph_color, num, num);
+ }
+
+ else if (!strncmp(token, "sync type=\"Strongs\" value=\"H\"", 29)) {
+ char num[12];
+ for (i = 29; i < tokenLength; i++)
+ if(token[i] != '\"')
+ num[i-29] = token[i];
+ num[i-29] = 0;
+
+ pushString(buf," <font color=\"%s\"><small><em><a href=\"strongs://Hebrew/%s\">&lt;%s&gt;</a></em></small></font> ",
+ strongs_color, num, num);
+ }
+ else if (!strncmp(token, "sync type=\"Strongs\" value=\"G\"",29)) {
+ char num[12];
+ for (i = 29; i < tokenLength; i++)
+ if(token[i] != '\"')
+ num[i-29] = token[i];
+ num[i-29] = 0;
+
+ pushString(buf," <font color=\"%s\"><small><em><a href=\"strongs://Greek/%s\">&lt;%s&gt;</a></em></small></font> ",
+ strongs_color, num, num);
+ }
+
+ else if (!strncmp(token, "scripRef p", 10) || !strncmp(token, "scripRef v", 10)) {
+ userData["inscriptRef"] = "true";
+ if (!strncmp(token, "scripRef v", 10)) { //module given
+
+ char module_version[500];
+ for (i = 18; i < tokenLength-1; i++) {
+ if(token[i] != '\"')
+ module_version[i-18] = token[i];
+ else
+ break;
+ }
+ module_version[i-18] = 0;
+ //c contains the module
+ userData["lastRefModule"] = module_version;
+ }
+ else if (!strncmp(token, "scripRef p", 10)) { //passage without module
+ char verse_str[5000];
+ for (i = 18; i < tokenLength-1; i++) {
+ if(token[i] != '\"')
+ verse_str[i-18] = token[i];
+ else
+ break;
+ }
+ verse_str[i-18] = 0;
+ const char* ref = parseThMLRef(verse_str);
+ pushString(buf, ref);
+ delete [] ref;//delete now because it's unused
+ }
+ if ( !strncmp(token+i+2, "passage=", 8) ) { //passage after module part
+ char verse_str[5000];
+ i+=11;
+ int idx = 0;
+ for (; i < tokenLength-1; i++,idx++) {
+ if(token[i] != '\"')
+ verse_str[idx] = token[i];
+ else
+ break;
+ }
+ verse_str[idx] = '\0';
+ const char* ref = parseThMLRef(verse_str, userData["lastRefModule"].c_str());
+ pushString(buf, ref);
+ delete [] ref;
+ }
+ }
+ // we're starting a scripRef like "<scripRef>John 3:16</scripRef>"
+ else if (!strcmp(token, "scripRef")) {
+ userData["inscriptRef"] = "false";
+ // let's stop text from going to output
+ userData["suspendTextPassThru"] = "true";
+ }
+ // we've ended a scripRef
+ else if (!strcmp(token, "/scripRef")) {
+ if (userData["inscriptRef"] == "true") { // like "<scripRef passage="John 3:16">John 3:16</scripRef>"
+ userData["inscriptRef"] = "false";
+ pushString(buf, thmlRefEnd());
+ }
+ else { // like "<scripRef>John 3:16</scripRef>"
+ const char* ref = parseSimpleRef(userData["lastTextNode"].c_str());
+ pushString(buf, ref);
+ delete [] ref;//delete now because it's unused
+ userData["suspendTextPassThru"] = "false";
+ }
+ }
+
+//headings should be processed by the ThMLHeadings filter
+ else if (!strncmp(token, "div class=\"sechead\"", 19)) {
+ userData["SecHead"] = "true";
+ pushString(buf, "<H2><FONT color=\"%s\">", text_color);
+ }
+ else if (!strncmp(token, "div class=\"title\"", 19)) {
+ userData["Title"] = "true";
+ pushString(buf, "<H1><FONT color=\"%s\">", text_color);
+ }
+ else if (!strncmp(token, "/div", 4)) {
+ if (userData["SecHead"] == "true") {
+ pushString(buf, "</FONT></H2>");
+ userData["SecHead"] = "false";
+ }
+ else if(userData["Title"] == "true") {
+ pushString(buf, "</FONT></H1>");
+ userData["Title"] = "false";
+ }
+ }
+ else if (!strncmp(token, "img ", 4)) {
+ const char *src = strstr(token, "src");
+ if (!src) // assert we have a src attribute
+ return false;
+
+ *(*buf)++ = '<';
+ for (const char *c = token; *c; c++) {
+ if (c == src) {
+ for (;((*c) && (*c != '"')); c++)
+ *(*buf)++ = *c;
+
+ if (!*c) { c--; continue; }
+
+ *(*buf)++ = '"';
+ if (*(c+1) == '/') {
+ pushString(buf, "file:");
+ pushString(buf, module->getConfigEntry("AbsoluteDataPath"));
+ if (*(*buf-1) == '/')
+ c++; // skip '/'
+ }
+ continue;
+ }
+ *(*buf)++ = *c;
+ }
+ *(*buf)++ = '>';
+ }
+ else { // let token pass thru
+ *(*buf)++ = '<';
+ for (i = 0; i < tokenLength; i++)
+ *(*buf)++ = token[i];
+ *(*buf)++ = '>';
+ }
+ }
+ return true;
+}
diff --git a/bibletime/backend/bt_thmlhtml.h b/bibletime/backend/bt_thmlhtml.h
new file mode 100644
index 0000000..b469ca4
--- /dev/null
+++ b/bibletime/backend/bt_thmlhtml.h
@@ -0,0 +1,35 @@
+/***************************************************************************
+ thmlhtml.h - description
+ -------------------
+ begin : 1999-10-28
+
+ copyright : 1999 by Chris Little
+ email : chrislit@chiasma.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef THMLHTML_H
+#define THMLHTML_H
+
+#include "bt_basicfilter.h"
+
+/**
+* This filter converts ThML text to HTML text
+*/
+class BT_ThMLHTML : public BT_BASICFILTER {
+
+public:
+ BT_ThMLHTML ();
+ virtual bool handleToken(char **buf, const char *token, DualStringMap &userData);
+// virtual char ProcessText (char *text, int maxlen = -1);
+};
+
+#endif
diff --git a/bibletime/backend/chtmlbookdisplay.cpp b/bibletime/backend/chtmlbookdisplay.cpp
new file mode 100644
index 0000000..5211f4d
--- /dev/null
+++ b/bibletime/backend/chtmlbookdisplay.cpp
@@ -0,0 +1,81 @@
+/***************************************************************************
+ chtmlbookdisplay.cpp - description
+ -------------------
+ begin : Mon Mar 11 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "chtmlbookdisplay.h"
+#include "cswordbookmoduleinfo.h"
+#include "cswordtreekey.h"
+#include "creferencemanager.h"
+#include "../util/scoped_resource.h"
+
+char CHTMLBookDisplay::Display( CSwordModuleInfo* module ){
+ CSwordBookModuleInfo* book = dynamic_cast<CSwordBookModuleInfo*>(module);
+ util::scoped_ptr<CSwordTreeKey> key( dynamic_cast<CSwordTreeKey*>( CSwordKey::createInstance(book) ) );
+ m_htmlText = QString::null;
+
+ if (!module || !key) {
+ return 0;
+ }
+ const int displayLevel = book->config( CSwordModuleInfo::DisplayLevel ).toInt();
+ key->key(book->module()->KeyText());
+ updateSettings();
+ if (!displayLevel) {
+ m_htmlText = key->renderedText();
+ return 0;
+ }
+ const QString oldKey = key->key();
+
+ int moved = 0;
+
+ while (key->firstChild())
+ ++moved; //down
+
+ for (int i = 1; i < displayLevel; i++) {
+ if (!key->parent() || key->key() == "/" || key->key().isEmpty()) {
+ break;
+ }
+ --moved; //up
+ };
+
+ if (moved <= 1) { //display entries together
+ while(key->previousSibling()); //first entry of it's parent
+ printTree(*key, book);
+ key->key(oldKey);
+ return 1;
+ }
+ else { //do not display entries together
+ key->key(oldKey.isNull() ? "/" : oldKey);
+ m_htmlText = key->renderedText();
+ return 1;
+ }
+}
+
+void CHTMLBookDisplay::printTree(CSwordTreeKey treeKey, CSwordBookModuleInfo* module, const int levelPos){
+ m_htmlText += QString::fromLatin1("<A NAME=\"%1\" HREF=\"%2\">%3</A>: %4<BR>")
+ .arg(treeKey.getLocalName())
+ .arg(CReferenceManager::encodeHyperlink(module->name(), treeKey.getFullName(), CReferenceManager::GenericBook))
+ .arg(treeKey.getFullName())
+ .arg(treeKey.renderedText());
+
+ if (treeKey.hasChildren()) {
+ m_htmlText += QString::fromLatin1("<H3>%1</H3>").arg(treeKey.getFullName());
+ treeKey.firstChild();
+ printTree(treeKey, module, levelPos+1);
+ treeKey.parent();
+ }
+ if (treeKey.nextSibling())
+ printTree(treeKey, module, levelPos);
+}
diff --git a/bibletime/backend/chtmlbookdisplay.h b/bibletime/backend/chtmlbookdisplay.h
new file mode 100644
index 0000000..19ba6a8
--- /dev/null
+++ b/bibletime/backend/chtmlbookdisplay.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ chtmlbookdisplay.h - description
+ -------------------
+ begin : Mon Mar 11 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CHTMLBOOKDISPLAY_H
+#define CHTMLBOOKDISPLAY_H
+
+#include "chtmlentrydisplay.h"
+#include "cswordtreekey.h"
+
+class CSwordBookModuleInfo;
+
+/**
+ * The display class to display
+ * the general book modules.
+ * @author The BibleTime team
+ */
+class CHTMLBookDisplay : public CHTMLEntryDisplay {
+public:
+ /**
+ * Renders the current entry of the module using HTML tags.
+ * The rendered text is cached so it's faster if it's called for the
+ * same key next time.
+ */
+ virtual char Display(CSwordModuleInfo* module);
+
+private:
+ void printTree(CSwordTreeKey treeKey, CSwordBookModuleInfo* module, const int levelPos = 0);
+};
+
+#endif
diff --git a/bibletime/backend/chtmlchapterdisplay.cpp b/bibletime/backend/chtmlchapterdisplay.cpp
new file mode 100644
index 0000000..ecb0d16
--- /dev/null
+++ b/bibletime/backend/chtmlchapterdisplay.cpp
@@ -0,0 +1,160 @@
+/***************************************************************************
+ chtmlchapterdisplay.cpp - description
+ -------------------
+ begin : Thu Oct 12 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTiem includes
+#include "chtmlchapterdisplay.h"
+#include "cswordmoduleinfo.h"
+#include "cswordversekey.h"
+#include "../frontend/ctoolclass.h"
+#include "creferencemanager.h"
+
+//Qt includes
+#include <qfont.h>
+
+//Sword includes
+#include <versekey.h>
+
+/** Renders the text and puts the result into the member variable m_htmlText */
+char CHTMLChapterDisplay::Display( CSwordModuleInfo* module ){
+ if (!module) {
+ m_htmlText = QString::null;
+ return 0; //error
+ }
+
+ CSwordVerseKey key(0);
+ key.key( module->module()->KeyText() );
+ const int currentTestament = key.Testament();
+ const int currentBook = key.Book();
+ const int currentChapter = key.Chapter();
+ const int currentVerse = key.Verse();
+
+ key.module(module);
+ int verse = 0;
+
+ if (module->isUnicode()) {
+ m_htmlHeader = "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"></head>";
+ }
+ m_htmlText = m_htmlHeader + QString::fromLatin1("<body>");
+
+ //reload font settings
+ updateSettings();
+ m_htmlText.append(QString::fromLatin1("<font face=\"%1\" size=\"%2\" color=\"%3\">")
+ .arg(module->isUnicode() ? m_unicodeFontName : m_standardFontName)
+ .arg(module->isUnicode() ? m_unicodeFontSize : m_standardFontSize)
+ .arg(m_standardFontColorName)
+ );
+
+ bool ok = true;
+ for (key.Verse(1); key.Testament() == currentTestament && key.Book() == currentBook && key.Chapter() == currentChapter && ok && !module->module()->Error(); ok = key.next(CSwordVerseKey::UseVerse)) {
+ verse = key.Verse();
+ if (m_displayOptionsBool.verseNumbers) {
+ m_htmlText.append( QString::fromLatin1("<font color=\"%1\"><a name=\"%2\" href=\"%3\"><b>%4</b></a></font> ")
+ .arg(m_swordRefColorName)
+ .arg(verse)
+ .arg(CReferenceManager::encodeHyperlink( module->name(), key.key(), CReferenceManager::typeFromModule(module->type()) ))
+ .arg(verse)
+ );
+ }
+ if (verse == currentVerse)
+ m_htmlText += QString::fromLatin1("<font color=\"") + m_highlightedVerseColorName + QString::fromLatin1("\">");
+ m_htmlText += key.renderedText();
+ if (verse == currentVerse)
+ m_htmlText += QString::fromLatin1("</font>");
+ if (m_displayOptionsBool.lineBreaks)
+ m_htmlText += QString::fromLatin1("<br>\n");
+ else
+ m_htmlText += QString::fromLatin1(" \n");
+ }
+
+ m_htmlText += QString::fromLatin1("</font>") + m_htmlBody;
+ return 1; //no error
+}
+
+/** Generates code to display the given modules side by side. */
+char CHTMLChapterDisplay::Display( QList<CSwordModuleInfo>* moduleList){
+#warning make table colors configurable
+ if (!moduleList || (moduleList && !moduleList->count()) ) {
+ m_htmlText = QString::null;
+ return 0;
+ }
+ //reload font settings
+ updateSettings();
+
+ SWModule* module = moduleList->first()->module();
+
+ VerseKey* vk = (VerseKey*)((SWKey*)(*module));
+ CSwordVerseKey key(0);
+ key.key((const char*)*vk);
+
+ const int currentTestament = key.Testament();
+ const int currentBook = key.Book();
+ const int currentChapter = key.Chapter();
+ const int chosenVerse = key.Verse();
+ const int width = (int)((double)97/(double)moduleList->count()); //width in per cent!!
+ CSwordModuleInfo *d = 0;
+
+ m_htmlText = QString::fromLatin1("<qt text=\"%1\">").arg(m_standardFontColorName); //for compatibility with Qt's rendering
+ m_htmlText += m_htmlHeader + QString::fromLatin1("<body text=\"%1\">").arg(m_standardFontColorName);
+
+
+ m_htmlText += QString::fromLatin1("<table cellpadding=\"2\" cellspacing=\"0\"><td bgcolor=\"#f1f1f1\"></td>");
+ SWModule *m = (d = moduleList->first()) ? d->module() : 0;
+
+ QString text = QString::fromLatin1("<td width=\"%1%\" bgcolor=\"#f1f1f1\"><b>%1</b></td>");
+ while (m) {
+ m_htmlText += text.arg(width).arg(d->name());
+ m = (d=moduleList->next()) ? d->module() : 0;
+ }
+ m_htmlText += QString::fromLatin1("</tr>");
+
+ CSwordVerseKey current(0);
+ QString rowText = QString::null;
+ int currentVerse = 0;
+ text = QString::fromLatin1("<tr><td bgcolor=\"#f1f1f1\"><b><font color=\"%1\"><a name=\"%2\" href=\"%3\">%4</a></b></td>\n");
+ const QString cell = QString::fromLatin1("<td width=\"%1%\" bgcolor=\"%2\">");
+
+ for (key.Verse(1); key.Testament() == currentTestament && key.Book() == currentBook && key.Chapter() == currentChapter && !module->Error(); key.next(CSwordVerseKey::UseVerse)) {
+ const QString currentKey = key.key();
+ currentVerse = key.Verse();
+ m = (d = moduleList->first()) ? d->module() : 0;
+ rowText = text.arg(m_swordRefColorName).arg(currentVerse).arg(CReferenceManager::encodeHyperlink( d->name(), currentKey, CReferenceManager::typeFromModule(d->type()) )).arg(currentVerse);
+
+ current.key(currentKey);
+ while (m) {
+ current.module(d);
+ rowText += cell.arg(width).arg(currentVerse % 2 ? "white" : "#f1f1f1");
+ if (d->isUnicode())
+ rowText +=
+ QString::fromLatin1("<font face=\"%1\" size=\"%2\">")
+ .arg(m_unicodeFontName)
+ .arg(m_unicodeFontSize);
+ if (currentVerse == chosenVerse)
+ rowText += QString::fromLatin1("<font color=\"%1\">")
+ .arg(m_highlightedVerseColorName);
+
+ rowText += current.renderedText() + QString::fromLatin1("</font>");
+ m = (d = moduleList->next()) ? d->module() : 0;
+ }
+ m_htmlText += rowText + QString::fromLatin1("</tr>\n");
+ }
+ m_htmlText += QString::fromLatin1("</font></table>")
+ + m_htmlBody
+ + QString::fromLatin1("</qt>");
+
+ //clean up
+ return 1;
+}
diff --git a/bibletime/backend/chtmlchapterdisplay.h b/bibletime/backend/chtmlchapterdisplay.h
new file mode 100644
index 0000000..3e169af
--- /dev/null
+++ b/bibletime/backend/chtmlchapterdisplay.h
@@ -0,0 +1,43 @@
+/***************************************************************************
+ chtmlchapterdisplay.h - description
+ -------------------
+ begin : Thu Oct 12 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CHTMLCHAPTERDISPLAY_H
+#define CHTMLCHAPTERDISPLAY_H
+
+#include "chtmlentrydisplay.h"
+
+/**
+ * The display which renders a chapter
+ * @author The BibleTime team
+ * @version $Id: chtmlchapterdisplay.h,v 1.4 2001/11/07 19:20:35 mgruner Exp $
+ */
+class CHTMLChapterDisplay : public CHTMLEntryDisplay {
+public:
+ /**
+ * Renders the current chapter of the module using HTML tags.
+ * The finished HTML text could be retrieved using the function
+ * #getHTML.
+ * This is a reimplementation from CHTMLEntryDisplay
+ */
+ virtual char Display( CSwordModuleInfo* module );
+ /**
+ * Generates code to display the given modules side by side.
+ */
+ virtual char Display( QList<CSwordModuleInfo>* moduleList);
+};
+
+#endif
diff --git a/bibletime/backend/chtmlentrydisplay.cpp b/bibletime/backend/chtmlentrydisplay.cpp
new file mode 100644
index 0000000..2589220
--- /dev/null
+++ b/bibletime/backend/chtmlentrydisplay.cpp
@@ -0,0 +1,179 @@
+/***************************************************************************
+ chtmlentrydisplay.cpp - description
+ -------------------
+ begin : Wed Oct 11 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+#include "chtmlentrydisplay.h"
+#include "cswordmoduleinfo.h"
+#include "cswordkey.h"
+#include "cswordldkey.h"
+#include "cswordversekey.h"
+#include "creferencemanager.h"
+#include "../frontend/ctoolclass.h"
+#include "../frontend/cbtconfig.h"
+
+#include "../util/scoped_resource.h"
+
+
+//Qt includes
+#include <qfont.h>
+
+//Sword includes
+#include <versekey.h>
+
+CHTMLEntryDisplay::CHTMLEntryDisplay(){
+ m_htmlHeader = "<html><head></head>";
+ m_htmlBody = "</body></html>";
+ m_includeHeader = true;
+}
+
+CHTMLEntryDisplay::~CHTMLEntryDisplay(){
+}
+
+void CHTMLEntryDisplay::updateSettings(void){
+ m_highlightedVerseColorName = CBTConfig::get(CBTConfig::highlightedVerseColor).name();
+ m_standardFontColorName = CBTConfig::get(CBTConfig::textColor).name();
+ m_swordRefColorName = CBTConfig::get(CBTConfig::swordRefColor).name();
+
+ m_standardFontName = CBTConfig::get(CBTConfig::standard).family();
+ m_standardFontSize = CToolClass::makeLogicFontSize(CBTConfig::get(CBTConfig::standard).pointSize() );
+
+ m_unicodeFontName = CBTConfig::get(CBTConfig::unicode).family();
+ m_unicodeFontSize = CToolClass::makeLogicFontSize( CBTConfig::get(CBTConfig::unicode).pointSize() );
+}
+
+/** Displays the current entry of the module as HTML */
+char CHTMLEntryDisplay::Display(CSwordModuleInfo* module) {
+ if (!module) {
+ m_htmlText = QString::null;
+ return -1;
+ }
+ //refresh font settings
+ updateSettings();
+
+ util::scoped_ptr<CSwordKey> key( CSwordKey::createInstance(module) );
+ if (!key) {
+ m_htmlText = QString::null;
+ return 0;
+ }
+ key->key( module->module()->KeyText() );
+
+ CReferenceManager::Type refType = CReferenceManager::Unknown;
+ if (module->type() == CSwordModuleInfo::Bible)
+ refType = CReferenceManager::Bible;
+ else if (module->type() == CSwordModuleInfo::Commentary)
+ refType = CReferenceManager::Commentary;
+ else if (module->type() == CSwordModuleInfo::Lexicon)
+ refType = CReferenceManager::Lexicon;
+ else if (module->type() == CSwordModuleInfo::GenericBook)
+ refType = CReferenceManager::GenericBook;
+
+ if (m_includeHeader) {
+ m_htmlText = m_htmlHeader;
+
+ m_htmlText.append(QString::fromLatin1("<body><font color=\"%1\" face=\"%2\" size=\"%3\">")
+ .arg(m_standardFontColorName)
+ .arg( module->isUnicode() ? m_unicodeFontName : m_standardFontName)
+ .arg( module->isUnicode() ? m_unicodeFontSize : m_standardFontSize));
+
+ m_htmlText.append(QString::fromLatin1("<font color=\"%1\"><a href=\"%2\">%3: <b>%4</b></a></font><hr>%5")
+ .arg(m_highlightedVerseColorName)
+ .arg(CReferenceManager::encodeHyperlink(module->name(),key->key(), refType ))
+ .arg(module->config(CSwordModuleInfo::Description))
+ .arg(key->key())
+ .arg(key->renderedText()));
+
+ m_htmlText += QString::fromLatin1("</font>") + m_htmlBody;
+ }
+ else {
+ m_htmlText = key->renderedText();
+ }
+
+ return 1;
+}
+
+/** Generates code to display the given modules side by side. */
+char CHTMLEntryDisplay::Display( QList<CSwordModuleInfo>* moduleList) {
+// qDebug("CHTMLEntryDisplay::Display( QList<CSwordModuleInfo>* moduleList)");
+ if (!moduleList || (moduleList && !moduleList->count()) ) {
+ m_htmlText = QString::null;
+ return 0;
+ }
+ //reload font settings
+ updateSettings();
+
+ util::scoped_ptr<CSwordKey> key( CSwordKey::createInstance(moduleList->first()) );
+
+ SWModule* module = moduleList->first()->module();
+// ASSERT(module);
+ QString usedKey = QString::null;
+ CSwordModuleInfo *d = 0;
+
+ SWModule *m= (d = moduleList->first()) ? d->module() : 0;
+ SWKey* sw = (SWKey*)(*module);
+ key->key(*sw);
+ usedKey = key->key();
+ m = (d = moduleList->first()) ? d->module() : 0;
+ while (m) {
+ m = (d=moduleList->next()) ? d->module() : 0;
+ if (m) {
+ m->SetKey( (const char*)usedKey.local8Bit() );
+ d->snap();
+ }
+ }
+
+ const int width=(int)((double)100/(double)moduleList->count());
+ m_htmlText = m_htmlHeader + QString::fromLatin1("<TABLE cellpadding=\"2\" cellspacing=\"0\"><TR>");
+ m_htmlText.append(QString("<font face=\"%1\" size=\"%2\" color=\"%3\">")
+ .arg(m_standardFontName).arg(m_standardFontSize).arg(m_standardFontColorName));
+
+ m = (d = moduleList->first()) ? d->module() : 0;
+ while (m) {
+ key->module(d);
+ if (m){
+ m_htmlText.append(QString("<td width=\"%1\" bgcolor=\"#f1f1f1\"><b>%2 ")
+ .arg(width).arg(d->name()));
+ m_htmlText.append(QString("(<font color=\"%1\" face=\"%2\" size=\"%3\">%4</font>)</b></td>")
+ .arg(m_highlightedVerseColorName)
+ .arg((d && d->isUnicode() ) ? m_unicodeFontName : m_standardFontName)
+ .arg((d && d->isUnicode() ) ? m_unicodeFontSize : m_standardFontSize)
+ .arg(key->key())
+ );
+ }
+ m = (d=moduleList->next()) ? d->module() : 0;
+ }
+ m_htmlText.append(QString::fromLatin1("</TR>"));
+
+ m = (d = moduleList->first()) ? d->module() : 0;
+ m_htmlText += QString::fromLatin1("<TR>");
+ while (m) {
+ key->module(d);
+ key->key(usedKey);
+
+ m_htmlText +=
+ QString::fromLatin1("<td width=\"%1%\"><FONT face =\"%2\" size=\"%3\">%4</font></td>")
+ .arg(width)
+ .arg((d && d->isUnicode() ) ? m_unicodeFontName : m_standardFontName)
+ .arg((d && d->isUnicode() ) ? m_unicodeFontSize : m_standardFontSize)
+ .arg(key->renderedText());
+ m = (d = moduleList->next()) ? d->module() : 0;
+ }
+ m_htmlText += QString::fromLatin1("</font></tr></table>") + m_htmlBody;
+
+ //clean up
+// delete key;
+ return 1;
+}
diff --git a/bibletime/backend/chtmlentrydisplay.h b/bibletime/backend/chtmlentrydisplay.h
new file mode 100644
index 0000000..1adc285
--- /dev/null
+++ b/bibletime/backend/chtmlentrydisplay.h
@@ -0,0 +1,110 @@
+/***************************************************************************
+ chtmlentrydisplay.h - description
+ -------------------
+ begin : Wed Oct 11 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CHTMLENTRYDISPLAY_H
+#define CHTMLENTRYDISPLAY_H
+
+//BibleTime includes
+
+//Qt includes
+#include <qstring.h>
+#include <qlist.h>
+#include <qfont.h>
+
+//Sword includes
+#include <swdisp.h>
+#include <swmodule.h>
+
+#include "cswordbackend.h"
+
+
+class CHTMLChapterDisplay;
+class CSwordModuleInfo;
+
+/**
+ * The display class for entry based modules.
+ * @author The BibleTime team
+ * @version $Id: chtmlentrydisplay.h,v 1.12 2002/03/20 15:08:44 joachim Exp $
+ */
+class CHTMLEntryDisplay : public SWDisplay {
+public:
+ /**
+ * The constructor of CHTMLEntryDisplay.
+ * This is the constructor of CHTMLEntryDisplay. It initializes the members
+ * and creates the objects we need to create the required HTML formatted text.
+ */
+ CHTMLEntryDisplay();
+ virtual ~CHTMLEntryDisplay();
+ /**
+ * Renders the current entry of the module using HTML tags.
+ * The rendered text is cached so it's faster if it's called for the
+ * same key next time.
+ */
+ virtual char Display(CSwordModuleInfo* module);
+ /**
+ * Generates code to display the given modules side by side.
+ */
+ virtual char Display( QList<CSwordModuleInfo>* moduleList);
+ /**
+ * This function returns the last looked up HTML text.
+ */
+ const QString getHTML() const;
+ /**
+ * Call this with false as argument to switch off the headers (module anme and current position)
+ */
+ void setIncludeHeader( const bool includeHeader );
+ void setDisplayOptions( const CSwordBackend::DisplayOptionsBool options);
+
+protected:
+ bool m_includeHeader;
+
+ QString m_htmlText;
+ QString m_htmlHeader;
+ QString m_htmlBody;
+
+ QString m_highlightedVerseColorName;
+ QString m_standardFontColorName;
+ QString m_swordRefColorName;
+
+
+ QString m_standardFontName;
+ QString m_unicodeFontName;
+ int m_standardFontSize;
+ int m_unicodeFontSize;
+
+ void updateSettings(void);
+
+ CSwordBackend::DisplayOptionsBool m_displayOptionsBool;
+};
+
+/** Returns the generated HTML text. */
+inline void CHTMLEntryDisplay::setDisplayOptions(const CSwordBackend::DisplayOptionsBool options){
+ m_displayOptionsBool = options;
+}
+
+
+/** Returns the generated HTML text. */
+inline const QString CHTMLEntryDisplay::getHTML() const {
+ return m_htmlText;
+}
+
+/** Call this with false as argument to switch off the headers (module anme and current position) */
+inline void CHTMLEntryDisplay::setIncludeHeader( const bool includeHeader ){
+ m_includeHeader = includeHeader;
+}
+
+#endif
diff --git a/bibletime/backend/creferencemanager.cpp b/bibletime/backend/creferencemanager.cpp
new file mode 100644
index 0000000..9927cc6
--- /dev/null
+++ b/bibletime/backend/creferencemanager.cpp
@@ -0,0 +1,255 @@
+/***************************************************************************
+ creferencemanager.cpp - description
+ -------------------
+ begin : Sun Aug 19 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "creferencemanager.h"
+#include "cswordversekey.h"
+
+#include "../frontend/cbtconfig.h"
+
+/** Returns a hyperlink used to be imbedded in the display windows. At the moment the format is sword://module/key */
+const QString CReferenceManager::encodeHyperlink( const QString& module, const QString& key, const CReferenceManager::Type& type){
+ QString ret = QString::null;
+ switch (type) {
+ case Bible:
+ ret = QString::fromLatin1("sword://Bible/");
+ break;
+ case Commentary:
+ ret = QString::fromLatin1("sword://Commentary/");
+ break;
+ case Lexicon:
+ ret = QString::fromLatin1("sword://Lexicon/");
+ break;
+ case GenericBook:
+ ret = QString::fromLatin1("sword://Book/");
+ break;
+ case MorphHebrew:
+ ret = QString::fromLatin1("morph://Hebrew/");
+ break;
+ case MorphGreek:
+ ret = QString::fromLatin1("morph://Greek/");
+ break;
+ case StrongsHebrew:
+ ret = QString::fromLatin1("strongs://Hebrew/");
+ break;
+ case StrongsGreek:
+ ret = QString::fromLatin1("strongs://Greek/");
+ break;
+ default:
+ break;
+ }
+
+ if (!module.isEmpty())
+ ret += module + QString::fromLatin1("/");
+ else { //if module is empty use fallback module
+ ret += preferredModule(type) + QString::fromLatin1("/");
+ }
+
+ if (type == GenericBook) {
+ const QString s = (!key.isEmpty() ? key : QString::null);
+ QString newKey = QString::null;
+ //replace all / of the key (e.g. of a CSwordTreeKey) with
+ // the escape sequence \/ so we know it's a link divider!
+ for(unsigned int i = 0; i < s.length(); ++i) {
+ if (s[i] == '/')
+ newKey += "\\/";
+ else
+ newKey += s[i];
+ }
+ ret += newKey;
+ }
+ else { //slashes do not appear in verses and dictionary entries
+ ret += key;
+ }
+ return ret;
+}
+
+/** Decodes the given hyperlink to module and key. */
+const bool CReferenceManager::decodeHyperlink( const QString& hyperlink, QString& module, QString& key, CReferenceManager::Type& type ){
+ /**
+ * We have to decide between three types of URLS: sword://Type/Module/Key, morph://Testament/key and strongs://Testament/Key
+ */
+ module = QString::null;
+ key = QString::null;
+
+ type = Unknown; //not yet known
+ QString ref = hyperlink;
+ //remove the trailing slash
+ if (ref.right(1)=="/")
+ ref = ref.left(ref.length()-1);
+
+ //find out which type we have by looking at the beginning (protocoll section of URL)
+ if (ref.left(8) == "sword://") { //Bible, Commentary or Lexicon
+ ref = ref.mid(8);
+ if (ref.left(5) == "Bible") { //a bible hyperlink
+ type = CReferenceManager::Bible;
+ ref = ref.mid(6); //inclusive trailing slash
+ }
+ else if (ref.left(10) == "Commentary") { // a Commentary hyperlink
+ type = CReferenceManager::Commentary;
+ ref = ref.mid(11); //inclusive trailing slash
+ }
+ else if (ref.left(7) == "Lexicon") { // a Lexicon hyperlink
+ type = CReferenceManager::Lexicon;
+ ref = ref.mid(8); //inclusive trailing slash
+ }
+ else if (ref.left(4) == "Book") { // a Book hyperlink
+ type = CReferenceManager::GenericBook;
+ ref = ref.mid(5); //inclusive trailing slash
+ }
+ // string up to next slash is the modulename
+ while (true) {
+ const int pos = ref.find("/");
+ if (pos>0 && ref.at(pos-1) != '\\') { //found a slash which is not escaped
+ module = ref.mid(0,pos);
+ ref = ref.mid(pos+1);
+ break;
+ }
+ }
+ // the rest is the key
+ key = ref;
+ //replace \/ escapes with /
+ key.replace(QRegExp("\\\\/"), "/");
+ }
+ else if (ref.left(8) == "morph://" || ref.left(10) == "strongs://") { //strongs or morph URL have the same format
+ enum PreType {IsMorph, IsStrongs};
+ PreType preType = IsMorph;
+ if (ref.left(8) == "morph://") { //morph code hyperlink
+ ref = ref.mid(8);
+ preType = IsMorph;
+ }
+ else if (ref.left(10) == "strongs://") {
+ ref = ref.mid(10);
+ preType = IsStrongs;
+ }
+ //part up to next slash is the language
+ const int pos = ref.find("/");
+ if (pos>0) { //found
+ const QString language = ref.mid(0,pos);
+ if (language == "Hebrew") {
+ switch (preType) {
+ case IsMorph:
+ type = CReferenceManager::MorphHebrew;
+ break;
+ case IsStrongs:
+ type = CReferenceManager::StrongsHebrew;
+ break;
+ }
+ }
+ else if (language == "Greek") {
+ switch (preType) {
+ case IsMorph:
+ type = CReferenceManager::MorphGreek;
+ break;
+ case IsStrongs:
+ type = CReferenceManager::StrongsGreek;
+ break;
+ }
+ }
+ ref = ref.mid(pos+1);
+ key = ref; //the remaining part is the key
+
+ module = preferredModule(type);
+ }
+ }
+
+ if (key.isEmpty() && module.isEmpty())
+ return false;
+ return true;
+}
+
+const QString CReferenceManager::encodeReference(const QString &module, const QString &reference){
+ return QString::fromLatin1("(%1)%2").arg(module).arg(reference);
+}
+
+void CReferenceManager::decodeReference(QString &dragreference, QString &module, QString &reference){
+ const int pos = dragreference.find(")");
+ const QString fallbackModule = dragreference.mid( 1, pos - 1);
+ dragreference = dragreference.mid(pos+1);
+
+ module = fallbackModule;
+ reference = dragreference;
+}
+
+/** Returns true if the parameter is a hyperlink. */
+const bool CReferenceManager::isHyperlink( const QString& hyperlink ){
+ return ( hyperlink.left(8) == "sword://")
+ || (hyperlink.left(10) == "strongs://")
+ || (hyperlink.left(8) == "morph://");
+}
+
+/** Returns the preferred module name for the given type. */
+const QString CReferenceManager::preferredModule( const CReferenceManager::Type type ){
+ QString description = QString::null;
+ switch (type) {
+ case CReferenceManager::Bible:
+ description = CBTConfig::get( CBTConfig::standardBible );
+ break;
+ case CReferenceManager::Commentary:
+ description = CBTConfig::get( CBTConfig::standardCommentary );
+ break;
+ case CReferenceManager::Lexicon:
+ description = CBTConfig::get( CBTConfig::standardLexicon );
+ break;
+ case CReferenceManager::StrongsHebrew:
+ description = CBTConfig::get( CBTConfig::standardHebrewStrongsLexicon );
+ break;
+ case CReferenceManager::StrongsGreek:
+ description = CBTConfig::get( CBTConfig::standardGreekStrongsLexicon );
+ break;
+ case CReferenceManager::MorphHebrew:
+ description = CBTConfig::get( CBTConfig::standardHebrewMorphLexicon );
+ break;
+ case CReferenceManager::MorphGreek:
+ description = CBTConfig::get( CBTConfig::standardGreekMorphLexicon );
+ break;
+ default:
+ qWarning("unknwon type");
+ description = QString::null;
+ break;
+ }
+ if (!description.isEmpty())
+ return CSwordBackend::findModuleNameByDescription(description);
+ else
+ return QString::null;
+}
+
+/** No descriptions */
+CReferenceManager::Type CReferenceManager::typeFromModule( const CSwordModuleInfo::ModuleType type){
+ switch (type) {
+ case CSwordModuleInfo::Bible:
+ return CReferenceManager::Bible;
+ case CSwordModuleInfo::Commentary:
+ return CReferenceManager::Commentary;
+ case CSwordModuleInfo::Lexicon:
+ return CReferenceManager::Lexicon;
+ default:
+ return CReferenceManager::Unknown;
+ }
+}
+
+/** Parses the given verse references using the given language and the module.*/
+const QString CReferenceManager::parseVerseReference( const QString ref, const QString& lang, const QString& newLang){
+ CSwordVerseKey key(0);
+ if (!lang.isEmpty())
+ key.setLocale( lang.latin1() );
+
+ key.key(ref);
+
+ if (!lang.isEmpty() && lang != newLang)
+ key.setLocale(newLang.latin1());
+ return key.key();
+}
diff --git a/bibletime/backend/creferencemanager.h b/bibletime/backend/creferencemanager.h
new file mode 100644
index 0000000..661d955
--- /dev/null
+++ b/bibletime/backend/creferencemanager.h
@@ -0,0 +1,83 @@
+/***************************************************************************
+ creferencemanager.h - description
+ -------------------
+ begin : Sun Aug 19 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CREFERENCEMANAGER_H
+#define CREFERENCEMANAGER_H
+
+//Qt includes
+#include <qstring.h>
+
+#include "cswordmoduleinfo.h"
+
+/**Contains static functions to compute with referneces used for Drag&Drop and for hyperlinks used in HTML.
+ *@author The BibleTime team
+ */
+class CReferenceManager {
+public:
+ enum Type {
+ Bible,
+ Commentary,
+ Lexicon,
+ GenericBook,
+ MorphHebrew,
+ MorphGreek,
+ StrongsHebrew,
+ StrongsGreek,
+ Unknown
+ };
+ /**
+ * Decodes the given hyperlink to module and key.
+ */
+ static const bool decodeHyperlink( const QString& hyperlink, QString& module, QString& key,Type& type);
+ /**
+ * Returns a hyperlink used to be imbedded in the display windows.
+ * At the moment the format is sword://module/key
+ */
+ static const QString encodeHyperlink( const QString& module, const QString& key, const Type& type);
+ /**
+ * Puts a module Name and a Reference together in the 'draggable' form
+ * (module)reference
+ * @param module The name of the module
+ * @param reference The key reference as text
+ * @return The encoded reference using module and reference
+ * @author Martin Gruner
+ */
+ static const QString encodeReference(const QString &module, const QString &reference);
+ /**
+ * decodes a 'draggable' reference into a modulename and a reference
+ * @author Martin Gruner
+ */
+ static void decodeReference(QString &dragreference, QString &module, QString &reference);
+ /**
+ * Returns true if the parameter is a hyperlink.
+ */
+ static const bool isHyperlink( const QString& hyperlink );
+ /**
+ * Returns the preferred module name for the given type.
+ */
+ static const QString preferredModule( const Type type );
+ static CReferenceManager::Type typeFromModule( const CSwordModuleInfo::ModuleType type );
+ /** Parses the given verse references using the given language and the module.
+ * @param ref The verse refernce
+ * @param lang The language of the verse reference
+ * @param newLang The language of the reference, which will be returned. For example: If BibleTime using an english environment parses a spanish ref (lang=es) the returned ref should be in english (newLang=en), because his english standard module only understands en.
+ */
+ static const QString parseVerseReference( const QString ref, const QString& lang = QString::null, const QString& newLang = "en");
+};
+
+#endif
+
diff --git a/bibletime/backend/cswordbackend.cpp b/bibletime/backend/cswordbackend.cpp
new file mode 100644
index 0000000..1686cd8
--- /dev/null
+++ b/bibletime/backend/cswordbackend.cpp
@@ -0,0 +1,368 @@
+/***************************************************************************
+ cswordbackend.cpp - description
+ -------------------
+ begin : Thu Oct 5 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+#include "cswordbackend.h"
+#include "chtmlentrydisplay.h"
+#include "chtmlchapterdisplay.h"
+#include "chtmlbookdisplay.h"
+#include "cswordbiblemoduleinfo.h"
+#include "cswordcommentarymoduleinfo.h"
+#include "cswordlexiconmoduleinfo.h"
+#include "cswordbookmoduleinfo.h"
+
+#include "bt_thmlhtml.h"
+#include "bt_gbfhtml.h"
+#include <dirent.h>
+#include <unistd.h>
+
+//Qt includes
+#include <qdir.h>
+
+//KDE includes
+#include <klocale.h>
+
+//Sword includes
+#include <swdisp.h>
+#include <swfiltermgr.h>
+#include <encfiltmgr.h>
+#include <plainhtml.h>
+#include <rawgbf.h>
+#include <rtfhtml.h>
+#include <filemgr.h>
+#include <utilstr.h>
+
+//static class-wide members
+static QMap<QString, QString> moduleDescriptionMap;
+
+CSwordBackend::CSwordBackend()
+ : SWMgr(0,0,false,new EncodingFilterMgr( ENC_UTF8 ))
+{
+ m_displays.entry = 0;
+ m_displays.chapter = 0;
+ m_displays.book = 0;
+
+ m_filters.gbf = 0;
+ m_filters.thml = 0;
+ m_filters.plain = 0;
+}
+
+CSwordBackend::~CSwordBackend(){
+ shutdownModules();
+ delete m_filters.gbf;
+ delete m_filters.plain;
+ delete m_filters.thml;
+}
+
+/** Initializes the Sword modules. */
+const CSwordBackend::LoadError CSwordBackend::initModules() {
+ LoadError ret = NoError;
+
+ ModMap::iterator it;
+ SWModule* curMod = 0;
+ CSwordModuleInfo* newModule = 0;
+
+ shutdownModules(); //remove previous modules
+ m_moduleList.clear();
+
+ ret = LoadError( Load() );
+
+ for (it = Modules.begin(); it != Modules.end(); it++) {
+ curMod = (*it).second;
+ if (!strcmp(curMod->Type(), "Biblical Texts")) {
+ newModule = new CSwordBibleModuleInfo(curMod);
+ newModule->module()->Disp(m_displays.chapter ? m_displays.chapter : (m_displays.chapter = new CHTMLChapterDisplay));
+ } else if (!strcmp(curMod->Type(), "Commentaries")) {
+ newModule = new CSwordCommentaryModuleInfo(curMod);
+ newModule->module()->Disp(m_displays.entry ? m_displays.entry : (m_displays.entry = new CHTMLEntryDisplay));
+ } else if (!strcmp(curMod->Type(), "Lexicons / Dictionaries")) {
+ newModule = new CSwordLexiconModuleInfo(curMod);
+ newModule->module()->Disp(m_displays.entry ? m_displays.entry : (m_displays.entry = new CHTMLEntryDisplay));
+ } else if (!strcmp(curMod->Type(), "Generic Books")) {
+ newModule = new CSwordBookModuleInfo(curMod);
+ newModule->module()->Disp(m_displays.book ? m_displays.book : (m_displays.book = new CHTMLBookDisplay));
+ }
+ if (newModule) //append the new modules to our list
+ m_moduleList.append( newModule );
+ }
+
+ for (m_moduleList.first(); m_moduleList.current(); m_moduleList.next()) {
+ moduleDescriptionMap.insert(m_moduleList.current()->config(CSwordModuleInfo::Description), m_moduleList.current()->name());
+ }
+
+ return ret;
+}
+
+void CSwordBackend::AddRenderFilters(SWModule *module, ConfigEntMap &section) {
+ string sourceformat;
+ string moduleDriver;
+ ConfigEntMap::iterator entry;
+ bool noDriver = true;
+
+ sourceformat = ((entry = section.find("SourceType")) != section.end()) ? (*entry).second : (string) "";
+ moduleDriver = ((entry = section.find("ModDrv")) != section.end()) ? (*entry).second : (string) "";
+
+ if (!stricmp(sourceformat.c_str(), "GBF")) {
+ if (!m_filters.gbf)
+ m_filters.gbf = new BT_GBFHTML();
+ module->AddRenderFilter(m_filters.gbf);
+ noDriver = false;
+ }
+
+ if (!stricmp(sourceformat.c_str(), "PLAIN")) {
+ if (!m_filters.plain)
+ m_filters.plain = new PLAINHTML();
+ module->AddRenderFilter(m_filters.plain);
+ noDriver = false;
+ }
+
+ if (!stricmp(sourceformat.c_str(), "ThML")) {
+ if (!m_filters.thml)
+ m_filters.thml = new BT_ThMLHTML();
+ module->AddRenderFilter(m_filters.thml);
+ noDriver = false;
+ }
+
+ if (noDriver){
+ if (!stricmp(moduleDriver.c_str(), "RawCom") || !stricmp(moduleDriver.c_str(), "RawLD")) {
+ if (!m_filters.plain)
+ m_filters.plain = new PLAINHTML();
+ module->AddRenderFilter(m_filters.plain);
+ noDriver = false;
+ }
+ }
+}
+
+/** This function deinitializes the modules and deletes them. */
+const bool CSwordBackend::shutdownModules(){
+ for (m_moduleList.first(); m_moduleList.current(); m_moduleList.next()) {
+ if (m_moduleList.current()) {
+ CSwordModuleInfo* current = m_moduleList.current();
+ m_moduleList.removeRef(current);
+ delete current;
+ }
+ }
+ m_moduleList.clear();
+ return true;
+}
+
+/** Returns true if the given option is enabled. */
+const bool CSwordBackend::isOptionEnabled( const CSwordBackend::FilterOptions type) {
+ return (getGlobalOption( optionName(type).latin1() ) == "On");
+}
+
+/** Sets the given options enabled or disabled depending on the second parameter. */
+void CSwordBackend::setOption( const CSwordBackend::FilterOptions type, const bool enable){
+ string value;
+ switch (type) {
+ case textualVariants:
+ value = enable ? "Secondary Reading" : "Primary Reading";
+ //if on, user alternaticve (secondary) reading
+ break;
+ default:
+ value = enable ? "On": "Off";
+ break;
+ };
+ setGlobalOption(optionName(type).latin1(), value.c_str());
+}
+
+void CSwordBackend::setFilterOptions( const CSwordBackend::FilterOptionsBool options){
+ setOption( footnotes, options.footnotes );
+ setOption( strongNumbers, options.strongNumbers );
+ setOption( headings, options.headings );
+ setOption( morphTags, options.morphTags );
+ setOption( lemmas, options.lemmas );
+ setOption( hebrewPoints, options.hebrewPoints );
+ setOption( hebrewCantillation, options.hebrewCantillation );
+ setOption( greekAccents, options.greekAccents);
+ setOption( textualVariants, options.textualVariants);
+}
+
+void CSwordBackend::setDisplayOptions( const CSwordBackend::DisplayOptionsBool options){
+ if (m_displays.entry)
+ m_displays.entry->setDisplayOptions(options);
+ if (m_displays.chapter)
+ m_displays.chapter->setDisplayOptions(options);
+}
+
+/** This function searches for a module with the specified description */
+CSwordModuleInfo* const CSwordBackend::findModuleByDescription(const QString& description){
+ if (m_moduleList.count())
+ for ( m_moduleList.first();m_moduleList.current();m_moduleList.next() )
+ if ( m_moduleList.current()->config(CSwordModuleInfo::Description) == description )
+ return m_moduleList.current();
+ return 0;
+}
+
+/** This function searches for a module with the specified description */
+const QString CSwordBackend::findModuleNameByDescription(const QString& description){
+ if (moduleDescriptionMap.contains(description))
+ return moduleDescriptionMap[description];
+ return QString::null;
+}
+
+/** This function searches for a module with the specified name */
+CSwordModuleInfo* const CSwordBackend::findModuleByName(const QString& name){
+ if (m_moduleList.count())
+ for ( m_moduleList.first(); m_moduleList.current(); m_moduleList.next() )
+ if ( m_moduleList.current()->name() == name )
+ return m_moduleList.current();
+ return 0;
+}
+
+/** Returns our local config object to store the cipher keys etc. locally for each user. The values of the config are merged with the global config. */
+const bool CSwordBackend::moduleConfig(const QString& module, SWConfig& moduleConfig) {
+ SectionMap::iterator section;
+ DIR *dir = opendir(configPath);
+ struct dirent *ent;
+
+ bool foundConfig = false;
+ QString modFile;
+ if (dir) { // find and update .conf file
+ rewinddir(dir);
+ while ((ent = readdir(dir)) && !foundConfig) {
+ if ((strcmp(ent->d_name, ".")) && (strcmp(ent->d_name, ".."))) {
+ modFile = QString::fromLocal8Bit(configPath);
+ modFile += QString::fromLatin1("/");
+ modFile += QString::fromLocal8Bit(ent->d_name);
+ moduleConfig = SWConfig( (const char*)modFile.local8Bit() );
+ section = moduleConfig.Sections.find( (const char*)module.local8Bit() );
+ foundConfig = ( section != moduleConfig.Sections.end() );
+ }
+ }
+ closedir(dir);
+ }
+ else { //try to read mods.conf
+ //moduleConfig = SWConfig( configPath + "/mods.conf" );
+ moduleConfig = SWConfig("");//global config
+ section = config->Sections.find( (const char*)module.local8Bit() );
+ foundConfig = ( section != config->Sections.end() );
+
+ ConfigEntMap::iterator entry;
+ if (foundConfig) { //copy module section
+ for (entry = (*section).second.begin(); entry != (*section).second.end(); entry++) {
+ moduleConfig.Sections[(*section).first].insert(ConfigEntMap::value_type((*entry).first, (*entry).second));
+ }
+ }
+ }
+
+ if (!foundConfig && configType != 2) { //search in $HOME/.sword/
+ QString myPath = QString::fromLatin1("%1/.sword/mods.d").arg(getenv("HOME"));
+ dir = opendir(myPath.latin1());
+ if (dir) {
+ rewinddir(dir);
+ while ((ent = readdir(dir)) && !foundConfig) {
+ if ((strcmp(ent->d_name, ".")) && (strcmp(ent->d_name, ".."))) {
+ modFile = myPath;
+ modFile += "/";
+ modFile += ent->d_name;
+ moduleConfig = SWConfig( (const char*)modFile.local8Bit() );
+ section = moduleConfig.Sections.find( (const char*)module.local8Bit() );
+ foundConfig = ( section != moduleConfig.Sections.end() );
+ }
+ }
+ closedir(dir);
+ }
+ }
+ return foundConfig;
+}
+
+/** Returns the text used for the option given as parameter. */
+const QString CSwordBackend::optionName( const CSwordBackend::FilterOptions option ){
+ switch (option) {
+ case CSwordBackend::footnotes:
+ return QString::fromLatin1("Footnotes");
+ case CSwordBackend::strongNumbers:
+ return QString::fromLatin1("Strong's Numbers");
+ case CSwordBackend::headings:
+ return QString::fromLatin1("Headings");
+ case CSwordBackend::morphTags:
+ return QString::fromLatin1("Morphological Tags");
+ case CSwordBackend::lemmas:
+ return QString::fromLatin1("Lemmas");
+ case CSwordBackend::hebrewPoints:
+ return QString::fromLatin1("Hebrew Vowel Points");
+ case CSwordBackend::hebrewCantillation:
+ return QString::fromLatin1("Hebrew Cantillation");
+ case CSwordBackend::greekAccents:
+ return QString::fromLatin1("Greek Accents");
+ case CSwordBackend::textualVariants:
+ return QString::fromLatin1("Textual Variants");
+ }
+ return QString::null;
+}
+
+/** Returns the translated name of the option given as parameter. */
+const QString CSwordBackend::translatedOptionName(const CSwordBackend::FilterOptions option){
+ switch (option) {
+ case CSwordBackend::footnotes:
+ return i18n("Footnotes");
+ case CSwordBackend::strongNumbers:
+ return i18n("Strong's Numbers");
+ case CSwordBackend::headings:
+ return i18n("Headings");
+ case CSwordBackend::morphTags:
+ return i18n("Morphological Tags");
+ case CSwordBackend::lemmas:
+ return i18n("Lemmas");
+ case CSwordBackend::hebrewPoints:
+ return i18n("Hebrew Vowel Points");
+ case CSwordBackend::hebrewCantillation:
+ return i18n("Hebrew Cantillation");
+ case CSwordBackend::greekAccents:
+ return i18n("Greek Accents");
+ case CSwordBackend::textualVariants:
+ return i18n("Textual Variants");
+ }
+ return QString::null;
+}
+
+
+const QString CSwordBackend::configOptionName( const CSwordBackend::FilterOptions option ){
+ switch (option) {
+ case CSwordBackend::footnotes:
+ return QString::fromLatin1("Footnotes");
+ case CSwordBackend::strongNumbers:
+ return QString::fromLatin1("Strongs");
+ case CSwordBackend::headings:
+ return QString::fromLatin1("Headings");
+ case CSwordBackend::morphTags:
+ return QString::fromLatin1("Morph");
+ case CSwordBackend::lemmas:
+ return QString::fromLatin1("Lemma");
+ case CSwordBackend::hebrewPoints:
+ return QString::fromLatin1("HebrewPoints");
+ case CSwordBackend::hebrewCantillation:
+ return QString::fromLatin1("Cantillation");
+ case CSwordBackend::greekAccents:
+ return QString::fromLatin1("GreekAccents");
+ case CSwordBackend::textualVariants:
+ return QString::fromLatin1("TextualVariants");
+ }
+ return QString::null;
+}
+
+const QString CSwordBackend::booknameLanguage( const QString& language ) {
+ if (!language.isNull())
+ LocaleMgr::systemLocaleMgr.setDefaultLocaleName( language.local8Bit() );
+ return QString::fromLatin1(LocaleMgr::systemLocaleMgr.getDefaultLocaleName());
+}
+
+/** Returns the version of the Sword library. */
+const SWVersion CSwordBackend::Version() {
+ return SWVersion::currentVersion;
+}
diff --git a/bibletime/backend/cswordbackend.h b/bibletime/backend/cswordbackend.h
new file mode 100644
index 0000000..2ce5531
--- /dev/null
+++ b/bibletime/backend/cswordbackend.h
@@ -0,0 +1,215 @@
+/***************************************************************************
+ cswordbackend.h - description
+ -------------------
+ begin : Thu Oct 5 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSWORDBACKEND_H
+#define CSWORDBACKEND_H
+
+//BibleTime includes
+
+//Qt includes
+#include <qlist.h>
+#include <qmap.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+//Sword includes
+#include <swmgr.h>
+#include <swmodule.h>
+#include <swversion.h>
+#include <localemgr.h>
+
+class CHTMLEntryDisplay;
+class CHTMLChapterDisplay;
+class CHTMLBookDisplay;
+
+class CSwordModuleInfo;
+typedef QList<CSwordModuleInfo> ListCSwordModuleInfo;
+
+/**
+ * This is the implementation of CBackend for Sword. It's additionally derived from SWMgr
+ * to provide functions of Sword.
+ *
+ * @short The backend implementation of Sword
+ * @author The BibleTime team
+ * @version $Id: cswordbackend.h,v 1.22 2002/03/20 15:08:44 joachim Exp $
+ */
+class CSwordBackend : public SWMgr {
+public:
+ /**
+ * These are the options which could be supported by modules and by this backend.
+ * It's used in @ref isOptionEnabled and @ref setOption
+ */
+ enum FilterOptions {
+ footnotes,
+ strongNumbers,
+ headings,
+ morphTags,
+ lemmas,
+ hebrewPoints,
+ hebrewCantillation,
+ greekAccents,
+ textualVariants,
+ filterOptionsMIN = footnotes,
+ filterOptionsMAX = textualVariants
+ };
+
+ struct FilterOptionsBool {
+ bool footnotes;
+ bool strongNumbers;
+ bool headings;
+ bool morphTags;
+ bool lemmas;
+ bool hebrewPoints;
+ bool hebrewCantillation;
+ bool greekAccents;
+ bool textualVariants;
+ };
+ struct DisplayOptionsBool {
+ bool lineBreaks;
+ bool verseNumbers;
+ };
+ enum LoadError { // the values exist to cast from the char return of SWMgr::Load
+ NoSwordConfig = -1,
+ NoError = 0,
+ NoModules = 1
+ };
+ /**
+ * The constructor of the Sword backend.
+ * It creates the SWModule objects using SWMgr's methods, it adds the necessary
+ * filters for the module format.
+ */
+ CSwordBackend();
+ /**
+ * The destrctor of this backend. This function shuts the modules down using @ref shutdownModules.
+ */
+ virtual ~CSwordBackend();
+ /**
+ * This function returns the list of available modules managed by this backend.
+ * You have to call initModules() first;
+ *
+ * @return The list of modules managed by this backend
+ */
+ virtual ListCSwordModuleInfo& moduleList();
+ /**
+ * Initializes the Sword modules.
+ *
+ * @return True if the initializiation was succesful, otherwise return false.
+ */
+ virtual const CSwordBackend::LoadError initModules();
+ /**
+ * This function deinitializes the modules and deletes them.
+ *
+ * @return True if it was succesful, otherwise return false
+ */
+ virtual const bool shutdownModules();
+ /**
+ * Sets the given options enabled or disabled depending on the second parameter.
+ *
+ * @param type This is the type this function should set enabled or disabled
+ * @param enable If this is true the option will be enabled, otherwise it will be disabled.
+ */
+ void setOption( const CSwordBackend::FilterOptions type, const bool enable);
+ void setFilterOptions( const CSwordBackend::FilterOptionsBool options);
+ void setDisplayOptions( const CSwordBackend::DisplayOptionsBool options);
+ /**
+ * Returns true if the given option is enabled.
+ *
+ * @return Returns true if the options given as aparameter is switched on at this time, otherwise return false.
+ */
+ virtual const bool isOptionEnabled( const CSwordBackend::FilterOptions type);
+ /**
+ * Sets the language for the international booknames of Sword.
+ */
+ const QString booknameLanguage( const QString& = QString::null );
+ /**
+ * This function searches for a module with the specified description
+ * @param description The description of the desired module
+ * @return pointer to the desired module; null if no module has the specified description
+ */
+ virtual CSwordModuleInfo* const findModuleByDescription(const QString& description);
+ /**
+ * This function searches for a module with the specified description
+ * @param description The description of the desired module
+ * @return pointer to the desired module; null if no module has the specified description
+ */
+ static const QString findModuleNameByDescription(const QString& description);
+ /**
+ * This function searches for a module with the specified name
+ * @param description The name of the desired module
+ * @return pointer to the desired module; null if no module has the specified name
+ */
+ CSwordModuleInfo* const findModuleByName(const QString& name);
+ /**
+ * @return Our global config object to store the cipher keys etc.
+ */
+ SWConfig* const getConfig() const;
+ /**
+ * Tries to find the config object for the module. The second paramter will be the found config.
+ * @return True if the config was found, false if not. If false is returned the moduleConfig object is in undefined/unknwon state.
+ */
+ const bool moduleConfig(const QString& module, SWConfig& moduleConfig);
+ /**
+ * Returns the text used for the option given as parameter.
+ */
+ static const QString optionName( const CSwordBackend::FilterOptions option);
+ /**
+ * Returns the text used for the option given as parameter.
+ */
+ static const QString configOptionName( const CSwordBackend::FilterOptions option);
+ /**
+ * Returns the translated name of the option given as parameter.
+ */
+ static const QString translatedOptionName(const CSwordBackend::FilterOptions option);
+ /**
+ * Returns the version of the Sword library.
+ */
+ virtual const SWVersion Version();
+
+protected:
+ /**
+ * Adds a render filter to the module.
+ * @param module Add a render filter to this module!
+ */
+ virtual void AddRenderFilters(SWModule *module, ConfigEntMap &section);
+
+private:
+ //filters
+ struct {
+ SWFilter *gbf;
+ SWFilter *plain;
+ SWFilter *thml;
+ } m_filters;
+ ListCSwordModuleInfo m_moduleList;
+
+ struct {
+ CHTMLChapterDisplay* chapter;
+ CHTMLEntryDisplay* entry;
+ CHTMLBookDisplay* book;
+ } m_displays;
+};
+
+/**Returns The list of modules managed by this backend*/
+inline ListCSwordModuleInfo& CSwordBackend::moduleList() {
+ return m_moduleList;
+}
+
+/** Returns our local config object to store the cipher keys etc. locally for each user. The values of the config are merged with the global config. */
+inline SWConfig* const CSwordBackend::getConfig() const {
+ return config;
+}
+
+#endif
diff --git a/bibletime/backend/cswordbiblemoduleinfo.cpp b/bibletime/backend/cswordbiblemoduleinfo.cpp
new file mode 100644
index 0000000..a8ff152
--- /dev/null
+++ b/bibletime/backend/cswordbiblemoduleinfo.cpp
@@ -0,0 +1,195 @@
+/***************************************************************************
+ cswordbiblemoduleinfo.cpp - description
+ -------------------
+ begin : Thu Oct 5 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+#include "cswordbiblemoduleinfo.h"
+#include "cswordversekey.h"
+
+//Qt includes
+#include <qfile.h>
+
+//Sword includes
+#include <versekey.h>
+
+static VerseKey staticKey;
+
+CSwordBibleModuleInfo::CSwordBibleModuleInfo( SWModule* module )
+ : CSwordModuleInfo(module) {
+ m_bookList = 0;
+ m_cachedLocale = "unknown";
+ m_hasOT = m_hasNT = -1;
+}
+
+CSwordBibleModuleInfo::CSwordBibleModuleInfo( const CSwordBibleModuleInfo& m ) : CSwordModuleInfo(m) {
+ if (m.m_bookList) {
+ m_bookList = new QStringList();
+ *m_bookList = *m.m_bookList;
+ }
+ m_hasOT = m.m_hasOT;
+ m_hasNT = m.m_hasNT;
+ m_cachedLocale = m.m_cachedLocale;
+}
+
+CSwordModuleInfo* CSwordBibleModuleInfo::clone(){
+ return new CSwordBibleModuleInfo(*this);
+}
+
+CSwordBibleModuleInfo::~CSwordBibleModuleInfo(){
+ delete m_bookList;
+}
+
+/** Returns the books available in this module */
+QStringList* CSwordBibleModuleInfo::books() {
+ if (m_cachedLocale != backend()->booknameLanguage()){ //if the locale has changed
+ delete m_bookList;
+ m_bookList = 0;
+ }
+
+ if (!m_bookList) {
+ m_bookList = new QStringList();
+ if (m_hasOT == -1)
+ m_hasOT = hasTestament(OldTestament);
+ if (m_hasNT == -1)
+ m_hasNT = hasTestament(NewTestament);
+
+ int min = 0;
+ int max = 1;
+ //find out if we have ot and nt, only ot or only nt
+ if (m_hasOT>0 && m_hasNT>0) {
+ min = 0;
+ max = 1;
+ }
+ else if (m_hasOT>0 && !m_hasNT) {
+ min = 0;
+ max = 0;
+ }
+ else if (!m_hasOT && m_hasNT>0) {
+ min = 1;
+ max = 1;
+ }
+ else if (!m_hasOT && !m_hasNT) { //somethings wrong here! - no OT and not NT
+ qWarning("CSwordBibleModuleInfo (%s) no OT and not NT! Check config.", module()->Name());
+ min = 0;
+ max = -1;
+ }
+
+ staticKey.setLocale(LocaleMgr::systemLocaleMgr.getDefaultLocaleName());
+ for (int i = min; i <= max; ++i) {
+ for ( int j = 0; j < staticKey.BMAX[i]; ++j) {
+ m_bookList->append( QString::fromLocal8Bit(staticKey.books[i][j].name) );
+ }
+ }
+ m_cachedLocale = backend()->booknameLanguage();
+ }
+ return m_bookList;
+}
+
+/** Returns the number of chapters for the given book. */
+const unsigned int CSwordBibleModuleInfo::chapterCount(const unsigned int book) {
+ int result = 0;
+ if ( (book >= 1) && book <= (unsigned int)staticKey.BMAX[0] && hasTestament(OldTestament)) { //Is the book in the old testament?
+ result = (staticKey.books[0][book-1].chapmax);
+ }
+ else if ((book >= 1) && (book - staticKey.BMAX[0]) <= (unsigned int)staticKey.BMAX[1] && hasTestament(NewTestament) ) { //is the book in the new testament?
+ result = (staticKey.books[1][book-1-staticKey.BMAX[0]].chapmax);
+ }
+ return result;
+}
+
+/** Returns the number of verses for the given chapter. */
+const unsigned int CSwordBibleModuleInfo::verseCount( const unsigned int book, const unsigned int chapter ) {
+ unsigned int result = 0;
+ if (book>=1 && (book <= (unsigned int)staticKey.BMAX[0]) && hasTestament(OldTestament) ) { //Is the book in the old testament?
+ if (chapter <= chapterCount(book) ) //does the chapter exist?
+ result = (staticKey.books[0][book-1].versemax[chapter-1]);
+ }
+ else if (book>=1 && (book - staticKey.BMAX[0]) <= (unsigned int)staticKey.BMAX[1] && hasTestament(NewTestament)) { //is the book in the new testament?
+ if (chapter <= chapterCount(book) ) //does the chapter exist?
+ result = staticKey.books[1][book-1-staticKey.BMAX[0]].versemax[chapter-1];
+ }
+ return result;
+}
+
+const unsigned int CSwordBibleModuleInfo::bookNumber(const QString &book){
+ unsigned int bookNumber = 0;
+ bool found = false;
+ staticKey.setLocale(LocaleMgr::systemLocaleMgr.getDefaultLocaleName());
+ int min = 0;
+ int max = 1;
+ //find out if we have ot and nt, only ot or only nt
+ if ((m_hasOT>0 && m_hasNT>0) || (m_hasOT == m_hasNT == -1)) {
+ min = 0;
+ max = 1;
+ bookNumber = 0;
+ }
+ else if (m_hasOT>0 && !m_hasNT) {
+ min = 0;
+ max = 0;
+ bookNumber = 0;
+ }
+ else if (!m_hasOT && m_hasNT>0) {
+ min = 1;
+ max = 1;
+ bookNumber = staticKey.BMAX[0];
+ }
+ else if (!m_hasOT && !m_hasNT) {
+ min = 0;
+ max = -1; //no loop
+ bookNumber = 0;
+ }
+
+ for (int i = min; i <= max && !found; ++i) {
+ for ( int j = 0; j < staticKey.BMAX[i] && !found; ++j) {
+ ++bookNumber;
+ if (book == QString::fromLocal8Bit( staticKey.books[i][j].name) )
+ found = true;
+ }
+ }
+ return bookNumber;
+}
+
+/** Returns true if his module has the text of desired type of testament */
+const bool CSwordBibleModuleInfo::hasTestament( CSwordBibleModuleInfo::Testament type ) {
+ if (m_hasOT == -1 || m_hasNT == -1) {
+ *module() = TOP; //position to first entry
+ VerseKey key( module()->KeyText() );
+ if (key.Testament() == 1) { // OT && NT
+ m_hasOT = 1;
+ }
+ else if (key.Testament() == 2) { //no OT
+ m_hasOT = 0;
+ }
+
+ *module() = BOTTOM;
+ key = module()->KeyText();
+ if (key.Testament() == 1) { // only OT, no NT
+ m_hasNT = 0;
+ }
+ else if (key.Testament() == 2) { //has NT
+ m_hasNT = 1;
+ }
+ }
+
+ switch (type) {
+ case OldTestament:
+ return m_hasOT>0;
+ case NewTestament:
+ return m_hasNT>0;
+ default:
+ return false;
+ }
+}
diff --git a/bibletime/backend/cswordbiblemoduleinfo.h b/bibletime/backend/cswordbiblemoduleinfo.h
new file mode 100644
index 0000000..4209af4
--- /dev/null
+++ b/bibletime/backend/cswordbiblemoduleinfo.h
@@ -0,0 +1,96 @@
+/***************************************************************************
+ cswordbiblemoduleinfo.h - description
+ -------------------
+ begin : Thu Oct 5 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSWORDBIBLEMODULEINFO_H
+#define CSWORDBIBLEMODULEINFO_H
+
+//own includes
+#include "cswordmoduleinfo.h"
+
+//Qt includes
+#include <qstringlist.h>
+
+//Sword includes
+
+
+/**
+ * This is the CModuleInfo imlementation for Bible modules managed by Sword.
+ *
+ * @short Implementation for Sword Bibles
+ * @author The BibleTime team
+ * @version $Id: cswordbiblemoduleinfo.h,v 1.5 2002/03/15 20:48:00 joachim Exp $
+ */
+class CSwordBibleModuleInfo : public CSwordModuleInfo {
+public:
+ enum Testament {
+ OldTestament = 1,
+ NewTestament = 2
+ };
+
+ /**
+ * The constructor of this class
+ */
+ CSwordBibleModuleInfo( SWModule* module );
+ CSwordBibleModuleInfo( const CSwordBibleModuleInfo& m );
+ /**
+ * The destructor of this class
+ */
+ ~CSwordBibleModuleInfo();
+ /**
+ * Returns the number of avalable verses for the given chapter and book.
+ *
+ * @param book The book we should use
+ * @param chapter The chapter we should use
+ * @return The number of verses for the given book and chapter
+ */
+ virtual const unsigned int verseCount( const unsigned int book, const unsigned int chapter );
+ /**
+ * @return The number of available chapters of the given book.
+ * @return The number of chapters for the given book
+ */
+ virtual const unsigned int chapterCount( const unsigned int book );
+ /** Return all book of this module.
+ * @return A QStringList containing the books which are available in this module.
+ */
+ virtual QStringList* books();
+ /**
+ * Reimplementation, Returns the type
+ */
+ virtual const CSwordModuleInfo::ModuleType type() const;
+ /**
+ * @return the book number, values starting with 1; 0 if not found
+ */
+ const unsigned int bookNumber(const QString &book);
+ /**
+ * Returns true if his module has the text of desired type of testament
+ */
+ const bool hasTestament( CSwordBibleModuleInfo::Testament );
+ virtual CSwordModuleInfo* clone();
+
+private:
+ QStringList* m_bookList; //This booklist is cached
+ QString m_cachedLocale;
+ short int m_hasOT;
+ short int m_hasNT;
+};
+
+inline const CSwordModuleInfo::ModuleType CSwordBibleModuleInfo::type() const {
+ return CSwordModuleInfo::Bible;
+}
+
+
+#endif
diff --git a/bibletime/backend/cswordbookmoduleinfo.cpp b/bibletime/backend/cswordbookmoduleinfo.cpp
new file mode 100644
index 0000000..a769657
--- /dev/null
+++ b/bibletime/backend/cswordbookmoduleinfo.cpp
@@ -0,0 +1,100 @@
+/***************************************************************************
+ cswordbookmoduleinfo.cpp - description
+ -------------------
+ begin : Thu Jan 24 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+#include <iostream.h>
+
+//BibleTime includes
+#include "cswordbookmoduleinfo.h"
+
+//Sword includes
+#include <treekeyidx.h>
+#include <treekey.h>
+
+CSwordBookModuleInfo::CSwordBookModuleInfo( SWModule* module )
+ : CSwordModuleInfo(module), m_depth(-1)
+{
+ //checking if it works as expected
+// qWarning("Book module: %s", module->Name());
+// if (TreeKeyIdx* treeKey = tree()) {
+// TreeKeyIdx root = *treeKey;
+// root.root();
+// printTree(root, treeKey, 0);
+// }
+// else
+// qWarning("treeKey not valid");
+// qWarning("%s has depth: %i\n\n", module->Name(), depth());
+}
+
+CSwordBookModuleInfo::CSwordBookModuleInfo( const CSwordBookModuleInfo& module )
+ : CSwordModuleInfo(module)
+{
+ m_depth = module.m_depth;
+}
+
+CSwordBookModuleInfo::~CSwordBookModuleInfo(){
+}
+
+void CSwordBookModuleInfo::printTree(TreeKeyIdx treeKey, TreeKeyIdx* target, int level ){
+ if (!target)
+ target = &treeKey;
+
+// unsigned long currentOffset = target->getOffset();
+ for (int i = 0; i < level; i++)
+ std::cout << " ";
+ std::cout << treeKey.getLocalName() << std::endl;
+ if (treeKey.firstChild()) {
+ printTree(treeKey, target, level+1);
+ treeKey.parent();
+ }
+ if (treeKey.nextSibling())
+ printTree(treeKey, target, level);
+}
+
+const int CSwordBookModuleInfo::depth() {
+ if (m_depth == -1) {
+ TreeKeyIdx* treeKey = tree();
+ if (treeKey) {
+ TreeKeyIdx root = *treeKey;
+ root.root();
+ computeDepth(root, treeKey, 0);
+ }
+ }
+ return m_depth;
+}
+
+void CSwordBookModuleInfo::computeDepth(TreeKeyIdx treeKey, TreeKeyIdx* target, int level ){
+ if (!target)
+ target = &treeKey;
+
+ if (level > m_depth)
+ m_depth = level;
+
+ if (treeKey.firstChild()) {
+ computeDepth(treeKey, target, level+1);
+ treeKey.parent();
+ }
+ if (treeKey.nextSibling())
+ computeDepth(treeKey, target, level);
+
+}
+
+/** Returns a treekey filled with the structure of this module */
+TreeKeyIdx* const CSwordBookModuleInfo::tree() const {
+ TreeKeyIdx* treeKey = dynamic_cast<TreeKeyIdx*>((SWKey*)*(module()));
+ if (treeKey)
+ return treeKey;
+ return 0;
+}
diff --git a/bibletime/backend/cswordbookmoduleinfo.h b/bibletime/backend/cswordbookmoduleinfo.h
new file mode 100644
index 0000000..c2b4560
--- /dev/null
+++ b/bibletime/backend/cswordbookmoduleinfo.h
@@ -0,0 +1,63 @@
+/***************************************************************************
+ cswordbookmoduleinfo.h - description
+ -------------------
+ begin : Thu Jan 24 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSWORDGENBOOKMODULEINFO_H
+#define CSWORDGENBOOKMODULEINFO_H
+
+//BibleTime includes
+#include "cswordmoduleinfo.h"
+
+//Sword includes
+#include <treekeyidx.h>
+
+
+/** Class for generic book support
+ * @author The BibleTime team
+ */
+class CSwordBookModuleInfo : public CSwordModuleInfo {
+public:
+ CSwordBookModuleInfo( SWModule* module );
+ CSwordBookModuleInfo( const CSwordBookModuleInfo& m );
+ ~CSwordBookModuleInfo();
+ /**
+ * Returns the type of the module.
+ */
+ virtual const CSwordModuleInfo::ModuleType type() const;
+ /**
+ * Used for debugging
+ */
+ void printTree(TreeKeyIdx treeKey, TreeKeyIdx* target, int level = 1 );
+ /**
+ * Returns the maximal depth of sections and subsections.
+ */
+ const int depth();
+ /**
+ * @return A treekey filled with the structure of this module. Don't delete the returned key because it's casted from the module object.
+ */
+ TreeKeyIdx* const tree() const;
+
+private:
+ void computeDepth(TreeKeyIdx treeKey, TreeKeyIdx* target, int level = 0 );
+ int m_depth;
+};
+
+inline const CSwordBookModuleInfo::ModuleType CSwordBookModuleInfo::type() const {
+ return CSwordModuleInfo::GenericBook;
+}
+
+
+#endif
diff --git a/bibletime/backend/cswordcommentarymoduleinfo.cpp b/bibletime/backend/cswordcommentarymoduleinfo.cpp
new file mode 100644
index 0000000..6832efa
--- /dev/null
+++ b/bibletime/backend/cswordcommentarymoduleinfo.cpp
@@ -0,0 +1,31 @@
+/***************************************************************************
+ cswordcommentarymoduleinfo.cpp - description
+ -------------------
+ begin : Thu Oct 5 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cswordcommentarymoduleinfo.h"
+
+CSwordCommentaryModuleInfo::CSwordCommentaryModuleInfo( SWModule* module)
+ :CSwordBibleModuleInfo(module) {
+}
+
+CSwordCommentaryModuleInfo::~CSwordCommentaryModuleInfo(){
+
+}
+
+/** No descriptions */
+CSwordModuleInfo* CSwordCommentaryModuleInfo::clone(){
+ return new CSwordCommentaryModuleInfo(*this);
+}
diff --git a/bibletime/backend/cswordcommentarymoduleinfo.h b/bibletime/backend/cswordcommentarymoduleinfo.h
new file mode 100644
index 0000000..965fb6a
--- /dev/null
+++ b/bibletime/backend/cswordcommentarymoduleinfo.h
@@ -0,0 +1,45 @@
+/***************************************************************************
+ cswordcommentarymoduleinfo.h - description
+ -------------------
+ begin : Thu Oct 5 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSWORDCOMMENTARYMODULEINFO_H
+#define CSWORDCOMMENTARYMODULEINFO_H
+
+//own includes
+#include "cswordbiblemoduleinfo.h"
+
+//Qt includes
+
+//Sword includes
+
+/**
+ * @author The BibleTime team
+ * @version $Id: cswordcommentarymoduleinfo.h,v 1.3 2002/02/22 20:55:12 joachim Exp $
+ */
+class CSwordCommentaryModuleInfo : public CSwordBibleModuleInfo {
+public:
+ CSwordCommentaryModuleInfo( SWModule* module );
+ ~CSwordCommentaryModuleInfo();
+ virtual const CSwordModuleInfo::ModuleType type() const;
+ virtual CSwordModuleInfo* clone();
+};
+
+/** No descriptions */
+inline const CSwordModuleInfo::ModuleType CSwordCommentaryModuleInfo::type() const{
+ return CSwordModuleInfo::Commentary;
+}
+
+#endif
diff --git a/bibletime/backend/cswordkey.cpp b/bibletime/backend/cswordkey.cpp
new file mode 100644
index 0000000..871c8b0
--- /dev/null
+++ b/bibletime/backend/cswordkey.cpp
@@ -0,0 +1,90 @@
+/***************************************************************************
+ cswordkey.cpp - description
+ -------------------
+ begin : Thu May 24 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+
+//own includes
+#include "cswordkey.h"
+#include "cswordmoduleinfo.h"
+
+#include "cswordversekey.h"
+#include "cswordldkey.h"
+#include "cswordtreekey.h"
+
+//Sword includes
+#include <swmodule.h>
+#include <swkey.h>
+#include <versekey.h>
+#include <treekey.h>
+#include <treekeyidx.h>
+
+
+CSwordKey::CSwordKey(CSwordModuleInfo* module) : m_module(module) {
+}
+
+CSwordKey::CSwordKey(const CSwordKey& k) {
+ m_module = k.m_module;
+}
+
+CSwordModuleInfo* CSwordKey::module(CSwordModuleInfo* newModule) {
+ if (newModule)
+ m_module = newModule;
+ return m_module;
+}
+
+const QString CSwordKey::renderedText() {
+ if (!m_module)
+ return QString::null;
+ if (SWKey* k = dynamic_cast<SWKey*>(this)) {
+ m_module->module()->SetKey(k);
+ }
+ return QString::fromUtf8(m_module->module()->RenderText());
+}
+
+const QString CSwordKey::strippedText() {
+ if (!m_module)
+ return QString::null;
+ SWKey* k = dynamic_cast<SWKey*>(this);
+ if (k)
+ m_module->module()->SetKey(k);
+ return QString::fromUtf8(m_module->module()->StripText());
+}
+
+/** This will create a proper key object from a given module */
+CSwordKey* CSwordKey::createInstance( CSwordModuleInfo *module ){
+ if (!module)
+ return 0;
+
+ switch( module->type() ){
+ case CSwordModuleInfo::Bible:
+ case CSwordModuleInfo::Commentary:
+ {
+ CSwordVerseKey* key = new CSwordVerseKey( (VerseKey *) ( (SWKey *)(*module->module()) ), module );
+ return key;
+ }
+ case CSwordModuleInfo::Lexicon:
+ {
+ CSwordLDKey* key = new CSwordLDKey( (SWKey *)(*module->module()), module);
+ return key;
+ }
+ case CSwordModuleInfo::GenericBook: {
+ CSwordTreeKey* key = new CSwordTreeKey( (TreeKeyIdx*)((SWKey *)(*module->module())), module );
+ return key;
+ }
+ default:
+ return 0;
+ }
+}
diff --git a/bibletime/backend/cswordkey.h b/bibletime/backend/cswordkey.h
new file mode 100644
index 0000000..a5ad99c
--- /dev/null
+++ b/bibletime/backend/cswordkey.h
@@ -0,0 +1,64 @@
+/***************************************************************************
+ cswordkey.h - description
+ -------------------
+ begin : Thu May 24 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSWORDKEY_H
+#define CSWORDKEY_H
+
+//Own includes
+
+
+//Qt includes
+#include <qstring.h>
+
+
+class CSwordModuleInfo;
+/**
+ * The base class for all Sword based keys.
+ * @author The BibleTime team
+ * @version $Id: cswordkey.h,v 1.8 2002/03/09 11:07:14 joachim Exp $
+ */
+class CSwordKey {
+
+protected:
+ CSwordKey(CSwordModuleInfo* module = 0); //protected constructor, because CSwordKey shouldn't be used (it's an abstract base class).
+ CSwordKey(const CSwordKey&); //copy constructor
+
+public:
+ virtual ~CSwordKey() {};
+
+
+ //pure virtual functions
+ virtual const QString key(const QString& = QString::null) = 0;
+ virtual void key(const char*) = 0;
+ virtual CSwordKey* copy() const = 0;
+
+ //implemented functions
+ virtual CSwordModuleInfo* module(CSwordModuleInfo* newModule = 0);
+ virtual const QString renderedText();
+ virtual const QString strippedText();
+ /**
+ * This returns a new object of the right CSwordKey* implementation (e.g. CSwordVerseKey or CSwordLDKey)
+ * The type is determined by the type of the module.
+ * @see CSwordModuleInfo, CSwordBibleModuleInfo, CSwordCommentaryModuleInfo, CSwordLexiconModukleInfo
+ */
+ static CSwordKey* createInstance(CSwordModuleInfo *module);
+
+protected:
+ CSwordModuleInfo* m_module; //module pointer used by all keys
+};
+
+#endif
diff --git a/bibletime/backend/cswordldkey.cpp b/bibletime/backend/cswordldkey.cpp
new file mode 100644
index 0000000..f9c5582
--- /dev/null
+++ b/bibletime/backend/cswordldkey.cpp
@@ -0,0 +1,103 @@
+/***************************************************************************
+ cswordldkey.cpp - description
+ -------------------
+ begin : Thu Oct 5 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+#include "cswordldkey.h"
+#include "cswordlexiconmoduleinfo.h"
+
+//Qt includes
+
+//Sword includes
+#include <swmodule.h>
+#include <swld.h>
+#include <utilstr.h>
+
+
+CSwordLDKey::CSwordLDKey( CSwordModuleInfo* module ) {
+ m_module = dynamic_cast<CSwordLexiconModuleInfo*>(module);
+ if (m_module)
+ SWKey::operator = (m_module->module()->KeyText());
+}
+
+/** No descriptions */
+CSwordLDKey::CSwordLDKey( const CSwordLDKey &k ) : SWKey((const char*)k), CSwordKey(k) {
+}
+
+/** No descriptions */
+CSwordLDKey::CSwordLDKey( const SWKey *k, CSwordModuleInfo* module) : SWKey(*k), CSwordKey(module) {
+// m_module = module;
+}
+
+//CSwordLDKey::~CSwordLDKey(){
+//}
+
+/** Clones this object by copying the members. */
+CSwordLDKey* CSwordLDKey::copy() const {
+ return new CSwordLDKey(*this);
+}
+
+/** Sets the module of this key. */
+CSwordModuleInfo* CSwordLDKey::module(CSwordModuleInfo* newModule){
+ if (newModule && newModule->type() == CSwordModuleInfo::Lexicon) {
+ const QString oldKey = key();
+ m_module = newModule;
+ key(oldKey);
+ }
+ return m_module;
+}
+
+/** Sets the key of this instance */
+const QString CSwordLDKey::key( const QString& newKey ){
+ if (!newKey.isNull()) {
+ SWKey::operator = ((const char*)newKey.local8Bit());
+ m_module->module()->SetKey(this);
+ m_module->snap();
+ SWKey::operator = (m_module->module()->KeyText());
+ }
+ return QString::fromLocal8Bit((const char*)*this);//don't use fromUtf8
+}
+
+/** Uses the parameter to returns the next entry afer this key. */
+CSwordLDKey* CSwordLDKey::NextEntry(){
+ m_module->module()->SetKey(this); //use this key as base for the next one!
+ ( *( m_module->module() ) )++;
+ key(m_module->module()->KeyText());
+ SWKey::operator = (m_module->module()->KeyText());
+
+ return this;
+}
+
+/** Uses the parameter to returns the next entry afer this key. */
+CSwordLDKey* CSwordLDKey::PreviousEntry(){
+ m_module->module()->SetKey(this); //use this key as base for the next one!
+ ( *( m_module->module() ) )--;
+ SWKey::operator = (m_module->module()->KeyText());
+
+ return this;
+}
+
+/** Sets the key of this instance */
+void CSwordLDKey::key( const char* newKey ){
+ if (newKey) {
+ SWKey::operator = (newKey);
+
+ m_module->module()->SetKey(this);
+ m_module->snap();
+ SWKey::operator = (m_module->module()->KeyText());
+ }
+}
+
diff --git a/bibletime/backend/cswordldkey.h b/bibletime/backend/cswordldkey.h
new file mode 100644
index 0000000..38ea007
--- /dev/null
+++ b/bibletime/backend/cswordldkey.h
@@ -0,0 +1,102 @@
+/***************************************************************************
+ cswordldkey.h - description
+ -------------------
+ begin : Thu Oct 5 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************
+
+ ***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSWORDLDKEY_H
+#define CSWORDLDKEY_H
+
+
+//own includes
+#include "cswordkey.h"
+#include "cswordmoduleinfo.h"
+
+//Qt includes
+#include <qstring.h>
+
+//Sword includes
+#include <swkey.h>
+
+/**
+ * This class is the implementation of CKey used for dictionaries and lexicons.
+ *
+ * CSwordLDKey is the implementation of CKey for Lexicons and dictionaries.
+ * It provides a simple interface to set the current key,
+ * to get the text for the key and functions to get the next and previous items
+ * of the used module in comparision to the current key.<BR>
+ * Here's an example how to use this class:<BR>
+ * @code
+ * CSwordLexiconModuleInfo* m_module = new CSwordLexiconModuleInfo( sword_module );
+ * CSwordLDKey* ldKey = new CSwordLDKey(m_module);
+ * ldKey->getPreviousEntry( ldKey );
+ * qDebug( QString("The current key is: %1").arg(QString::fromLocal8Bit((const char*)*ldKey)));
+ * @endcode
+ *
+ * Please not, that the result will be invalid if use the operator const char*
+ * on the adress of the object, use something like this
+ *
+ * @code
+ * CSwordLDKey* key = new CSwordLDKey( lexicon_module );
+ * const QString keyname = key->getKey();
+ * @endcode
+ *
+ * @author The BibleTime team
+ * @version $Id: cswordldkey.h,v 1.8 2002/03/18 00:21:12 joachim Exp $
+ */
+
+class CSwordLDKey : public SWKey, public CSwordKey {
+public:
+ /**
+ * Constructor of CSwordLDKey
+ */
+ CSwordLDKey( CSwordModuleInfo* module );
+ /**
+ * Copy constructor for this key class.
+ */
+ CSwordLDKey( const CSwordLDKey &k );
+ /**
+ * Copy constructor for this key class.
+ */
+ CSwordLDKey( const SWKey *k, CSwordModuleInfo* module);
+// virtual ~CSwordLDKey();
+ /**
+ * Clones this object by copying the members.
+ */
+ virtual CSwordLDKey* copy() const;
+ /**
+ * Uses the parameter to returns the next entry afer this key.
+ */
+ CSwordLDKey* NextEntry( void );
+ /**
+ * Uses the parameter to returns the previous entry afer this key.
+ */
+ CSwordLDKey* PreviousEntry( void );
+ /**
+ * Sets the module of this key.
+ */
+ virtual CSwordModuleInfo* module( CSwordModuleInfo* module = 0 );
+ /**
+ * Returns the current key as a QString
+ */
+ virtual const QString key( const QString& newKey = QString::null);
+ /**
+ * Returns the current key as a QString
+ */
+ virtual void key( const char* );
+};
+
+
+#endif
+
diff --git a/bibletime/backend/cswordlexiconmoduleinfo.cpp b/bibletime/backend/cswordlexiconmoduleinfo.cpp
new file mode 100644
index 0000000..666033c
--- /dev/null
+++ b/bibletime/backend/cswordlexiconmoduleinfo.cpp
@@ -0,0 +1,122 @@
+/***************************************************************************
+ cswordlexiconmoduleinfo.cpp - description
+ -------------------
+ begin : Thu Oct 5 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+#include "cswordlexiconmoduleinfo.h"
+#include "../frontend/cbtconfig.h"
+
+//Qt includes
+#include <qfile.h>
+#include <qdatastream.h>
+
+//Sword includes
+#include <swmodule.h>
+
+#include <kglobal.h>
+#include <kstddirs.h>
+
+
+CSwordLexiconModuleInfo::CSwordLexiconModuleInfo( SWModule* module) : CSwordModuleInfo(module) {
+ m_entryList = 0;
+}
+
+CSwordLexiconModuleInfo::CSwordLexiconModuleInfo( const CSwordLexiconModuleInfo& m ) : CSwordModuleInfo(m) {
+ delete m_entryList;
+ m_entryList = 0;
+
+ if (m.m_entryList) {
+ m_entryList = new QStringList();
+ *m_entryList = *m.m_entryList;//copy list items
+ }
+}
+
+CSwordLexiconModuleInfo::~CSwordLexiconModuleInfo(){
+ delete m_entryList;
+ m_entryList = 0;
+}
+
+/** Returns the entries of the module. */
+QStringList* const CSwordLexiconModuleInfo::entries(){
+ if (!module())
+ return 0;
+
+ if (!m_entryList) {
+ m_entryList = new QStringList();
+
+ const bool lexiconCache = CBTConfig::get(CBTConfig::lexiconCache);
+ bool read = false;
+
+ if (lexiconCache){
+ QFile f1(
+ QString::fromLatin1("%1/%2")
+ .arg(KGlobal::dirs()->saveLocation("data", "bibletime/cache/"))
+ .arg( name() )
+ );
+
+ if ( f1.open( IO_ReadOnly ) ){
+ QDataStream s( &f1 );
+ QString v;
+ s >> v;
+ if (v == config(ModuleVersion) ) {
+ s >> *m_entryList;
+ read = true;
+ }
+ f1.close();
+ }
+ }
+
+
+ if (!read){
+ (*module()) = TOP;
+ do {
+ m_entryList->append(QString::fromLocal8Bit(module()->KeyText())); //UTF8, Latin1 or Local8Bit??
+ (*module())++;
+ } while (!module()->Error());
+
+ if (m_entryList->first().stripWhiteSpace().isEmpty())
+ m_entryList->remove( m_entryList->begin() );
+
+ if (lexiconCache){
+ // create cache
+ QString dir = KGlobal::dirs()->saveLocation("data", "bibletime/cache/");
+ QFile f2( QString::fromLatin1("%1/%2").arg(dir).arg( name() ) );
+ if (f2.open( IO_WriteOnly )){
+ QDataStream s( &f2 );
+ s << config(CSwordModuleInfo::ModuleVersion);
+ s << *m_entryList;
+ f2.close();
+ }
+ }
+ (*module()) = TOP;
+ }
+ }
+ return m_entryList;
+}
+
+/** Jumps to the closest entry in the module. */
+const bool CSwordLexiconModuleInfo::snap(){
+ bool ret = false;
+ if(module()->getRawEntry()){ //snap to the current entry
+ ret = true;
+ }
+ return ret;
+}
+
+/** No descriptions */
+CSwordModuleInfo* CSwordLexiconModuleInfo::clone(){
+ return new CSwordLexiconModuleInfo(*this);
+}
diff --git a/bibletime/backend/cswordlexiconmoduleinfo.h b/bibletime/backend/cswordlexiconmoduleinfo.h
new file mode 100644
index 0000000..b240f7c
--- /dev/null
+++ b/bibletime/backend/cswordlexiconmoduleinfo.h
@@ -0,0 +1,72 @@
+/***************************************************************************
+ cswordlexiconmoduleinfo.h - description
+ -------------------
+ begin : Thu Oct 5 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSWORDLEXICONMODULEINFO_H
+#define CSWORDLEXICONMODULEINFO_H
+
+//own includes
+#include "cswordmoduleinfo.h"
+
+//Qt includes
+#include <qstringlist.h>
+
+/**
+ * The implementation of CModuleInfo for the Sword lexiccons and citionaries.
+ * @author The BibleTime team
+ * @version $Id: cswordlexiconmoduleinfo.h,v 1.5 2002/03/06 22:02:41 joachim Exp $
+ */
+class CSwordLexiconModuleInfo : public CSwordModuleInfo {
+public:
+ /**
+ * The standard constructor fot this object.
+ * A default constructor doesn't exist. Use this one.
+ */
+ CSwordLexiconModuleInfo( SWModule* module );
+ /**
+ * The copy constructor
+ */
+ CSwordLexiconModuleInfo( const CSwordLexiconModuleInfo& m );
+ virtual CSwordModuleInfo* clone();
+ ~CSwordLexiconModuleInfo();
+ /**
+ * Returns the entries of the module.
+ * This function returns the entries of the modules represented by this object.
+ * If this function is called for the first time the list is load from disk and stored in a list which cahes it.
+ * If the function is called again, the cached list is returned so we have a major speed improvement.
+ */
+ QStringList* const entries();
+ /**
+ * Reimplementation.
+ */
+ virtual const CSwordModuleInfo::ModuleType type() const;
+ /**
+ * Jumps to the closest entry in the module.
+ */
+ const bool snap();
+
+private:
+ /**
+ * This is the list which caches the entres of the module.
+ */
+ QStringList* m_entryList;
+};
+
+inline const CSwordModuleInfo::ModuleType CSwordLexiconModuleInfo::type() const {
+ return CSwordModuleInfo::Lexicon;
+}
+
+#endif
diff --git a/bibletime/backend/cswordmoduleinfo.cpp b/bibletime/backend/cswordmoduleinfo.cpp
new file mode 100644
index 0000000..f66c210
--- /dev/null
+++ b/bibletime/backend/cswordmoduleinfo.cpp
@@ -0,0 +1,258 @@
+/***************************************************************************
+ cswordmoduleinfo.cpp - description
+ -------------------
+ begin : Wed Oct 11 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+#include "cswordmoduleinfo.h"
+#include "cswordbackend.h"
+#include "chtmlentrydisplay.h"
+#include "cswordmodulesearch.h"
+#include "cswordkey.h"
+#include "util/scoped_resource.h"
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <stddef.h>
+#include <dirent.h>
+#include <regex.h>
+
+//Qt includes
+
+//Sword includes
+#include <swmodule.h>
+#include <swkey.h>
+#include <listkey.h>
+#include <versekey.h>
+#include <swconfig.h>
+#include <rtfhtml.h>
+
+CSwordModuleInfo::CSwordModuleInfo( SWModule* module ) {
+ m_module = module;
+ m_searchResult.ClearList();
+ m_dataCache.name = QString::fromLatin1(module->Name());
+ m_dataCache.isUnicode = m_module->isUnicode();
+
+ if (backend()) {
+ if (hasVersion() && (minimumSwordVersion() > SWVersion::currentVersion)) {
+ qWarning("The module \"%s\" requires a newer Sword library. Please update to \"Sword %s\".", name().latin1(), (const char*)minimumSwordVersion());
+ }
+ }
+}
+
+CSwordModuleInfo::CSwordModuleInfo( const CSwordModuleInfo& m ) {
+ m_module = m.m_module;
+ m_searchResult = m.m_searchResult;
+}
+
+
+/** No descriptions */
+CSwordModuleInfo* CSwordModuleInfo::clone(){
+ return new CSwordModuleInfo(*this);
+}
+
+CSwordModuleInfo::~CSwordModuleInfo(){
+ m_searchResult.ClearList();
+ m_module = 0; //the Sword module object is deleted by the backend
+}
+
+/** Sets the unlock key of the modules and writes the key into the cofig file.*/
+const CSwordModuleInfo::UnlockErrorCode CSwordModuleInfo::unlock( const QString& unlockKey ){
+ CSwordModuleInfo::UnlockErrorCode ret = CSwordModuleInfo::noError;
+ SWConfig moduleConfig("");
+ if ( backend()->moduleConfig(name(), moduleConfig) ) {
+ moduleConfig[name().latin1()]["CipherKey"] = unlockKey.local8Bit();
+ backend()->setCipherKey(name().latin1(), unlockKey.local8Bit());
+ (*backend()->getConfig()) += moduleConfig;
+ (*backend()->getConfig())[name().latin1()]["CipherKey"] = moduleConfig[name().latin1()]["CipherKey"];
+ moduleConfig.Save();
+ }
+ else
+ ret = CSwordModuleInfo::wrongUnlockKey;
+ return ret;
+}
+
+/** Returns the display object for this module. */
+CHTMLEntryDisplay* const CSwordModuleInfo::getDisplay() const {
+ return dynamic_cast<CHTMLEntryDisplay*>(m_module->Disp());
+}
+
+/** This function returns true if this module is locked, otherwise return false. */
+const bool CSwordModuleInfo::isLocked() {
+ if (isEncrypted() && config(CipherKey).isEmpty())
+ return true;
+ return false;
+}
+
+/** This functions returns true if this module is encrypted (locked or unlocked). */
+const bool CSwordModuleInfo::isEncrypted() const {
+ /**
+ * If we have the CipherKey entry the module
+ * is encrypted but not necessary locked
+ */
+ ConfigEntMap config = backend()->getConfig()->Sections.find( name().latin1() )->second;
+ ConfigEntMap::iterator it = config.find("CipherKey");
+ if (it != config.end())
+ return true;
+ return false;
+}
+
+const bool CSwordModuleInfo::hasVersion() const {
+ const string version = (*backend()->getConfig())[name().latin1()]["Version"];
+ return version.length();
+}
+
+
+/** Returns true if something was found, otherwise return false. */
+const bool CSwordModuleInfo::search( const QString searchedText, const int searchOptions, ListKey scope, void (*percentUpdate)(char, void*) ) {
+ int searchType = 0;
+ int searchFlags = REG_ICASE;
+
+ //work around Swords thread insafety for Bibles and Commentaries
+ util::scoped_ptr<CSwordKey> key( CSwordKey::createInstance(this) );
+ SWKey* s = dynamic_cast<SWKey*>(key.get());
+ if (s)
+ m_module->SetKey(*s);
+
+ //setup variables required for Sword
+ if (searchOptions & CSwordModuleSearch::caseSensitive)
+ searchFlags = 0;
+
+ if (searchOptions & CSwordModuleSearch::multipleWords)
+ searchType = -2; //multiple words
+ else if (searchOptions & CSwordModuleSearch::exactPhrase)
+ searchType = -1; //exact phrase
+ else if (searchOptions & CSwordModuleSearch::regExp)
+ searchType = 0; //regexp matching
+
+ if ((searchOptions & CSwordModuleSearch::useLastResult) && m_searchResult.Count()) {
+ util::scoped_ptr<SWKey> searchScope( m_searchResult.clone() );
+ m_searchResult = m_module->Search(searchedText.utf8(), searchType, searchFlags, searchScope, 0, percentUpdate);
+ }
+ else if (searchOptions & CSwordModuleSearch::useScope) {
+ m_searchResult = m_module->Search(searchedText.utf8(), searchType, searchFlags, (type() != Lexicon && type() != GenericBook) ? &scope : 0, 0, percentUpdate);
+ }
+ else
+ m_searchResult = m_module->Search(searchedText.utf8(), searchType, searchFlags, 0, 0, percentUpdate);
+ return (m_searchResult.Count()>0);
+}
+
+/** Returns the last search result for this module. */
+ListKey& CSwordModuleInfo::searchResult(const ListKey* newResult) {
+ if (newResult)
+ m_searchResult.copyFrom( *newResult );
+ return m_searchResult;
+}
+
+/** Clears the last search result. */
+void CSwordModuleInfo::clearSearchResult(){
+ m_searchResult.ClearList();
+}
+
+/** This interupts the search if this module is being searched. */
+void CSwordModuleInfo::interruptSearch(){
+ m_module->terminateSearch = true;
+}
+
+/** Returns the required Sword version for this module. Returns -1 if no special Sword version is required. */
+const SWVersion CSwordModuleInfo::minimumSwordVersion(){
+ return SWVersion( config(CSwordModuleInfo::MinimumSwordVersion).latin1() );
+}
+
+/** Returns the name of the module. */
+const QString CSwordModuleInfo::name() const {
+ return m_dataCache.name;
+}
+
+/** Returns true if this module is Unicode encoded. False if the charset is iso8859-1. */
+const bool CSwordModuleInfo::isUnicode(){
+ return m_dataCache.isUnicode;
+}
+
+const QString CSwordModuleInfo::config( const CSwordModuleInfo::ConfigEntry entry) {
+ switch (entry) {
+ case AboutInformation:
+ {
+ QString about = QString::fromLatin1(m_module->getConfigEntry("About"));
+ if (!about.isEmpty()) {
+ RTFHTML filter;
+ const int len = about.length()+600;
+ char dummy[len];
+ strcpy(dummy, about.local8Bit());
+
+ filter.ProcessText(dummy,len,0);
+ about = QString::fromLocal8Bit(dummy);
+ }
+ return about;
+ }
+ case CipherKey:
+ return QString::fromLatin1(m_module->getConfigEntry("CipherKey"));
+ case AbsoluteDataPath:
+ return QString::fromLatin1(m_module->getConfigEntry("AbsoluteDataPath"));
+ case DataPath:
+ return QString::fromLatin1(m_module->getConfigEntry("DataPath"));
+ case Description:
+ return QString::fromLocal8Bit(m_module->Description());
+ case ModuleVersion:
+ return QString::fromLatin1(m_module->getConfigEntry("Version"));
+ case MinimumSwordVersion: {
+ const QString version = QString::fromLatin1(m_module->getConfigEntry("MinimumVersion"));
+ return !version.isEmpty() ? version : QString::fromLatin1("0.0");
+ }
+ case DisplayLevel: {
+ const QString level = QString::fromLatin1(m_module->getConfigEntry("DisplayLevel"));
+ return !level.isEmpty() ? level : QString::fromLatin1("0");
+ }
+ default:
+ return QString::null;
+ }
+}
+
+/** Returns true if the module supports the feature given as parameter. */
+const bool CSwordModuleInfo::has( const CSwordModuleInfo::Feature feature ){
+ switch (feature) {
+ case StrongsNumbers:
+ return m_module->getConfig().has("Feature", "StrongsNumber");
+ case GreekDef:
+ return m_module->getConfig().has("Feature", "GreekDef");
+ case HebrewDef:
+ return m_module->getConfig().has("Feature", "HebrewDef");
+ case GreekParse:
+ return m_module->getConfig().has("Feature", "GreekParse");
+ case HebrewParse:
+ return m_module->getConfig().has("Feature", "HebrewParse");
+ case DailyDevotion:
+ return m_module->getConfig().has("Feature", "DailyDevotion");
+ case Glossary:
+ return m_module->getConfig().has("Feature", "Glossary");
+ }
+ return 0;
+}
+
+const bool CSwordModuleInfo::has( const CSwordBackend::FilterOptions option ){
+ //BAD workaround to see if the filter is GBF or ThML!
+ if (m_module->getConfig().has("GlobalOptionFilter",QString::fromLatin1("GBF%1").arg(backend()->configOptionName(option)).latin1()))
+ return true;
+ if (m_module->getConfig().has("GlobalOptionFilter",QString::fromLatin1("ThML%1").arg(backend()->configOptionName(option)).latin1()))
+ return true;
+ if (m_module->getConfig().has("GlobalOptionFilter",QString::fromLatin1("UTF8%1").arg(backend()->configOptionName(option)).latin1()))
+ return true;
+ if (m_module->getConfig().has("GlobalOptionFilter",backend()->configOptionName(option).latin1()))
+ return true;
+
+ return false;
+}
+
+
diff --git a/bibletime/backend/cswordmoduleinfo.h b/bibletime/backend/cswordmoduleinfo.h
new file mode 100644
index 0000000..8173401
--- /dev/null
+++ b/bibletime/backend/cswordmoduleinfo.h
@@ -0,0 +1,197 @@
+/***************************************************************************
+ cswordmoduleinfo.h - description
+ -------------------
+ begin : Wed Oct 11 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSWORDMODULEINFO_H
+#define CSWORDMODULEINFO_H
+
+//BibleTime includes
+#include "cswordbackend.h"
+#include "frontend/cpointers.h"
+
+
+//Qt includes
+#include <qstring.h>
+#include <qfont.h>
+#include <qmap.h>
+
+
+//Sword includes
+#include <listkey.h>
+#include <swversion.h>
+
+class SWModule;
+class CSwordBackend;
+class CHTMLEntryDisplay;
+
+/**
+ * Base class for Sword modules.
+ * This is the base class for all Sword modules. Every class handling a special Sword module type
+ * does inherit from this class.
+ *
+ * @author The BibleTime team
+ * @version $Id: cswordmoduleinfo.h,v 1.21 2002/03/21 21:58:37 joachim Exp $
+ */
+class CSwordModuleInfo : public CPointers {
+public:
+ enum ModuleType {
+ Bible,
+ Commentary,
+ Lexicon,
+ GenericBook,
+ Unknown
+ };
+ /**
+ * This enum is used to give
+ * back an error code after unlocking the module
+ */
+ enum UnlockErrorCode {
+ noError, /* No error occured, everything worked ok. The key was written to the config*/
+ wrongUnlockKey, /* The wrong key was used. Module is not unlocked */
+ notLocked, /* The module was not locked so it can't be unlocked */
+ noPermission /* The key was not written to config because we have no permissions*/
+ };
+ enum ConfigEntry {
+ AboutInformation, /* The about information of a module which is stored in the config file*/
+ AbsoluteDataPath, /* The absolute data path stored in the config object */
+ CipherKey, /* The cipher key which was used to unlock the module. Not necessarily set.*/
+ DataPath, /* The relative path. See AbsoluteDataPath*/
+ Description, /* The module decsription stored in the config file */
+ ModuleVersion, /* The module's version.*/
+ MinimumSwordVersion, /* The required Sword Version of this module. Otherwise some things may not work (compression etc.).*/
+ DisplayLevel /* Mostly used for books. Gives the level which should contain the connected entries.*/
+ };
+ enum Feature {
+ StrongsNumbers, /*Use for Bibles which have embedded strong numbers*/
+ GreekDef, /*Hebrew StringsNumbers definitions in a lexicon*/
+ HebrewDef,
+ GreekParse,
+ HebrewParse,
+ DailyDevotion,
+ Glossary
+ };
+
+ /**
+ * Returns the config entry which is pecified by the parameter.
+ */
+ const QString config( const ConfigEntry );
+
+ CSwordModuleInfo( SWModule* module );
+ CSwordModuleInfo( const CSwordModuleInfo& m );
+ virtual CSwordModuleInfo* clone();
+ virtual ~CSwordModuleInfo();
+
+ /**
+ * Returns the module object so all objects can access the original Sword module.
+ */
+ SWModule* const module() const;
+ /**
+ * Sets the unlock key of the modules and writes the key into the cofig file.
+ * @return True if the unlock process was succesful, if the key was wrong, or if the config file was write protected return false.
+ */
+ const CSwordModuleInfo::UnlockErrorCode unlock( const QString& unlockKey );
+ /**
+ * Returns the display object for this module. Normally every module should have a Display object.
+ * Please don't use module()->Display() because this function does return the Sword display and does
+ * render the text, too.
+ * This function performs some casts to return the correct display. If it returns 0 there's no valid
+ * display object.
+ */
+ CHTMLEntryDisplay* const getDisplay() const;
+ /**
+ * This function does return true if the data files of the module are encrypted by the module author
+ * (the on who made the module) no matter if it's locked or not.
+ *
+ */
+ const bool isEncrypted() const;
+ /**
+ * This function returns true if this module is locked (encrypted + correct cipher key),
+ * otherwise return false.
+ */
+ const bool isLocked();
+
+ /**
+ * @return true if this module has a version number and false if it doesn't have one.
+ */
+ const bool hasVersion() const;
+ /**
+ * Returns true if something was found, otherwise return false.
+ * This function does start the Sword functions to search in the module and it does
+ * overwrite the variable containing the last search result.
+ */
+ virtual const bool search( const QString searchedText, const int searchOptions, ListKey scope, void (*percent)(char, void*));
+ /**
+ * Returns the last search result for this module.
+ * The last result is cleared by @ref search
+ */
+ virtual ListKey& searchResult( const ListKey* newResult = 0 );
+ /**
+ * This interupts the search if this module is being searched.
+ */
+ virtual void interruptSearch();
+ /**
+ * Clears the last search result.
+ * This does immediately clean the last search result,
+ * no matter if search is in progress or not.
+ */
+ void clearSearchResult();
+ /**
+ * Returns the type of the module.
+ */
+ virtual const CSwordModuleInfo::ModuleType type() const;
+ /**
+ * Returns the required Sword version for this module.
+ * Returns -1 if no special Sword version is required.
+ */
+ const SWVersion minimumSwordVersion();
+ /**
+ * Returns the name of the module.
+ */
+ const QString name() const;
+ /**
+ * Returns true if this module is Unicode encoded. False if the charset is iso8859-1.
+ */
+ const bool isUnicode();
+ /**
+ * Snaps to the closest entry in the module if the current key is
+ * not present in the data files.
+ */
+ virtual const bool snap() {return false;};
+ const bool has( const CSwordModuleInfo::Feature );
+ const bool has( const CSwordBackend::FilterOptions option ) ;
+
+private:
+ SWModule* m_module;
+ ListKey m_searchResult;
+ struct {
+ QString name;
+ bool isUnicode;
+ } m_dataCache;
+};
+
+typedef QList<CSwordModuleInfo> ListCSwordModuleInfo;
+
+inline const CSwordModuleInfo::ModuleType CSwordModuleInfo::type() const {
+ return CSwordModuleInfo::Unknown;
+}
+
+inline SWModule*const CSwordModuleInfo::module() const {
+ return m_module;
+}
+
+typedef QList<CSwordModuleInfo> ListCSwordModuleInfo;
+
+#endif
diff --git a/bibletime/backend/cswordmodulesearch.cpp b/bibletime/backend/cswordmodulesearch.cpp
new file mode 100644
index 0000000..404b332
--- /dev/null
+++ b/bibletime/backend/cswordmodulesearch.cpp
@@ -0,0 +1,189 @@
+/***************************************************************************
+ cswordmodulesearch.cpp - description
+ -------------------
+ begin : Fri Oct 13 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+#include "cswordmodulesearch.h"
+#include "cswordmoduleinfo.h"
+#include "cswordbackend.h"
+#include "../frontend/cbtconfig.h"
+
+//System includes
+#include <pthread.h>
+
+//#include <qdatetime.h>
+
+//Sword includes
+#include <swmodule.h>
+#include <swkey.h>
+#include <listkey.h>
+
+
+CSwordModuleSearch* searcher = 0;
+
+void startSearchCallback(void *p){
+ if (searcher)
+ searcher->startSearch();
+}
+
+void percentUpdateDummy(char percent, void *p) {
+ searcher->percentUpdate(percent, p);
+};
+
+CSwordModuleSearch::CSwordModuleSearch() :
+ m_searchedText(QString::null),
+ m_searchOptions(0),m_foundItems(false),m_isSearching(false),m_terminateSearch(false)
+{
+ searcher = this;
+}
+
+CSwordModuleSearch::~CSwordModuleSearch(){
+ searcher = 0;
+}
+
+void CSwordModuleSearch::percentUpdate(char percent, void *){
+ cms_currentProgress = (int)percent;
+ if (cms_module_count > 1)
+ cms_overallProgress = (int)((float)((cms_module_current - 1)*100+cms_currentProgress))/cms_module_count;
+ else
+ cms_overallProgress = cms_currentProgress;
+ m_updateSig.activate();
+}
+
+/** This function sets the modules which should be searched. */
+void CSwordModuleSearch::setModules( ListCSwordModuleInfo& list ) {
+ m_moduleList = list;
+}
+
+/** Starts the search for the search text. */
+const bool CSwordModuleSearch::startSearch() {
+ backend()->setFilterOptions ( CBTConfig::getFilterOptionDefaults() );
+ m_foundItems = false;
+ m_terminateSearch = false;
+ m_isSearching = true;
+
+ cms_currentProgress = 0;
+ cms_overallProgress = 0;
+ cms_module_current = 0;
+ cms_module_count = m_moduleList.count();
+
+ bool foundItems = false;
+
+ for (m_moduleList.first(); m_moduleList.current() && !m_terminateSearch; m_moduleList.next()) {
+ cms_module_current++;
+ if ( m_moduleList.current()->search(m_searchedText, m_searchOptions, m_searchScope, &percentUpdateDummy) )
+ foundItems = true;
+ }
+ cms_currentProgress = 100;
+ cms_overallProgress = 100;
+
+ m_foundItems = foundItems;
+ m_isSearching = false;
+ m_terminateSearch = false;
+
+ m_finishedSig.activate();
+ return true;
+}
+
+void CSwordModuleSearch::startSearchThread(void){
+// pthread_t thread;
+
+// pthread_attr_t attr;
+// pthread_attr_init(&attr);
+// pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+// pthread_mutex_init(&percentage_mutex, NULL);
+// pthread_mutex_init(&signal_mutex, NULL);
+
+// percentage_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
+ /*const int i =*/ //pthread_create( &thread, /*&attr*/NULL, &startSearchCallback, this );
+
+ startSearch();
+
+// pthread_cond_wait(&finish_cond, &dummy_mutex);
+// pthread_mutex_lock(&signal_mutex);
+// m_finishedSig.activate();
+// pthread_mutex_unlock(&signal_mutex);
+}
+
+/** Sets the text which should be search in the modules. */
+void CSwordModuleSearch::setSearchedText( const QString text ){
+ m_searchedText = text;
+}
+
+/** Sets the search scope. */
+void CSwordModuleSearch::setSearchScope( ListKey scope ) {
+ m_searchScope.copyFrom( scope );
+}
+
+/** Sets the search scope back. */
+void CSwordModuleSearch::resetSearchScope() {
+ m_searchScope.ClearList();
+}
+
+/** Interrupts the current search. */
+void CSwordModuleSearch::interruptSearch() {
+ if (m_isSearching)
+ m_terminateSearch = true; //no other modules will be searched
+ for (m_moduleList.first(); m_moduleList.current(); m_moduleList.next())
+ m_moduleList.current()->interruptSearch(); //interrupt the current module
+}
+
+/** Returns true if in the last search the searcher found items, if no items were found return false. */
+const bool CSwordModuleSearch::foundItems() {
+ return m_foundItems;
+}
+
+/** Sets the options for this search. Options include theflags and search types of the Sword searc interface. */
+void CSwordModuleSearch::setSearchOptions( int options ){
+ m_searchOptions = options;
+}
+
+/** Returns the percent for the given type. */
+const int CSwordModuleSearch::getPercent( percentType type ){
+ switch (type) {
+ case currentModule:
+ return cms_currentProgress;
+ case allModules:
+ return cms_overallProgress;
+// default:
+// return 0;
+ };
+ return 0;
+}
+
+/** Returns a copy of the used search scope. */
+ListKey& CSwordModuleSearch::scope() {
+ return m_searchScope;
+}
+
+void CSwordModuleSearch::connectPercentUpdate( QObject *receiver, const char *member ) {
+ m_updateSig.connect(receiver, member);
+};
+
+void CSwordModuleSearch::connectFinished( QObject *receiver, const char *member ) {
+ m_finishedSig.connect(receiver, member);
+};
+
+/** Should be called when the search finished. */
+void CSwordModuleSearch::searchFinished(){
+// qWarning("CSwordModuleSearch::searchFinished!");
+// m_updateSig.block(true);
+// pthread_mutex_lock(&signal_mutex);
+ m_finishedSig.activate();
+// pthread_mutex_unlock(&signal_mutex);
+// m_updateSig.block(false);
+}
diff --git a/bibletime/backend/cswordmodulesearch.h b/bibletime/backend/cswordmodulesearch.h
new file mode 100644
index 0000000..241f4c9
--- /dev/null
+++ b/bibletime/backend/cswordmodulesearch.h
@@ -0,0 +1,159 @@
+/***************************************************************************
+ cswordmodulesearch.h - description
+ -------------------
+ begin : Fri Oct 13 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSWORDMODULESEARCH_H
+#define CSWORDMODULESEARCH_H
+
+//BibleTime includes
+//#include "cswordmoduleinfo.h"
+//#include "../structdef.h"
+#include "../frontend/cpointers.h"
+
+//Qt includes
+#include <qlist.h>
+#include <qstring.h>
+#include <qsignal.h>
+
+//System includes
+#include <pthread.h>
+
+//Sword includes
+#include <listkey.h>
+
+//class ListKey;
+class CSwordModuleInfo;
+typedef QList<CSwordModuleInfo> ListCSwordModuleInfo;
+
+/**
+ * CSwordModuleSearch manages the search on Sword modules. It manages the thread(s)
+ * and manages the different modules.
+ *
+ * @author The BibleTime team
+ * @version $Id: cswordmodulesearch.h,v 1.11 2002/03/09 21:03:16 mgruner Exp $
+ */
+class CSwordModuleSearch: public CPointers {
+public:
+ enum scopeType {
+ Scope_NoScope,
+ Scope_LastSearch,
+ Scope_Bounds
+ };
+ enum searchOptions {
+ exactPhrase = 0x000000001,
+ multipleWords = 0x000000002,
+ regExp = 0x000000004,
+ caseSensitive = 0x000000008,
+ useLastResult = 0x000000010,
+ useScope = 0x000000020
+ };
+ enum percentType {
+ currentModule,
+ allModules
+ };
+ /**
+ * This is used to show the selection in the searchscope dialog
+ */
+ enum SearchScope { NoScope, LastSearch, Bounds };
+
+ /** This is used to so show the selection of the searchdialog
+ *
+ */
+ enum SearchType { MultiWord, ExactPhrase, RegEx };
+
+
+ CSwordModuleSearch();
+ /**
+ * The destructor of this class. It cleans uop memory before it's deleted.
+ */
+ virtual ~CSwordModuleSearch();
+ /**
+ * Sets the text which should be search in the modules.
+ */
+ void setSearchedText( const QString );
+ /**
+ * Starts the search for the search text.
+ */
+ const bool startSearch();
+ /**
+ * This function sets the modules which should be searched.
+ */
+ void setModules( ListCSwordModuleInfo& );
+ /**
+ * Sets the search scope.
+ */
+ void setSearchScope( ListKey scope );
+ /**
+ * Calls with true if you want to use the last searchresult as search scope.
+ */
+// void useLastSearchResult( const bool );
+ /**
+ * Sets the seaech scope back.
+ */
+ void resetSearchScope();
+ /**
+ * Interrupts the current search.
+ */
+ void interruptSearch();
+ /**
+ * @return "true" if in the last search the searcher found items, if no items were found return "false"
+ */
+ const bool foundItems();
+ /**
+ * This functions starts the search: First it creates a new thread for the search and it calles the the
+ * function to start the search.
+ */
+ void startSearchThread(void);
+ /**
+ * Sets the options for this search. Options include the
+ * flags and search types of the Sword searc interface.
+ */
+ void setSearchOptions( int options );
+ /**
+ * Returns the percent for the given type.
+ */
+ const int getPercent( percentType type );
+ void percentUpdate(char percent, void *p);
+ /**
+ * Returns a copy of the used search scope.
+ */
+ ListKey& scope();
+ void connectPercentUpdate( QObject *receiver, const char *member );
+ void connectFinished( QObject *receiver, const char *member );
+ void searchFinished();
+
+protected:
+ QString m_searchedText;
+ ListKey m_searchScope;
+ ListCSwordModuleInfo m_moduleList;
+
+ int m_searchOptions;
+
+ bool m_foundItems;
+ bool m_isSearching;
+ bool m_terminateSearch;
+
+ int cms_currentProgress;
+ int cms_overallProgress;
+ int cms_module_count;
+ int cms_module_current;
+
+private:
+ QSignal m_updateSig;
+ QSignal m_finishedSig;
+};
+
+#endif
diff --git a/bibletime/backend/cswordtreekey.cpp b/bibletime/backend/cswordtreekey.cpp
new file mode 100644
index 0000000..5aa9f56
--- /dev/null
+++ b/bibletime/backend/cswordtreekey.cpp
@@ -0,0 +1,83 @@
+/***************************************************************************
+ cswordtreekeyidx.cpp - description
+ -------------------
+ begin : Thu Jan 24 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cswordtreekey.h"
+#include "cswordbookmoduleinfo.h"
+
+CSwordTreeKey::CSwordTreeKey( const CSwordTreeKey& k ) : TreeKeyIdx(/*(const char*)*/k), CSwordKey(k) {
+}
+
+CSwordTreeKey::CSwordTreeKey( const TreeKeyIdx *k, CSwordModuleInfo* module )
+ : TreeKeyIdx(*k), CSwordKey(module) {
+}
+
+CSwordTreeKey* CSwordTreeKey::copy() const {
+ return new CSwordTreeKey(*this);
+}
+
+/** Sets the key of this instance */
+const QString CSwordTreeKey::key( const QString& newKey ){
+ if (!newKey.isNull()) {
+ if (newKey.isEmpty())
+ root();
+ else
+ TreeKeyIdx::operator = ((const char*)newKey.local8Bit()); //don't use Utf8! Doesn't work with umlauts!
+
+ if (Error()) {
+ root();
+ return QString::null;
+ }
+ }
+ return QString::fromLocal8Bit( getFullName() ); //don't use fromUtf8
+}
+
+void CSwordTreeKey::key( const char* newKey ){
+ if (newKey) {
+ TreeKeyIdx::operator = (newKey);
+ }
+}
+
+CSwordModuleInfo* CSwordTreeKey::module( CSwordModuleInfo* newModule ){
+ if (newModule && newModule->type() == CSwordModuleInfo::GenericBook ) {
+ CSwordBookModuleInfo* bookModule = dynamic_cast<CSwordBookModuleInfo*>(newModule);
+ m_module = newModule;
+ copyFrom(*(bookModule->tree()));
+ root();
+ }
+ return m_module;
+}
+
+//const bool CSwordTreeKey::jumpTo(const JumpType type) {
+// switch (type) {
+// case NextEntry:
+// if (Traversable()) {
+// (*this)++;
+// return !Error();
+// }
+// return false;
+//
+// case PreviousEntry:
+// if (Traversable()) {
+// (*this)++;
+// return !Error();
+// }
+// return false;
+//
+// default:
+// return false;
+// };
+//}
diff --git a/bibletime/backend/cswordtreekey.h b/bibletime/backend/cswordtreekey.h
new file mode 100644
index 0000000..8b8a04f
--- /dev/null
+++ b/bibletime/backend/cswordtreekey.h
@@ -0,0 +1,56 @@
+/***************************************************************************
+ cswordtreekeyidx.h - description
+ -------------------
+ begin : Thu Jan 24 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSWORDTREEKEYIDX_H
+#define CSWORDTREEKEYIDX_H
+
+//BibleTime includes
+#include "cswordkey.h"
+#include "cswordmoduleinfo.h"
+
+//Sword includes
+#include <treekeyidx.h>
+
+/** BibleTime's implementation of Sword's TreeKeyIdx class.
+ * @author The BibleTime team
+ */
+class CSwordTreeKey : public TreeKeyIdx, public CSwordKey {
+public:
+// enum JumpType {
+// NextEntry,
+// PreviousEntry
+// };
+
+ CSwordTreeKey( const CSwordTreeKey& k );
+ CSwordTreeKey( const TreeKeyIdx *k, CSwordModuleInfo* module );
+ CSwordModuleInfo* module( CSwordModuleInfo* newModule );
+ virtual CSwordTreeKey* copy() const;
+ /**
+ * Set/get the key. If the parameter is not set (means equal to QString::null)
+ * the used key is returned. Otherwise the key is set and the new on ei returned.
+ */
+ virtual const QString key( const QString& key = QString::null );
+ /**
+ * Set/get the key. If the parameter is not set (means equal to QString::null)
+ * the used key is returned. Otherwise the key is set and the new on ei returned.
+ */
+ virtual void key( const char* key );
+
+// const bool jumpTo( const JumpType type );
+};
+
+#endif
diff --git a/bibletime/backend/cswordversekey.cpp b/bibletime/backend/cswordversekey.cpp
new file mode 100644
index 0000000..f6b7642
--- /dev/null
+++ b/bibletime/backend/cswordversekey.cpp
@@ -0,0 +1,172 @@
+/***************************************************************************
+ cswordversekey.cpp - description
+ -------------------
+ begin : Thu Oct 5 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+#include "cswordversekey.h"
+#include "cswordbiblemoduleinfo.h"
+#include "cswordcommentarymoduleinfo.h"
+
+//Qt includes
+#include <qstringlist.h>
+
+//Sword includes
+#include <swmodule.h>
+
+CSwordVerseKey::CSwordVerseKey( CSwordModuleInfo* module ) : CSwordKey(module) {
+}
+
+CSwordVerseKey::CSwordVerseKey( const CSwordVerseKey& k ) : VerseKey(k),CSwordKey(k) {
+}
+
+CSwordVerseKey::CSwordVerseKey( const VerseKey* k, CSwordModuleInfo* module) : VerseKey(*k),CSwordKey(module) {
+}
+
+/** Clones this object. */
+CSwordKey* CSwordVerseKey::copy() const {
+ return new CSwordVerseKey(*this);
+}
+
+/** Sets the module for this key */
+CSwordModuleInfo* CSwordVerseKey::module( CSwordModuleInfo* newModule ){
+ if (newModule && (newModule->type() == CSwordModuleInfo::Bible || newModule->type() == CSwordModuleInfo::Commentary) ) {
+ const QString& oldKey = key();
+ m_module = newModule;
+ key(oldKey);
+ }
+ return m_module;
+}
+
+/** Returns the current book as Text, not as integer. */
+const QString CSwordVerseKey::book( const QString& newBook ) {
+ int min = 0;
+ int max = 1;
+
+ if (!newBook.isEmpty()) {
+ 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
+ }
+
+ bool finished = false;
+ for (int testament = min; testament <= max && !finished; ++testament) {
+ for (int book = 0; book < BMAX[testament] && !finished; ++book) {
+ if ( !strcmp((const char*)newBook.local8Bit(),books[testament][book].name ) ) {
+ Testament(testament+1);
+ Book(book+1);
+ finished = true;
+ }
+ }
+ }
+ }
+ if ( Testament()> 0 && Testament() <=2 && Book() <= BMAX[Testament()-1] )
+ return QString::fromLocal8Bit( books[Testament()-1][Book()-1].name );
+ return QString::fromLocal8Bit( books[min][0].name ); //return the first book, i.e. Genesis
+}
+
+/** Sets the key we use to the parameter. */
+const QString CSwordVerseKey::key( const QString& newKey ){
+ if (!newKey.isEmpty()) {
+ VerseKey::operator = ((const char*)newKey.local8Bit());
+ }
+ return QString::fromLocal8Bit((const char*)*this);//don't use fromUtf8 here!
+}
+
+void CSwordVerseKey::key( const char* newKey ){
+ if (newKey) {
+ VerseKey::operator = (newKey);
+ }
+}
+
+const bool CSwordVerseKey::next( const JumpType type ) {
+ switch (type) {
+ case UseBook: {
+ if (Book() <= 0 || Book() >= BMAX[Testament()-1] && Testament() > 1)
+ return false;
+ Book(Book()+1);
+ return true;
+ }
+ case UseChapter: {
+ Chapter(Chapter()+1);
+ return true;
+ }
+ case UseVerse: {
+ if (m_module && m_module->module()) {
+ m_module->module()->SetKey(this); //use this key as base for the next one!
+ (*(m_module->module()) )++;
+ if (!m_module->module()->Error())
+ key( QString::fromLocal8Bit(m_module->module()->KeyText()) );//don't use fromUtf8
+ else {
+ Verse(Verse()+1);
+ return false;
+ }
+ }
+ else
+ Verse(Verse()+1);
+ return true;
+ }
+ default:
+ return false;
+ };
+};
+
+const bool CSwordVerseKey::previous( const JumpType type ) {
+ switch (type) {
+ case UseBook: {
+ if (Book()<=1 || Book() > BMAX[Testament()-1] && Testament() > 1)
+ return false;
+ Book(Book()-1);
+ return true;
+ }
+ case UseChapter: {
+ Chapter(Chapter()-1);
+ return true;
+ }
+ case UseVerse: {
+ if (m_module && m_module->module()) {
+ m_module->module()->SetKey(this); //use this key as base for the next one!
+ ( *( m_module->module() ) )--;
+ if (!m_module->module()->Error())
+ key( QString::fromLocal8Bit(m_module->module()->KeyText()) );//don't use fromUtf8
+ else {
+ Verse(Verse()-1);
+ return false;
+ }
+ }
+ else
+ Verse(Verse()-1);
+
+ return true;
+ }
+ default:
+ return false;
+ };
+};
diff --git a/bibletime/backend/cswordversekey.h b/bibletime/backend/cswordversekey.h
new file mode 100644
index 0000000..7afaab8
--- /dev/null
+++ b/bibletime/backend/cswordversekey.h
@@ -0,0 +1,119 @@
+/***************************************************************************
+ cswordversekey.h - description
+ -------------------
+ begin : Thu Oct 5 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************
+
+ ***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSWORDVERSEKEY_H
+#define CSWORDVERSEKEY_H
+
+//own includes
+#include "cswordkey.h"
+#include "cswordmoduleinfo.h"
+
+//Qt includes
+#include <qstring.h>
+
+//Sword includes
+#include <versekey.h>
+
+/**
+ * The CKey implementation for verse based modules (Bibles and Commentaries)
+ *
+ * This class is the implementation of CKey for verse based modules like
+ * Bibles and commentaries.
+ * This class provides the special functions to work with the verse based modules.
+ *
+ * Useful functions are
+ * @see NextBook()
+ * @see PreviousBook()
+ * @see NextChapter()
+ * @see PreviousChapter()
+ * @see NextVerse()
+ * @see PreviousVerse().
+ *
+ * Call the constructor only with a valid verse based modules, otherwise this key will be invalid
+ * and the application will probably crash.
+ *
+ * @version $Id: cswordversekey.h,v 1.8 2002/03/12 20:43:13 joachim Exp $
+ * @author The BibleTime team
+ */
+class CSwordVerseKey : public VerseKey, public CSwordKey {
+public:
+ enum JumpType {
+ UseBook,
+ UseChapter,
+ UseVerse
+ };
+
+ /**
+ * Constructor of this class.
+ *
+ * This function will construct a versekey with the current module position
+ * and it will setup the m_module members.
+ *
+ */
+ CSwordVerseKey( CSwordModuleInfo* module );
+ /**
+ * Copy constructor.
+ */
+ CSwordVerseKey( const CSwordVerseKey& k );
+ /**
+ * VerseKey based constructor.
+ */
+ CSwordVerseKey( const VerseKey* k, CSwordModuleInfo* module );
+ /**
+ * Clones this object.
+ */
+ virtual CSwordKey* copy() const;
+ /**
+ * Destructor of this class.
+ *
+ * Clean up the data variables and delete objects used and
+ * created by this class.
+ */
+// virtual ~CSwordVerseKey();
+ /**
+ * Set/get the key. If the parameter is not set (means equal to QString::null)
+ * the used key is returned. Otherwise the key is set and the new on ei returned.
+ */
+ virtual const QString key( const QString& key = QString::null );
+ /**
+ * Set/get the key. If the parameter is not set (means equal to QString::null)
+ * the used key is returned. Otherwise the key is set and the new on ei returned.
+ */
+ virtual void key( const char* key );
+
+ /**
+ * Jumps to the next entry of the given type
+ */
+ const bool next( const JumpType type );
+ /**
+ * Jumps to the previous entry of the given type
+ */
+ const bool previous ( const JumpType type );
+ /**
+ * This functions returns the current book as localised text, not as book numer.
+ *
+ * Use "char Book()" to retrieve the book number of the current book.
+ * @return The name of the current book
+ */
+ const QString book(const QString& newBook = QString::null);
+ /**
+ * Sets the module for this key
+ */
+ virtual CSwordModuleInfo* module( CSwordModuleInfo* newModule = 0 );
+};
+
+#endif
diff --git a/bibletime/backend/st31vJFM b/bibletime/backend/st31vJFM
new file mode 100644
index 0000000..ffbbf5d
--- /dev/null
+++ b/bibletime/backend/st31vJFM
Binary files differ
diff --git a/bibletime/bibletime.cpp b/bibletime/bibletime.cpp
new file mode 100644
index 0000000..ee84db7
--- /dev/null
+++ b/bibletime/bibletime.cpp
@@ -0,0 +1,266 @@
+/***************************************************************************
+ bibletime.cpp - The main class of BibleTime
+ -------------------
+ begin : Mit Jan 19 12:57:15 CET 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//local includes
+#include "config.h"
+#include "bibletime.h"
+#include "resource.h"
+
+//frontend includes
+#include "frontend/chtmldialog.h"
+#include "frontend/ctoolclass.h"
+#include "frontend/cmdiarea.h"
+#include "frontend/presenters/cswordpresenter.h"
+#include "frontend/presenters/cbiblepresenter.h"
+#include "frontend/presenters/ccommentarypresenter.h"
+#include "frontend/presenters/clexiconpresenter.h"
+#include "frontend/presenters/cbookpresenter.h"
+#include "frontend/keychooser/ckeychooser.h"
+#include "frontend/cbtconfig.h"
+#include "frontend/cpointers.h"
+
+//backend includes
+#include "backend/cswordmoduleinfo.h"
+#include "backend/cswordbiblemoduleinfo.h"
+#include "backend/cswordcommentarymoduleinfo.h"
+#include "backend/cswordlexiconmoduleinfo.h"
+#include "backend/cswordbookmoduleinfo.h"
+#include "backend/chtmlentrydisplay.h"
+#include "backend/chtmlchapterdisplay.h"
+#include "backend/cswordversekey.h"
+#include "backend/cswordldkey.h"
+
+//printing includes
+#include "printing/cprinter.h"
+
+//Qt includes
+#include <qsplitter.h>
+
+//KDE includes
+#include <kaction.h>
+#include <kconfig.h>
+#include <klocale.h>
+#include <kaccel.h>
+#include <kmenubar.h>
+#include <ktoolbar.h>
+
+BibleTime::BibleTime() : KMainWindow() {
+ m_initialized = false;
+ m_moduleList = 0;
+ m_progress = 0;
+ m_currentProfile = 0;
+
+ m_keyAccel = new KAccel(this);
+
+ connect(kapp, SIGNAL(lastWindowClosed()), SLOT(lastWindowClosed()));
+
+ initBackends();
+ initPrinter();
+
+ initView();
+ initActions();
+ setHelpMenuEnabled(false);
+ createGUI("bibletimeui.rc");
+ initMenubar();
+ initConnections();
+
+ readSettings();
+
+ setPlainCaption("BibleTime " VERSION);
+ setAutoSaveSettings(QString::fromLatin1("MainWindow"), false);
+}
+
+BibleTime::~BibleTime() {
+ saveSettings();
+}
+
+/** Saves the properties of BibleTime to the application wide configfile */
+void BibleTime::saveSettings(){
+ if (m_mdi)
+ m_mdi->saveSettings();
+ if (m_keyAccel)
+ m_keyAccel->writeSettings();
+
+ CBTConfig::set(CBTConfig::toolbar, m_viewToolbar_action->isChecked());
+ CBTConfig::set(CBTConfig::mainIndex, m_viewGroupManager_action->isChecked());
+
+ if (m_viewGroupManager_action->isChecked()) //only save changes when the groupmanager is visible
+ CBTConfig::set(CBTConfig::splitterSizes, m_splitter->sizes());
+
+ if (m_windowAutoTile_action->isChecked()) {
+ CBTConfig::set(CBTConfig::autoTile, true);
+ CBTConfig::set(CBTConfig::autoCascade, false);
+ }
+ else if ( m_windowAutoTile_action->isChecked() ) {
+ CBTConfig::set(CBTConfig::autoTile, false);
+ CBTConfig::set(CBTConfig::autoCascade, true);
+ }
+ else {
+ CBTConfig::set(CBTConfig::autoTile, false);
+ CBTConfig::set(CBTConfig::autoCascade, false);
+ }
+
+ if ( CBTConfig::get(CBTConfig::restoreWorkspace) ) {
+ if (CProfile* p = m_profileMgr.startupProfile())
+ saveProfile(p);
+ }
+}
+
+/** Reads the settings from the configfile and sets the right properties. */
+void BibleTime::readSettings(){
+ applyMainWindowSettings(KGlobal::config(), QString::fromLatin1("MainWindow"));
+
+ m_keyAccel->readSettings(KGlobal::config());
+
+ m_viewToolbar_action->setChecked( CBTConfig::get(CBTConfig::toolbar) );
+ slotToggleToolbar();
+
+ m_viewGroupManager_action->setChecked( CBTConfig::get(CBTConfig::mainIndex) );
+ slotToggleGroupManager();
+
+ m_splitter->setSizes( CBTConfig::get(CBTConfig::splitterSizes) );
+
+ if ( CBTConfig::get(CBTConfig::autoTile) ) {
+ m_windowAutoTile_action->setChecked( true );
+ m_windowAutoCascade_action->setChecked( false );
+ m_mdi->setGUIOption( CMDIArea::autoTile );
+ }
+ else if ( CBTConfig::get(CBTConfig::autoCascade) ) {
+ m_windowAutoCascade_action->setChecked(true);
+ m_windowAutoTile_action->setChecked(false);
+ m_mdi->setGUIOption( CMDIArea::autoCascade );
+ }
+ else {
+ m_mdi->setGUIOption( CMDIArea::Nothing );
+ m_windowAutoTile_action->setChecked(false);
+ m_windowAutoCascade_action->setChecked(false);
+ }
+}
+
+/** Creates a new presenter in the MDI area according to the type of the module. */
+CSwordPresenter* BibleTime::createNewSwordPresenter(ListCSwordModuleInfo modules, const QString& key) {
+ kapp->setOverrideCursor( waitCursor );
+
+ CSwordPresenter* presenter = 0;
+ switch (modules.first()->type()) {
+ case CSwordModuleInfo::Bible:
+ presenter = new CBiblePresenter(modules, m_mdi);
+ break;
+ case CSwordModuleInfo::Commentary:
+ presenter = new CCommentaryPresenter(modules, m_mdi);
+ break;
+ case CSwordModuleInfo::Lexicon:
+ presenter = new CLexiconPresenter(modules, m_mdi);
+ break;
+ case CSwordModuleInfo::GenericBook:
+ presenter = new CBookPresenter(modules, m_mdi);
+ break;
+ default:
+ presenter = 0;
+ qWarning("unknown module type");
+ break;
+ }
+ if (presenter) {
+ connect(presenter, SIGNAL(lookupInLexicon(const QString&, const QString&)),
+ m_mdi, SLOT(lookupInLexicon(const QString&, const QString&)));
+ connect(presenter, SIGNAL(lookupInModule(const QString&, const QString&)),
+ m_mdi, SLOT(lookupInModule(const QString&, const QString&)));
+ connect(presenter, SIGNAL(closePresenter(CSwordPresenter*)),
+ m_mdi, SLOT(closePresenter(CSwordPresenter*)));
+ if (presenter->isA("CBiblePresenter")) {
+ connect(presenter->keyChooser(), SIGNAL(keyChanged(CSwordKey*)),
+ m_mdi, SLOT(syncCommentaries(CSwordKey*)));
+ }
+ presenter->lookup(modules.first()->name(),key);
+ }
+
+ kapp->restoreOverrideCursor();
+ presenter->setFocus();
+
+ return presenter;
+}
+
+
+/** Creates a new presenter in the MDI area according to the type of the module. */
+CSwordPresenter* BibleTime::createNewSwordPresenter(CSwordModuleInfo* module, const QString& key) {
+ ListCSwordModuleInfo list;
+ list.append(module);
+
+ return createNewSwordPresenter(list, key);
+}
+
+/** Refreshes all presenters.*/
+void BibleTime::refreshPresenters() {
+ unsigned int index;
+ for ( index = 0; index < m_mdi->windowList().count(); index++) {
+ CSwordPresenter* myPresenter = dynamic_cast<CSwordPresenter*>(m_mdi->windowList().at(index));
+ if (myPresenter)
+ myPresenter->refresh();
+ }
+}
+
+/** Called before quit. */
+bool BibleTime::queryExit(){
+ if (!m_initialized)
+ return false;
+ saveSettings();
+ return true;
+}
+
+/** Called before a window is closed */
+bool BibleTime::queryClose(){
+ bool ret = true;
+ for ( unsigned int index = 0; index < m_mdi->windowList().count(); ++index) {
+ if (CSwordPresenter* myPresenter = dynamic_cast<CSwordPresenter*>(m_mdi->windowList().at(index)))
+ ret = myPresenter->queryClose() && ret;
+ }
+ return ret;
+}
+
+/** No descriptions */
+void BibleTime::show(){
+ KMainWindow::show();
+ //if we show BibleTime for the first time we are ready for processing
+ //but not before this point.
+ m_initialized = true;
+}
+
+/** Reimplementation used for sessions management. */
+void BibleTime::saveProperties(KConfig* /*myConfig*/){
+
+}
+
+/** Reimplementation used for session management. */
+void BibleTime::readProperties(KConfig* /*myConfig*/){
+
+}
+
+/** Restores the workspace if the flag for this is set in the config. */
+void BibleTime::restoreWorkspace(){
+ if (CProfile* p = m_profileMgr.startupProfile())
+ loadProfile(p);
+}
+
+/** Sets the caption of the mainwindow */
+void BibleTime::setCaption( const QString& ){
+ KMainWindow::setPlainCaption( KApplication::kApplication()->makeStdCaption( m_mdi->currentApplicationCaption() ) );
+}
+
+/** Sets the plain caption of the main window */
+void BibleTime::setPlainCaption( const QString& ){
+ KMainWindow::setPlainCaption( KApplication::kApplication()->makeStdCaption( m_mdi->currentApplicationCaption() ) );
+}
diff --git a/bibletime/bibletime.h b/bibletime/bibletime.h
new file mode 100644
index 0000000..27bc476
--- /dev/null
+++ b/bibletime/bibletime.h
@@ -0,0 +1,362 @@
+/***************************************************************************
+ bibletime.h - description
+ -------------------
+ begin : Mit Jan 19 12:57:15 CET 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+***************************************************************************/
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef BIBLETIME_H
+#define BIBLETIME_H
+
+//KDE includes
+#include <kapp.h>
+#include <ktmainwindow.h>
+
+//Frontend includes
+#include "frontend/cprofilemgr.h"
+
+//Backend includes
+#include "backend/cswordmoduleinfo.h"
+
+//forward class declarations
+
+//BT classes
+class CGroupManager;
+class CMDIArea;
+class CProfile;
+class CSwordPresenter;
+
+//KDE classes
+class KToggleAction;
+class KAccel;
+class KPopupMenu;
+class KAction;
+class KActionMenu;
+
+//QT classes
+class QPopupMenu;
+class QProgressDialog;
+class QSplitter;
+
+/**
+ * @page backend The structure of the backend
+ *
+ * The backend implementation for Sword is called CSwordBackend, the classes we use
+ * to work with keys are called CSwordVerseKey and CSwordLDKey, both are derived from
+ * the class CSwordKey.
+ * The CSwordKey derived classes used for Sword do also inherit the classes VerseKey (CSwordVerseKey)
+ * and SWKey (CSwordLDKey).
+ *
+ * The classes used to handle all module based stuff are derived from CModuleInfo.
+ * The module classes are: CSwordModuleInfo (for Sword modules), CSwordBibleModuleInfo (for bibles), CSwordCommentaryModuleInfo (for commentaries) and
+ * CSwordLexiconModuleInfo (for lexicons).
+ * Have a look at the class documentation of the mentioned classes to learn how the
+ * structure of them looks like and which class inherits which other class.
+ *
+ * The first objects which should be created in the application is the backend (for Sword the class is called CSwordBackend).
+ * Then create all the different module classes for the correct Sword modules. Have a look at
+ * BibleTime::initBackens() to see how it's done in BibleTime.@br
+ * Later you can work with them for example by using the CSwordKey and CSwordModuleInfo derived class.
+ */
+
+/**
+ * @page frontend The structure of the frontend
+ *
+ *
+ * The frontend contains the classes which interact with the user. For example the main index,
+ * the display windows, the searchdialog or the other parts.
+ * The main index is implemented in the class CGroupManager, the items of the main index are implemented in the class CGroupManagerItem.
+ * Each CGroupManagerItem has a type() function which returns the type of the object (Module, Bookmark or Group).<BR>
+ * The display windows are all derived from the base class CPresenter. The display windows which handle Sword modules are all derived from the CSwordPresenter class.
+ * The display windows which provide functionality are CBiblePresenter for Bibles, CCommentaryPresenter for commentaries and CLexiconPresenter for lexicon and dictionaries.
+ * CSwordPresenter provides the essential base functions which are reimplemented in the derived classes (for example CSwordPresenter::lookup).<BR>
+ * Another important part of the frontend are the keychoosers. They provide an interface to choose a key of a module. The interface for different module types is different.
+ * The base class is CKeyChooser which is the factory for the derived classes. Use the function CKeyChooser::createInstance to get the correct
+ * keychooser implementation for the desired module.<BR>
+ */
+
+/** @mainpage BibleTime - sourcecode documentation
+ *
+ * This is the sourcecode documentation of BibleTime, a Bible study tool for KDE/Linux.
+ * BibleTime is devided in two major parts, the backend and the frontend.<BR>
+ * Documentation for the backend: @ref backend<BR>
+ * Documentation for the frontend: @ref frontend.<BR>
+ */
+
+/** The main class of BibleTime. Here are the main widgets created.
+ *
+ * This is the main class of BibleTime! This class creates the GUI, the KAction objects
+ * and connects to some slots. Please insert the creation of actions in initActions,
+ * the creation of widgets into initView and the connect(...) calls into initConnections.
+ * Reading from a config file on creation time should go into readSettings(), saving into
+ * saveSettings().
+ * This is the general way of all BibleTime classes.
+ */
+class BibleTime : public KMainWindow {
+ friend class CMDIArea;
+ Q_OBJECT
+public:
+ /**
+ * construtor of BibleTime
+ */
+ BibleTime();
+ /**
+ * Destructor of BibleTime
+ */
+ virtual ~BibleTime();
+ virtual void show();
+ /**
+ * Reads the settings from the configfile and sets the right properties.
+ */
+ void readSettings();
+ /**
+ * Saves the settings of this class
+ */
+ void saveSettings();
+ /**
+ * Restores the workspace if the flaf for this is set in the config.
+ */
+ void restoreWorkspace();
+ /**
+ * Apply the settings given by the profile p
+ */
+ void applyProfileSettings( CProfile* p );
+ /**
+ * Stores the settings of the mainwindow in the profile p
+ */
+ void storeProfileSettings( CProfile* p );
+
+public slots:
+ /**
+ * Shows the daily tip
+ */
+ void slotHelpTipOfDay();
+ /**
+ * Opens the optionsdialog of BibleTime.
+ */
+ void slotSettingsOptions();
+ /**
+ * The last window was closed!
+ */
+ void lastWindowClosed();
+ /**
+ * Opens the handbook.
+ */
+ void openOnlineHelp_Handbook();
+ /**
+ * Opens the installation instructions.
+ */
+ void openOnlineHelp_Install();
+ /**
+ * Opens the bible study howto.
+ */
+ void openOnlineHelp_Howto();
+ /**
+ * Sets the plain caption of the main window
+ */
+ virtual void setPlainCaption( const QString& );
+ /**
+ * Sets the caption of the mainwindow
+ */
+ virtual void setCaption(const QString&);
+
+protected: // Protected methods
+ /**
+ * Initializes the view of this widget
+ */
+ void initView();
+ /**
+ * Initializes the menubar of BibleTime.
+ */
+ void initMenubar();
+ /**
+ * Initializes the SIGNAL / SLOT connections
+ */
+ void initConnections();
+ /**
+ * Initializes the backend
+ */
+ void initBackends();
+ /**
+ * Initializes the action objects of the GUI
+ */
+ void initActions();
+ /**
+ * Refreshes all presenter supporting at least in of the features given as parameter.
+ */
+ void refreshPresenters();
+ /**
+ * Called before a window is closed
+ */
+ bool queryClose();
+ /**
+ * Called before quit.
+ */
+ bool queryExit();
+ /**
+ * Initializes the CPrinter object.
+ */
+ void initPrinter();
+ /**
+ * Reimplementation used for session management.
+ */
+ void readProperties(KConfig* config);
+ /**
+ * Reimplementation used for sessions management.
+ */
+ void saveProperties(KConfig* myConfig);
+
+ QPopupMenu* m_windowMenu;
+ QPopupMenu* m_editMenu;
+
+ /** FILE menu actions */
+ KAction* m_fileClearQueue_action;
+ KAction* m_filePrint_action;
+
+ /** VIEW menu actions */
+ KToggleAction* m_viewToolbar_action;
+ KToggleAction* m_viewGroupManager_action;
+
+ /** WINDOW menu actions */
+ KAction* m_windowCascade_action;
+ KAction* m_windowTile_action;
+ KToggleAction* m_windowAutoCascade_action;
+ KToggleAction* m_windowAutoTile_action;
+ KAction* m_windowCloseAll_action;
+
+ KActionMenu* m_windowSaveProfile_action;
+ KActionMenu* m_windowLoadProfile_action;
+ KAction* m_windowEditProfiles_action;
+ KToggleAction* m_windowFullscreen_action;
+
+ KHelpMenu* m_helpMenu;
+
+ KAccel* m_keyAccel;
+ QSplitter* m_splitter;
+ CGroupManager* m_groupmanager;
+ CMDIArea* m_mdi;
+
+ /**
+ * The list of installed SWORD modules
+ */
+ ListCSwordModuleInfo* m_moduleList;
+ CProfile* m_currentProfile;
+
+ bool m_initialized;
+
+protected slots:
+ /**
+ * Quit BibleTime
+ */
+ void slotFileQuit();
+ /**
+ * Creates a new presenter in the MDI area according to the type of the module.
+ */
+ CSwordPresenter*
+ createNewSwordPresenter(ListCSwordModuleInfo, const QString&);
+
+ /**
+ * No descriptions
+ */
+ CSwordPresenter* createNewSwordPresenter(CSwordModuleInfo*, const QString&);
+ /**
+ * Is called when the window menu is about to show ;-)
+ */
+ void slotWindowMenuAboutToShow();
+ /**
+ * This slot is connected with the windowAutoTile_action object
+ */
+ void slotAutoTile();
+ /**
+ * This slot is connected with the windowAutoCascade_action object
+ */
+ void slotAutoCascade();
+ /**
+ * Is called when a client was selected in the window menu
+ */
+ void slotWindowMenuActivated( int );
+ /**
+ * Shows/hides the toolbar
+ */
+ void slotToggleToolbar();
+ /**
+ * Opens a toolbar editor
+ */
+ void slotSettingsToolbar();
+ /**
+ * Shows or hides the groupmanager.
+ */
+ void slotToggleGroupManager();
+ /**
+ * Starts printing and opens the printerdialog at first.
+ */
+ void slotFilePrint();
+ /**
+ * Enables the "Clear printer queue" action
+ */
+ void slotSetPrintingStatus();
+ /**
+ * Saves to the profile with the menu id ID
+ */
+ void saveProfile(int ID);
+ /**
+ * Saves the current settings into the currently activatred profile.
+ */
+ void saveProfile(CProfile* p);
+ /**
+ * Saves the current settings into the currently activatred profile.
+ */
+ void editProfiles();
+ /**
+ * Loads the profile with the menu id ID
+ */
+ void loadProfile(int ID);
+ /**
+ * Loads the profile with the menu ID id
+ */
+ void loadProfile(CProfile* p);
+ /**
+ * Toggles between normal and fullscreen mode.
+ */
+ void toggleFullscreen();
+ /**
+ * Is called when settings in the optionsdialog have been
+ * changed (ok or apply)
+ */
+ void slotSettingsChanged();
+
+private slots: // Private slots
+ /**
+ * No descriptions
+ */
+ void slotPrintedPercent(const int index);
+ /**
+ * Printing was finished
+ */
+ void slotPrintingFinished();
+ /**
+ * Aborts the printing
+ */
+ void slotAbortPrinting();
+ /**
+ * Printing was started
+ */
+ void slotPrintingStarted();
+
+private:
+ QProgressDialog* m_progress;
+ CProfileMgr m_profileMgr;
+ CSwordBackend* m_backend;
+ CPrinter* m_printer;
+};
+
+#endif
diff --git a/bibletime/bibletime_init.cpp b/bibletime/bibletime_init.cpp
new file mode 100644
index 0000000..e2f4beb
--- /dev/null
+++ b/bibletime/bibletime_init.cpp
@@ -0,0 +1,365 @@
+/***************************************************************************
+ bibletime_init.cpp - functions to initialize BibleTime on startup
+ -------------------
+ begin : Wed Jan 19 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+#include "printing/cprinter.h"
+#include "frontend/cmdiarea.h"
+#include "frontend/kstartuplogo.h"
+#include "frontend/groupmanager/cgroupmanager.h"
+#include "bibletime.h"
+#include "resource.h"
+#include "frontend/chtmldialog.h"
+#include "frontend/cprofilemgr.h"
+#include "frontend/cprofile.h"
+#include "backend/cswordbackend.h"
+#include "whatsthisdef.h"
+#include "config.h"
+#include "frontend/cbtconfig.h"
+
+
+#include <stdlib.h>
+
+//QT includes
+#include <qpopupmenu.h>
+#include <qsplitter.h>
+#include <qguardedptr.h>
+#include <qlistview.h>
+
+//KDE includes
+#include <kaboutdata.h>
+#include <kconfigbase.h>
+#include <ktoolbar.h>
+#include <kiconloader.h>
+#include <kstddirs.h>
+#include <kstdaction.h>
+#include <kmenubar.h>
+#include <kaccel.h>
+#include <klocale.h>
+#include <kaction.h>
+#include <khelpmenu.h>
+#include <kglobal.h>
+#include <kpopupmenu.h>
+
+/**Initializes the view of this widget*/
+void BibleTime::initView(){
+ KStartupLogo::setStatusMessage(i18n("Creating BibleTime's GUI") + QString::fromLatin1("..."));
+
+ m_splitter = new QSplitter(this, "mainsplitter");
+
+ m_groupmanager = new CGroupManager( m_splitter, "groupmanager", m_moduleList );
+ m_groupmanager->setFocusPolicy(ClickFocus);
+
+ m_mdi = new CMDIArea(m_splitter, "mdiarea" );
+ m_mdi->setFocusPolicy(ClickFocus);
+
+ m_helpMenu = new KHelpMenu(this, KGlobal::instance()->aboutData(), true, actionCollection());
+
+ setCentralWidget(m_splitter);
+}
+
+
+/** Initializes the action objects of the GUI */
+void BibleTime::initActions() {
+ KStartupLogo::setStatusMessage(i18n("Initializing menu- and toolbars") + QString::fromLatin1("..."));
+
+ KAction* action = 0;
+
+ m_fileClearQueue_action = new KAction(i18n("Clear printing queue"), ICON_FILE_CLEAR_QUEUE ,0,
+ m_printer, SLOT(clearQueue()), actionCollection(), "fileClearQueue_action");
+ m_fileClearQueue_action->setEnabled(false);
+ m_fileClearQueue_action->setToolTip( TT_FILE_CLEAR_QUEUE );
+ m_fileClearQueue_action->setWhatsThis( WT_FILE_CLEAR_QUEUE );
+ m_fileClearQueue_action->plugAccel( m_keyAccel );
+
+ m_filePrint_action = KStdAction::print(this, SLOT( slotFilePrint() ), actionCollection());
+ m_filePrint_action->setEnabled(false);
+ m_filePrint_action->setToolTip( TT_FILE_PRINT );
+ m_filePrint_action->setWhatsThis( WT_FILE_PRINT );
+ m_filePrint_action->plugAccel( m_keyAccel );
+
+ action = KStdAction::quit(this, SLOT( slotFileQuit() ), actionCollection());
+ action->setToolTip( TT_FILE_QUIT );
+ action->setWhatsThis( WT_FILE_QUIT );
+ action->plugAccel( m_keyAccel );
+
+ action = new KAction(i18n("Reset main index"), ICON_MAININDEX_RESET, IDK_GM_RESET,
+ m_groupmanager, SLOT(slotReset()), actionCollection(), "GMreset_action");
+ action->setToolTip( TT_GM_RESET );
+ action->setWhatsThis( WT_GM_RESET );
+ action->plugAccel( m_keyAccel );
+
+ action = new KAction(i18n("Search in module(s)"), ICON_MAININDEX_SEARCH, IDK_GM_MODULES_SEARCH,
+ m_groupmanager, SLOT(slotSearchSelectedModules()), actionCollection(), "GMsearch_action");
+ action->setToolTip( TT_GM_SEARCH_MODULES );
+ action->setWhatsThis( WT_GM_SEARCH_MODULES );
+ action->plugAccel( m_keyAccel );
+
+ action = new KAction(i18n("Remove selected item(s)"),ICON_MAININDEX_DELETE_ITEMS, IDK_GM_ITEMS_DELETE,
+ m_groupmanager, SLOT(slotDeleteSelectedItems()), actionCollection(), "GMdelete_action");
+ action->setToolTip( TT_GM_DELETE_ITEMS );
+ action->setWhatsThis( WT_GM_DELETE_ITEMS );
+ action->plugAccel( m_keyAccel );
+
+ m_viewToolbar_action = KStdAction::showToolbar(this, SLOT( slotToggleToolbar() ), actionCollection());
+ m_viewToolbar_action->setToolTip( TT_VIEW_TOOLBAR );
+ m_viewToolbar_action->setWhatsThis( WT_VIEW_TOOLBAR );
+ m_viewToolbar_action->plugAccel( m_keyAccel );
+
+ m_viewGroupManager_action = new KToggleAction(i18n("&Show main index"), ICON_VIEW_MAININDEX, IDK_VIEW_GROUPMANAGER,
+ this, SLOT(slotToggleGroupManager()), actionCollection(), "viewGroupManager_action");
+ m_viewGroupManager_action->setToolTip( TT_VIEW_GROUPMANAGER );
+ m_viewGroupManager_action->setWhatsThis( WT_VIEW_GROUPMANAGER );
+
+ action = KStdAction::preferences(this, SLOT( slotSettingsOptions() ), actionCollection());
+ action->setToolTip( TT_SETTINGS_OPTIONS );
+ action->setWhatsThis( WT_SETTINGS_OPTIONS );
+ action->plugAccel( m_keyAccel );
+
+ action = KStdAction::configureToolbars(this, SLOT( slotSettingsToolbar() ), actionCollection());
+ action->setToolTip( TT_SETTINGS_EDIT_TOOLBAR );
+ action->setWhatsThis( WT_SETTINGS_EDIT_TOOLBAR );
+ action->plugAccel( m_keyAccel );
+
+ m_windowCascade_action = new KAction(i18n("&Cascade"), ICON_WINDOW_CASCADE, IDK_WINDOW_CASCADE,
+ m_mdi, SLOT(cascade()), actionCollection(), "windowCascade_action");
+ m_windowCascade_action->setToolTip( TT_WINDOW_CASCADE );
+ m_windowCascade_action->setWhatsThis( WT_WINDOW_CASCADE );
+ m_windowCascade_action->plugAccel( m_keyAccel);
+
+ m_windowTile_action = new KAction(i18n("&Tile"), ICON_WINDOW_TILE,
+ IDK_WINDOW_TILE, m_mdi, SLOT(tile()), actionCollection(), "windowTile_action");
+ m_windowTile_action->setToolTip( TT_WINDOW_TILE );
+ m_windowTile_action->setWhatsThis( WT_WINDOW_TILE );
+ m_windowTile_action->plugAccel( m_keyAccel );
+
+ m_windowAutoCascade_action = new KToggleAction(i18n("&Auto cascade"), ICON_WINDOW_CASCADE_AUTO,
+ IDK_WINDOW_AUTO_CASCADE, this, SLOT(slotAutoCascade()), actionCollection(), "windowAutoCascade_action");
+ m_windowAutoCascade_action->setToolTip( TT_WINDOW_AUTO_CASCADE );
+ m_windowAutoCascade_action->setWhatsThis( WT_WINDOW_AUTO_CASCADE );
+ m_windowAutoCascade_action->plugAccel( m_keyAccel );
+
+ m_windowAutoTile_action = new KToggleAction(i18n("A&uto Tile"),ICON_WINDOW_TILE_AUTO,
+ IDK_WINDOW_AUTO_TILE, this, SLOT(slotAutoTile()), actionCollection(), "windowAutoTile_action");
+ m_windowAutoTile_action->setToolTip( TT_WINDOW_AUTO_TILE );
+ m_windowAutoTile_action->setWhatsThis( WT_WINDOW_AUTO_TILE );
+ m_windowAutoTile_action->plugAccel( m_keyAccel );
+
+ m_windowCloseAll_action = new KAction(i18n("&Close all"), ICON_WINDOW_CLOSE_ALL,
+ IDK_WINDOW_CLOSE_ALL, m_mdi, SLOT(deleteAll()), actionCollection(),"windowCloseAll_action");
+ m_windowCloseAll_action->setToolTip( TT_WINDOW_CLOSE_ALL );
+ m_windowCloseAll_action->setWhatsThis( WT_WINDOW_CLOSE_ALL );
+ m_windowCloseAll_action->plugAccel( m_keyAccel );
+
+ m_windowSaveProfile_action = new KActionMenu(i18n("&Save profile"), ICON_WINDOW_SAVE_PROFILE, actionCollection(),"windowSaveProfile_action");
+ m_windowSaveProfile_action->setToolTip( TT_WINDOW_SAVE_PROFILE );
+ m_windowSaveProfile_action->setWhatsThis( WT_WINDOW_SAVE_PROFILE );
+ m_windowSaveProfile_action->plugAccel( m_keyAccel );
+
+ m_windowLoadProfile_action = new KActionMenu(i18n("&Load profile"), ICON_WINDOW_SAVE_PROFILE, actionCollection(),"windowLoadProfile_action");
+ m_windowLoadProfile_action->setToolTip( TT_WINDOW_SAVE_PROFILE );
+ m_windowLoadProfile_action->setWhatsThis( WT_WINDOW_SAVE_PROFILE );
+ m_windowLoadProfile_action->plugAccel( m_keyAccel );
+
+ m_windowEditProfiles_action = new KAction(i18n("&Configure profiles"), ICON_WINDOW_EDIT_PROFILES,
+ IDK_WINDOW_EDIT_PROFILES, this, SLOT(editProfiles()), actionCollection(),"windowEditProfiles_action");
+ m_windowEditProfiles_action->setToolTip( TT_WINDOW_SAVE_PROFILE );
+ m_windowEditProfiles_action->setWhatsThis( WT_WINDOW_SAVE_PROFILE );
+ m_windowEditProfiles_action->plugAccel( m_keyAccel );
+
+ m_windowFullscreen_action = new KToggleAction(i18n("&Fullscreen mode"), ICON_WINDOW_FULLSCREEN,
+ IDK_WINDOW_FULLSCREEN, this, SLOT(toggleFullscreen()), actionCollection(),"windowFullscreen_action");
+ m_windowFullscreen_action->setToolTip( TT_WINDOW_FULLSCREEN );
+ m_windowFullscreen_action->setWhatsThis( WT_WINDOW_FULLSCREEN );
+ m_windowFullscreen_action->plugAccel( m_keyAccel );
+
+ QList<CProfile> profiles = m_profileMgr.profiles();
+ KPopupMenu* loadPopup = m_windowLoadProfile_action->popupMenu();
+ KPopupMenu* savePopup = m_windowSaveProfile_action->popupMenu();
+ connect(loadPopup, SIGNAL(activated(int)), SLOT(loadProfile(int)));
+ connect(savePopup, SIGNAL(activated(int)), SLOT(saveProfile(int)));
+ for (CProfile* p = profiles.first(); p; p = profiles.next()) {
+ savePopup->insertItem(p->name());
+ loadPopup->insertItem(p->name());
+ }
+
+ if ( actionCollection()->action("help_contents") ) //delete help action if KDE created it
+ actionCollection()->remove(actionCollection()->action("help_contents"));
+
+ action = new KAction(i18n("&Handbook"), ICON_HELP_CONTENTS, 0, this,
+ SLOT(openOnlineHelp_Handbook()), actionCollection(), "help_handbook");
+ action->setToolTip( TT_HELP_HANDBOOK );
+ action->setWhatsThis( WT_HELP_HANDBOOK );
+ action->plugAccel( m_keyAccel );
+
+ action = new KAction(i18n("&Installation"), ICON_HELP_CONTENTS, 0, this,
+ SLOT(openOnlineHelp_Install()), actionCollection(), "help_install");
+ action->setToolTip( TT_HELP_INSTALLATION );
+ action->setWhatsThis( WT_HELP_INSTALLATION );
+ action->plugAccel( m_keyAccel );
+
+ action = new KAction(i18n("&Bible Study Howto"), ICON_HELP_CONTENTS, 0, this,
+ SLOT(openOnlineHelp_Howto()), actionCollection(), "help_howto");
+ action->setToolTip( TT_HELP_BIBLESTUDY );
+ action->setWhatsThis( WT_HELP_BIBLESTUDY );
+ action->plugAccel( m_keyAccel );
+
+ action = KStdAction::whatsThis(this, SLOT(whatsThis()), actionCollection());
+ action->setToolTip(TT_HELP_WHATSTHIS);
+ action->setWhatsThis(WT_HELP_WHATSTHIS);
+
+ action = KStdAction::reportBug(m_helpMenu, SLOT(reportBug()), actionCollection());
+ action->setToolTip(TT_HELP_BUGREPORT);
+ action->setWhatsThis(WT_HELP_BUGREPORT);
+ action->setIcon(ICON_BUG_REPORT);
+
+ action = new KAction(i18n("&Daily tip"), ICON_HELP_DAILY_TIP, IDK_HELP_DAILY_TIP, this,
+ SLOT(slotHelpTipOfDay()), actionCollection(), "helpDailyTip_action");
+ action->setToolTip(TT_HELP_DAILY_TIP);
+ action->setWhatsThis(WT_HELP_DAILY_TIP);
+
+ action = KStdAction::aboutApp(m_helpMenu, SLOT(aboutApplication()), actionCollection());
+ action->setToolTip(TT_HELP_ABOUT);
+ action->setWhatsThis(WT_HELP_ABOUT);
+
+ //delete About KDE action if KDE created it already
+ if ( actionCollection()->action("help_about_kde") ) //delete About KDE action if KDE created it
+ actionCollection()->remove(actionCollection()->action("help_about_kde"));
+ action = KStdAction::aboutKDE(m_helpMenu, SLOT(aboutKDE()), actionCollection());
+ action->setToolTip(TT_HELP_ABOUT_KDE);
+ action->setWhatsThis(WT_HELP_ABOUT_KDE);
+}
+
+/** Initializes the menubar of BibleTime. */
+void BibleTime::initMenubar(){
+ //get the window and edit menus using the actions and their properties
+ m_windowMenu = dynamic_cast<QPopupMenu*>(m_windowTile_action->container(0));
+}
+
+/** Initializes the SIGNAL / SLOT connections */
+void BibleTime::initConnections(){
+ connect(m_mdi, SIGNAL(sigSetToplevelCaption(const QString&)),
+ this, SLOT(setPlainCaption(const QString&)));
+ connect(m_mdi, SIGNAL(createNewSwordPresenter(CSwordModuleInfo*, const QString&)),
+ this, SLOT(createNewSwordPresenter(CSwordModuleInfo*, const QString&)));
+
+ if (m_windowMenu) {
+ connect(m_windowMenu, SIGNAL(aboutToShow()),
+ this, SLOT(slotWindowMenuAboutToShow()));
+ connect(m_windowMenu, SIGNAL(activated(int)),
+ this, SLOT(slotWindowMenuActivated(int)));
+ }
+ else
+ qWarning("can't find window menu");
+
+ connect(m_groupmanager, SIGNAL(createSwordPresenter(CSwordModuleInfo*, const QString&)),
+ this, SLOT(createNewSwordPresenter(CSwordModuleInfo*,const QString&)));
+ connect(m_groupmanager, SIGNAL(createSwordPresenter(ListCSwordModuleInfo, const QString&)),
+ this, SLOT(createNewSwordPresenter(ListCSwordModuleInfo,const QString&)));
+
+ //connect to the signals of the printer object
+ connect(m_printer, SIGNAL(addedFirstQueueItem()),
+ this, SLOT(slotSetPrintingStatus()));
+ connect(m_printer, SIGNAL(printingStarted()),
+ this, SLOT(slotPrintingStarted()));
+ connect(m_printer, SIGNAL(printingFinished()),
+ this, SLOT(slotSetPrintingStatus()));
+ connect(m_printer, SIGNAL(printingFinished()),
+ this, SLOT(slotPrintingFinished()));
+ connect(m_printer, SIGNAL(printingInterrupted()),
+ this, SLOT(slotSetPrintingStatus()));
+ connect(m_printer, SIGNAL(printingInterrupted()),
+ this, SLOT(slotPrintingFinished()));
+ connect(m_printer, SIGNAL(queueCleared()),
+ this, SLOT(slotSetPrintingStatus()));
+ connect(m_printer, SIGNAL(percentCompleted(const int)),
+ this, SLOT(slotPrintedPercent(const int)));
+}
+
+/** Initializes the backend */
+void BibleTime::initBackends(){
+ KStartupLogo::setStatusMessage(i18n("Initializing Sword")+QString::fromLatin1("..."));
+
+ m_backend = new CSwordBackend();
+ CPointers::setBackend(m_backend);
+ const CSwordBackend::LoadError errorCode = m_backend->initModules();
+// qWarning("ErrorCode = %i", errorCode);
+
+ m_moduleList = 0;
+ if ( errorCode == CSwordBackend::NoError ) { //no error
+ m_moduleList = &(m_backend->moduleList());
+ } else {
+ m_moduleList = 0;
+ //show error message that initBackend failed
+ switch (errorCode) {
+ case CSwordBackend::NoSwordConfig: //mods.d or mods.conf missing
+ {
+ KStartupLogo::hideSplash();
+ CHTMLDialog dlg(HELPDIALOG_NO_SWORD_MODULE_CONFIG_DIR);
+ dlg.exec();
+ KStartupLogo::showSplash();
+ break;
+ }
+
+ case CSwordBackend::NoModules: //no modules installed, but config exists
+ {
+ KStartupLogo::hideSplash();
+ CHTMLDialog dlg(HELPDIALOG_NO_SWORD_MODULES);
+ dlg.exec();
+ KStartupLogo::showSplash();
+ break;
+ }
+
+ default: //unknown error
+ {
+ KStartupLogo::hideSplash();
+ CHTMLDialog dlg(HELPDIALOG_INITBACKEND_FAILED);
+ dlg.exec();
+ KStartupLogo::showSplash();
+ break;
+ }
+ }
+ }
+ m_backend->booknameLanguage( CBTConfig::get(CBTConfig::language) );
+}
+
+/** Initializes the CPrinter object. */
+void BibleTime::initPrinter() {
+ KStartupLogo::setStatusMessage(i18n("Initializing printing system") + QString::fromLatin1("..."));
+ CPointers::setPrinter( (m_printer = new CPrinter(this)) );
+}
+
+/** Apply the settings given by the profile p*/
+void BibleTime::applyProfileSettings( CProfile* p ){
+ if (!p)
+ return;
+
+ if (p->fullscreen()) { //we can set only fullscreen OR geometry
+ m_windowFullscreen_action->setChecked( true );
+ toggleFullscreen();
+ }
+ else {
+ setGeometry( p->geometry() );
+ m_windowFullscreen_action->setChecked( false );
+ toggleFullscreen();
+ }
+}
+
+/** Stores the settings of the mainwindow in the profile p */
+void BibleTime::storeProfileSettings( CProfile* p ){
+ p->setFullscreen(m_windowFullscreen_action->isChecked());
+ p->setGeometry(geometry());
+}
diff --git a/bibletime/bibletime_slots.cpp b/bibletime/bibletime_slots.cpp
new file mode 100644
index 0000000..a289364
--- /dev/null
+++ b/bibletime/bibletime_slots.cpp
@@ -0,0 +1,429 @@
+/***************************************************************************
+ bibletime_slots.cpp - description
+ -------------------
+ begin : Wed Jan 19 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//own includes
+#include "bibletime.h"
+#include "resource.h"
+#include "frontend/ctoolclass.h"
+//#include "frontend/ctipwindow.h"
+#include "frontend/cmdiarea.h"
+#include "frontend/cprofilemgr.h"
+#include "frontend/cprofile.h"
+#include "frontend/cprofilewindow.h"
+#include "backend/cswordversekey.h"
+#include "backend/chtmlentrydisplay.h"
+#include "backend/chtmlchapterdisplay.h"
+#include "printing/cprinter.h"
+#include "frontend/chtmldialog.h"
+#include "frontend/presenters/cswordpresenter.h"
+#include "frontend/groupmanager/cgroupmanager.h"
+#include "frontend/coptionsdialog.h"
+#include "frontend/cbtconfig.h"
+#include "config.h"
+
+#include <errno.h>
+
+//QT includes
+#include <qprogressdialog.h>
+#include <qlistview.h>
+#include <qwhatsthis.h>
+#include <qvaluelist.h>
+#include <qclipboard.h>
+#include <qxembed.h>
+
+//KDE includes
+#include <kaction.h>
+#include <kaboutkde.h>
+#include <kaboutdialog.h>
+#include <kbugreport.h>
+#include <kaboutapplication.h>
+#include <kstddirs.h>
+#include <kmenubar.h>
+#include <kaboutdata.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kedittoolbar.h>
+#include <kpopupmenu.h>
+#include <khelpmenu.h>
+#include <ktip.h>
+
+//Sword includes
+#include <versekey.h>
+
+/** Closes the current apploication window */
+void BibleTime::slotFileQuit(){
+ saveSettings();
+ // close the first window, the list makes the next one the first again.
+ // This ensures that queryClose() is called on each window to ask for closing
+
+ KMainWindow* w;
+ bool ok = true;
+
+ if(memberList){
+ for(w = memberList->first(); w && ok; w = memberList->first()){
+ // only close the window if the closeEvent is accepted. If the user presses Cancel on the saveModified() dialog,
+ // the window and the application stay open.
+ ok = w->close();
+ }
+ }
+ if (ok)
+ kapp->quit();
+}
+
+/** Opens the optionsdialog of BibleTime. */
+void BibleTime::slotSettingsOptions(){
+ COptionsDialog *dlg = new COptionsDialog(this, "COptionsDialog", m_keyAccel);
+ connect(dlg, SIGNAL(signalSettingsChanged()), SLOT(slotSettingsChanged()) );
+
+ dlg->exec();
+ dlg->delayedDestruct();
+}
+
+/** Is called when settings in the optionsdialog have been changed (ok or apply) */
+void BibleTime::slotSettingsChanged(){
+
+ const QString language = CBTConfig::get(CBTConfig::language);
+ m_backend->booknameLanguage(language);
+ //refresh the bookmark items in the groupmanager
+ QListViewItemIterator it( m_groupmanager );
+ CGroupManagerItem* item = 0;
+ for ( ; it.current(); ++it ) {
+ if ( (item = dynamic_cast<CGroupManagerItem*>(it.current())) ) {
+ if (item->type() == CGroupManagerItem::Bookmark) {
+ CSwordVerseKey* vKey = dynamic_cast<CSwordVerseKey*>(item->getBookmarkKey());
+ if ( vKey ) {
+ vKey->setLocale( (const char*)m_backend->booknameLanguage().local8Bit());
+ item->update();
+ }
+ }
+ }
+ }
+
+ for ( unsigned int index = 0; index < m_mdi->windowList().count(); index++) {
+ CSwordPresenter* myPresenter = dynamic_cast<CSwordPresenter*>(m_mdi->windowList().at(index));
+ if (myPresenter)
+ myPresenter->refresh();
+ }
+
+ //refresh the load profile and save profile menus
+ m_profileMgr.refresh();
+ KPopupMenu* savePopup = m_windowSaveProfile_action->popupMenu();
+ KPopupMenu* loadPopup = m_windowLoadProfile_action->popupMenu();
+ savePopup->clear();
+ loadPopup->clear();
+ QList<CProfile> profiles = m_profileMgr.profiles();
+ for (CProfile* p = profiles.first(); p; p = profiles.next()) {
+ savePopup->insertItem(p->name());
+ loadPopup->insertItem(p->name());
+ }
+}
+
+
+/** Shows the daily tip */
+void BibleTime::slotHelpTipOfDay(){
+ KTipDialog::setShowOnStart( CBTConfig::get(CBTConfig::tips) );
+ KTipDialog::showTip(this, "bibletime/tips", true);
+// CTipWindow* tipDlg = new CTipWindow();
+// tipDlg->exec();
+// delete tipDlg;
+}
+
+
+/** Is called just before the window menu is ahown. */
+void BibleTime::slotWindowMenuAboutToShow(){
+ if (!m_windowMenu)
+ return;
+
+ if ( m_windowSaveProfile_action->isPlugged() )
+ m_windowSaveProfile_action->unplug(m_windowMenu);
+ if ( m_windowLoadProfile_action->isPlugged() )
+ m_windowLoadProfile_action->unplug(m_windowMenu);
+ if ( m_windowEditProfiles_action->isPlugged() )
+ m_windowEditProfiles_action->unplug(m_windowMenu);
+ if ( m_windowFullscreen_action->isPlugged() )
+ m_windowFullscreen_action->unplug(m_windowMenu);
+
+ if ( m_windowCascade_action->isPlugged() )
+ m_windowCascade_action->unplug(m_windowMenu);
+ if ( m_windowTile_action->isPlugged() )
+ m_windowTile_action->unplug(m_windowMenu);
+ if ( m_windowAutoCascade_action->isPlugged() )
+ m_windowAutoCascade_action->unplug(m_windowMenu);
+ if ( m_windowAutoTile_action->isPlugged() )
+ m_windowAutoTile_action->unplug(m_windowMenu);
+ if ( m_windowCloseAll_action->isPlugged() )
+ m_windowAutoTile_action->unplug(m_windowMenu);
+
+ m_windowMenu->clear();
+
+ m_windowSaveProfile_action->plug(m_windowMenu);
+ m_windowLoadProfile_action->plug(m_windowMenu);
+ m_windowEditProfiles_action->plug(m_windowMenu);
+ m_windowMenu->insertSeparator();
+ m_windowFullscreen_action->plug(m_windowMenu);
+ m_windowMenu->insertSeparator();
+ m_windowCascade_action->plug(m_windowMenu);
+ m_windowTile_action->plug(m_windowMenu);
+ m_windowAutoCascade_action->plug(m_windowMenu);
+ m_windowAutoTile_action->plug(m_windowMenu);
+ m_windowCloseAll_action->plug(m_windowMenu);
+
+ if ( m_mdi->windowList().isEmpty() ) {
+ m_windowCascade_action->setEnabled(false);
+ m_windowTile_action->setEnabled(false);
+ m_windowCloseAll_action->setEnabled(false);
+ }
+ else if (m_mdi->windowList().count() == 1) {
+ m_windowTile_action->setEnabled( false );
+ m_windowCascade_action->setEnabled( false );
+ m_windowCloseAll_action->setEnabled( true );
+ m_windowMenu->insertSeparator();
+ } else {
+ m_windowTile_action->setEnabled( !m_windowAutoTile_action->isChecked() );
+ m_windowCascade_action->setEnabled( !m_windowAutoCascade_action->isChecked() );
+ m_windowCloseAll_action->setEnabled( true );
+ m_windowMenu->insertSeparator();
+ }
+
+ QWidgetList windows = m_mdi->windowList();
+ int i, id;
+ for ( i = 0; i < int(windows.count()); ++i ) {
+ id = m_windowMenu->insertItem(QString::fromLatin1("&%1 ").arg(i+1)+windows.at(i)->caption(),
+ this, SLOT( slotWindowMenuActivated( int ) ) );
+ m_windowMenu->setItemParameter( id, i );
+ m_windowMenu->setItemChecked( id, m_mdi->activeWindow() == windows.at(i) );
+ }
+}
+
+/** This slot is connected with the windowAutoTile_action object */
+void BibleTime::slotAutoTile(){
+ if (m_windowAutoTile_action->isChecked()) {
+ m_windowAutoCascade_action->setChecked(false);
+ m_mdi->setGUIOption( CMDIArea::autoTile );
+ }
+ else if (!m_windowAutoCascade_action->isChecked())
+ m_mdi->setGUIOption( CMDIArea::Nothing );
+}
+
+/** This slot is connected with the windowAutoCascade_action object */
+void BibleTime::slotAutoCascade(){
+ if (m_windowAutoCascade_action->isChecked()) {
+ m_windowAutoTile_action->setChecked(false);
+ m_mdi->setGUIOption( CMDIArea::autoCascade );
+ }
+ else if (!m_windowAutoTile_action->isChecked())
+ m_mdi->setGUIOption( CMDIArea::Nothing );
+}
+
+void BibleTime::slotWindowMenuActivated( int id ) {
+ if (!m_windowMenu)
+ return;
+
+// QString dummy;
+ QWidget* w = m_mdi->windowList().at( id );
+ if ( w )
+ w->setFocus();
+}
+
+
+/** Shows/hides the toolbar */
+void BibleTime::slotToggleToolbar(){
+ if (m_viewToolbar_action->isChecked())
+ toolBar("mainToolBar")->show();
+ else
+ toolBar("mainToolBar")->hide();
+}
+
+/** Shows or hides the groupmanager. */
+void BibleTime::slotToggleGroupManager() {
+ if (m_viewGroupManager_action->isChecked())
+ m_groupmanager->show();
+ else
+ m_groupmanager->hide();
+}
+
+/** Opens a toolbar editor */
+void BibleTime::slotSettingsToolbar(){
+ KEditToolbar dlg(actionCollection());
+ if (dlg.exec())
+ createGUI();
+}
+
+/** The last window was closed! */
+void BibleTime::lastWindowClosed(){
+}
+
+
+/** Opens the print dialog. */
+void BibleTime::slotFilePrint(){
+ m_printer->setup(this); //opens the printer dialog
+}
+
+/** Enables the "Clear printer queue" action */
+void BibleTime::slotSetPrintingStatus(){
+ const bool enable = (m_printer->printQueue().count()>0);
+ m_filePrint_action->setEnabled( enable );
+ m_fileClearQueue_action->setEnabled( enable );
+}
+
+/** Printing was started */
+void BibleTime::slotPrintingStarted(){
+ m_progress = new QProgressDialog(i18n("Printing..."), i18n("Abort printing"),100,this, "progress", true);
+ connect(m_progress, SIGNAL(cancelled()), SLOT(slotAbortPrinting()));
+ m_progress->setProgress(0);
+ m_progress->setMinimumDuration(0);
+ m_progress->show();
+}
+
+/** Printing was finished */
+void BibleTime::slotPrintingFinished(){
+ delete m_progress;
+ m_progress = 0;
+}
+
+/** No descriptions */
+void BibleTime::slotPrintedPercent( const int percent ){
+ if (m_progress)
+ m_progress->setProgress(percent);
+}
+
+/** Aborts the printing */
+void BibleTime::slotAbortPrinting(){
+ m_printer->abort();
+ if (m_progress)
+ slotPrintingFinished();
+}
+
+void BibleTime::openOnlineHelp_Handbook() {
+//#ifdef STATIC_BUILD
+// CHTMLDialog dlg("bibletime/handbook/index.html");
+// dlg.exec();
+//#else
+ if (m_helpMenu)
+// m_helpMenu->appHelpActivated();
+ kapp->invokeHTMLHelp("bibletime/handbook/index.html");
+//#endif
+}
+void BibleTime::openOnlineHelp_Install() {
+//#ifdef STATIC_BUILD
+// CHTMLDialog dlg("bibletime/install/index.html");
+// dlg.exec();
+//#else
+ kapp->invokeHTMLHelp("bibletime/install/index.html");
+//#endif
+}
+void BibleTime::openOnlineHelp_Howto() {
+//#ifdef STATIC_BUILD
+// CHTMLDialog dlg("bibletime/howto/index.html");
+// dlg.exec();
+//#else
+ kapp->invokeHTMLHelp("bibletime/howto/index.html");
+//#endif
+}
+
+/** Saves the current settings into the currently activatred profile. */
+void BibleTime::saveProfile(int ID){
+ m_mdi->setUpdatesEnabled(false);
+ KPopupMenu* popup = m_windowSaveProfile_action->popupMenu();
+ CProfile* p = m_profileMgr.profile( popup->text(ID) );
+ if (p)
+ saveProfile(p);
+
+ m_mdi->setUpdatesEnabled(true);
+}
+
+void BibleTime::saveProfile(CProfile* profile){
+ if (!profile)
+ return;
+
+ //save mainwindow settings
+ storeProfileSettings(profile);
+
+ QWidgetList windows = m_mdi->windowList();
+ QList<CProfileWindow> profileWindows;
+ for (QWidget* w = windows.first(); w; w = windows.next()) {
+ CSwordPresenter* displayWindow = dynamic_cast<CSwordPresenter*>(w);
+ if (!displayWindow)
+ continue;
+
+ CProfileWindow* profileWindow = new CProfileWindow();
+ displayWindow->storeSettings(profileWindow);
+ profileWindows.append(profileWindow);
+ }
+ profile->save(profileWindows);
+
+//clean up memory - delete all created profile windows
+ profileWindows.setAutoDelete(true);
+ profileWindows.clear();
+}
+
+void BibleTime::loadProfile(int ID){
+ m_mdi->setUpdatesEnabled(false);
+ m_mdi->deleteAll();
+
+ m_mdi->setUpdatesEnabled(false);
+ KPopupMenu* popup = m_windowLoadProfile_action->popupMenu();
+ CProfile* p = m_profileMgr.profile( popup->text(ID) );
+ if (p)
+ loadProfile(p);
+
+ m_mdi->setUpdatesEnabled(true);
+}
+
+void BibleTime::loadProfile(CProfile* p){
+ if (!p)
+ return;
+ QList<CProfileWindow> windows = p->load();
+
+ //load mainwindow setttings
+ applyProfileSettings(p);
+
+ for (CProfileWindow* w = windows.first(); w; w = windows.next()) {
+ const QString key = w->key();
+ QStringList usedModules = w->modules();
+ ListCSwordModuleInfo modules;
+ for ( QStringList::Iterator it = usedModules.begin(); it != usedModules.end(); ++it ) {
+ CSwordModuleInfo* m = m_backend->findModuleByName(*it);
+ if (m)
+ modules.append(m);
+ }
+ if (!modules.count()) //are the modules still installed?
+ continue;
+
+ if (CSwordPresenter* displayWindow = createNewSwordPresenter(modules, key)) {
+ displayWindow->applySettings(w);
+ }
+ }
+
+ m_mdi->setUpdatesEnabled(true);
+}
+
+void BibleTime::toggleFullscreen(){
+ if (m_windowFullscreen_action->isChecked())
+ showFullScreen();
+ else
+ showNormal();
+}
+
+void BibleTime::editProfiles(){
+ COptionsDialog *dlg = new COptionsDialog(this, "COptionsDialog", m_keyAccel);
+ connect(dlg, SIGNAL(signalSettingsChanged()), SLOT(slotSettingsChanged()) );
+ dlg->showPart(COptionsDialog::ViewProfiles);
+ dlg->exec();
+
+ dlg->delayedDestruct();
+}
diff --git a/bibletime/bt-printing b/bibletime/bt-printing
new file mode 100644
index 0000000..f7ccf57
--- /dev/null
+++ b/bibletime/bt-printing
@@ -0,0 +1,98 @@
+[Black&White__DESCRIPTION]
+Alignement=2
+BGColor=255,255,255
+FGColor=0,0,0
+Font=helvetica,9,5,0,50,0
+Identation=0
+has frame=false
+isEnabled=true
+[Black&White__HEADER]
+Alignement=1
+BGColor=0,0,0
+FGColor=255,255,255
+Font=helvetica,9,5,0,50,0
+Identation=0
+has frame=false
+isEnabled=true
+[Black&White__MODULETEXT]
+Alignement=0
+BGColor=255,255,255
+FGColor=0,0,0
+Font=helvetica,9,5,0,50,0
+Identation=0
+has frame=true
+isEnabled=true
+[Black&White__MODULETEXT__FRAME]
+Color=0,0,0
+Thickness=2
+[Rainbow__DESCRIPTION]
+Alignement=2
+BGColor=255,255,213
+FGColor=255,148,8
+Font=helvetica,9,5,0,50,0
+Identation=0
+has frame=false
+isEnabled=true
+[Rainbow__HEADER]
+Alignement=0
+BGColor=255,255,255
+FGColor=255,148,8
+Font=helvetica,9,5,0,50,0
+Identation=0
+has frame=true
+isEnabled=true
+[Rainbow__HEADER__FRAME]
+Color=42,156,213
+Thickness=1
+[Rainbow__MODULETEXT]
+Alignement=0
+BGColor=255,255,255
+FGColor=0,0,0
+Font=futura,13,5,0,50,0
+Identation=0
+has frame=true
+isEnabled=true
+[Rainbow__MODULETEXT__FRAME]
+Color=42,156,213
+Thickness=1
+[Settings]
+Filename=
+Paper size=0
+Printer=lp
+left margin=39
+lower margin=39
+preview application=gv
+right margin=39
+upper margin=39
+[Standard__DESCRIPTION]
+Alignement=24
+BGColor=255,255,255
+FGColor=0,0,0
+Font=helvetica,10,5,0,0,0
+Identation=0
+has frame=false
+isEnabled=true
+[Standard__HEADER]
+Alignement=2
+BGColor=255,255,255
+FGColor=0,0,192
+Font=futura,16,5,0,75,0
+Identation=8
+has frame=true
+isEnabled=true
+[Standard__HEADER__FRAME]
+Color=0,0,0
+Thickness=1
+[Standard__MODULETEXT]
+Alignement=0
+BGColor=220,220,220
+FGColor=0,0,0
+Font=arial,14,5,0,0,0
+Identation=0
+has frame=true
+isEnabled=true
+[Standard__MODULETEXT__FRAME]
+Color=128,128,128
+Thickness=1
+[Styles]
+styles=Standard,Black&White,Rainbow
diff --git a/bibletime/frontend/Makefile.am b/bibletime/frontend/Makefile.am
new file mode 100644
index 0000000..eb504bf
--- /dev/null
+++ b/bibletime/frontend/Makefile.am
@@ -0,0 +1,44 @@
+INCLUDES = $(all_includes)
+libfrontend_a_METASOURCES = AUTO
+noinst_LIBRARIES = libfrontend.a
+
+libfrontend_a_SOURCES = \
+chtmldialog.cpp \
+chtmlwidget.cpp \
+ctoolclass.cpp \
+cbtconfig.cpp \
+cinputdialog.cpp \
+coptionsdialog.cpp \
+cprofilemgr.cpp \
+cprofile.cpp \
+cprofilewindow.cpp \
+cexportmanager.cpp \
+cmdiarea.cpp \
+kstartuplogo.cpp \
+cpointers.cpp
+
+all_headers=cmdiarea.h \
+kstartuplogo.h \
+chtmlwidget.h \
+chtmldialog.h \
+ctoolclass.h \
+cbtconfig.h \
+cinputdialog.h \
+cprofilemgr.h \
+cprofile.h \
+cprofilewindow.h \
+cpointers.h \
+cexportmanager.h
+
+EXTRA_DIST = $(libfrontend_a_SOURCES) $(all_headers)
+
+SUBDIRS = \
+groupmanager \
+keychooser \
+presenters \
+searchdialog \
+thirdparty
+
+
+
+
diff --git a/bibletime/frontend/Makefile.in b/bibletime/frontend/Makefile.in
new file mode 100644
index 0000000..f212e71
--- /dev/null
+++ b/bibletime/frontend/Makefile.in
@@ -0,0 +1,720 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+INCLUDES = $(all_includes)
+#>- libfrontend_a_METASOURCES = AUTO
+noinst_LIBRARIES = libfrontend.a
+
+libfrontend_a_SOURCES = chtmldialog.cpp chtmlwidget.cpp ctoolclass.cpp cbtconfig.cpp cinputdialog.cpp coptionsdialog.cpp cprofilemgr.cpp cprofile.cpp cprofilewindow.cpp cexportmanager.cpp cmdiarea.cpp kstartuplogo.cpp cpointers.cpp
+
+
+all_headers = cmdiarea.h kstartuplogo.h chtmlwidget.h chtmldialog.h ctoolclass.h cbtconfig.h cinputdialog.h cprofilemgr.h cprofile.h cprofilewindow.h cpointers.h cexportmanager.h
+
+
+EXTRA_DIST = $(libfrontend_a_SOURCES) $(all_headers)
+
+SUBDIRS = groupmanager keychooser presenters searchdialog thirdparty
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I../..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libfrontend_a_LIBADD =
+#>- libfrontend_a_OBJECTS = chtmldialog.$(OBJEXT) chtmlwidget.$(OBJEXT) \
+#>- ctoolclass.$(OBJEXT) cbtconfig.$(OBJEXT) cinputdialog.$(OBJEXT) \
+#>- coptionsdialog.$(OBJEXT) cprofilemgr.$(OBJEXT) cprofile.$(OBJEXT) \
+#>- cprofilewindow.$(OBJEXT) cexportmanager.$(OBJEXT) cmdiarea.$(OBJEXT) \
+#>- kstartuplogo.$(OBJEXT) cpointers.$(OBJEXT)
+#>+ 10
+libfrontend_a_final_OBJECTS = libfrontend_a.all_cpp.o
+libfrontend_a_nofinal_OBJECTS = chtmldialog.$(OBJEXT) chtmlwidget.$(OBJEXT) \
+ctoolclass.$(OBJEXT) cbtconfig.$(OBJEXT) cinputdialog.$(OBJEXT) \
+coptionsdialog.$(OBJEXT) cprofilemgr.$(OBJEXT) cprofile.$(OBJEXT) \
+cprofilewindow.$(OBJEXT) cexportmanager.$(OBJEXT) cmdiarea.$(OBJEXT) \
+kstartuplogo.$(OBJEXT) cpointers.$(OBJEXT)\
+cinputdialog.moc.o cmdiarea.moc.o coptionsdialog.moc.o chtmldialog.moc.o chtmlwidget.moc.o \
+libfrontend_a_meta_unload.o
+@KDE_USE_FINAL_FALSE@libfrontend_a_OBJECTS = $(libfrontend_a_nofinal_OBJECTS)
+@KDE_USE_FINAL_TRUE@libfrontend_a_OBJECTS = $(libfrontend_a_final_OBJECTS)
+AR = ar
+CXXFLAGS = @CXXFLAGS@
+#>- CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+CXXLD = $(CXX)
+#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
+#>+ 1
+CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+#>- DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+#>+ 4
+KDE_DIST=chtmlwidget.h cexportmanager.h cprofilewindow.h cpointers.h cmdiarea.h ctoolclass.h coptionsdialog.h chtmldialog.h cprofilemgr.h cprofile.h kstartuplogo.h cbtconfig.h cinputdialog.h
+
+DISTFILES= $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
+
+
+TAR = tar
+GZIP_ENV = --best
+#>- DEP_FILES = .deps/cbtconfig.P .deps/cexportmanager.P \
+#>- .deps/chtmldialog.P .deps/chtmlwidget.P .deps/cinputdialog.P \
+#>- .deps/cmdiarea.P .deps/coptionsdialog.P .deps/cpointers.P \
+#>- .deps/cprofile.P .deps/cprofilemgr.P .deps/cprofilewindow.P \
+#>- .deps/ctoolclass.P .deps/kstartuplogo.P
+#>+ 12
+@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/cinputdialog.moc.P $(DEPDIR)/cmdiarea.moc.P $(DEPDIR)/coptionsdialog.moc.P $(DEPDIR)/chtmldialog.moc.P $(DEPDIR)/chtmlwidget.moc.P $(DEPDIR)/libfrontend_a_meta_unload.P $(DEPDIR)/libfrontend_a.all_cpp.P \
+ .deps/cbtconfig.P .deps/cexportmanager.P \
+.deps/chtmldialog.P .deps/chtmlwidget.P .deps/cinputdialog.P \
+.deps/cmdiarea.P .deps/coptionsdialog.P .deps/cpointers.P \
+.deps/cprofile.P .deps/cprofilemgr.P .deps/cprofilewindow.P \
+.deps/ctoolclass.P .deps/kstartuplogo.P
+@KDE_USE_FINAL_FALSE@DEP_FILES = $(DEPDIR)/cinputdialog.moc.P $(DEPDIR)/cmdiarea.moc.P $(DEPDIR)/coptionsdialog.moc.P $(DEPDIR)/chtmldialog.moc.P $(DEPDIR)/chtmlwidget.moc.P $(DEPDIR)/libfrontend_a_meta_unload.P .deps/cbtconfig.P .deps/cexportmanager.P \
+.deps/chtmldialog.P .deps/chtmlwidget.P .deps/cinputdialog.P \
+.deps/cmdiarea.P .deps/coptionsdialog.P .deps/cpointers.P \
+.deps/cprofile.P .deps/cprofilemgr.P .deps/cprofilewindow.P \
+.deps/ctoolclass.P .deps/kstartuplogo.P
+
+SOURCES = $(libfrontend_a_SOURCES)
+OBJECTS = $(libfrontend_a_OBJECTS)
+
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .cpp .lo .o .obj .s
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/frontend/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.s.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libfrontend.a: $(libfrontend_a_OBJECTS) $(libfrontend_a_DEPENDENCIES)
+ -rm -f libfrontend.a
+ $(AR) cru libfrontend.a $(libfrontend_a_OBJECTS) $(libfrontend_a_LIBADD)
+ $(RANLIB) libfrontend.a
+.cpp.o:
+ $(CXXCOMPILE) -c $<
+.cpp.obj:
+ $(CXXCOMPILE) -c `cygpath -w $<`
+.cpp.lo:
+ $(LTCXXCOMPILE) -c $<
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+@SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+ rev="$$subdir $$rev"; \
+ test "$$subdir" = "." && dot_seen=yes; \
+ done; \
+ test "$$dot_seen" = "no" && rev=". $$rev"; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/frontend
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/frontend/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+ for subdir in $(SUBDIRS); do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ chmod 777 $(distdir)/$$subdir; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
+ || exit 1; \
+ fi; \
+ done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+ -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+ @echo '$(COMPILE) -c $<'; \
+ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.c
+ @echo '$(LTCOMPILE) -c $<'; \
+ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+
+%.o: %.cpp
+ @echo '$(CXXCOMPILE) -c $<'; \
+ $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.cpp
+ @echo '$(LTCXXCOMPILE) -c $<'; \
+ $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am:
+uninstall: uninstall-recursive
+all-am: Makefile $(LIBRARIES)
+all-redirect: all-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
+ mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+#>- clean-am: clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+#>- clean-depend clean-generic mostlyclean-am
+#>+ 2
+clean-am: clean-metasources clean-moc-classes clean-final clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+ clean-depend clean-generic mostlyclean-am
+
+#>- clean: clean-recursive
+#>+ 1
+clean: kde-rpo-clean clean-recursive
+
+distclean-am: distclean-noinstLIBRARIES distclean-compile \
+ distclean-libtool distclean-tags distclean-depend \
+ distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-recursive
+
+maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-tags maintainer-clean-depend \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool install-data-recursive \
+uninstall-data-recursive install-exec-recursive \
+uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
+all-recursive check-recursive installcheck-recursive info-recursive \
+dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs-am installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 3
+cinputdialog.moc.cpp: $(srcdir)/cinputdialog.h
+ $(MOC) $(srcdir)/cinputdialog.h -o cinputdialog.moc.cpp
+
+#>+ 3
+cmdiarea.moc.cpp: $(srcdir)/cmdiarea.h
+ $(MOC) $(srcdir)/cmdiarea.h -o cmdiarea.moc.cpp
+
+#>+ 3
+coptionsdialog.moc.cpp: $(srcdir)/coptionsdialog.h
+ $(MOC) $(srcdir)/coptionsdialog.h -o coptionsdialog.moc.cpp
+
+#>+ 3
+chtmldialog.moc.cpp: $(srcdir)/chtmldialog.h
+ $(MOC) $(srcdir)/chtmldialog.h -o chtmldialog.moc.cpp
+
+#>+ 3
+chtmlwidget.moc.cpp: $(srcdir)/chtmlwidget.h
+ $(MOC) $(srcdir)/chtmlwidget.h -o chtmlwidget.moc.cpp
+
+#>+ 3
+clean-metasources:
+ -rm -f cinputdialog.moc.cpp cmdiarea.moc.cpp coptionsdialog.moc.cpp chtmldialog.moc.cpp chtmlwidget.moc.cpp
+
+#>+ 2
+docs-am:
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/frontend/Makefile.in
+
+
+#>+ 10
+libfrontend_a_meta_unload.cpp: cinputdialog.moc.cpp cmdiarea.moc.cpp chtmlwidget.moc.cpp chtmldialog.moc.cpp coptionsdialog.moc.cpp
+ @echo 'creating libfrontend_a_meta_unload.cpp'
+ @-rm -f libfrontend_a_meta_unload.cpp
+ @echo 'static const char * _metalist_libfrontend_a[] = {' > libfrontend_a_meta_unload.cpp
+ @cat cinputdialog.moc.cpp cmdiarea.moc.cpp chtmlwidget.moc.cpp chtmldialog.moc.cpp coptionsdialog.moc.cpp | grep 'char.*className' | sed -e 's/.*[^A-Za-z0-9_:]\([A-Za-z0-9_:]*\)::className.*$$/\"\1\",/' | sort | uniq >> libfrontend_a_meta_unload.cpp
+ @echo '0};' >> libfrontend_a_meta_unload.cpp
+ @echo '#include <kunload.h>' >> libfrontend_a_meta_unload.cpp
+ @echo '_UNLOAD(libfrontend_a)' >> libfrontend_a_meta_unload.cpp
+
+
+#>+ 3
+clean-moc-classes:
+ -rm -f libfrontend_a_meta_unload.cpp
+
+#>+ 11
+libfrontend_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/chtmldialog.cpp $(srcdir)/chtmlwidget.cpp $(srcdir)/ctoolclass.cpp $(srcdir)/cbtconfig.cpp $(srcdir)/cinputdialog.cpp $(srcdir)/coptionsdialog.cpp $(srcdir)/cprofilemgr.cpp $(srcdir)/cprofile.cpp $(srcdir)/cprofilewindow.cpp $(srcdir)/cexportmanager.cpp $(srcdir)/cmdiarea.cpp $(srcdir)/kstartuplogo.cpp $(srcdir)/cpointers.cpp libfrontend_a_meta_unload.cpp cinputdialog.moc.cpp cmdiarea.moc.cpp coptionsdialog.moc.cpp chtmldialog.moc.cpp chtmlwidget.moc.cpp
+ @echo 'creating libfrontend_a.all_cpp.cpp ...'; \
+ rm -f libfrontend_a.all_cpp.files libfrontend_a.all_cpp.final; \
+ echo "#define KDE_USE_FINAL 1" >> libfrontend_a.all_cpp.final; \
+ for file in chtmldialog.cpp chtmlwidget.cpp ctoolclass.cpp cbtconfig.cpp cinputdialog.cpp coptionsdialog.cpp cprofilemgr.cpp cprofile.cpp cprofilewindow.cpp cexportmanager.cpp cmdiarea.cpp kstartuplogo.cpp cpointers.cpp libfrontend_a_meta_unload.cpp cinputdialog.moc.cpp cmdiarea.moc.cpp coptionsdialog.moc.cpp chtmldialog.moc.cpp chtmlwidget.moc.cpp; do \
+ echo "#include \"$$file\"" >> libfrontend_a.all_cpp.files; \
+ test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libfrontend_a.all_cpp.final; \
+ done; \
+ cat libfrontend_a.all_cpp.final libfrontend_a.all_cpp.files > libfrontend_a.all_cpp.cpp; \
+ rm -f libfrontend_a.all_cpp.final libfrontend_a.all_cpp.files
+
+#>+ 3
+clean-final:
+ -rm -f libfrontend_a.all_cpp.cpp
+
+#>+ 2
+final:
+ $(MAKE) libfrontend_a_OBJECTS="$(libfrontend_a_final_OBJECTS)" all-am
+#>+ 2
+no-final:
+ $(MAKE) libfrontend_a_OBJECTS="$(libfrontend_a_nofinal_OBJECTS)" all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/frontend/cbtconfig.cpp b/bibletime/frontend/cbtconfig.cpp
new file mode 100644
index 0000000..7147093
--- /dev/null
+++ b/bibletime/frontend/cbtconfig.cpp
@@ -0,0 +1,374 @@
+/***************************************************************************
+ cbtconfig.cpp - description
+ -------------------
+ begin : Mon Nov 19 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+#include "cbtconfig.h"
+
+//Qt includes
+#include <qapplication.h>
+#include <qfontdatabase.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+//KDE includes
+#include <kconfig.h>
+#include <kcharsets.h>
+#include <kglobal.h>
+#include <klocale.h>
+
+
+/* No constructor and destructor, because this class only contains static methods.
+ It won't be instantiated. */
+
+const QString CBTConfig::getKey( const CBTConfig::strings ID){
+ switch ( ID ){
+ case bibletimeVersion: return "bibletimeVersion";
+ case language: return "language";
+ case standardBible: return "standardBible";
+ case standardCommentary: return "standardCommentary";
+ case standardLexicon: return "standardLexicon";
+ case standardHebrewStrongsLexicon: return "standardHebrewLexicon";
+ case standardGreekStrongsLexicon: return "standardGreekLexicon";
+ case standardHebrewMorphLexicon: return "standardHebrewMorphLexicon";
+ case standardGreekMorphLexicon: return "standardGreekMorphLexicon";
+ }
+ return QString::null;
+}
+
+const QString CBTConfig::getDefault( const CBTConfig::strings ID){
+ switch ( ID ){
+ case bibletimeVersion: return ( "NOT YET INSTALLED" );
+ // main() will realize this and set the value to VERSION
+ case language: return (KGlobal::locale()->language()).local8Bit();
+ case standardBible: return "KJV"; // no effect
+ case standardCommentary: return "MHC";
+ case standardLexicon: return "Eastons";
+ case standardHebrewStrongsLexicon: return "StrongsHebrew";
+ case standardGreekStrongsLexicon: return "StrongsGreek";
+ case standardHebrewMorphLexicon: return "StrongsHebrew"; //warning this is wrong
+ case standardGreekMorphLexicon: return "StrongsGreek"; //but imo has no effect
+ }
+ return QString::null;
+}
+
+const QString CBTConfig::getKey( const CBTConfig::fonts ID){
+ switch ( ID ){
+ case standard: return "standard";
+ case unicode: return "unicode";
+ }
+ return QString::null;
+}
+
+const QFont CBTConfig::getDefault( const CBTConfig::fonts ID){
+ switch ( ID ){
+ case standard: return QApplication::font();
+ case unicode: //find an Unicode font
+ {
+ KCharsets* cs = KGlobal::charsets();
+ QFontDatabase db;
+ QFont uniFont;
+ if (!cs->isAvailable(QFont::Unicode)) { //no unicode font installed!
+ qWarning("NO UNICODE FONT INSTALLED!");
+ }
+ cs->setQFont(uniFont, QFont::Unicode);
+// qWarning("the unicode font found by KDE is %s", uniFont.family().latin1());
+
+// QStringList families = KGlobal::charsets()->availableFamilies(QFont::Unicode);
+// for (QStringList::Iterator it = families.begin();it != families.end();++it) {
+// qWarning((*it).latin1());
+// if (!cs->hasUnicode(*it))
+// qWarning("font %s DOESN'T have UNICODE!", (*it).latin1());
+// }
+//
+// QMap<QString, int> uniFontMap;
+// for (QStringList::Iterator it = families.begin();it != families.end();++it) {
+// const QString font = *it;
+// if (db.isScalable(font)) {
+// if (db.isSmoothlyScalable(font)) {
+// qWarning("font %s is SMOOTHLY scalable!", font.latin1());
+// }
+// else if (db.isBitmapScalable(font)) {
+// qWarning("font %s is BITMAP scalable!", font.latin1());
+// }
+// else {
+// qWarning("font %s is SMOOTHLY scalable!", font.latin1());
+// }
+// }
+//
+// //find how many charsets are supported!
+// QList<QFont::CharSet> fonts = cs->availableCharsets(font);//db.charSets(font).count()
+// uniFontMap.insert(font, fonts.count());
+//
+// fonts.setAutoDelete(true);
+// fonts.clear();
+// }
+//
+// //now find the unicode font with the most charsets
+// QString bestFont = uniFont.family();
+// int oldCount = 0;
+// for (QMap<QString, int>::Iterator it = uniFontMap.begin(); it != uniFontMap.end(); ++it) {
+// if (it.data() > oldCount) {
+// oldCount = it.data();
+// bestFont = it.key();
+// }
+// }
+// qWarning("the best font is %s and supports %i charsets", bestFont.latin1(), oldCount);
+
+// qWarning("--------");
+// QStringList fonts = db.families(false);
+// for (QStringList::Iterator it = fonts.begin();it != fonts.end();++it) {
+// QStringList charsets = db.charSets(*it);
+// for (QStringList::Iterator cs = charsets.begin(); cs != charsets.end(); ++cs) {
+// qWarning("Font %s has charset %s", (*it).latin1(), (*cs).latin1());
+// }
+// }
+// qWarning("--------");
+ return uniFont;
+ }
+
+ }
+ return QString::null;
+}
+
+const QString CBTConfig::getKey( const CBTConfig::bools ID){
+ switch ( ID ){
+ case firstSearchDialog: return "firstSearchDialog";
+
+ case toolbar: return "toolbar";
+ case mainIndex: return "mainIndex";
+
+ case autoTile: return "autoTile";
+ case autoCascade: return "autoCascade";
+
+ case lexiconCache: return "lexicon_chache";
+
+ case footnotes: return "footnotes";
+ case strongNumbers: return "strongNumbers";
+ case headings: return "headings";
+ case morphTags: return "morphTags";
+ case lemmas: return "lemmas";
+ case hebrewPoints: return "hebrewPoints";
+ case hebrewCantillation: return "hebrewCantillation";
+ case greekAccents: return "greekAccents";
+ case textualVariants: return "textualVariants";
+
+ case lineBreaks: return "lineBreaks";
+ case verseNumbers: return "verseNumbers";
+ case scroll: return "scroll";
+
+ case tips: return "RunOnStart";
+ case logo: return "logo";
+ case restoreWorkspace: return "restoreWorkspace";
+ }
+ return QString::null;
+}
+
+const bool CBTConfig::getDefault( const CBTConfig::bools ID){
+ switch ( ID ){
+ case firstSearchDialog: return true;
+
+ case toolbar: return true;
+ case mainIndex: return true;
+
+ case autoTile: return true;
+ case autoCascade: return false;
+
+ case lexiconCache: return true;
+
+ case footnotes: return true;
+ case strongNumbers: return false;
+ case headings: return true;
+ case morphTags: return false;
+ case lemmas: return false;
+ case hebrewPoints: return false;
+ case hebrewCantillation: return false;
+ case greekAccents: return false;
+ case textualVariants: return false;
+
+ case lineBreaks: return true;
+ case verseNumbers: return true;
+ case scroll: return true;
+
+ case tips: return true;
+ case logo: return true;
+ case restoreWorkspace: return false;
+ }
+ return false;
+}
+
+const QString CBTConfig::getKey( const CBTConfig::colors ID){
+ switch ( ID ){
+ case textColor: return "textColor";
+ case backgroundColor: return "backgroundColor";
+ case highlightedVerseColor: return "highlightedVerseClolor";
+ case footnotesColor: return "footnotesColor";
+ case strongsColor: return "strongsColor";
+ case morphsColor: return "morphsColor";
+ case jesuswordsColor: return "jesuswordsColor";
+ case swordRefColor: return "swordRefColor";
+ }
+ return QString::null;
+}
+
+const QColor CBTConfig::getDefault( const CBTConfig::colors ID){
+ switch ( ID ){
+ case textColor: return QColor(Qt::black);
+ case backgroundColor: return QColor(Qt::white);
+ case highlightedVerseColor: return QColor(Qt::red);
+ case footnotesColor: return QColor(Qt::black);
+ case strongsColor: return QColor(Qt::green);
+ case morphsColor: return QColor(Qt::green);
+ case jesuswordsColor: return QColor(Qt::red);
+ case swordRefColor: return QColor(Qt::blue);
+ }
+ return Qt::blue;
+}
+
+const QString CBTConfig::getKey( const CBTConfig::intLists ID){
+ switch ( ID ){
+ case splitterSizes: return "splitterSizes";
+ }
+ return QString::null;
+}
+
+const QValueList<int> CBTConfig::getDefault( const CBTConfig::intLists ID){
+ switch ( ID ){
+ case splitterSizes: return QValueList<int>();
+ }
+ return QValueList<int>();
+}
+
+const QString CBTConfig::getKey( const CBTConfig::stringLists ID){
+ switch ( ID ){
+ case searchCompletionTexts: return QString::fromLatin1("searchCompletionTexts");
+ case searchTexts: return QString::fromLatin1("searchTexts");
+ }
+ return QString::null;
+}
+
+const QStringList CBTConfig::getDefault( const CBTConfig::stringLists ID){
+ switch ( ID ){
+ case searchTexts:
+ return QStringList();
+ case searchCompletionTexts:
+ return QStringList();
+ }
+ return QStringList();
+}
+
+const QString CBTConfig::get( const CBTConfig::strings ID){
+ KConfig* config = KGlobal::config();
+ KConfigGroupSaver groupSaver(config, "strings");
+ return config->readEntry(getKey(ID),getDefault(ID));
+}
+
+const QFont CBTConfig::get(const CBTConfig::fonts ID){
+ KConfig* config = KGlobal::config();
+ KConfigGroupSaver groupSaver(config, "fonts");
+ QFont defaultFont = getDefault(ID);
+ return config->readFontEntry(getKey(ID), &defaultFont);
+}
+
+const bool CBTConfig::get( const CBTConfig::bools ID){
+ //special behaviour for the KTipDialog class
+ KConfig* config = KGlobal::config();
+ KConfigGroupSaver groupSaver(config, (ID == CBTConfig::tips) ? "TipOfDay" : "bools");
+ return config->readBoolEntry(getKey(ID),getDefault(ID));
+}
+
+const QColor CBTConfig::get( const CBTConfig::colors ID){
+ KConfig* config = KGlobal::config();
+ KConfigGroupSaver groupSaver(config, "colors");
+ QColor defaultColor = getDefault(ID);
+ return config->readColorEntry(getKey(ID),&defaultColor);
+}
+
+const QValueList<int> CBTConfig::get( const CBTConfig::intLists ID ){
+ KConfig* config = KGlobal::config();
+ KConfigGroupSaver groupSaver(config, "lists");
+ return config->readIntListEntry(getKey(ID));
+}
+
+const QStringList CBTConfig::get( const CBTConfig::stringLists ID ){
+ KConfig* config = KGlobal::config();
+ KConfigGroupSaver groupSaver(config, "lists");
+ return config->readListEntry(getKey(ID));
+}
+
+void CBTConfig::set( const CBTConfig::strings ID, const QString value ){
+ KConfig* config = KGlobal::config();
+ KConfigGroupSaver groupSaver(config, "strings");
+ config->writeEntry(getKey(ID), value);
+}
+
+void CBTConfig::set( const CBTConfig::fonts ID, const QFont value ){
+ KConfig* config = KGlobal::config();
+ KConfigGroupSaver groupSaver(config, "fonts");
+ config->writeEntry(getKey(ID), value);
+}
+
+void CBTConfig::set(const CBTConfig::bools ID,const bool value ){
+ KConfig* config = KGlobal::config();
+ //special behaviour to work with KTipDialog class of KDE
+ KConfigGroupSaver groupSaver(config, (ID == CBTConfig::tips) ? "TipOfDay" : "bools");
+ config->writeEntry(getKey(ID), value);
+}
+
+void CBTConfig::set( const CBTConfig::colors ID, const QColor value ){
+ KConfig* config = KGlobal::config();
+ KConfigGroupSaver groupSaver(config, "colors");
+ config->writeEntry(getKey(ID), value);
+}
+
+void CBTConfig::set( const CBTConfig::intLists ID, const QValueList<int> value ){
+ KConfig* config = KGlobal::config();
+ KConfigGroupSaver groupSaver(config, "lists");
+ config->writeEntry(getKey(ID), value);
+}
+
+void CBTConfig::set( const CBTConfig::stringLists ID, const QStringList value ){
+ KConfig* config = KGlobal::config();
+ KConfigGroupSaver groupSaver(config, "lists");
+ config->writeEntry(getKey(ID), value);
+}
+
+
+
+const CSwordBackend::DisplayOptionsBool CBTConfig::getDisplayOptionDefaults(){
+ CSwordBackend::DisplayOptionsBool options;
+
+ options.lineBreaks = get(CBTConfig::lineBreaks);
+ options.verseNumbers = get(CBTConfig::verseNumbers);
+
+ return options;
+}
+
+const CSwordBackend::FilterOptionsBool CBTConfig::getFilterOptionDefaults(){
+
+ CSwordBackend::FilterOptionsBool options;
+
+ options.footnotes = get(CBTConfig::footnotes);
+ options.strongNumbers = get(CBTConfig::strongNumbers);
+ options.headings = get(CBTConfig::headings);
+ options.morphTags = get(CBTConfig::morphTags);
+ options.lemmas = get(CBTConfig::lemmas);
+ options.hebrewPoints = get(CBTConfig::hebrewPoints);
+ options.hebrewCantillation = get(CBTConfig::hebrewCantillation);
+ options.greekAccents = get(CBTConfig::greekAccents);
+
+ return options;
+}
diff --git a/bibletime/frontend/cbtconfig.h b/bibletime/frontend/cbtconfig.h
new file mode 100644
index 0000000..425a6fc
--- /dev/null
+++ b/bibletime/frontend/cbtconfig.h
@@ -0,0 +1,131 @@
+/***************************************************************************
+ cbtconfig.h - description
+ -------------------
+ begin : Mon Nov 19 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CBTCONFIG_H
+#define CBTCONFIG_H
+
+#include <qstring.h>
+#include <qcolor.h>
+#include <qfont.h>
+#include <qvaluelist.h>
+
+#include "backend/cswordbackend.h"
+/**This class is the interface to the config object of BibleTime
+ *@author The BibleTime team
+ */
+
+class CBTConfig {
+public:
+ enum strings{
+ bibletimeVersion,
+ language,
+ standardBible,
+ standardCommentary,
+ standardLexicon,
+ standardHebrewStrongsLexicon,
+ standardGreekStrongsLexicon,
+ standardHebrewMorphLexicon,
+ standardGreekMorphLexicon
+ };
+ enum fonts{
+ standard,
+ unicode
+ };
+ enum colors{
+ textColor,
+ backgroundColor,
+ highlightedVerseColor,
+ footnotesColor,
+ strongsColor,
+ morphsColor,
+ jesuswordsColor,
+ swordRefColor //SWORD hyperlink
+ };
+ enum bools{
+ firstSearchDialog,
+
+ toolbar,
+ mainIndex,
+
+ autoTile,
+ autoCascade,
+
+ lexiconCache,
+
+ footnotes,
+ strongNumbers,
+ headings,
+ morphTags,
+ lemmas,
+ hebrewPoints,
+ hebrewCantillation,
+ greekAccents,
+ textualVariants,
+
+ lineBreaks,
+ verseNumbers,
+ scroll,
+
+ tips,
+ logo,
+ restoreWorkspace
+ };
+ enum intLists{
+ splitterSizes
+ };
+ enum stringLists{
+ searchCompletionTexts,
+ searchTexts
+ };
+
+ static const QString get( const CBTConfig::strings );
+ static const QFont get( const CBTConfig::fonts );
+ static const bool get( const CBTConfig::bools );
+ static const QColor get( const CBTConfig::colors );
+ static const QValueList<int> get( const CBTConfig::intLists );
+ static const QStringList get( const CBTConfig::stringLists );
+
+
+ static void set( const CBTConfig::strings, const QString value );
+ static void set( const CBTConfig::fonts, const QFont value );
+ static void set( const CBTConfig::bools, const bool value );
+ static void set( const CBTConfig::colors, const QColor value );
+ static void set( const CBTConfig::intLists, const QValueList<int> value );
+ static void set( const CBTConfig::stringLists, const QStringList value);
+
+
+ static const CSwordBackend::FilterOptionsBool getFilterOptionDefaults();
+ static const CSwordBackend::DisplayOptionsBool getDisplayOptionDefaults();
+
+private:
+ static const QString getKey( const CBTConfig::strings );
+ static const QString getKey( const CBTConfig::fonts );
+ static const QString getKey( const CBTConfig::bools );
+ static const QString getKey( const CBTConfig::colors );
+ static const QString getKey( const CBTConfig::intLists );
+ static const QString getKey( const CBTConfig::stringLists );
+
+ static const QString getDefault( const CBTConfig::strings );
+ static const QFont getDefault( const CBTConfig::fonts );
+ static const bool getDefault( const CBTConfig::bools );
+ static const QColor getDefault( const CBTConfig::colors );
+ static const QValueList<int> getDefault( const CBTConfig::intLists );
+ static const QStringList getDefault( const CBTConfig::stringLists );
+};
+
+
+#endif
diff --git a/bibletime/frontend/cexportmanager.cpp b/bibletime/frontend/cexportmanager.cpp
new file mode 100644
index 0000000..641538f
--- /dev/null
+++ b/bibletime/frontend/cexportmanager.cpp
@@ -0,0 +1,212 @@
+/***************************************************************************
+ cexportmanager.cpp - description
+ -------------------
+ begin : Mon Feb 25 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cexportmanager.h"
+#include "backend/cswordkey.h"
+#include "backend/cswordmoduleinfo.h"
+#include "printing/cprintitem.h"
+#include "printing/cprinter.h"
+#include "util/scoped_resource.h"
+#include "ctoolclass.h"
+
+//Qt includes
+#include <qprogressdialog.h>
+#include <qclipboard.h>
+
+//KDE includes
+#include <kfiledialog.h>
+#include <klocale.h>
+#include <kapp.h>
+
+//Sword includes
+#include <swkey.h>
+#include <listkey.h>
+
+/** Saves the key to disk. */
+const bool CExportManager::saveKey( CSwordKey* key, const bool withText ) {
+ const QString file = KFileDialog::getSaveFileName(QString::null, i18n("*.txt | Text files\n *.* | All files (*.*)"), 0, i18n("Save search result ..."));
+ if (key && !file.isEmpty()) {
+ QString text = QString::fromLatin1("%1").arg(key->key());
+ if (withText)
+ text += QString::fromLatin1("\n\t%1").arg(key->strippedText());
+ CToolClass::savePlainFile(file, text);
+ return true;
+ }
+ return false;
+}
+
+/** Saves the key to disk. */
+const bool CExportManager::saveKeyList( ListKey* list, CSwordModuleInfo* module, const QString& label, const bool withText, const bool showProgress ){
+ bool ret = false;
+ const QString file = KFileDialog::getSaveFileName(QString::null, i18n("*.txt | Text files\n *.* | All files (*.*)"), 0, i18n("Save search result ..."));
+ if (!file.isEmpty()) {
+ QProgressDialog progress( label, i18n("Cancel"), list->Count(), 0,"progress", true );
+ progress.setProgress(0);
+ progress.setMinimumDuration(10);
+ progress.show();
+
+ util::scoped_ptr<CSwordKey> key(CSwordKey::createInstance(module));
+
+ QString text;
+ int index = 0;
+ *list = TOP;
+ while (!list->Error() && !progress.wasCancelled()) {
+ key->key((const char*)(*list));
+ if (!key)
+ break;
+ progress.setProgress(index++);
+ KApplication::kApplication()->processEvents(10); //do not lock the GUI!
+
+ if (withText)
+ text += QString::fromLatin1("%1:\n\t%2\n").arg( key->key() ).arg( key->strippedText() );
+ else
+ text += key->key() + "\n";
+
+ (*list)++;
+ }
+ if (!progress.wasCancelled()) {
+ progress.setProgress(index);
+ CToolClass::savePlainFile(file, text);
+ ret = true;
+ }
+ }
+
+ return ret;
+}
+
+const bool CExportManager::saveKeyList( QList<CSwordKey>& list, CSwordModuleInfo* module, const QString& label, const bool withText, const bool showProgress ){
+ bool ret = false;
+ const QString file = KFileDialog::getSaveFileName(QString::null, i18n("*.txt | Text files\n *.* | All files (*.*)"), 0, i18n("Save search result ..."));
+ if (!file.isEmpty()){
+
+ QProgressDialog progress( label, i18n("Cancel"), list.count(), 0,"progress", true );
+ progress.setProgress(0);
+ progress.setMinimumDuration(10);
+ progress.show();
+
+ QString text;
+ CSwordKey* key = 0;
+ for (list.first(); list.current(); list.next()) {
+ key = list.current();
+ if (!key)
+ break;
+ progress.setProgress(list.at());
+ KApplication::kApplication()->processEvents(10); //do not lock the GUI!
+
+ if (withText)
+ text += QString::fromLatin1("%1:\n\t%2\n").arg( key->key() ).arg( key->strippedText() );
+ else
+ text += key->key() + "\n";
+ }
+
+ if (!progress.wasCancelled()) {
+ progress.setProgress(list.count());
+ CToolClass::savePlainFile(file, text);
+ }
+ }
+
+ return ret;
+}
+
+
+///////// copy functions
+const bool CExportManager::copyKey( CSwordKey* key, const bool withText ) {
+ bool ret = true;
+ QString text = (withText) ? QString::fromLatin1("%1:\n\t%2").arg(key->key()).arg(key->strippedText()) : key->key()+"\n";
+
+ KApplication::clipboard()->setText(text);
+
+ return ret;
+}
+
+const bool CExportManager::copyKeyList( ListKey* list, CSwordModuleInfo* module, const QString& label, const bool withText, const bool showProgress ){
+ QProgressDialog progress( label, i18n("Cancel"), list->Count(), 0,"progress", true );
+ progress.setProgress(0);
+ progress.setMinimumDuration(10);
+ progress.show();
+
+ QString text;
+ int index = 0;
+ util::scoped_ptr<CSwordKey> key( CSwordKey::createInstance(module) );
+ *list = TOP;
+ while (!list->Error() && !progress.wasCancelled()) {
+ key->key((const char*)(*list));
+ if (!key)
+ break;
+ progress.setProgress(index++);
+ KApplication::kApplication()->processEvents(10); //do not lock the GUI!
+
+ text += (withText) ? QString::fromLatin1("%1:\n\t%2\n").arg(key->key()).arg(key->strippedText()) : key->key()+"\n";
+ (*list)++;
+ }
+ if (progress.wasCancelled())
+ return false;
+
+ progress.setProgress(index);
+ KApplication::clipboard()->setText(text);
+ return true;
+}
+
+
+//////// printing functions //////////
+
+const bool CExportManager::printKey( CSwordModuleInfo* module, const QString& startKey, const QString& stopKey, const QString& description ){
+ printer()->appendItem( new CPrintItem(module, startKey, stopKey, description) );
+ return true;
+}
+
+const bool CExportManager::printKeyList( ListKey* list, CSwordModuleInfo* module, const QString& label, const bool showProgress ){
+ QProgressDialog progress( label, i18n("Cancel"), list->Count(), 0,"progress", true );
+ progress.setProgress(0);
+ progress.setMinimumDuration(10);
+ progress.show();
+
+ int index = 0;
+ QList<CPrintItem> itemList;
+ QString startKey, stopKey;
+
+ *list = TOP;
+ while (!list->Error() && !progress.wasCancelled()) {
+ VerseKey* vk = dynamic_cast<VerseKey*>(list);
+ if (vk) {
+ startKey = QString::fromLocal8Bit((const char*)(vk->LowerBound()) );
+ stopKey = QString::fromLocal8Bit((const char*)(vk->UpperBound()) );
+ }
+ else {
+ startKey = QString::fromLocal8Bit((const char*)*list);
+ stopKey = QString::null;
+ }
+ itemList.append( new CPrintItem(module, startKey, stopKey) );
+
+ progress.setProgress(index++);
+ KApplication::kApplication()->processEvents(10); //do not lock the GUI!
+
+ (*list)++;
+ }
+
+ //add all items to the queue
+ if (progress.wasCancelled()) {
+ itemList.setAutoDelete(true);
+ itemList.clear();//delete all items
+ return false;
+ }
+
+ progress.setProgress(list->Count());
+ printer()->appendItems(itemList);
+
+ return true;
+}
diff --git a/bibletime/frontend/cexportmanager.h b/bibletime/frontend/cexportmanager.h
new file mode 100644
index 0000000..853e2da
--- /dev/null
+++ b/bibletime/frontend/cexportmanager.h
@@ -0,0 +1,53 @@
+/***************************************************************************
+ cexportmanager.h - description
+ -------------------
+ begin : Mon Feb 25 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CEXPORTMANAGER_H
+#define CEXPORTMANAGER_H
+
+//BibleTime includes
+#include "cpointers.h"
+
+//Qt includes
+#include <qstring.h>
+#include <qlist.h>
+
+class ListKey;
+class CSwordKey;
+class CSwordModuleInfo;
+
+
+/**Contains the functions to export text to disk, clipboard or printer.
+ *@author The BibleTime team
+ */
+class CExportManager : CPointers {
+public: // Public methods
+ //save functions
+ static const bool saveKey( CSwordKey* key, const bool withText = true );
+ static const bool saveKeyList( ListKey* list, CSwordModuleInfo* module, const QString& label, const bool withText = true, const bool showProgress = true );
+ static const bool saveKeyList( QList<CSwordKey>& list, CSwordModuleInfo* module, const QString& label, const bool withText = true, const bool showProgress = true );
+
+ //clipboard functions
+ static const bool copyKey( CSwordKey* key, const bool withText = true );
+ static const bool copyKeyList( ListKey* list, CSwordModuleInfo* module, const QString& label, const bool withText = true, const bool showProgress = true );
+
+ //print function
+ static const bool printKey( CSwordModuleInfo* module, const QString& startKey, const QString& stopkey = QString::null, const QString& description = QString::null );
+ static const bool printKeyList( ListKey* list, CSwordModuleInfo* module, const QString& label, const bool showProgress = true );
+
+};
+
+#endif
diff --git a/bibletime/frontend/chtmldialog.cpp b/bibletime/frontend/chtmldialog.cpp
new file mode 100644
index 0000000..6be6c83
--- /dev/null
+++ b/bibletime/frontend/chtmldialog.cpp
@@ -0,0 +1,154 @@
+/***************************************************************************
+ chtmldialog.cpp - description
+ -------------------
+ begin : Tue Jan 25 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//own includes
+#include "chtmldialog.h"
+#include "ctoolclass.h"
+
+//QT includes
+#include <qlayout.h>
+#include <qhbox.h>
+#include <qfile.h>
+#include <qtextbrowser.h>
+#include <qtoolbar.h>
+#include <qtoolbutton.h>
+#include <qpushbutton.h>
+
+//KDE includes
+#include <kcombobox.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kapp.h>
+
+
+CHTMLDialog::CHTMLDialog(QWidget* parent, const char *name )
+ : QDialog ( parent, name, true, WStyle_MinMax | WStyle_DialogBorder | WStyle_Dialog )
+{
+ init(false);
+}
+
+CHTMLDialog::CHTMLDialog(const QString& url, QWidget* parent, const char *name)
+ : QDialog ( parent, name, true, WStyle_MinMax | WStyle_DialogBorder | WStyle_Dialog )
+{
+ init();
+ QString file = CToolClass::locatehtml(url);
+
+ m_textBrowser->mimeSourceFactory()->setFilePath(file);
+ m_textBrowser->setSource(file);
+}
+
+CHTMLDialog::~CHTMLDialog(){
+}
+
+/** Sets the content of the widget */
+void CHTMLDialog::setText(const QString& text){
+ m_textBrowser->setText(text);
+}
+
+/** Initializes this widget. */
+void CHTMLDialog::init(const bool enableHistory){
+ resize(600,400);
+ QVBoxLayout* layout = new QVBoxLayout(this, 5);
+
+ m_textBrowser = new QTextBrowser(this);
+ KURL url(CToolClass::locatehtml("bibletime/helpdialog/index.docbook"));
+ m_textBrowser->mimeSourceFactory()->addFilePath(url.directory());
+ url.cd(QString::fromLatin1(".."));
+ m_textBrowser->mimeSourceFactory()->addFilePath(url.directory());
+ url.cd(QString::fromLatin1(".."));
+ m_textBrowser->mimeSourceFactory()->addFilePath(url.directory());
+ url.cd(QString::fromLatin1(".."));
+ m_textBrowser->mimeSourceFactory()->addFilePath(url.directory());
+
+
+ if (enableHistory) {
+ QHBox* toolBar = new QHBox(this, "history toolbar");
+
+ QToolButton *button = 0;
+ button = new QToolButton(toolBar);
+ button->setIconSet(SmallIcon("back"));
+ button->setTextLabel(i18n("Backward"));
+ button->setEnabled(false);
+ button->setUsesTextLabel(true);
+ button->setFixedSize(button->sizeHint());
+ connect(button, SIGNAL(clicked()), m_textBrowser, SLOT(backward()));
+ connect(m_textBrowser, SIGNAL(backwardAvailable(bool)),
+ button, SLOT(setEnabled(bool)));
+ connect( m_textBrowser, SIGNAL( textChanged() ),
+ this, SLOT( textChanged() ) );
+
+ m_historyCombo = new KComboBox(toolBar);
+ toolBar->setStretchFactor(m_historyCombo, 5);
+ connect( m_historyCombo, SIGNAL( activated( const QString & ) ),
+ this, SLOT( historyItemSelected( const QString & ) ) );
+
+
+ button = new QToolButton(toolBar);
+ button->setEnabled(false);
+ button->setTextLabel(i18n("Forward"));
+ button->setUsesTextLabel(true);
+ button->setIconSet(SmallIcon("forward"));
+ button->setFixedSize(button->sizeHint());
+ connect(button, SIGNAL(clicked()), m_textBrowser, SLOT(forward()));
+ connect(m_textBrowser, SIGNAL(forwardAvailable(bool)),
+ button, SLOT(setEnabled(bool)));
+
+ layout->addWidget(toolBar);
+ }
+ layout->addSpacing(5);
+ layout->addWidget(m_textBrowser,5);
+
+ QHBoxLayout* hBox = new QHBoxLayout();
+ QPushButton* closeButton = new QPushButton(this);
+ closeButton->setText(i18n("Close"));
+ connect(closeButton, SIGNAL(pressed()), this, SLOT(close()));
+ hBox->addStretch(5);
+ hBox->addWidget(closeButton,1);
+
+ layout->addLayout(hBox);
+}
+
+/** Is called when an item of the history combo was chosen. */
+void CHTMLDialog::historyItemSelected( const QString & file ){
+ m_textBrowser->setSource(file);
+}
+
+/** Called when the content of the textbrowser was changed. */
+void CHTMLDialog::textChanged(){
+ if ( m_textBrowser->documentTitle().isNull() )
+ setCaption( m_textBrowser->context() );
+ else
+ setCaption( m_textBrowser->documentTitle() ) ;
+
+ QString selectedURL = caption();
+ if ( !selectedURL.isEmpty() && m_historyCombo ) {
+ bool exists = false;
+ int i;
+ for ( i = 0; i < m_historyCombo->count(); ++i ) {
+ if ( m_historyCombo->text( i ) == selectedURL ) {
+ exists = true;
+ break;
+ }
+ }
+ if ( !exists ) {
+ m_historyCombo->insertItem( selectedURL, -1 );
+ m_historyCombo->setCurrentItem( 0 );
+ } else
+ m_historyCombo->setCurrentItem( i );
+ selectedURL = QString::null;
+ }
+}
diff --git a/bibletime/frontend/chtmldialog.h b/bibletime/frontend/chtmldialog.h
new file mode 100644
index 0000000..fd22061
--- /dev/null
+++ b/bibletime/frontend/chtmldialog.h
@@ -0,0 +1,67 @@
+/***************************************************************************
+ chtmldialog.h - description
+ -------------------
+ begin : Tue Jan 25 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CHTMLDIALOG_H
+#define CHTMLDIALOG_H
+
+//Qt includes
+#include <qwidget.h>
+#include <qdialog.h>
+
+//forward declarations
+class QTextBrowser;
+class KComboBox;
+
+/** This is a general dialog to show long error messages or report and solutions
+ * (Perhaps from an FAQ file).
+ * @author The BibleTime Team
+ */
+class CHTMLDialog : public QDialog {
+ Q_OBJECT
+
+public:
+ CHTMLDialog(QWidget* parent=0, const char *name=0);
+ CHTMLDialog(const QString& url, QWidget* parent=0, const char *name=0);
+ ~CHTMLDialog();
+ /**
+ * Sets the content of the widget. Not URL is used.
+ */
+ virtual void setText(const QString&);
+
+protected:
+ QTextBrowser* m_textBrowser;
+ /**
+ * Initializes this widget.
+ */
+ void init(const bool enableHistory = true);
+
+protected slots: // Protected slots
+ /**
+ * Called when the content of the textbrowser was changed.
+ */
+ void textChanged();
+ /**
+ * Is called when an item of the history combo was chosen.
+ */
+ void historyItemSelected( const QString & );
+
+private:
+ KComboBox* m_historyCombo;
+};
+
+#endif
+
diff --git a/bibletime/frontend/chtmlwidget.cpp b/bibletime/frontend/chtmlwidget.cpp
new file mode 100644
index 0000000..7fe6e2d
--- /dev/null
+++ b/bibletime/frontend/chtmlwidget.cpp
@@ -0,0 +1,747 @@
+/***************************************************************************
+ chtmlwidget.cpp - description
+ -------------------
+ begin : Sun Feb 27 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "chtmlwidget.h"
+#include "ctoolclass.h"
+#include "backend/creferencemanager.h"
+#include "backend/cswordldkey.h"
+#include "backend/cswordversekey.h"
+#include "backend/cswordbackend.h"
+#include "backend/cswordmoduleinfo.h"
+#include "presenters/cswordpresenter.h"
+#include "thirdparty/qt3stuff/qt3stuff.h"
+#include "thirdparty/qt3stuff/qrichtext_p.h"
+#include "resource.h"
+#include "tooltipdef.h"
+#include "whatsthisdef.h"
+#include "cbtconfig.h"
+
+#include "util/scoped_resource.h"
+
+#include <stdio.h>
+
+//QT includes
+#include <qurl.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qclipboard.h>
+#include <qevent.h>
+#include <qdragobject.h>
+#include <qpixmapcache.h>
+#include <qstylesheet.h>
+#include <qwidget.h>
+#include <qtoolbutton.h>
+#include <qapplication.h>
+
+//KDE includes
+#include <kapp.h>
+#include <kaction.h>
+#include <kstdaction.h>
+#include <klocale.h>
+#include <kurl.h>
+#include <kfiledialog.h>
+#include <kcmenumngr.h>
+#include <kglobal.h>
+#include <kcursor.h>
+#include <kiconloader.h>
+#include <kglobalsettings.h>
+#include <kpopupmenu.h>
+#include <ktoolbar.h>
+#include <kcolorbutton.h>
+
+//Sword includes
+#include <swmodule.h>
+
+CHTMLWidget::ToolTip::ToolTip(QWidget* parent)
+ : QToolTip(parent) {
+
+}
+
+void CHTMLWidget::ToolTip::maybeTip(const QPoint& p) {
+// qWarning("void CHTMLWidget::ToolTip::maybeTip(const QPoint& p) ");
+ if (!parentWidget()->inherits("CHTMLWidget"))
+ return;
+
+ CHTMLWidget* htmlWidget = dynamic_cast<CHTMLWidget*>(parentWidget());
+ ASSERT(htmlWidget);
+ QPoint p1 = htmlWidget->viewportToContents(p);
+ QString link = QString::null;
+ QString text = QString::null;
+
+ link = htmlWidget->anchorAt(p1);
+ if ( link.isEmpty() )
+ return;
+ else {
+// qWarning("link is valid");
+ Qt3::QTextCursor c( htmlWidget->getDocument() );
+ htmlWidget->placeCursor( p1, &c );
+ QRect rect = c.parag()->rect();
+
+ //map rect coordinates to widget's ones
+ rect.setX( htmlWidget->contentsToViewport(rect.topLeft()).x() );
+ rect.setY( htmlWidget->contentsToViewport(rect.topLeft()).y() );
+ rect.setWidth( htmlWidget->contentsToViewport(rect.bottomRight()).x() - rect.x() );
+ rect.setHeight( htmlWidget->contentsToViewport(rect.bottomLeft()).y() - rect.y() );
+
+ QString module = QString::null;
+ QString ref = QString::null;
+ CReferenceManager::Type type;
+ const bool ok = CReferenceManager::decodeHyperlink(link, module, ref, type);
+ if (!ok || ref.isEmpty())
+ return;
+
+ const QFont oldFont = font();
+
+ CSwordModuleInfo* m = 0;
+ if (module.isEmpty() || module.isNull()) {
+ module = CReferenceManager::preferredModule( type );
+ }
+ m = backend()->findModuleByName(module);
+ if (m){
+ if (m->type() == CSwordModuleInfo::Bible || m->type() == CSwordModuleInfo::Commentary) {
+ CSwordModuleInfo* module = htmlWidget->modules().first();
+ if (module) {
+ ref = CReferenceManager::parseVerseReference(ref);
+ }
+ }
+ util::scoped_ptr<CSwordKey> key( CSwordKey::createInstance( m ) );
+ if (key) {
+ backend()->setFilterOptions( CBTConfig::getFilterOptionDefaults() );
+
+ key->key(ref);
+ text = key->renderedText();
+ }
+ if (m->isUnicode()) {
+ setFont( CBTConfig::get(CBTConfig::unicode) );
+ }
+ }
+ if (!text.isEmpty()) {
+ text = QString::fromLatin1("<B>%1</B><HR>%2").arg(ref).arg(text);
+ tip(rect, text);
+ }
+ setFont(oldFont);
+ }
+}
+
+CHTMLWidget::CHTMLWidget(const bool useColorsAndFonts,QWidget *parent, const char *name )
+ : Qt3::QTextEdit(parent, name),m_moduleList( new ListCSwordModuleInfo ) {
+
+ m_popup = 0;
+ m_anchor = QString::null;
+ m_anchorMenu = 0;
+ m_selectedWord = false;
+ mousePressed = inDoubleClick = false;
+ setTextFormat( Qt::RichText );
+ setReadOnly(true);
+
+ QFont unicodeFont = CBTConfig::get(CBTConfig::unicode);
+ if (!document()->charsetMap->contains(unicodeFont.family()))
+ document()->charsetMap->insert(unicodeFont.family(), QFont::Unicode);
+
+ initView();
+ initConnections();
+ if (useColorsAndFonts) {
+ initColors();
+ initFonts();
+ }
+}
+
+CHTMLWidget::~CHTMLWidget(){
+ delete m_moduleList;
+ m_moduleList = 0;
+}
+
+/** */
+void CHTMLWidget::initColors(){
+// qDebug("CHTMLWidget::initColors()");
+// setLinkColor( m_config->readColorEntry("Versenumber/URL", &Qt::darkBlue) );
+// QColor textColor = m_config->readColorEntry("Normal Text", &Qt::red);
+ const QColor bgColor = CBTConfig::get(CBTConfig::backgroundColor);
+ setPaper(QBrush(bgColor));
+
+//using a standard text color doesn't work at the moment!
+
+// QPalette p = palette();
+// p.setBrush( QPalette::Active, QColorGroup::Base, QBrush(bgColor) );
+// QColorGroup cg = p.active();
+// p.setColor(QPalette::Active, QColorGroup::Text, textColor);
+// cg.setColor(QColorGroup::Base, bgColor);
+// p.setActive(cg);
+// setPalette(p);
+// refresh();
+}
+
+/** Initializes the fonts of the HTML-widget */
+void CHTMLWidget::initFonts(){
+// ACHTUNG: CBTCONFIG benutzen
+// ConfigGroupSaver groupSaver(m_config, "Fonts");
+// if (document()->charsetMap->contains(font().family())) { //remove old standard font
+// document()->charsetMap->remove(font().family());
+// }
+//
+// QFont f = m_config->readFontEntry(i18n("Display window"));
+// document()->setDefaultFont( f );
+// setFont(f);
+//
+// document()->charsetMap->replace(f.family(), f.charSet());
+}
+
+/** */
+void CHTMLWidget::initView(){
+ m_toolTip = new ToolTip(this);
+ disconnect(dragStartTimer, SIGNAL(timeout()),
+ this, SLOT(startDrag()));
+
+// QStringList paths;
+
+ setAcceptDrops(true);
+ viewport()->setAcceptDrops(true);
+}
+
+
+/** Initializes the connections to SIGNALs */
+void CHTMLWidget::initConnections(){
+ connect( this, SIGNAL( linkClicked( const QString & ) ),
+ this, SLOT( setSource( const QString & ) ) );
+ if (!isReadOnly()) {
+ connect(this, SIGNAL(currentFontChanged(const QFont&)),
+ SLOT(slotCurrentFontChanged(const QFont&)));
+ connect(this, SIGNAL(currentColorChanged(const QColor&)),
+ SLOT(slotCurrentColorChanged(const QColor&)));
+ connect(this, SIGNAL(currentAlignmentChanged(int)),
+ SLOT(slotCurrentAlignementChanged(int)));
+ }
+ else {
+ disconnect(this, SIGNAL(currentFontChanged(const QFont&)),
+ this, SLOT(slotCurrentFontChanged(const QFont&)));
+ disconnect(this, SIGNAL(currentColorChanged(const QColor&)),
+ this, SLOT(slotCurrentColorChanged(const QColor&)));
+ disconnect(this, SIGNAL(currentAlignmentChanged(int)),
+ this, SLOT(slotCurrentAlignementChanged(int)));
+ }
+}
+
+/** Reinitialize the colors, fonts etc. */
+void CHTMLWidget::refresh(){
+// qDebug("CHTMLWidget::refresh()");
+ initColors();
+ initFonts();
+}
+
+/** Loads a HTML file in the widget. */
+void CHTMLWidget::setHTMLSource(const QString& url){
+ if (url.left(1) != "/") { //a filename without path
+ QString myFile = CToolClass::locatehtml( url );
+ if (QFile::exists(myFile)) {
+ KURL kurl(myFile);
+ mimeSourceFactory()->addFilePath( kurl.directory() );
+
+ //read in the HTML file and use setText()
+ QFile file(myFile);
+ if ( file.open(IO_ReadOnly) ) { // file opened successfully
+ QTextStream t( &file ); // use a text stream
+ const QString text = t.read();
+ file.close();
+ setText( text/*, kurl.directory()*/ );
+ }
+ }
+ else
+ setText( i18n("Unable to find the page %1!").arg(url) );
+ }
+ else {
+ if (QFile::exists(url)) {
+ //read in the HTML file and use setText()
+ KURL kurl(url);
+ mimeSourceFactory()->addFilePath( kurl.directory() );
+ QFile file(url);
+ if ( file.open(IO_ReadOnly) ) { // file opened successfully
+ QTextStream t( &file ); // use a text stream
+ const QString text = t.read();
+ file.close();
+ setText( text/*, kurl.directory()*/ );
+ }
+ }
+ }
+}
+
+/** Saves the HTML page */
+void CHTMLWidget::slotSaveAsHTML(){
+ QString file = KFileDialog::getSaveFileName (QString::null, i18n("*.html *.htm *.shtml *.shtm | HTML files\n *.* | All files (*.*)"), 0, i18n("Save text as HTML page ..."));
+ if (!file.isNull())
+ CToolClass::savePlainFile( file, text().utf8());
+}
+
+/** Saves the HTML page */
+void CHTMLWidget::slotSaveAsText(){
+ const QString file = KFileDialog::getSaveFileName (QString::null, i18n("*.txt | Text file (*.txt)\n*.* | All files (*.*)"), 0, i18n("Save text as plain text ..."));
+
+ if (!file.isNull()) {
+ QString html = document()->plainText();
+ CToolClass::savePlainFile( file, html);
+ }
+}
+
+//** */
+void CHTMLWidget::contentsDragEnterEvent(QDragEnterEvent* e){
+ Qt3::QTextEdit::contentsDragEnterEvent(e);
+ e->accept(QTextDrag::canDecode(e));
+}
+
+/** */
+void CHTMLWidget::contentsDragMoveEvent(QDragMoveEvent* e){
+ Qt3::QTextEdit::contentsDragMoveEvent(e);
+ e->accept(QTextDrag::canDecode(e));
+}
+
+/** */
+void CHTMLWidget::contentsDropEvent(QDropEvent* e){
+ QString str;
+ QCString submime;
+
+ if (isReadOnly()) {
+ if ( ( QTextDrag::decode(e,str,submime=BOOKMARK) || QTextDrag::decode(e,str,submime=REFERENCE) ) && !str.isEmpty() ){
+ QString ref = QString::null;
+ QString mod = QString::null;
+ CReferenceManager::decodeReference(str,mod,ref);
+ emit referenceDropped(/*mod,*/ ref);
+ }
+ else
+ e->ignore();
+ }
+ else {
+ QString text = QString::null;
+ if ( ( QTextDrag::decode(e,str,submime=BOOKMARK) || QTextDrag::decode(e,str,submime=REFERENCE) ) && !str.isEmpty() ){
+ QString ref = QString::null;
+ QString mod = QString::null;
+ CReferenceManager::decodeReference(str,mod,ref);
+ CSwordModuleInfo* module = backend()->findModuleByName(mod);
+ if (module) {
+ CSwordKey* key = CSwordKey::createInstance(module);;
+ key->key(ref);
+ text = key->strippedText();
+ delete key;
+ }
+ }
+ else if (QTextDrag::decode(e,str) && !str.isEmpty())
+ text = str;
+
+ if (!text.isEmpty())
+ insert(text);
+ else {
+ e->ignore();
+ }
+ }
+}
+
+
+/** Reimplementation. */
+void CHTMLWidget::contentsMousePressEvent(QMouseEvent* e) {
+ m_pressedPos = e->pos();
+ m_anchor = anchorAt(e->pos());
+ viewport()->setCursor(anchorAt(e->pos()).isEmpty() ? arrowCursor : KCursor::handCursor() );
+ Qt3::QTextEdit::contentsMousePressEvent(e);
+
+ if (!onLink.isEmpty() && (e->button() == RightButton) && m_anchorMenu) { //popup installed menu
+ m_anchorMenu->exec( e->globalPos() );
+ }
+ else if (m_popup && e->button() == RightButton){ //popup normal menu
+ m_selectedWord = false;
+ QString selectedWord = QString::null;
+
+ drawCursor(false);
+ placeCursor(e->pos());
+ ensureCursorVisible();
+ emit cursorPositionChanged(cursor);
+
+ if (selectedText().isEmpty()) {
+ Qt3::QTextCursor c1 = *cursor;
+ Qt3::QTextCursor c2 = *cursor;
+ c1.gotoWordLeft();
+ c2.gotoWordRight();
+ doc->setSelectionStart( Qt3::QTextDocument::Standard, &c1 );
+ doc->setSelectionEnd( Qt3::QTextDocument::Standard, &c2 );
+ *cursor = c2;
+ selectedWord = selectedText();
+ emit cursorPositionChanged(cursor);
+ ensureCursorVisible();
+ repaintChanged();
+ m_selectedWord = true;
+ }
+ m_popup->exec( e->globalPos() );
+ if (m_selectedWord && (selectedWord == selectedText()) ) {
+ m_selectedWord = false;
+ selectAll(false);
+ }
+ }
+}
+
+/** Reimplementation.*/
+void CHTMLWidget::contentsMouseMoveEvent(QMouseEvent* e) {
+ if ( mousePressed ) {
+ if ( mightStartDrag ) { //we might start a drag
+ dragStartTimer->stop();
+ if ( ( e->pos() - dragStartPos ).manhattanLength() > KApplication::startDragDistance() )
+ startDrag();
+ if ( !isReadOnly() )
+ viewport()->setCursor( ibeamCursor );
+ return;
+ }
+ else if (!m_anchor.isEmpty()/*!anchorAt(e->pos()).isEmpty() && !hasSelectedText()*/) {
+ QString module = QString::null;
+ QString key = QString::null;
+ CReferenceManager::Type type;
+ const bool ok = CReferenceManager::decodeHyperlink(m_anchor, module, key, type);
+ if (!ok)
+ return;
+
+ mousePressed = false;
+ inDoubleClick = false;
+ mightStartDrag = false;
+
+ QTextDrag *d = new QTextDrag(CReferenceManager::encodeReference(module,key),viewport());
+ d->setSubtype(REFERENCE);
+ d->setPixmap(REFERENCE_ICON_SMALL);
+ d->drag();
+ return;
+ }
+ mousePos = e->pos();
+ doAutoScroll();
+ oldMousePos = mousePos;
+ }
+
+ if ( !isReadOnly() && !mousePressed ) {
+ if ( doc->hasSelection( Qt3::QTextDocument::Standard ) && doc->inSelection( Qt3::QTextDocument::Standard, e->pos() ) )
+ viewport()->setCursor( arrowCursor );
+ else
+ viewport()->setCursor( ibeamCursor );
+ }
+ if ( isReadOnly() && linksEnabled() ) {
+ Qt3::QTextCursor c = *cursor;
+ placeCursor( e->pos(), &c );
+ if ( c.parag() && c.parag()->at( c.index() ) &&
+ !anchorAt(e->pos()).isEmpty() ) {
+ viewport()->setCursor( pointingHandCursor );
+ onLink = c.parag()->at( c.index() )->format()->anchorHref();
+ QUrl u( doc->context(), onLink, true );
+ m_hoverPos = e->pos();
+ emitHighlighted( u.toString( false, false ) );
+ } else {
+ viewport()->setCursor( isReadOnly() ? arrowCursor : ibeamCursor );
+ onLink = QString::null;
+ emitHighlighted( QString::null );
+ }
+ }
+}
+
+/** Installes a menu which will popup if the right mouse button was pressed on an anchor. */
+void CHTMLWidget::installAnchorMenu( QPopupMenu* anchorMenu ){
+// qDebug("CHTMLWidget::installAnchorMenu( QPopupMenu* anchorMenu )");
+ ASSERT( anchorMenu );
+ m_anchorMenu = anchorMenu;
+}
+
+/** Returns the current anchor. */
+QString CHTMLWidget::getCurrentAnchor(){
+ return anchorAt(m_pressedPos);
+}
+
+/** No descriptions */
+void CHTMLWidget::installPopup( QPopupMenu* popup ){
+ ASSERT(popup);
+ m_popup = popup;
+}
+
+/** Sets the HTML widget editable or not */
+void CHTMLWidget::setReadOnly( const bool readOnly ){
+ m_readOnly = readOnly;
+ initConnections();
+
+ viewport()->setCursor( m_readOnly ? arrowCursor : ibeamCursor );
+ viewport()->update();
+}
+
+/** Returns true if this HTML widget is read only, false if it's editable */
+bool CHTMLWidget::isReadOnly() const {
+ return m_readOnly;
+}
+
+/** This function returns the edit toolbar used for the HTML widget. The items of the toolbar are already connected to the correct slots. */
+void CHTMLWidget::createEditToolbar( KToolBar* bar ){
+ ASSERT(bar);
+ if (!bar)
+ return;
+
+ m_docSaveAction = new KAction(i18n("Save"), ICON_FILE_SAVE, 0, this, SLOT(slotSaveDocument()),bar, "saveDoc_action");
+ m_docSaveAction->setToolTip( TT_PRESENTER_EDIT_SAVE );
+ m_docSaveAction->setWhatsThis( WT_PRESENTER_EDIT_SAVE );
+ m_docSaveAction->plug(bar);
+
+ m_docDeleteAction = new KAction(i18n("Delete"), ICON_FILE_DELETE, 0, this, SIGNAL(sigDeleteDocument()),bar, "deleteDoc_action");
+ m_docDeleteAction->setToolTip( TT_PRESENTER_EDIT_DELETE );
+ m_docDeleteAction->setWhatsThis( WT_PRESENTER_EDIT_DELETE );
+ m_docDeleteAction->plug(bar);
+
+ m_colorChooser = new KColorButton(black, bar);
+ connect(m_colorChooser, SIGNAL(changed(const QColor&)),SLOT(slotSetCurrentColor(const QColor&)));
+ m_fontAction = new KFontAction(i18n("Choose a font:"), 0, bar);
+ connect(m_fontAction, SIGNAL(activated(const QString&)), SLOT(slotSetCurrentFont(const QString&)));
+ m_fontAction->plug(bar);
+
+ m_fontSizeAction = new KFontSizeAction(i18n("Choose font size"), 0, bar);
+ connect(m_fontSizeAction, SIGNAL(fontSizeChanged(int)), SLOT(setPointSize(int)));
+ m_fontSizeAction->plug(bar);
+
+ m_boldAction = new KToggleAction(i18n("Bold"), ICON_EDIT_BOLD,0,this, SLOT(slotToggleBold()), bar);
+ m_boldAction->plug(bar);
+ m_italicAction = new KToggleAction(i18n("Italic"), ICON_EDIT_ITALIC,0, this, SLOT(slotToggleItalic()),bar);
+ m_italicAction->plug(bar);
+ m_underlineAction = new KToggleAction(i18n("Underlined"), ICON_EDIT_UNDER,0, this, SLOT(slotToggleUnderline()),bar);
+ m_underlineAction->plug(bar);
+
+ m_alignLeftAction = new KToggleAction(i18n("Left"), ICON_EDIT_LEFT,0, this, SLOT(slotAlignLeft()),bar);
+ m_alignLeftAction->plug(bar);
+ m_alignCenterAction = new KToggleAction(i18n("Center"), ICON_EDIT_CENTER,0, this, SLOT(slotAlignCenter()),bar);
+ m_alignCenterAction->plug(bar);
+ m_alignRightAction = new KToggleAction(i18n("Right"), ICON_EDIT_RIGHT,0, this, SLOT(slotAlignRight()),bar);
+ m_alignRightAction->plug(bar);
+ m_alignJustifyAction = new KToggleAction(i18n("Justify"), ICON_EDIT_JUST,0, this, SLOT(slotAlignJustify()),bar);
+ m_alignJustifyAction->plug(bar);
+}
+
+/** emit a signal to save the text */
+void CHTMLWidget::slotSaveDocument(){
+ emit sigSaveDocument(text());
+}
+
+/** No descriptions */
+void CHTMLWidget::slotToggleBold(){
+ Qt3::QTextEdit::setBold( !bold() );
+ m_boldAction->setChecked(bold());
+}
+
+/** No descriptions */
+void CHTMLWidget::slotToggleItalic(){
+ Qt3::QTextEdit::setItalic(!italic() );
+ m_italicAction->setChecked(italic());
+}
+
+/** No descriptions */
+void CHTMLWidget::slotToggleUnderline(){
+ Qt3::QTextEdit::setUnderline( !underline() );
+ m_underlineAction->setChecked(underline());
+}
+
+/** No descriptions */
+void CHTMLWidget::slotSetCurrentFontSize( int size ){
+ if (size > 0)
+ setPointSize(size);
+}
+
+void CHTMLWidget::slotSetCurrentFont(const QString& font) {
+ QFont newFont(font, pointSize());
+ newFont.setBold(bold());
+ newFont.setItalic(italic());
+ newFont.setUnderline(underline());
+
+ setFont( newFont );
+}
+
+/** Is calledwhen a new color was selected. */
+void CHTMLWidget::slotSetCurrentColor( const QColor& color){
+ setColor(color);
+}
+
+/** No descriptions */
+void CHTMLWidget::slotCurrentFontChanged( const QFont& f){
+ m_fontAction->setFont( f.family() );
+ m_fontSizeAction->setFontSize( f.pointSize() );
+
+ m_boldAction->setChecked( f.bold() );
+ m_italicAction->setChecked( f.italic() );
+ m_underlineAction->setChecked( f.underline() );
+}
+
+/** No descriptions */
+void CHTMLWidget::slotCurrentColorChanged( const QColor& c){
+ m_colorChooser->setColor(c);
+}
+
+/** No descriptions */
+void CHTMLWidget::slotCurrentAlignementChanged(int a){
+ m_alignLeftAction->setChecked( (a == AlignLeft) || (a == Qt3::AlignAuto) );
+ m_alignCenterAction->setChecked( a == AlignHCenter );
+ m_alignRightAction->setChecked( a == AlignRight );
+ m_alignJustifyAction->setChecked( a == Qt3::AlignJustify );
+}
+
+/** No descriptions */
+void CHTMLWidget::slotAlignLeft(){
+ m_alignLeftAction->setChecked(true);
+ m_alignCenterAction->setChecked(false);
+ m_alignRightAction->setChecked(false);
+ m_alignJustifyAction->setChecked(false);
+
+ setAlignment(AlignLeft);
+}
+
+/** No descriptions */
+void CHTMLWidget::slotAlignCenter(){
+ m_alignLeftAction->setChecked(false);
+ m_alignCenterAction->setChecked(true);
+ m_alignRightAction->setChecked(false);
+ m_alignJustifyAction->setChecked(false);
+
+ setAlignment(AlignHCenter);
+}
+
+/** No descriptions */
+void CHTMLWidget::slotAlignRight(){
+ m_alignLeftAction->setChecked(false);
+ m_alignCenterAction->setChecked(false);
+ m_alignRightAction->setChecked(true);
+ m_alignJustifyAction->setChecked(false);
+
+ setAlignment(AlignRight);
+}
+
+/** No descriptions */
+void CHTMLWidget::slotAlignJustify(){
+ m_alignLeftAction->setChecked(false);
+ m_alignCenterAction->setChecked(false);
+ m_alignRightAction->setChecked(false);
+ m_alignJustifyAction->setChecked(true);
+
+ setAlignment(Qt3::AlignJustify);
+}
+
+/** No descriptions */
+void CHTMLWidget::slotSelectAll(){
+ selectAll(false);//workaround
+ selectAll(true);
+}
+
+/** Returns true if the links are enabled. */
+bool CHTMLWidget::linksEnabled() const {
+ return true;
+}
+
+/** Reimplementation from QTextView. */
+void CHTMLWidget::emitLinkClicked( const QString& link){
+ if (link.left(7) == QString::fromLatin1("mailto:")) {
+ qDebug("open mailer for %s", link.mid(7).latin1());
+ KApplication::kApplication()->invokeMailer(link.mid(7), QString::null);
+ return;
+ }
+
+ if (CReferenceManager::isHyperlink(link)) {
+ QString ref;
+ QString module;
+ CReferenceManager::Type type;
+ CReferenceManager::decodeHyperlink(link, module, ref, type);
+ CSwordModuleInfo* m = backend()->findModuleByName(module);
+ CSwordKey* key = CSwordKey::createInstance(m);
+ if (key) {
+ emit referenceClicked(module, key->key(ref));
+ delete key;
+ }
+ }
+ else {
+ QString url = link;
+ if (link.left(1) == "/")
+ url = link.mid(1);
+ emit linkClicked(url);
+ }
+}
+
+/** Copies the displayed document into the clipboard. */
+void CHTMLWidget::copyDocument(){
+ if (!document()->text().isEmpty()) {
+ QClipboard* cb = KApplication::clipboard();
+ cb->setText(document()->plainText());
+ }
+}
+
+/** Sets the source of this widget. */
+void CHTMLWidget::setSource(const QString& name){
+ if ( isVisible() )
+ qApp->setOverrideCursor( waitCursor );
+ QString source = name;
+ QString mark;
+ int hash = name.find('#');
+ if ( hash != -1) {
+ source = name.left( hash );
+ mark = name.mid( hash+1 );
+ }
+ if ( source.left(5) == "file:" )
+ source = source.mid(6);
+
+ QString url = mimeSourceFactory()->makeAbsolute( source, context() );
+ QString txt;
+ bool dosettext = false;
+
+ if ( !source.isEmpty()/* && url != d->curmain */) {
+ const QMimeSource* m = mimeSourceFactory()->data( source, context() );
+ if ( !m )
+ qWarning("CHTMLWidget: no mimesource for %s", source.latin1() );
+ else if ( !QTextDrag::decode( m, txt ) )
+ qWarning("CHTMLWidget: cannot decode %s", source.latin1() );
+ dosettext = true;
+ }
+ if ( !mark.isEmpty() ) {
+ url += "#";
+ url += mark;
+ }
+ if ( dosettext )
+ setText( txt, url );
+
+ if ( isVisible() && !mark.isEmpty() )
+ scrollToAnchor( mark );
+ else
+ setContentsPos( 0, 0 );
+ if ( isVisible() )
+ qApp->restoreOverrideCursor();
+}
+
+/** Is called if a link was highlighted. Normally a signal should be emitted. */
+void CHTMLWidget::emitHighlighted( const QString& s ){
+}
+
+/** Returns the document used by this widget */
+Qt3::QTextDocument* CHTMLWidget::getDocument() const{
+ return Qt3::QTextEdit::document();
+}
+
+/** Places the cursor at position pos */
+void CHTMLWidget::placeCursor( const QPoint &pos, Qt3::QTextCursor *c ){
+ Qt3::QTextEdit::placeCursor(pos, c);
+}
+
+/** Returns a list of modules which are used by the display window which uses this HTML widget. */
+ListCSwordModuleInfo& CHTMLWidget::modules() const {
+ if (m_moduleList)
+ return *m_moduleList;
+}
+
+/** Sets the list of modules used by the display window which uses this widget. */
+void CHTMLWidget::setModules( ListCSwordModuleInfo& modules ) {
+ *m_moduleList = modules; //copy entries
+ //add data path of all modules tom our config
+ for (m_moduleList->first(); m_moduleList->current(); m_moduleList->next()) {
+ const QString path = m_moduleList->current()->config(CSwordModuleInfo::AbsoluteDataPath);
+ mimeSourceFactory()->addFilePath( path );
+ };
+}
diff --git a/bibletime/frontend/chtmlwidget.h b/bibletime/frontend/chtmlwidget.h
new file mode 100644
index 0000000..7ed504c
--- /dev/null
+++ b/bibletime/frontend/chtmlwidget.h
@@ -0,0 +1,291 @@
+/***************************************************************************
+ chtmlwidget.h - description
+ -------------------
+ begin : Sun Feb 27 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CHTMLWIDGET_H
+#define CHTMLWIDGET_H
+
+//BibleTime includes
+#include "cpointers.h"
+#include "backend/cswordbackend.h"
+
+#define private public // It's a really bad hack, but I don't know how to do it in another way
+#include "thirdparty/qt3stuff/qtextedit.h"
+#undef private
+
+//Qt includes
+#include <qwidget.h>
+#include <qguardedptr.h>
+#include <qtooltip.h>
+
+class CHTMLDialog;
+class CBiblePresenter;
+class KPopupMenu;
+class KAction;
+class KToggleAction;
+class KFontSizeAction;
+class KToolBar;
+class QToolButton;
+class KFontAction;
+class QComboBox;
+class KColorButton;
+
+
+/** This widget enhances the KHTMLWidget to support BibleTime's colour
+ * management and to support verse references and the like.
+ * @author The BibleTime Team
+ */
+class CHTMLWidget : public Qt3::QTextEdit, public CPointers {
+ Q_OBJECT
+ friend class CHTMLDialog;
+
+public:
+ /**
+ * The constructor of the CHTMLWidget class.
+ * @param useColorsAndFonts Set this to false if you don't want to use the standard colorsa dnfonts defined in the optionsdialog of BibleTime
+ */
+ CHTMLWidget(const bool useColorsAndFonts = true, QWidget *parent=0, const char *name=0);
+ virtual ~CHTMLWidget();
+ /**
+ * Reinitialize the colors, fonts etc.
+ */
+ virtual void refresh();
+ /**
+ * Loads a HTML file in the widget.
+ */
+ virtual void setHTMLSource(const QString& url);
+ /**
+ * Installes a menu which will popup if the right mouse button was pressed on an anchor.
+ */
+ virtual void installAnchorMenu( QPopupMenu* );
+ /**
+ * Returns the current anchor.
+ */
+ virtual QString getCurrentAnchor();
+ /**
+ * No descriptions
+ */
+ void installPopup( QPopupMenu* popup);
+ /**
+ * Returns true if this HTML widget is read only, false if it's editable
+ */
+ virtual bool isReadOnly() const;
+ /**
+ * Sets the HTML widget ediatable or not
+ */
+ virtual void setReadOnly( const bool readOnly = true);
+ /**
+ * This function returns the edit toolbar used for the HTML widget.
+ * The items of the toolbar are already connected to the correct slots.
+ */
+ void createEditToolbar( KToolBar* bar );
+ /**
+ * Returns the document used by this widget
+ */
+ virtual Qt3::QTextDocument* getDocument() const;
+ /**
+ * Places the cursor at position pos
+ */
+ virtual void placeCursor( const QPoint &pos, Qt3::QTextCursor *c = 0);
+ /**
+ * Sets the list of modules used by the display window which uses this widget.
+ */
+ void setModules( ListCSwordModuleInfo& modules ) ;
+ /**
+ * Returns a list of modules which are used by the display window which uses this HTML widget.
+ */
+ ListCSwordModuleInfo& modules() const;
+
+ QPoint m_pressedPos;
+
+public slots: // Public slots
+ /**
+ * Saves the HTML page
+ */
+ void slotSaveAsHTML();
+ /**
+ * Saves the plain text page
+ */
+ void slotSaveAsText();
+ /**
+ * Copies the displayed document into the clipboard.
+ */
+ void copyDocument();
+ /**
+ * Sets the source of this widget.
+ */
+ void setSource(const QString& name);
+
+
+protected: // Protected attributes
+ /*
+ * Initializes the colors of this widget (backgrouznd, links, text)
+ */
+ void initColors();
+ /**
+ * Initializes the fonts of the HTML-widget
+ */
+ void initFonts();
+ /**
+ * Initializes the connections to SIGNALs
+ */
+ void initConnections();
+ /**
+ * Initializes the view of this widget (childs, popups etc.)
+ */
+ void initView();
+ /**
+ * Reimplementation.
+ */
+ virtual void contentsDragEnterEvent(QDragEnterEvent* e);
+ /**
+ * Reimplementation.
+ */
+ virtual void contentsDragMoveEvent (QDragMoveEvent* e);
+ /**
+ * Reimplementation.
+ */
+ virtual void contentsDropEvent(QDropEvent* e);
+ /**
+ * Reimplementation.
+ */
+ virtual void contentsMousePressEvent(QMouseEvent* e);
+ /**
+ * Reimplementation.
+ */
+ virtual void contentsMouseMoveEvent(QMouseEvent* e);
+ /**
+ * Returns true if the links are enabled.
+ */
+ virtual bool linksEnabled() const;
+
+protected slots: // Protected slots
+ /**
+ * No descriptions
+ */
+ void slotSaveDocument();
+ /**
+ * No descriptions
+ */
+ void slotToggleBold();
+ /**
+ * No descriptions
+ */
+ void slotToggleItalic();
+ /**
+ * No descriptions
+ */
+ void slotToggleUnderline();
+ /**
+ *
+ */
+ void slotSetCurrentFont(const QString& font);
+ /**
+ *
+ */
+ void slotSetCurrentFontSize( int );
+ /**
+ *
+ */
+ void slotSetCurrentColor( const QColor& color);
+ /**
+ * No descriptions
+ */
+ void slotCurrentColorChanged( const QColor& );
+ /**
+ * No descriptions
+ */
+ void slotCurrentFontChanged( const QFont& );
+ /**
+ * No descriptions
+ */
+ void slotCurrentAlignementChanged( int );
+ /**
+ * No descriptions
+ */
+ void slotAlignRight();
+ /**
+ * No descriptions
+ */
+ void slotAlignCenter();
+ /**
+ * No descriptions
+ */
+ void slotAlignLeft();
+ /**
+ * No descriptions
+ */
+ void slotAlignJustify();
+ /**
+ * No descriptions
+ */
+ void slotSelectAll();
+
+private:
+ virtual void emitLinkClicked( const QString& s);
+ virtual void emitHighlighted( const QString& s);
+
+ class ToolTip : public QToolTip, public CPointers {
+ public:
+ ToolTip(QWidget* parent);
+ void maybeTip( const QPoint &pos);
+ };
+ ToolTip* m_toolTip;
+
+ bool m_readOnly;
+ bool m_selectedWord;
+ QString m_anchor;
+
+
+ QPopupMenu* m_popup;
+ QGuardedPtr<QPopupMenu> m_anchorMenu;
+
+ KAction* m_docDeleteAction;
+ KAction* m_docSaveAction;
+
+ KToggleAction* m_boldAction;
+ KToggleAction* m_italicAction;
+ KToggleAction* m_underlineAction;
+
+ KToggleAction* m_alignLeftAction;
+ KToggleAction* m_alignCenterAction;
+ KToggleAction* m_alignRightAction;
+ KToggleAction* m_alignJustifyAction;
+
+ KFontSizeAction* m_fontSizeAction;
+ KFontAction* m_fontAction;
+ KColorButton* m_colorChooser;
+ QPoint m_hoverPos;
+
+ ListCSwordModuleInfo* m_moduleList;
+
+signals: // Signals
+ void sigDeleteDocument();
+ void sigSaveDocument(const QString);
+ /**
+ * First parameter is the module, the second the key.
+ */
+ void referenceClicked(const QString& module, const QString& key);
+ /**
+ * First parameter is the module, the second the key.
+ */
+ void referenceDropped(const QString& key);
+ void linkClicked(const QString&);
+ void insertReference(const QString& reference);
+};
+
+
+#endif
diff --git a/bibletime/frontend/cinputdialog.cpp b/bibletime/frontend/cinputdialog.cpp
new file mode 100644
index 0000000..77ab827
--- /dev/null
+++ b/bibletime/frontend/cinputdialog.cpp
@@ -0,0 +1,103 @@
+/***************************************************************************
+ cinputdialog.cpp - description
+ -------------------
+ begin : Sun May 13 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//own includes
+#include "cinputdialog.h"
+
+//Qt includes
+#include <qwidget.h>
+#include <qlabel.h>
+#include <qmultilineedit.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+
+//KDE includes
+#include <klocale.h>
+#include <kseparator.h>
+
+CInputDialog::CInputDialog(const QString& caption, const QString& description, const QString& text, QWidget *parent, const char *name, const bool modal ) : KDialog(parent,name,modal) {
+ setPlainCaption(caption);
+
+ QVBoxLayout* topLayout = new QVBoxLayout(this, 5,5);
+
+ QLabel* l = new QLabel(description, this);
+ topLayout->addWidget(l);
+
+ topLayout->addSpacing(10);
+
+ m_editWidget = new QMultiLineEdit(this, "edit widget");
+ m_editWidget->setWordWrap( QMultiLineEdit::WidgetWidth);
+ m_editWidget->setText(text);
+ if (!text.isEmpty())
+ m_editWidget->selectAll();
+
+ topLayout->addWidget(m_editWidget);
+
+ KSeparator* separator = new KSeparator(KSeparator::HLine, this);
+ topLayout->addWidget(separator);
+
+ QHBoxLayout* buttonLayout = new QHBoxLayout(topLayout);
+
+ buttonLayout->addStretch(2);
+
+ QPushButton* cancel = new QPushButton(this);
+ cancel->setText(i18n("Cancel"));
+ connect(cancel, SIGNAL(clicked()), SLOT(reject()));
+ buttonLayout->addWidget(cancel,1);
+
+ buttonLayout->addSpacing(15);
+
+ QPushButton* clear = new QPushButton(this);
+ clear->setText(i18n("Clear"));
+ connect(clear, SIGNAL(clicked()),m_editWidget, SLOT(clear()));
+ buttonLayout->addWidget(clear,1);
+
+ buttonLayout->addSpacing(15);
+
+ QPushButton* ok = new QPushButton(this);
+ ok->setText(i18n("Ok"));
+ connect(ok, SIGNAL(clicked()), SLOT(accept()));
+ buttonLayout->addWidget(ok,1);
+
+ m_editWidget->setFocus();
+}
+
+CInputDialog::~CInputDialog(){
+}
+
+/** Returns the text entered at the moment. */
+const QString CInputDialog::text() {
+ ASSERT(m_editWidget);
+ return m_editWidget->text();
+}
+
+/** A static function to get some using CInputDialog. */
+const QString CInputDialog::getText( const QString& caption, const QString& description, const QString& text, bool* ok, QWidget* parent, bool modal){
+ qDebug("CInputDialog::getText( const QString& caption, const QString& description, const QString& text, bool* ok, QWidget* parent, bool modal)");
+ ASSERT(ok);
+
+ CInputDialog* dlg = new CInputDialog(caption, description, text, parent, "", modal);
+ QString ret = QString::null;
+
+ const bool isOk = (dlg->exec() == CInputDialog::Accepted);
+ if (isOk)
+ ret = dlg->text();
+ if (ok)
+ *ok = isOk;
+ delete dlg;
+ return ret;
+}
diff --git a/bibletime/frontend/cinputdialog.h b/bibletime/frontend/cinputdialog.h
new file mode 100644
index 0000000..7b3b4b0
--- /dev/null
+++ b/bibletime/frontend/cinputdialog.h
@@ -0,0 +1,49 @@
+/***************************************************************************
+ cinputdialog.h - description
+ -------------------
+ begin : Sun May 13 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CINPUTDIALOG_H
+#define CINPUTDIALOG_H
+
+//KDE includes
+#include <kdialog.h>
+
+class QMultiLineEdit;
+class QWidget;
+
+/** This is a small input dialog with
+ * a multiline edit for the text input.
+ * @author The BibleTime team
+ */
+class CInputDialog : public KDialog {
+ Q_OBJECT
+public:
+ CInputDialog(const QString& caption, const QString& description, const QString& text, QWidget *parent=0, const char *name=0, const bool modal = true);
+ /**
+ * A static function to get some using CInputDialog.
+ */
+ static const QString getText( const QString& caption, const QString& description, const QString& text = QString::null, bool* ok = 0, QWidget* parent = 0, bool modal = true);
+ /**
+ * Returns the text entered at the moment.
+ */
+ const QString text();
+ ~CInputDialog();
+
+private:
+ QMultiLineEdit* m_editWidget;
+};
+
+#endif
diff --git a/bibletime/frontend/cmdiarea.cpp b/bibletime/frontend/cmdiarea.cpp
new file mode 100644
index 0000000..960a082
--- /dev/null
+++ b/bibletime/frontend/cmdiarea.cpp
@@ -0,0 +1,284 @@
+/***************************************************************************
+ cmdiarea.cpp - description
+ -------------------
+ begin : Wed Jan 19 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cmdiarea.h"
+#include "backend/cswordmoduleinfo.h"
+#include "backend/cswordversekey.h"
+#include "presenters/cbiblepresenter.h"
+#include "presenters/clexiconpresenter.h"
+#include "presenters/ccommentarypresenter.h"
+#include "keychooser/ckeychooser.h"
+#include "resource.h"
+#include "whatsthisdef.h"
+#include "config.h"
+
+//KDE includes
+#include <kpopupmenu.h>
+#include <kapp.h>
+#include <klocale.h>
+
+//QT includes
+#include <qobjectlist.h>
+#include <qtimer.h>
+#include <qevent.h>
+#include <qwhatsthis.h>
+
+CMDIArea::CMDIArea(QWidget *parent, const char *name )
+ : QWorkspace(parent, name) {
+ m_childEvent = false;
+ guiOption = Nothing;
+ m_appCaption = QString::null;
+
+ initView();
+ initConnections();
+ readSettings();
+}
+
+CMDIArea::~CMDIArea(){
+}
+
+/** Initializes the view of the MDI area */
+void CMDIArea::initView(){
+ QWhatsThis::add(this, WT_MDI_AREA_WIDGET );
+}
+
+/** Initilizes the connectiosn to SIGNALS */
+void CMDIArea::initConnections(){
+ connect(this, SIGNAL(windowActivated(QWidget*)),
+ this, SLOT(slotClientActivated(QWidget*)));
+}
+
+/** Called whan a client window was activated */
+void CMDIArea::slotClientActivated(QWidget* client){
+// qWarning("slotClientActivated(QWidget* client)");
+ if (!client)
+ return;
+ CSwordPresenter* sp = dynamic_cast<CSwordPresenter*>(client);
+ if (sp && !sp->initialized())
+ return;
+
+ m_appCaption = client->caption().stripWhiteSpace();
+// qWarning("caption is %s", m_appCaption.latin1());
+ emit sigSetToplevelCaption( m_appCaption );
+
+ CBiblePresenter* p = dynamic_cast<CBiblePresenter*>(client);
+ if (p && p->keyChooser())
+ syncCommentaries( p->keyChooser()->key() );
+}
+
+/** Reimplementation. Used to make use of the fixedGUIOption part. */
+void CMDIArea::childEvent ( QChildEvent * e ){
+ if (m_childEvent)
+ return;
+ QWorkspace::childEvent(e);
+ m_childEvent = true;
+
+ if (!windowList().count()) {
+ m_appCaption = QString::null;
+ emit sigSetToplevelCaption( KApplication::kApplication()->makeStdCaption(m_appCaption) );
+ emit sigLastPresenterClosed();
+ }
+ if (!e) {
+ m_childEvent = false;
+ return;
+ }
+
+ if (e->inserted() || e->removed()) {
+ switch (guiOption) {
+ case autoTile:
+ QTimer::singleShot( 0, this, SLOT(tile()) );
+// tile();
+ break;
+ case autoCascade:
+ QTimer::singleShot( 0, this, SLOT(cascade()) );
+// cascade();
+ break;
+ default:
+ break;
+ }
+ }
+
+ m_childEvent = false;
+}
+
+/** Reimplementation */
+void CMDIArea::resizeEvent(QResizeEvent* e){
+ QWorkspace::resizeEvent(e);
+ switch (guiOption) {
+ case autoTile:
+ QTimer::singleShot( 0, this, SLOT(tile()) );
+// tile();
+ break;
+ case autoCascade:
+ QTimer::singleShot( 0, this, SLOT(cascade()) );
+// cascade();
+ break;
+ default:
+ break;
+ }
+}
+
+/** */
+void CMDIArea::saveSettings(){
+}
+
+/** */
+void CMDIArea::readSettings(){
+}
+
+/** Deletes all the presenters in the MDI area. */
+void CMDIArea::deleteAll(){
+ QWidgetList windows = windowList();
+
+ setUpdatesEnabled(false);
+ for ( QWidget* w = windows.first(); w; w = windows.next() ) {
+ w->setUpdatesEnabled(false);
+ m_deleteWindows.clear();
+ delete w;
+ }
+ setUpdatesEnabled(true);
+}
+
+/** Enable / disable autoCascading */
+void CMDIArea::setGUIOption( mdiOption new_GUIOption){
+ guiOption = new_GUIOption;
+ //now do the initial action
+ switch (guiOption) {
+ case autoTile:
+ tile();
+ break;
+ case autoCascade:
+ cascade();
+ break;
+ case Nothing:
+ break;
+ }
+}
+
+/** */
+void CMDIArea::tile(){
+ if (!isUpdatesEnabled() || !windowList().count() )
+ return;
+ if (windowList().count() == 1 /*&& !windowList().at(0)->isHidden() && !windowList().at(0)->isMinimized()*/) {
+ m_appCaption = windowList().at(0)->caption();
+ windowList().at(0)->showMaximized();
+ }
+ else
+ QWorkspace::tile();
+}
+
+/** */
+void CMDIArea::cascade(){
+ if (!isUpdatesEnabled() || !windowList().count() )
+ return;
+ if (windowList().count() == 1 /*&& !windowList().at(0)->isHidden() && !windowList().at(0)->isMinimized()*/) {
+ m_appCaption = windowList().at(0)->caption();
+ windowList().at(0)->showMaximized();
+ }
+ else
+ QWorkspace::cascade();
+}
+
+/** Sync the commentaries to the given key. */
+void CMDIArea::syncCommentaries(CSwordKey* syncKey){
+ QWidgetList windows = windowList();
+ if (!windows.count())
+ return;
+
+ for (windows.first(); windows.current(); windows.next()) {
+ CCommentaryPresenter* p = dynamic_cast<CCommentaryPresenter*>(windows.current());
+ if (p)
+ p->synchronize(syncKey);
+ }
+}
+
+/** Look up the text in the module. If the module has already a display window of it opne use it, otherwise create a new one. */
+void CMDIArea::lookupInLexicon(const QString& text, const QString& module){
+// qWarning("CMDIArea::lookupInLexicon(const QString& text, const QString& module)");
+ CSwordModuleInfo* m = backend()->findModuleByName(module);
+ ASSERT(m);
+ if (!m)
+ return;
+ CLexiconPresenter* p = 0;
+
+ QWidgetList windows = windowList();
+ if (!windows.count())
+ return;
+ bool found = false;
+ for (windows.first(); windows.current(); windows.next()) {
+ p = dynamic_cast<CLexiconPresenter*>(windows.current());
+ if (p && (m == p->getModuleList().first())) {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ emit createNewSwordPresenter(m, text);
+ else
+ p->lookup(module, text);
+}
+
+/** Look up the text in the module. If the module has already a display window of it opne use it, otherwise create a new one. */
+void CMDIArea::lookupInModule(const QString& module, const QString& key){
+// qWarning("CMDIArea::lookupInLexicon(const QString& text, const QString& module)");
+ CSwordModuleInfo* m = backend()->findModuleByName(module);
+ if (!m)
+ return;
+ CSwordPresenter* p = 0;
+
+ bool found = false;
+ QWidgetList windows = windowList();
+ for (windows.first(); windows.current(); windows.next()) {
+ p = dynamic_cast<CSwordPresenter*>(windows.current());
+ if (p && (p->getModuleList().containsRef(m))) {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ emit createNewSwordPresenter(m, key);
+ else
+ p->lookup(module, key);
+}
+
+/** Closes and deletes the presenter given as argument. */
+void CMDIArea::closePresenter(CSwordPresenter* p){
+ if (!p)
+ return;
+
+ m_deleteWindows.append(p);
+ QTimer::singleShot(5000, this, SLOT(deleteCurrentPresenter()) );
+}
+
+/** Delete the presenter. */
+void CMDIArea::deleteCurrentPresenter(){
+ setUpdatesEnabled(false);
+ CSwordPresenter* p = m_deleteWindows.first();
+// if ( p ) {
+ delete p;
+ m_deleteWindows.removeRef(p);
+// }
+ setUpdatesEnabled(true);
+ slotClientActivated(activeWindow());
+ if (activeWindow())
+ m_appCaption = activeWindow()->caption();
+}
+
+/** This works around a problem/limitation in QWorkspace. QWorkspace sets every time the application caption on its on way. This confuses BibleTime - wrong captions are generated. This function returns the right caption (using the MDI child). */
+const QString CMDIArea::currentApplicationCaption() const {
+ return m_appCaption;
+}
diff --git a/bibletime/frontend/cmdiarea.h b/bibletime/frontend/cmdiarea.h
new file mode 100644
index 0000000..a1816f5
--- /dev/null
+++ b/bibletime/frontend/cmdiarea.h
@@ -0,0 +1,143 @@
+/***************************************************************************
+ cmdiarea.h - description
+ -------------------
+ begin : Wed Jan 19 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CMDIAREA_H
+#define CMDIAREA_H
+
+#include "cpointers.h"
+
+#define private protected
+#include <qworkspace.h>
+#undef private
+
+#include <qlist.h>
+#include <qstrlist.h>
+#include <qevent.h>
+
+class KPopupMenu;
+class CSwordModuleInfo;
+class CSwordPresenter;
+class CSwordKey;
+
+/** The MDI widget we use in BibleTime.
+ * Enhances QWorkspace.
+ * @author The BibleTime Team
+ */
+class CMDIArea : public QWorkspace, public CPointers {
+ Q_OBJECT
+
+public:
+ /**
+ * The options you can set for this widget.
+ */
+ enum mdiOption {
+ autoTile,
+ autoCascade,
+ Nothing
+ };
+ CMDIArea(QWidget *parent=0, const char *name = 0 );
+ ~CMDIArea();
+ /**
+ */
+ void readSettings();
+ /**
+ */
+ void saveSettings();
+ /**
+ * Enable / disable autoCascading
+ */
+ void setGUIOption( mdiOption );
+ /** This works around a problem/limitation in QWorkspace. QWorkspace sets every time the
+ * application caption on its on way. This confuses BibleTime - wrong captions are generated.
+ * This function returns the right caption (using the MDI child).
+ */
+ const QString currentApplicationCaption() const;
+
+public slots:
+ /**
+ * Called whan a client window was activated
+ */
+ void slotClientActivated(QWidget* client);
+ /**
+ * Deletes all the presenters in the MDI area.
+ */
+ void deleteAll();
+ /**
+ *
+ */
+ void cascade();
+ /**
+ *
+ */
+ void tile();
+ /**
+ * Sync the commentaries to the given key.
+ */
+ void syncCommentaries(CSwordKey* syncKey);
+ /**
+ * Look up the text in the module. If the module has already a display window
+ * of it opne use it, otherwise create a new one.
+ */
+ void lookupInLexicon(const QString& text, const QString& module);
+ void lookupInModule(const QString& module, const QString& key);
+ /**
+ * Closes and deletes the presenter given as argument.
+ */
+ void closePresenter(CSwordPresenter* p);
+
+protected: // Protected methods
+ /**
+ * Used to make use of the fixedGUIOption part.
+ */
+ virtual void childEvent (QChildEvent * e);
+ /**
+ * Reimplementation
+ */
+ virtual void resizeEvent(QResizeEvent* e);
+ /**
+ * Initializes the connectiosn to SIGNALS
+ */
+ void initConnections();
+ /**
+ * Initializes the view of the MDI area
+ */
+ void initView();
+
+signals: // Signals
+ /**
+ * Emits a signal to set the acption of the toplevel widget.
+ */
+ void sigSetToplevelCaption(const QString&);
+ /**
+ * Is emitted when the last presenter was closed.
+ */
+ void sigLastPresenterClosed();
+ void createNewSwordPresenter(CSwordModuleInfo*, const QString&);
+
+private:
+ mdiOption guiOption;
+ bool m_childEvent;
+ QList<CSwordPresenter> m_deleteWindows;
+ QString m_appCaption;
+
+private slots: // Private slots
+ /**
+ * Delete the presenter.
+ */
+ void deleteCurrentPresenter();
+};
+#endif
diff --git a/bibletime/frontend/coptionsdialog.cpp b/bibletime/frontend/coptionsdialog.cpp
new file mode 100644
index 0000000..c0d8491
--- /dev/null
+++ b/bibletime/frontend/coptionsdialog.cpp
@@ -0,0 +1,806 @@
+/***************************************************************************
+ coptionsdialog.cpp - description
+ -------------------
+ begin : Wed Jan 19 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "coptionsdialog.h"
+#include "cprofile.h"
+#include "ctoolclass.h"
+#include "presenters/cswordpresenter.h"
+#include "presenters/cbiblepresenter.h"
+#include "presenters/ccommentarypresenter.h"
+#include "presenters/clexiconpresenter.h"
+#include "presenters/cbookpresenter.h"
+#include "resource.h"
+#include "whatsthisdef.h"
+#include "backend/cswordbackend.h"
+#include "backend/cswordmoduleinfo.h"
+#include "cbtconfig.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+//QT includes
+#include <qhbox.h>
+#include <qlayout.h>
+#include <qvbox.h>
+#include <qdict.h>
+#include <qcheckbox.h>
+#include <qbuttongroup.h>
+#include <qhbuttongroup.h>
+#include <qradiobutton.h>
+#include <qcolor.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qstringlist.h>
+#include <qinputdialog.h>
+#include <qdir.h>
+
+
+//KDE includes
+#include <kapp.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kstddirs.h>
+#include <kkeydialog.h>
+#include <kiconloader.h>
+#include <ktabctl.h>
+#include <kapp.h>
+#include <klistbox.h>
+#include <kkeydialog.h>
+
+//Sword includes
+#include <localemgr.h>
+
+COptionsDialog::COptionsDialog(QWidget *parent, const char *name, KAccel* accel )
+ : KDialogBase(IconList, i18n("Optionsdialog"), Ok | Cancel | Apply, Ok, parent, name, true, true, QString::null, QString::null, QString::null) {
+
+ m_settings.keys.application.accel = accel;
+ setIconListAllVisible(true);
+
+ initStartup();
+ initFonts();
+ initColors();
+ initProfiles();
+ initSword();
+ initAccelerators();
+}
+
+/** */
+void COptionsDialog::newDisplayWindowFontSelected(const QFont &newFont){
+ m_settings.fonts.fontMap.replace(m_settings.fonts.usage->currentText(), newFont);
+}
+
+/** Called when the combobox contents is changed */
+void COptionsDialog::newDisplayWindowFontAreaSelected(const QString& usage){
+ m_settings.fonts.fontChooser->setFont( m_settings.fonts.fontMap[usage] );
+}
+
+/** Called if the OK button was clicked */
+void COptionsDialog::slotOk(){
+ saveAccelerators();
+ saveColors();
+ saveFonts();
+ saveSword();
+ saveStartup();
+ saveProfiles();
+
+ KDialogBase::slotOk();
+
+ emit signalSettingsChanged( );
+}
+
+/*called if the apply button was clicked*/
+void COptionsDialog::slotApply(){
+ saveAccelerators();
+ saveColors();
+ saveFonts();
+ saveSword();
+ saveStartup();
+ saveProfiles();
+
+ KDialogBase::slotApply();
+
+ emit signalSettingsChanged( );
+}
+
+/** Adds a new view profile to the list. */
+void COptionsDialog::addNewProfile(){
+ bool ok = false;
+ QString name = QInputDialog::getText(i18n("Create new profile"), i18n("Please enter the name of the new profile"), QString::null, &ok);
+ if (ok && !name.isEmpty()) {
+ m_settings.profiles.mgr.create(name);
+ m_settings.profiles.profiles->insertItem(name);
+ if (m_settings.profiles.profiles->count() == 1)
+ m_settings.profiles.profiles->setEnabled(true);
+ }
+}
+
+/** No descriptions */
+void COptionsDialog::deleteProfile(){
+ const QString profile = m_settings.profiles.profiles->currentText();
+ m_settings.profiles.mgr.remove(profile);
+ m_settings.profiles.profiles->removeItem( m_settings.profiles.profiles->currentItem() );
+}
+
+/** Renames the currently selected profile. */
+void COptionsDialog::renameProfile(){
+ bool ok = false;
+ const QString currentProfile = m_settings.profiles.profiles->currentText();
+ CProfile* profile = m_settings.profiles.mgr.profile(currentProfile);
+ if (!profile)
+ return;
+
+ const QString newName = QInputDialog::getText(i18n("Rename profile"), i18n("Please enter the new name of the profile"),profile->name(), &ok);
+ if (ok && !newName.isEmpty()) {
+ profile->setName(newName);
+ m_settings.profiles.profiles->changeItem(newName, m_settings.profiles.profiles->currentItem());
+ }
+}
+
+/** Opens the page which contaisn the given part ID. */
+const bool COptionsDialog::showPart( COptionsDialog::Parts ID ){
+ bool ret = false;
+ switch (ID) {
+ case COptionsDialog::ViewProfiles:
+ if(showPage(pageIndex(
+ m_settings.profiles.profiles->parentWidget()) ))
+ ret = true;
+ break;
+ default:
+ break;
+ }
+ return ret;
+}
+
+/** Initializes the startup section of the OD. */
+void COptionsDialog::initStartup(){
+ QFrame* page = addPage(i18n("Startup"), QString::null, OD_ICON_GENERAL);
+ QVBoxLayout* layout = new QVBoxLayout(page,5);
+ {//daily tips
+ m_settings.startup.showTips = new QCheckBox(page);
+ m_settings.startup.showTips->setText(i18n("Show tip of the day"));
+ QToolTip::add(m_settings.startup.showTips, TT_OD_GENERAL_DAILY_TIP);
+ QWhatsThis::add(m_settings.startup.showTips, WT_OD_GENERAL_DAILY_TIP);
+
+ m_settings.startup.showTips->setChecked( CBTConfig::get(CBTConfig::tips) );
+ }
+ layout->addWidget(m_settings.startup.showTips);
+
+ { //startup logo
+ m_settings.startup.showLogo = new QCheckBox(page);
+ m_settings.startup.showLogo->setText(i18n("Show startuplogo"));
+ QWhatsThis::add(m_settings.startup.showLogo, WT_OD_GENERAL_SHOW_STARTUPLOGO);
+ QToolTip::add(m_settings.startup.showLogo, TT_OD_GENERAL_SHOW_STARTUPLOGO);
+
+ m_settings.startup.showLogo->setChecked(CBTConfig::get(CBTConfig::logo));
+ }
+ layout->addWidget(m_settings.startup.showLogo);
+ { //workspace
+ m_settings.startup.restoreWorkspace = new QCheckBox(page);
+ m_settings.startup.restoreWorkspace->setText(i18n("Restore windows in workspace area"));
+ QToolTip::add(m_settings.startup.restoreWorkspace, TT_OD_GENERAL_RESTORE_WORKSPACE);
+ QWhatsThis::add(m_settings.startup.restoreWorkspace, WT_OD_GENERAL_RESTORE_WORKSPACE);
+
+ m_settings.startup.restoreWorkspace->setChecked(CBTConfig::get(CBTConfig::restoreWorkspace));
+ }
+ layout->addWidget(m_settings.startup.restoreWorkspace);
+
+ layout->addStretch(4);
+}
+
+/** Init fonts section. */
+void COptionsDialog::initFonts(){
+ QFrame* page = addPage(i18n("Fonts"), QString::null, OD_ICON_FONTS);
+ QVBoxLayout* layout = new QVBoxLayout(page,5);
+
+
+ layout->addWidget( CToolClass::explanationLabel(page, i18n("Choose fonts"), i18n("The fonts you can choose here are used in the display windows. Use the drop-down box below to choose the area of application. Then select a font for it. Make sure the charset \"iso10646-1\" is available for the selected Unicode font.!")) );
+ layout->addSpacing(5);
+
+ m_settings.fonts.usage = new QComboBox(page);
+ QToolTip::add(m_settings.fonts.usage, TT_OD_FONTS_TYPE_CHOOSER);
+ QWhatsThis::add(m_settings.fonts.usage, WT_OD_FONTS_TYPE_CHOOSER);
+ layout->addWidget(m_settings.fonts.usage);
+
+ m_settings.fonts.fontMap.insert(i18n("Standard"), CBTConfig::get(CBTConfig::standard));
+ m_settings.fonts.fontMap.insert(i18n("Unicode"), CBTConfig::get(CBTConfig::unicode));
+
+ for( QMap<QString, QFont>::Iterator it = m_settings.fonts.fontMap.begin(); it != m_settings.fonts.fontMap.end(); ++it )
+ m_settings.fonts.usage->insertItem(it.key());
+
+ m_settings.fonts.fontChooser = new KFontChooser(page, "fonts", false, QStringList(), true, 5);
+ m_settings.fonts.fontChooser->setSampleText(i18n("The quick brown fox jumps over the lazy dog"));
+ layout->addWidget(m_settings.fonts.fontChooser);
+
+ connect(m_settings.fonts.fontChooser, SIGNAL(fontSelected(const QFont&)), SLOT(newDisplayWindowFontSelected(const QFont&)));
+ connect(m_settings.fonts.usage, SIGNAL(activated(const QString&)), SLOT(newDisplayWindowFontAreaSelected(const QString&)));
+ QWhatsThis::add(m_settings.fonts.fontChooser, WT_OD_FONTS_CHOOSER);
+
+ m_settings.fonts.fontChooser->setFont( m_settings.fonts.fontMap[m_settings.fonts.usage->currentText()] );
+ m_settings.fonts.fontChooser->setMinimumSize(m_settings.fonts.fontChooser->sizeHint());
+}
+
+/** Init color section. */
+void COptionsDialog::initColors(){
+ QFrame* page = addPage(i18n("Colors"), QString::null, OD_ICON_COLORS);
+// QVBoxLayout* layout = new QVBoxLayout(page);
+ QGridLayout* gridLayout = new QGridLayout(page,5,5,5,5);
+ gridLayout->setResizeMode(QLayout::Minimum);
+
+ gridLayout->addMultiCellWidget(
+ CToolClass::explanationLabel(page,
+ i18n("Choose colors"),
+ i18n("Choose the colors to change the look of the display windows to your own preferences. Some options like \"Words of Jesus\" do only apply to texts which support this special feature.")
+ ),
+ 0,0,0,-1
+ );
+
+ m_settings.colors.text = new KColorButton(CBTConfig::get(CBTConfig::textColor), page);
+ QLabel* label = new QLabel(m_settings.colors.text, i18n("Text"), page);
+ gridLayout->addWidget(label,1,0);
+ gridLayout->addWidget(m_settings.colors.text,1,1);
+
+ m_settings.colors.background = new KColorButton(CBTConfig::get(CBTConfig::backgroundColor), page);
+ label = new QLabel(m_settings.colors.background, i18n("Background"), page);
+ gridLayout->addWidget(label,1,3);
+ gridLayout->addWidget(m_settings.colors.background,1,4);
+
+ m_settings.colors.highlightedVerse = new KColorButton(CBTConfig::get(CBTConfig::highlightedVerseColor), page);
+ label = new QLabel(m_settings.colors.highlightedVerse, i18n("Highlighted verse"), page);
+ gridLayout->addWidget(label,2,0);
+ gridLayout->addWidget(m_settings.colors.highlightedVerse,2,1);
+
+ m_settings.colors.swordrefs = new KColorButton(CBTConfig::get(CBTConfig::swordRefColor), page);
+ label = new QLabel(m_settings.colors.swordrefs,i18n("Hyperlinks"), page);
+ gridLayout->addWidget(label,2,3);
+ gridLayout->addWidget(m_settings.colors.swordrefs,2,4);
+
+ m_settings.colors.footnotes = new KColorButton(CBTConfig::get(CBTConfig::footnotesColor), page);
+ label = new QLabel(m_settings.colors.footnotes,i18n("Footnotes"), page);
+ gridLayout->addWidget(label,3,0);
+ gridLayout->addWidget(m_settings.colors.footnotes,3,1);
+
+ m_settings.colors.strongs = new KColorButton(CBTConfig::get(CBTConfig::strongsColor), page);
+ label = new QLabel(m_settings.colors.strongs, i18n("Strong's numbers"), page);
+ gridLayout->addWidget(label,3,3);
+ gridLayout->addWidget(m_settings.colors.strongs,3,4);
+
+ m_settings.colors.morph = new KColorButton(CBTConfig::get(CBTConfig::morphsColor), page);
+ label = new QLabel(m_settings.colors.morph, i18n("Morphologic tags"), page);
+ gridLayout->addWidget(label,4,0);
+ gridLayout->addWidget(m_settings.colors.morph,4,1);
+
+ m_settings.colors.jesuswords = new KColorButton(CBTConfig::get(CBTConfig::jesuswordsColor), page);
+ label = new QLabel(m_settings.colors.jesuswords, i18n("Words of Jesus"), page);
+ gridLayout->addWidget(label,4,3);
+ gridLayout->addWidget(m_settings.colors.jesuswords,4,4);
+
+ gridLayout->setRowStretch(5, 5);
+ gridLayout->addColSpacing(3, 5);
+}
+
+/** Init profiles section. */
+void COptionsDialog::initProfiles(){
+ QFrame* page = addPage(i18n("Profiles"),QString::null, OD_ICON_PROFILES);
+ QGridLayout* gridLayout = new QGridLayout(page, 3,3,5,5);
+
+ gridLayout->addMultiCellWidget(
+ CToolClass::explanationLabel(page,
+ i18n("Manage your profiles"),
+ i18n("Profiles define the appereance of the work area, \
+for example which windows are open and which texts should displayed in these windows. \
+Don't forget that new profiles only work after you've saved something in them.")
+ ),
+ 0,0,0,-1
+ );
+
+ m_settings.profiles.profiles = new QListBox(page);
+ gridLayout->addMultiCellWidget(m_settings.profiles.profiles, 1,1,0,-1);
+ gridLayout->setRowStretch(1,10);
+
+ m_settings.profiles.createProfile = new QPushButton(i18n("Create new profile"), page);
+ connect(m_settings.profiles.createProfile, SIGNAL(clicked()), SLOT(addNewProfile()));
+ gridLayout->addWidget(m_settings.profiles.createProfile,2,0);
+
+ m_settings.profiles.deleteProfile = new QPushButton(i18n("Delete selected profile"), page);
+ connect(m_settings.profiles.deleteProfile, SIGNAL(clicked()), SLOT(deleteProfile()));
+ gridLayout->addWidget(m_settings.profiles.deleteProfile,2,1);
+
+ m_settings.profiles.renameProfile = new QPushButton(i18n("Rename selected profile"), page);
+ connect(m_settings.profiles.renameProfile, SIGNAL(clicked()), SLOT(renameProfile()));
+ gridLayout->addWidget(m_settings.profiles.renameProfile,2,2);
+
+ //fill the profile list box
+ QList<CProfile> profiles = m_settings.profiles.mgr.profiles();
+ if (profiles.count()) {
+ for (CProfile* p = profiles.first(); p; p = profiles.next()) {
+ m_settings.profiles.profiles->insertItem(p->name());
+ }
+ }
+ else {
+ m_settings.profiles.profiles->setEnabled(false);
+ }
+}
+
+/** Init accel key section. */
+void COptionsDialog::initAccelerators(){
+ QVBox* page = addVBoxPage(i18n("Accelerators"),QString::null, OD_ICON_KEY_BINDINGS);
+
+ KTabCtl* tabCtl = new KTabCtl(page);
+ QFrame* currentTab = new QVBox(tabCtl);
+ currentTab->setMargin(3);
+ tabCtl->addTab(currentTab, i18n("Application wide"));
+
+ m_settings.keys.application.dict = m_settings.keys.application.accel->keyDict();
+ m_settings.keys.application.keyChooser = new KKeyChooser( &m_settings.keys.application.dict, currentTab, false );
+ QToolTip::add(m_settings.keys.application.keyChooser, TT_OD_KEYS_CHOOSER);
+ QWhatsThis::add(m_settings.keys.application.keyChooser, WT_OD_KEYS_CHOOSER);
+
+// ----- new tab: All display windows ------ //
+// currentTab = new QVBox(tabCtl);
+// currentTab->setMargin(3);
+// tabCtl->addTab(currentTab, i18n("All display windows"));
+//
+// m_settings.keys.general.accel = new KAccel(this); //delete in destructor
+// CSwordPresenter::insertKeyboardActions( m_settings.keys.general.accel );
+// m_settings.keys.general.accel->readSettings();
+// m_settings.keys.general.dict = m_settings.keys.general.accel->keyDict();
+// m_settings.keys.general.keyChooser = new KKeyChooser( &m_settings.keys.general.dict, currentTab, false );
+// QToolTip::add(m_settings.keys.general.keyChooser, TT_OD_DISPLAY_WINDOW_KEYS_GENERAL);
+// QWhatsThis::add(m_settings.keys.general.keyChooser, WT_OD_DISPLAY_WINDOW_KEYS_GENERAL);
+
+// ----- new tab: Bible windows ------ //
+ currentTab = new QVBox(tabCtl);
+ currentTab->setMargin(3);
+ tabCtl->addTab(currentTab, i18n("Bible windows"));
+
+ m_settings.keys.bible.accel = new KAccel(this); //delete in destructor
+ CBiblePresenter::insertKeyboardActions( m_settings.keys.bible.accel );
+ m_settings.keys.bible.accel->readSettings();
+ m_settings.keys.bible.dict = m_settings.keys.bible.accel->keyDict();
+ m_settings.keys.bible.keyChooser = new KKeyChooser( &m_settings.keys.bible.dict, currentTab, false );
+ QToolTip::add(m_settings.keys.bible.keyChooser, TT_OD_DISPLAY_WINDOW_KEYS_BIBLE);
+ QWhatsThis::add(m_settings.keys.bible.keyChooser, WT_OD_DISPLAY_WINDOW_KEYS_BIBLE);
+
+// ----- new tab: Commentary windows ------ //
+ currentTab = new QVBox(tabCtl);
+ currentTab->setMargin(3);
+ tabCtl->addTab(currentTab, i18n("Commentary windows"));
+
+ m_settings.keys.commentary.accel = new KAccel(this); //delete in destructor
+ CCommentaryPresenter::insertKeyboardActions( m_settings.keys.commentary.accel );
+ m_settings.keys.commentary.accel->readSettings();
+ m_settings.keys.commentary.dict = m_settings.keys.commentary.accel->keyDict();
+ m_settings.keys.commentary.keyChooser = new KKeyChooser( &m_settings.keys.commentary.dict, currentTab, false );
+ QToolTip::add(m_settings.keys.commentary.keyChooser, TT_OD_DISPLAY_WINDOW_KEYS_COMMENTARY);
+ QWhatsThis::add(m_settings.keys.commentary.keyChooser, WT_OD_DISPLAY_WINDOW_KEYS_COMMENTARY);
+
+// ----- new tab: Lexicon windows ------ //
+ currentTab = new QVBox(tabCtl);
+ currentTab->setMargin(3);
+ tabCtl->addTab(currentTab, i18n("Lexicon windows"));
+
+ m_settings.keys.lexicon.accel = new KAccel(this); //delete in destructor
+ CLexiconPresenter::insertKeyboardActions( m_settings.keys.lexicon.accel );
+ m_settings.keys.lexicon.accel->readSettings();
+ m_settings.keys.lexicon.dict = m_settings.keys.lexicon.accel->keyDict();
+ m_settings.keys.lexicon.keyChooser = new KKeyChooser( &m_settings.keys.lexicon.dict, currentTab, false );
+ QToolTip::add(m_settings.keys.lexicon.keyChooser, TT_OD_DISPLAY_WINDOW_KEYS_LEXICON);
+ QWhatsThis::add(m_settings.keys.lexicon.keyChooser, WT_OD_DISPLAY_WINDOW_KEYS_LEXICON);
+
+
+// ----- new tab: Lexicon windows ------ //
+ currentTab = new QVBox(tabCtl);
+ currentTab->setMargin(3);
+ tabCtl->addTab(currentTab, i18n("Book windows"));
+
+ m_settings.keys.book.accel = new KAccel(this); //delete in destructor
+ CBookPresenter::insertKeyboardActions( m_settings.keys.book.accel );
+ m_settings.keys.book.accel->readSettings();
+ m_settings.keys.book.dict = m_settings.keys.book.accel->keyDict();
+ m_settings.keys.book.keyChooser = new KKeyChooser( &m_settings.keys.book.dict, currentTab, false );
+// QToolTip::add(m_settings.keys.book.keyChooser, TT_OD_DISPLAY_WINDOW_KEYS_LEXICON);
+// QWhatsThis::add(m_settings.keys.book.keyChooser, WT_OD_DISPLAY_WINDOW_KEYS_LEXICON);
+
+}
+
+/** Init Sword section. */
+void COptionsDialog::initSword(){
+ QVBox* page = addVBoxPage(i18n("Sword"),QString::null, OD_ICON_SWORD);
+ KTabCtl* tabCtl = new KTabCtl(page);
+ QFrame* currentTab = new QFrame(tabCtl);
+ tabCtl->addTab(currentTab, i18n("General"));
+
+ QGridLayout* gridLayout = new QGridLayout(currentTab,7,2,5,5);
+ gridLayout->setResizeMode(QLayout::Minimum);
+
+ gridLayout->addMultiCellWidget(
+ CToolClass::explanationLabel(currentTab, i18n("Use key cache for lexicons"),
+ i18n("BibleTime can create a key cache for lexicons, which speeds up opening large lexicon modules a lot. \
+However these files consume some disk space (usually not much), and reside in \
+$KDEHOME/share/apps/bibletime/cache.")),
+ 0,0,0,-1
+ );
+
+ m_settings.sword.lexiconCache = new QCheckBox(currentTab);
+ m_settings.sword.lexiconCache->setText(i18n("Use key cache for lexicons"));
+ QToolTip::add(m_settings.sword.lexiconCache, TT_OD_SWORD_USE_LEXICON_CACHE);
+ QWhatsThis::add(m_settings.sword.lexiconCache, WT_OD_SWORD_USE_LEXICON_CACHE);
+
+ m_settings.sword.lexiconCache->setChecked( CBTConfig::get(CBTConfig::lexiconCache) );
+ gridLayout->addMultiCellWidget(m_settings.sword.lexiconCache,1,1,0,-1);
+
+ gridLayout->addMultiCellWidget(
+ CToolClass::explanationLabel(currentTab, i18n("Scrolling behaviour"),
+ i18n("The down arrow moves to the <i>next</i> verse by default. Uncheck this box \
+if you want it to move to the <i>previous</i> verse.")),
+ 2,2,0,-1
+ );
+
+ m_settings.sword.useDownArrow = new QCheckBox(currentTab);
+ m_settings.sword.useDownArrow->setText(i18n("Use down arrow to scroll to next verse"));
+ m_settings.sword.useDownArrow->setChecked(CBTConfig::get(CBTConfig::scroll));
+ QWhatsThis::add(m_settings.sword.useDownArrow, WT_OD_GENERAL_SCROLL_PREVIOUS);
+ QToolTip::add(m_settings.sword.useDownArrow, TT_OD_GENERAL_SCROLL_PREVIOUS);
+ gridLayout->addMultiCellWidget(m_settings.sword.useDownArrow,3,3,0,-1);
+
+ gridLayout->addMultiCellWidget(
+ CToolClass::explanationLabel(currentTab, i18n("Specify a language for biblical booknames"),
+ i18n("Sword has a number of locales available which can be used to internationalize the \
+booknames of the bible. You can specify which locale to choose. If you want to \
+create a new locale, see http://www.crosswire.org/sword/develop for details.")),
+ 4,4,0,-1
+ );
+
+ m_settings.sword.localeCombo = new QComboBox(currentTab);
+ QLabel* label = new QLabel(m_settings.sword.localeCombo, i18n("Language for booknames"), currentTab);
+ QToolTip::add(m_settings.sword.localeCombo, TT_OD_GENERAL_INTERNATIONAL_BOOKNAMES);
+ QWhatsThis::add(m_settings.sword.localeCombo, WT_OD_GENERAL_INTERNATIONAL_BOOKNAMES);
+ gridLayout->addWidget(label, 5,0);
+ gridLayout->addWidget(m_settings.sword.localeCombo, 5,1);
+
+ gridLayout->setRowStretch(6,5); //eat up remaining space :)
+
+ m_settings.sword.localeCombo->insertItem( i18n("English") );
+ list <string> locales = LocaleMgr::systemLocaleMgr.getAvailableLocales();
+ for (list <string>::iterator it = locales.begin(); it != locales.end(); it++) {
+ m_settings.sword.localeCombo->insertItem( i18n(LocaleMgr::systemLocaleMgr.getLocale((*it).c_str())->getDescription()) );
+ }
+
+ int current_item = -1;
+ for(int test_item = 0; test_item < m_settings.sword.localeCombo->count(); test_item++) {
+ SWLocale* locale = LocaleMgr::systemLocaleMgr.getLocale(CBTConfig::get(CBTConfig::language).local8Bit());
+ if (locale && m_settings.sword.localeCombo->text(test_item).contains(i18n(locale->getDescription())) )
+ current_item = test_item;
+ }
+ if (current_item!=-1)
+ m_settings.sword.localeCombo->setCurrentItem(current_item);
+
+
+// ---------- new tab: Default modules -------- //
+ currentTab = new QFrame(tabCtl);
+ tabCtl->addTab(currentTab, i18n("Default modules"));
+ gridLayout = new QGridLayout(currentTab,9,2, 5,5); //the last row is for stretching available space
+ gridLayout->setResizeMode(QLayout::Minimum);
+
+ gridLayout->addMultiCellWidget(
+ CToolClass::explanationLabel(currentTab, i18n("Default modules"), i18n("Default modules are used, when no module is specified. This may happen with references into modules like Bibles or Lexicons.")),
+ 0,0,0,-1 /*fill the horizontal space*/
+ );
+
+ m_settings.sword.standardBible = new QComboBox(currentTab);
+ label = new QLabel(m_settings.sword.standardBible, i18n("Default Bible"), currentTab);
+ label->setAutoResize(true);
+ QToolTip::add(m_settings.sword.standardBible, TT_OD_SWORD_STANDARD_BIBLE);
+ QWhatsThis::add(m_settings.sword.standardBible, WT_OD_SWORD_STANDARD_BIBLE);
+ gridLayout->addWidget(label,1,0);
+ gridLayout->addWidget(m_settings.sword.standardBible,1,1);
+
+ m_settings.sword.standardCommentary = new QComboBox(currentTab);
+ label = new QLabel(m_settings.sword.standardCommentary, i18n("Default Commentary"), currentTab);
+ label->setAutoResize(true);
+ QToolTip::add(m_settings.sword.standardCommentary, TT_OD_SWORD_STANDARD_COMMENTARY);
+ QWhatsThis::add(m_settings.sword.standardCommentary, WT_OD_SWORD_STANDARD_COMMENTARY);
+ gridLayout->addWidget(label,2,0);
+ gridLayout->addWidget(m_settings.sword.standardCommentary,2,1);
+
+
+ m_settings.sword.standardLexicon = new QComboBox(currentTab);
+ label = new QLabel(m_settings.sword.standardLexicon, i18n("Default Lexicon"), currentTab);
+ label->setAutoResize(true);
+ QToolTip::add(m_settings.sword.standardLexicon, TT_OD_SWORD_STANDARD_LEXICON);
+ QWhatsThis::add(m_settings.sword.standardLexicon, WT_OD_SWORD_STANDARD_LEXICON);
+ gridLayout->addWidget(label,3,0);
+ gridLayout->addWidget(m_settings.sword.standardLexicon,3,1);
+
+ m_settings.sword.standardHebrewStrong = new QComboBox(currentTab);
+ label = new QLabel(m_settings.sword.standardHebrewStrong, i18n("Default Hebrew Strong's Lexicon"), currentTab);
+ label->setAutoResize(true);
+ QToolTip::add(m_settings.sword.standardHebrewStrong, TT_OD_SWORD_STANDARD_HEBREW_STRONG);
+ QWhatsThis::add(m_settings.sword.standardHebrewStrong, WT_OD_SWORD_STANDARD_HEBREW_STRONG);
+ gridLayout->addWidget(label,4,0);
+ gridLayout->addWidget(m_settings.sword.standardHebrewStrong,4,1);
+
+ m_settings.sword.standardGreekStrong = new QComboBox(currentTab);
+ label = new QLabel(m_settings.sword.standardGreekStrong, i18n("Default Greek Strong's Lexicon"), currentTab);
+ label->setAutoResize(true);
+ QToolTip::add(m_settings.sword.standardGreekStrong, TT_OD_SWORD_STANDARD_GREEK_STRONG);
+ QWhatsThis::add(m_settings.sword.standardGreekStrong, WT_OD_SWORD_STANDARD_GREEK_STRONG);
+ gridLayout->addWidget(label,5,0);
+ gridLayout->addWidget(m_settings.sword.standardGreekStrong,5,1);
+
+ m_settings.sword.standardHebrewMorph = new QComboBox(currentTab);
+ label = new QLabel(m_settings.sword.standardHebrewMorph, i18n("Default Hebrew Morphological Lexicon"), currentTab);
+ QToolTip::add(m_settings.sword.standardHebrewMorph, TT_OD_SWORD_STANDARD_HEBREW_MORPH);
+ QWhatsThis::add(m_settings.sword.standardHebrewMorph, WT_OD_SWORD_STANDARD_HEBREW_MORPH);
+ gridLayout->addWidget(label,6,0);
+ gridLayout->addWidget(m_settings.sword.standardHebrewMorph,6,1);
+
+ m_settings.sword.standardGreekMorph = new QComboBox(currentTab);
+ label = new QLabel(m_settings.sword.standardGreekMorph, i18n("Default Greek Morphological Lexicon"), currentTab);
+ label->setAutoResize(true);
+ QToolTip::add(m_settings.sword.standardGreekMorph, TT_OD_SWORD_STANDARD_GREEK_MORPH);
+ QWhatsThis::add(m_settings.sword.standardGreekMorph, WT_OD_SWORD_STANDARD_GREEK_MORPH);
+ gridLayout->addWidget(label,7,0);
+ gridLayout->addWidget(m_settings.sword.standardGreekMorph,7,1);
+
+ gridLayout->setRowStretch(8,5);
+
+ //fill the comboboxes with the right modules
+ ListCSwordModuleInfo& modules = backend()->moduleList();
+ QString modDescript;
+ for ( modules.first(); modules.current(); modules.next() ) {
+ modDescript = modules.current()->config(CSwordModuleInfo::Description);
+ switch (modules.current()->type()) {
+ case CSwordModuleInfo::Bible:
+ m_settings.sword.standardBible->insertItem(modDescript);
+ break;
+ case CSwordModuleInfo::Commentary:
+ m_settings.sword.standardCommentary->insertItem(modDescript);
+ break;
+ case CSwordModuleInfo::Lexicon:
+ {
+ m_settings.sword.standardLexicon->insertItem(modDescript);
+ if (modules.current()->has(CSwordModuleInfo::HebrewDef)) {
+ m_settings.sword.standardHebrewStrong->insertItem(modDescript);
+ }
+ if (modules.current()->has(CSwordModuleInfo::GreekDef)) {
+ m_settings.sword.standardGreekStrong->insertItem(modDescript);
+ }
+ if (modules.current()->has(CSwordModuleInfo::HebrewParse)) {
+ m_settings.sword.standardHebrewMorph->insertItem(modDescript);
+ }
+ if (modules.current()->has(CSwordModuleInfo::GreekParse)) {
+ m_settings.sword.standardGreekMorph->insertItem(modDescript);
+ }
+ break;
+ }
+ default://unknown type
+ break;
+ }
+ }
+
+//using two lists and one loop is better than six loops with almost the same code :)
+ QList<QComboBox> comboList;
+ comboList.setAutoDelete(false);//don't delete the combos accidentally
+ comboList.append(m_settings.sword.standardBible);
+ comboList.append(m_settings.sword.standardCommentary);
+ comboList.append(m_settings.sword.standardLexicon);
+ comboList.append(m_settings.sword.standardHebrewStrong);
+ comboList.append(m_settings.sword.standardGreekStrong);
+ comboList.append(m_settings.sword.standardHebrewMorph);
+ comboList.append(m_settings.sword.standardGreekMorph);
+
+ QStringList moduleList;
+ moduleList
+ << CBTConfig::get(CBTConfig::standardBible)
+ << CBTConfig::get(CBTConfig::standardCommentary)
+ << CBTConfig::get(CBTConfig::standardLexicon)
+ << CBTConfig::get(CBTConfig::standardHebrewStrongsLexicon)
+ << CBTConfig::get(CBTConfig::standardGreekStrongsLexicon)
+ << CBTConfig::get(CBTConfig::standardHebrewMorphLexicon)
+ << CBTConfig::get(CBTConfig::standardGreekMorphLexicon);
+
+ QString module = QString::null;
+ int item = 0;
+ int count = 0;
+ for (QComboBox* combo = comboList.first(); combo; combo = comboList.next() ) {
+ module = moduleList[comboList.at()];
+ count = combo->count();
+ combo->setMaximumWidth(300);
+ for (item = 0; item < count; item++) {
+ if (combo->text(item) == module ) {
+ combo->setCurrentItem(item);
+ break;
+ }
+ }
+ }
+
+
+
+// ---------- new tab: filters -------- //
+ currentTab = new QFrame(tabCtl);
+ tabCtl->addTab(currentTab, i18n("Filter settings"));
+ QVBoxLayout* layout = new QVBoxLayout(currentTab,5);
+
+ layout->addWidget( CToolClass::explanationLabel(currentTab, i18n("Filter settings"), i18n("Filters control the appereance of the text in the display windows. Here you can choose the default settings of the various filter settings. You can change the settings in each display window, too.")) );
+ layout->addSpacing(5);
+
+ m_settings.sword.lineBreaks = new QCheckBox(currentTab);
+ m_settings.sword.lineBreaks->setText(i18n("Show line break after each verse"));
+ m_settings.sword.lineBreaks->setChecked(CBTConfig::get(CBTConfig::lineBreaks));
+ layout->addWidget(m_settings.sword.lineBreaks);
+
+ m_settings.sword.verseNumbers = new QCheckBox(currentTab);
+ m_settings.sword.verseNumbers->setText(i18n("Show verse numbers"));
+ m_settings.sword.verseNumbers->setChecked(CBTConfig::get(CBTConfig::verseNumbers));
+ layout->addWidget(m_settings.sword.verseNumbers);
+
+ m_settings.sword.footnotes = new QCheckBox(currentTab);
+ m_settings.sword.footnotes->setText(i18n("Show footnotes"));
+ m_settings.sword.footnotes->setChecked(CBTConfig::get(CBTConfig::footnotes));
+ layout->addWidget(m_settings.sword.footnotes);
+
+ m_settings.sword.strongNumbers = new QCheckBox(currentTab);
+ m_settings.sword.strongNumbers->setText(i18n("Show Strong's Numbers"));
+ m_settings.sword.strongNumbers->setChecked(CBTConfig::get(CBTConfig::strongNumbers));
+ layout->addWidget(m_settings.sword.strongNumbers);
+
+ m_settings.sword.headings = new QCheckBox(currentTab);
+ m_settings.sword.headings->setText(i18n("Show headings"));
+ m_settings.sword.headings->setChecked(CBTConfig::get(CBTConfig::headings));
+ layout->addWidget(m_settings.sword.headings);
+
+ m_settings.sword.morphTags = new QCheckBox(currentTab);
+ m_settings.sword.morphTags->setText(i18n("Show morphologic tags"));
+ m_settings.sword.morphTags->setChecked(CBTConfig::get(CBTConfig::morphTags));
+ layout->addWidget(m_settings.sword.morphTags);
+
+ m_settings.sword.lemmas = new QCheckBox(currentTab);
+ m_settings.sword.lemmas->setText(i18n("Show lemmas"));
+ m_settings.sword.lemmas->setChecked(CBTConfig::get(CBTConfig::lemmas));
+ layout->addWidget(m_settings.sword.lemmas);
+
+ m_settings.sword.hebrewPoints = new QCheckBox(currentTab);
+ m_settings.sword.hebrewPoints->setText(i18n("Show Hebrew vowel points"));
+ m_settings.sword.hebrewPoints->setChecked(CBTConfig::get(CBTConfig::hebrewPoints));
+ layout->addWidget(m_settings.sword.hebrewPoints);
+
+ m_settings.sword.hebrewCantillation = new QCheckBox(currentTab);
+ m_settings.sword.hebrewCantillation->setText(i18n("Show Hebrew cantillation marks"));
+ m_settings.sword.hebrewCantillation->setChecked(CBTConfig::get(CBTConfig::hebrewCantillation));
+ layout->addWidget(m_settings.sword.hebrewCantillation);
+
+ m_settings.sword.greekAccents = new QCheckBox(currentTab);
+ m_settings.sword.greekAccents->setText(i18n("Show Greek accents"));
+ m_settings.sword.greekAccents->setChecked(CBTConfig::get(CBTConfig::greekAccents));
+ layout->addWidget(m_settings.sword.greekAccents);
+
+ m_settings.sword.textualVariants = new QCheckBox(currentTab);
+ m_settings.sword.textualVariants->setText(i18n("Use textual variants"));
+ m_settings.sword.textualVariants->setChecked(CBTConfig::get(CBTConfig::textualVariants));
+ layout->addWidget(m_settings.sword.textualVariants);
+
+ layout->addStretch(4);
+}
+
+void COptionsDialog::saveAccelerators(){
+ m_settings.keys.application.accel->setKeyDict( m_settings.keys.application.dict );
+ m_settings.keys.application.accel->writeSettings();
+
+// m_settings.keys.general.accel->setKeyDict( m_settings.keys.general.dict );
+// m_settings.keys.general.accel->writeSettings();
+
+ m_settings.keys.bible.accel->setKeyDict( m_settings.keys.bible.dict );
+ m_settings.keys.bible.accel->writeSettings();
+
+ m_settings.keys.commentary.accel->setKeyDict( m_settings.keys.commentary.dict );
+ m_settings.keys.commentary.accel->writeSettings();
+
+ m_settings.keys.lexicon.accel->setKeyDict( m_settings.keys.lexicon.dict );
+ m_settings.keys.lexicon.accel->writeSettings();
+
+ m_settings.keys.book.accel->setKeyDict( m_settings.keys.book.dict );
+ m_settings.keys.book.accel->writeSettings();
+}
+
+/** No descriptions */
+void COptionsDialog::saveColors(){
+ CBTConfig::set(CBTConfig::textColor, m_settings.colors.text->color().name());
+ CBTConfig::set(CBTConfig::backgroundColor, m_settings.colors.background->color().name());
+ CBTConfig::set(CBTConfig::highlightedVerseColor, m_settings.colors.highlightedVerse->color().name());
+ CBTConfig::set(CBTConfig::swordRefColor, m_settings.colors.swordrefs->color().name());
+ CBTConfig::set(CBTConfig::footnotesColor, m_settings.colors.footnotes->color().name());
+ CBTConfig::set(CBTConfig::strongsColor, m_settings.colors.strongs->color().name());
+ CBTConfig::set(CBTConfig::morphsColor, m_settings.colors.morph->color().name());
+ CBTConfig::set(CBTConfig::jesuswordsColor, m_settings.colors.jesuswords->color().name());
+}
+
+/** No descriptions */
+void COptionsDialog::saveFonts(){
+ for(QMap<QString, QFont>::Iterator it = m_settings.fonts.fontMap.begin(); it != m_settings.fonts.fontMap.end(); ++it ){
+ if (it.key() == i18n("Standard")) {
+ CBTConfig::set(CBTConfig::standard, it.data());
+ }
+ else if (it.key() == i18n("Unicode")) {
+ QFont font = it.data();
+ font.setCharSet(QFont::Unicode); //try to set the unicode charset
+ CBTConfig::set(CBTConfig::unicode, font);
+ }
+ }
+}
+
+/** No descriptions */
+void COptionsDialog::saveProfiles(){
+}
+
+/** No descriptions */
+void COptionsDialog::saveStartup(){
+ CBTConfig::set( CBTConfig::logo, m_settings.startup.showLogo->isChecked() );
+ CBTConfig::set( CBTConfig::tips, m_settings.startup.showTips->isChecked() );
+ CBTConfig::set( CBTConfig::restoreWorkspace, m_settings.startup.restoreWorkspace->isChecked() );
+}
+
+/** No descriptions */
+void COptionsDialog::saveSword(){
+ bool old_lexiconCache = CBTConfig::get(CBTConfig::lexiconCache);
+ bool new_lexiconCache = m_settings.sword.lexiconCache->isChecked();
+
+ CBTConfig::set( CBTConfig::lexiconCache, new_lexiconCache );
+
+ if (old_lexiconCache && !new_lexiconCache){ //delete cache files
+ QString dirname = KGlobal::dirs()->saveLocation("data", "bibletime/cache/");
+ QDir dir = QDir(dirname);
+ QStringList files = QStringList( dir.entryList() );
+ for (QStringList::Iterator it = files.begin(); it != files.end(); ++it)
+ dir.remove((*it),false);
+ }
+
+ CBTConfig::set(CBTConfig::standardBible, m_settings.sword.standardBible->currentText());
+ CBTConfig::set(CBTConfig::standardCommentary, m_settings.sword.standardCommentary->currentText());
+ CBTConfig::set(CBTConfig::standardLexicon, m_settings.sword.standardLexicon->currentText());
+ CBTConfig::set(CBTConfig::standardHebrewStrongsLexicon, m_settings.sword.standardHebrewStrong->currentText());
+ CBTConfig::set(CBTConfig::standardGreekStrongsLexicon, m_settings.sword.standardGreekStrong->currentText() );
+ CBTConfig::set(CBTConfig::standardHebrewMorphLexicon, m_settings.sword.standardHebrewMorph->currentText());
+ CBTConfig::set(CBTConfig::standardGreekMorphLexicon, m_settings.sword.standardGreekMorph->currentText() );
+
+ const QString currentText = m_settings.sword.localeCombo->currentText();
+ list <string> locales = LocaleMgr::systemLocaleMgr.getAvailableLocales();
+ QString localeName = QString::null;
+ for (list <string>::iterator it = locales.begin(); it != locales.end(); it++) {
+ if ( i18n(LocaleMgr::systemLocaleMgr.getLocale((*it).c_str())->getDescription()) == currentText ) {
+ localeName = (*it).c_str(); //we found the abbrevation for the current language
+ break;
+ }
+ }
+ if (!localeName.isEmpty())
+ CBTConfig::set(CBTConfig::language, localeName);
+ else
+ CBTConfig::set(CBTConfig::language, currentText);
+
+ CBTConfig::set(CBTConfig::scroll, m_settings.sword.useDownArrow->isChecked());
+ CBTConfig::set(CBTConfig::lineBreaks, m_settings.sword.lineBreaks->isChecked());
+ CBTConfig::set(CBTConfig::verseNumbers, m_settings.sword.verseNumbers->isChecked());
+ CBTConfig::set(CBTConfig::footnotes, m_settings.sword.footnotes->isChecked());
+ CBTConfig::set(CBTConfig::strongNumbers, m_settings.sword.strongNumbers->isChecked());
+ CBTConfig::set(CBTConfig::headings, m_settings.sword.headings->isChecked());
+ CBTConfig::set(CBTConfig::morphTags, m_settings.sword.morphTags->isChecked());
+ CBTConfig::set(CBTConfig::lemmas, m_settings.sword.lemmas->isChecked());
+ CBTConfig::set(CBTConfig::hebrewPoints, m_settings.sword.hebrewPoints->isChecked());
+ CBTConfig::set(CBTConfig::hebrewCantillation, m_settings.sword.hebrewCantillation->isChecked());
+ CBTConfig::set(CBTConfig::greekAccents, m_settings.sword.greekAccents->isChecked());
+ CBTConfig::set(CBTConfig::textualVariants, m_settings.sword.textualVariants->isChecked());
+}
diff --git a/bibletime/frontend/coptionsdialog.h b/bibletime/frontend/coptionsdialog.h
new file mode 100644
index 0000000..c63d80b
--- /dev/null
+++ b/bibletime/frontend/coptionsdialog.h
@@ -0,0 +1,210 @@
+/***************************************************************************
+ coptionsdialog.h - description
+ -------------------
+ begin : Wed Jan 19 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef COPTIONSDIALOG_H
+#define COPTIONSDIALOG_H
+
+#include "cprofilemgr.h"
+#include "cpointers.h"
+
+//QT includes
+#include <qwidget.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qstring.h>
+#include <qmap.h>
+#include <qcombobox.h>
+#include <qdict.h>
+#include <qmap.h>
+
+//KDE includes
+#include <kdialogbase.h>
+#include <kfontdialog.h>
+#include <kaccel.h>
+#include <kcolorbtn.h>
+#include <kapp.h>
+
+class QHBox;
+class QCheckBox;
+class QRadioButton;
+class KListBox;
+class KKeyChooser;
+class KTabCtl;
+class CBackEnd;
+
+/**
+ * The optionsdialog of BibleTime
+ * @author The BibleTime Team
+ */
+class COptionsDialog : public KDialogBase, public CPointers {
+ Q_OBJECT
+
+public:
+ COptionsDialog(QWidget *parent=0, const char *name=0, KAccel* key_accel=0);
+
+ enum Parts {
+ Startup,
+ Font,
+ Color,
+ ViewProfiles,
+ Sword,
+ accelerators
+ };
+
+ /** Opens the page which contaisn the given part ID. */
+ const bool showPart( COptionsDialog::Parts ID );
+
+private:
+ struct settings {
+ struct StartupSettings {
+ QCheckBox* showTips;
+ QCheckBox* showLogo;
+ QCheckBox* restoreWorkspace;
+ } startup;
+
+ struct SwordSettings {
+ QCheckBox* lexiconCache;
+ QComboBox* standardBible;
+ QComboBox* standardCommentary;
+ QComboBox* standardLexicon;
+ QComboBox* standardHebrewStrong;
+ QComboBox* standardGreekStrong;
+ QComboBox* standardHebrewMorph;
+ QComboBox* standardGreekMorph;
+ QComboBox* localeCombo;
+ QCheckBox* useDownArrow;
+ QCheckBox* lineBreaks;
+ QCheckBox* verseNumbers;
+ QCheckBox* footnotes;
+ QCheckBox* strongNumbers;
+ QCheckBox* headings;
+ QCheckBox* morphTags;
+ QCheckBox* lemmas;
+ QCheckBox* hebrewPoints;
+ QCheckBox* hebrewCantillation;
+ QCheckBox* greekAccents;
+ QCheckBox* textualVariants;
+ } sword;
+
+ struct KeySettings {
+ struct WindowType {
+ KKeyChooser* keyChooser;
+ KKeyEntryMap dict;
+ KAccel* accel;
+ };
+ WindowType application;
+ WindowType general;
+ WindowType bible;
+ WindowType commentary;
+ WindowType lexicon;
+ WindowType book;
+ } keys;
+
+ struct ColorSettings {
+ KColorButton* text;
+ KColorButton* background;
+ KColorButton* highlightedVerse;
+ KColorButton* swordrefs;
+ KColorButton* footnotes;
+ KColorButton* strongs;
+ KColorButton* morph;
+ KColorButton* jesuswords;
+ } colors;
+
+ struct FontSettings {
+ KFontChooser* fontChooser;
+ QComboBox* usage;
+ QMap<QString,QFont> fontMap;
+ } fonts;
+
+ struct ProfileSettings {
+ QListBox* profiles;
+ QPushButton* createProfile;
+ QPushButton* deleteProfile;
+ QPushButton* renameProfile;
+ CProfileMgr mgr;
+ } profiles;
+ } m_settings;
+
+protected slots: // Protected slots
+ /**
+ * Adds a new view profile to the list.
+ */
+ void addNewProfile();
+ /**
+ * Called when a new font in the fonts page was selected.
+ */
+ void newDisplayWindowFontSelected(const QFont &);
+ /**
+ * Called when the combobox contents is changed
+ */
+ void newDisplayWindowFontAreaSelected(const QString&);
+ /**
+ * Called if the OK button was clicked
+ */
+ void slotOk();
+ /**
+ * Called if the Apply button was clicked
+ * commented out for the time being. ck
+ */
+ void slotApply();
+ /**
+ * Renames the currently selected profile.
+ */
+ void renameProfile();
+ /**
+ * Delete the selected profile.
+ */
+ void deleteProfile();
+
+protected: // Protected methods
+ /**
+ * Init Sword section.
+ */
+ void initSword();
+ /**
+ * Init accel key section.
+ */
+ void initAccelerators();
+ /**
+ * Init fonts section.
+ */
+ void initFonts();
+ /**
+ * Init profiles section.
+ */
+ void initProfiles();
+ /**
+ * Init color section.
+ */
+ void initColors();
+ /**
+ * Initializes the startup section of the OD.
+ */
+ void initStartup();
+ void saveAccelerators();
+ void saveColors();
+ void saveFonts();
+ void saveProfiles();
+ void saveStartup();
+ void saveSword();
+
+signals: // Signals
+ void signalSettingsChanged();
+};
+
+#endif
diff --git a/bibletime/frontend/cpointers.cpp b/bibletime/frontend/cpointers.cpp
new file mode 100644
index 0000000..01dc2b3
--- /dev/null
+++ b/bibletime/frontend/cpointers.cpp
@@ -0,0 +1,52 @@
+/***************************************************************************
+ cpointers.cpp - description
+ -------------------
+ begin : Sun Feb 17 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cpointers.h"
+#include "backend/cswordbackend.h"
+#include "printing/cprinter.h"
+
+//the static pointers
+static CSwordBackend* m_backend = 0;
+static CPrinter* m_printer = 0;
+
+/** Returns a pointer to the backend ... */
+CSwordBackend* const CPointers::backend() {
+ return m_backend;
+}
+
+/** Returns a pointer to the printer object. */
+CPrinter* const CPointers::printer() {
+ return m_printer;
+}
+
+void CPointers::setPrinter(CPrinter* const printer) {
+ m_printer = printer;
+}
+
+void CPointers::setBackend(CSwordBackend* backend) {
+ m_backend = backend;
+}
+
+void CPointers::deletePrinter() {
+ delete m_printer;
+ m_printer = 0;
+}
+
+void CPointers::deleteBackend() {
+ delete m_backend;
+ m_backend = 0;
+}
diff --git a/bibletime/frontend/cpointers.h b/bibletime/frontend/cpointers.h
new file mode 100644
index 0000000..0fad9b8
--- /dev/null
+++ b/bibletime/frontend/cpointers.h
@@ -0,0 +1,48 @@
+/***************************************************************************
+ cpointers.h - description
+ -------------------
+ begin : Sun Feb 17 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CPOINTERS_H
+#define CPOINTERS_H
+
+
+class CSwordBackend;
+class CPrinter;
+
+/** Holds the pointers to important classes like modules, backend etc.
+ * @author The BibleTime team
+ */
+class CPointers {
+protected:
+ friend class BibleTime; //BibleTime may initialize this object
+ friend int main(int argc, char* argv[]);
+ static void setBackend(CSwordBackend* const);
+ static void setPrinter(CPrinter* const);
+ static void deleteBackend();
+ static void deletePrinter();
+
+public: // Public methods
+ /**
+ * Returns a pointer to the printer object.
+ */
+ static CPrinter* const printer();
+ /**
+ * Returns a pointer to the backend ...
+ */
+ static CSwordBackend* const backend();
+};
+
+#endif
diff --git a/bibletime/frontend/cprofile.cpp b/bibletime/frontend/cprofile.cpp
new file mode 100644
index 0000000..176b7ea
--- /dev/null
+++ b/bibletime/frontend/cprofile.cpp
@@ -0,0 +1,375 @@
+/***************************************************************************
+ cprofile.cpp - description
+ -------------------
+ begin : Sun Jul 29 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cprofile.h"
+
+//Qt includes
+#include <qdom.h>
+#include <qfile.h>
+#include <qstring.h>
+#include <qtextstream.h>
+
+//KDE includes
+#include <kstddirs.h>
+#include <klocale.h>
+
+#define CURRENT_SYNTAX_VERSION 1
+
+CProfile::CProfile( const QString& file, const QString& name ):
+ m_name(name.isEmpty() ? i18n("unknown") : name),
+ m_filename(file),
+ m_fullscreen(false),
+ m_geometry(0,0,640,480)
+{
+
+ m_profileWindows.setAutoDelete(true);
+ if (!m_filename.isEmpty() && name.isEmpty()) {
+ loadBasics();
+ }
+ else if (m_filename.isEmpty() && !name.isEmpty()) {
+ m_filename = name;
+ m_filename.replace(QRegExp("\\s=#."),"_");
+ KStandardDirs stdDirs;
+ m_filename = stdDirs.saveLocation("data", "bibletime/profiles/") + m_filename + ".xml";
+ init(m_filename);
+ }
+ else
+ qWarning("CProfile: empty file name!");
+}
+
+CProfile::~CProfile(){
+ m_profileWindows.clear(); //delete all CProfileWindows objects (autodelete is enabled)
+}
+
+/** Loads the profile from the file given in the constructor. */
+QList<CProfileWindow> CProfile::load(){
+ QFile file(m_filename);
+ if (!file.exists())
+ return QList<CProfileWindow>();
+
+ QDomDocument doc;
+ if (file.open(IO_ReadOnly)) {
+ QTextStream t( &file );
+ t.setEncoding(QTextStream::UnicodeUTF8);
+ doc.setContent(t.read());
+ file.close();
+ }
+
+ QDomElement document = doc.documentElement();
+ if(document.tagName() != "BibleTime") {
+ qWarning("CProfile::load: Missing BibleTime doc");
+ return m_profileWindows;
+ }
+ if (document.hasAttribute("name")) {
+ m_name = document.attribute("name");
+ }
+
+
+ //load settings of the main window
+ {
+ // see if there's a section with the name MAINWINDOW
+ QDomElement elem = document.firstChild().toElement();
+ QDomElement mainWindow;
+ while (!elem.isNull()) {
+ if (elem.tagName() == "MAINWINDOW") {
+ mainWindow = elem;
+ break; //found the element
+ }
+ elem = elem.nextSibling().toElement();
+ }
+ if (!mainWindow.isNull()) { //was found
+ setFullscreen( (bool)mainWindow.attribute("fullscreen").toInt());
+ QDomElement object = mainWindow.namedItem("GEOMETRY").toElement();
+ QRect rect;
+ if(!object.isNull()) {
+ if (object.hasAttribute("x")) {
+ rect.setX(object.attribute("x").toInt());
+ }
+ if (object.hasAttribute("y")) {
+ rect.setY(object.attribute("y").toInt());
+ }
+ if (object.hasAttribute("width")) {
+ rect.setWidth(object.attribute("width").toInt());
+ }
+ if (object.hasAttribute("height")) {
+ rect.setHeight(object.attribute("height").toInt());
+ }
+ }
+ setGeometry(rect);
+ }
+ }
+
+ m_profileWindows.clear();
+ QDomElement elem = document.firstChild().toElement();
+ while (!elem.isNull()) {
+ CProfileWindow* p = 0;
+ if (elem.tagName() == "BIBLE") {
+ p = new CProfileWindow(CSwordModuleInfo::Bible);
+ }
+ else if (elem.tagName() == "COMMENTARY") {
+ p = new CProfileWindow(CSwordModuleInfo::Commentary);
+ }
+ else if (elem.tagName() == "LEXICON") {
+ p = new CProfileWindow(CSwordModuleInfo::Lexicon);
+ }
+ else if (elem.tagName() == "BOOK") {
+ p = new CProfileWindow(CSwordModuleInfo::GenericBook);
+ }
+
+ if (p) {
+ m_profileWindows.append(p);
+
+ if (elem.hasAttribute("windowSettings")) {
+ p->setWindowSettings( elem.attribute("windowSettings").toInt() );
+ }
+
+ QRect rect;
+
+ QDomElement object = elem.namedItem("GEOMETRY").toElement();
+ if(!object.isNull()) {
+ if (object.hasAttribute("x")) {
+ rect.setX(object.attribute("x").toInt());
+ }
+ if (object.hasAttribute("y")) {
+ rect.setY(object.attribute("y").toInt());
+ }
+ if (object.hasAttribute("width")) {
+ rect.setWidth(object.attribute("width").toInt());
+ }
+ if (object.hasAttribute("height")) {
+ rect.setHeight(object.attribute("height").toInt());
+ }
+ if (object.hasAttribute("isMaximized")) {
+ p->setMaximized( static_cast<bool>(object.attribute("isMaximized").toInt()) );
+ }
+ }
+ p->setGeometry(rect);
+
+ object = elem.namedItem("MODULES").toElement();
+ if(!object.isNull()) {
+ if (object.hasAttribute("list")) {
+ const QString sep = object.hasAttribute("separator") ? object.attribute("separator") : "|";
+ QStringList modules = QStringList::split(sep, object.attribute("list"));
+ p->setModules(modules);
+ }
+ }
+
+ object = elem.namedItem("KEY").toElement();
+ if(!object.isNull()) {
+ if (object.hasAttribute("name"))
+ p->setKey(object.attribute("name"));
+ }
+
+ object = elem.namedItem("SCROLLBARS").toElement();
+ if(!object.isNull()) {
+ int horizontal = 0, vertical = 0;
+ if (object.hasAttribute("horizontal"))
+ horizontal = object.attribute("horizontal").toInt();
+ if (object.hasAttribute("vertical"))
+ vertical = object.attribute("vertical").toInt();
+
+ p->setScrollbarPositions(horizontal, vertical);
+ }
+ }
+ elem = elem.nextSibling().toElement();
+ }
+ return m_profileWindows;
+}
+
+/** Saves the profile to the file given in the constructor. */
+const bool CProfile::save(QList<CProfileWindow> windows){
+ /** Save the settings using a XML file
+ * Save the CProfileWindow objects using a XML file which name is in m_filename
+ */
+ bool ret = false;
+ QDomDocument doc("DOC");
+ doc.appendChild( doc.createProcessingInstruction( "xml", "version=\"1.0\" encoding=\"UTF-8\"" ) );
+
+ QDomElement content = doc.createElement("BibleTime");
+ content.setAttribute("syntaxVersion", CURRENT_SYNTAX_VERSION);
+ content.setAttribute("name", m_name);
+ doc.appendChild(content);
+
+ //save mainwindow settings
+ {
+ QDomElement mainWindow = doc.createElement("MAINWINDOW");
+ mainWindow.setAttribute("fullscreen", fullscreen());
+
+ QDomElement geometry = doc.createElement("GEOMETRY");
+ mainWindow.appendChild(geometry);
+ const QRect r = this->geometry();
+ geometry.setAttribute("x",r.x());
+ geometry.setAttribute("y",r.y());
+ geometry.setAttribute("width",r.width());
+ geometry.setAttribute("height",r.height());
+
+ content.appendChild(mainWindow);
+ }
+
+ for (CProfileWindow* p = windows.first(); p; p = windows.next()) {
+ QDomElement window;
+ switch (p->type()) {
+ case CSwordModuleInfo::Bible:
+ window = doc.createElement("BIBLE");
+ break;
+ case CSwordModuleInfo::Commentary:
+ window = doc.createElement("COMMENTARY");
+ break;
+ case CSwordModuleInfo::Lexicon:
+ window = doc.createElement("LEXICON");
+ break;
+ case CSwordModuleInfo::GenericBook:
+ window = doc.createElement("BOOK");
+ break;
+ default:
+ break;
+ }
+ if (window.isNull())
+ break;
+ window.setAttribute("windowSettings", p->windowSettings());
+
+ //save geomtery
+ const QRect r = p->geometry();
+ QDomElement geometry = doc.createElement("GEOMETRY");
+ geometry.setAttribute("x",r.x());
+ geometry.setAttribute("y",r.y());
+ geometry.setAttribute("width",r.width());
+ geometry.setAttribute("height",r.height());
+ geometry.setAttribute("isMaximized",static_cast<int>(p->maximized()));
+ window.appendChild( geometry );
+
+ QDomElement modules = doc.createElement("MODULES");
+ modules.setAttribute("separator", "|");
+ modules.setAttribute("list", p->modules().join("|"));
+ window.appendChild( modules );
+
+ QDomElement key = doc.createElement("KEY");
+ key.setAttribute("name", p->key());
+ window.appendChild( key );
+
+ QDomElement scrollbars = doc.createElement("SCROLLBARS");
+ scrollbars.setAttribute("horizontal", p->scrollbarPositions().horizontal);
+ scrollbars.setAttribute("vertical", p->scrollbarPositions().vertical);
+ window.appendChild( scrollbars );
+
+ content.appendChild( window );
+ }
+
+ QFile file(m_filename);
+ if ( file.open(IO_WriteOnly) ) {
+ ret = true;
+ QTextStream t( &file );
+ t.setEncoding(QTextStream::UnicodeUTF8);
+ t << doc.toString();
+ file.close();
+ }
+ else
+ ret = false;
+
+ return ret;
+}
+
+/** Saves the profile to the file given in the constructor. */
+const bool CProfile::save(){
+ return save(m_profileWindows);
+}
+
+/** Returns the filename used for this profile. */
+const QString& CProfile::filename(){
+ return m_filename;
+}
+
+/** Returns the name of this profile. */
+const QString& CProfile::name(){
+ return m_name;
+}
+
+/** Initializes the XML for the first time (use to create a new profile) */
+void CProfile::init(const QString file){
+ const QString oldFile = m_filename;
+ m_filename = file;
+ save(QList<CProfileWindow>());
+ m_filename = oldFile;
+}
+
+/** Changes the name of this profile. */
+void CProfile::setName( const QString& newName ){
+ m_name = newName;
+ saveBasics(); //save chanegd name
+}
+
+/** Loads the basic settings requires for proper operation. */
+void CProfile::loadBasics(){
+ QFile file(m_filename);
+ if (!file.exists())
+ return;
+
+ QDomDocument doc;
+ if (file.open(IO_ReadOnly)) {
+ QTextStream t( &file );
+ t.setEncoding(QTextStream::UnicodeUTF8);
+ doc.setContent(t.read());
+ file.close();
+ }
+ QDomElement document = doc.documentElement();
+ if (document.hasAttribute("name"))
+ m_name = document.attribute("name");
+}
+
+void CProfile::saveBasics(){
+ QFile file(m_filename);
+ if (!file.exists())
+ return;
+
+ QDomDocument doc;
+ if (file.open(IO_ReadOnly)) {
+ QTextStream t(&file);
+ t.setEncoding(QTextStream::UnicodeUTF8);
+ doc.setContent(t.read());
+ file.close();
+ }
+
+ QDomElement document = doc.documentElement();
+ document.setAttribute("name", m_name);
+
+ if (file.open(IO_WriteOnly)) {
+ QTextStream t( &file );
+ t.setEncoding(QTextStream::UnicodeUTF8);
+ t << doc.toString();
+ file.close();
+ }
+}
+
+/** Returns true if the main window was in fullscreen mode as the profile was saved. */
+const bool CProfile::fullscreen() const {
+ return m_fullscreen;
+}
+
+/** Set the parameter to true if the main window coveres the full screen size. */
+void CProfile::setFullscreen( const bool fullscreen ){
+ m_fullscreen = fullscreen;
+}
+
+/** Returns the geometry of the main window */
+const QRect CProfile::geometry(){
+ return m_geometry;
+}
+
+/** Stes the geoemtry of the main window */
+void CProfile::setGeometry( const QRect rect ){
+ m_geometry = rect;
+}
diff --git a/bibletime/frontend/cprofile.h b/bibletime/frontend/cprofile.h
new file mode 100644
index 0000000..0187b09
--- /dev/null
+++ b/bibletime/frontend/cprofile.h
@@ -0,0 +1,95 @@
+/***************************************************************************
+ cprofile.h - description
+ -------------------
+ begin : Sun Jul 29 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CPROFILE_H
+#define CPROFILE_H
+
+#include "cprofilewindow.h"
+
+//Qt includes
+#include <qlist.h>
+
+/** Manages one profile file. Provides functions to save and restore settings of the available display windows.
+ * @author The BibleTime team
+ */
+class CProfile {
+public:
+ CProfile(const QString& fileName, const QString& name = QString::null);
+ ~CProfile();
+
+ /**
+ * Saves the profile to the file given in the constructor.
+ * @param windows The list of windows available in the profile.
+ */
+ const bool save( QList<CProfileWindow> windows );
+ /**
+ * Saves the profile to the file given in the constructor.
+ */
+ const bool save();
+ /**
+ * Loads the profile from the file given in the constructor.
+ * @return The list of profiled window which exist in the profile.
+ */
+ QList<CProfileWindow> load();
+ /**
+ * Returns the name of this profile.
+ */
+ const QString& name();
+ /**
+ * Returns the filename used for this profile.
+ */
+ const QString& filename();
+ /**
+ * Initializes the XML for the first time (use to create a new profile)
+ */
+ void init(const QString);
+ /**
+ * Chnages the name of this profile.
+ */
+ void setName( const QString& );
+ /**
+ * Set the parameter to true if the main window coveres the full screen size.
+ */
+ void setFullscreen( const bool fullscreen );
+ /**
+ * Returns true if the main window was in fullscreen mode as the profile was saved.
+ */
+ const bool fullscreen() const;
+ /**
+ * Sets the geoemtry of the main window
+ */
+ void setGeometry( const QRect rect );
+ /**
+ * Returns the geometry of the main window
+ */
+ const QRect geometry();
+
+private:
+ /**
+ * Loads the basic settings requires for proper operation.
+ */
+ void loadBasics();
+ void saveBasics();
+
+ QList<CProfileWindow> m_profileWindows;
+ QString m_name;
+ QString m_filename;
+ bool m_fullscreen;
+ QRect m_geometry;
+};
+
+#endif
diff --git a/bibletime/frontend/cprofilemgr.cpp b/bibletime/frontend/cprofilemgr.cpp
new file mode 100644
index 0000000..11ed004
--- /dev/null
+++ b/bibletime/frontend/cprofilemgr.cpp
@@ -0,0 +1,115 @@
+/***************************************************************************
+ cprofilemgr.cpp - description
+ -------------------
+ begin : Sun Jul 29 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cprofilemgr.h"
+
+//Qt includes
+#include <qdir.h>
+#include <qfile.h>
+#include <qlist.h>
+
+//KDE includes
+#include <kstddirs.h>
+
+CProfileMgr::CProfileMgr() : m_startupProfile(0) {
+ m_profiles.setAutoDelete(true);
+
+ KStandardDirs stdDirs;
+ m_profilePath = stdDirs.saveLocation("data", "bibletime/profiles/");
+
+ QDir d( m_profilePath );
+ QStringList files = d.entryList("*.xml");
+ for ( QStringList::Iterator it = files.begin(); it != files.end(); ++it ) {
+ if ((*it) != "_startup_.xml")
+ m_profiles.append(new CProfile(m_profilePath + *it));
+ else
+ m_startupProfile = new CProfile(m_profilePath + *it);
+ }
+}
+
+CProfileMgr::~CProfileMgr(){
+ m_profiles.clear();//autoDelete is enabled, so all profiles are deleted
+}
+
+/** Returns a list of available profiles. */
+const QList<CProfile>& CProfileMgr::profiles(){
+ return m_profiles;
+}
+
+/** Creates a new profile with the name "name" (first parameter). @return The profile object */
+CProfile* CProfileMgr::create( const QString name ){
+ CProfile* p = new CProfile(QString::null, name);
+ m_profiles.append(p);
+
+ return p;
+}
+
+/** Removes the profile from the list and from the directory containg the profile files. */
+const bool CProfileMgr::remove( CProfile* p ){
+ bool ret = false;
+ QFile f( p->filename() );
+ if (f.exists())
+ f.remove();
+ if(m_profiles.remove(p)); //auto delete is enabled
+ ret = true;
+ return ret;
+}
+
+const bool CProfileMgr::remove( const QString& profile) {
+ bool ret = false;
+ for (CProfile* p = m_profiles.first(); p; p = m_profiles.next()) {
+ if (p->name() == profile) {
+ remove(p);
+ ret = true;
+ }
+ }
+ return ret;
+}
+
+/** Returns the profile with the desired name. If there's no such profile 0 is returned. */
+CProfile* CProfileMgr::profile(const QString& name) {
+ for (m_profiles.first(); m_profiles.current(); m_profiles.next()) {
+ if (m_profiles.current()->name() == name) {
+ return m_profiles.current();
+ }
+ }
+ return 0;
+}
+
+/** Returns the startup profile if it exists, otherwise return 0. */
+CProfile* CProfileMgr::startupProfile(){
+ if (!m_startupProfile)
+ m_startupProfile = new CProfile(QString::null, "_startup_");
+ return m_startupProfile;
+}
+
+/** Refreshes the profiles available on disk. Use this function to update the list of profiles after another instance of CProfileMgr created a new profile. */
+void CProfileMgr::refresh(){
+ m_profiles.clear(); //delete all profiles
+ QDir d( m_profilePath );
+ QStringList files = d.entryList("*.xml");
+ for ( QStringList::Iterator it = files.begin(); it != files.end(); ++it ) {
+ CProfile p(m_profilePath + *it);
+ if (p.name() == "_startup_") { //new startup profile
+ if (!m_startupProfile) //don't put this in the if clause above,it doesn't work!
+ m_startupProfile = new CProfile(m_profilePath + *it);
+ }
+ else if (!profile(p.name())) { //don't have it already
+ m_profiles.append(new CProfile(m_profilePath + *it));
+ }
+ }
+}
diff --git a/bibletime/frontend/cprofilemgr.h b/bibletime/frontend/cprofilemgr.h
new file mode 100644
index 0000000..4cbbb0c
--- /dev/null
+++ b/bibletime/frontend/cprofilemgr.h
@@ -0,0 +1,71 @@
+/***************************************************************************
+ cprofilemgr.h - description
+ -------------------
+ begin : Sun Jul 29 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CPROFILEMGR_H
+#define CPROFILEMGR_H
+
+#include "cprofile.h"
+
+//Qt includes
+#include <qstring.h>
+
+/** The manager for profiles.
+ * Provides functions to create, delete, save and load profiles.
+ * @author The BibleTime team
+ */
+
+class CProfileMgr {
+public:
+ CProfileMgr();
+ ~CProfileMgr();
+
+ /** Creates a new profile with the name "name" (first parameter).
+ * @return The profile object
+ */
+ CProfile* create( const QString name );
+ /**
+ * @return a list of available profiles
+ */
+ const QList<CProfile>& profiles();
+ /**
+ * Removes the profile from the list and from the directory containg the profile files.
+ */
+ const bool remove( CProfile* p );
+ /**
+ * Removes the profile from the list and from the directory containg the profile files.
+ */
+ const bool remove( const QString& );
+ /**
+ * Returns the profile with the desired name. If there's no such profile 0 is returned.
+ */
+ CProfile* profile(const QString&);
+ /**
+ * Returns the startup profile if it exists, otherwise return 0.
+ */
+ CProfile* startupProfile();
+ /**
+ * Refreshes the profiles available on disk. Use this function to update the list of profiles after another instance of CProfileMgr created a new profile.
+ */
+ void refresh();
+
+protected:
+ QList<CProfile> m_profiles;
+ QString m_profilePath;
+ CProfile* m_startupProfile;
+};
+
+#endif
diff --git a/bibletime/frontend/cprofilewindow.cpp b/bibletime/frontend/cprofilewindow.cpp
new file mode 100644
index 0000000..4f01cc5
--- /dev/null
+++ b/bibletime/frontend/cprofilewindow.cpp
@@ -0,0 +1,105 @@
+/***************************************************************************
+ cprofilewindow.cpp - description
+ -------------------
+ begin : Sun Jul 29 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cprofilewindow.h"
+
+CProfileWindow::CProfileWindow(CSwordModuleInfo::ModuleType type)
+ : m_type(type), m_windowGeometry(),m_moduleList(), m_key(QString::null),
+ m_maximized(false), m_windowSettings(0) {
+
+}
+
+CProfileWindow::~CProfileWindow(){
+
+}
+
+/** Returns the size of the window including the x,y coordinates. */
+const QRect CProfileWindow::geometry() {
+ return m_windowGeometry;
+}
+
+/** Sets the size of the window. */
+void CProfileWindow::setGeometry( const QRect rect ){
+ m_windowGeometry = rect;
+}
+
+/** Returns the type of the managed window (bible window, commentary window or lexicon window). */
+const CSwordModuleInfo::ModuleType CProfileWindow::type(){
+ if (m_type != CSwordModuleInfo::Unknown)
+ return m_type;
+}
+
+/** Sets the modules. */
+void CProfileWindow::setModules( QStringList modules ){
+ m_moduleList = modules; //copy module pointers into our own list
+}
+
+/** Returns a list of module names which are chosen in the managed window profile. */
+const QStringList CProfileWindow::modules(){
+// QStringList modules;
+// for (CSwordModuleInfo* m = m_moduleList.first(); m; m = m_moduleList.next()) {
+// modules.append(m->getName());
+// }
+// return modules;
+ return m_moduleList;
+}
+
+/** Returns the current key set in the modules. */
+const QString& CProfileWindow::key(){
+ return m_key;
+}
+
+/** Set the key used in the modules. */
+void CProfileWindow::setKey( const QString& key ){
+ m_key = key;
+}
+
+/** Sets the current position of the scrollbars. */
+void CProfileWindow::setScrollbarPositions(const int horizontal, const int vertical) {
+// m_scrollbarPos = {x,y};
+ m_scrollbarPos.horizontal = horizontal;
+ m_scrollbarPos.vertical = vertical;
+}
+/** Returns tghe position of the scrollbars */
+const CProfileWindow::ScrollbarPos CProfileWindow::scrollbarPositions(){
+ return m_scrollbarPos;
+}
+
+/** Sets the type of the used modules. */
+void CProfileWindow::setType(const CSwordModuleInfo::ModuleType type){
+ m_type = type;
+}
+
+/** Returns true if the window is maximized. */
+const bool CProfileWindow::maximized(){
+ return m_maximized;
+}
+
+/** Sets the windows maximized state to true or false. */
+void CProfileWindow::setMaximized( const bool maximized ){
+ m_maximized = maximized;
+}
+
+/** Returns an integer with the window specific settings */
+const int CProfileWindow::windowSettings(){
+ return m_windowSettings;
+}
+
+/** Sets the window specific settings. */
+void CProfileWindow::setWindowSettings( const int settings ){
+ m_windowSettings = settings;
+}
diff --git a/bibletime/frontend/cprofilewindow.h b/bibletime/frontend/cprofilewindow.h
new file mode 100644
index 0000000..dec8125
--- /dev/null
+++ b/bibletime/frontend/cprofilewindow.h
@@ -0,0 +1,110 @@
+/***************************************************************************
+ cprofilewindow.h - description
+ -------------------
+ begin : Sun Jul 29 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CPROFILEWINDOW_H
+#define CPROFILEWINDOW_H
+
+#include "backend/cswordmoduleinfo.h"
+#include "backend/cswordbackend.h"
+
+//Qt includes
+#include <qstring.h>
+#include <qrect.h>
+#include <qstringlist.h>
+#include <qlist.h>
+
+/** Contains the settings for one window saved in the profile.
+ * @author The BibleTime team
+ */
+class CProfileWindow {
+public:
+ struct ScrollbarPos {
+ int horizontal; //the position of the horizontal scrollbar
+ int vertical; //the position of the vertical scrollbar
+ };
+
+ CProfileWindow(CSwordModuleInfo::ModuleType type = CSwordModuleInfo::Unknown);
+ ~CProfileWindow();
+ /**
+ * Sets the modules.
+ */
+ void setModules( QStringList modules );
+ /**
+ * Returns the type of the managed window (bible window, commentary window or lexicon window).
+ */
+ const CSwordModuleInfo::ModuleType type();
+ /**
+ * Sets the type of the used modules.
+ */
+ void setType(const CSwordModuleInfo::ModuleType type);
+ /**
+ * Sets the size of the window.
+ */
+ void setGeometry( const QRect s );
+ /**
+ * Returns the size of the window including the x,y coordinates.
+ */
+ const QRect geometry();
+ /**
+ * Returns a list of module names which are chosen in the managed window profile.
+ */
+ const QStringList modules();
+ /**
+ * Set the key used in the modules.
+ */
+ void setKey( const QString& );
+ /**
+ * Returns the current key set in the modules.
+ */
+ const QString& key();
+ /**
+ * Sets the current position of the scrollbars.
+ */
+ void setScrollbarPositions(const int x, const int y);
+ /**
+ * Sets the windows maximized state to true or false.
+ */
+ void setMaximized( const bool maximized );
+ /**
+ * Sets the window specific settings.
+ */
+ void setWindowSettings( const int settings );
+ /**
+ * Returns an integer with the window specific settings
+ */
+ const int windowSettings();
+ /**
+ * Returns true if the window is maximized.
+ */
+ const bool maximized();
+ /**
+ * Returns tghe position of the scrollbars
+ */
+ const CProfileWindow::ScrollbarPos scrollbarPositions();
+
+private:
+ CSwordModuleInfo::ModuleType m_type;
+ QRect m_windowGeometry;
+ QStringList m_moduleList;
+ QString m_key;
+ ScrollbarPos m_scrollbarPos;
+ bool m_maximized;
+ int m_windowSettings;
+};
+
+#endif
+
diff --git a/bibletime/frontend/ctoolclass.cpp b/bibletime/frontend/ctoolclass.cpp
new file mode 100644
index 0000000..2d7f209
--- /dev/null
+++ b/bibletime/frontend/ctoolclass.cpp
@@ -0,0 +1,185 @@
+/***************************************************************************
+ ctoolclass.cpp - some methods,that would be normal global,but
+ I hate global function :-)
+
+ begin : 20 Jan 1999
+ copyright : (C) 1999 by Sandy Meier
+ email : smeier@rz.uni-potsdam.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//own includes
+#include "ctoolclass.h"
+
+#include "resource.h"
+#include "backend/cswordmoduleinfo.h"
+
+//QT includes
+#include <qlabel.h>
+#include <qfile.h>
+#include <qfiledialog.h>
+#include <qtextstream.h>
+#include <qregexp.h>
+
+//KDE includes
+#include <klocale.h>
+#include <kglobal.h>
+#include <kstddirs.h>
+#include <kmessagebox.h>
+#include <kurl.h>
+#include <kfiledialog.h>
+#include <kapp.h>
+
+
+QString CToolClass::locatehtml(const QString &filename) {
+ QString path = locate("html", KGlobal::locale()->language() + '/' + filename);
+ if (path.isNull())
+ path = locate("html", "default/" + filename);
+ if (path.isNull())
+ path = locate("html", "en/" + filename);
+ return path;
+}
+
+/** Converts HTML text to plain text */
+QString CToolClass::htmlToText(const QString& html) {
+ QString newText = html;
+ // convert some tags we need in code
+ newText.replace( QRegExp(" "),"#SPACE#" );
+ newText.replace( QRegExp("<BR>\\s*"), "<BR>\n" );
+ newText.replace( QRegExp("#SPACE#")," " );
+ return newText;
+}
+
+/** Converts text to HTML (\n to <BR>) */
+QString CToolClass::textToHTML(const QString& text){
+ QString newText = text;
+ newText.replace( QRegExp("<BR>\n"),"#NEWLINE#" );
+ newText.replace( QRegExp("\n"),"<BR>\n" );
+ newText.replace( QRegExp("#NEWLINE#"),"<BR>\n");
+ return newText;
+}
+
+/** Creates the file filename and put text into the file.
+ */
+bool CToolClass::savePlainFile( const QString& filename, const QString& text){
+ QFile saveFile(filename);
+ bool ret;
+
+ if (saveFile.exists()) {
+ if (KMessageBox::warningYesNo(0,
+ QString::fromLatin1("<qt><B>%1</B><BR>%2</qt>")
+ .arg( i18n("The file does already exist!") )
+ .arg( i18n("Do you want to overwrite it?")))
+ == KMessageBox::No
+ )
+ return false;
+ else
+ saveFile.remove();
+ }
+
+ if ( saveFile.open(IO_ReadWrite) ) {
+ QTextStream textstream( &saveFile );
+ textstream << text;
+ saveFile.close();
+ ret = true;
+ }
+ else {
+ KMessageBox::error(0, QString::fromLatin1("<qt>%1<BR><B>%2</B></qt>")
+ .arg( i18n("Sorry! But the file couldn't be saved!") )
+ .arg( i18n("Please check permissions etc. !")));
+ saveFile.close();
+ ret = false;
+ }
+ return ret;
+}
+
+
+/** Returns the icon used for the module given as aparameter. */
+QPixmap CToolClass::getIconForModule( CSwordModuleInfo* module_info ){
+ if (!module_info)
+ return QPixmap(BIBLE_ICON_SMALL);
+
+ switch (module_info->type()){
+ case CSwordModuleInfo::Bible:
+ if (module_info->isLocked())
+ return QPixmap(BIBLE_LOCKED_ICON_SMALL);
+ else
+ return QPixmap(BIBLE_ICON_SMALL);
+
+ case CSwordModuleInfo::Lexicon:
+ if (module_info->isLocked())
+ return QPixmap(LEXICON_LOCKED_ICON_SMALL);
+ else
+ return QPixmap(LEXICON_ICON_SMALL);
+
+ case CSwordModuleInfo::Commentary:
+ if (module_info->isLocked())
+ return QPixmap(COMMENTARY_LOCKED_ICON_SMALL);
+ else
+ return QPixmap(COMMENTARY_ICON_SMALL);
+
+ case CSwordModuleInfo::GenericBook:
+ if (module_info->isLocked())
+ return QPixmap(BOOK_LOCKED_ICON_SMALL);
+ else
+ return QPixmap(BOOK_ICON_SMALL);
+
+ case CSwordModuleInfo::Unknown:
+ default:
+ return QPixmap(BIBLE_ICON_SMALL);
+ }
+}
+
+int CToolClass::makeLogicFontSize( const int s ) {
+ const int defSize = QApplication::font().pointSize();
+ if ( s < defSize - 4 )
+ return 1;
+ if ( s < defSize )
+ return 2;
+ if ( s < defSize + 4 )
+ return 3;
+ if ( s < defSize + 8 )
+ return 4;
+ if ( s < defSize + 12 )
+ return 5;
+ if (s < defSize + 16 )
+ return 6;
+ return 7;
+}
+
+QLabel* CToolClass::explanationLabel(QWidget* parent, const QString& heading, const QString& text ){
+ QLabel* label = new QLabel( QString::fromLatin1("<B>%1</B><BR>%2").arg(heading).arg(text),parent );
+ label->setAutoResize(true);
+ label->setMargin(1);
+ label->setFrameStyle(QFrame::Box | QFrame::Plain);
+ return label;
+}
+/** No descriptions */
+bool CToolClass::inHTMLTag(int pos, QString & text){
+ int i1=text.findRev("<",pos);
+ int i2=text.findRev(">",pos);
+ int i3=text.find(">",pos);
+ int i4=text.find("<",pos);
+
+
+// if ((i1>0) && (i2==-1)) //we're in th first html tag
+// i2=i1; // not ncessary, just for explanation
+
+ if ((i3>0) && (i4==-1)) //we're in the last html tag
+ i4=i3+1;
+
+// qWarning("%d > %d && %d < %d",i1,i2,i3,i4);
+
+ if ( (i1>i2) && (i3<i4) )
+ return true; //yes, we're in a tag
+
+ return false;
+}
diff --git a/bibletime/frontend/ctoolclass.h b/bibletime/frontend/ctoolclass.h
new file mode 100644
index 0000000..046e732
--- /dev/null
+++ b/bibletime/frontend/ctoolclass.h
@@ -0,0 +1,84 @@
+/***************************************************************************
+ ctoolclass.h - some methods,that would be normal global, but
+ I hate global function :-)
+ -------------------
+
+ begin : 20 Jan 1999
+ copyright : (C) 1999 by Joachim Ansorg
+ email : Jockel123@gmx.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+
+
+//Qt includes
+#include <qstring.h>
+#include <qpixmap.h>
+
+
+#ifndef CTOOLCLASS_H
+#define CTOOLCLASS_H
+
+
+class CSwordModuleInfo;
+class QLabel;
+
+/**
+ * Provides some useful functions which would be normally global.
+ *
+ * Some methods,that would be normaly global, but I hate global functions :-)
+ * (the function locateHTML is from Sandy Meier (KDevelop))
+ *
+ * @short A class which contains static members to do small things.
+ * @author Joachim Ansorg <jansorg@gmx.de>
+ */
+class CToolClass {
+
+public:
+ /**
+ * @return The path of the HTML file "filename". This function searches only in $KDEDIR.
+ * @author Sandy Meier of the KDevelop team.
+ */
+ static QString locatehtml(const QString &filename);
+ /**
+ * Converts HTML text to plain text.
+ * This function converts some HTML tags in text (e.g. <BR> to \n)
+ * @return The text withput HTML tags and with converted <BR> to \n
+ * @author Joachim Ansorg
+ */
+ static QString htmlToText(const QString&);
+ /**
+ * Converts text to HTML converting some text commands into HTML tags (e.g. \n to <BR>)
+ * @return The HTML formatted text we got after changing \n to <BR>
+ * @author Joachim Ansorg
+ */
+ static QString textToHTML(const QString&);
+ /**
+ * Creates the file filename and put the text of parameter "text" into the file.
+ * @return True if saving was sucessful, otherwise false
+ * @author Joachim Ansorg
+ */
+ static bool savePlainFile( const QString& filename, const QString& text);
+ /**
+ * Returns the icon used for the module given as aparameter.
+ */
+ static QPixmap getIconForModule( CSwordModuleInfo* );
+ /**
+ * Returns the logical font size which should
+ * be used for the absolute size s
+ */
+ static int makeLogicFontSize( const int s );
+ static QLabel* explanationLabel(QWidget* parent, const QString& heading, const QString& text );
+ static bool inHTMLTag(int pos, QString & text);
+};
+
+#endif
diff --git a/bibletime/frontend/groupmanager/Makefile.am b/bibletime/frontend/groupmanager/Makefile.am
new file mode 100644
index 0000000..f14759b
--- /dev/null
+++ b/bibletime/frontend/groupmanager/Makefile.am
@@ -0,0 +1,18 @@
+INCLUDES = $(all_includes)
+libgroupmanager_a_METASOURCES = AUTO
+noinst_LIBRARIES = libgroupmanager.a
+
+libgroupmanager_a_SOURCES = \
+cgroupmanager.cpp \
+cgroupmanageritem.cpp
+
+all_headers = cgroupmanager.h \
+cgroupmanageritem.h
+
+EXTRA_DIST = \
+$(libgroupmanager_a_SOURCES) $(all_headers)
+
+
+
+
+
diff --git a/bibletime/frontend/groupmanager/Makefile.in b/bibletime/frontend/groupmanager/Makefile.in
new file mode 100644
index 0000000..4cbd948
--- /dev/null
+++ b/bibletime/frontend/groupmanager/Makefile.in
@@ -0,0 +1,608 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+INCLUDES = $(all_includes)
+#>- libgroupmanager_a_METASOURCES = AUTO
+noinst_LIBRARIES = libgroupmanager.a
+
+libgroupmanager_a_SOURCES = cgroupmanager.cpp cgroupmanageritem.cpp
+
+
+all_headers = cgroupmanager.h cgroupmanageritem.h
+
+
+EXTRA_DIST = $(libgroupmanager_a_SOURCES) $(all_headers)
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../../config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I../../..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libgroupmanager_a_LIBADD =
+#>- libgroupmanager_a_OBJECTS = cgroupmanager.$(OBJEXT) \
+#>- cgroupmanageritem.$(OBJEXT)
+#>+ 7
+libgroupmanager_a_final_OBJECTS = libgroupmanager_a.all_cpp.o
+libgroupmanager_a_nofinal_OBJECTS = cgroupmanager.$(OBJEXT) \
+cgroupmanageritem.$(OBJEXT)\
+cgroupmanager.moc.o \
+libgroupmanager_a_meta_unload.o
+@KDE_USE_FINAL_FALSE@libgroupmanager_a_OBJECTS = $(libgroupmanager_a_nofinal_OBJECTS)
+@KDE_USE_FINAL_TRUE@libgroupmanager_a_OBJECTS = $(libgroupmanager_a_final_OBJECTS)
+AR = ar
+CXXFLAGS = @CXXFLAGS@
+#>- CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+CXXLD = $(CXX)
+#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
+#>+ 1
+CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+#>- DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+#>+ 4
+KDE_DIST=cgroupmanager.h cgroupmanageritem.h
+
+DISTFILES= $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
+
+
+TAR = tar
+GZIP_ENV = --best
+#>- DEP_FILES = .deps/cgroupmanager.P .deps/cgroupmanageritem.P
+#>+ 4
+@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/cgroupmanager.moc.P $(DEPDIR)/libgroupmanager_a_meta_unload.P $(DEPDIR)/libgroupmanager_a.all_cpp.P \
+ .deps/cgroupmanager.P .deps/cgroupmanageritem.P
+@KDE_USE_FINAL_FALSE@DEP_FILES = $(DEPDIR)/cgroupmanager.moc.P $(DEPDIR)/libgroupmanager_a_meta_unload.P .deps/cgroupmanager.P .deps/cgroupmanageritem.P
+
+SOURCES = $(libgroupmanager_a_SOURCES)
+OBJECTS = $(libgroupmanager_a_OBJECTS)
+
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .cpp .lo .o .obj .s
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/groupmanager/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/groupmanager/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/frontend/groupmanager/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.s.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libgroupmanager.a: $(libgroupmanager_a_OBJECTS) $(libgroupmanager_a_DEPENDENCIES)
+ -rm -f libgroupmanager.a
+ $(AR) cru libgroupmanager.a $(libgroupmanager_a_OBJECTS) $(libgroupmanager_a_LIBADD)
+ $(RANLIB) libgroupmanager.a
+.cpp.o:
+ $(CXXCOMPILE) -c $<
+.cpp.obj:
+ $(CXXCOMPILE) -c `cygpath -w $<`
+.cpp.lo:
+ $(LTCXXCOMPILE) -c $<
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/frontend/groupmanager
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/frontend/groupmanager/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+ -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+ @echo '$(COMPILE) -c $<'; \
+ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.c
+ @echo '$(LTCOMPILE) -c $<'; \
+ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+
+%.o: %.cpp
+ @echo '$(CXXCOMPILE) -c $<'; \
+ $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.cpp
+ @echo '$(LTCXXCOMPILE) -c $<'; \
+ $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
+ mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+#>- clean-am: clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+#>- clean-depend clean-generic mostlyclean-am
+#>+ 2
+clean-am: clean-metasources clean-moc-classes clean-final clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+ clean-depend clean-generic mostlyclean-am
+
+#>- clean: clean-am
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+distclean-am: distclean-noinstLIBRARIES distclean-compile \
+ distclean-libtool distclean-tags distclean-depend \
+ distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-tags maintainer-clean-depend \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 3
+cgroupmanager.moc.cpp: $(srcdir)/cgroupmanager.h
+ $(MOC) $(srcdir)/cgroupmanager.h -o cgroupmanager.moc.cpp
+
+#>+ 3
+clean-metasources:
+ -rm -f cgroupmanager.moc.cpp
+
+#>+ 2
+docs-am:
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/groupmanager/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/frontend/groupmanager/Makefile.in
+
+
+#>+ 10
+libgroupmanager_a_meta_unload.cpp: cgroupmanager.moc.cpp
+ @echo 'creating libgroupmanager_a_meta_unload.cpp'
+ @-rm -f libgroupmanager_a_meta_unload.cpp
+ @echo 'static const char * _metalist_libgroupmanager_a[] = {' > libgroupmanager_a_meta_unload.cpp
+ @cat cgroupmanager.moc.cpp | grep 'char.*className' | sed -e 's/.*[^A-Za-z0-9_:]\([A-Za-z0-9_:]*\)::className.*$$/\"\1\",/' | sort | uniq >> libgroupmanager_a_meta_unload.cpp
+ @echo '0};' >> libgroupmanager_a_meta_unload.cpp
+ @echo '#include <kunload.h>' >> libgroupmanager_a_meta_unload.cpp
+ @echo '_UNLOAD(libgroupmanager_a)' >> libgroupmanager_a_meta_unload.cpp
+
+
+#>+ 3
+clean-moc-classes:
+ -rm -f libgroupmanager_a_meta_unload.cpp
+
+#>+ 11
+libgroupmanager_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/cgroupmanager.cpp $(srcdir)/cgroupmanageritem.cpp libgroupmanager_a_meta_unload.cpp cgroupmanager.moc.cpp
+ @echo 'creating libgroupmanager_a.all_cpp.cpp ...'; \
+ rm -f libgroupmanager_a.all_cpp.files libgroupmanager_a.all_cpp.final; \
+ echo "#define KDE_USE_FINAL 1" >> libgroupmanager_a.all_cpp.final; \
+ for file in cgroupmanager.cpp cgroupmanageritem.cpp libgroupmanager_a_meta_unload.cpp cgroupmanager.moc.cpp; do \
+ echo "#include \"$$file\"" >> libgroupmanager_a.all_cpp.files; \
+ test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libgroupmanager_a.all_cpp.final; \
+ done; \
+ cat libgroupmanager_a.all_cpp.final libgroupmanager_a.all_cpp.files > libgroupmanager_a.all_cpp.cpp; \
+ rm -f libgroupmanager_a.all_cpp.final libgroupmanager_a.all_cpp.files
+
+#>+ 3
+clean-final:
+ -rm -f libgroupmanager_a.all_cpp.cpp
+
+#>+ 2
+final:
+ $(MAKE) libgroupmanager_a_OBJECTS="$(libgroupmanager_a_final_OBJECTS)" all-am
+#>+ 2
+no-final:
+ $(MAKE) libgroupmanager_a_OBJECTS="$(libgroupmanager_a_nofinal_OBJECTS)" all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/frontend/groupmanager/cgroupmanager.cpp b/bibletime/frontend/groupmanager/cgroupmanager.cpp
new file mode 100644
index 0000000..af4f59d
--- /dev/null
+++ b/bibletime/frontend/groupmanager/cgroupmanager.cpp
@@ -0,0 +1,1615 @@
+/***************************************************************************
+ cgroupmanager.cpp - description
+ -------------------
+ begin : Wed Jan 19 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#define BOOKMARK_FORMAT_VERSION 1
+
+
+//own includes
+#include "cgroupmanager.h"
+#include "cgroupmanageritem.h"
+
+#include "backend/cswordbiblemoduleinfo.h"
+#include "backend/cswordcommentarymoduleinfo.h"
+#include "backend/cswordlexiconmoduleinfo.h"
+#include "backend/cswordversekey.h"
+#include "backend/cswordldkey.h"
+#include "backend/creferencemanager.h"
+#include "printing/cprintitem.h"
+#include "printing/cprinter.h"
+
+#include "frontend/chtmldialog.h"
+#include "frontend/cinputdialog.h"
+#include "frontend/searchdialog/csearchdialog.h"
+#include "frontend/cbtconfig.h"
+#include "frontend/cexportmanager.h"
+
+#include "whatsthisdef.h"
+#include "resource.h"
+
+#include <iostream.h>
+
+//QT includes
+#include <qheader.h>
+#include <qevent.h>
+#include <qmessagebox.h>
+#include <qdragobject.h>
+#include <qstringlist.h>
+#include <qvaluelist.h>
+#include <qwhatsthis.h>
+#include <qinputdialog.h>
+
+//KDE includes
+#include <klocale.h>
+#include <kstddirs.h>
+#include <kiconloader.h>
+#include <kconfig.h>
+#include <kapp.h>
+#include <kpopupmenu.h>
+#include <kglobalsettings.h>
+#include <kdestyle.h>
+#include <kpassdlg.h>
+#include <kfiledialog.h>
+#include <kmessagebox.h>
+
+
+CGroupManager::ToolTip::ToolTip(QWidget* parent) : QToolTip(parent) {
+}
+
+void CGroupManager::ToolTip::maybeTip(const QPoint& p) {
+ if (!parentWidget()->inherits("CGroupManager"))
+ return;
+
+ CGroupManager* m = 0;
+ if ( !(m = dynamic_cast<CGroupManager*>(parentWidget())) )
+ return;
+ CGroupManagerItem* i = 0;
+ if ( !( i = dynamic_cast<CGroupManagerItem*>(m->itemAt(p))) )
+ return;
+
+ QRect r = m->itemRect(i);
+ if (!r.isValid())
+ return;
+
+ //get type of item and display correct text
+ const QString text = i->getToolTip();
+ if (!text.isEmpty()) {
+ const QFont oldFont = font();
+ CSwordModuleInfo* m = dynamic_cast<CSwordModuleInfo*>(i->moduleInfo());
+
+ //Module is Unicode-based. Only set font if a bookmark should be displayed
+ if (i->getBookmarkKey() && m && m->isUnicode() )
+ setFont(CBTConfig::get( CBTConfig::unicode ));
+
+ tip(r, text);
+ setFont(oldFont);
+ }
+}
+
+
+CGroupManager::CGroupManager(QWidget *parent, const char *name, ListCSwordModuleInfo *swordList, const bool useBookmarks, const bool saveSettings, const bool useDnD, const bool useExtendedMode, const bool useRMBMenu, const bool showHelpDialogs)
+ : KListView(parent, name),
+ m_swordList(swordList),
+ m_config( new KConfig("bt-groupmanager", false, false ) ),
+ m_menu(false),
+ m_searchDialog(0),
+ m_pressedItem(0),
+ m_useBookmarks(useBookmarks),
+ m_saveSettings(saveSettings),
+ m_useDragDrop(useDnD),
+ m_useExtendedMode(useExtendedMode),
+ m_useRMBMenu(useRMBMenu),
+ m_showHelpDialogs(showHelpDialogs)
+{
+ initView();
+ initConnections();
+ readSettings();
+}
+
+CGroupManager::~CGroupManager(){
+ saveSettings();
+ m_config->sync();
+ delete m_config;
+ m_config = 0;
+}
+
+/** Initializes the tree of this CGroupmanager */
+void CGroupManager::setupSwordTree() {
+ readGroups(m_config, 0);
+ readSwordModules(m_config, 0);
+ if (m_useBookmarks)
+ readSwordBookmarks(m_config, 0);
+ setupStandardSwordTree();
+}
+
+/** Initializes the tree of this CGroupmanager */
+void CGroupManager::setupStandardSwordTree() {
+ if (!m_swordList || (m_swordList && !m_swordList->count())) {
+ qWarning("CGroupManager::setupStandardSwordTree: m_swordList is empty or qual to NULL. return now.");
+ return;
+ }
+
+ const bool initialized = m_config->readBoolEntry("initialized", false);
+ CSwordModuleInfo* moduleInfo = 0;
+ QListViewItemIterator it( this );
+
+ CGroupManagerItem* bibleGroup = findGroup(i18n("Bibles"));
+ CGroupManagerItem* bookGroup = findGroup(i18n("Books"));
+ CGroupManagerItem* commentaryGroup = findGroup(i18n("Commentaries"));
+ CGroupManagerItem* lexiconGroup = findGroup(i18n("Lexicons"));
+
+ for(moduleInfo = m_swordList->first(); moduleInfo; moduleInfo = m_swordList->next()) {
+ bool alreadyCreated = false;
+ QListViewItemIterator it( this );
+ for ( ; it.current(); ++it ) {
+ CGroupManagerItem* item = dynamic_cast<CGroupManagerItem*>(it.current());
+ if (item && item->type() == CGroupManagerItem::Module && item->moduleInfo() == moduleInfo) { //already there
+ alreadyCreated = true;
+ break;
+ }
+ }
+ if ( moduleInfo && !alreadyCreated) { //module was probably newly installed, insert it
+ CGroupManagerItem* itemParent = 0;
+ switch (moduleInfo->type()) {
+ case CSwordModuleInfo::Bible:
+ itemParent = bibleGroup;
+ break;
+ case CSwordModuleInfo::Commentary:
+ itemParent = commentaryGroup;
+ break;
+ case CSwordModuleInfo::Lexicon:
+ itemParent = lexiconGroup;
+ break;
+ case CSwordModuleInfo::GenericBook:
+ itemParent = bookGroup;
+ break;
+ default:
+ break;
+ }
+ if (itemParent)
+ (void)new CGroupManagerItem(itemParent,QString::null,QString::null, moduleInfo,0, CGroupManagerItem::Module);
+ }
+ }
+ if (!initialized) {
+ bibleGroup->sortChildItems(0,true);
+ lexiconGroup->sortChildItems(0,true);
+ commentaryGroup->sortChildItems(0,true);
+ bookGroup->sortChildItems(0,true);
+ sort();
+ }
+
+ // Now delete the groupes which have no child items
+ if (!bibleGroup->childCount()) {
+ delete bibleGroup;
+ bibleGroup = 0;
+ }
+ if (!lexiconGroup->childCount()) {
+ delete lexiconGroup;
+ lexiconGroup = 0;
+ }
+ if (!commentaryGroup->childCount()) {
+ delete commentaryGroup;
+ commentaryGroup = 0;
+ }
+ if (!bookGroup->childCount()) {
+ delete bookGroup;
+ bookGroup = 0;
+ }
+}
+
+/** Initializes the connections of this class */
+void CGroupManager::initConnections(){
+ connect(this, SIGNAL(returnPressed(QListViewItem*)), SLOT(slotReturnPressed(QListViewItem*)));
+ if (m_useRMBMenu)
+ connect(m_popupMenu, SIGNAL(aboutToShow()),
+ this, SLOT(slotPopupAboutToShow()));
+}
+
+/** */
+void CGroupManager::saveSettings(){
+ KConfigGroupSaver groupSaver(m_config, "Groupmanager");
+
+ if (!m_saveSettings) {
+ return;
+ }
+
+ //save column width
+ m_config->writeEntry("initialized", true);
+ m_config->writeEntry("First column", columnWidth(0));
+
+ //save the bookmarks and the groups
+
+ saveGroups(m_config,0);
+ saveSwordModules(m_config,0);
+ saveSwordBookmarks(m_config, 0);
+
+ m_config->sync();
+}
+
+/** */
+void CGroupManager::readSettings(){
+ KConfigGroupSaver groupSaver(m_config, "Groupmanager");
+ if (m_config->readBoolEntry("initialized"))
+ setupSwordTree();
+ else
+ setupStandardSwordTree();
+ setColumnWidth(0, m_config->readNumEntry("First column", visibleWidth()) );
+}
+
+/** Initializes this widget */
+void CGroupManager::initView(){
+ m_toolTip = new ToolTip(this);
+
+ QWhatsThis::add(this, WT_GM_WIDGET );
+ m_singleClick = KGlobalSettings::singleClick();
+
+ setBackgroundMode(PaletteBase);
+ setSorting(-1);
+
+ if (m_useDragDrop)
+ viewport()->setAcceptDrops(true);
+ if (m_useExtendedMode)
+ setSelectionModeExt(KListView::Extended);
+ setRootIsDecorated(false);
+ setAllColumnsShowFocus(true);
+
+ addColumn(i18n("Caption"));
+ header()->hide();
+
+ if (!m_useRMBMenu) {
+ m_popupMenu = 0;
+ }
+ else {
+ m_popupMenu = new KPopupMenu(this);
+ m_popupMenu->insertTitle(i18n("Main index"));
+ m_popupMenu->insertItem(GROUP_NEW_ICON_SMALL, i18n("Create a new folder"),
+ this, SLOT(slotCreateNewGroup()),0,ID_GM_GROUP_CREATE);
+ m_popupMenu->setWhatsThis(ID_GM_GROUP_CREATE, WT_GM_NEW_GROUP);
+ m_popupMenu->insertItem(GROUP_CHANGE_ICON_SMALL, i18n("Change this folder"),
+ this, SLOT(slotChangeGroup()),0,ID_GM_GROUP_CHANGE);
+ m_popupMenu->setWhatsThis(ID_GM_GROUP_CHANGE, WT_GM_CHANGE_GROUP);
+ m_popupMenu->insertSeparator();
+ m_popupMenu->insertItem(BOOKMARK_CHANGE_ICON_SMALL,i18n("Change this bookmark"),
+ this,SLOT(slotChangeBookmark()),0,ID_GM_BOOKMARK_CHANGE);
+ m_popupMenu->setWhatsThis(ID_GM_BOOKMARK_CHANGE, WT_GM_CHANGE_BOOKMARK);
+ m_popupMenu->insertItem(BOOKMARK_IMPORT_ICON_SMALL,i18n("Import bookmarks"),
+ this,SLOT(slotImportBookmarks()),0,ID_GM_BOOKMARKS_IMPORT);
+ m_popupMenu->setWhatsThis(ID_GM_BOOKMARKS_IMPORT, WT_GM_IMPORT_BOOKMARKS);
+ m_popupMenu->insertItem(BOOKMARK_EXPORT_ICON_SMALL,i18n("Export bookmarks"),
+ this,SLOT(slotExportBookmarks()),0,ID_GM_BOOKMARKS_EXPORT);
+ m_popupMenu->setWhatsThis(ID_GM_BOOKMARKS_EXPORT, WT_GM_EXPORT_BOOKMARKS);
+ m_popupMenu->insertItem(BOOKMARK_PRINT_ICON_SMALL,i18n("Print bookmark"),
+ this,SLOT(slotPrintBookmark()),0,ID_GM_BOOKMARK_PRINT);
+ m_popupMenu->setWhatsThis(ID_GM_BOOKMARK_PRINT, WT_GM_PRINT_BOOKMARK);
+ m_popupMenu->insertItem(ITEMS_DELETE_ICON_SMALL, i18n("Remove selected item(s)"),
+ this, SLOT(slotDeleteSelectedItems()),0,ID_GM_ITEMS_DELETE);
+ m_popupMenu->insertSeparator();
+ m_popupMenu->insertItem(MODULE_SEARCH_ICON_SMALL,i18n("Search in selected module(s)"),
+ this, SLOT(slotSearchSelectedModules()),0,ID_GM_MODULES_SEARCH);
+ m_popupMenu->insertSeparator();
+ m_popupMenu->insertItem(MODULE_UNLOCK_ICON_SMALL,i18n("Unlock this module"),
+ this, SLOT(slotUnlockModule()),0,ID_GM_MODULE_UNLOCK);
+ m_popupMenu->setWhatsThis(ID_GM_MODULE_UNLOCK, WT_GM_UNLOCK_MODULE);
+ m_popupMenu->insertItem(MODULE_ABOUT_ICON_SMALL, i18n("About this module"),
+ this, SLOT(slotShowAbout()),0,ID_GM_MODULE_ABOUT);
+ m_popupMenu->setWhatsThis(ID_GM_MODULE_ABOUT, WT_GM_ABOUT_MODULE);
+ }
+}
+
+/** Deletes the item given as parameter */
+void CGroupManager::slotDeleteSelectedItems(){
+ QListViewItemIterator it( this );
+ for ( ; it.current(); ++it ) {
+ if ( it.current()->isSelected() )
+ delete it.current();
+ }
+}
+
+/** call the search dialog */
+void CGroupManager::slotSearchSelectedModules() {
+ ListCSwordModuleInfo searchList;
+ CGroupManagerItem *item = 0;
+
+ QList<QListViewItem> items = selectedItems();
+ for (items.first(); items.current(); items.next()) {
+ item = dynamic_cast<CGroupManagerItem*>(items.current());
+ if (item && item->type() == CGroupManagerItem::Module)
+ searchList.append(item->moduleInfo());
+ }
+ saveSettings();
+ m_config->sync();
+
+ if (!m_searchDialog)
+ m_searchDialog = new CSearchDialog(searchList,0,0);
+ else
+ m_searchDialog->setModuleList(searchList);
+ connect(m_searchDialog, SIGNAL(finished()),
+ this, SLOT(slotDeleteSearchdialog()));
+ m_searchDialog->setSearchText(QString::null);
+ m_searchDialog->show();
+ m_searchDialog->raise();
+}
+
+void CGroupManager::searchBookmarkedModule(const QString& text, CGroupManagerItem* item) {
+// qWarning("CGroupManager::searchBookmarkedModule(const QString& text, CGroupManagerItem* item)");
+// ASSERT(item);
+ if (!item->moduleInfo())
+ return;
+ ListCSwordModuleInfo searchList;
+ searchList.append(item->moduleInfo());
+
+ if (!m_searchDialog)
+ m_searchDialog = new CSearchDialog(searchList,0,0);
+ else
+ m_searchDialog->setModuleList(searchList);
+ connect(m_searchDialog, SIGNAL(finished()),
+ this, SLOT(slotDeleteSearchdialog()));
+
+ m_searchDialog->setSearchText(text);
+ m_searchDialog->show();
+ m_searchDialog->raise();
+ m_searchDialog->startSearch();
+}
+
+/** */
+void CGroupManager::createNewBookmark(CGroupManagerItem* parent, CSwordModuleInfo* module, const QString& ref){
+ CSwordModuleInfo* swordModule = dynamic_cast<CSwordModuleInfo*>(module);
+ if (!swordModule)
+ return;
+
+ CGroupManagerItem* myItem = 0;
+ bool ok = false;
+ const QString description = CInputDialog::getText(i18n("Bookmark description - BibleTime"), i18n("Please enter here the description:"), QString::null, &ok);
+ if (!ok)
+ return;
+
+ myItem = 0;
+ if ( parent && (parent->type() == CGroupManagerItem::Group) ) {
+ myItem = new CGroupManagerItem(parent,QString::null,QString::null,module, 0, CGroupManagerItem::Bookmark);
+ parent->setOpen(true);
+ }
+ else
+ myItem = new CGroupManagerItem(this,QString::null,QString::null,module, 0, CGroupManagerItem::Bookmark);
+
+ if (myItem) { //it's a Sword module
+ CSwordKey* key = CSwordKey::createInstance(module);
+ if (key) {
+ key->key(ref);
+ myItem->setBookmarkKey(key); //the key is deleted by the groupmmanager item
+ }
+ }
+ if (myItem) //set the description
+ myItem->setDescription(description);
+ setFocus();
+}
+
+
+/** Changes the current item */
+void CGroupManager::slotChangeBookmark(){
+ if (!m_pressedItem)
+ return;
+ bool isOk;
+ QString description = CInputDialog::getText(i18n("Change bookmark description - BibleTime"),i18n("Please change the description of the item!"), m_pressedItem->description(), &isOk, 0);
+ if (isOk)
+ m_pressedItem->setDescription(description);
+}
+
+/** Changes a group. */
+void CGroupManager::slotChangeGroup(){
+ if (!m_pressedItem)
+ return;
+
+ bool isOk;
+ QString description = QInputDialog::getText(i18n("Change folder - BibleTime"),i18n("Please change the name of the group!"), m_pressedItem->text(0), &isOk, 0);
+ if (isOk)
+ m_pressedItem->setText( 0, description );
+}
+
+/** Is called before the menu is shown */
+void CGroupManager::slotPopupAboutToShow(){
+ if (!m_useRMBMenu)
+ return;
+
+ m_menu = true;
+
+
+ if (m_pressedItem) {
+ if (m_pressedItem->type() == CGroupManagerItem::Module) {
+ bool moduleIsEncrypted = m_pressedItem->moduleInfo()->isEncrypted();
+
+ m_popupMenu->setItemEnabled(ID_GM_PRESENTER_CREATE, true);
+
+ m_popupMenu->setItemEnabled(ID_GM_GROUP_CREATE, false);
+ m_popupMenu->setItemEnabled(ID_GM_GROUP_CHANGE, false);
+
+ m_popupMenu->setItemEnabled(ID_GM_BOOKMARK_CHANGE, false);
+ m_popupMenu->setItemEnabled(ID_GM_BOOKMARKS_IMPORT, false);
+ m_popupMenu->setItemEnabled(ID_GM_BOOKMARKS_EXPORT, false);
+ m_popupMenu->setItemEnabled(ID_GM_BOOKMARK_PRINT, false);
+
+ m_popupMenu->setItemEnabled(ID_GM_ITEMS_DELETE, false);
+
+ m_popupMenu->setItemEnabled(ID_GM_MODULES_SEARCH, true);
+ m_popupMenu->setItemEnabled(ID_GM_MODULE_UNLOCK, moduleIsEncrypted);
+ m_popupMenu->setItemEnabled(ID_GM_MODULE_ABOUT, true);
+ }
+ else if (m_pressedItem->type() == CGroupManagerItem::Bookmark) {
+ m_popupMenu->setItemEnabled(ID_GM_PRESENTER_CREATE, true);
+
+ m_popupMenu->setItemEnabled(ID_GM_GROUP_CREATE, false);
+ m_popupMenu->setItemEnabled(ID_GM_GROUP_CHANGE, false);
+
+ m_popupMenu->setItemEnabled(ID_GM_BOOKMARK_CHANGE, true);
+ m_popupMenu->setItemEnabled(ID_GM_BOOKMARKS_IMPORT, false);
+ m_popupMenu->setItemEnabled(ID_GM_BOOKMARKS_EXPORT, false);
+ m_popupMenu->setItemEnabled(ID_GM_BOOKMARK_PRINT, true);
+
+ m_popupMenu->setItemEnabled(ID_GM_ITEMS_DELETE, true);
+
+ m_popupMenu->setItemEnabled(ID_GM_MODULES_SEARCH, false);
+ m_popupMenu->setItemEnabled(ID_GM_MODULE_UNLOCK, false);
+ m_popupMenu->setItemEnabled(ID_GM_MODULE_ABOUT, false);
+
+ }
+ else if (m_pressedItem->type() == CGroupManagerItem::Group) {
+ m_popupMenu->setItemEnabled(ID_GM_PRESENTER_CREATE, false);
+
+ m_popupMenu->setItemEnabled(ID_GM_GROUP_CREATE, true);
+ m_popupMenu->setItemEnabled(ID_GM_GROUP_CHANGE, true);
+
+ m_popupMenu->setItemEnabled(ID_GM_BOOKMARK_CHANGE, false);
+
+ //enable import and export only if a bookmark exists in this group
+ bool foundBookmark = false;
+ QListViewItem * myChild = m_pressedItem->firstChild();
+ while( myChild && !foundBookmark) {
+ CGroupManagerItem* i = dynamic_cast<CGroupManagerItem*>(myChild);
+ if (i && i->type() == CGroupManagerItem::Bookmark)
+ foundBookmark = true;
+ myChild = myChild->nextSibling();
+ }
+ m_popupMenu->setItemEnabled(ID_GM_BOOKMARKS_IMPORT, true);
+ m_popupMenu->setItemEnabled(ID_GM_BOOKMARKS_EXPORT, foundBookmark);
+ m_popupMenu->setItemEnabled(ID_GM_BOOKMARK_PRINT, false);
+
+ m_popupMenu->setItemEnabled(ID_GM_ITEMS_DELETE, true);
+
+ m_popupMenu->setItemEnabled(ID_GM_MODULES_SEARCH, false);
+ m_popupMenu->setItemEnabled(ID_GM_MODULE_UNLOCK, false);
+ m_popupMenu->setItemEnabled(ID_GM_MODULE_ABOUT, false);
+ }
+ }
+ else { //top level
+ m_popupMenu->setItemEnabled(ID_GM_PRESENTER_CREATE, false);
+
+ m_popupMenu->setItemEnabled(ID_GM_GROUP_CREATE, true);
+ m_popupMenu->setItemEnabled(ID_GM_GROUP_CHANGE, false);
+
+ m_popupMenu->setItemEnabled(ID_GM_BOOKMARK_CHANGE, false);
+
+ bool foundBookmark = false;
+ QListViewItemIterator it( this );
+ for ( ; it.current() && !foundBookmark; ++it ) {
+ CGroupManagerItem* i = dynamic_cast<CGroupManagerItem*>(it.current());
+ if (i && i->type() == CGroupManagerItem::Bookmark)
+ foundBookmark = true;
+ }
+ m_popupMenu->setItemEnabled(ID_GM_BOOKMARKS_IMPORT, true);
+ m_popupMenu->setItemEnabled(ID_GM_BOOKMARKS_EXPORT, foundBookmark);
+ m_popupMenu->setItemEnabled(ID_GM_BOOKMARK_PRINT, false);
+
+ m_popupMenu->setItemEnabled(ID_GM_ITEMS_DELETE, false);
+
+ m_popupMenu->setItemEnabled(ID_GM_MODULES_SEARCH, false);
+ m_popupMenu->setItemEnabled(ID_GM_MODULE_UNLOCK, false);
+ m_popupMenu->setItemEnabled(ID_GM_MODULE_ABOUT, false);
+ }
+}
+
+/** */
+void CGroupManager::slotShowAbout(){
+ CSwordModuleInfo* module = dynamic_cast<CSwordModuleInfo*>(m_pressedItem->moduleInfo());
+ if (!m_pressedItem || !m_pressedItem->moduleInfo() || !module)
+ return;
+ QString text;
+
+ if (module->hasVersion())
+ text += QString::fromLatin1("<b>%1:</b> %2<br>")
+ .arg(i18n("Version"))
+ .arg(module->config(CSwordModuleInfo::ModuleVersion));
+
+ text += QString::fromLatin1("<b>%1:</b> %2<br><b>%3:</b> %4<br>")
+ .arg(i18n("Location"))
+// .arg(backend()->modulePath(module->name()))
+ .arg(module->config(CSwordModuleInfo::AbsoluteDataPath))
+ .arg(i18n("Language"))
+ .arg(module->module()->Lang());
+
+ if (module->module()->isWritable())
+ text += QString::fromLatin1("<b>%1:</b> %2<br>")
+ .arg(i18n("Writable"))
+ .arg(i18n("yes"));
+
+ if ( module->isEncrypted() )
+ text += QString::fromLatin1("<b>%1:</b> %2<br>")
+ .arg(i18n("Unlock key"))
+ .arg(module->config(CSwordModuleInfo::CipherKey));
+ text += QString::fromLatin1("<b>%1:</b> %2<br>").arg(i18n("Encoding")).arg(module->isUnicode() ? i18n("Unicode") : i18n("iso8859-1"));
+
+ QString options;
+ unsigned int opts;
+ for (opts = CSwordBackend::filterOptionsMIN; opts <= CSwordBackend::filterOptionsMAX; ++opts){
+ if (module->has( (CSwordBackend::FilterOptions)opts)){
+ if (!options.isEmpty())
+ options += QString::fromLatin1(", ");
+ options += CSwordBackend::translatedOptionName( (CSwordBackend::FilterOptions)opts);
+ }
+ }
+ if (!options.isEmpty())
+ text += QString("<b>%1:</b> %2<br>")
+ .arg(i18n("Features"))
+ .arg(options);
+
+ text += QString::fromLatin1("<b>%1:</b><br> <font size=\"-1\">%2</font>")
+ .arg("About")
+ .arg(module->config(CSwordModuleInfo::AboutInformation));
+
+ KMessageBox::about(this, text, module->config(CSwordModuleInfo::Description), false);
+}
+
+/** */
+void CGroupManager::slotCreateNewPresenter(){
+ if (m_pressedItem && m_pressedItem->moduleInfo()) {
+ if (m_pressedItem->type() == CGroupManagerItem::Module || m_pressedItem->type() == CGroupManagerItem::Bookmark)
+ emit createSwordPresenter( m_pressedItem->moduleInfo(), QString::null );
+ }
+}
+
+/** */
+void CGroupManager::contentsDragEnterEvent( QDragEnterEvent* e){
+ if (QTextDrag::canDecode(e)) {
+ e->accept(true);
+ QString str;
+ QCString submime;
+ if (QTextDrag::decode(e,str,submime=BOOKMARK))
+ m_dragType = BOOKMARK;
+ else if (QTextDrag::decode(e,str,submime=REFERENCE))
+ m_dragType = REFERENCE;
+ else if (QTextDrag::decode(e,str,submime=MODULE))
+ m_dragType = MODULE;
+ else if (QTextDrag::decode(e,str,submime=GROUP))
+ m_dragType = GROUP;
+ else if (QTextDrag::decode(e,str,submime=TEXT))
+ m_dragType = TEXT;
+ else
+ m_dragType = "";
+ }
+ else {
+ e->ignore();
+ m_dragType = "";
+ }
+}
+
+/** */
+void CGroupManager::contentsDragMoveEvent( QDragMoveEvent* e){
+ //open folders
+ CGroupManagerItem* item = (CGroupManagerItem*)itemAt( contentsToViewport(e->pos()) );
+ e->accept(QTextDrag::canDecode(e));
+ if (item && item->type() == CGroupManagerItem::Group && !item->isOpen())
+ item->setOpen(true);
+
+ m_afterItemDrop = item;
+ if (item)
+ m_parentItemDrop = (CGroupManagerItem*)item->parent();
+ else
+ m_parentItemDrop = 0;
+
+ QRect tmpRect = drawDropVisualizer(0, m_parentItemDrop, m_afterItemDrop, m_dragType );
+ if (tmpRect != m_oldDragRect ) {
+ cleanDropVisualizer();
+ m_oldDragRect = tmpRect;
+ if (tmpRect.isValid())
+ viewport()->repaint(tmpRect);
+ }
+}
+
+/** */
+void CGroupManager::contentsDragLeaveEvent( QDragLeaveEvent* e){
+ KListView::contentsDragLeaveEvent(e);
+ cleanDropVisualizer();
+
+ m_oldDragRect = QRect();
+ m_dragType = "";
+}
+
+/** This define is used to use one block of code for the different sections (bookmarks,
+ * references, modules, groups etc.). We have only to maintain this code.
+ */
+#define MOVE_ITEMS \
+ for ( item = m_itemList->last(); item != 0; item = m_itemList->prev()){ \
+ if ( item && (item != target) ){ \
+ parentItem = dynamic_cast<CGroupManagerItem*>(item->parent()); \
+ if ( isChild(item, target) ) \
+ continue; \
+ if (parentItem && parentItem != item) \
+ parentItem->takeItem(item); \
+ else \
+ takeItem(item); \
+ if ( target && target!=item ) \
+ if (target->type()==CGroupManagerItem::Group) \
+ target->insertItem(item); \
+ else{ \
+ if (target->parent()) \
+ target->parent()->insertItem(item); \
+ else \
+ this->insertItem(item); \
+ } \
+ else \
+ this->insertItem(item); \
+ } \
+ }
+
+/** */
+void CGroupManager::contentsDropEvent( QDropEvent* e){
+ CGroupManagerItem* target = dynamic_cast<CGroupManagerItem *>(itemAt(contentsToViewport(e->pos())));
+
+ QString str;
+ QCString submime;
+ if (QTextDrag::decode(e,str,submime=BOOKMARK)){
+ //a bookmark was dragged
+ if ( e->source() != viewport() ){
+ return;
+ }
+ if ( !(m_itemList) ){
+ return;
+ }
+ CGroupManagerItem* item = 0;
+ CGroupManagerItem* parentItem = 0;
+ // Bookmark dragged on module - open a presenter
+ if ( (m_pressedItem && m_pressedItem->type() == CGroupManagerItem::Bookmark)
+ && target && (target->type() == CGroupManagerItem::Module) ){
+ emit createSwordPresenter(target->moduleInfo(),m_pressedItem->getKeyText() );
+ }
+ //move around bookmarks
+ else{
+ MOVE_ITEMS
+ }//else
+ }//Bookmark
+ else if (QTextDrag::decode(e,str,submime=GROUP)){
+ //a group was dragged
+ if ( e->source() != this->viewport() )
+ return;
+ if ( !(m_itemList) )
+ return;
+ CGroupManagerItem* item = 0;
+ CGroupManagerItem* parentItem = 0;
+ //move around groups
+ MOVE_ITEMS
+ }//group
+ else if (QTextDrag::decode(e,str,submime=MODULE)){
+ //a module was dragged
+ if ( e->source() != this->viewport() ){
+ return;
+ }
+ if ( !(m_itemList) ){
+ return;
+ }
+ CGroupManagerItem* item = 0;
+ CGroupManagerItem* parentItem = 0;
+ MOVE_ITEMS
+ }//module
+ else if (QTextDrag::decode(e,str,submime=REFERENCE)){
+ //a reference was dragged
+ QString ref;
+ QString mod;
+ CReferenceManager::decodeReference(str,mod,ref);
+
+ CSwordModuleInfo* info = backend()->findModuleByName(mod);
+ if ( info /*&& (info->name() == mod)*/ ){
+ if (!target){ //Reference was dragged on no item
+ createNewBookmark(0, info, ref); //CREATE A NEW BOOKMARK
+ }
+ else{
+ switch (target->type()){
+ case (CGroupManagerItem::Group):
+ if (info) //Create a bookmark
+ createNewBookmark(target,info, ref);
+ break;
+ case (CGroupManagerItem::Bookmark):
+ if (target->parent())
+ createNewBookmark(target->parent(),info, ref);
+ else
+ createNewBookmark(0,info, ref);
+ break;
+ case (CGroupManagerItem::Module):
+ if (target->moduleInfo()){
+ /**
+ * In bibles or commentaries, the reference is opened
+ * in lexicons, the reference is searched
+ */
+ if (target->moduleInfo()->type() == CSwordModuleInfo::Bible || target->moduleInfo()->type() == CSwordModuleInfo::Commentary )
+ emit createSwordPresenter( target->moduleInfo(), ref );
+ else
+ searchBookmarkedModule(ref,target);
+ }
+ break;
+ }//switch;
+ }//(target)
+ }//(info)
+ }//reference
+ else if (QTextDrag::decode(e,str,submime=TEXT)){
+ //plain text was dragged -> open searchdialog
+ if ( target && target->type()==CGroupManagerItem::Module && target->moduleInfo() )
+ searchBookmarkedModule(str,target);
+ }
+ m_dragType = "";
+ cleanDropVisualizer();
+}
+#undef MOVE_ITEMS
+
+/** */
+void CGroupManager::contentsMousePressEvent( QMouseEvent* e ) {
+ m_pressedPos = e->pos();
+ m_pressedItem = dynamic_cast<CGroupManagerItem*>(itemAt(contentsToViewport(m_pressedPos)));
+ const bool open = m_pressedItem ? m_pressedItem->isOpen() : false;
+ KListView::contentsMousePressEvent(e);
+
+ if ((e->state() & ControlButton) || (e->state() & ShiftButton))
+ return;
+
+ if (e->button() == LeftButton) {
+ if (m_pressedItem && m_pressedItem->type() == CGroupManagerItem::Group
+ && m_singleClick && (m_pressedItem->isOpen() == open) ) {
+ //open group with first click if it's a global setting of KDE
+ m_pressedItem->setOpen( !m_pressedItem->isOpen() );
+ }
+ }
+ else if (e->button() == RightButton & m_useRMBMenu) {
+ m_menu = true;
+ m_popupMenu->exec( viewport()->mapToGlobal( contentsToViewport(m_pressedPos) ));
+ m_menu = false;
+ }
+}
+
+/** Reimplementation. */
+void CGroupManager::contentsMouseDoubleClickEvent ( QMouseEvent * e){
+// qDebug("CGroupManager::contentsMouseDoubleClickEvent ( QMouseEvent * e)");
+ bool open = false;
+ if (m_pressedItem)
+ open = m_pressedItem->isOpen();
+
+ KListView::contentsMouseDoubleClickEvent(e);
+
+ if ((e->state() & ControlButton) || (e->state() & ShiftButton))
+ return;
+ if (e->button() == LeftButton) {
+ if (m_pressedItem && m_pressedItem->type() == CGroupManagerItem::Group
+ && !m_singleClick && (m_pressedItem->isOpen() == open) ) {
+ //open group with first click if it's a global setting of KDE
+ m_pressedItem->setOpen( !m_pressedItem->isOpen() );
+ }
+ }
+}
+
+void CGroupManager::contentsMouseReleaseEvent ( QMouseEvent* e ) {
+ KListView::contentsMouseReleaseEvent(e);
+ if ( !(m_pressedItem = dynamic_cast<CGroupManagerItem*>(itemAt(contentsToViewport(e->pos())))) )
+ return;
+ if ((e->state() & ControlButton) || (e->state() & ShiftButton))
+ return;
+
+ if (m_pressedItem && (e->button() == LeftButton)) {
+ if (m_pressedItem->type() == CGroupManagerItem::Module && m_pressedItem->moduleInfo()) {
+ //check if module is encrypted and show dialog if it wasn't opened before
+ QList<QListViewItem> items = selectedItems();
+ if (items.count() > 1) {
+ ListCSwordModuleInfo modules;
+ for (items.first(); items.current(); items.next()) {
+ CGroupManagerItem* i = dynamic_cast<CGroupManagerItem*>(items.current());
+ if (i && i->type() == CGroupManagerItem::Module && i->moduleInfo())
+ modules.append(i->moduleInfo());
+ }
+ emit createSwordPresenter( modules, QString::null );
+ }
+ else
+ emit createSwordPresenter( m_pressedItem->moduleInfo(), QString::null );
+
+ if (m_pressedItem->moduleInfo()->isEncrypted()) {
+ KConfigGroupSaver groupSaver(m_config, "Groupmanager");
+ if (m_showHelpDialogs && !m_config->readBoolEntry(QString::fromLatin1("shown %1 encrypted").arg(m_pressedItem->moduleInfo()->name()), false)) {
+ CHTMLDialog dlg(HELPDIALOG_MODULE_LOCKED);
+ dlg.exec();
+ }
+ if (m_showHelpDialogs)
+ m_config->writeEntry(QString::fromLatin1("shown %1 encrypted").arg(m_pressedItem->moduleInfo()->name()), true);
+ }
+ }
+ else if (m_pressedItem && m_pressedItem->type() == CGroupManagerItem::Bookmark) {
+ if (m_pressedItem->moduleInfo() && m_pressedItem->getBookmarkKey() )
+ emit createSwordPresenter( m_pressedItem->moduleInfo(), m_pressedItem->getKeyText() );
+ }
+ }
+}
+
+/** Reimplementation */
+void CGroupManager::contentsMouseMoveEvent ( QMouseEvent * e) {
+ KListView::contentsMouseMoveEvent( e );
+ if (!m_useDragDrop)
+ return;
+
+ CGroupManagerItem* dragItem=(CGroupManagerItem *)itemAt( contentsToViewport(e->pos()) );
+
+ //mouse is pressed, an item is selected and the popup menu isn't opened
+ if ( (e->state()&LeftButton) && (e->stateAfter()&LeftButton) && dragItem && !m_menu) {
+ //Is it time to start a drag?
+ if (abs(e->pos().x() - m_pressedPos.x()) > KGlobalSettings::dndEventDelay() ||
+ abs(e->pos().y() - m_pressedPos.y()) > KGlobalSettings::dndEventDelay() ) {
+ // Collect all selected items
+ ASSERT(m_itemList);
+ m_itemList = new QList<CGroupManagerItem>;
+ QListViewItemIterator it( this );
+ for( ; it.current(); it++ )
+ if ( it.current()->isSelected() )
+ m_itemList->append( (CGroupManagerItem*)it.current() );
+ QTextDrag *d = 0;
+ if (!dragItem)
+ return;
+ switch (dragItem->type()){
+ case (CGroupManagerItem::Bookmark):
+ if (dragItem->moduleInfo()) {
+ QString ref = dragItem->getKeyText();
+ QString mod = dragItem->moduleInfo()->name();
+
+ d = new QTextDrag(CReferenceManager::encodeReference(mod,ref), viewport());
+ d->setSubtype(BOOKMARK);
+ m_dragType = BOOKMARK;
+ }
+ break;
+ case (CGroupManagerItem::Module):
+ d = new QTextDrag( "" , viewport());
+ d->setSubtype(MODULE);
+ m_dragType = MODULE;
+ break;
+ case (CGroupManagerItem::Group):
+ d = new QTextDrag( "" , viewport());
+ d->setSubtype(GROUP);
+ m_dragType = GROUP;
+ break;
+ }
+
+ if (d) {
+ d->setPixmap( *(dragItem->pixmap(0)) );
+ m_menu = false;
+ d->drag();
+ }
+ }
+ }
+}
+
+/** Creates a new group */
+void CGroupManager::slotCreateNewGroup(){
+ bool isOk;
+ QString groupname = QInputDialog::getText(i18n("Enter name of folder - BibleTime"),i18n("Please enter the name of the folder!"),"", &isOk, 0);
+
+ if (isOk) {
+ if (m_pressedItem && m_pressedItem->type() == CGroupManagerItem::Group) {
+ (void)new CGroupManagerItem(m_pressedItem, groupname, QString::null, 0,0, CGroupManagerItem::Group);
+ m_pressedItem->setOpen(true);
+ }
+ else if (m_pressedItem && m_pressedItem->parent() && m_pressedItem->parent()->type() == CGroupManagerItem::Group){
+ (void)new CGroupManagerItem(m_pressedItem->parent(), groupname, QString::null, 0,0, CGroupManagerItem::Group);
+ m_pressedItem->parent()->setOpen(true);
+ }
+ else {
+ (void)new CGroupManagerItem(this, groupname, QString::null, 0, 0,CGroupManagerItem::Group);
+ }
+ }
+}
+
+const int CGroupManager::parentId(CGroupManagerItem *item, CGroupManagerItem* parentItem)
+{
+ // search parent of item and return the id of the parent
+ int ret = -1; // the view and the parent item have id -1
+ int index = 0;
+ CGroupManagerItem* myItem = 0;
+
+ if (item) {
+ if (item->parent() && item != parentItem) {
+ QListViewItemIterator it;
+ if (parentItem) {
+ it = QListViewItemIterator( parentItem );
+ }
+ else
+ it = QListViewItemIterator( this );
+
+ if (item->parent() == parentItem)
+ return -1;
+ while (it.current() && (it.current() != item->parent()) ) {
+ myItem = (CGroupManagerItem*)it.current();
+ if (parentItem && !isChild(parentItem, myItem) ) {
+ it++;
+ continue;
+ }
+ if (myItem && myItem->type() == CGroupManagerItem::Group) {
+ index++;
+ }
+ it++;
+ }
+ if (it.current())
+ ret = index;
+ }
+ }
+ return ret;
+}
+
+/** returns the parent of the item with the id ID */
+CGroupManagerItem* CGroupManager::findParent( const int ID, CGroupManagerItem* parentItem){
+ CGroupManagerItem* myItem = 0;
+ int index = 0;
+
+ QListViewItemIterator it;
+ if (parentItem)
+ it = QListViewItemIterator(parentItem);
+ else
+ it = QListViewItemIterator(this);
+
+ //traverse the tree and try to find the group with the id ID index using comparision
+ for( ; it.current(); it++ ) {
+ myItem = dynamic_cast<CGroupManagerItem*>( it.current() );
+ if ( parentItem && !isChild(parentItem, myItem) ) {
+ continue;
+ }
+ if (myItem && myItem->type() == CGroupManagerItem::Group) {
+ if (index == ID) {
+ return myItem;
+ }
+ else
+ index++;
+ }
+ }
+ return 0; // return 0 if parent wasn't found
+}
+
+/** Opens a dialog to enter the key to unlock an encrypted module. */
+void CGroupManager::slotUnlockModule(){
+ bool ok;
+ QString unlockKey = QInputDialog::getText(i18n("BibleTime - Unlock module"),i18n("Enter the key to unlock the module!"), m_pressedItem->moduleInfo()->config(CSwordModuleInfo::CipherKey), &ok, 0 );
+ if (ok) {
+ CSwordModuleInfo::UnlockErrorCode ret = m_pressedItem->moduleInfo()->unlock( unlockKey );
+ if ( ret != CSwordModuleInfo::noError) {
+ //an error occured
+ switch (ret) {
+ case CSwordModuleInfo::noPermission:
+ break;
+ case CSwordModuleInfo::wrongUnlockKey:
+ break;
+ case CSwordModuleInfo::notLocked:
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+}
+
+/** Reads in bookmarks from m_config and creates them as subitems of group. If group is 0 we create them a toplevel items. */
+const bool CGroupManager::readSwordBookmarks(KConfig* configFile, CGroupManagerItem* group, const Action){
+ //read and create group entries
+ CGroupManagerItem* parentItem = 0;
+
+ QStringList groupList = configFile->readListEntry("Groups");
+
+ //read in all bookmarks
+ QStringList bookmarkList = configFile->readListEntry("Bookmarks");
+ QStringList bookmarkModulesList = configFile->readListEntry("Bookmark modules");
+ QStringList bookmarkDescriptionsList = configFile->readListEntry("Bookmark descriptions");
+ QValueList<int> parentList = configFile->readIntListEntry("Bookmark parents");
+
+ QStringList::Iterator it_bookmarks = bookmarkList.begin();
+ QStringList::Iterator it_modules = bookmarkModulesList.begin();
+ QStringList::Iterator it_descriptions = bookmarkDescriptionsList.begin();
+ QValueList<int>::Iterator it_parents = parentList.begin();
+
+ CSwordModuleInfo* moduleInfo = 0;
+ CGroupManagerItem *myItem = 0;
+ CGroupManagerItem *oldItem = 0;
+
+ while ( it_bookmarks != bookmarkList.end() && it_parents != parentList.end()
+ && it_modules != bookmarkModulesList.end() ) {
+ moduleInfo = backend()->findModuleByName((*it_modules));
+ if ( (*it_parents) == -1) {
+ if (group)
+ myItem = new CGroupManagerItem(group, (*it_bookmarks), (*it_modules), moduleInfo, 0, CGroupManagerItem::Bookmark);
+ else
+ myItem = new CGroupManagerItem(this, (*it_bookmarks), (*it_modules), moduleInfo, 0, CGroupManagerItem::Bookmark);
+ }
+ else {
+ parentItem = findParent( (*it_parents), group ? group : 0 );
+ if (parentItem)
+ myItem = new CGroupManagerItem(parentItem, (*it_bookmarks), (*it_modules), moduleInfo,0, CGroupManagerItem::Bookmark);
+ else if (group)
+ myItem = new CGroupManagerItem(group, (*it_bookmarks), (*it_modules), moduleInfo,0, CGroupManagerItem::Bookmark);
+ else
+ myItem = new CGroupManagerItem(this, (*it_bookmarks), (*it_modules), moduleInfo,0, CGroupManagerItem::Bookmark);
+ }
+ if (myItem && it_descriptions != bookmarkDescriptionsList.end())
+ myItem->setDescription( *it_descriptions );
+ if (myItem && oldItem) {
+ myItem->moveAfter(oldItem);
+ }
+ oldItem = myItem;
+
+ ++it_parents;
+ ++it_modules;
+ ++it_descriptions;
+ ++it_bookmarks;
+ }
+ return true;
+}
+
+/** Save items of group to m_config. If grou is 0 we save all items. The path to the group-item itself is saved, too. */
+const bool CGroupManager::saveSwordBookmarks(KConfig* configFile, CGroupManagerItem* group, const Action){
+ int parentID = 0;
+ CGroupManagerItem* myItem = 0;
+ QStringList groupList;
+ QValueList<int> parentList;
+ QStringList bookmarkList;
+ QStringList bookmarkModuleList;
+ QStringList bookmarkDescriptionList;
+ QListViewItemIterator it;
+
+ //save bookmarks
+ parentList.clear();
+ bookmarkList.clear();
+ bookmarkModuleList.clear();
+ bookmarkDescriptionList.clear();
+
+ if (group)
+ it = QListViewItemIterator ( group );
+ else if (group && group->childCount() == 0) {
+ return false;
+ }
+ else
+ it = QListViewItemIterator (this);
+
+ for( ; it.current(); it++ ) {
+ myItem = (CGroupManagerItem*)it.current();
+ if (group)
+ if (!isChild(m_pressedItem, myItem)) {
+ continue;
+ }
+ if (myItem && myItem->type() == CGroupManagerItem::Bookmark) {
+ if (group) {
+ parentID = parentId( dynamic_cast<CGroupManagerItem*>(it.current()),m_pressedItem );
+ }
+ else {
+ parentID = parentId( dynamic_cast<CGroupManagerItem*>(it.current()) );
+ }
+ parentList.append( parentID );
+
+ CSwordKey* key = myItem->getBookmarkKey();
+ if (key) {
+ VerseKey* vk = dynamic_cast<VerseKey*>(key);
+ QString oldLocale;
+ if (vk) {
+ oldLocale = QString::fromLatin1(vk->getLocale());
+ vk->setLocale("en"); //save the english key names
+ }
+ bookmarkList.append( key->key() );
+ if (vk) {
+ vk->setLocale(oldLocale.latin1());
+ }
+ }
+ else
+ bookmarkList.append(""); //invalid key
+
+ if (myItem && !myItem->description().isEmpty()) //save description
+ bookmarkDescriptionList.append( myItem->description() );
+ else
+ bookmarkDescriptionList.append( QString::null );
+
+ if (myItem->moduleInfo()) { //save the module
+ bookmarkModuleList.append( myItem->moduleInfo()->name() );
+ }
+ else {
+ bookmarkModuleList.append( myItem->m_moduleName );
+ }
+ }
+ }
+
+ configFile->writeEntry("Bookmarks", bookmarkList);
+ configFile->writeEntry("Bookmark descriptions", bookmarkDescriptionList);
+ configFile->writeEntry("Bookmark modules", bookmarkModuleList);
+ configFile->writeEntry("Bookmark parents", parentList);
+
+ return true;
+}
+
+/** Impoorts bookmarks */
+void CGroupManager::slotImportBookmarks(){
+ if (!m_pressedItem || ( m_pressedItem && m_pressedItem->type() == CGroupManagerItem::Group) ) {
+ QString file = KFileDialog::getOpenFileName(QString::null, "*.btb | *.btb", 0, i18n("Import bookmarks ..."));
+ if (!file.isNull()) {
+ KSimpleConfig simpleConfig(file, false);
+ simpleConfig.setGroup("Bookmarks");
+ short int formatVersion = simpleConfig.readNumEntry("Bookmark format version", -1);
+
+ //bookmark format of imported file is newer than our version
+ if (formatVersion > BOOKMARK_FORMAT_VERSION) {
+ const int retValue = KMessageBox::warningContinueCancel(this, i18n("<qt>A problem occurred while importing bookmarks!<BR>\
+The bookmarks format of the imported file is newer<BR>\
+than the bookmarks format version of this version of BibleTime!<BR>\
+<B>Importing the bookmarks may not work correctly!</B><BR>Do you want to continue?</qt>"), i18n("Import of bookmarks"), i18n("Continue") );
+ if ( retValue != KMessageBox::Continue )
+ return;
+ }
+
+ readGroups(&simpleConfig, m_pressedItem, Import);
+ readSwordBookmarks(&simpleConfig, m_pressedItem, Import);
+ }
+ }
+}
+
+/** Exports bookmarks of selected group */
+void CGroupManager::slotExportBookmarks(){
+ if (!m_pressedItem || ( m_pressedItem && m_pressedItem->type() == CGroupManagerItem::Group) ) {
+ QString file = KFileDialog::getSaveFileName (QString::null, "*.btb | *.btb", 0, i18n("Export bookmarks ..."));
+ if (!file.isNull()) {
+ KSimpleConfig simpleConfig(file, false);
+ simpleConfig.setGroup("Bookmarks");
+ simpleConfig.writeEntry("Bookmark format version", BOOKMARK_FORMAT_VERSION);
+
+ saveGroups(&simpleConfig, m_pressedItem, Export);
+ saveSwordBookmarks(&simpleConfig, m_pressedItem, Export);
+ simpleConfig.sync();
+ }
+ }
+}
+
+
+const bool CGroupManager::readSwordModules(KConfig* configFile, CGroupManagerItem* group) {
+ if (!m_swordList) {
+ qWarning("CGroupManager::readSwordModules: no sword modules, return and do nothing.");
+ return false;
+ }
+ CGroupManagerItem* parentItem = 0;
+
+ QStringList moduleList = configFile->readListEntry("Modules");
+ QValueList<int> parentList = configFile->readIntListEntry("Module parents");
+ QStringList::Iterator it_modules = moduleList.begin();
+ QValueList<int>::Iterator it_parents = parentList.begin();
+
+ CSwordModuleInfo* myModuleInfo = 0;
+ CGroupManagerItem* myItem = 0;
+ CGroupManagerItem* oldItem = 0;
+
+ while ( it_modules != moduleList.end() && it_parents != parentList.end() ) {
+ if ((*it_modules).isEmpty() || !( myModuleInfo = backend()->findModuleByName(*it_modules) )) { //the module was removed so we don't show it
+ ++it_parents;
+ ++it_modules;
+ continue;
+ }
+
+ if ( (*it_parents) == -1) { //module on top
+ parentItem = group; //instead of group ? group : 0;
+ }
+ else {
+ parentItem = findParent( (*it_parents), group );
+ if (!parentItem)
+ parentItem = group;
+ }
+
+ if (parentItem) {
+ myItem = new CGroupManagerItem(parentItem, QString::null, QString::null, myModuleInfo,0, CGroupManagerItem::Module);
+ }
+ else
+ myItem = new CGroupManagerItem(this, QString::null, QString::null, myModuleInfo,0, CGroupManagerItem::Module);
+
+ if (myItem && oldItem)
+ myItem->moveAfter(oldItem);
+
+ oldItem = myItem;
+
+ ++it_parents;
+ ++it_modules;
+ }
+ return true;
+};
+
+const bool CGroupManager::saveSwordModules(KConfig* configFile, CGroupManagerItem* group) {
+ int parentID = 0;
+ CGroupManagerItem* myItem = 0;
+ QValueList<int> parentList;
+ QStringList moduleList;
+
+ QListViewItemIterator it;
+
+ parentList.clear();
+ moduleList.clear();
+
+ if (group)
+ it = QListViewItemIterator( group );
+ else
+ it = QListViewItemIterator(this);
+
+ for( ; it.current(); it++ ) {
+ myItem = (CGroupManagerItem*) it.current();
+ if (group)
+ if (!isChild(m_pressedItem, myItem))
+ continue;
+
+ if (myItem && myItem->type() == CGroupManagerItem::Module) {
+ if (group)
+ parentID = parentId( (CGroupManagerItem*)it.current(),m_pressedItem );
+ else
+ parentID = parentId( (CGroupManagerItem*)it.current() );
+ parentList.append( parentID );
+
+ if (myItem->moduleInfo())
+ moduleList.append( myItem->moduleInfo()->name() );
+ else {
+ moduleList.append( myItem->text(0) ); //first column is the modulename
+ }
+ }
+ }
+ configFile->writeEntry("Modules", moduleList);
+ configFile->writeEntry("Module parents", parentList);
+
+ return true;
+}
+
+const bool CGroupManager::readGroups(KConfig* configFile, CGroupManagerItem* group, const Action action) {
+ //read and create group entries
+ CGroupManagerItem* parentItem = 0;
+ bool groupExists = false;
+ CGroupManagerItem* oldItem = 0;
+ CGroupManagerItem* newItem = 0;
+
+ QStringList groupList = configFile->readListEntry("Groups");
+ QValueList<int> parentList = configFile->readIntListEntry("Group parents");
+
+ QStringList::Iterator it_groups = groupList.begin();
+ QValueList<int>::Iterator it_parents = parentList.begin();
+
+ while ( (it_groups != groupList.end()) && (it_parents != parentList.end()) ) {
+ groupExists = false;
+ if ( (*it_parents) == -1) { //no parent item saved
+ if (action == Import) { //try to find existing group
+ if (CGroupManagerItem* existingGroup = findGroup(*it_groups, group, *it_parents))
+ groupExists = true;
+ }
+ else
+ parentItem = group;
+ }
+ else {
+ parentItem = findParent( (*it_parents),group );
+ if (!parentItem)
+ parentItem = group;
+ }
+
+ if (!groupExists) {
+ if (parentItem) {
+ newItem = new CGroupManagerItem(parentItem, (*it_groups), QString::null, 0,0, CGroupManagerItem::Group);
+ }
+ else {
+ newItem = new CGroupManagerItem(this, (*it_groups), QString::null, 0,0, CGroupManagerItem::Group);
+ }
+
+ if (newItem && oldItem ) {
+ newItem->moveAfter( oldItem );
+ }
+ if (newItem) {
+ /* we can't move a topgroup behind a subgroup, so we use multiple
+ parent calls
+ */
+ while (parentId(newItem) > *it_parents) {
+ if ( (group && isChild(group, newItem)) || (newItem && newItem->parent()) )
+ newItem = newItem->parent();
+ else
+ break;
+ }
+ oldItem = newItem;
+ }
+ }
+
+ ++it_parents;
+ ++it_groups;
+ }
+ return true;
+};
+
+const bool CGroupManager::saveGroups(KConfig* configFile, CGroupManagerItem* group, Action normal) {
+ int parentID = 0;
+ CGroupManagerItem* myItem = 0;
+ QStringList groupList;
+ QValueList<int> parentList;
+
+ QListViewItemIterator it;
+
+ //save groups
+ if (group && group->childCount() > 0)
+ it = QListViewItemIterator ( group->firstChild() );
+ else if (group && group->childCount() == 0) {
+ return false;
+ }
+ else
+ it = QListViewItemIterator ( this );
+
+ for( ; it.current(); it++ ) {
+ myItem = (CGroupManagerItem*) it.current();
+ if (group && !isChild(m_pressedItem, myItem))
+ continue;
+ if (myItem && myItem->type() == CGroupManagerItem::Group) {
+ if (group)
+ parentID = parentId( (CGroupManagerItem*)it.current(), m_pressedItem );
+ else
+ parentID = parentId( (CGroupManagerItem*)it.current() );
+ groupList.append( myItem->text(0) );
+ parentList.append( parentID );
+ }
+ }
+ configFile->writeEntry("Groups", groupList);
+ configFile->writeEntry("Group parents", parentList);
+ return true;
+}
+
+/** Returns true if the item "item" is a child of item "parent". */
+const bool CGroupManager::isChild(QListViewItem* parent, QListViewItem* child){
+ QListViewItem *myParent = child;
+ while (myParent && myParent != parent )
+ myParent = myParent->parent();
+ return (myParent == parent) && (parent != child);
+}
+
+/** Reimplementatuiion. */
+void CGroupManager::viewportPaintEvent(QPaintEvent* e) {
+ KListView::viewportPaintEvent(e);
+
+ if (m_oldDragRect.isValid())
+ {
+ static bool invalidated=false;
+ if (!invalidated)
+ {
+ invalidated=true;
+ viewport()->repaint(m_oldDragRect);
+ }
+ QPainter painter(viewport());
+ drawDropVisualizer(&painter, m_parentItemDrop, m_afterItemDrop, "");
+ invalidated=false;
+ }
+}
+
+/** Reimplementation with different parameters */
+const QRect CGroupManager::drawDropVisualizer (QPainter *p, CGroupManagerItem */*parent*/, CGroupManagerItem *after, const QString& /*type*/){
+ QRect insertmarker;
+ bool useParent = false;
+
+ if ( m_dragType == BOOKMARK ) { //we are moving a module
+ if ( after && after->type() == CGroupManagerItem::Group)
+ insertmarker = itemRect(after);
+ else if ( after && after && after->type() == CGroupManagerItem::Module )
+ insertmarker = QRect(itemRect(after));
+ else if ( after && after && after->type() == CGroupManagerItem::Bookmark ) {
+ if (after->parent()) {
+ useParent = true;
+ insertmarker = itemRect(after->parent()); //paint nothing
+ }
+ else
+ insertmarker = QRect();
+ }
+ else if ( after && after->parent() && after->parent()->type() == CGroupManagerItem::Group ) {
+ useParent = true;
+ insertmarker = itemRect(after->parent());
+ }
+ else //if (!after)
+ insertmarker = QRect(); //this->visibleRect();
+// else
+// insertmarker = QRect();
+ }
+ else if ( m_dragType == REFERENCE ) { //we are moving a reference
+ if ( after && after->type() == CGroupManagerItem::Group)
+ insertmarker = itemRect(after);
+ else if ( after && after->type() == CGroupManagerItem::Module )
+ insertmarker = QRect(itemRect(after));
+ else if ( after && after->type() == CGroupManagerItem::Bookmark ) {
+ if (after->parent()) {
+ useParent = true;
+ insertmarker = itemRect(after->parent());
+ }
+ else
+ insertmarker = QRect(); //paint nothing
+ }
+ else if ( after && after->parent() && after->parent()->type() == CGroupManagerItem::Group ) {
+ useParent = true;
+ insertmarker = itemRect(after->parent());
+ }
+ else if (!after)
+ insertmarker = QRect(); //this->visibleRect();
+ else
+ insertmarker = QRect();
+ }
+ else if ( m_dragType == MODULE ) { //we are moving a reference
+ if ( after && after->type() == CGroupManagerItem::Group)
+ insertmarker = itemRect(after);
+ else if ( after && (after->type() == CGroupManagerItem::Module || after->type() == CGroupManagerItem::Bookmark) ) {
+ if (after->parent()) {
+ useParent = true;
+ insertmarker = itemRect(after->parent());
+ }
+ else
+ insertmarker = QRect(); //paint nothing
+ }
+ else if ( after && after->parent() && after->parent()->type() == CGroupManagerItem::Group ) {
+ useParent = true;
+ insertmarker = itemRect(after->parent());
+ }
+ else if (!after)
+ insertmarker = QRect();//this->visibleRect();
+ else
+ insertmarker = QRect();
+ }
+ else if (m_dragType == TEXT) {
+ if ( after && after && after->type() == CGroupManagerItem::Module )
+ insertmarker = QRect(itemRect(after));
+ else
+ insertmarker = QRect();
+ }
+ else if (m_pressedItem) {
+ if ( m_pressedItem->type() == CGroupManagerItem::Group ) { //we are moving a group
+ if (after && after->type() == CGroupManagerItem::Group)
+ insertmarker = itemRect(after);
+ else if (after && after->parent() && after->parent()->type() == CGroupManagerItem::Group) {
+ useParent = true;
+ insertmarker = itemRect(after->parent());
+ }
+ else if (!after)
+ insertmarker = QRect();//this->visibleRect();
+ else
+ insertmarker = QRect();
+ }
+ }
+
+ if ( p && insertmarker.isValid() ) {
+ if (useParent)
+ insertmarker.setLeft( treeStepSize()*(after->parent()->depth()+(rootIsDecorated() ? 1 :0 ))+itemMargin()- contentsX());
+ else
+ insertmarker.setLeft( treeStepSize()*(after->depth()+(rootIsDecorated() ? 1 :0 ))+itemMargin() - contentsX());
+ style().drawFocusRect( p, insertmarker, colorGroup(), after->isSelected() ? &colorGroup().highlight() : &colorGroup().base(), after->isSelected() && !useParent );
+ }
+ else if (!insertmarker.isValid()) {
+ cleanDropVisualizer();
+ }
+ return insertmarker;
+}
+
+/** Reimplementation. */
+void CGroupManager::cleanDropVisualizer(){
+ if ( m_oldDragRect.isValid() ) {
+ QRect rect = m_oldDragRect;
+ m_oldDragRect = QRect();
+ viewport()->repaint(rect,true);
+ }
+}
+
+/** Resets the groupmanager. Recreates the original Bibles, Lexicons and Commentary groups. */
+void CGroupManager::slotReset(){
+ int result = 0;
+ if (m_showHelpDialogs)
+ result = KMessageBox:: warningContinueCancel( this, i18n("<qt>This function will reset the main index!<BR>This will recreate the original groups and delete all other items!<BR>Be sure no important bookmarks will be deleted!<BR>Do you want to continue?</qt>"), i18n("BibleTime - Reset main index"), i18n("Continue"));
+ else
+ result = KMessageBox::Continue;
+
+ if (result == KMessageBox::Continue) {
+ clear();
+ setupStandardSwordTree();
+ }
+}
+
+/** Prints the selected bookmark. */
+void CGroupManager::slotPrintBookmark(){
+ if (!m_pressedItem || ( m_pressedItem && m_pressedItem->type() != CGroupManagerItem::Bookmark) )
+ return;
+ CExportManager::printKey( m_pressedItem->moduleInfo(), m_pressedItem->getBookmarkKey()->key(), QString::null, m_pressedItem->description() );
+}
+
+/** Deletes the searchdialog. */
+void CGroupManager::slotDeleteSearchdialog(){
+ if (m_searchDialog)
+ m_searchDialog->delayedDestruct(); //delete the search dialog
+ m_searchDialog = 0;
+}
+
+/** Reimplementation. */
+void CGroupManager::resizeEvent( QResizeEvent* e ) {
+ KListView::resizeEvent(e);
+ setColumnWidth(0, visibleWidth() );
+ triggerUpdate();
+
+}
+
+/** Is called when the return key was pressed on a listview item. */
+void CGroupManager::slotReturnPressed( QListViewItem* i){
+ CGroupManagerItem* item = dynamic_cast<CGroupManagerItem*>(i);
+ if (!item)
+ return;
+ switch (item->type()) {
+ case CGroupManagerItem::Bookmark:
+ if (item->moduleInfo())
+ emit createSwordPresenter(item->moduleInfo(),item->getKeyText() );
+ break;
+ case CGroupManagerItem::Module:
+ if (item->moduleInfo())
+ emit createSwordPresenter(item->moduleInfo(), QString::null);
+ break;
+ case CGroupManagerItem::Group:
+ item->setOpen( !item->isOpen() );
+ break;
+ default:
+ break;
+ }
+}
+
+/** Updates the content size of this list view. */
+void CGroupManager::resizeContents( int w, int h ){
+ if (m_useDragDrop)
+ KListView::resizeContents(w,h+25);
+ else
+ KListView::resizeContents(w,h);
+}
+
+/** Returns the standard group with the given name if it alredy exists. Otherwise the group will be created. */
+CGroupManagerItem* CGroupManager::findGroup(const QString& name, CGroupManagerItem* group, const int id){
+ CGroupManagerItem* item = 0;
+ QListViewItemIterator it ;
+ if (group)
+ it = QListViewItemIterator(group);
+ else
+ it = QListViewItemIterator(this);
+
+ for ( ; it.current(); ++it ) {
+ item = dynamic_cast<CGroupManagerItem*>(it.current());
+ if (item && item->type() == CGroupManagerItem::Group && item->text(0) == name && parentId(item, group) == id) { //found the right group
+ if (group && !isChild(group, item))
+ item = 0;
+ else
+ break;
+ }
+ else {
+ item = 0;
+ }
+ }
+ if (!item) {
+ if (group)
+ item = new CGroupManagerItem(group, name, QString::null, 0, 0, CGroupManagerItem::Group);
+ else
+ item = new CGroupManagerItem(this, name, QString::null, 0, 0, CGroupManagerItem::Group);
+ }
+ return item;
+}
+
+/** Debugs the tree items */
+void CGroupManager::printTree() {
+ QListViewItemIterator it(this);
+ while (it.current()) {
+ QListViewItem* item = it.current();
+ for (int i = 0; i < item->depth(); ++i) {
+ cout << "\t";
+ }
+ cout << item->text(0).latin1() << endl;
+ ++it;
+ };
+}
diff --git a/bibletime/frontend/groupmanager/cgroupmanager.h b/bibletime/frontend/groupmanager/cgroupmanager.h
new file mode 100644
index 0000000..2447e3b
--- /dev/null
+++ b/bibletime/frontend/groupmanager/cgroupmanager.h
@@ -0,0 +1,275 @@
+/***************************************************************************
+ cgroupmanager.h - description
+ -------------------
+ begin : Wed Jan 19 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CGROUPMANAGER_H
+#define CGROUPMANAGER_H
+
+//BibleTime includes
+#include "cgroupmanageritem.h"
+#include "backend/cswordmoduleinfo.h"
+#include "frontend/cpointers.h"
+
+//QT includes
+#include <qwidget.h>
+#include <qlist.h>
+#include <qlistview.h>
+#include <qtooltip.h>
+
+//KDE includes
+#include <klistview.h>
+
+class KPopupMenu;
+class KConfig;
+
+class CSearchDialog;
+
+/**
+ * The groupmanager which handles all the modules and bookmarks
+ * @author The BibleTime Team
+ */
+class CGroupManager : public KListView, public CPointers {
+ Q_OBJECT
+
+public:
+ enum Action {Import, Export, Normal};
+
+ CGroupManager(QWidget *parent=0, const char *name=0, ListCSwordModuleInfo *moduleInfo_list = 0, const bool useBookmarks = true, const bool saveSettings = true, const bool useDnD=true, const bool useExtendedMode=true, const bool useRMBMenu = true, const bool showHelpDialogs = true);
+ ~CGroupManager();
+ /**
+ * Initializes the tree of this CGroupmanager
+ */
+ void setupSwordTree();
+ /**
+ *
+ */
+ void setupStandardSwordTree();
+ /**
+ * Read settings from config
+ */
+ void readSettings();
+ /**
+ * Saves settings to config file
+ */
+ void saveSettings();
+ /**
+ *
+ */
+ void initView();
+ /**
+ *
+ */
+ void searchBookmarkedModule(const QString&, CGroupManagerItem *);
+ /**
+ * Returns true if the item "item" is a child of item "parent".
+ */
+ const bool isChild(QListViewItem* parent, QListViewItem* child);
+
+public slots: // Public slots
+ /**
+ * Opens a dialog to enter the key to
+ * unlock an encrypted module.
+ */
+ void slotUnlockModule();
+ /**
+ * Resets the groupmanager. Recreates the original Bibles, Lexicons and Commentary groups.
+ */
+ void slotReset();
+ /**
+ * Resizes the content size of this list view.
+ */
+ virtual void resizeContents(int w, int h);
+
+
+signals: // Signals
+ /**
+ * Is emitted when a module in the tree was selected.
+ */
+ void createSwordPresenter(CSwordModuleInfo*, const QString&);
+ /**
+ * Is emitted when more than one module are selected
+ */
+ void createSwordPresenter(ListCSwordModuleInfo, const QString&);
+
+protected slots: // Protected slots
+ /**
+ * Deletes the item given as parameter
+ */
+ void slotDeleteSelectedItems();
+ /**
+ * Changes the current item
+ */
+ void slotChangeBookmark();
+ /**
+ * Is called before the menu is shown
+ */
+ void slotPopupAboutToShow();
+ /**
+ * search the modules that were selected
+ */
+ void slotSearchSelectedModules();
+ /**
+ * Shows an about dialog containing information about a module
+ */
+ void slotShowAbout();
+ /**
+ *
+ */
+ void slotCreateNewPresenter();
+ /**
+ * Creates a new group
+ */
+ void slotCreateNewGroup();
+ /**
+ * Exports bookmarks of selected group
+ */
+ void slotExportBookmarks();
+ /**
+ * Impoorts bookmarks
+ */
+ void slotImportBookmarks();
+ /**
+ * Reimplementatuiion.
+ */
+ void viewportPaintEvent(QPaintEvent*) ;
+ /**
+ * Reimplementation with different parameters
+ */
+ const QRect drawDropVisualizer(QPainter *p, CGroupManagerItem *parent, CGroupManagerItem *after, const QString& type);
+ /**
+ * Reimplementation.
+ */
+ void cleanDropVisualizer();
+ /**
+ * Reimplementation.
+ */
+ void contentsMouseDoubleClickEvent ( QMouseEvent * e);
+ /**
+ * Changes a group.
+ */
+ void slotChangeGroup();
+ /**
+ * Prints the selected bookmark.
+ */
+ void slotPrintBookmark();
+ /**
+ * Reimplementation.
+ */
+ void resizeEvent( QResizeEvent * ) ;
+ /**
+ * Deletes the searchdialog.
+ */
+ void slotDeleteSearchdialog();
+
+private:
+ /**
+ * Our tooltip class. It displays a tooltip depending on the current item under the mouse cursor.
+ */
+ class ToolTip : public QToolTip {
+ public:
+ ToolTip(QWidget* parent);
+ /**
+ * Displays a tooltip for position p using the getToolTip() function of CGroupManagerItem
+ */
+ void maybeTip( const QPoint &pos);
+ };
+ /**
+ *
+ */
+ ListCSwordModuleInfo *m_swordList;
+ void initConnections();
+ void contentsDragEnterEvent( QDragEnterEvent* e);
+ void contentsDragMoveEvent( QDragMoveEvent* e);
+ void contentsDragLeaveEvent( QDragLeaveEvent* e);
+ void contentsDropEvent( QDropEvent* e);
+ void contentsMousePressEvent(QMouseEvent*);
+ void contentsMouseReleaseEvent(QMouseEvent*);
+ void contentsMouseMoveEvent ( QMouseEvent * ) ;
+ /**
+ * Find ID of parent item.
+ */
+ const int parentId(CGroupManagerItem *item, CGroupManagerItem* parentItem = 0);
+ /**
+ * returns the parent of the item with the ID index
+ */
+ CGroupManagerItem* findParent( const int ID, CGroupManagerItem* parentItem = 0 );
+ void createNewBookmark(CGroupManagerItem* parent, CSwordModuleInfo* module, const QString& ref);
+ /**
+ * Save items of group to config. If grou is 0 we save all items.
+ * The path to the group-item itself is saved, too.
+ */
+ const bool saveSwordBookmarks(KConfig* configFile, CGroupManagerItem* group, const Action = Normal);
+ /**
+ * Reads in bookmarks from config and creates them as subitems of group.
+ * If group is 0 we create them a toplevel items.
+ */
+ const bool readSwordBookmarks(KConfig* configFile, CGroupManagerItem* group, const Action = Normal);
+ /**
+ * Save items of group to config. If grou is 0 we save all items.
+ * The path to the group-item itself is saved, too.
+ */
+ const bool saveSwordModules(KConfig* configFile, CGroupManagerItem* group);
+ /**
+ * Reads in bookmarks from config and creates them as subitems of group.
+ * If group is 0 we create them a toplevel items.
+ */
+ const bool readSwordModules(KConfig* configFile, CGroupManagerItem* group);
+ /**
+ * Save items of group to config. If grou is 0 we save all items.
+ * The path to the group-item itself is saved, too.
+ */
+ const bool saveGroups(KConfig* configFile, CGroupManagerItem* group, const Action = Normal);
+ /**
+ * Reads in bookmarks from config and creates them as subitems of group.
+ * If group is 0 we create them a toplevel items.
+ */
+ const bool readGroups(KConfig* configFile, CGroupManagerItem* group, const Action = Normal);
+ /**
+ * Returns the standard group with the given name if it alredy exists.
+ * Otherwise the group will be created.
+ */
+ CGroupManagerItem* findGroup(const QString& name, CGroupManagerItem* group = 0, const int id = -1);
+
+ void printTree();
+
+ KConfig* m_config;
+ KPopupMenu* m_popupMenu;
+ bool m_menu;
+ QPoint m_pressedPos;
+ QRect m_oldDragRect;
+ CGroupManagerItem* m_parentItemDrop;
+ CGroupManagerItem* m_afterItemDrop;
+ QString m_dragType;
+ CSearchDialog* m_searchDialog;
+ ToolTip* m_toolTip;
+ CGroupManagerItem* m_pressedItem;
+ QList<CGroupManagerItem>* m_itemList;
+ bool m_singleClick;
+ bool m_useBookmarks;
+ bool m_saveSettings;
+ bool m_useDragDrop;
+ bool m_useExtendedMode;
+ bool m_useRMBMenu;
+ bool m_showHelpDialogs;
+
+private slots: // Private slots
+ /**
+ * Is called when the return key was pressed on a listview item.
+ */
+ void slotReturnPressed( QListViewItem* );
+};
+
+#endif
+
diff --git a/bibletime/frontend/groupmanager/cgroupmanageritem.cpp b/bibletime/frontend/groupmanager/cgroupmanageritem.cpp
new file mode 100644
index 0000000..7562cbe
--- /dev/null
+++ b/bibletime/frontend/groupmanager/cgroupmanageritem.cpp
@@ -0,0 +1,287 @@
+/***************************************************************************
+ cgroupmanageritem.cpp - description
+ -------------------
+ begin : Tue Jan 25 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cgroupmanageritem.h"
+#include "cgroupmanager.h"
+
+#include "backend/cswordversekey.h"
+#include "backend/cswordldkey.h"
+#include "backend/cswordmoduleinfo.h"
+#include "backend/cswordbiblemoduleinfo.h"
+#include "backend/cswordlexiconmoduleinfo.h"
+
+#include "frontend/ctoolclass.h"
+#include "frontend/cbtconfig.h"
+
+#include "resource.h"
+
+//Qt includes
+#include <qpixmap.h>
+
+//KDE includes
+#include <klocale.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+
+//Sword includes
+#include <swmodule.h>
+
+
+CGroupManagerItem::CGroupManagerItem(CGroupManager *parent, const QString& caption,
+ const QString& modulename, CSwordModuleInfo *module_info, CSwordKey* bookmarkKey, CGroupManagerItem::ItemType Type)
+ : KListViewItem(static_cast<QListView*>(parent) ) {
+
+ init(caption, modulename, module_info, bookmarkKey, Type);
+}
+
+CGroupManagerItem::CGroupManagerItem(CGroupManagerItem *parent, const QString& caption,
+ const QString& modulename, CSwordModuleInfo *module_info, CSwordKey* bookmarkKey, CGroupManagerItem::ItemType Type)
+ : KListViewItem(static_cast<QListViewItem*>(parent)) {
+
+ init(caption, modulename, module_info,bookmarkKey, Type);
+}
+
+CGroupManagerItem::~CGroupManagerItem(){
+ if (m_bookmarkKey && m_createdOwnKey) {
+ delete m_bookmarkKey;
+ m_bookmarkKey = 0;
+ }
+}
+
+/** Returns the CModuleInfo object for this tree-item. */
+CSwordModuleInfo* CGroupManagerItem::moduleInfo() const {
+ return m_moduleInfo;
+}
+
+/** Returns the type of this item */
+const CGroupManagerItem::ItemType CGroupManagerItem::type() const {
+ return m_type;
+}
+
+/** Shows child or not */
+void CGroupManagerItem::setOpen( bool open ){
+ QListViewItem::setOpen(open);
+ if (m_type == Group) {
+ if (open && this->childCount() > 0)
+ setPixmap(0,m_openFolderIcon);
+ else
+ setPixmap(0,m_folderIcon);
+ }
+}
+
+/** Initializes the item Used by both constructors to share the double used source code */
+void CGroupManagerItem::init( const QString& caption, const QString& modulename, CSwordModuleInfo *module_info, CSwordKey* bookmarkKey, CGroupManagerItem::ItemType Type ){
+ m_bookmarkKey = 0;
+ m_createdOwnKey = false;
+ m_moduleInfo = 0;
+ m_caption = QString::null;
+ m_description = QString::null;
+
+ setType(Type);
+ if (bookmarkKey)
+ setBookmarkKey( bookmarkKey );
+ setModuleInfo( module_info );
+ m_caption = caption;
+ m_moduleName = modulename;
+
+ update(); //refresh the pixmap, texts etc.
+}
+
+/** Sets / changes the description */
+void CGroupManagerItem::setDescription(const QString& new_description) {
+ m_description = new_description;
+ update();
+}
+
+/** Returns the description of the item */
+const QString CGroupManagerItem::description() const {
+ return m_description;
+}
+
+/** Returns the parent of this item. Reimplementation. */
+CGroupManagerItem* CGroupManagerItem::parent(){
+ CGroupManagerItem* myParent = dynamic_cast<CGroupManagerItem*>(QListViewItem::parent());
+ if (myParent)
+ return myParent;
+ else
+ return 0;
+}
+
+/** Returns the listview of this item */
+CGroupManager* CGroupManagerItem::listView(){
+ CGroupManager* myListView = dynamic_cast<CGroupManager*>(QListViewItem::listView());
+ if (myListView)
+ return myListView;
+ else
+ return 0;
+}
+
+/** Returns the key if it's a Bookmark, othwerwise return 0 */
+CSwordKey* CGroupManagerItem::getBookmarkKey() const{
+ return m_bookmarkKey;
+}
+
+/** Sets the key, which is only used if this item is a Bookmark */
+void CGroupManagerItem::setBookmarkKey( CSwordKey* key ){
+ if (m_bookmarkKey && m_createdOwnKey)
+ delete m_bookmarkKey;
+ m_bookmarkKey = key;
+ m_createdOwnKey = false;
+ update();
+}
+
+/** Updates this item (icons, captions, etc.) */
+void CGroupManagerItem::update(){
+ if (m_type == Group) {
+ m_folderIcon = GROUP_ICON_SMALL;
+ m_openFolderIcon = GROUP_OPEN_ICON_SMALL;
+ setPixmap(0, m_folderIcon);
+ setText(0, m_caption);
+ }
+ else if (m_type == Bookmark) {
+ QString title = QString::null;
+ setPixmap(0, BOOKMARK_ICON_SMALL);
+ CSwordKey* bookmarkKey = getBookmarkKey();
+ if ( bookmarkKey ) { //if we have a valid key
+ title = bookmarkKey->key();
+ }
+ else if (!m_caption.isEmpty()){ //bookmark key is 0, we use now the m_caption member to create a valid key
+ CSwordKey* key = CSwordKey::createInstance(m_moduleInfo);
+ ASSERT(key);
+ if (key) {
+ m_createdOwnKey = true;
+ key->key(m_caption);
+ setBookmarkKey(key);
+ update();// this won't lead to a infinite loop because we have now a valid key
+ }
+ else { //no key and now module but a valid caption
+ title = m_caption;
+ }
+ }
+ if (!title.isEmpty()) {
+ title = QString::fromLatin1("%1 (%2)")
+ .arg(title)
+ .arg(m_moduleInfo ? m_moduleInfo->name() : i18n("unknown"));
+ setText(0,title);
+ }
+ }
+ else if ( m_type == CGroupManagerItem::Module ) {
+ setPixmap(0, CToolClass::getIconForModule(m_moduleInfo));
+ if (m_moduleInfo)
+ setText(0, m_moduleInfo->name());
+ else if (!m_moduleName.isEmpty())
+ setText(0, m_moduleName);
+ else
+ setText(0, i18n("unknown"));
+ }
+}
+
+/** Sets the type of the item. */
+void CGroupManagerItem::setType( const CGroupManagerItem::ItemType type) {
+ m_type = type;
+}
+
+/** Sets the module of ths item. */
+void CGroupManagerItem::setModuleInfo( CSwordModuleInfo* moduleInfo ){
+ m_moduleInfo = dynamic_cast<CSwordModuleInfo*>(moduleInfo);
+}
+
+/** Returns a QString version of the key. */
+const QString CGroupManagerItem::getKeyText(){
+ return m_bookmarkKey ? m_bookmarkKey->key() : QString::null;
+}
+
+/** Returns the tooltip for this ite, QString::null is returned if this item has no tooltip. */
+const QString CGroupManagerItem::getToolTip(){
+ QString text = QString::null;
+ switch ( type() ) {
+ case Bookmark:
+ {
+ text = i18n("Bookmark to" ) + QString::fromLatin1(" ");
+ text.append(QString::fromLatin1("<B>") + getKeyText() + QString::fromLatin1("</B><BR>"));
+ if (!description().stripWhiteSpace().isEmpty())
+ text.append(QString::fromLatin1("<FONT color=\"#800000\">(") + description().stripWhiteSpace() + QString::fromLatin1(")</FONT><BR>"));
+ text.append(QString::fromLatin1("<HR>"));
+
+ CSwordKey* key = dynamic_cast<CSwordKey*>(getBookmarkKey());
+ if (!key)
+ return QString::null;
+ QString bookmarkText = key ? key->renderedText() : QString();
+ if (bookmarkText.length() > 150 && (moduleInfo()->type() != CSwordModuleInfo::Bible))
+ bookmarkText = bookmarkText.left(150) + "<BR>[...]";
+
+ //Module is Unicode-based
+ if (moduleInfo() && moduleInfo()->isUnicode() ) {
+ QFont f = CBTConfig::get(CBTConfig::unicode);
+ text.append( QString::fromLatin1("<FONT FACE=\"%1\">%3</FONT>").arg(f.family())/*.arg(CToolClass::makeLogicFontSize(f.pointSize()))*/.arg(bookmarkText) );
+ }
+ else
+ text.append(bookmarkText);
+
+ return text;
+ }
+ case Module:
+ {
+ text = i18n("Module") + QString::fromLatin1(": <B>%1</B><HR>").arg( moduleInfo()->name() );
+ text += moduleInfo()->config(CSwordModuleInfo::Description) + QString::fromLatin1("<HR>");
+ text += i18n("Language")+ QString::fromLatin1(": %1<BR>").arg(moduleInfo()->module()->Lang());
+ if (moduleInfo()->isEncrypted())
+ text += i18n("Unlock key") + QString::fromLatin1(": %1<BR>")
+ .arg(!moduleInfo()->config(CSwordModuleInfo::CipherKey).isEmpty() ? moduleInfo()->config(CSwordModuleInfo::CipherKey) : QString("<FONT COLOR=\"red\">%1</FONT>").arg(i18n("not set")));
+ if (moduleInfo()->hasVersion())
+ text += i18n("Version") + QString::fromLatin1(": %1<BR>").arg(moduleInfo()->config(CSwordModuleInfo::ModuleVersion));
+
+ QString options;
+ unsigned int opts;
+ for (opts = CSwordBackend::filterOptionsMIN; opts <= CSwordBackend::filterOptionsMAX; ++opts){
+ if (moduleInfo()->has( (CSwordBackend::FilterOptions) opts )) {
+ if (!options.isEmpty())
+ options += QString::fromLatin1(", ");
+ options += CSwordBackend::translatedOptionName( (CSwordBackend::FilterOptions) opts);
+ }
+ }
+ if (!options.isEmpty())
+ text += i18n("Options") + QString::fromLatin1(": <font size= \"-1\">") + options + QString::fromLatin1("</font>");
+
+ if (text.right(4) == QString::fromLatin1("<BR>"))
+ text = text.left(text.length()-4);
+ return text;
+ }
+ case Group:
+ default:
+ return QString::null;
+ }
+}
+
+/** Moves this item after the item "item". */
+void CGroupManagerItem::moveAfter( CGroupManagerItem* item, const MoveType type ){
+ if (!item)
+ return;
+
+ if ( parent() != item->parent() ) { //different levels
+ if (type == AllowDifferentParents) { //different parents are allowed
+ if (item->parent())
+ item->parent()->insertItem(this); //insert item to the childs
+ else
+ listView()->insertItem(this);
+ moveItem(item);
+ }
+ }
+ else {
+ moveItem(item); //both items are on the same level, so we can use moveItem
+ }
+}
diff --git a/bibletime/frontend/groupmanager/cgroupmanageritem.h b/bibletime/frontend/groupmanager/cgroupmanageritem.h
new file mode 100644
index 0000000..708aa24
--- /dev/null
+++ b/bibletime/frontend/groupmanager/cgroupmanageritem.h
@@ -0,0 +1,190 @@
+/***************************************************************************
+ cgroupmanageritem.h - The items in a CGroupManager
+ -------------------
+ begin : Tue Jan 25 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CGROUPMANAGERITEM_H
+#define CGROUPMANAGERITEM_H
+
+//BibleTime includes
+#include "../cpointers.h"
+
+//Qt includes
+#include <qstring.h>
+
+//KDE includes
+#include <qpixmap.h>
+#include <klistview.h>
+
+class CSwordKey;
+class CSwordModuleInfo;
+
+class CGroupManager;
+class CSwordModuleInfo;
+class QListViewItem;
+
+/**
+ * An item which implements functions to get the module of this item.
+ *
+ * An item which implements functions to get the module of this item. The constructor gets the required arguments to operate
+ * @author Joachim Ansorg <jansorg@gmx.de>
+ */
+class CGroupManagerItem : public KListViewItem, public CPointers {
+
+ friend class CGroupManager;
+
+public:
+ enum ItemType { Bookmark, Module, Group };
+ enum MoveType { OnlySameParents, AllowDifferentParents };
+
+ /**
+ * The constructor. This constructor takes a CGroupManager as parent, the created item will be on the top of the tree.
+ * @param parent The CGRoupManager which will contain the new item
+ * @param caption The caption of the item. This parameter will eb passes to @see #init()
+ * @param modulename The name of our module. This is used in addition to the CModuleInfo object because sometimes the moduleinfo is missing and we don't want to loose bookmarks.
+ * @param module_info The CModuleInfo object we use for the item. May be zero because a group doesn't have a CModuleInfo.
+ * @param Type The type of the created item. May ba Module, Bookmark or Group. If you leave out the parameter it will be Module by default.
+ */
+ CGroupManagerItem( CGroupManager *parent, const QString& caption,const QString& modulename, CSwordModuleInfo *module_info, CSwordKey* bookmarkKey = 0, CGroupManagerItem::ItemType Type = CGroupManagerItem::Module );
+ /**
+ * The constructor. This constructor takes a CGroupManagerItem as parent. The created item will be on a child of the parent item
+ * @param parent The CGroupManagerItem which will be parent item of the new item
+ * @param caption The caption of the item. This parameter will eb passes to @see #init()
+ * @param modulename The name of our module. This is used in addition to the CModuleInfo object because sometimes the moduleinfo is missing and we don't want to loose bookmarks.
+ * @param module_info The CModuleInfo object we use for the item. May be zero because a group doesn't have a CModuleInfo.
+ * @param Type The type of the created item. May ba Module, Bookmark or Group. If you leave out the parameter it will be Module by default.
+ */
+ CGroupManagerItem( CGroupManagerItem *parent, const QString& caption, const QString& modulename, CSwordModuleInfo *module_info, CSwordKey* bookmarkKey = 0, CGroupManagerItem::ItemType Type = CGroupManagerItem::Module);
+ /**
+ * The destructor. Cleans up memory.
+ */
+ ~CGroupManagerItem();
+ /**
+ * Returns the description of the item
+ * @return The description of the item. Useful for bookmarks.
+ */
+ const QString description() const;
+ /**
+ * Use this to get the parent item of the item-
+ * @return The parent item. Maybe NULL if the item has no parent.
+ * Reimplementation.
+ */
+ virtual CGroupManagerItem* parent();
+ /**
+ * Sets the module of ths item.
+ */
+ void setModuleInfo( CSwordModuleInfo* moduleInfo );
+ /**
+ * Sets the type of the item.
+ */
+ void setType( const CGroupManagerItem::ItemType type);
+ /**
+ * Updates this item (icons, captions, etc.)
+ */
+ virtual void update();
+ virtual CGroupManager* listView();
+ /**
+ * Sets the key, which is only used if this item is a Bookmark
+ */
+ void setBookmarkKey( CSwordKey* key );
+ /**
+ * Returns the key if it's a Bookmark, othwerwise return 0
+ */
+ CSwordKey* getBookmarkKey() const;
+ /**
+ * Returns a QString version of the key.
+ */
+ const QString getKeyText();
+ /**
+ * Returns the CModuleInfo obkject for this tree-item.
+ * @return Gives back a pointer to the moduleinfo. May ba NULL because groups do not have moduleinfos.
+ */
+ CSwordModuleInfo* moduleInfo() const;
+ /**
+ * Use this function to get the type of this item.
+ * @return Returns the type of the item. May be Group, Bookmark or Module.
+ */
+ const CGroupManagerItem::ItemType type() const;
+ /**
+ * Show sub item if true, otherwise do not show them.
+ * Reimplementation from QListViewItem
+ */
+ virtual void setOpen( bool );
+ /**
+ * Sets / changes the description
+ */
+ void setDescription(const QString&);
+ /**
+ * Returns the tooltip for this ite, QString::null is returned if this item has no tooltip.
+ */
+ const QString getToolTip();
+ /**
+ * Moves this item after the item "item".
+ * This function acts like the provate function "moveToJustAfter"
+ * moveItem isn't usable for items which are child of item.
+ */
+ void moveAfter( CGroupManagerItem* item, const MoveType type = OnlySameParents );
+
+private:
+ /**
+ * Initializes the item Used by both constructors to share the double used source code
+ * @param caption The caption of the item
+ * @param modulename The modulename as a QSTring
+ * @param module_info The CModuleInfo object for this item. May be NULL because groups have no moduleinfo.
+ * @param Type The type of the item (Group, Bookmark or Module)
+ */
+ virtual void init( const QString& caption, const QString& modulename, CSwordModuleInfo *module_info,CSwordKey* bookmarkKey, CGroupManagerItem::ItemType Type);
+ /**
+ * The type of this entry
+ */
+ ItemType m_type;
+ /**
+ * The pointer to the internal module_info
+ * At the moment we assume that the module of a CGroupmanagerItem is a CSwordModuleInfo object.
+ */
+ CSwordModuleInfo* m_moduleInfo;
+ /**
+ * The key which is only valid for bookmarks
+ */
+ CSwordKey* m_bookmarkKey;
+ /**
+ * This is true if this item uses a key which was created by this item.
+ */
+ bool m_createdOwnKey;
+ /**
+ * The description of the item.
+ * At the moment only useable for bookmarks.
+ */
+ QString m_description;
+ /**
+ * The caption of the item.
+ * Used for bookmarks and groups.
+ */
+ QString m_caption;
+ /**
+ * The namec of the module.
+ */
+ QString m_moduleName;
+ /**
+ * The pixmap which belongs to folders
+ */
+ QPixmap m_folderIcon;
+ /**
+ * The pixmap which belongs to opened folders
+ */
+ QPixmap m_openFolderIcon;
+};
+
+#endif
+
diff --git a/bibletime/frontend/keychooser/Makefile.am b/bibletime/frontend/keychooser/Makefile.am
new file mode 100644
index 0000000..4fa0d18
--- /dev/null
+++ b/bibletime/frontend/keychooser/Makefile.am
@@ -0,0 +1,25 @@
+INCLUDES = $(all_includes)
+
+libkeychooser_a_METASOURCES = AUTO
+
+noinst_LIBRARIES = libkeychooser.a
+
+libkeychooser_a_SOURCES = \
+cbiblekeychooser.cpp \
+clexiconkeychooser.cpp \
+ckeychooser.cpp \
+cfx_btn.cpp \
+ckeychooserwidget.cpp \
+cbookkeychooser.cpp \
+cbooktreechooser.cpp
+
+all_headers = ckeychooserwidget.h \
+cfx_btn.h \
+ckeychooser.h \
+clexiconkeychooser.h \
+cbiblekeychooser.h \
+cbookkeychooser.h \
+cbooktreechooser.h
+
+EXTRA_DIST = $(libkeychooser_a_SOURCES) $(all_headers)
+
diff --git a/bibletime/frontend/keychooser/Makefile.in b/bibletime/frontend/keychooser/Makefile.in
new file mode 100644
index 0000000..e423020
--- /dev/null
+++ b/bibletime/frontend/keychooser/Makefile.in
@@ -0,0 +1,643 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+INCLUDES = $(all_includes)
+
+#>- libkeychooser_a_METASOURCES = AUTO
+
+noinst_LIBRARIES = libkeychooser.a
+
+libkeychooser_a_SOURCES = cbiblekeychooser.cpp clexiconkeychooser.cpp ckeychooser.cpp cfx_btn.cpp ckeychooserwidget.cpp cbookkeychooser.cpp cbooktreechooser.cpp
+
+
+all_headers = ckeychooserwidget.h cfx_btn.h ckeychooser.h clexiconkeychooser.h cbiblekeychooser.h cbookkeychooser.h cbooktreechooser.h
+
+
+EXTRA_DIST = $(libkeychooser_a_SOURCES) $(all_headers)
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../../config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I../../..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libkeychooser_a_LIBADD =
+#>- libkeychooser_a_OBJECTS = cbiblekeychooser.$(OBJEXT) \
+#>- clexiconkeychooser.$(OBJEXT) ckeychooser.$(OBJEXT) cfx_btn.$(OBJEXT) \
+#>- ckeychooserwidget.$(OBJEXT) cbookkeychooser.$(OBJEXT) \
+#>- cbooktreechooser.$(OBJEXT)
+#>+ 9
+libkeychooser_a_final_OBJECTS = libkeychooser_a.all_cpp.o
+libkeychooser_a_nofinal_OBJECTS = cbiblekeychooser.$(OBJEXT) \
+clexiconkeychooser.$(OBJEXT) ckeychooser.$(OBJEXT) cfx_btn.$(OBJEXT) \
+ckeychooserwidget.$(OBJEXT) cbookkeychooser.$(OBJEXT) \
+cbooktreechooser.$(OBJEXT)\
+cfx_btn.moc.o ckeychooser.moc.o cbooktreechooser.moc.o ckeychooserwidget.moc.o cbiblekeychooser.moc.o clexiconkeychooser.moc.o cbookkeychooser.moc.o \
+libkeychooser_a_meta_unload.o
+@KDE_USE_FINAL_FALSE@libkeychooser_a_OBJECTS = $(libkeychooser_a_nofinal_OBJECTS)
+@KDE_USE_FINAL_TRUE@libkeychooser_a_OBJECTS = $(libkeychooser_a_final_OBJECTS)
+AR = ar
+CXXFLAGS = @CXXFLAGS@
+#>- CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+CXXLD = $(CXX)
+#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
+#>+ 1
+CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+#>- DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+#>+ 4
+KDE_DIST=ckeychooserwidget.h cbiblekeychooser.h cbookkeychooser.h ckeychooser.h clexiconkeychooser.h cbooktreechooser.h cfx_btn.h
+
+DISTFILES= $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
+
+
+TAR = tar
+GZIP_ENV = --best
+#>- DEP_FILES = .deps/cbiblekeychooser.P .deps/cbookkeychooser.P \
+#>- .deps/cbooktreechooser.P .deps/cfx_btn.P .deps/ckeychooser.P \
+#>- .deps/ckeychooserwidget.P .deps/clexiconkeychooser.P
+#>+ 8
+@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/cfx_btn.moc.P $(DEPDIR)/ckeychooser.moc.P $(DEPDIR)/cbooktreechooser.moc.P $(DEPDIR)/ckeychooserwidget.moc.P $(DEPDIR)/cbiblekeychooser.moc.P $(DEPDIR)/clexiconkeychooser.moc.P $(DEPDIR)/cbookkeychooser.moc.P $(DEPDIR)/libkeychooser_a_meta_unload.P $(DEPDIR)/libkeychooser_a.all_cpp.P \
+ .deps/cbiblekeychooser.P .deps/cbookkeychooser.P \
+.deps/cbooktreechooser.P .deps/cfx_btn.P .deps/ckeychooser.P \
+.deps/ckeychooserwidget.P .deps/clexiconkeychooser.P
+@KDE_USE_FINAL_FALSE@DEP_FILES = $(DEPDIR)/cfx_btn.moc.P $(DEPDIR)/ckeychooser.moc.P $(DEPDIR)/cbooktreechooser.moc.P $(DEPDIR)/ckeychooserwidget.moc.P $(DEPDIR)/cbiblekeychooser.moc.P $(DEPDIR)/clexiconkeychooser.moc.P $(DEPDIR)/cbookkeychooser.moc.P $(DEPDIR)/libkeychooser_a_meta_unload.P .deps/cbiblekeychooser.P .deps/cbookkeychooser.P \
+.deps/cbooktreechooser.P .deps/cfx_btn.P .deps/ckeychooser.P \
+.deps/ckeychooserwidget.P .deps/clexiconkeychooser.P
+
+SOURCES = $(libkeychooser_a_SOURCES)
+OBJECTS = $(libkeychooser_a_OBJECTS)
+
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .cpp .lo .o .obj .s
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/keychooser/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/keychooser/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/frontend/keychooser/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.s.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libkeychooser.a: $(libkeychooser_a_OBJECTS) $(libkeychooser_a_DEPENDENCIES)
+ -rm -f libkeychooser.a
+ $(AR) cru libkeychooser.a $(libkeychooser_a_OBJECTS) $(libkeychooser_a_LIBADD)
+ $(RANLIB) libkeychooser.a
+.cpp.o:
+ $(CXXCOMPILE) -c $<
+.cpp.obj:
+ $(CXXCOMPILE) -c `cygpath -w $<`
+.cpp.lo:
+ $(LTCXXCOMPILE) -c $<
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/frontend/keychooser
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/frontend/keychooser/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+ -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+ @echo '$(COMPILE) -c $<'; \
+ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.c
+ @echo '$(LTCOMPILE) -c $<'; \
+ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+
+%.o: %.cpp
+ @echo '$(CXXCOMPILE) -c $<'; \
+ $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.cpp
+ @echo '$(LTCXXCOMPILE) -c $<'; \
+ $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
+ mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+#>- clean-am: clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+#>- clean-depend clean-generic mostlyclean-am
+#>+ 2
+clean-am: clean-metasources clean-moc-classes clean-final clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+ clean-depend clean-generic mostlyclean-am
+
+#>- clean: clean-am
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+distclean-am: distclean-noinstLIBRARIES distclean-compile \
+ distclean-libtool distclean-tags distclean-depend \
+ distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-tags maintainer-clean-depend \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 3
+cfx_btn.moc.cpp: $(srcdir)/cfx_btn.h
+ $(MOC) $(srcdir)/cfx_btn.h -o cfx_btn.moc.cpp
+
+#>+ 3
+ckeychooser.moc.cpp: $(srcdir)/ckeychooser.h
+ $(MOC) $(srcdir)/ckeychooser.h -o ckeychooser.moc.cpp
+
+#>+ 3
+cbooktreechooser.moc.cpp: $(srcdir)/cbooktreechooser.h
+ $(MOC) $(srcdir)/cbooktreechooser.h -o cbooktreechooser.moc.cpp
+
+#>+ 3
+ckeychooserwidget.moc.cpp: $(srcdir)/ckeychooserwidget.h
+ $(MOC) $(srcdir)/ckeychooserwidget.h -o ckeychooserwidget.moc.cpp
+
+#>+ 3
+cbiblekeychooser.moc.cpp: $(srcdir)/cbiblekeychooser.h
+ $(MOC) $(srcdir)/cbiblekeychooser.h -o cbiblekeychooser.moc.cpp
+
+#>+ 3
+clexiconkeychooser.moc.cpp: $(srcdir)/clexiconkeychooser.h
+ $(MOC) $(srcdir)/clexiconkeychooser.h -o clexiconkeychooser.moc.cpp
+
+#>+ 3
+cbookkeychooser.moc.cpp: $(srcdir)/cbookkeychooser.h
+ $(MOC) $(srcdir)/cbookkeychooser.h -o cbookkeychooser.moc.cpp
+
+#>+ 3
+clean-metasources:
+ -rm -f cfx_btn.moc.cpp ckeychooser.moc.cpp cbooktreechooser.moc.cpp ckeychooserwidget.moc.cpp cbiblekeychooser.moc.cpp clexiconkeychooser.moc.cpp cbookkeychooser.moc.cpp
+
+#>+ 2
+docs-am:
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/keychooser/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/frontend/keychooser/Makefile.in
+
+
+#>+ 10
+libkeychooser_a_meta_unload.cpp: cfx_btn.moc.cpp ckeychooser.moc.cpp ckeychooserwidget.moc.cpp cbooktreechooser.moc.cpp clexiconkeychooser.moc.cpp cbiblekeychooser.moc.cpp cbookkeychooser.moc.cpp
+ @echo 'creating libkeychooser_a_meta_unload.cpp'
+ @-rm -f libkeychooser_a_meta_unload.cpp
+ @echo 'static const char * _metalist_libkeychooser_a[] = {' > libkeychooser_a_meta_unload.cpp
+ @cat cfx_btn.moc.cpp ckeychooser.moc.cpp ckeychooserwidget.moc.cpp cbooktreechooser.moc.cpp clexiconkeychooser.moc.cpp cbiblekeychooser.moc.cpp cbookkeychooser.moc.cpp | grep 'char.*className' | sed -e 's/.*[^A-Za-z0-9_:]\([A-Za-z0-9_:]*\)::className.*$$/\"\1\",/' | sort | uniq >> libkeychooser_a_meta_unload.cpp
+ @echo '0};' >> libkeychooser_a_meta_unload.cpp
+ @echo '#include <kunload.h>' >> libkeychooser_a_meta_unload.cpp
+ @echo '_UNLOAD(libkeychooser_a)' >> libkeychooser_a_meta_unload.cpp
+
+
+#>+ 3
+clean-moc-classes:
+ -rm -f libkeychooser_a_meta_unload.cpp
+
+#>+ 11
+libkeychooser_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/cbiblekeychooser.cpp $(srcdir)/clexiconkeychooser.cpp $(srcdir)/ckeychooser.cpp $(srcdir)/cfx_btn.cpp $(srcdir)/ckeychooserwidget.cpp $(srcdir)/cbookkeychooser.cpp $(srcdir)/cbooktreechooser.cpp libkeychooser_a_meta_unload.cpp cfx_btn.moc.cpp ckeychooser.moc.cpp cbooktreechooser.moc.cpp ckeychooserwidget.moc.cpp cbiblekeychooser.moc.cpp clexiconkeychooser.moc.cpp cbookkeychooser.moc.cpp
+ @echo 'creating libkeychooser_a.all_cpp.cpp ...'; \
+ rm -f libkeychooser_a.all_cpp.files libkeychooser_a.all_cpp.final; \
+ echo "#define KDE_USE_FINAL 1" >> libkeychooser_a.all_cpp.final; \
+ for file in cbiblekeychooser.cpp clexiconkeychooser.cpp ckeychooser.cpp cfx_btn.cpp ckeychooserwidget.cpp cbookkeychooser.cpp cbooktreechooser.cpp libkeychooser_a_meta_unload.cpp cfx_btn.moc.cpp ckeychooser.moc.cpp cbooktreechooser.moc.cpp ckeychooserwidget.moc.cpp cbiblekeychooser.moc.cpp clexiconkeychooser.moc.cpp cbookkeychooser.moc.cpp; do \
+ echo "#include \"$$file\"" >> libkeychooser_a.all_cpp.files; \
+ test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libkeychooser_a.all_cpp.final; \
+ done; \
+ cat libkeychooser_a.all_cpp.final libkeychooser_a.all_cpp.files > libkeychooser_a.all_cpp.cpp; \
+ rm -f libkeychooser_a.all_cpp.final libkeychooser_a.all_cpp.files
+
+#>+ 3
+clean-final:
+ -rm -f libkeychooser_a.all_cpp.cpp
+
+#>+ 2
+final:
+ $(MAKE) libkeychooser_a_OBJECTS="$(libkeychooser_a_final_OBJECTS)" all-am
+#>+ 2
+no-final:
+ $(MAKE) libkeychooser_a_OBJECTS="$(libkeychooser_a_nofinal_OBJECTS)" all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/frontend/keychooser/cbiblekeychooser.cpp b/bibletime/frontend/keychooser/cbiblekeychooser.cpp
new file mode 100644
index 0000000..ca64115
--- /dev/null
+++ b/bibletime/frontend/keychooser/cbiblekeychooser.cpp
@@ -0,0 +1,290 @@
+/***************************************************************************
+ cbiblekeychooser.cpp - description
+ -------------------
+ begin : Wed Sep 20 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+#include "cbiblekeychooser.h"
+#include "ckeychooserwidget.h"
+#include "cfx_btn.h"
+#include "../../whatsthisdef.h"
+#include "../../tooltipdef.h"
+#include "../../backend/cswordversekey.h"
+#include "../../backend/cswordbiblemoduleinfo.h"
+#include "../../backend/cswordmoduleinfo.h"
+
+//Qt includes
+#include <qcombobox.h>
+#include <qlistbox.h>
+#include <qlayout.h>
+
+//KDE includes
+#include <klocale.h>
+
+CBibleKeyChooser::CBibleKeyChooser(CSwordModuleInfo *module, CSwordKey *key, QWidget *parent, const char *name )
+ : CKeyChooser(module, key, parent, name), m_info(0), m_key(0), w_book(0), w_chapter(0), w_verse(0)
+{
+ if (module && (module->type() == CSwordModuleInfo::Bible || module->type() == CSwordModuleInfo::Commentary) ) {
+ m_info = dynamic_cast<CSwordBibleModuleInfo*>(module);
+ m_key = dynamic_cast<CSwordVerseKey*>(key);
+ }
+ else {
+ qWarning("CBibleKeyChooser: module is not a Bible or commentary!");
+ return;
+ }
+ QHBoxLayout* layout = new QHBoxLayout(this);
+ layout->setResizeMode(QLayout::Fixed);
+
+ w_book = new CKeyChooserWidget(m_info->books(),false,this);
+ w_book->setToolTips(TT_PRESENTER_BOOK_COMBO, TT_PRESENTER_NEXT_BOOK, TT_PRESENTER_SCROLL_BUTTON, TT_PRESENTER_PREVIOUS_BOOK);
+ w_book->setWhatsThis(WT_PRESENTER_BOOK_COMBO, WT_PRESENTER_NEXT_BOOK, WT_PRESENTER_SCROLL_BUTTON, WT_PRESENTER_PREVIOUS_BOOK);
+
+ w_chapter = new CKeyChooserWidget( m_info->chapterCount(1),true,this);
+ w_chapter->setToolTips(TT_PRESENTER_CHAPTER_COMBO, TT_PRESENTER_NEXT_CHAPTER, TT_PRESENTER_SCROLL_BUTTON, TT_PRESENTER_PREVIOUS_CHAPTER);
+ w_chapter->setWhatsThis(WT_PRESENTER_CHAPTER_COMBO, WT_PRESENTER_NEXT_CHAPTER, WT_PRESENTER_SCROLL_BUTTON, WT_PRESENTER_PREVIOUS_CHAPTER);
+
+ w_verse = new CKeyChooserWidget( m_info->verseCount(1,1),true,this);
+ w_verse->setToolTips(TT_PRESENTER_VERSE_COMBO, TT_PRESENTER_NEXT_VERSE, TT_PRESENTER_SCROLL_BUTTON, TT_PRESENTER_PREVIOUS_VERSE);
+ w_verse->setWhatsThis(WT_PRESENTER_VERSE_COMBO, WT_PRESENTER_NEXT_VERSE, WT_PRESENTER_SCROLL_BUTTON, WT_PRESENTER_PREVIOUS_VERSE);
+
+ QWidget::setTabOrder(w_book, w_chapter);
+ QWidget::setTabOrder(w_chapter, w_verse);
+ QWidget::setTabOrder(w_verse, 0);
+
+ layout->addWidget(w_book);
+ layout->addWidget(w_chapter);
+ layout->addWidget(w_verse);
+
+ /*Book connections*/
+ connect(w_book,SIGNAL(changed(int)) ,SLOT(bookChanged(int)));
+ connect(w_book,SIGNAL(focusOut(int)) ,SLOT(bookFocusOut(int)));
+
+ /*Chapter Connections*/
+ connect(w_chapter,SIGNAL(changed(int)) ,SLOT(chapterChanged(int)));
+ connect(w_chapter,SIGNAL(next_requested()),SLOT(chapterNextRequested()));
+ connect(w_chapter,SIGNAL(prev_requested()),SLOT(chapterPrevRequested()));
+ connect(w_chapter,SIGNAL(focusOut(int)) ,SLOT(chapterFocusOut(int)));
+
+
+ /*Verse Connections*/
+ connect(w_verse,SIGNAL(changed(int)) ,SLOT(verseChanged(int)));
+ connect(w_verse,SIGNAL(next_requested()) ,SLOT(verseNextRequested()));
+ connect(w_verse,SIGNAL(prev_requested()) ,SLOT(versePrevRequested()));
+ connect(w_verse,SIGNAL(focusOut(int)) ,SLOT(verseFocusOut(int)));
+}
+
+CSwordKey* const CBibleKeyChooser::key(){
+ if (m_key) {
+ m_key->book(w_book->comboBox()->currentText());
+ m_key->Chapter(w_chapter->comboBox()->currentText().toInt());
+ m_key->Verse(w_verse->comboBox()->currentText().toInt());
+ }
+ return m_key;
+}
+
+void CBibleKeyChooser::setKey(CSwordKey* key){
+ if ( !(m_key = dynamic_cast<CSwordVerseKey*>(key)) )
+ return;
+
+ const unsigned int bookIndex = m_info->bookNumber( m_key->book() );
+ const int chapter = m_key->Chapter();
+ const int verse = m_key->Verse();
+
+ //reset the keychooser parts only if we found a valid book
+ const int count = w_book->comboBox()->count();
+ const QString desiredBook = m_key->book();
+ bool bookIsValid = false;
+ for (int i = 0; i < count; ++i) {
+ if (w_book->comboBox()->text(i) == desiredBook) {
+ bookIsValid = true;
+ break;
+ }
+ }
+
+ if (bookIsValid) { //we have a valid book
+ if (w_book->comboBox()->currentText() != m_key->book()) //necessary?
+ w_book->setItem( m_key->book() );
+
+ w_chapter->reset(m_info->chapterCount(bookIndex), chapter-1, false);
+ w_chapter->adjustSize();
+
+ w_verse->reset(m_info->verseCount(bookIndex, chapter), verse-1, false);
+ w_verse->adjustSize();
+
+ emit keyChanged(m_key);
+ }
+ else {
+ qWarning("CBibleKeyChooser::setKey: book %s is invalid!", m_key->book().latin1());
+ w_verse->comboBox()->setCurrentItem(0);
+ m_key->Verse(w_verse->comboBox()->currentText().toInt());
+ }
+}
+
+/** */
+void CBibleKeyChooser::chapterNextRequested(void){
+ if (!isUpdatesEnabled())
+ return;
+
+ setUpdatesEnabled(false);
+ if (m_key)
+ emit beforeKeyChange(m_key->key());
+ if (m_key->next(CSwordVerseKey::UseChapter))
+ setKey(m_key);
+ setUpdatesEnabled(true);
+}
+
+/** */
+void CBibleKeyChooser::chapterPrevRequested(void){
+ if (!isUpdatesEnabled())
+ return;
+
+ setUpdatesEnabled(false);
+ if (m_key)
+ emit beforeKeyChange(m_key->key());
+
+ if (m_key->previous(CSwordVerseKey::UseChapter))
+ setKey(m_key);
+ setUpdatesEnabled(true);
+}
+
+/** */
+void CBibleKeyChooser::verseNextRequested(void){
+ if (!isUpdatesEnabled())
+ return;
+
+ setUpdatesEnabled(false);
+ if (m_key)
+ emit beforeKeyChange(m_key->key());
+
+ if (m_key->next(CSwordVerseKey::UseVerse))
+ setKey(m_key);
+ setUpdatesEnabled(true);
+}
+
+/** */
+void CBibleKeyChooser::versePrevRequested(void){
+ if (!isUpdatesEnabled())
+ return;
+
+ setUpdatesEnabled(false);
+ if (m_key)
+ emit beforeKeyChange(m_key->key());
+
+ if (m_key->previous(CSwordVerseKey::UseVerse))
+ setKey(m_key);
+ setUpdatesEnabled(true);
+}
+
+void CBibleKeyChooser::bookChanged(int /*i*/){
+// qDebug("CBibleKeyChooser::bookChanged(int /*i*/)");
+ if (!isUpdatesEnabled())
+ return;
+ setUpdatesEnabled(false);
+ if (m_key)
+ emit beforeKeyChange(m_key->key());
+
+ if (m_key->book() != w_book->comboBox()->currentText()) {
+ m_key->book( w_book->comboBox()->currentText() );
+ setKey( m_key );
+ }
+ setUpdatesEnabled(true);
+}
+
+void CBibleKeyChooser::chapterChanged(int /*i*/){
+// qDebug("CBibleKeyChooser::chapterChanged(int /*i*/)");
+ if (!isUpdatesEnabled())
+ return;
+
+ setUpdatesEnabled(false);
+ if (m_key)
+ emit beforeKeyChange(m_key->key());
+// if (m_key)
+// emit beforeKeyChange(m_key->key());
+
+ if (m_key->Chapter() != w_chapter->comboBox()->currentText().toInt()) {
+ m_key->Chapter( w_chapter->comboBox()->currentText().toInt() );
+ setKey( m_key );
+ }
+
+ setUpdatesEnabled(true);
+}
+
+void CBibleKeyChooser::verseChanged(int /*i*/){
+// qDebug("CBibleKeyChooser::verseChanged(int /*i*/)");
+ if (!isUpdatesEnabled())
+ return;
+
+ setUpdatesEnabled(false);
+
+ if (m_key->Verse() != w_verse->comboBox()->currentText().toInt()) {
+ m_key->Verse( w_verse->comboBox()->currentText().toInt() );
+ setKey( m_key );
+ }
+
+ setUpdatesEnabled(true);
+}
+
+/** Reimplementation */
+QSize CBibleKeyChooser::sizeHint(){
+ return QSize( w_book->sizeHint().width() + w_chapter->sizeHint().width() + w_verse->sizeHint().width(), w_book->sizeHint().height());
+}
+
+/** Reimplementation. */
+void CBibleKeyChooser::refreshContent() {
+ w_book->reset( m_info->books(), w_book->comboBox()->currentItem(), false);
+ setKey(m_key);
+}
+
+/** Sets te module and refreshes the combos */
+void CBibleKeyChooser::setModule(CSwordModuleInfo* module){
+ if (module != m_info && module) {
+ m_info = dynamic_cast<CSwordBibleModuleInfo*>(module);
+ refreshContent();
+ }
+}
+
+/** called when the book combo lost the focus with reason == tab @param the new book */
+void CBibleKeyChooser::bookFocusOut(int index){
+ if (!isUpdatesEnabled())
+ return;
+
+ setUpdatesEnabled(false);
+
+ m_key->book( w_book->comboBox()->currentText() );
+ const int chapterCount = m_info->chapterCount( m_info->bookNumber(m_key->book()));
+ w_chapter->reset( chapterCount, m_key->Chapter()-1, false);
+
+ const int verseCount = m_info->verseCount(m_info->bookNumber(m_key->book()),m_key->Chapter());
+ w_verse->reset(verseCount,m_key->Verse()-1,false);
+
+ setUpdatesEnabled(true);
+}
+
+/** called when the chapter combo lost the focus with reason == tab @param the new chapter */
+void CBibleKeyChooser::chapterFocusOut(int /*index*/){
+ const int chapter = w_chapter->comboBox()->currentText().toInt();
+ m_key->Chapter( chapter );
+ w_verse->reset(m_info->verseCount(m_info->bookNumber(m_key->book()),chapter), 0, false);
+}
+
+/** called when the verse combo lost the focus with reason == tab @param the new verse */
+void CBibleKeyChooser::verseFocusOut(int /*index*/){
+ m_key->Verse( w_verse->comboBox()->currentText().toInt() );
+ setKey( m_key );
+}
+
+/** No descriptions */
+void CBibleKeyChooser::updateKey(CSwordKey* key){
+}
diff --git a/bibletime/frontend/keychooser/cbiblekeychooser.h b/bibletime/frontend/keychooser/cbiblekeychooser.h
new file mode 100644
index 0000000..94215f5
--- /dev/null
+++ b/bibletime/frontend/keychooser/cbiblekeychooser.h
@@ -0,0 +1,130 @@
+/***************************************************************************
+ cbiblekeychooser.h - description
+ -------------------
+ begin : Wed Sep 20 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CBIBLEKEYCHOOSER_H
+#define CBIBLEKEYCHOOSER_H
+
+//#include <qnamespace.h>
+#include <qwidget.h>
+#include "ckeychooser.h"
+
+class CKeyChooserWidget;
+class CSwordVerseKey;
+
+class CSwordBibleModuleInfo;
+
+
+/** This class implements the KeyChooser for bibles and commentaries
+ *
+ * it inhertits @ref CKeyChooser
+ *
+ * it uses 3 @ref CKeyChooserWidget 's to represent the bible keys
+ *
+ * @author The BibleTime team
+ */
+
+class CBibleKeyChooser : public CKeyChooser {
+ Q_OBJECT
+
+public:
+ /**
+ * the constructor
+ * you should not need to use this, use @ref CKeyChooser::createInstance instead
+ */
+ CBibleKeyChooser(CSwordModuleInfo *module=0, CSwordKey *key=0, QWidget *parent=0, const char *name=0);
+
+public slots:
+ /**
+ * see @ref CKeyChooser::getKey
+ */
+ CSwordKey*const key();
+ /**
+ * see @ref CKeyChooser::setKey
+ */
+ virtual void setKey(CSwordKey *key);
+ /**
+ * Reimplementation
+ */
+ virtual QSize sizeHint();
+ /**
+ * Sets te module and refreshes the combos
+ */
+ virtual void setModule(CSwordModuleInfo* module);
+ /**
+ * Reimplementation.
+ */
+ void refreshContent();
+ /**
+ * used to react to changes in the 3 @ref CKeyChooserWidget 's
+ * @param index not used
+ */
+ void bookChanged(int index);
+ /**
+ * used to react to changes in the 3 @ref CKeyChooserWidget 's
+ * @param index not used
+ */
+ void chapterChanged(int index);
+ /**
+ * used to react to changes in the 3 @ref CKeyChooserWidget 's
+ * @param index not used
+ */
+ void verseChanged(int index);
+ /**
+ * see @ref bookPrevRequested
+ */
+ void chapterPrevRequested(void);
+ /**
+ * see @ref bookPrevRequested
+ */
+ void chapterNextRequested(void);
+ /**
+ * see @ref bookPrevRequested
+ */
+ void versePrevRequested(void);
+ /**
+ * see @ref bookPrevRequested
+ */
+ void verseNextRequested(void);
+ /** No descriptions */
+ void updateKey(CSwordKey* key);
+
+private:
+ CKeyChooserWidget* w_book;
+ CKeyChooserWidget* w_chapter;
+ CKeyChooserWidget* w_verse;
+ CSwordBibleModuleInfo *m_info;
+ CSwordVerseKey *m_key;
+
+private slots: // Private slots
+ /**
+ * called when the book combo lost the focus with reason == tab
+ * @param the new book
+ */
+ void bookFocusOut(int);
+ /**
+ * called when the chapter combo lost the focus with reason == tab
+ * @param the new chapter
+ */
+ void chapterFocusOut(int);
+ /** called when the verse combo lost the focus
+ with reason == tab
+ @param the new verse
+ */
+ void verseFocusOut(int);
+};
+
+#endif
diff --git a/bibletime/frontend/keychooser/cbookkeychooser.cpp b/bibletime/frontend/keychooser/cbookkeychooser.cpp
new file mode 100644
index 0000000..70909c5
--- /dev/null
+++ b/bibletime/frontend/keychooser/cbookkeychooser.cpp
@@ -0,0 +1,181 @@
+/***************************************************************************
+ cbookkeychooser.cpp - description
+ -------------------
+ begin : Sat Jan 26 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cbookkeychooser.h"
+#include "../../backend/cswordtreekey.h"
+#include "../../backend/cswordbookmoduleinfo.h"
+
+//Qt includes
+#include <qlayout.h>
+
+CBookKeyChooser::CBookKeyChooser(CSwordModuleInfo *module, CSwordKey *key, QWidget *parent, const char *name)
+ : CKeyChooser(module, key, parent,name), m_layout(0) {
+ if ( module && (module->type() == CSwordModuleInfo::GenericBook) ) {
+ m_module = dynamic_cast<CSwordBookModuleInfo*>(module);
+ m_key = dynamic_cast<CSwordTreeKey*>(key);
+ }
+ else {
+ m_module = 0;
+ m_key = 0;
+ }
+ setModule(m_module);
+}
+
+CBookKeyChooser::~CBookKeyChooser(){
+}
+
+void CBookKeyChooser::setKey(CSwordKey* newKey){
+ setKey(newKey, true);
+}
+
+/** Sets a new key to this keychooser */
+void CBookKeyChooser::setKey(CSwordKey* newKey, const bool emitSignal){
+ if (m_key != newKey )
+ m_key = dynamic_cast<CSwordTreeKey*>(newKey);
+
+ const QString oldKey = m_key->key();
+ QStringList siblings;
+ if (m_key && !oldKey.isEmpty())
+ siblings = QStringList::split("/",oldKey,false);
+
+ unsigned int depth = 0;
+ int index = 0;
+
+ m_key->root();
+ while(m_key->firstChild() && (depth <= siblings.count())) {
+ const QString key = m_key->key();
+ index = 0;
+ const QString sibling = siblings[depth];
+ if (!sibling.isEmpty()) { //found it
+ bool found = false;
+ do {
+ ++index;
+ found = (m_key->getLocalName() == sibling);
+ } while (!found && m_key->nextSibling());
+ if (!found)
+ m_key->key( key );
+ }
+ setupCombo(key, depth++, index);
+ }
+
+ //clear the combos which were not filled
+ for (; depth < (unsigned int)m_module->depth(); ++depth) {
+ CKeyChooserWidget* chooser = m_chooserWidgets.at(depth);
+ if (chooser)
+ chooser->reset(0,0,false);
+ }
+
+ if (oldKey.isEmpty())
+ m_key->root();
+ else
+ m_key->key(oldKey);
+
+ if (emitSignal)
+ emit keyChanged(m_key);
+}
+
+/** Returns the key of this kechooser. */
+CSwordKey* const CBookKeyChooser::key(){
+// ASSERT(m_key);
+ return m_key;
+}
+
+/** Sets another module to this keychooser */
+void CBookKeyChooser::setModule(CSwordModuleInfo* module){
+ m_module = dynamic_cast<CSwordBookModuleInfo*>(module);
+ //refresh the number of combos
+ if (m_module && m_key) {
+ if (!m_layout)
+ m_layout = new QHBoxLayout(this);
+
+ //delete old widgets
+ m_chooserWidgets.setAutoDelete(true);
+ m_chooserWidgets.clear();
+ m_chooserWidgets.setAutoDelete(false);
+
+ for (int i = 0; i < m_module->depth(); ++i) {
+ CKeyChooserWidget* w = new CKeyChooserWidget(0, false, this); //empty keychooser
+ m_chooserWidgets.append( w );
+ w->show();
+ connect(w, SIGNAL(changed(int)), SLOT(keyChooserChanged(int)));
+ m_layout->addWidget(w);
+ }
+ updateKey(m_key);
+ }
+}
+
+/** Refreshes the content. */
+void CBookKeyChooser::refreshContent(){
+ if (m_key)
+ updateKey( m_key ); //refresh with current key
+}
+
+void CBookKeyChooser::setupCombo(const QString key, const int depth, const int currentItem){
+ CKeyChooserWidget* chooserWidget = m_chooserWidgets.at(depth);
+ if (depth == 0 && chooserWidget && chooserWidget->comboBox()->count()) { //has already items
+ //set now the right item
+ CKeyChooserWidget* chooserWidget = m_chooserWidgets.at(depth);
+ ASSERT(chooserWidget);
+ if (chooserWidget) {
+ chooserWidget->setItem( chooserWidget->comboBox()->text(currentItem) );
+ }
+ return;
+ }
+
+ const QString oldKey = m_key->key();
+ m_key->key(key);
+
+ //insert an empty item at the top
+ QStringList items;
+ items << QString::null;
+ do {
+ items << QString::fromLocal8Bit(m_key->getLocalName());
+ }
+ while (m_key->nextSibling());
+
+ if (chooserWidget) {
+ chooserWidget->reset(items,currentItem,false);
+ }
+
+ //restore old key
+ m_key->key(oldKey);
+}
+
+/** A keychooser changed. Update and emit a signal if necessary. */
+void CBookKeyChooser::keyChooserChanged(int newIndex){
+ QStringList items;
+ CKeyChooserWidget* chooser;
+ const int count = m_chooserWidgets.count();
+ for (int i = 0; i < count; ++i) {
+ chooser = m_chooserWidgets.at(i);
+ const QString currentText = (chooser && chooser->comboBox()) ? chooser->comboBox()->currentText() : QString::null;
+ if (currentText.isEmpty())
+ break;
+ items << currentText;
+ }
+ QString newKey = QString::fromLatin1("/") + items.join("/");
+ if (newKey.length() > 1)
+ newKey.remove(newKey.length(),1); //remove the traling slash
+
+ m_key->key(newKey);
+ setKey(m_key);
+}
+
+/** Updates the keychoosers for the given key but emit no signal. */
+void CBookKeyChooser::updateKey(CSwordKey* key){
+ setKey(key, false);
+}
diff --git a/bibletime/frontend/keychooser/cbookkeychooser.h b/bibletime/frontend/keychooser/cbookkeychooser.h
new file mode 100644
index 0000000..dd2c69e
--- /dev/null
+++ b/bibletime/frontend/keychooser/cbookkeychooser.h
@@ -0,0 +1,101 @@
+/***************************************************************************
+ cbookkeychooser.h - description
+ -------------------
+ begin : Sat Jan 26 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CBOOKKEYCHOOSER_H
+#define CBOOKKEYCHOOSER_H
+
+//BibleTime includes
+#include "ckeychooser.h"
+#include "ckeychooserwidget.h"
+
+//Sword includes
+
+//Qt includes
+#include <qwidget.h>
+#include <qsize.h>
+#include <qmap.h>
+#include <qlist.h>
+#include <qstringlist.h>
+
+class CSwordKey;
+class CSwordBookModuleInfo;
+class CSwordTreeKey;
+
+class TreeKeyIdx;
+
+class QHBoxLayout;
+
+/** The keychooser implementation for books.
+ * @author The BibleTime team
+ */
+class CBookKeyChooser : public CKeyChooser {
+ Q_OBJECT
+public:
+ CBookKeyChooser(CSwordModuleInfo *module=0, CSwordKey *key=0, QWidget *parent=0, const char *name=0);
+ ~CBookKeyChooser();
+ /**
+ * Refreshes the content.
+ */
+ virtual void refreshContent();
+ /**
+ * Sets another module to this keychooser
+ */
+ virtual void setModule(CSwordModuleInfo*);
+ /**
+ * Returns the key of this kechooser.
+ */
+ virtual CSwordKey* const key();
+ /**
+ * Sets a new key to this keychooser
+ */
+ virtual void setKey(CSwordKey*);
+ /**
+ * Sets a new key to this keychooser
+ */
+ void setKey(CSwordKey*, const bool emitSignal);
+
+
+public slots: // Public slots
+ /**
+ * Updates the keychoosers for the given key but emit no signal.
+ */
+ void updateKey(CSwordKey*);
+
+protected: // Protected methods
+ /**
+ * Fills the combo given by depth with the items from the key having depth "depth".
+ * The parent sibling is given by key.
+ */
+ void setupCombo(const QString key, const int depth, const int currentItem);
+
+protected slots:
+ /**
+ * A keychooser changed. Update and emit a signal if necessary.
+ */
+ void keyChooserChanged(int);
+ //is called when a keychooser widget wants to jump to the next/previous key
+// void nextEntry();
+// void previousEntry();
+
+private:
+ QList<CKeyChooserWidget> m_chooserWidgets;
+ CSwordBookModuleInfo *m_module;
+ CSwordTreeKey *m_key;
+ QHBoxLayout* m_layout;
+};
+
+#endif
diff --git a/bibletime/frontend/keychooser/cbooktreechooser.cpp b/bibletime/frontend/keychooser/cbooktreechooser.cpp
new file mode 100644
index 0000000..97f8dc6
--- /dev/null
+++ b/bibletime/frontend/keychooser/cbooktreechooser.cpp
@@ -0,0 +1,183 @@
+/***************************************************************************
+ cbooktreechooser.cpp - description
+ -------------------
+ begin : Sat Jan 26 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cbooktreechooser.h"
+#include "../../backend/cswordtreekey.h"
+#include "../../backend/cswordbookmoduleinfo.h"
+
+//Qt includes
+#include <qlayout.h>
+#include <qheader.h>
+#include <qlistview.h>
+
+////////////
+
+CBookTreeChooser::TreeItem::TreeItem(QListViewItem* parent, QListViewItem* after, const QString caption, const QString key)
+ : KListViewItem(parent, after, caption) {
+ m_key = key;
+};
+
+CBookTreeChooser::TreeItem::TreeItem(QListViewItem* parent,const QString caption, const QString key)
+ : KListViewItem(parent, caption) {
+ m_key = key;
+};
+
+CBookTreeChooser::TreeItem::TreeItem(QListView* view, QListViewItem* after, const QString caption, const QString key)
+ : KListViewItem(view,after, caption) {
+ m_key = key;
+};
+
+const QString& CBookTreeChooser::TreeItem::key() const {
+ return m_key;
+};
+
+////////////
+
+CBookTreeChooser::CBookTreeChooser(CSwordModuleInfo *module, CSwordKey *key, QWidget *parent, const char *name)
+ : CKeyChooser(module, key, parent,name) {
+ if ( module && (module->type() == CSwordModuleInfo::GenericBook) ) {
+ m_module = dynamic_cast<CSwordBookModuleInfo*>(module);
+ m_key = dynamic_cast<CSwordTreeKey*>(key);
+ }
+ else {
+ m_module = 0;
+ m_key = 0;
+ }
+
+ //now setup the keychooser widgets
+ QHBoxLayout* layout = new QHBoxLayout(this);
+ m_treeView = new KListView(this);
+ layout->addWidget(m_treeView);
+
+ connect( m_treeView, SIGNAL(executed(QListViewItem*)), SLOT(itemClicked(QListViewItem*)));
+ m_treeView->addColumn("Tree");
+ m_treeView->header()->resizeSection( 0,m_treeView->sizeHint().width());
+ m_treeView->header()->setResizeEnabled(-1);
+ m_treeView->header()->hide();
+ m_treeView->setSorting(-1);
+ m_treeView->setRootIsDecorated(true);
+
+ setModule(module);
+}
+
+CBookTreeChooser::~CBookTreeChooser(){
+}
+
+/** Sets a new key to this keychooser */
+void CBookTreeChooser::setKey(CSwordKey* newKey){
+}
+
+/** Sets a new key to this keychooser */
+void CBookTreeChooser::setKey(CSwordKey* newKey, const bool emitSignal){
+ if (m_key != newKey )
+ m_key = dynamic_cast<CSwordTreeKey*>(newKey);
+
+ const QString key = m_key->key();
+
+ QStringList siblings;
+ if (m_key && !key.isEmpty())
+ siblings = QStringList::split("/",key,false);
+
+ //find the right listview item
+ const int count = siblings.count();
+ int index = 0;
+ QString currentSibling = siblings[index];
+
+ QListViewItem* child = m_treeView->firstChild();
+ while( child && index < count ) {
+// qWarning("trying to find %s", currentSibling.latin1() );
+
+ if (child->text(0) == currentSibling) { //found parent of our item
+ //found right entry?
+ TreeItem* i = dynamic_cast<TreeItem*>(child);
+ if (!i || i->key() == key) {
+// qWarning("found!");
+ break;
+ }
+ child = child->firstChild();
+ currentSibling = siblings[++index];
+ }
+ else
+ child = child->nextSibling();
+ }
+
+ m_treeView->setCurrentItem( child );
+ m_treeView->ensureItemVisible(child);
+ if (emitSignal)
+ emit keyChanged(m_key);
+}
+
+/** Returns the key of this kechooser. */
+CSwordKey* const CBookTreeChooser::key(){
+ return m_key;
+}
+
+/** Sets another module to this keychooser */
+void CBookTreeChooser::setModule(CSwordModuleInfo* module){
+ m_module = dynamic_cast<CSwordBookModuleInfo*>(module);
+
+ if (m_module && m_key) {
+ m_treeView->clear();
+
+ m_key->root();
+ m_key->firstChild();
+ setupTree(0,0,m_key);
+
+ updateKey(m_key);
+ }
+}
+
+/** Refreshes the content. */
+void CBookTreeChooser::refreshContent(){
+ if (m_key)
+ updateKey( m_key ); //refresh with current key
+}
+
+/** Set up the tree with the current level of key. */
+void CBookTreeChooser::setupTree( QListViewItem* parent, QListViewItem* after, CSwordTreeKey* key ){
+// ASSERT(key);
+ QListViewItem* item = 0;
+ if (parent)
+ item = new TreeItem(parent, after, key->getLocalName(), key->key());
+ else
+ item = new TreeItem(m_treeView, after, key->getLocalName(), key->key());
+
+ if (key->firstChild()) {
+ setupTree(item, 0, key);
+ key->parent();
+ }
+ if (key->nextSibling())
+ setupTree(parent, item, key);
+}
+
+/** No descriptions */
+void CBookTreeChooser::itemClicked( QListViewItem* item ){
+ TreeItem* i = dynamic_cast<TreeItem*>(item);
+ ASSERT(i);
+ if (!i)
+ return;
+
+ const QString key = i->key();
+ m_key->key(key);
+
+ emit keyChanged(m_key);
+}
+
+/** No descriptions */
+void CBookTreeChooser::updateKey( CSwordKey* key ){
+ setKey(key, false);
+}
diff --git a/bibletime/frontend/keychooser/cbooktreechooser.h b/bibletime/frontend/keychooser/cbooktreechooser.h
new file mode 100644
index 0000000..743253d
--- /dev/null
+++ b/bibletime/frontend/keychooser/cbooktreechooser.h
@@ -0,0 +1,101 @@
+/***************************************************************************
+ cbooktreechooser.h - description
+ -------------------
+ begin : Sat Jan 26 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CBOOKTREECHOOSER_H
+#define CBOOKTREECHOOSER_H
+
+
+/** The treechooser implementation for books.
+ * @author The BibleTime team
+ */
+//BibleTime includes
+#include "ckeychooser.h"
+#include "ckeychooserwidget.h"
+
+//Sword includes
+
+//Qt includes
+#include <qwidget.h>
+#include <qsize.h>
+#include <qmap.h>
+#include <qlist.h>
+#include <qstringlist.h>
+
+//KDE includes
+#include <klistview.h>
+
+class CSwordKey;
+class CSwordBookModuleInfo;
+class CSwordTreeKey;
+
+class TreeKeyIdx;
+
+/** The keychooser implementeation for books.
+ * @author The BibleTime team
+ */
+class CBookTreeChooser : public CKeyChooser {
+ Q_OBJECT
+public:
+ CBookTreeChooser(CSwordModuleInfo *module=0, CSwordKey *key=0, QWidget *parent=0, const char *name=0);
+ ~CBookTreeChooser();
+ /**
+ * Refreshes the content.
+ */
+ virtual void refreshContent();
+ /**
+ * Sets another module to this keychooser
+ */
+ virtual void setModule(CSwordModuleInfo*);
+ /**
+ * Returns the key of this kechooser.
+ */
+ virtual CSwordKey* const key();
+ /**
+ * Sets a new key to this keychooser
+ */
+ virtual void setKey(CSwordKey*);
+ void setKey(CSwordKey*, const bool emitSinal);
+
+private:
+ class TreeItem : public KListViewItem {
+ public:
+ TreeItem(QListViewItem* parent, QListViewItem* after, const QString caption, const QString key);
+ TreeItem(QListViewItem* parent, const QString caption, const QString key);
+ TreeItem(QListView* view,QListViewItem* after, const QString caption, const QString key);
+ const QString& key() const;
+ private:
+ QString m_key;
+ };
+
+ CSwordBookModuleInfo *m_module;
+ CSwordTreeKey *m_key;
+ KListView* m_treeView;
+
+protected: // Protected methods
+ /** Set up the tree with the current level of key. */
+ void setupTree( QListViewItem* parent,QListViewItem* after, CSwordTreeKey* key );
+
+protected slots: // Protected slots
+ /** No descriptions */
+ void itemClicked( QListViewItem* item );
+
+public slots: // Public slots
+ /** No descriptions */
+ virtual void updateKey( CSwordKey* );
+};
+
+#endif
diff --git a/bibletime/frontend/keychooser/cfx_btn.cpp b/bibletime/frontend/keychooser/cfx_btn.cpp
new file mode 100644
index 0000000..fdbfa5d
--- /dev/null
+++ b/bibletime/frontend/keychooser/cfx_btn.cpp
@@ -0,0 +1,99 @@
+/***************************************************************************
+ cfx_btn.cpp - description
+ -------------------
+ begin : Tue Sep 19 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cfx_btn.h"
+#include "../cbtconfig.h"
+
+#include <stdlib.h>
+#include <math.h>
+
+//Qt includes
+#include <qevent.h>
+#include <qapplication.h>
+#include <qcursor.h>
+
+cfx_btn::cfx_btn(QWidget *parent, const char *name ) : QToolButton(parent,name) {
+ setFocusPolicy(QWidget::WheelFocus);
+ setCursor( splitVCursor );
+
+ m_isLocked = false;
+ connect(this, SIGNAL(pressed() ), SLOT(was_pressed() ));
+ connect(this, SIGNAL(released()), SLOT(was_released()));
+}
+
+const bool cfx_btn::isLocked( ) const {
+ return m_isLocked;
+}
+
+void cfx_btn::was_pressed( ){
+ QApplication::setOverrideCursor( BlankCursor );
+ m_isLocked = true;
+ lock_Point = get_lock_Point();
+
+ emit lock();
+}
+
+void cfx_btn::was_released( ){
+ QApplication::restoreOverrideCursor();
+ m_isLocked = false;
+
+ emit unlock();
+}
+
+const QPoint cfx_btn::get_lock_Point() const {
+ return mapToGlobal( QPoint( width()/2, height()/2 ) );
+}
+
+void cfx_btn::mouseMoveEvent( QMouseEvent* e ){
+ const short signed int scrollDirection = CBTConfig::get(CBTConfig::scroll) ? -1 : 1;
+
+ if (m_isLocked) {
+ int vchange = (QCursor::pos().y() - lock_Point.y()) * scrollDirection;
+ if (abs(vchange) < 10)
+ vchange = (int)((vchange>0 ? -1 : 1) * pow(abs(vchange), 0.3));
+ else if (abs(vchange) < 30)
+ vchange = (int)((vchange>0 ? -1 : 1) * pow(abs(vchange), 0.6));
+ else if (abs(vchange) < 40)
+ vchange = (int)((vchange>0 ? -1 : 1) * pow(abs(vchange), 1.2));
+ else
+ vchange = (int)((vchange>0 ? -1 : 1) * pow(abs(vchange), 2.0));
+
+ if (vchange) //not emit 0
+ emit change_requested( vchange );
+ QCursor::setPos( lock_Point );
+ }
+ else
+ QToolButton::mouseMoveEvent(e);
+}
+
+
+
+/** If the wheel of the mouse is used while the mouse stays over our scrollbutton the content is scrolled like the mouse was pressed and moved. */
+void cfx_btn::wheelEvent( QWheelEvent* e ){
+ /**
+ * The problem is, that wheel events do everytime have the delta value 120
+ */
+ const short signed int scrollDirection = CBTConfig::get(CBTConfig::scroll) ? -1 : 1;
+
+ const int vchange = scrollDirection * ((e->delta() > 0) ? (1) : (-1));
+ if (vchange!=0) {//do not emit a change with value 0
+ emit change_requested( vchange );
+ e->accept();
+ }
+ else
+ e->ignore();
+}
diff --git a/bibletime/frontend/keychooser/cfx_btn.h b/bibletime/frontend/keychooser/cfx_btn.h
new file mode 100644
index 0000000..7f40002
--- /dev/null
+++ b/bibletime/frontend/keychooser/cfx_btn.h
@@ -0,0 +1,91 @@
+/***************************************************************************
+ cfx_btn.h - description
+ -------------------
+ begin : Tue Sep 19 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CFX_BTN_H
+#define CFX_BTN_H
+
+#include <qwidget.h>
+#include <qtoolbutton.h>
+
+class QMouseEvent;
+
+/** This Class implements the direct chooser button used in the KeyChooser Widget
+ * @author The BibleTime team
+ */
+class cfx_btn : public QToolButton {
+ Q_OBJECT
+public:
+ /**
+ * The constructor
+ */
+ cfx_btn(QWidget *parent=0, const char *name=0);
+ const bool isLocked() const;
+
+signals:
+ /**
+ * is emitted when the button enters locked state
+ */
+ void lock();
+ /**
+ * is emitted when the button leaves locked state
+ */
+ void unlock();
+ /**
+ * indicates a change the user made by moving the mouse
+ * @param count the number of items to be changed in the KeyChooser ComboBox
+ */
+ void change_requested(int count);
+
+protected slots:
+ /*
+ * used to process the button press events
+ */
+ void was_pressed();
+ /**
+ * used to process the button release events
+ */
+ void was_released();
+
+protected:
+ /**
+ * Reimplementation from @ref QWidget#mouseMoveEvent - processes
+ * the mouse move events
+ */
+ virtual void mouseMoveEvent( QMouseEvent* e );
+ /**
+ * used to find the lock point - the middle of the button
+ * @return the lock point
+ */
+ const QPoint get_lock_Point() const;
+ /**
+ * If the wheel of the mouse is used while the mouse stays over our scrollbutton the content is
+ * scrolled like the mouse was pressed and moved.
+ */
+ virtual void wheelEvent( QWheelEvent* e );
+
+private:
+ /**
+ * Indicates whether the button is in locked state or not
+ */
+ bool m_isLocked;
+ /**
+ * stores the lock point
+ */
+ QPoint lock_Point;
+};
+
+#endif
diff --git a/bibletime/frontend/keychooser/ckeychooser.cpp b/bibletime/frontend/keychooser/ckeychooser.cpp
new file mode 100644
index 0000000..b0af52f
--- /dev/null
+++ b/bibletime/frontend/keychooser/ckeychooser.cpp
@@ -0,0 +1,48 @@
+/***************************************************************************
+ ckeychooser.cpp - description
+ -------------------
+ begin : Wed Sep 20 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "ckeychooser.h"
+#include "../../backend/cswordmoduleinfo.h"
+#include "../../backend/cswordbiblemoduleinfo.h"
+#include "../../backend/cswordcommentarymoduleinfo.h"
+#include "../../backend/cswordlexiconmoduleinfo.h"
+
+#include "clexiconkeychooser.h"
+#include "cbiblekeychooser.h"
+#include "cbookkeychooser.h"
+
+CKeyChooser::CKeyChooser(CSwordModuleInfo *, CSwordKey *, QWidget *parent, const char *name )
+ : QWidget(parent, name){
+}
+
+CKeyChooser* CKeyChooser::createInstance(CSwordModuleInfo *module, CSwordKey *key, QWidget *parent){
+// ASSERT(module);
+// ASSERT(key);
+ if (!module)
+ return 0;
+ switch ( module->type() ){
+ case CSwordModuleInfo::Commentary: //Bibles and commentaries uise the same key chooser
+ case CSwordModuleInfo::Bible:
+ return new CBibleKeyChooser(module,key,parent);
+ case CSwordModuleInfo::Lexicon:
+ return new CLexiconKeyChooser(module,key,parent);
+ case CSwordModuleInfo::GenericBook:
+ return new CBookKeyChooser(module,key,parent);
+ default:
+ return 0;
+ }
+}
diff --git a/bibletime/frontend/keychooser/ckeychooser.h b/bibletime/frontend/keychooser/ckeychooser.h
new file mode 100644
index 0000000..90bb145
--- /dev/null
+++ b/bibletime/frontend/keychooser/ckeychooser.h
@@ -0,0 +1,93 @@
+/***************************************************************************
+ ckeychooser.h - description
+ -------------------
+ begin : Wed Sep 20 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CKEYCHOOSER_H
+#define CKEYCHOOSER_H
+
+#include <qwidget.h>
+
+class CSwordModuleInfo;
+class CSwordKey;
+
+/**
+ * The base class for the KeyChooser.
+ * Do not use directly, create a KeyChooser with
+ * @ref #createInstance , this will create the proper one
+ * of the classes that inherit from @ref CKeyChooser
+ *
+ * @author The BibleTime team
+ */
+
+class CKeyChooser : public QWidget {
+ Q_OBJECT
+
+public:
+ /**
+ * Creates a proper Instance, either
+ *
+ @ref CLexiconKeyChooser or
+ * @ref CBibleKeyChooser
+ * @param info the @ref CModuleInfo to be represented by the KeyChooser
+ * @param key if not NULL, the @ref CKey the KeyChooser should be set to
+ * @param parent the parent of the widget to create
+ */
+ static CKeyChooser* createInstance(CSwordModuleInfo *info, CSwordKey *key, QWidget *parent);
+
+signals:
+ /**
+ * is emitted if the @ref CKey was changed by the user
+ */
+ void keyChanged(CSwordKey* key);
+ /**
+ * Is emitted before the key is changed!
+ */
+ void beforeKeyChange(const QString& key);
+
+public slots:
+ /**
+ * sets the @ref CKey
+ * @param key the key which the widget should be set to
+ */
+ virtual void setKey(CSwordKey* key) = 0;
+ /**
+ * sets the @ref CKey
+ * @param key the key which the widget should be set to
+ */
+ virtual void updateKey(CSwordKey* key) = 0;
+ /**
+ * gets the current @ref CKey
+ *
+ * @return the current @ref CKey
+ */
+ virtual CSwordKey*const key() = 0;
+ /**
+ * Sets the module of this keychooser and refreshes the comboboxes
+ */
+ virtual void setModule( CSwordModuleInfo* ) = 0;
+ /**
+ * Freshes the content of the different key chooser parts.
+ */
+ virtual void refreshContent() = 0;
+
+protected:
+ /**
+ * the constructor - DO NOT USE! -- use @ref #createInstance instead!
+ */
+ CKeyChooser(CSwordModuleInfo *info=0, CSwordKey *key=0, QWidget *parent=0, const char *name=0);
+};
+
+#endif
diff --git a/bibletime/frontend/keychooser/ckeychooserwidget.cpp b/bibletime/frontend/keychooser/ckeychooserwidget.cpp
new file mode 100644
index 0000000..9a97e16
--- /dev/null
+++ b/bibletime/frontend/keychooser/ckeychooserwidget.cpp
@@ -0,0 +1,458 @@
+/***************************************************************************
+ ckeychooserwidget.cpp - description
+ -------------------
+ begin : Tue Sep 19 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+//BibleTime includes
+#include "ckeychooserwidget.h"
+#include "cfx_btn.h"
+#include "../cbtconfig.h"
+
+//Qt includes
+#include <qlineedit.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qlistbox.h>
+#include <qtoolbutton.h>
+#include <qevent.h>
+#include <qlayout.h>
+#include <qpainter.h>
+#include <qstyle.h>
+#include <qpixmap.h>
+#include <qapplication.h>
+#include <qwhatsthis.h>
+#include <qtooltip.h>
+
+CKCComboBox::CKCComboBox(bool rw,QWidget* parent,const char* name)
+ : QComboBox(rw,parent,name){
+ setFocusPolicy(QWidget::WheelFocus);
+ if (lineEdit()) {
+ installEventFilter( lineEdit() );
+ }
+}
+
+/** Reimplementation. */
+bool CKCComboBox::eventFilter( QObject *o, QEvent *e ){
+// qWarning("CKCComboBox::eventFilter( QObject *o, QEvent *e )");
+ if (e->type() == QEvent::FocusOut) {
+ QFocusEvent* f = static_cast<QFocusEvent*>(e);
+// qWarning("FocusOut: %d", f->reason());
+// qWarning("Mouse: %d",(f->reason()==QFocusEvent::Mouse)?1:0);
+// qWarning("lineedit: %d",(o == lineEdit())?1:0);
+// qWarning("listbox: %d",(o == listBox())?1:0);
+// qWarning("this: %d",(o == this)?1:0);
+
+
+ if (o == lineEdit() && f->reason() == QFocusEvent::Tab) {
+ int index = listBox()->index( listBox()->findItem(currentText()) );
+ if (index == -1)
+ index = 0;// return 0 if not found
+ setCurrentItem( index );
+ emit focusOut( index );
+ }
+ else if (/*o == lineEdit() &&*/ f->reason() == QFocusEvent::Popup) {
+ return false;
+ }
+ else if (/*o == lineEdit() && */f->reason() == QFocusEvent::ActiveWindow) {
+ emit activated(currentText());
+ return true;
+ }
+ else if (/*o == lineEdit() &&*/ f->reason() == QFocusEvent::Mouse) {
+ emit activated(currentText());
+ return true;
+ }
+ else if (o == listBox()) { //???
+ return false;
+ }
+ else if (o == this) {
+ emit activated(currentText());
+ return true;
+ }
+ }
+// qWarning("not handled!");
+ return QComboBox::eventFilter(o,e);
+}
+
+/** Scrolls in the list if the wheel of the mouse was used. */
+void CKCComboBox::wheelEvent( QWheelEvent* e ) {
+ const signed int change = (int)((float)e->delta()/(float)120);
+ int current = currentItem();
+
+ if ((current+change >= 0) && (current+change<count()) ) {
+ setCurrentItem(current+change);
+ e->accept();
+ emit activated( currentItem() );
+ }
+ else {
+ e->ignore();
+ }
+}
+
+///** Returns the size this widget would like to have. */
+QSize CKCComboBox::sizeHint() const {
+ // IMHO Qt has a bug: The sizehint is not updated if the list is refreshed with other items
+ const QSize oldSize = QComboBox::sizeHint();
+ QRect contentsRect = style().comboButtonRect(0,0, oldSize.width(), oldSize.height());
+ const int buttonWidth = (oldSize.width() - contentsRect.width());
+
+ if (listBox()) {
+ return QSize( listBox()->sizeHint().width()+buttonWidth, QComboBox::sizeHint().height());
+ }
+ else {
+ return QSize( QComboBox::sizeHint().width()+buttonWidth, QComboBox::sizeHint().height());
+ }
+}
+
+
+//**********************************************************************************/
+
+CKeyChooserWidget::CKeyChooserWidget(int count, const bool useNextPrevSignals, QWidget *parent, const char *name) : QWidget(parent,name) {
+ m_useNextPrevSignals = useNextPrevSignals;
+ for (int index=1; index <= count; index++)
+ m_list.append( QString::number(index) );
+ init();
+ reset(m_list,0,false);
+};
+
+CKeyChooserWidget::CKeyChooserWidget(QStringList *list, const bool useNextPrevSignals, QWidget *parent, const char *name ) : QWidget(parent,name) {
+ m_useNextPrevSignals = useNextPrevSignals;
+ if (list)
+ m_list = *list;//copy the items of list
+ else
+ m_list.clear();
+ init();
+ reset(m_list,0,false);
+}
+
+void CKeyChooserWidget::changeCombo(int i){
+ if (!isUpdatesEnabled())
+ return;
+ setUpdatesEnabled(false);
+
+ int current = comboBox()->currentItem();
+
+ //index of highest Item
+ const int count = comboBox()->count()-1;
+ int j = current + i;
+ if (i > 0){
+ if (j <= count)
+ comboBox()->setCurrentItem(j);
+ else
+ comboBox()->setCurrentItem(count);
+ }
+ else if (i < 0){
+ if (j>=0)
+ comboBox()->setCurrentItem(j);
+ else
+ comboBox()->setCurrentItem(0);
+ }
+ if (!isResetting && !btn_fx->isLocked() && (current != comboBox()->currentItem()))
+ emit changed(comboBox()->currentItem());
+
+ setUpdatesEnabled(true);
+}
+
+void CKeyChooserWidget::reset(const int count, int index, bool do_emit){
+// qWarning("CKeyChooserWidget::reset(const int count, int index, bool do_emit)");
+ if (!isUpdatesEnabled())
+ return;
+
+ m_list.clear();
+ for (int i=1; i <= count; i++)
+ m_list.append( QString::number(i) );
+ reset(&m_list,index,do_emit);
+}
+
+void CKeyChooserWidget::reset(QStringList& list, int index, bool do_emit){
+ if (!isUpdatesEnabled())
+ return;
+
+ m_list = list;
+ reset(&m_list,index,do_emit);
+
+ isResetting = false;
+}
+
+
+void CKeyChooserWidget::reset(QStringList *list, int index, bool do_emit){
+ if (isResetting || !isUpdatesEnabled())
+ return;
+ isResetting = true;
+ setUpdatesEnabled(false);
+ m_comboBox->setUpdatesEnabled(false);
+
+ m_mainLayout->setResizeMode(QLayout::FreeResize);
+
+ oldKey = QString::null;
+ m_comboBox->clear();
+ if (list)
+ m_comboBox->insertStringList(*list);
+ m_comboBox->resize( m_comboBox->sizeHint() );
+ m_comboBox->setUpdatesEnabled(true);
+
+ m_mainLayout->setResizeMode(QLayout::Minimum);
+
+ m_comboBox->setCurrentItem(index);
+ if (!list || (list && !list->count())) { //nothing in the combobox
+ btn_up->setEnabled( true );
+ btn_fx->setEnabled( true );
+ btn_down->setEnabled( true );
+ setEnabled(false);
+ }
+ else if (!isEnabled()) { //was disabled
+ setEnabled(true);
+ const bool enableButtons = list && (list->count()>=1);
+ btn_up->setEnabled( enableButtons );
+ btn_fx->setEnabled( enableButtons );
+ btn_down->setEnabled( list && (list->count()>1) );
+ }
+ setUpdatesEnabled(true);
+
+ if (do_emit) {
+ emit changed(m_comboBox->currentItem());
+ }
+ isResetting = false;
+}
+
+void CKeyChooserWidget::lock(void){
+ comboBox()->setEditable(false);
+ oldKey = comboBox()->currentText();
+}
+
+void CKeyChooserWidget::unlock(void){
+ comboBox()->setEditable(true);
+ comboBox()->setEditText(comboBox()->text(comboBox()->currentItem()));
+ if (comboBox()->currentText() != oldKey);
+ emit changed(comboBox()->currentItem());
+}
+
+/** Initializes this widget. We need this function because we have more than one constructor. */
+void CKeyChooserWidget::init( ){
+ oldKey = QString::null;
+ btn_up = btn_down = btn_fx = 0;
+
+ setFocusPolicy(QWidget::StrongFocus);
+ m_mainLayout = new QHBoxLayout( this );
+
+ m_comboBox = new CKCComboBox( true, this );
+ m_comboBox->setAutoCompletion( true );
+ m_comboBox->setInsertionPolicy(QComboBox::NoInsertion);
+ m_comboBox->setFocusPolicy(QWidget::WheelFocus);
+
+ m_mainLayout->setResizeMode(QLayout::Minimum);
+ m_mainLayout->addWidget( m_comboBox );
+
+ QVBoxLayout *m_buttonLayout = new QVBoxLayout();
+ m_buttonLayout->setAlignment(Qt::AlignHCenter | Qt::AlignCenter);
+
+ btn_up = new QToolButton( this, "btn_up" );
+ QIconSet iconSet = getUpIconSet();
+ btn_up->setIconSet( iconSet );
+ btn_up->setFixedSize(iconSet.pixmap().width(), iconSet.pixmap().height());
+ btn_up->setFocusPolicy(QWidget::NoFocus);
+
+ btn_fx = new cfx_btn( this, "btn_fx" );
+ iconSet = getMoverIconSet();
+ btn_fx->setIconSet( iconSet );
+ btn_fx->setFixedSize(iconSet.pixmap().width(), iconSet.pixmap().height());
+ btn_fx->setFocusPolicy(QWidget::NoFocus);
+
+ btn_down = new QToolButton( this, "btn_down" );
+ iconSet = getDownIconSet();
+ btn_down->setIconSet( iconSet );
+ btn_down->setFixedSize(iconSet.pixmap().width(), iconSet.pixmap().height());
+ btn_down->setFocusPolicy(QWidget::NoFocus);
+
+ m_buttonLayout->addWidget( btn_up );
+ m_buttonLayout->addWidget( btn_fx );
+ m_buttonLayout->addWidget( btn_down );
+
+ m_mainLayout->addLayout( m_buttonLayout );
+ m_mainLayout->addSpacing(2);
+
+ setTabOrder(m_comboBox, 0);
+
+// signals and slots connections
+ if ( CBTConfig::get(CBTConfig::scroll) ) {
+ if (m_useNextPrevSignals) {
+ connect(btn_up, SIGNAL(clicked()), SIGNAL(prev_requested()) );
+ connect(btn_down, SIGNAL(clicked()), SIGNAL(next_requested()) );
+ }
+ else {
+ connect(btn_up, SIGNAL(clicked()), SLOT(previous()) );
+ connect(btn_down, SIGNAL(clicked()), SLOT(next()) );
+ }
+ }
+ else {
+ if (m_useNextPrevSignals) {
+ connect(btn_up, SIGNAL(clicked()), SIGNAL(next_requested()) );
+ connect(btn_down, SIGNAL(clicked()), SIGNAL(prev_requested()) );
+ }
+ else {
+ connect(btn_up, SIGNAL(clicked()), SLOT(next()) );
+ connect(btn_down, SIGNAL(clicked()), SLOT(previous()) );
+ }
+ }
+
+ connect(btn_fx, SIGNAL(lock()), SLOT(lock()) );
+ connect(btn_fx, SIGNAL(unlock()), SLOT(unlock()) );
+ connect(btn_fx, SIGNAL(change_requested(int)), SLOT(changeCombo(int)) );
+
+ connect(m_comboBox, SIGNAL(activated(int)), SLOT(slotComboChanged(int)));
+ connect(m_comboBox, SIGNAL(activated(const QString&)), SLOT(slotReturnPressed(const QString&)));
+ connect(m_comboBox, SIGNAL(focusOut(int)), SIGNAL(focusOut(int)));
+
+ isResetting = false;
+}
+
+/** Is called when the return key was presed in the combobox. */
+void CKeyChooserWidget::slotReturnPressed( const QString& text){
+ for (int index=0; index < comboBox()->count(); index++) {
+ if (comboBox()->text(index) == text) {
+ if (/*!oldKey.isNull() &&*/ text != oldKey) //if the key has changed
+ emit changed(index);
+ break;
+ }
+ }
+}
+
+/** Is called when the current item of the combo box was changed. */
+void CKeyChooserWidget::slotComboChanged(int index){
+// qWarning("CKeyChooserWidget::slotComboChanged(int index)");
+ if (!isUpdatesEnabled())
+ return;
+ setUpdatesEnabled(false);
+
+ const QString key = comboBox()->text( index );
+ if (oldKey.isNull() || (oldKey != key))
+ emit changed(index);
+ oldKey = key;
+
+ setUpdatesEnabled(true);
+}
+
+#define WIDTH 17
+#define ARROW_HEIGHT 10
+#define MOVER_HEIGHT 6
+
+/** Returns the icons set which contains the down button. */
+QIconSet CKeyChooserWidget::getUpIconSet(){
+ QPixmap pix(WIDTH,ARROW_HEIGHT);
+ QPainter p(&pix);
+ p.fillRect(0,0, WIDTH-1, ARROW_HEIGHT-1, colorGroup().background());
+ style().drawArrow(&p, Qt::UpArrow, false, 1,1, WIDTH-2, ARROW_HEIGHT-2, btn_up ? btn_up->colorGroup() : colorGroup(), btn_up ? btn_up->isEnabled() : true);
+
+ return QIconSet(pix);
+}
+
+/** Returns the icons set which contains the down button. */
+QIconSet CKeyChooserWidget::getDownIconSet(){
+ QPixmap pix(WIDTH,ARROW_HEIGHT);
+ QPainter p(&pix);
+ p.fillRect(0,0, WIDTH-1, ARROW_HEIGHT-1, colorGroup().background());
+ style().drawArrow(&p, Qt::DownArrow, false, 1,1, WIDTH-2, ARROW_HEIGHT-2, btn_down ? btn_down->colorGroup() : colorGroup(), btn_down ? btn_down->isEnabled() : true);
+
+ return QIconSet(pix);
+}
+
+/** Returns the icons set for the button used to change the current item. */
+QIconSet CKeyChooserWidget::getMoverIconSet(){
+ QPixmap pix(WIDTH,MOVER_HEIGHT);
+ QPainter p(&pix);
+ p.fillRect(0,0, WIDTH-1, MOVER_HEIGHT-1, colorGroup().background());
+ p.fillRect(2,2, WIDTH-3, MOVER_HEIGHT-3, colorGroup().foreground());
+ return QIconSet(pix);
+}
+#undef WIDTH
+#undef ARROW_HEIGHT
+#undef MOVER_HEIGHT
+
+/** */
+void CKeyChooserWidget::adjustSize( ){
+ setUpdatesEnabled(false);
+ QSize s = sizeHint();
+ if (s.width() > maximumWidth())
+ s.setWidth( maximumWidth() );
+
+ resize(s);
+ setUpdatesEnabled(true);
+}
+
+/** Sets the tooltips for the given entries using the parameters as text. */
+void CKeyChooserWidget::setToolTips( const QString comboTip, const QString nextEntryTip, const QString scrollButtonTip, const QString previousEntryTip){
+ QToolTip::add(comboBox(),comboTip);
+ QToolTip::add(btn_fx, scrollButtonTip);
+
+ if ( CBTConfig::get(CBTConfig::scroll) ){
+ QToolTip::add(btn_down, nextEntryTip);
+ QToolTip::add(btn_up, previousEntryTip);
+ }
+ else {
+ QToolTip::add(btn_up, nextEntryTip);
+ QToolTip::add(btn_down, previousEntryTip);
+ }
+}
+
+/** No descriptions */
+void CKeyChooserWidget::setWhatsThis(const QString comboTip, const QString nextEntryTip, const QString scrollButtonTip, const QString previousEntryTip){
+ QWhatsThis::add(comboBox(),comboTip);
+ QWhatsThis::add(btn_fx, scrollButtonTip);
+
+ if ( CBTConfig::get(CBTConfig::scroll) ) {
+ QWhatsThis::add(btn_down, nextEntryTip);
+ QWhatsThis::add(btn_up, previousEntryTip);
+ }
+ else {
+ QWhatsThis::add(btn_up, nextEntryTip);
+ QWhatsThis::add(btn_down, previousEntryTip);
+ }
+}
+
+/** Sets the current item to the one with the given text */
+bool CKeyChooserWidget::setItem( const QString item ){
+ qDebug("CKeyChooserWidget::setItem( const QString item )");
+ bool ret = false;
+ const int count = comboBox()->count();
+ for (int i = 0; i < count; ++i) {
+ if (comboBox()->text(i) == item) {
+ comboBox()->setCurrentItem(i);
+ ret = true;
+ break;
+ }
+ }
+ if (!ret)
+ comboBox()->setCurrentItem(-1);
+ return ret;
+}
+
+/** Jump to the next entry. */
+void CKeyChooserWidget::next(){
+ if (comboBox()->currentItem() != comboBox()->count()-1) {// not last entry
+ comboBox()->setCurrentItem( comboBox()->currentItem()+1 );
+ emit changed(comboBox()->currentItem());
+ }
+}
+
+/** Jump to the previous entry. */
+void CKeyChooserWidget::previous(){
+ if (comboBox()->currentItem() != 0) {// not last entry
+ comboBox()->setCurrentItem( comboBox()->currentItem()-1 );
+ emit changed(comboBox()->currentItem());
+ }
+}
+
+QComboBox* CKeyChooserWidget::comboBox(){
+ return m_comboBox;
+}
+
diff --git a/bibletime/frontend/keychooser/ckeychooserwidget.h b/bibletime/frontend/keychooser/ckeychooserwidget.h
new file mode 100644
index 0000000..6df9dab
--- /dev/null
+++ b/bibletime/frontend/keychooser/ckeychooserwidget.h
@@ -0,0 +1,229 @@
+/***************************************************************************
+ ckeychooserwidget.h - description
+ -------------------
+ begin : Tue Sep 19 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CKEYCHOOSERWIDGET_H
+#define CKEYCHOOSERWIDGET_H
+
+#include <qwidget.h>
+#include <qmap.h>
+
+#include <qcombobox.h>
+
+class cfx_btn;
+class CLexiconKeyChooser;
+//class CMinMaxLayout;
+
+class QIconSet;
+//class QComboBox;
+class QToolButton;
+class QStringList;
+class QPoint;
+class QMouseEvent;
+class QWheelEvent;
+class QHBoxLayout;
+
+/*
+* We use this class to conrtol the focus move in the combobox
+* This class is used in the key chooser widgets
+*/
+class CKCComboBox : public QComboBox {
+ Q_OBJECT
+
+public:
+ CKCComboBox(bool rw, QWidget * parent=0, const char * name=0 );
+ /**
+ * Returns the size this widget would like to have.
+ */
+ virtual QSize sizeHint() const;
+
+protected:
+ /**
+ * Reimplementation.
+ */
+ virtual bool eventFilter( QObject *o, QEvent *e );
+ /**
+ * Scrolls in the list if the wheel of the mouse was used.
+ */
+ virtual void wheelEvent( QWheelEvent* e);
+
+signals:
+ /**
+ * Emitted when the user moves the focus away from the combo by pressing tab
+ */
+ void focusOut(int itemIndex);
+};
+
+/**
+ * This class implements the KeyCooser Widget, which
+ * consists of a @ref QComboBox, two normal ref @QToolButton
+ * and a enhanced @ref cfx_btn
+ *
+ * @author The BibleTime team
+ */
+class CKeyChooserWidget : public QWidget {
+ Q_OBJECT
+public:
+ /**
+ * the constructor
+ */
+ CKeyChooserWidget(QStringList *list=0, const bool useNextPrevSignals = false, QWidget *parent=0, const char *name=0);
+ /**
+ * the constructor
+ */
+ CKeyChooserWidget(int count=0, const bool useNextPrevSignals = false, QWidget *parent=0, const char *name=0);
+ /**
+ * This function does clear the combobox, then fill in
+ * the StringList, set the ComboBox' current item to index
+ * and if do_emit is true, it will emit @ref #changed
+ *
+ * @param list the stringlist to be inserted
+ * @param index the index that the combobox is to jump to
+ * @param do_emit should we emit @ref #changed(int)
+ */
+ void reset(const int count, int index, bool do_emit);
+ void reset(QStringList& list, int index, bool do_emit);
+ void reset(QStringList *list, int index, bool do_emit);
+ /**
+ * Initializes this widget. We need this function because
+ * we have more than one constructor.
+ */
+ virtual void init();
+ /**
+ *
+ */
+ virtual void adjustSize();
+ /**
+ * Sets the QWhatsThis help for the different parts.
+ */
+ void setWhatsThis(const QString comboTip, const QString nextEntry, const QString scrollButton, const QString previousEntry);
+ /**
+ * Sets the tooltips for the given entries using the parameters as text.
+ */
+ void setToolTips( const QString comboTip, const QString nextEntry, const QString scrollButton, const QString previousEntry);
+ /**
+ * Sets the current item to the one with the given text
+ */
+ bool setItem( const QString item);
+ /**
+ * Return the combobox of this key chooser widget.
+ */
+ QComboBox* comboBox();
+
+public slots:
+ /**
+ * is called to lock the combobox
+ */
+ void lock();
+ /**
+ * is called to unlock the combobox
+ */
+ void unlock();
+ /**
+ * is called to move the combobox to a certain index
+ * @param index the index to jump to
+ */
+ void changeCombo(int index);
+
+signals:
+ /**
+ * is emittd to proceed to the next entry, which may
+ * require changes in other widgets also
+ */
+ void next_requested(void);
+ /**
+ * see @ref #next_requested
+ */
+ void prev_requested(void);
+ /**
+ * Is emitted if the widget changed, but
+ * only if it is not locked or being reset
+ *
+ * @param the current ComboBox index
+ */
+ void changed(int index);
+ /**
+ * Is emitted if the widget was left with a focus out event.
+ * @param index The new index of the ComboBox
+ */
+ void focusOut(int index);
+
+protected:
+ /**
+ * indicates wheter we are resetting at the moment
+ */
+ bool isResetting;
+ /**
+ * Returns the icons set which contains the UP button.
+ */
+ QIconSet getUpIconSet();
+ /**
+ * Returns the icons set which contains the button used to change the current item.
+ */
+ QIconSet getMoverIconSet();
+ /**
+ * Returns the icons set which contains the down button.
+ */
+ QIconSet getDownIconSet();
+ /**
+ *
+ */
+ QString oldKey;
+ /**
+ *
+ */
+ QToolButton* btn_up;
+ /**
+ *
+ */
+ QToolButton* btn_down;
+ /**
+ *
+ */
+ cfx_btn* btn_fx;
+
+protected slots: // Protected slots
+ /**
+ * Is called when the return key was presed in the combobox.
+ */
+ void slotReturnPressed( const QString& );
+ /**
+ * Is called when the current item of the combo box was changed.
+ */
+ void slotComboChanged(int);
+
+private:
+ friend class CLexiconKeyChooser;
+ QStringList m_list;
+ bool m_useNextPrevSignals;
+ /**
+ * Members should never be public!!
+ */
+ CKCComboBox* m_comboBox;
+ QHBoxLayout *m_mainLayout;
+
+private slots: // Private slots
+ /**
+ * Jump to the previous entry.
+ */
+ void previous();
+ /**
+ * Jump to the next entry.
+ */
+ void next();
+};
+
+#endif
diff --git a/bibletime/frontend/keychooser/clexiconkeychooser.cpp b/bibletime/frontend/keychooser/clexiconkeychooser.cpp
new file mode 100644
index 0000000..61d3d64
--- /dev/null
+++ b/bibletime/frontend/keychooser/clexiconkeychooser.cpp
@@ -0,0 +1,101 @@
+/***************************************************************************
+ clexiconkeychooser.cpp - description
+ -------------------
+ begin : Wed Sep 20 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "clexiconkeychooser.h"
+#include "ckeychooserwidget.h"
+#include "cfx_btn.h"
+#include "../../tooltipdef.h"
+#include "../../whatsthisdef.h"
+#include "../../backend/cswordlexiconmoduleinfo.h"
+#include "../cbtconfig.h"
+
+//Qt includes
+#include <qcombobox.h>
+#include <qlayout.h>
+#include <qlistbox.h>
+
+//KDE includes
+#include <klocale.h>
+
+CLexiconKeyChooser::CLexiconKeyChooser(CSwordModuleInfo *info, CSwordKey *key, QWidget *parent, const char *name )
+ : CKeyChooser(info, key, parent, name), m_key(0){
+
+ m_module = dynamic_cast<CSwordLexiconModuleInfo*>(info);
+
+ //we use a layout because the key chooser should be resized to full size
+ m_layout = new QHBoxLayout(this,QBoxLayout::LeftToRight);
+
+ m_widget = new CKeyChooserWidget(m_module->entries(), false, this);
+ m_widget->comboBox()->setMaximumWidth(300);
+
+// if (info && info->isUnicode()){
+#warning implement reaction to font change in the optionsdialog here
+// /*m_widget->comboBox()->*/setFont( CBTConfig::get(CBTConfig::unicode) );
+// }
+
+ m_widget->setToolTips(TT_PRESENTER_ENTRY_COMBO,TT_PRESENTER_NEXT_ENTRY, TT_PRESENTER_SCROLL_BUTTON, TT_PRESENTER_PREVIOUS_ENTRY);
+ m_widget->setWhatsThis(WT_PRESENTER_ENTRY_COMBO,WT_PRESENTER_NEXT_ENTRY, WT_PRESENTER_SCROLL_BUTTON, WT_PRESENTER_PREVIOUS_ENTRY);
+
+ m_layout->addWidget(m_widget,0,Qt::AlignLeft);
+
+ connect(m_widget,SIGNAL(changed(int)),SLOT(activated(int)));
+ connect(m_widget,SIGNAL(focusOut(int)),SLOT(activated(int)));
+
+// setKey(key);
+}
+
+CSwordKey* const CLexiconKeyChooser::key(){
+ return m_key;
+}
+
+void CLexiconKeyChooser::setKey(CSwordKey* key){
+ if (!(m_key = dynamic_cast<CSwordLDKey*>(key)))
+ return;
+ m_widget->comboBox()->setCurrentItem(
+ m_widget->comboBox()->listBox()->index(
+ m_widget->comboBox()->listBox()->findItem( m_key->key() )));
+// m_widget->adjustSize();
+ emit keyChanged( m_key );
+}
+
+void CLexiconKeyChooser::activated(int index){
+ const QString text = m_widget->comboBox()->text(index);
+ /*to prevent from eternal loop, because activated()is emitted again*/
+ if (m_key->key() != text) {
+ m_key->key(text);
+ setKey(m_key);
+ }
+}
+
+/** Reimplementation. */
+void CLexiconKeyChooser::refreshContent(){
+// m_layout->invalidate();
+ m_widget->reset(m_module->entries(), 0, true);
+// updateGeometry();
+}
+
+/** Sets the module and refreshes the combo boxes */
+void CLexiconKeyChooser::setModule( CSwordModuleInfo* module) {
+ if (module && module != m_module && module->type() == CSwordLexiconModuleInfo::Lexicon) {
+ m_module = dynamic_cast<CSwordLexiconModuleInfo*>(module);
+ refreshContent();
+ }
+}
+
+/** No descriptions */
+void CLexiconKeyChooser::updateKey(CSwordKey* key){
+}
diff --git a/bibletime/frontend/keychooser/clexiconkeychooser.h b/bibletime/frontend/keychooser/clexiconkeychooser.h
new file mode 100644
index 0000000..38ac22d
--- /dev/null
+++ b/bibletime/frontend/keychooser/clexiconkeychooser.h
@@ -0,0 +1,88 @@
+/***************************************************************************
+ clexiconkeychooser.h - description
+ -------------------
+ begin : Wed Sep 20 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CLEXICONKEYCHOOSER_H
+#define CLEXICONKEYCHOOSER_H
+
+#include <qwidget.h>
+#include "ckeychooser.h"
+#include "../../backend/cswordldkey.h"
+#include "../../backend/cswordmoduleinfo.h"
+#include "../../backend/cswordlexiconmoduleinfo.h"
+
+class CKeyChooserWidget;
+class QHBoxLayout;
+
+/**
+ * This class implements the KeyChooser for lexicons
+ *
+ * it inhertits @ref CKeyChooser
+ * it uses 1 @ref CKeyChooserWidget to represent the lexicon keys
+ *
+ * @author The BibleTime team
+ */
+class CLexiconKeyChooser : public CKeyChooser {
+ Q_OBJECT
+public:
+ /**
+ * The constructor
+ *
+ * you should not need to use this, use @ref CKeyChooser::createInstance instead
+ */
+ CLexiconKeyChooser(CSwordModuleInfo *module=0, CSwordKey *key=0, QWidget *parent=0, const char *name=0);
+
+public slots:
+ /**
+ * see @ref CKeyChooser::getKey
+ * @return Return the key object we use.
+ */
+ virtual CSwordKey*const key();
+ /**
+ * see @ref CKeyChooser::setKey
+ */
+ virtual void setKey(CSwordKey* key);
+ /**
+ * used to react to changes in the @ref CKeyChooserWidget
+ *
+ * @param index not used
+ **/
+ virtual void activated(int index);
+ /**
+ * Reimplementatuion.
+ */
+ virtual void refreshContent();
+ /**
+ * Sets the module and refreshes the combo boxes of this keychooser.
+ */
+ virtual void setModule( CSwordModuleInfo* module );
+
+protected:
+ class CLexiconPresenter;
+ friend class CLexiconPresenter;
+ /**
+ * to represent the lexicon key
+ */
+ CKeyChooserWidget *m_widget;
+ CSwordLDKey* m_key;
+ CSwordLexiconModuleInfo *m_module;
+ QHBoxLayout *m_layout;
+public slots: // Public slots
+ /** No descriptions */
+ virtual void updateKey(CSwordKey* key);
+};
+
+#endif
diff --git a/bibletime/frontend/kstartuplogo.cpp b/bibletime/frontend/kstartuplogo.cpp
new file mode 100644
index 0000000..36bd867
--- /dev/null
+++ b/bibletime/frontend/kstartuplogo.cpp
@@ -0,0 +1,95 @@
+/***************************************************************************
+ kstartuplogo.cpp - description
+ -------------------
+ begin : Sat Sep 11 1999
+ copyright : (C) 1999 by Torsten Uhlmann
+ email : TUhlmann@gmx.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//Own includes
+#include "kstartuplogo.h"
+
+//Qt includes
+#include <qapp.h>
+#include <qlabel.h>
+#include <qlayout.h>
+
+//KDE includes
+#include <kapp.h>
+#include <kstddirs.h>
+#include <kimageio.h>
+
+//static objects
+static KStartupLogo* startupLogo = 0;
+
+void KStartupLogo::createSplash() {
+ deleteSplash();
+ startupLogo = new KStartupLogo();
+}
+
+void KStartupLogo::showSplash() {
+ if (startupLogo)
+ startupLogo->show();
+}
+
+void KStartupLogo::hideSplash() {
+ if (startupLogo)
+ startupLogo->hide();
+}
+
+void KStartupLogo::deleteSplash() {
+ delete startupLogo;
+ startupLogo = 0;
+}
+
+
+void KStartupLogo::setStatusMessage(const QString& message) {
+ if (startupLogo)
+ startupLogo->setText(message);
+}
+
+
+
+KStartupLogo::KStartupLogo()
+ : QWidget(0, "startuplogo", WStyle_Customize | WStyle_NoBorder) {
+
+ QPixmap pm;
+ if ( !pm.load(locate("BT_pic","startuplogo.png")) )
+ qWarning("Can't load startuplogo! Check your installation.");
+
+ setBackgroundPixmap(pm);
+
+ //Please not change the margin
+ textLabel = new QLabel(this);
+ textLabel->setGeometry(0,pm.height(),pm.width(),textLabel->sizeHint().height());
+ textLabel->setBackgroundColor( Qt::black );
+
+ QPalette p = palette();
+ p.setColor( QPalette::Inactive, QColorGroup::Text, Qt::white );
+ p.setColor( QPalette::Inactive, QColorGroup::Foreground, Qt::white );
+ p.setColor( QPalette::Normal, QColorGroup::Text, Qt::white );
+ p.setColor( QPalette::Normal, QColorGroup::Foreground, Qt::white );
+ setPalette( p );
+
+ setGeometry (
+ (KApplication::desktop()->width()-pm.width())/2,
+ (KApplication::desktop()->height()-pm.height()-textLabel->height())/2,
+ pm.width(),
+ pm.height()+textLabel->height());
+}
+
+void KStartupLogo::setText(const QString text){
+ //Please not make the text bold & let the first character be blank
+ textLabel->setText( QString::fromLatin1(" %1").arg(text) );
+ KApplication::kApplication()->processEvents();
+}
+
diff --git a/bibletime/frontend/kstartuplogo.h b/bibletime/frontend/kstartuplogo.h
new file mode 100644
index 0000000..e456b11
--- /dev/null
+++ b/bibletime/frontend/kstartuplogo.h
@@ -0,0 +1,51 @@
+/***************************************************************************
+ kstartuplogo.h - description
+ -------------------
+ begin : Sat Sep 11 1999
+ copyright : (C) 1999 by Torsten Uhlmann
+ email : TUhlmann@gmx.de
+ ***************************************************************************
+ ***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+
+#ifndef KSTARTUPLOGO_H
+#define KSTARTUPLOGO_H
+
+#include <qwidget.h>
+
+//forward declarations
+class QLabel;
+
+
+/**
+ * This class provides a startuplogo.
+ * @author The team of KDevelop
+ */
+class KStartupLogo : public QWidget {
+public:
+ static void createSplash();
+ static void showSplash();
+ static void hideSplash();
+ static void deleteSplash();
+ static void setStatusMessage(const QString& message);
+
+private:
+ KStartupLogo();
+ void setText(const QString text);
+ QLabel* textLabel;
+};
+
+#endif
+
+
+
+
+
+
diff --git a/bibletime/frontend/presenters/Makefile.am b/bibletime/frontend/presenters/Makefile.am
new file mode 100644
index 0000000..d8a1dec
--- /dev/null
+++ b/bibletime/frontend/presenters/Makefile.am
@@ -0,0 +1,28 @@
+INCLUDES = $(all_includes)
+
+libpresenters_a_METASOURCES = AUTO
+
+noinst_LIBRARIES = libpresenters.a
+
+libpresenters_a_SOURCES = \
+cbiblepresenter.cpp \
+clexiconpresenter.cpp \
+ccommentarypresenter.cpp \
+cbookpresenter.cpp \
+cswordpresenter.cpp \
+cmodulechooserbar.cpp \
+cmodulechooserbutton.cpp \
+cdisplaysettingsbutton.cpp
+
+all_headers=ccommentarypresenter.h \
+clexiconpresenter.h \
+cbiblepresenter.h \
+cmodulechooserbar.h \
+cmodulechooserbutton.h \
+cbookpresenter.h \
+cswordpresenter.h \
+cdisplaysettingsbutton.h
+
+
+EXTRA_DIST = $(libpresenters_a_SOURCES) $(all_headers)
+
diff --git a/bibletime/frontend/presenters/Makefile.in b/bibletime/frontend/presenters/Makefile.in
new file mode 100644
index 0000000..6547d5a
--- /dev/null
+++ b/bibletime/frontend/presenters/Makefile.in
@@ -0,0 +1,652 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+INCLUDES = $(all_includes)
+
+#>- libpresenters_a_METASOURCES = AUTO
+
+noinst_LIBRARIES = libpresenters.a
+
+libpresenters_a_SOURCES = cbiblepresenter.cpp clexiconpresenter.cpp ccommentarypresenter.cpp cbookpresenter.cpp cswordpresenter.cpp cmodulechooserbar.cpp cmodulechooserbutton.cpp cdisplaysettingsbutton.cpp
+
+
+all_headers = ccommentarypresenter.h clexiconpresenter.h cbiblepresenter.h cmodulechooserbar.h cmodulechooserbutton.h cbookpresenter.h cswordpresenter.h cdisplaysettingsbutton.h
+
+
+EXTRA_DIST = $(libpresenters_a_SOURCES) $(all_headers)
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../../config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I../../..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libpresenters_a_LIBADD =
+#>- libpresenters_a_OBJECTS = cbiblepresenter.$(OBJEXT) \
+#>- clexiconpresenter.$(OBJEXT) ccommentarypresenter.$(OBJEXT) \
+#>- cbookpresenter.$(OBJEXT) cswordpresenter.$(OBJEXT) \
+#>- cmodulechooserbar.$(OBJEXT) cmodulechooserbutton.$(OBJEXT) \
+#>- cdisplaysettingsbutton.$(OBJEXT)
+#>+ 10
+libpresenters_a_final_OBJECTS = libpresenters_a.all_cpp.o
+libpresenters_a_nofinal_OBJECTS = cbiblepresenter.$(OBJEXT) \
+clexiconpresenter.$(OBJEXT) ccommentarypresenter.$(OBJEXT) \
+cbookpresenter.$(OBJEXT) cswordpresenter.$(OBJEXT) \
+cmodulechooserbar.$(OBJEXT) cmodulechooserbutton.$(OBJEXT) \
+cdisplaysettingsbutton.$(OBJEXT)\
+cbookpresenter.moc.o cmodulechooserbar.moc.o ccommentarypresenter.moc.o cdisplaysettingsbutton.moc.o cmodulechooserbutton.moc.o cbiblepresenter.moc.o cswordpresenter.moc.o clexiconpresenter.moc.o \
+libpresenters_a_meta_unload.o
+@KDE_USE_FINAL_FALSE@libpresenters_a_OBJECTS = $(libpresenters_a_nofinal_OBJECTS)
+@KDE_USE_FINAL_TRUE@libpresenters_a_OBJECTS = $(libpresenters_a_final_OBJECTS)
+AR = ar
+CXXFLAGS = @CXXFLAGS@
+#>- CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+CXXLD = $(CXX)
+#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
+#>+ 1
+CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+#>- DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+#>+ 4
+KDE_DIST=cmodulechooserbutton.h cmodulechooserbar.h cbookpresenter.h ccommentarypresenter.h cswordpresenter.h cbiblepresenter.h cdisplaysettingsbutton.h clexiconpresenter.h
+
+DISTFILES= $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
+
+
+TAR = tar
+GZIP_ENV = --best
+#>- DEP_FILES = .deps/cbiblepresenter.P .deps/cbookpresenter.P \
+#>- .deps/ccommentarypresenter.P .deps/cdisplaysettingsbutton.P \
+#>- .deps/clexiconpresenter.P .deps/cmodulechooserbar.P \
+#>- .deps/cmodulechooserbutton.P .deps/cswordpresenter.P
+#>+ 10
+@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/cbookpresenter.moc.P $(DEPDIR)/cmodulechooserbar.moc.P $(DEPDIR)/ccommentarypresenter.moc.P $(DEPDIR)/cdisplaysettingsbutton.moc.P $(DEPDIR)/cmodulechooserbutton.moc.P $(DEPDIR)/cbiblepresenter.moc.P $(DEPDIR)/cswordpresenter.moc.P $(DEPDIR)/clexiconpresenter.moc.P $(DEPDIR)/libpresenters_a_meta_unload.P $(DEPDIR)/libpresenters_a.all_cpp.P \
+ .deps/cbiblepresenter.P .deps/cbookpresenter.P \
+.deps/ccommentarypresenter.P .deps/cdisplaysettingsbutton.P \
+.deps/clexiconpresenter.P .deps/cmodulechooserbar.P \
+.deps/cmodulechooserbutton.P .deps/cswordpresenter.P
+@KDE_USE_FINAL_FALSE@DEP_FILES = $(DEPDIR)/cbookpresenter.moc.P $(DEPDIR)/cmodulechooserbar.moc.P $(DEPDIR)/ccommentarypresenter.moc.P $(DEPDIR)/cdisplaysettingsbutton.moc.P $(DEPDIR)/cmodulechooserbutton.moc.P $(DEPDIR)/cbiblepresenter.moc.P $(DEPDIR)/cswordpresenter.moc.P $(DEPDIR)/clexiconpresenter.moc.P $(DEPDIR)/libpresenters_a_meta_unload.P .deps/cbiblepresenter.P .deps/cbookpresenter.P \
+.deps/ccommentarypresenter.P .deps/cdisplaysettingsbutton.P \
+.deps/clexiconpresenter.P .deps/cmodulechooserbar.P \
+.deps/cmodulechooserbutton.P .deps/cswordpresenter.P
+
+SOURCES = $(libpresenters_a_SOURCES)
+OBJECTS = $(libpresenters_a_OBJECTS)
+
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .cpp .lo .o .obj .s
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/presenters/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/presenters/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/frontend/presenters/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.s.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libpresenters.a: $(libpresenters_a_OBJECTS) $(libpresenters_a_DEPENDENCIES)
+ -rm -f libpresenters.a
+ $(AR) cru libpresenters.a $(libpresenters_a_OBJECTS) $(libpresenters_a_LIBADD)
+ $(RANLIB) libpresenters.a
+.cpp.o:
+ $(CXXCOMPILE) -c $<
+.cpp.obj:
+ $(CXXCOMPILE) -c `cygpath -w $<`
+.cpp.lo:
+ $(LTCXXCOMPILE) -c $<
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/frontend/presenters
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/frontend/presenters/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+ -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+ @echo '$(COMPILE) -c $<'; \
+ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.c
+ @echo '$(LTCOMPILE) -c $<'; \
+ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+
+%.o: %.cpp
+ @echo '$(CXXCOMPILE) -c $<'; \
+ $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.cpp
+ @echo '$(LTCXXCOMPILE) -c $<'; \
+ $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
+ mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+#>- clean-am: clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+#>- clean-depend clean-generic mostlyclean-am
+#>+ 2
+clean-am: clean-metasources clean-moc-classes clean-final clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+ clean-depend clean-generic mostlyclean-am
+
+#>- clean: clean-am
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+distclean-am: distclean-noinstLIBRARIES distclean-compile \
+ distclean-libtool distclean-tags distclean-depend \
+ distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-tags maintainer-clean-depend \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 3
+cbookpresenter.moc.cpp: $(srcdir)/cbookpresenter.h
+ $(MOC) $(srcdir)/cbookpresenter.h -o cbookpresenter.moc.cpp
+
+#>+ 3
+cmodulechooserbar.moc.cpp: $(srcdir)/cmodulechooserbar.h
+ $(MOC) $(srcdir)/cmodulechooserbar.h -o cmodulechooserbar.moc.cpp
+
+#>+ 3
+ccommentarypresenter.moc.cpp: $(srcdir)/ccommentarypresenter.h
+ $(MOC) $(srcdir)/ccommentarypresenter.h -o ccommentarypresenter.moc.cpp
+
+#>+ 3
+cdisplaysettingsbutton.moc.cpp: $(srcdir)/cdisplaysettingsbutton.h
+ $(MOC) $(srcdir)/cdisplaysettingsbutton.h -o cdisplaysettingsbutton.moc.cpp
+
+#>+ 3
+cmodulechooserbutton.moc.cpp: $(srcdir)/cmodulechooserbutton.h
+ $(MOC) $(srcdir)/cmodulechooserbutton.h -o cmodulechooserbutton.moc.cpp
+
+#>+ 3
+cbiblepresenter.moc.cpp: $(srcdir)/cbiblepresenter.h
+ $(MOC) $(srcdir)/cbiblepresenter.h -o cbiblepresenter.moc.cpp
+
+#>+ 3
+cswordpresenter.moc.cpp: $(srcdir)/cswordpresenter.h
+ $(MOC) $(srcdir)/cswordpresenter.h -o cswordpresenter.moc.cpp
+
+#>+ 3
+clexiconpresenter.moc.cpp: $(srcdir)/clexiconpresenter.h
+ $(MOC) $(srcdir)/clexiconpresenter.h -o clexiconpresenter.moc.cpp
+
+#>+ 3
+clean-metasources:
+ -rm -f cbookpresenter.moc.cpp cmodulechooserbar.moc.cpp ccommentarypresenter.moc.cpp cdisplaysettingsbutton.moc.cpp cmodulechooserbutton.moc.cpp cbiblepresenter.moc.cpp cswordpresenter.moc.cpp clexiconpresenter.moc.cpp
+
+#>+ 2
+docs-am:
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/presenters/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/frontend/presenters/Makefile.in
+
+
+#>+ 10
+libpresenters_a_meta_unload.cpp: ccommentarypresenter.moc.cpp cmodulechooserbar.moc.cpp cmodulechooserbutton.moc.cpp cswordpresenter.moc.cpp cbookpresenter.moc.cpp cdisplaysettingsbutton.moc.cpp cbiblepresenter.moc.cpp clexiconpresenter.moc.cpp
+ @echo 'creating libpresenters_a_meta_unload.cpp'
+ @-rm -f libpresenters_a_meta_unload.cpp
+ @echo 'static const char * _metalist_libpresenters_a[] = {' > libpresenters_a_meta_unload.cpp
+ @cat ccommentarypresenter.moc.cpp cmodulechooserbar.moc.cpp cmodulechooserbutton.moc.cpp cswordpresenter.moc.cpp cbookpresenter.moc.cpp cdisplaysettingsbutton.moc.cpp cbiblepresenter.moc.cpp clexiconpresenter.moc.cpp | grep 'char.*className' | sed -e 's/.*[^A-Za-z0-9_:]\([A-Za-z0-9_:]*\)::className.*$$/\"\1\",/' | sort | uniq >> libpresenters_a_meta_unload.cpp
+ @echo '0};' >> libpresenters_a_meta_unload.cpp
+ @echo '#include <kunload.h>' >> libpresenters_a_meta_unload.cpp
+ @echo '_UNLOAD(libpresenters_a)' >> libpresenters_a_meta_unload.cpp
+
+
+#>+ 3
+clean-moc-classes:
+ -rm -f libpresenters_a_meta_unload.cpp
+
+#>+ 11
+libpresenters_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/cbiblepresenter.cpp $(srcdir)/clexiconpresenter.cpp $(srcdir)/ccommentarypresenter.cpp $(srcdir)/cbookpresenter.cpp $(srcdir)/cswordpresenter.cpp $(srcdir)/cmodulechooserbar.cpp $(srcdir)/cmodulechooserbutton.cpp $(srcdir)/cdisplaysettingsbutton.cpp libpresenters_a_meta_unload.cpp cbookpresenter.moc.cpp cmodulechooserbar.moc.cpp ccommentarypresenter.moc.cpp cdisplaysettingsbutton.moc.cpp cmodulechooserbutton.moc.cpp cbiblepresenter.moc.cpp cswordpresenter.moc.cpp clexiconpresenter.moc.cpp
+ @echo 'creating libpresenters_a.all_cpp.cpp ...'; \
+ rm -f libpresenters_a.all_cpp.files libpresenters_a.all_cpp.final; \
+ echo "#define KDE_USE_FINAL 1" >> libpresenters_a.all_cpp.final; \
+ for file in cbiblepresenter.cpp clexiconpresenter.cpp ccommentarypresenter.cpp cbookpresenter.cpp cswordpresenter.cpp cmodulechooserbar.cpp cmodulechooserbutton.cpp cdisplaysettingsbutton.cpp libpresenters_a_meta_unload.cpp cbookpresenter.moc.cpp cmodulechooserbar.moc.cpp ccommentarypresenter.moc.cpp cdisplaysettingsbutton.moc.cpp cmodulechooserbutton.moc.cpp cbiblepresenter.moc.cpp cswordpresenter.moc.cpp clexiconpresenter.moc.cpp; do \
+ echo "#include \"$$file\"" >> libpresenters_a.all_cpp.files; \
+ test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libpresenters_a.all_cpp.final; \
+ done; \
+ cat libpresenters_a.all_cpp.final libpresenters_a.all_cpp.files > libpresenters_a.all_cpp.cpp; \
+ rm -f libpresenters_a.all_cpp.final libpresenters_a.all_cpp.files
+
+#>+ 3
+clean-final:
+ -rm -f libpresenters_a.all_cpp.cpp
+
+#>+ 2
+final:
+ $(MAKE) libpresenters_a_OBJECTS="$(libpresenters_a_final_OBJECTS)" all-am
+#>+ 2
+no-final:
+ $(MAKE) libpresenters_a_OBJECTS="$(libpresenters_a_nofinal_OBJECTS)" all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/frontend/presenters/cbiblepresenter.cpp b/bibletime/frontend/presenters/cbiblepresenter.cpp
new file mode 100644
index 0000000..07c36f8
--- /dev/null
+++ b/bibletime/frontend/presenters/cbiblepresenter.cpp
@@ -0,0 +1,431 @@
+/***************************************************************************
+ cbiblepresenter.cpp - description
+ -------------------
+ begin : Sun Mar 18 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cbiblepresenter.h"
+#include "cmodulechooserbar.h"
+#include "cdisplaysettingsbutton.h"
+
+#include "../ctoolclass.h"
+#include "../cexportmanager.h"
+#include "../chtmlwidget.h"
+#include "../keychooser/ckeychooser.h"
+#include "../../resource.h"
+#include "../../backend/cswordbiblemoduleinfo.h"
+#include "../../backend/cswordversekey.h"
+#include "../../backend/chtmlchapterdisplay.h"
+#include "../../backend/cswordbackend.h"
+#include "../../backend/creferencemanager.h"
+#include "../cprofile.h"
+#include "../cprofilewindow.h"
+
+#include <math.h>
+
+//Qt includes
+#include <qclipboard.h>
+#include <qlist.h>
+
+//KDE includes
+#include <kapp.h>
+#include <ktoolbar.h>
+#include <klocale.h>
+#include <kfiledialog.h>
+#include <kaccel.h>
+
+CBiblePresenter::CBiblePresenter(ListCSwordModuleInfo useModules, QWidget *parent, const char *name )
+ : CSwordPresenter(useModules,parent,name)
+{
+ m_key = new CSwordVerseKey(m_moduleList.first());
+ CSwordBibleModuleInfo* bible = dynamic_cast<CSwordBibleModuleInfo*>(m_moduleList.first());
+ if (bible) {
+ if (bible->hasTestament(CSwordBibleModuleInfo::OldTestament))
+ m_key->key("Genesis 1:1");
+ else
+ m_key->key("Matthew 1:1");
+ }
+
+ initView();
+ show();
+ initConnections();
+
+ setInitialized();
+}
+
+CBiblePresenter::~CBiblePresenter(){
+ delete m_key;
+}
+
+/** Initializes the view (central widget, toolbars etc) of this presenter */
+void CBiblePresenter::initView(){
+// qWarning("CBiblePresenter::initView");
+ m_mainToolBar = new KToolBar(this);
+ m_keyChooser = CKeyChooser::createInstance(m_moduleList.first(), m_key, m_mainToolBar);
+ m_mainToolBar->insertWidget(0,m_keyChooser->sizeHint().width(),m_keyChooser);
+ m_mainToolBar->setItemAutoSized(0);
+
+ m_displaySettingsButton = new CDisplaySettingsButton( &m_displayOptions, &m_moduleOptions, m_moduleList, m_mainToolBar);
+ m_mainToolBar->insertWidget(1,m_displaySettingsButton->sizeHint().width(),m_displaySettingsButton);
+
+ addToolBar(m_mainToolBar);
+
+ m_moduleChooserBar = new CModuleChooserBar(m_moduleList, CSwordModuleInfo::Bible, this );
+ addToolBar(m_moduleChooserBar);
+
+ m_htmlWidget = new CHTMLWidget(true, this);
+
+ //setup popup menu
+ m_popup = new KPopupMenu(this);
+ m_popup->insertTitle(i18n("Bible window"));
+
+ m_copyPopup = new KPopupMenu(m_popup);
+ m_copyPopup->insertItem(i18n("Verse"), this, SLOT(copyVerse()),0,ID_PRESENTER_COPY_ONLY_KEY);
+ m_copyPopup->insertItem(i18n("Text of verse"), this, SLOT(copyVerseText()),0,ID_PRESENTER_COPY_KEY_TEXT);
+ m_copyPopup->insertItem(i18n("Verse with text"), this, SLOT(copyVerseAndText()),0,ID_PRESENTER_COPY_KEY);
+ m_copyPopup->insertItem(i18n("Chapter"), m_htmlWidget, SLOT(copyDocument()),0,ID_PRESENTER_COPY_CHAPTER);
+ m_copyPopup->insertSeparator();
+ m_copyPopup->insertItem(i18n("Selected text"), m_htmlWidget, SLOT(copy()),0,ID_PRESENTER_COPY_SELECTED);
+
+ m_printPopup = new KPopupMenu(m_popup);
+ m_printPopup->insertItem(i18n("Verse with text"), this, SLOT(printVerseAndText()),0,ID_PRESENTER_PRINT_KEY);
+ m_printPopup->insertItem(i18n("Chapter"), this, SLOT(printChapter()),0,ID_PRESENTER_PRINT_CHAPTER);
+
+ m_savePopup = new KPopupMenu(m_popup);
+ m_savePopup->insertItem(i18n("Verse with text"), this, SLOT(saveVerseAndText()),0,ID_PRESENTER_SAVE_KEY);
+ m_savePopup->insertItem(i18n("Chapter as plain text"), m_htmlWidget, SLOT(slotSaveAsText()),0,ID_PRESENTER_SAVE_CHAPTER);
+ m_savePopup->insertItem(i18n("Chapter as HTML"), m_htmlWidget, SLOT(slotSaveAsHTML()),0,ID_PRESENTER_SAVE_CHAPTER_HTML);
+
+ m_popup->insertItem(i18n("Select all"), m_htmlWidget, SLOT(slotSelectAll()),0, ID_PRESENTER_SELECT_ALL);
+ m_popup->insertItem(i18n("Lookup selected text in lexicon"), m_lexiconPopup, ID_PRESENTER_LOOKUP);
+ m_popup->insertSeparator();
+ m_popup->insertItem(SmallIcon(ICON_EDIT_COPY),i18n("Copy..."), m_copyPopup, ID_PRESENTER_COPY_POPUP);
+ m_popup->insertItem(SmallIcon(ICON_FILE_PRINT), i18n("Add to printing queue..."), m_printPopup, ID_PRESENTER_PRINT_POPUP);
+ m_popup->insertItem(SmallIcon(ICON_FILE_SAVE), i18n("Save..."), m_savePopup,ID_PRESENTER_SAVE_POPUP);
+
+ m_htmlWidget->installPopup(m_popup);
+ m_htmlWidget->installAnchorMenu( m_popup );
+ m_htmlWidget->setModules(m_moduleList);
+
+ setCentralWidget(m_htmlWidget);
+ setIcon( BIBLE_ICON_SMALL );
+}
+
+/** Displays the chapter using the aparameter. */
+void CBiblePresenter::lookup(CSwordKey* key){
+// qWarning("CBiblePresenter::lookup(CSwordKey* key)");
+ setUpdatesEnabled(false);
+
+ CSwordVerseKey* vKey = dynamic_cast<CSwordVerseKey*>(key);
+ if (!vKey)
+ return;
+
+ backend()->setFilterOptions( m_moduleOptions );
+ backend()->setDisplayOptions( m_displayOptions );
+
+ if (m_moduleList.first()->getDisplay()) { //do we have a display object?
+ m_moduleList.first()->module()->SetKey(*vKey);
+ if (m_moduleList.count()>1)
+ m_moduleList.first()->getDisplay()->Display( &m_moduleList );
+ else
+ m_moduleList.first()->getDisplay()->Display( m_moduleList.first() );
+ m_htmlWidget->setText( m_moduleList.first()->getDisplay()->getHTML() );
+ }
+ if (m_key != vKey)
+ m_key->key(vKey->key());
+
+ m_htmlWidget->scrollToAnchor( QString::number(vKey->Verse()) );
+ setUpdatesEnabled(true);
+ setCaption(windowCaption());
+}
+
+/** This slot is called when the modules selected in the module chooserbar have changed. */
+void CBiblePresenter::modulesChanged(){
+ m_moduleList = m_moduleChooserBar->getModuleList();
+ if (!m_moduleList.count()) {
+ close();
+ }
+ else {
+ m_displaySettingsButton->reset(m_moduleList);
+// refreshFeatures()
+ m_key->module(m_moduleList.first());
+ m_keyChooser->setModule(m_moduleList.first());
+ m_htmlWidget->setModules(m_moduleList);
+
+ lookup(m_key);
+ }
+}
+/** */
+void CBiblePresenter::optionsChanged(){
+ lookup(m_key);
+}
+
+
+/** Initializes the Signal / Slot connections */
+void CBiblePresenter::initConnections(){
+ connect(m_htmlWidget, SIGNAL(referenceClicked(const QString&, const QString&)),
+ this, SLOT(lookup(const QString&, const QString&)));
+ connect(m_htmlWidget, SIGNAL(referenceDropped(const QString&)),
+ this, SLOT(referenceDropped(const QString&)));
+
+ connect(m_keyChooser, SIGNAL(keyChanged(CSwordKey*)),
+ this, SLOT(lookup(CSwordKey*)));
+ connect(m_popup, SIGNAL(aboutToShow()),
+ SLOT(popupAboutToShow()));
+ connect(m_moduleChooserBar, SIGNAL( sigChanged() ),
+ SLOT(modulesChanged() ));
+ connect(m_displaySettingsButton, SIGNAL( sigChanged() ),
+ SLOT(optionsChanged() ));
+}
+
+/** No descriptions */
+void CBiblePresenter::popupAboutToShow() {
+ m_popup->setItemEnabled(ID_PRESENTER_LOOKUP, !m_htmlWidget->selectedText().isEmpty());
+
+ m_copyPopup->setItemEnabled(ID_PRESENTER_COPY_ONLY_KEY,!m_htmlWidget->getCurrentAnchor().isEmpty());
+ m_copyPopup->setItemEnabled(ID_PRESENTER_COPY_KEY_TEXT,!m_htmlWidget->getCurrentAnchor().isEmpty());
+ m_copyPopup->setItemEnabled(ID_PRESENTER_COPY_KEY,!m_htmlWidget->getCurrentAnchor().isEmpty());
+ m_copyPopup->setItemEnabled(ID_PRESENTER_COPY_SELECTED, !m_htmlWidget->selectedText().isEmpty());
+
+ m_printPopup->setItemEnabled(ID_PRESENTER_PRINT_KEY,!m_htmlWidget->getCurrentAnchor().isEmpty());
+
+ m_savePopup->setItemEnabled(ID_PRESENTER_SAVE_KEY,!m_htmlWidget->getCurrentAnchor().isEmpty());
+}
+
+/** Reimplementation from CSwordPresenter. */
+void CBiblePresenter::lookup(const QString& module, const QString& key){
+ CSwordModuleInfo* m = backend()->findModuleByName(module);
+ if (m && m_moduleList.containsRef(m)) {
+ if (!key.isEmpty())
+ m_key->key(key);
+ m_keyChooser->setKey(m_key); //the key chooser does send an update signal
+ }
+ else {
+ emit lookupInModule(module, key);
+ }
+}
+
+/** Reimplementation. Refreshes the things which are described by the event integer. */
+void CBiblePresenter::refresh( ){
+
+ CSwordPresenter::refresh(); //refreshes the display settings button
+
+ m_key->setLocale((const char*)backend()->booknameLanguage().local8Bit());
+ m_keyChooser->refreshContent();
+ lookup(m_key);
+ m_htmlWidget->refresh();
+}
+
+
+/** Copies the highlighted text into clipboard. */
+void CBiblePresenter::copyVerse(){
+ QString key = QString::null;
+ QString module = QString::null;
+ QString currentAnchor = m_htmlWidget->getCurrentAnchor();
+ CReferenceManager::Type type;
+ CReferenceManager::decodeHyperlink(currentAnchor, module, key, type);
+ CSwordModuleInfo* m = backend()->findModuleByName(module);
+
+ CSwordVerseKey vKey(m);
+ vKey.key(key);
+
+ QClipboard *cb = KApplication::clipboard();
+ cb->setText(vKey.key());
+}
+
+/** Copies the highlighted text into clipboard. */
+void CBiblePresenter::copyVerseText(){
+ QString key = QString::null;
+ QString module = QString::null;
+ QString currentAnchor = m_htmlWidget->getCurrentAnchor();
+ CReferenceManager::Type type;
+ CReferenceManager::decodeHyperlink(currentAnchor, module, key, type);
+ CSwordModuleInfo* m = backend()->findModuleByName(module);
+
+ CSwordVerseKey vKey(m);
+ vKey.key(key);
+ QClipboard *cb = KApplication::clipboard();
+ cb->setText(vKey.strippedText());
+}
+
+/** Copies the highlighted text into clipboard. */
+void CBiblePresenter::copyVerseAndText(){
+ QString key = QString::null;
+ QString module = QString::null;
+ QString currentAnchor = m_htmlWidget->getCurrentAnchor();
+ CReferenceManager::Type type;
+ CReferenceManager::decodeHyperlink(currentAnchor, module, key, type);
+ CSwordModuleInfo* m = backend()->findModuleByName(module);
+ CSwordVerseKey vKey(m);
+ vKey.key(key);
+
+ const QString text = QString("%1\n%2").arg(vKey.key()).arg(vKey.strippedText());
+ QClipboard *cb = KApplication::clipboard();
+ cb->setText(text);
+}
+
+//print functions
+/** Copies the highlighted text into clipboard. */
+void CBiblePresenter::printVerseAndText(){
+ QString key = QString::null;
+ QString module = QString::null;
+ const QString currentAnchor = m_htmlWidget->getCurrentAnchor();
+ CReferenceManager::Type type;
+ CReferenceManager::decodeHyperlink(currentAnchor, module, key, type);
+ CSwordModuleInfo* m = backend()->findModuleByName(module);
+
+ CSwordVerseKey vKey(m);
+ vKey.key(key);
+
+ CExportManager::printKey(m, vKey.key());
+}
+
+/** Copies the highlighted text into clipboard. */
+void CBiblePresenter::printChapter(){
+ CSwordVerseKey startKey(*m_key);
+ startKey.Verse(1);
+
+ CSwordVerseKey stopKey(*m_key);
+
+ CSwordBibleModuleInfo* b = dynamic_cast<CSwordBibleModuleInfo*>(m_moduleList.first());
+ if (b)
+ stopKey.Verse( b->verseCount( b->bookNumber(startKey.book()), startKey.Chapter() ) );
+ CExportManager::printKey(m_moduleList.first(), startKey.key(), stopKey.key());
+}
+
+//save functions
+
+/** Copies the highlighted text into clipboard. */
+void CBiblePresenter::saveVerseAndText(){
+ QString key = QString::null;
+ QString module = QString::null;
+ CReferenceManager::Type type;
+ const QString currentAnchor = m_htmlWidget->getCurrentAnchor();
+
+ CReferenceManager::decodeHyperlink(currentAnchor, module, key, type);
+ CSwordVerseKey vKey( backend()->findModuleByName(module) );
+ vKey.key(key);
+
+ CExportManager::saveKey(&vKey, true);
+}
+
+/** Inserts the actions used by this window class into the given KAccel object. */
+void CBiblePresenter::insertKeyboardActions(KAccel* a){
+ a->setConfigGroup("Bible window");
+ a->insertItem(i18n("Next book"), "Next book", 0);
+ a->insertItem(i18n("Previous book"), "Previous book", 0);
+
+ a->insertItem(i18n("Next chapter"), "Next chapter", 0);
+ a->insertItem(i18n("Previous chapter"), "Previous chapter", 0);
+
+ a->insertItem(i18n("Next verse"), "Next verse", 0);
+ a->insertItem(i18n("Previous verse"), "Previous verse", 0);
+}
+
+/** Initializes the accelerator object. */
+void CBiblePresenter::initAccels(){
+ ASSERT(m_accel);
+ m_accel->setConfigGroup("Bible window");
+
+ m_accel->insertItem(i18n("Next book"), "Next book", 0);
+ m_accel->connectItem("Next book", this, SLOT(nextBook()));
+ m_accel->insertItem(i18n("Previous book"), "Previous book", 0);
+ m_accel->connectItem("Previous book", this, SLOT(previousBook()));
+
+ m_accel->insertItem(i18n("Next chapter"), "Next chapter", 0);
+ m_accel->connectItem("Next chapter", this, SLOT(nextChapter()));
+ m_accel->insertItem(i18n("Previous chapter"), "Previous chapter", 0);
+ m_accel->connectItem("Previous chapter", this, SLOT(previousChapter()));
+
+ m_accel->insertItem(i18n("Next verse"), "Next verse", 0);
+ m_accel->connectItem("Next verse", this, SLOT(nextVerse()));
+ m_accel->insertItem(i18n("Previous verse"), "Previous verse", 0);
+ m_accel->connectItem("Previous verse", this, SLOT(previousVerse()));
+
+ m_accel->readSettings();
+ CSwordPresenter::initAccels();
+}
+
+/** Jumps to the next entry */
+void CBiblePresenter::nextBook(){
+ if (m_key->next(CSwordVerseKey::UseBook))
+ m_keyChooser->setKey(m_key);
+}
+
+/** Jumps to the previous entry. */
+void CBiblePresenter::previousBook(){
+ if (m_key->previous(CSwordVerseKey::UseBook))
+ m_keyChooser->setKey(m_key);
+}
+
+
+/** Jumps to the next entry */
+void CBiblePresenter::nextChapter(){
+ if (m_key->next(CSwordVerseKey::UseChapter))
+ m_keyChooser->setKey(m_key);
+}
+
+/** Jumps to the previous entry. */
+void CBiblePresenter::previousChapter(){
+ if (m_key->previous(CSwordVerseKey::UseChapter))
+ m_keyChooser->setKey(m_key);
+}
+
+/** Jumps to the next entry */
+void CBiblePresenter::nextVerse(){
+// qWarning("CBiblePresenter::nextVerse()");
+ if ( m_key->next(CSwordVerseKey::UseVerse) )
+ m_keyChooser->setKey(m_key);
+}
+
+/** Jumps to the previous entry. */
+void CBiblePresenter::previousVerse(){
+ if (m_key->previous(CSwordVerseKey::UseVerse))
+ m_keyChooser->setKey(m_key);
+}
+
+/** Stores some Bible window dpecific setttings in the profile. */
+void CBiblePresenter::storeSettings( CProfileWindow* settings ){
+ CSwordPresenter::storeSettings(settings);
+ /**
+ * store the state of the displaysetttings button in the profile
+ * we use a binary digit to store the state. The most right digit is 1 if the
+ * first button is set, 0 if it isn't. The second digit is for the second entry in the menu.
+ * etc
+ */
+ const int count = m_displaySettingsButton->menuItemCount();
+ int result = 0;
+ //now check every item
+ for (int i = 1; i<count; i++) { //first item is a title
+ if (m_displaySettingsButton->itemStatus(i)) //item is checked
+ result += (int)pow(2,i-1);//add 2^i (the i. digit in binary)
+ }
+ settings->setWindowSettings(result);
+}
+
+/** Applies some Bible window specific setttings. */
+void CBiblePresenter::applySettings( CProfileWindow* settings ){
+ CSwordPresenter::applySettings(settings);
+ int result = settings->windowSettings();
+ const int count = m_displaySettingsButton->menuItemCount();
+ for (int i = count-1; i>=1; i--) {
+ if (result-(int)pow(2,i-1)>= 0) { //2^i was added before, so item with index i is set
+ result -= (int)pow(2,i-1);
+ m_displaySettingsButton->setItemStatus(i,true);
+ }
+ else
+ m_displaySettingsButton->setItemStatus(i,false);
+ }
+ m_displaySettingsButton->setChanged();
+}
diff --git a/bibletime/frontend/presenters/cbiblepresenter.h b/bibletime/frontend/presenters/cbiblepresenter.h
new file mode 100644
index 0000000..095ca75
--- /dev/null
+++ b/bibletime/frontend/presenters/cbiblepresenter.h
@@ -0,0 +1,94 @@
+/***************************************************************************
+ cbiblepresenter.h - description
+ -------------------
+ begin : Sun Mar 18 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CBIBLEPRESENTER_H
+#define CBIBLEPRESENTER_H
+
+#include <qwidget.h>
+#include "cswordpresenter.h"
+
+class CSwordVerseKey;
+
+/**
+ * The presenter used for Sword Bibles.
+ * @author The BibleTime team
+ */
+class CBiblePresenter : public CSwordPresenter {
+ Q_OBJECT
+public:
+ CBiblePresenter(ListCSwordModuleInfo useModules, QWidget *parent=0, const char *name=0);
+ ~CBiblePresenter();
+ /**
+ * Reimplementation from CSwordPresenter.
+ */
+ virtual void lookup(const QString&, const QString&);
+ /**
+ * Reimplementation.
+ */
+ virtual void refresh( );
+ /**
+ * Inserts the actions used by this window class into the given KAccel object.
+ */
+ static void insertKeyboardActions(KAccel* a);
+ /**
+ * Applies some Bible window specific setttings.
+ */
+ virtual void applySettings( CProfileWindow* window );
+ /**
+ * Stores some Bible window dpecific setttings in the profile.
+ */
+ virtual void storeSettings( CProfileWindow* setttings );
+
+protected:
+ /**
+ * Initializes the view (central widget, toolbars etc) of this presenter
+ */
+ virtual void initView();
+ /**
+ * Initializes the Signal / Slot connections
+ */
+ void initConnections();
+ /**
+ * Initializes the accelerator object.
+ */
+ virtual void initAccels();
+
+protected slots:
+ void modulesChanged();
+ void optionsChanged();
+ void lookup( CSwordKey* );
+ void nextBook();
+ void previousBook();
+ void nextChapter();
+ void previousChapter();
+ void nextVerse();
+ void previousVerse();
+
+private slots:
+ void popupAboutToShow();
+ void copyVerse();
+ void copyVerseText();
+ void copyVerseAndText();
+ void printVerseAndText();
+ void printChapter();
+ void saveVerseAndText();
+
+private:
+ CSwordVerseKey* m_key;
+};
+
+#endif
diff --git a/bibletime/frontend/presenters/cbookpresenter.cpp b/bibletime/frontend/presenters/cbookpresenter.cpp
new file mode 100644
index 0000000..f811248
--- /dev/null
+++ b/bibletime/frontend/presenters/cbookpresenter.cpp
@@ -0,0 +1,258 @@
+/***************************************************************************
+ cbookpresenter.cpp - description
+ -------------------
+ begin : Thu Jan 24 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+
+//BibleTime includes
+#include "cbookpresenter.h"
+#include "../keychooser/ckeychooser.h"
+#include "../keychooser/cbooktreechooser.h"
+#include "cmodulechooserbar.h"
+#include "../ctoolclass.h"
+#include "../chtmlwidget.h"
+#include "../cexportmanager.h"
+#include "../../backend/cswordtreekey.h"
+#include "../../backend/chtmlentrydisplay.h"
+#include "../../backend/cswordbackend.h"
+
+#include "cdisplaysettingsbutton.h"
+#include "../../resource.h"
+#include "../../tooltipdef.h"
+#include "../../whatsthisdef.h"
+
+//Qt includes
+#include <qsplitter.h>
+
+//KDE includes
+#include <kaccel.h>
+#include <klocale.h>
+#include <kaction.h>
+
+CBookPresenter::CBookPresenter(ListCSwordModuleInfo useModules, QWidget *parent, const char *name )
+ : CSwordPresenter(useModules,parent,name)
+{
+ m_key = dynamic_cast<CSwordTreeKey*>( CSwordKey::createInstance(useModules.first()) );
+ m_key->root();
+
+ initView();
+ show();
+ initConnections();
+
+ setInitialized();
+}
+
+CBookPresenter::~CBookPresenter(){
+ delete m_key;
+ m_key = 0;
+}
+
+/** Initializes the interface of this presenter. */
+void CBookPresenter::initView(){
+ m_mainToolBar = new KToolBar(this);
+ m_keyChooser = CKeyChooser::createInstance(m_moduleList.first(), m_key, m_mainToolBar);
+ m_mainToolBar->insertWidget(0,m_keyChooser->sizeHint().width(),m_keyChooser);
+
+ m_treeAction = new KToggleAction(i18n("Toggle tree..."), ICON_VIEW_BOOKTREE,
+ IDK_PRESENTER_TOGGLE_TREE, this, SLOT(treeToggled()), actionCollection(), "treeToggle_action");
+// m_treeAction->setWhatsThis( WT_PRESENTER_SYNC );
+ m_treeAction->plug(m_mainToolBar);
+
+ addToolBar(m_mainToolBar);
+
+ m_moduleChooserBar = new CModuleChooserBar(m_moduleList, CSwordModuleInfo::GenericBook, this );
+ m_moduleChooserBar->setButtonLimit(1);
+ addToolBar(m_moduleChooserBar);
+
+
+ QSplitter* splitter = new QSplitter(this);
+ m_treeChooser = new CBookTreeChooser(m_moduleList.first(), m_key, splitter);
+ m_treeAction->setChecked(false);
+ m_treeChooser->hide();
+
+ splitter->setResizeMode(m_treeChooser, QSplitter::FollowSizeHint);
+
+ m_htmlWidget = new CHTMLWidget(true, splitter);
+
+ m_popup = new KPopupMenu(this);
+ m_popup->insertTitle(i18n("Book window"));
+
+ m_copyPopup = new KPopupMenu(m_popup);
+// m_copyPopup->insertItem(i18n("Verse"), this, SLOT(copyVerse()),0,ID_PRESENTER_COPY_ONLY_KEY);
+// m_copyPopup->insertItem(i18n("Text of verse"), this, SLOT(copyVerseText()),0,ID_PRESENTER_COPY_KEY_TEXT);
+// m_copyPopup->insertItem(i18n("Verse with text"), this, SLOT(copyVerseAndText()),0,ID_PRESENTER_COPY_KEY);
+// m_copyPopup->insertItem(i18n("Chapter"), m_htmlWidget, SLOT(copyDocument()),0,ID_PRESENTER_COPY_CHAPTER);
+// m_copyPopup->insertSeparator();
+ m_copyPopup->insertItem(i18n("Selected text"), m_htmlWidget, SLOT(copy()),0,ID_PRESENTER_COPY_SELECTED);
+
+ m_printPopup = new KPopupMenu(m_popup);
+ m_printPopup->insertItem(i18n("Entry"), this, SLOT(printEntry()),0,ID_PRESENTER_PRINT_KEY);
+
+ m_savePopup = new KPopupMenu(m_popup);
+// m_savePopup->insertItem(i18n("Verse with text"), this, SLOT(saveVerseAndText()),0,ID_PRESENTER_SAVE_KEY);
+// m_savePopup->insertItem(i18n("Chapter as plain text"), m_htmlWidget, SLOT(slotSaveAsText()),0,ID_PRESENTER_SAVE_CHAPTER);
+ m_savePopup->insertItem(i18n("Entry as HTML"), m_htmlWidget, SLOT(slotSaveAsHTML()),0,ID_PRESENTER_SAVE_CHAPTER_HTML);
+
+ m_popup->insertItem(i18n("Select all"), m_htmlWidget, SLOT(slotSelectAll()),0, ID_PRESENTER_SELECT_ALL);
+ m_popup->insertItem(i18n("Lookup selected text in lexicon"), m_lexiconPopup, ID_PRESENTER_LOOKUP);
+ m_popup->insertSeparator();
+ m_popup->insertItem(SmallIcon(ICON_EDIT_COPY),i18n("Copy..."), m_copyPopup, ID_PRESENTER_COPY_POPUP);
+ m_popup->insertItem(SmallIcon(ICON_FILE_PRINT), i18n("Add to printing queue..."), m_printPopup, ID_PRESENTER_PRINT_POPUP);
+ m_popup->insertItem(SmallIcon(ICON_FILE_SAVE), i18n("Save..."), m_savePopup,ID_PRESENTER_SAVE_POPUP);
+
+ m_htmlWidget->installPopup(m_popup);
+ m_htmlWidget->installAnchorMenu(m_popup);
+ m_htmlWidget->setModules(m_moduleList);
+
+
+ setCentralWidget(splitter);
+}
+
+/** Initializes the Signal / Slot connections */
+void CBookPresenter::initConnections(){
+ connect(m_htmlWidget, SIGNAL(referenceClicked(const QString&, const QString&)),
+ this, SLOT(lookup(const QString&, const QString&)));
+ connect(m_htmlWidget, SIGNAL(referenceDropped(const QString&)),
+ this, SLOT(referenceDropped(const QString&)));
+
+ connect(m_keyChooser, SIGNAL(keyChanged(CSwordKey*)),
+ this, SLOT(lookup(CSwordKey*)));
+ connect(m_keyChooser, SIGNAL(keyChanged(CSwordKey*)),
+ m_treeChooser, SLOT(updateKey(CSwordKey*)));
+
+ connect(m_treeChooser, SIGNAL(keyChanged(CSwordKey*)),
+ this, SLOT(lookup(CSwordKey*)));
+ connect(m_treeChooser, SIGNAL(keyChanged(CSwordKey*)),
+ m_keyChooser, SLOT(updateKey(CSwordKey*)));
+
+// connect(m_popup, SIGNAL(aboutToShow()),
+// SLOT(popupAboutToShow()));
+ connect(m_moduleChooserBar, SIGNAL( sigChanged() ),
+ SLOT(modulesChanged() ));
+// connect(m_displaySettingsButton, SIGNAL( sigChanged() ),
+// SLOT(optionsChanged() ));
+}
+
+void CBookPresenter::modulesChanged(){
+ m_moduleList = m_moduleChooserBar->getModuleList();
+ if (!m_moduleList.count())
+ close();
+ else {
+ m_key->module(m_moduleList.first());
+ m_keyChooser->setModule(m_moduleList.first());
+ m_treeChooser->setModule(m_moduleList.first());
+ m_htmlWidget->setModules(m_moduleList);
+
+ lookup(m_key);
+ }
+}
+
+void CBookPresenter::lookup(CSwordKey* key) {
+ setUpdatesEnabled(false);
+ CSwordTreeKey* treeKey = dynamic_cast<CSwordTreeKey*>(key);
+ CSwordModuleInfo* m = m_moduleList.first();
+ m->module()->SetKey(treeKey);
+
+
+ if (m->getDisplay()) {
+ m->getDisplay()->Display( m );
+ m_htmlWidget->setText(m->getDisplay()->getHTML());
+ }
+ if (m_key != treeKey) {
+ m_key->key(treeKey->key());
+ }
+ setUpdatesEnabled(true);
+ setCaption( windowCaption() );
+
+ m_htmlWidget->scrollToAnchor( QString::fromLocal8Bit(treeKey->getLocalName()) );
+}
+
+/** No descriptions */
+void CBookPresenter::lookup( const QString& module, const QString& key){
+ CSwordModuleInfo* m = backend()->findModuleByName(module);
+ if (m && m_moduleList.containsRef(m)) {
+ if (!key.isEmpty())
+ m_key->key(key);
+ else
+ m_key->root();
+ m_keyChooser->setKey(m_key); //the key chooser does send an update signal
+ }
+ else
+ emit lookupInModule(module, key);
+}
+
+/** Initializes keyboard accelerators. */
+void CBookPresenter::initAccels(){
+ CSwordPresenter::initAccels();
+ m_accel->setConfigGroup("Book window");
+ m_accel->insertItem(i18n("Toggle tree"), "Toggle tree", 0);
+ m_accel->connectItem("Toggle tree", this, SLOT(treeToggled()));
+
+ m_accel->readSettings();
+}
+
+void CBookPresenter::insertKeyboardActions(KAccel* a){
+ a->setConfigGroup("Book window");
+ a->insertItem(i18n("Toggle tree"), "Toggle tree", 0);
+}
+
+/** No descriptions */
+void CBookPresenter::printEntry(){
+ CExportManager::printKey( m_moduleList.first(), m_key->key() );
+}
+
+/** Is called when the tree should be toggled. */
+void CBookPresenter::treeToggled(){
+ if (m_treeAction->isChecked())
+ m_treeChooser->show();
+ else
+ m_treeChooser->hide();
+}
+
+void CBookPresenter::applySettings( CProfileWindow* settings ){
+ CSwordPresenter::applySettings(settings);
+
+ if (settings->windowSettings()) {
+ m_treeAction->setChecked(true);
+ m_treeChooser->show();
+ }
+ else {
+ m_treeAction->setChecked(false);
+ m_treeChooser->hide();
+ }
+// const int count = m_displaySettingsButton->menuItemCount();
+// for (int i = count-1; i>=1; i--) {
+// if (result-(int)pow(2,i-1)>= 0) { //2^i was added before, so item with index i is set
+// result -= (int)pow(2,i-1);
+// m_displaySettingsButton->setItemStatus(i,true);
+// }
+// else
+// m_displaySettingsButton->setItemStatus(i,false);
+// }
+// m_displaySettingsButton->setChanged();
+}
+
+void CBookPresenter::storeSettings( CProfileWindow* settings ){
+ CSwordPresenter::storeSettings(settings);
+ settings->setWindowSettings( m_treeAction->isChecked() );
+// const int count = m_displaySettingsButton->menuItemCount();
+// int result = 0;
+// //now check every item
+// for (int i = 1; i<count; i++) { //first item is a title
+// if (m_displaySettingsButton->itemStatus(i)) //item is checked
+// result += (int)pow(2,i-1);//add 2^i (the i. digit in binary)
+// }
+// settings->setWindowSettings(result);
+}
diff --git a/bibletime/frontend/presenters/cbookpresenter.h b/bibletime/frontend/presenters/cbookpresenter.h
new file mode 100644
index 0000000..58b4800
--- /dev/null
+++ b/bibletime/frontend/presenters/cbookpresenter.h
@@ -0,0 +1,77 @@
+/***************************************************************************
+ cbookpresenter.h - description
+ -------------------
+ begin : Thu Jan 24 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CBOOKPRESENTER_H
+#define CBOOKPRESENTER_H
+
+#include <qwidget.h>
+#include "cswordpresenter.h"
+
+
+class CSwordTreeKey;
+class KToggleAction;
+
+/**Creates a presenter object for generic book support.
+ *@author The BibleTime team
+ */
+
+class KAccel;
+
+class CBookTreeChooser;
+
+class CBookPresenter : public CSwordPresenter {
+ Q_OBJECT
+public:
+ /**
+ * Constructor of the presenter for generic books.
+ */
+ CBookPresenter(ListCSwordModuleInfo useModules, QWidget *parent=0, const char *name=0 );
+ virtual ~CBookPresenter();
+ static void insertKeyboardActions(KAccel* a);
+ virtual void applySettings( CProfileWindow* settings );
+ virtual void storeSettings( CProfileWindow* setttings );
+
+public slots: // Public slots
+ /**
+ * No descriptions
+ */
+ virtual void lookup( const QString&, const QString&);
+
+protected: // Protected methods
+ /**
+ * Initializes the interface of this presenter.
+ */
+ virtual void initView();
+ /**
+ * Init the Signal Slot connections between childs and this widget.
+ */
+ virtual void initConnections();
+ virtual void initAccels();
+
+protected slots:
+ void modulesChanged();
+ void lookup(CSwordKey*);
+ void treeToggled();
+ void printEntry();
+
+private:
+ CSwordTreeKey* m_key;
+ CBookTreeChooser* m_treeChooser;
+ KToggleAction* m_treeAction;
+};
+
+#endif
diff --git a/bibletime/frontend/presenters/ccommentarypresenter.cpp b/bibletime/frontend/presenters/ccommentarypresenter.cpp
new file mode 100644
index 0000000..da37d9e
--- /dev/null
+++ b/bibletime/frontend/presenters/ccommentarypresenter.cpp
@@ -0,0 +1,524 @@
+/***************************************************************************
+ ccommentarypresenter.cpp - description
+ -------------------
+ begin : Sun Mar 18 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "ccommentarypresenter.h"
+#include "cmodulechooserbar.h"
+#include "cdisplaysettingsbutton.h"
+
+#include "../ctoolclass.h"
+#include "../cexportmanager.h"
+#include "../chtmlwidget.h"
+#include "../keychooser/ckeychooser.h"
+#include "../../resource.h"
+#include "../../whatsthisdef.h"
+#include "../../backend/cswordversekey.h"
+#include "../../backend/chtmlchapterdisplay.h"
+#include "../../backend/creferencemanager.h"
+#include "../../backend/cswordbackend.h"
+#include "../../backend/cswordcommentarymoduleinfo.h"
+
+
+//Qt includes
+#include <qclipboard.h>
+
+//KDE includes
+#include <kmessagebox.h>
+#include <ktoolbar.h>
+#include <kaction.h>
+#include <klocale.h>
+#include <kfiledialog.h>
+#include <kaccel.h>
+#include <kapp.h>
+
+CCommentaryPresenter::CCommentaryPresenter(ListCSwordModuleInfo useModules, QWidget *parent, const char *name )
+ : CSwordPresenter(useModules, parent,name),
+ m_key( new CSwordVerseKey(m_moduleList.first()) ), m_editToolBar(0)
+{
+ CSwordCommentaryModuleInfo* commentary = dynamic_cast<CSwordCommentaryModuleInfo*>(m_moduleList.first());
+ if (commentary) {
+ if (commentary->hasTestament(CSwordBibleModuleInfo::OldTestament))
+ m_key->key("Genesis 1:1");
+ else
+ m_key->key("Matthew 1:1");
+ }
+
+ initView();
+ show();
+ initConnections();
+
+ setInitialized();
+}
+
+CCommentaryPresenter::~CCommentaryPresenter(){
+ delete m_key;
+}
+
+/** Initializes our view. */
+void CCommentaryPresenter::initView(){
+ m_mainToolBar = new KToolBar(this);
+ m_keyChooser = CKeyChooser::createInstance(m_moduleList.first(), m_key, m_mainToolBar);
+ m_mainToolBar->insertWidget(0,m_keyChooser->sizeHint().width(),m_keyChooser);
+ addToolBar(m_mainToolBar);
+
+ m_moduleChooserBar = new CModuleChooserBar(m_moduleList, CSwordModuleInfo::Commentary, this );
+ addToolBar(m_moduleChooserBar);
+
+ presenterSync_action = new KToggleAction(i18n("Synchronize..."), ICON_SYNC,
+ IDK_PRESENTER_EDIT, this, SLOT(syncToggled()), actionCollection(), "syncComment_action");
+ presenterSync_action->setWhatsThis( WT_PRESENTER_SYNC );
+ presenterSync_action->plug(m_mainToolBar);
+
+ presenterEdit_action = new KToggleAction(i18n("Edit entry..."), ICON_EDIT,
+ IDK_PRESENTER_EDIT, this, SLOT(editComment()), actionCollection(), "editComment_action");
+ presenterEdit_action->setEnabled( m_moduleList.first()->module()->isWritable() );
+ presenterEdit_action->setWhatsThis( WT_PRESENTER_EDIT );
+ presenterEdit_action->plug(m_mainToolBar);
+
+ m_htmlWidget = new CHTMLWidget(true, this);
+ ASSERT(m_htmlWidget);
+
+ //setup popup menu
+ m_popup = new KPopupMenu(this);
+ m_popup->insertTitle(i18n("Commentary window"));
+
+ m_copyPopup = new KPopupMenu(m_popup);
+ m_copyPopup->insertItem(i18n("Entry"), this, SLOT(copyEntry()),0,ID_PRESENTER_COPY_ONLY_KEY);
+ m_copyPopup->insertItem(i18n("Text of entry"), this, SLOT(copyEntryText()),0,ID_PRESENTER_COPY_KEY_TEXT);
+ m_copyPopup->insertItem(i18n("Entry with text"), this, SLOT(copyEntryAndText()),0,ID_PRESENTER_COPY_KEY);
+ m_copyPopup->insertSeparator();
+ m_copyPopup->insertItem(i18n("Selected text"), m_htmlWidget, SLOT(copy()),0,ID_PRESENTER_COPY_SELECTED);
+
+ m_printPopup = new KPopupMenu(m_popup);
+ m_printPopup->insertItem(i18n("Entry with text"), this, SLOT(printHighlightedVerse()),0,ID_PRESENTER_PRINT_KEY);
+
+ m_savePopup = new KPopupMenu(m_popup);
+ m_savePopup->insertItem(i18n("Entry as plain text"), m_htmlWidget, SLOT(slotSaveAsText()),0,ID_PRESENTER_SAVE_CHAPTER);
+ m_savePopup->insertItem(i18n("Entry as HTML"), m_htmlWidget, SLOT(slotSaveAsHTML()),0,ID_PRESENTER_SAVE_CHAPTER_HTML);
+
+ m_popup->insertItem(i18n("Select all"), m_htmlWidget, SLOT(slotSelectAll()),0, ID_PRESENTER_SELECT_ALL);
+ m_popup->insertItem(i18n("Lookup selected text in lexicon"), m_lexiconPopup, ID_PRESENTER_LOOKUP);
+ m_popup->insertSeparator();
+ m_popup->insertItem(SmallIcon(ICON_EDIT_COPY),i18n("Copy..."), m_copyPopup, ID_PRESENTER_COPY_POPUP);
+ m_popup->insertItem(SmallIcon(ICON_FILE_PRINT), i18n("Add to printing queue..."), m_printPopup, ID_PRESENTER_PRINT_POPUP);
+ m_popup->insertItem(SmallIcon(ICON_FILE_SAVE), i18n("Save..."), m_savePopup,ID_PRESENTER_SAVE_POPUP);
+
+ m_htmlWidget->installPopup(m_popup);
+ m_htmlWidget->installAnchorMenu( m_popup );
+ m_htmlWidget->setModules(m_moduleList);
+ setCentralWidget(m_htmlWidget);
+ setIcon( COMMENTARY_ICON_SMALL );
+}
+
+/** Initializes the connections */
+void CCommentaryPresenter::initConnections(){
+ connect(m_htmlWidget, SIGNAL(referenceClicked(const QString&, const QString&)),
+ this, SLOT(lookup(const QString&, const QString&)));
+ connect(m_htmlWidget, SIGNAL(referenceDropped(const QString&)),
+ this, SLOT(referenceDropped(const QString&)));
+
+ connect(m_htmlWidget, SIGNAL(sigDeleteDocument()),
+ this, SLOT(deleteText()));
+ connect(m_htmlWidget, SIGNAL(sigSaveDocument(const QString)),
+ this, SLOT(saveText(const QString)));
+ connect(m_htmlWidget, SIGNAL(insertReference(const QString&)),
+ this, SLOT(insertReference(const QString&)));
+
+ connect( m_keyChooser, SIGNAL(beforeKeyChange(const QString&)),
+ this, SLOT(beforeKeyChange(const QString&)));
+ connect( m_keyChooser, SIGNAL(keyChanged(CSwordKey*)),
+ this, SLOT(lookup(CSwordKey*)));
+
+ connect(m_popup,SIGNAL(aboutToShow()),
+ SLOT(popupAboutToShow()));
+
+ connect(m_moduleChooserBar, SIGNAL( sigChanged() ),
+ SLOT( modulesChanged() ));
+// connect(m_displaySettingsButton, SIGNAL( sigChanged() ),
+// SLOT(optionsChanged() ));
+}
+
+/** Is called when the selected modules changed. */
+void CCommentaryPresenter::modulesChanged(){
+ m_moduleList = m_moduleChooserBar->getModuleList();
+
+ if (!m_moduleList.count())
+ close();
+ else {
+ presenterEdit_action->setEnabled( m_moduleList.first()->module()->isWritable() );
+// m_displaySettingsButton->reset(m_moduleList);
+// refreshFeatures();
+ m_key->module(m_moduleList.first());
+ m_keyChooser->setModule(m_moduleList.first());
+ m_htmlWidget->setModules(m_moduleList);
+ lookup(m_key);
+ }
+}
+/** */
+void CCommentaryPresenter::optionsChanged(){
+ lookup(m_key);
+}
+
+/** renders text and set it to the HTML widget */
+void CCommentaryPresenter::lookup(CSwordKey* key){
+ setUpdatesEnabled(false);
+ CSwordVerseKey* vKey = dynamic_cast<CSwordVerseKey*>(key);
+ if (!vKey)
+ return;
+
+ backend()->setFilterOptions( m_moduleOptions );
+ backend()->setDisplayOptions( m_displayOptions );
+
+ m_moduleList.first()->module()->SetKey(*vKey);
+
+ if (m_moduleList.first()->getDisplay()) { //do we have a display object?
+ if (m_htmlWidget->isReadOnly()) {
+ if (m_moduleList.count()>1)
+ m_moduleList.first()->getDisplay()->Display( &m_moduleList );
+ else
+ m_moduleList.first()->getDisplay()->Display( m_moduleList.first() );
+ m_htmlWidget->setText( m_moduleList.first()->getDisplay()->getHTML() );
+ }
+ else
+ m_htmlWidget->setText( QString::fromUtf8( m_moduleList.first()->module()->getRawEntry() ) );
+ }
+ if (m_key != vKey)
+ m_key->key(vKey->key());
+
+ m_htmlWidget->scrollToAnchor( QString::number(vKey->Verse()) );
+ m_htmlWidget->setModified(false);
+ setUpdatesEnabled(true);
+
+ setCaption( windowCaption() );
+}
+
+/** No descriptions */
+void CCommentaryPresenter::popupAboutToShow(){
+ m_popup->setItemEnabled(ID_PRESENTER_LOOKUP, !m_htmlWidget->selectedText().isEmpty());
+ m_copyPopup->setItemEnabled(ID_PRESENTER_COPY_SELECTED, !m_htmlWidget->selectedText().isEmpty());
+}
+
+/** Saves the given text in the module. */
+void CCommentaryPresenter::saveText(const QString text){
+ m_moduleList.first()->module()->SetKey(m_key);
+ if (!text.isEmpty())
+ *(m_moduleList.first()->module()) << (const char*)text.utf8();
+ else
+ m_moduleList.first()->module()->deleteEntry();
+ m_htmlWidget->setModified( false );
+}
+
+/** Deletes the displayed and edited text. */
+void CCommentaryPresenter::deleteText(){
+ m_moduleList.first()->module()->deleteEntry();
+ m_htmlWidget->clear();
+}
+
+void CCommentaryPresenter::editComment(){
+ if (!m_htmlWidget->isReadOnly()) {
+ switch (KMessageBox::warningYesNo( this, i18n("The text was not saved to the module. Save the changes now?")) ) {
+ case KMessageBox::Yes:
+ {
+ saveText( m_htmlWidget->text() );
+ m_htmlWidget->setModified( false );
+ break;
+ }
+ default: //no
+ break;
+ }
+ }
+
+ m_htmlWidget->setReadOnly( !m_htmlWidget->isReadOnly() );
+ if (!m_htmlWidget->isReadOnly() && !m_editToolBar) {
+ m_editToolBar = new KToolBar(this);
+ addToolBar(m_editToolBar);
+ m_htmlWidget->createEditToolbar( m_editToolBar );
+ }
+ if (!m_htmlWidget->isReadOnly() && !m_editToolBar)
+ return;
+
+ if (!m_htmlWidget->isReadOnly())
+ m_editToolBar->show();
+ else
+ m_editToolBar->hide();
+
+ lookup( m_key );
+ m_htmlWidget->setFocus();
+}
+
+/** Reimplementation. */
+void CCommentaryPresenter::lookup(const QString& module, const QString& key){
+ CSwordModuleInfo* m = backend()->findModuleByName(module);
+ if (m && m_moduleList.containsRef(m)) {
+ if (!key.isEmpty())
+ m_key->key(key);
+ m_keyChooser->setKey(m_key); //the key chooser does send an update signal
+ }
+ else {
+ emit lookupInModule(module, key);
+ }
+}
+
+/** No descriptions */
+void CCommentaryPresenter::refresh( ){
+
+// CSwordPresenter::refresh(); //refreshes the display settings button
+
+ m_key->setLocale((const char*)backend()->booknameLanguage().local8Bit());
+ m_keyChooser->refreshContent();
+ lookup(m_key);
+ m_htmlWidget->refresh();
+}
+
+/** Printes the verse the user has chosen. */
+void CCommentaryPresenter::printHighlightedVerse(){
+// CSwordVerseKey key(m_moduleList.first()); //this key is deleted by the printem
+// key->key(m_key->key());
+// CSwordVerseKey key(*m_key);
+ CExportManager::printKey(m_moduleList.first(), m_key->key());
+}
+
+/** The sync button was pressed for synchronization. */
+void CCommentaryPresenter::syncToggled(){
+}
+
+/** Synchronizes to the given key if sync is enabled. */
+void CCommentaryPresenter::synchronize( CSwordKey* syncKey ){
+ if (!presenterSync_action->isChecked() || !syncKey)
+ return;
+ checkChanges();
+ m_key->key(syncKey->key());
+ m_keyChooser->setKey(m_key);
+}
+
+/** No descriptions */
+void CCommentaryPresenter::insertReference(const QString& reference){
+ if (m_htmlWidget->isReadOnly())
+ return;
+ CSwordVerseKey vk(m_moduleList.first());
+ vk.key(reference);
+ m_htmlWidget->insert(vk.strippedText());
+}
+
+/** Copies the highlighted text into clipboard. */
+void CCommentaryPresenter::copyEntry(){
+ QString key = QString::null;
+ QString module = QString::null;
+ QString currentAnchor = m_htmlWidget->getCurrentAnchor();
+ CReferenceManager::Type type;
+ CReferenceManager::decodeHyperlink(currentAnchor, module, key, type);
+ CSwordModuleInfo* m = backend()->findModuleByName(module);
+
+ CSwordVerseKey vKey(m);
+ vKey.key(key);
+
+ QClipboard *cb = KApplication::clipboard();
+ cb->setText(vKey.key());
+}
+
+/** Copies the highlighted text into clipboard. */
+void CCommentaryPresenter::copyEntryText(){
+ QString key = QString::null;
+ QString module = QString::null;
+ QString currentAnchor = m_htmlWidget->getCurrentAnchor();
+ CReferenceManager::Type type;
+ CReferenceManager::decodeHyperlink(currentAnchor, module, key, type);
+ CSwordModuleInfo* m = backend()->findModuleByName(module);
+
+ CSwordVerseKey vKey(m);
+ vKey.key(key);
+
+ QClipboard *cb = KApplication::clipboard();
+ cb->setText(vKey.strippedText());
+}
+
+/** Copies the highlighted text into clipboard. */
+void CCommentaryPresenter::copyEntryAndText(){
+ QString key = QString::null;
+ QString module = QString::null;
+ QString currentAnchor = m_htmlWidget->getCurrentAnchor();
+ CReferenceManager::Type type;
+ CReferenceManager::decodeHyperlink(currentAnchor, module, key, type);
+ CSwordModuleInfo* m = backend()->findModuleByName(module);
+
+ CSwordVerseKey vKey(m);
+ vKey.key(key);
+
+ const QString text = QString::fromLatin1("%1\n%2").arg(vKey.key()).arg(vKey.strippedText());
+ QClipboard *cb = KApplication::clipboard();
+ cb->setText(text);
+}
+
+//print functions
+/** Copies the highlighted text into clipboard. */
+void CCommentaryPresenter::printEntry(){
+ QString key = QString::null;
+ QString module = QString::null;
+ QString currentAnchor = m_htmlWidget->getCurrentAnchor();
+ CReferenceManager::Type type;
+ CReferenceManager::decodeHyperlink(currentAnchor, module, key, type);
+
+ CSwordModuleInfo* m = backend()->findModuleByName(module);
+ CSwordVerseKey vKey(m);
+ CExportManager::printKey(m, vKey.key(key));
+}
+
+/** Checks for changes and saves the text. */
+void CCommentaryPresenter::checkChanges(){
+// qDebug("void CCommentaryPresenter::checkChanges()");
+ if (!m_htmlWidget->isReadOnly() && m_htmlWidget->isModified()) {//save
+ saveText( m_htmlWidget->text() );
+ m_htmlWidget->setModified( false );
+ }
+}
+
+/** No descriptions */
+void CCommentaryPresenter::beforeKeyChange(const QString& oldKey){
+ if (!m_htmlWidget->isReadOnly()) {
+ switch (KMessageBox::warningYesNo( this, i18n("The text was not saved to the module. Save the changes now?")) ) {
+ case KMessageBox::Yes:
+ {
+ const QString newKey = m_key->key();
+ m_key->key(oldKey);
+ saveText( m_htmlWidget->text() );
+ m_key->key(newKey);
+ break;
+ }
+ default: //no
+ break;
+ }
+ }
+ m_htmlWidget->setModified( false );
+}
+
+/** Inserts the actions used by this window class into the given KAccel object. */
+void CCommentaryPresenter::insertKeyboardActions(KAccel* a){
+ ASSERT(a);
+ a->setConfigGroup("Commentary window");
+
+ a->insertItem(i18n("Next book"), "Next book", 0);
+ a->insertItem(i18n("Previous book"), "Previous book", 0);
+
+ a->insertItem(i18n("Next chapter"), "Next chapter", 0);
+ a->insertItem(i18n("Previous chapter"), "Previous chapter", 0);
+
+ a->insertItem(i18n("Next verse"), "Next verse", 0);
+ a->insertItem(i18n("Previous verse"), "Previous verse", 0);
+
+ a->insertItem(i18n("Toggle synchronize button"), "Synchronize", 0);
+}
+
+
+/** Initializes the accelerator object. */
+void CCommentaryPresenter::initAccels(){
+ CSwordPresenter::initAccels();
+ m_accel->setConfigGroup("Commentary window");
+
+ m_accel->insertItem(i18n("Next book"), "Next book", 0);
+ m_accel->connectItem("Next book", this, SLOT(nextBook()));
+ m_accel->insertItem(i18n("Previous book"), "Previous book", 0);
+ m_accel->connectItem("Previous book", this, SLOT(previousBook()));
+
+ m_accel->insertItem(i18n("Next chapter"), "Next chapter", 0);
+ m_accel->connectItem("Next chapter", this, SLOT(nextChapter()));
+ m_accel->insertItem(i18n("Previous chapter"), "Previous chapter", 0);
+ m_accel->connectItem("Previous chapter", this, SLOT(previousChapter()));
+
+ m_accel->insertItem(i18n("Next verse"), "Next verse", 0);
+ m_accel->connectItem("Next verse", this, SLOT(nextVerse()));
+ m_accel->insertItem(i18n("Previous verse"), "Previous verse", 0);
+ m_accel->connectItem("Previous verse", this, SLOT(previousVerse()));
+
+ m_accel->insertItem(i18n("Toggle synchronize button"), "Synchronize", 0);
+ m_accel->connectItem("Synchronize", this, SLOT(toggleSynchronize()));
+
+ m_accel->readSettings();
+}
+
+/** Jumps to the next entry */
+void CCommentaryPresenter::nextBook(){
+ if (m_key->next(CSwordVerseKey::UseBook))
+ m_keyChooser->setKey(m_key);
+}
+
+/** Jumps to the previous entry. */
+void CCommentaryPresenter::previousBook(){
+ if (m_key->previous(CSwordVerseKey::UseBook))
+ m_keyChooser->setKey(m_key);
+}
+
+
+/** Jumps to the next entry */
+void CCommentaryPresenter::nextChapter(){
+ if ( m_key->next(CSwordVerseKey::UseChapter) )
+ m_keyChooser->setKey(m_key);
+}
+
+/** Jumps to the previous entry. */
+void CCommentaryPresenter::previousChapter(){
+ if (m_key->previous(CSwordVerseKey::UseChapter))
+ m_keyChooser->setKey(m_key);
+}
+
+/** Jumps to the next entry */
+void CCommentaryPresenter::nextVerse(){
+ if ( m_key->next(CSwordVerseKey::UseVerse) )
+ m_keyChooser->setKey(m_key);
+}
+
+/** Jumps to the previous entry. */
+void CCommentaryPresenter::previousVerse(){
+ if (m_key->previous(CSwordVerseKey::UseVerse))
+ m_keyChooser->setKey(m_key);
+}
+
+/** Toggles the synchronize button. */
+void CCommentaryPresenter::toggleSynchronize(){
+ presenterSync_action->setChecked( !presenterSync_action->isChecked() );
+}
+
+/** Stores some Bible window dpecific setttings in the profile. */
+void CCommentaryPresenter::storeSettings( CProfileWindow* settings ){
+ CSwordPresenter::storeSettings(settings);
+ settings->setWindowSettings( presenterSync_action->isChecked() );
+}
+
+/** Applies some Bible window specific setttings. */
+void CCommentaryPresenter::applySettings( CProfileWindow* settings ){
+ CSwordPresenter::applySettings(settings);
+ presenterSync_action->setChecked(settings->windowSettings() == 1);
+}
+
+/** Saves settings */
+bool CCommentaryPresenter::queryClose(){
+ //save the text
+ if (!m_htmlWidget->isReadOnly() && m_htmlWidget->isModified()) {
+ switch (KMessageBox::warningYesNoCancel( this, i18n("Save changes to module?")) ) {
+ case KMessageBox::Yes:
+ {
+ //save
+ saveText( m_htmlWidget->text() );
+ m_htmlWidget->setModified( false );
+ return true;
+ }
+ case KMessageBox::No :
+ return true;
+ default: // cancel
+ return false;
+ }
+ }
+ return true;
+}
diff --git a/bibletime/frontend/presenters/ccommentarypresenter.h b/bibletime/frontend/presenters/ccommentarypresenter.h
new file mode 100644
index 0000000..ebfe34b
--- /dev/null
+++ b/bibletime/frontend/presenters/ccommentarypresenter.h
@@ -0,0 +1,132 @@
+/***************************************************************************
+ ccommentarypresenter.h - description
+ -------------------
+ begin : Sun Mar 18 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CCOMMENTARYPRESENTER_H
+#define CCOMMENTARYPRESENTER_H
+
+#include <qwidget.h>
+#include "cswordpresenter.h"
+
+class CSwordVerseKey;
+
+class KToggleAction;
+class KToolBar;
+
+/** The presenter used for Sword commentaries.
+ * @author The BibleTime team
+ */
+class CCommentaryPresenter : public CSwordPresenter {
+ Q_OBJECT
+
+public:
+ /**
+ * Default constructor
+ */
+ CCommentaryPresenter(ListCSwordModuleInfo useModules, QWidget *parent=0, const char *name=0);
+ /**
+ * Default destructor
+ */
+ ~CCommentaryPresenter();
+ /**
+ * Synchronizes to the given key if sync is enabled.
+ */
+ void synchronize( CSwordKey* syncKey );
+ /**
+ * Inserts the actions used by this display window type into the given KAccel object.
+ */
+ static void insertKeyboardActions(KAccel* a);
+ void storeSettings( CProfileWindow* settings );
+ void applySettings( CProfileWindow* settings );
+
+public slots: // Public slots
+ /**
+ * Saves the given text in the module.
+ */
+ void saveText(const QString);
+ /**
+ * Reimplementation.
+ */
+ virtual void lookup(const QString&, const QString&);
+ /**
+ * Reimplementation
+ */
+ virtual void refresh( );
+ /**
+ * Saves settings
+ */
+ virtual bool queryClose();
+
+protected: // Protected methods
+ /**
+ * Init keyboard accelartors.
+ */
+ virtual void initAccels();
+
+protected slots: // Protected slots
+ /**
+ * renders text and set it to the HTML widget
+ */
+ void lookup(CSwordKey*);
+ /**
+ * Is called when the selected modules changed.
+ */
+ void modulesChanged();
+ void optionsChanged();
+ /**
+ * Deletes the displayed and edited text.
+ */
+ void deleteText();
+ void editComment();
+ /**
+ * Print the current item displayed in the presenter.
+ */
+ void printHighlightedVerse();
+ void nextBook();
+ void previousBook();
+ void nextChapter();
+ void previousChapter();
+ void nextVerse();
+ void previousVerse();
+ /**
+ * Toggles the synchronize button.
+ */
+ void toggleSynchronize();
+
+private:
+ void initConnections();
+ void initView();
+ /**
+ * Checks for changes and saves the text.
+ */
+ void checkChanges();
+ KToggleAction *presenterEdit_action;
+ KToggleAction *presenterSync_action;
+ CSwordVerseKey* m_key;
+ KToolBar* m_editToolBar;
+
+private slots:
+ void popupAboutToShow();
+ void syncToggled();
+ void insertReference(const QString&);
+ void copyEntry();
+ void copyEntryText();
+ void copyEntryAndText();
+ void printEntry();
+ void beforeKeyChange(const QString&);
+};
+
+#endif
diff --git a/bibletime/frontend/presenters/cdisplaysettingsbutton.cpp b/bibletime/frontend/presenters/cdisplaysettingsbutton.cpp
new file mode 100644
index 0000000..3979fc8
--- /dev/null
+++ b/bibletime/frontend/presenters/cdisplaysettingsbutton.cpp
@@ -0,0 +1,138 @@
+/***************************************************************************
+ cdisplaysettingsbutton.cpp - description
+ -------------------
+ begin : Thu Nov 8 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cdisplaysettingsbutton.h"
+#include "../../resource.h"
+
+#include <qstring.h>
+#include <qtooltip.h>
+
+#include <kpopupmenu.h>
+#include <klocale.h>
+
+CDisplaySettingsButton::CDisplaySettingsButton(CSwordBackend::DisplayOptionsBool *displaySettings, CSwordBackend::FilterOptionsBool *moduleSettings, const ListCSwordModuleInfo& useModules,QWidget *parent, const char *name )
+ : KToolBarButton(DSB_ICON, 0, parent, name)
+{
+ m_displaySettings = displaySettings;
+ m_moduleSettings = moduleSettings;
+ m_modules = useModules;
+
+// setPixmap( BIBLE_ICON_MC );
+
+ m_popup = new KPopupMenu(this);
+ setPopup(m_popup);
+ setPopupDelay(0);
+
+ connect(m_popup, SIGNAL(activated(int)), this, SLOT(optionToggled(int)));
+
+ populateMenu();
+// if (!populateMenu())
+// setEnabled(false);
+}
+
+void CDisplaySettingsButton::reset(const ListCSwordModuleInfo& useModules){
+ m_modules = useModules;
+ populateMenu();
+// if (!populateMenu())
+// setEnabled(false);
+// else
+// setEnabled(true);
+}
+
+
+void CDisplaySettingsButton::optionToggled(int ID){
+ m_popup->setItemChecked( ID, !(m_popup->isItemChecked(ID)));
+ if (!m_popup->text(ID).isEmpty())
+ *(m_dict[m_popup->text(ID)]) = m_popup->isItemChecked(ID);
+ emit sigChanged();
+}
+
+/** No descriptions */
+int CDisplaySettingsButton::populateMenu(){
+
+ int ret = 0;
+
+ m_popup->clear();
+ m_popup->insertTitle(i18n("Display options"));
+ m_popup->setCheckable(true);
+
+ ret += addMenuEntry(i18n("Use linebreaks"), &m_displaySettings->lineBreaks, true);
+ ret += addMenuEntry(i18n("Show versenumbers"), &m_displaySettings->verseNumbers, true);
+
+ ret += addMenuEntry(i18n("Show headings"), &m_moduleSettings->headings,
+ isOptionAvailable(CSwordBackend::headings));
+ ret += addMenuEntry(i18n("Show footnotes"), &m_moduleSettings->footnotes,
+ isOptionAvailable(CSwordBackend::footnotes ));
+ ret += addMenuEntry(i18n("Show Strong's Numbers"), &m_moduleSettings->strongNumbers,
+ isOptionAvailable(CSwordBackend::strongNumbers ));
+
+ ret += addMenuEntry(i18n("Show morphologic tags"),&m_moduleSettings->morphTags,
+ isOptionAvailable(CSwordBackend::morphTags ));
+ ret += addMenuEntry(i18n("Show lemmas"),&m_moduleSettings->lemmas,
+ isOptionAvailable(CSwordBackend::lemmas ));
+ ret += addMenuEntry(i18n("Show Hebrew vowel points"), &m_moduleSettings->hebrewPoints,
+ isOptionAvailable(CSwordBackend::hebrewPoints ));
+ ret += addMenuEntry(i18n("Show Hebrew cantillation marks"), &m_moduleSettings->hebrewCantillation,
+ isOptionAvailable(CSwordBackend::hebrewCantillation ));
+ ret += addMenuEntry(i18n("Show Greek accents"), &m_moduleSettings->greekAccents,
+ isOptionAvailable(CSwordBackend::greekAccents ));
+ ret += addMenuEntry(i18n("Use alternative textual variant"), &m_moduleSettings->textualVariants,
+ isOptionAvailable(CSwordBackend::greekAccents ));
+
+ return ret;
+}
+
+/** No descriptions */
+int CDisplaySettingsButton::addMenuEntry( const QString name, const bool* option, const bool available){
+ if (available){
+ m_dict.insert( name, option);
+ m_popup->setItemChecked(m_popup->insertItem( name ), *option );
+ return 1;
+ }
+ return 0;
+}
+
+bool CDisplaySettingsButton::isOptionAvailable( const CSwordBackend::FilterOptions option){
+ bool ret = false;
+ for (m_modules.first(); m_modules.current(); m_modules.next())
+ ret = ret || m_modules.current()->has(option);
+ return ret;
+}
+
+/** Returns the number of usable menu items in the setttings menu. */
+const int CDisplaySettingsButton::menuItemCount(){
+ return m_popup->count();
+}
+
+/** Sets the item at position pos to the satet given as 2nd paramter. */
+void CDisplaySettingsButton::setItemStatus( const int index, const bool checked ){
+ const int ID = m_popup->idAt(index);
+ m_popup->setItemChecked(ID, checked);
+ const QString text = m_popup->text(ID);
+ if (m_dict[text])
+ *(m_dict[text]) = checked;
+}
+
+/** Returns the status of the item at position "index" */
+const bool CDisplaySettingsButton::itemStatus( const int index ){
+ return m_popup->isItemChecked( m_popup->idAt(index) );
+}
+
+/** Sets the status to changed. The signal changed will be emitted. */
+void CDisplaySettingsButton::setChanged(){
+ emit sigChanged();
+}
diff --git a/bibletime/frontend/presenters/cdisplaysettingsbutton.h b/bibletime/frontend/presenters/cdisplaysettingsbutton.h
new file mode 100644
index 0000000..9db2f9e
--- /dev/null
+++ b/bibletime/frontend/presenters/cdisplaysettingsbutton.h
@@ -0,0 +1,79 @@
+/***************************************************************************
+ cdisplaysettingsbutton.h - description
+ -------------------
+ begin : Thu Nov 8 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CDISPLAYSETTINGSBUTTON_H
+#define CDISPLAYSETTINGSBUTTON_H
+
+#include "backend/cswordbackend.h"
+#include "backend/cswordmoduleinfo.h"
+
+//QT includes
+#include <qdict.h>
+
+//KDE includes
+#include <ktoolbarbutton.h>
+
+/**
+ * @author The BibleTime team
+ */
+class CSwordModuleInfo;
+class KPopupMenu;
+
+class CDisplaySettingsButton : public KToolBarButton {
+ Q_OBJECT
+public:
+ CDisplaySettingsButton(CSwordBackend::DisplayOptionsBool *displaySettings, CSwordBackend::FilterOptionsBool *settings, const ListCSwordModuleInfo& useModules, QWidget *parent=0, const char *name=0);
+ void reset(const ListCSwordModuleInfo& useModules);
+ /**
+ * Sets the item at position pos to the satet given as 2nd paramter.
+ */
+ void setItemStatus( const int pos, const bool checked );
+ /**
+ * Returns the number of usable menu items in the setttings menu.
+ */
+ const int menuItemCount();
+ /**
+ * Returns the status of the item at position "index"
+ */
+ const bool itemStatus( const int index );
+ /**
+ * Sets the status to changed. The signal changed will be emitted.
+ */
+ void setChanged();
+
+signals:
+ void sigChanged(void);
+
+protected slots:
+ void optionToggled(int ID);
+
+protected:
+ CSwordBackend::FilterOptionsBool* m_moduleSettings;
+ CSwordBackend::DisplayOptionsBool* m_displaySettings;
+ CSwordBackend::FilterOptionsBool m_available;
+ ListCSwordModuleInfo m_modules;
+
+ QDict<bool> m_dict;
+
+ KPopupMenu* m_popup;
+
+ int populateMenu();
+ bool isOptionAvailable( const CSwordBackend::FilterOptions option);
+ int addMenuEntry( const QString name, const bool* option, const bool available);
+};
+
+#endif
diff --git a/bibletime/frontend/presenters/clexiconpresenter.cpp b/bibletime/frontend/presenters/clexiconpresenter.cpp
new file mode 100644
index 0000000..0d561fd
--- /dev/null
+++ b/bibletime/frontend/presenters/clexiconpresenter.cpp
@@ -0,0 +1,280 @@
+/***************************************************************************
+ clexiconpresenter.cpp - description
+ -------------------
+ begin : Sun Mar 18 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "clexiconpresenter.h"
+#include "cmodulechooserbar.h"
+#include "cdisplaysettingsbutton.h"
+
+#include "../chtmlwidget.h"
+#include "../cexportmanager.h"
+#include "../keychooser/ckeychooser.h"
+#include "../../resource.h"
+#include "../../backend/cswordldkey.h"
+#include "../../backend/chtmlentrydisplay.h"
+#include "../../backend/cswordbackend.h"
+
+
+//Qt includes
+#include <qclipboard.h>
+
+//KDE icnludes
+#include <klocale.h>
+#include <ktoolbar.h>
+#include <kpopupmenu.h>
+#include <kfiledialog.h>
+#include <kapp.h>
+#include <kaccel.h>
+
+CLexiconPresenter::CLexiconPresenter(ListCSwordModuleInfo useModules, QWidget *parent, const char *name )
+ : CSwordPresenter(useModules, parent,name),
+ m_key( new CSwordLDKey(m_moduleList.first()) )
+{
+ m_key->key("");
+// m_key->SWKey::operator=( TOP );
+// *m_key = TOP;
+
+ initView();
+
+ show();
+ initConnections();
+
+ setInitialized();
+}
+
+CLexiconPresenter::~CLexiconPresenter(){
+ delete m_key;
+}
+
+/** Initializes the view. */
+void CLexiconPresenter::initView(){
+
+ m_mainToolBar = new KToolBar(this);
+
+ m_keyChooser = CKeyChooser::createInstance(m_moduleList.first(), m_key, m_mainToolBar);
+
+ m_mainToolBar->insertWidget(0,m_keyChooser->sizeHint().width(),m_keyChooser);
+ m_mainToolBar->setItemAutoSized(0);
+ addToolBar(m_mainToolBar);
+
+// m_displaySettingsButton = new CDisplaySettingsButton( &m_displayOptions, &m_moduleOptions, m_moduleList, m_mainToolBar);
+// m_mainToolBar->insertWidget(1,m_displaySettingsButton->sizeHint().width(),m_displaySettingsButton);
+
+ m_moduleChooserBar = new CModuleChooserBar(m_moduleList, CSwordModuleInfo::Lexicon, this );
+ addToolBar(m_moduleChooserBar);
+
+ m_htmlWidget = new CHTMLWidget(true, this);
+
+
+ //setup popup menu
+ m_popup = new KPopupMenu(this);
+ m_popup->insertTitle(i18n("Lexicon window"));
+
+ m_copyPopup = new KPopupMenu(m_popup);
+ m_copyPopup->insertItem(i18n("Entry"), this, SLOT(copyEntry()),0,ID_PRESENTER_COPY_ONLY_KEY);
+ m_copyPopup->insertItem(i18n("Text of entry"), this, SLOT(copyEntryText()),0,ID_PRESENTER_COPY_KEY_TEXT);
+ m_copyPopup->insertItem(i18n("Entry with text"), this, SLOT(copyEntryAndText()),0,ID_PRESENTER_COPY_KEY);
+ m_copyPopup->insertSeparator();
+ m_copyPopup->insertItem(i18n("Selected text"), m_htmlWidget, SLOT(copy()),0,ID_PRESENTER_COPY_SELECTED);
+
+ m_printPopup = new KPopupMenu(m_popup);
+ m_printPopup->insertItem(i18n("Entry with text"), this, SLOT(printEntry()),0,ID_PRESENTER_PRINT_KEY);
+
+ m_savePopup = new KPopupMenu(m_popup);
+ m_savePopup->insertItem(i18n("Entry as plain text"), m_htmlWidget, SLOT(slotSaveAsText()),0,ID_PRESENTER_SAVE_CHAPTER);
+ m_savePopup->insertItem(i18n("Entry as HTML"), m_htmlWidget, SLOT(slotSaveAsHTML()),0,ID_PRESENTER_SAVE_CHAPTER_HTML);
+
+ m_popup->insertItem(i18n("Select all"), m_htmlWidget, SLOT(slotSelectAll()),0, ID_PRESENTER_SELECT_ALL);
+ m_popup->insertItem(i18n("Lookup selected text in lexicon"), m_lexiconPopup, ID_PRESENTER_LOOKUP);
+ m_popup->insertSeparator();
+ m_popup->insertItem(SmallIcon(ICON_EDIT_COPY),i18n("Copy..."), m_copyPopup, ID_PRESENTER_COPY_POPUP);
+ m_popup->insertItem(SmallIcon(ICON_FILE_PRINT), i18n("Add to printing queue..."), m_printPopup, ID_PRESENTER_PRINT_POPUP);
+ m_popup->insertItem(SmallIcon(ICON_FILE_SAVE), i18n("Save..."), m_savePopup,ID_PRESENTER_SAVE_POPUP);
+
+
+ m_htmlWidget->installPopup(m_popup);
+ m_htmlWidget->installAnchorMenu(m_popup);
+ m_htmlWidget->setModules(m_moduleList);
+
+ setCentralWidget(m_htmlWidget);
+ setIcon(LEXICON_ICON_SMALL);
+}
+
+/** No descriptions */
+void CLexiconPresenter::initConnections(){
+ connect(m_htmlWidget, SIGNAL(referenceClicked(const QString&, const QString&)),
+ this, SLOT(lookup(const QString&, const QString&)));
+ connect(m_htmlWidget, SIGNAL(referenceDropped(const QString&)),
+ this, SLOT(referenceDropped(const QString&)));
+
+ connect(m_keyChooser, SIGNAL(keyChanged(CSwordKey*)),
+ this, SLOT(lookup(CSwordKey*)));
+ connect(m_popup, SIGNAL(aboutToShow()),this,
+ SLOT(popupAboutToShow()));
+ connect(m_moduleChooserBar, SIGNAL(sigChanged()), this,
+ SLOT(modulesChanged()));
+}
+
+/** No descriptions */
+void CLexiconPresenter::lookup(CSwordKey* key){
+ setUpdatesEnabled(false);
+
+ CSwordLDKey* ldKey = dynamic_cast<CSwordLDKey*>(key);
+ if (!ldKey)
+ return;
+ backend()->setFilterOptions( m_moduleOptions );
+ backend()->setDisplayOptions( m_displayOptions );
+
+ m_moduleList.first()->module()->SetKey(*ldKey);
+
+ if (m_moduleList.first()->getDisplay()) { //do we have a display object?
+ if (m_moduleChooserBar->getModuleList().count() > 1) //we want to display more than one module
+ m_moduleList.first()->getDisplay()->Display( &m_moduleList );
+ else
+ m_moduleList.first()->getDisplay()->Display( m_moduleList.first() );
+ m_htmlWidget->setText(m_moduleList.first()->getDisplay()->getHTML());
+ }
+ if (m_key != ldKey)
+ m_key->key(ldKey->key());
+
+ setUpdatesEnabled(true);
+ setCaption( windowCaption() );
+}
+
+/** No descriptions */
+void CLexiconPresenter::popupAboutToShow(){
+ m_popup->setItemEnabled(ID_PRESENTER_LOOKUP, !m_htmlWidget->selectedText().isEmpty());
+
+ m_copyPopup->setItemEnabled(ID_PRESENTER_COPY_SELECTED, !m_htmlWidget->selectedText().isEmpty());
+}
+
+/** No descriptions */
+void CLexiconPresenter::lookup(const QString& module, const QString& key){
+ CSwordModuleInfo* m = backend()->findModuleByName(module);
+ if (m && m_moduleList.containsRef(m)) {
+ if (!key.isEmpty())
+ m_key->key(key);
+ m_keyChooser->setKey(m_key); //the key chooser does send an update signal
+ }
+ else {
+ emit lookupInModule(module, key);
+ }
+}
+
+/** Refreshes all parts decsribed by the parameter. */
+void CLexiconPresenter::refresh( ){
+
+// CSwordPresenter::refresh(); //refreshes the display settings button
+
+ lookup(m_key);
+ m_htmlWidget->refresh();
+}
+
+/** Is called when the modules shown by this display window were changed. */
+void CLexiconPresenter::modulesChanged(){
+ m_moduleList = m_moduleChooserBar->getModuleList();
+ if (!m_moduleList.count())
+ close();
+ else {
+// m_displaySettingsButton->reset(m_moduleList);
+// refreshFeatures();
+ m_key->module(m_moduleList.first());
+ m_keyChooser->setModule(m_moduleList.first());
+ m_htmlWidget->setModules(m_moduleList);
+ lookup(m_key);
+ }
+}
+/** */
+void CLexiconPresenter::optionsChanged(){
+ lookup(m_key);
+}
+
+/** Copies the highlighted text into clipboard. */
+void CLexiconPresenter::copyEntry(){
+ CSwordLDKey key(m_moduleList.first()); //this key is deleted by the printem
+ key.key(m_key->key());
+ QString currentAnchor = m_htmlWidget->getCurrentAnchor();
+ if (currentAnchor.left(8) == "sword://")
+ currentAnchor = currentAnchor.mid(8, currentAnchor.length()-(currentAnchor.right(1) == "/" ? 9 : 8));
+ key.key(currentAnchor);
+
+ QClipboard *cb = KApplication::clipboard();
+ cb->setText(key.key());
+}
+
+/** Copies the highlighted text into clipboard. */
+void CLexiconPresenter::copyEntryText(){
+ CSwordLDKey key(m_moduleList.first()); //this key is deleted by the printem
+ key.key(m_key->key());
+ QString currentAnchor = m_htmlWidget->getCurrentAnchor();
+ if (currentAnchor.left(8) == "sword://")
+ currentAnchor = currentAnchor.mid(8, currentAnchor.length()-(currentAnchor.right(1) == "/" ? 9 : 8));
+ key.key(currentAnchor);
+
+ QClipboard *cb = KApplication::clipboard();
+ cb->setText(key.strippedText());
+}
+
+/** Copies the highlighted text into clipboard. */
+void CLexiconPresenter::copyEntryAndText(){
+ CSwordLDKey key(m_moduleList.first()); //this key is deleted by the printem
+ key.key(m_key->key());
+ QString currentAnchor = m_htmlWidget->getCurrentAnchor();
+ if (currentAnchor.left(8) == "sword://")
+ currentAnchor = currentAnchor.mid(8, currentAnchor.length()-(currentAnchor.right(1) == "/" ? 9 : 8));
+ key.key(currentAnchor);
+
+ const QString text = QString("%1\n%2").arg(key.key()).arg(key.strippedText());
+ QClipboard *cb = KApplication::clipboard();
+ cb->setText(text);
+}
+
+//print functions
+void CLexiconPresenter::printEntry(){
+ CExportManager::printKey(m_moduleList.first(), m_key->key());
+}
+
+/** Inserts the used keyboard actions into the given KAccel object. */
+void CLexiconPresenter::insertKeyboardActions(KAccel* a){
+ a->setConfigGroup("Lexicon window");
+ a->insertItem(i18n("Next entry"), "Next entry", 0);
+ a->insertItem(i18n("Previous entry"), "Previous entry", 0);
+}
+
+/** Initializes keyboard accelerators. */
+void CLexiconPresenter::initAccels(){
+ CSwordPresenter::initAccels();
+ m_accel->setConfigGroup("Lexicon window");
+ m_accel->insertItem(i18n("Next entry"), "Next entry", 0);
+ m_accel->connectItem("Next entry", this, SLOT(nextEntry()));
+
+ m_accel->insertItem(i18n("Previous entry"), "Previous entry", 0);
+ m_accel->connectItem("Previous entry", this, SLOT(previousEntry()));
+
+ m_accel->readSettings();
+}
+
+/** Jumps to the previous entry. */
+void CLexiconPresenter::previousEntry(){
+ m_key->PreviousEntry();
+ m_keyChooser->setKey(m_key);
+}
+
+/** Jumps to the next entry */
+void CLexiconPresenter::nextEntry(){
+ m_key->NextEntry();
+ m_keyChooser->setKey(m_key);
+}
diff --git a/bibletime/frontend/presenters/clexiconpresenter.h b/bibletime/frontend/presenters/clexiconpresenter.h
new file mode 100644
index 0000000..e74ea8c
--- /dev/null
+++ b/bibletime/frontend/presenters/clexiconpresenter.h
@@ -0,0 +1,75 @@
+/***************************************************************************
+ clexiconpresenter.h - description
+ -------------------
+ begin : Sun Mar 18 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CLEXICONPRESENTER_H
+#define CLEXICONPRESENTER_H
+
+#include <qwidget.h>
+#include "cswordpresenter.h"
+
+class CSwordLDKey;
+
+/**
+ * Presenter used for lexicons
+ * @author The BibleTime team
+ */
+class CLexiconPresenter : public CSwordPresenter {
+ Q_OBJECT
+public:
+ CLexiconPresenter(ListCSwordModuleInfo useModules, QWidget *parent=0, const char *name=0);
+ virtual ~CLexiconPresenter();
+ /**
+ * Inserts the used keyboard actions into the given KAccel object.
+ */
+ static void insertKeyboardActions(KAccel* a);
+
+public slots: // Public slots
+ /**
+ * No descriptions
+ */
+ virtual void lookup(const QString&, const QString&);
+ /**
+ * Refreshes all parts decsribed by the parameter.
+ */
+ virtual void refresh( );
+
+protected: // Protected methods
+ /**
+ * Initializes keyboard accelerators.
+ */
+ virtual void initAccels();
+
+private slots:
+ void copyEntry();
+ void copyEntryText();
+ void copyEntryAndText();
+ void printEntry();
+ void modulesChanged();
+ void optionsChanged();
+ void popupAboutToShow();
+ void lookup(CSwordKey*);
+ void nextEntry();
+ void previousEntry();
+
+private: // Private methods
+ void initConnections();
+ void initView();
+
+ CSwordLDKey* m_key;
+};
+
+#endif
diff --git a/bibletime/frontend/presenters/cmodulechooserbar.cpp b/bibletime/frontend/presenters/cmodulechooserbar.cpp
new file mode 100644
index 0000000..de57ba0
--- /dev/null
+++ b/bibletime/frontend/presenters/cmodulechooserbar.cpp
@@ -0,0 +1,129 @@
+/***************************************************************************
+ cmodulechooserbar.cpp - description
+ -------------------
+ begin : Sat Mar 17 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cmodulechooserbar.h"
+#include "cmodulechooserbutton.h"
+
+#include <qtimer.h>
+
+CModuleChooserBar::CModuleChooserBar(ListCSwordModuleInfo useModules, CSwordModuleInfo::ModuleType type, QWidget *parent, const char *name )
+ : KToolBar(parent,name) {
+ qDebug("constructor of CModuleCHooserBar");
+
+ m_moduleType = type;
+ m_idCounter = 0;
+ m_buttonLimit = -1; //-1 means no limit
+
+ //insert buttons if useModules != 0
+ for (useModules.first(); useModules.current(); useModules.next()) {
+ if (m_buttonLimit && (unsigned int)m_buttonLimit <= m_buttonList.count())
+ break;
+
+ CModuleChooserButton* b = new CModuleChooserButton(useModules.current(),m_moduleType,++m_idCounter,this);
+ m_buttonList.append(b);
+ insertWidget(m_idCounter, b->sizeHint().width(),b);
+ connect( b, SIGNAL(sigAddButton()), this, SLOT(addButton()) );
+ connect( b, SIGNAL(sigRemoveButton(const int)), this, SLOT(removeButton(const int)) );
+ connect( b, SIGNAL(sigChanged()), SIGNAL(sigChanged()) );
+ b->show();
+ }
+ if (m_buttonLimit && (unsigned int)m_buttonLimit > m_buttonList.count() )
+ addButton();
+}
+
+/** Adds a button to the toolbar */
+void CModuleChooserBar::addButton(){
+ CModuleChooserButton* b = new CModuleChooserButton(0, m_moduleType, ++m_idCounter, this);
+ m_buttonList.append(b);
+ insertWidget(m_idCounter, b->sizeHint().width(),b);
+
+ connect( b, SIGNAL(sigAddButton()), this, SLOT(addButton()) );
+ connect( b, SIGNAL(sigRemoveButton(const int)), this, SLOT(removeButton(const int)) );
+ connect( b, SIGNAL(sigChanged()), SIGNAL(sigChanged()) );
+
+ b->show();
+}
+
+/** Removes a button from the toolbar */
+void CModuleChooserBar::removeButton( const int ID ){
+ for (m_buttonList.first(); m_buttonList.current(); m_buttonList.next()) {
+ if (m_buttonList.current()->getId() == ID) { //found the right button
+ CModuleChooserButton* b = m_buttonList.current();
+ m_buttonList.remove(b);
+ //ASSERT(b);
+ b->hide();
+ m_deleteID = ID;
+ QTimer::singleShot( 5000, this, SLOT(deleteButton()) );
+ break;
+ }
+ }
+
+ emit sigChanged();
+}
+
+/** Returns a list of selected modules. */
+ListCSwordModuleInfo CModuleChooserBar::getModuleList(){
+ ListCSwordModuleInfo list;
+ list.setAutoDelete(false);
+ list.clear();
+
+ for (m_buttonList.first(); m_buttonList.current(); m_buttonList.next()) {
+ CSwordModuleInfo* m = m_buttonList.current()->module();
+ if (m)
+ list.append( m );
+ }
+ return list;
+}
+
+/** No descriptions */
+void CModuleChooserBar::deleteButton(){
+ removeItem(m_deleteID);
+}
+
+/** Sets the number of the maximum count of buttons. */
+void CModuleChooserBar::setButtonLimit(const int limit){
+ m_buttonLimit = limit;
+ if (m_buttonList.count() > (unsigned int)m_buttonLimit ) { //remove the last buttons
+ for (m_buttonList.last(); m_buttonList.current() && (m_buttonList.count() > (unsigned int)m_buttonLimit); m_buttonList.prev() ) {
+ CModuleChooserButton* b = m_buttonList.current();
+ m_buttonList.remove(b);
+ b->hide();
+ delete b;
+ }
+ }
+}
+
+/** Sets the modules which are chosen in this module chooser bar. */
+void CModuleChooserBar::setModules( ListCSwordModuleInfo useModules ){
+ setButtonLimit(0);
+ setButtonLimit(-1); //these two lines clear the bar
+
+ for (useModules.first(); useModules.current(); useModules.next()) {
+ if (m_buttonLimit && (unsigned int)m_buttonLimit <= m_buttonList.count())
+ break;
+
+ CModuleChooserButton* b = new CModuleChooserButton(useModules.current(),m_moduleType,++m_idCounter,this);
+ m_buttonList.append(b);
+ insertWidget(m_idCounter, b->sizeHint().width(),b);
+ connect( b, SIGNAL(sigAddButton()), this, SLOT(addButton()) );
+ connect( b, SIGNAL(sigRemoveButton(const int)), this, SLOT(removeButton(const int)) );
+ connect( b, SIGNAL(sigChanged()), SIGNAL(sigChanged()) );
+ b->show();
+ }
+ if (m_buttonLimit && (unsigned int)m_buttonLimit > m_buttonList.count() )
+ addButton();
+}
diff --git a/bibletime/frontend/presenters/cmodulechooserbar.h b/bibletime/frontend/presenters/cmodulechooserbar.h
new file mode 100644
index 0000000..a1249e0
--- /dev/null
+++ b/bibletime/frontend/presenters/cmodulechooserbar.h
@@ -0,0 +1,76 @@
+/***************************************************************************
+ cmodulechooserbar.h - description
+ -------------------
+ begin : Sat Mar 17 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CMODULECHOOSERBAR_H
+#define CMODULECHOOSERBAR_H
+
+#include "cmodulechooserbutton.h"
+#include "../../backend/cswordmoduleinfo.h"
+#include "../cpointers.h"
+
+#include <qwidget.h>
+#include <ktoolbar.h>
+
+/**
+ * @author The BibleTime team
+ */
+class CModuleChooserBar : public KToolBar {
+ Q_OBJECT
+public:
+ /**
+ * Default constructor
+ */
+ CModuleChooserBar(ListCSwordModuleInfo useModules, CSwordModuleInfo::ModuleType type, QWidget *parent=0, const char *name=0);
+ /**
+ * Returns a list of selected modules.
+ */
+ ListCSwordModuleInfo getModuleList();
+ /**
+ * Sets the number of the maximum count of buttons.
+ */
+ void setButtonLimit( const int limit);
+ /**
+ * Sets the modules which are chosen in this module chooser bar.
+ */
+ void setModules( ListCSwordModuleInfo modules );
+
+protected slots: // Protected slots
+ /**
+ * Adds a button to the toolbar
+ */
+ void addButton();
+ /**
+ * Removes a button from the toolbar
+ */
+ void removeButton( const int ID );
+ /**
+ * No descriptions
+ */
+ void deleteButton();
+
+private:
+ QList<CModuleChooserButton> m_buttonList;
+ CSwordModuleInfo::ModuleType m_moduleType;
+ int m_idCounter;
+ int m_deleteID;
+ int m_buttonLimit;
+
+signals: // Signals
+ void sigChanged();
+};
+
+#endif
diff --git a/bibletime/frontend/presenters/cmodulechooserbutton.cpp b/bibletime/frontend/presenters/cmodulechooserbutton.cpp
new file mode 100644
index 0000000..12ce8ea
--- /dev/null
+++ b/bibletime/frontend/presenters/cmodulechooserbutton.cpp
@@ -0,0 +1,145 @@
+/***************************************************************************
+ cmodulechooserbutton.cpp - description
+ -------------------
+ begin : Sat Mar 17 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cmodulechooserbutton.h"
+#include "../../resource.h"
+#include "../../backend/cswordbackend.h"
+
+//Qt includes
+#include <qstring.h>
+#include <qtooltip.h>
+
+//KDE includes
+#include <kpopupmenu.h>
+#include <klocale.h>
+
+CModuleChooserButton::CModuleChooserButton(CSwordModuleInfo* useModule,CSwordModuleInfo::ModuleType type, const int id, QWidget *parent, const char *name )
+ : KToolBarButton("", id, parent,name) {
+ qDebug("CModuleChooserButton::CModuleCHooserButton");
+
+ m_id = id;
+ m_moduleType = type;
+ m_module = useModule;
+ if (!m_module)
+ m_hasModule = false;
+ else
+ m_hasModule = true;
+
+ setIcon( iconName() );
+ setPopupDelay(0);
+
+ //create popup
+ m_popup = new KPopupMenu(this);
+ m_popup->insertTitle(i18n("Select additional modules"));
+ m_popup->setCheckable(true);
+ m_popup->insertItem(i18n("NONE"));
+ m_popup->insertSeparator();
+ connect(m_popup, SIGNAL(activated(int)), this, SLOT(moduleChosen(int)));
+ setPopup(m_popup);
+
+ ListCSwordModuleInfo& modules = backend()->moduleList();
+ for (modules.first(); modules.current(); modules.next()) {
+ if (modules.current()->type() == m_moduleType) {
+ m_popup->insertItem( modules.current()->name() );
+ }
+ }
+ //Check the appropriate entry
+ if (m_module) {
+ for (unsigned int i = 0; i < m_popup->count(); i++) {
+ if (m_popup->text(m_popup->idAt(i)) == m_module->name()) {
+ m_popup->setItemChecked(m_popup->idAt(i),true);
+ QToolTip::add(this, m_module->name() );
+ break;
+ }
+ }
+ }
+ else {
+ for (unsigned int i = 0; i < m_popup->count(); i++) {
+ if (m_popup->text(m_popup->idAt(i)) == i18n("NONE") )
+ m_popup->setItemChecked(m_popup->idAt(i),true);
+ break;
+ }
+ }
+}
+
+/** Returns the icon used for the current status. */
+const QString CModuleChooserButton::iconName(){
+ switch (m_moduleType) {
+ case CSwordModuleInfo::Bible:
+ if (m_hasModule)
+ return QString::fromLatin1(BIBLE_ICON_MC);
+ else
+ return QString::fromLatin1(BIBLE_ADD_ICON_MC);
+ case CSwordModuleInfo::Commentary:
+ if (m_hasModule)
+ return QString::fromLatin1(COMMENTARY_ICON_MC);
+ else
+ return QString::fromLatin1(COMMENTARY_ICON_MC);
+ case CSwordModuleInfo::Lexicon:
+ if (m_hasModule)
+ return QString::fromLatin1(LEXICON_ICON_MC);
+ else
+ return QString::fromLatin1(LEXICON_ADD_ICON_MC);
+ case CSwordModuleInfo::GenericBook:
+ if (m_hasModule)
+ return QString::fromLatin1(BOOK_ICON_MC);
+ else
+ return QString::fromLatin1(BOOK_ADD_ICON_MC);
+ default:
+ return QString::fromLatin1(BIBLE_ICON_MC);
+ }
+}
+
+CSwordModuleInfo* CModuleChooserButton::module() {
+ for (unsigned int i = 0; i < m_popup->count(); i++) {
+ if ( m_popup->isItemChecked(m_popup->idAt(i)) )
+ return backend()->findModuleByName( m_popup->text(m_popup->idAt(i)) );
+ }
+ return 0; //"none" selected
+}
+
+/** Returns the id used for this button. */
+int CModuleChooserButton::getId() const{
+ return m_id;
+}
+
+/** Ís called after a module was selected in the popup */
+void CModuleChooserButton::moduleChosen( int ID ){
+ for (unsigned int i = 0; i < m_popup->count(); i++)
+ m_popup->setItemChecked(m_popup->idAt(i),false);
+ m_popup->setItemChecked(ID, true);
+
+ if (m_popup->text(ID) == i18n("NONE")) {
+ if (m_hasModule) {
+ emit sigRemoveButton(m_id);
+ return;
+ }
+ }
+ else {
+ if (!m_hasModule)
+ emit sigAddButton();
+ m_hasModule = true;
+ m_module = module();
+ setIcon(iconName());
+// repaint();
+ emit sigChanged();
+
+ QToolTip::remove(this);
+ if (module())
+ QToolTip::add(this, module()->name());
+ }
+}
diff --git a/bibletime/frontend/presenters/cmodulechooserbutton.h b/bibletime/frontend/presenters/cmodulechooserbutton.h
new file mode 100644
index 0000000..e6d56c2
--- /dev/null
+++ b/bibletime/frontend/presenters/cmodulechooserbutton.h
@@ -0,0 +1,62 @@
+/***************************************************************************
+ cmodulechooserbutton.h - description
+ -------------------
+ begin : Sat Mar 17 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CMODULECHOOSERBUTTON_H
+#define CMODULECHOOSERBUTTON_H
+
+#include "backend/cswordmoduleinfo.h"
+#include "frontend/cpointers.h"
+
+#include <ktoolbarbutton.h>
+
+class KPopupMenu;
+
+/**
+ *@author The BibleTime team
+ */
+
+class CModuleChooserButton : public KToolBarButton, public CPointers {
+ Q_OBJECT
+public:
+ CModuleChooserButton(CSwordModuleInfo* useModule,CSwordModuleInfo::ModuleType type, const int id, QWidget *parent = 0, const char *name = 0 );
+ CSwordModuleInfo* module();
+ /**
+ * Returns the id used for this button.
+ */
+ int getId() const;
+
+private:
+ /**
+ * Returns the icon used for the current status.
+ */
+ const QString iconName();
+
+ bool m_hasModule;
+ CSwordModuleInfo::ModuleType m_moduleType;
+ CSwordModuleInfo* m_module;
+ int m_id;
+ KPopupMenu* m_popup;
+
+private slots:
+ void moduleChosen(int ID );
+
+signals:
+ void sigRemoveButton(const int ID);
+ void sigAddButton();
+ void sigChanged();
+};
+#endif
diff --git a/bibletime/frontend/presenters/cswordpresenter.cpp b/bibletime/frontend/presenters/cswordpresenter.cpp
new file mode 100644
index 0000000..da2d4cd
--- /dev/null
+++ b/bibletime/frontend/presenters/cswordpresenter.cpp
@@ -0,0 +1,273 @@
+/***************************************************************************
+ cswordpresenter.cpp - description
+ -------------------
+ begin : Sun Mar 18 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cswordpresenter.h"
+#include "../keychooser/ckeychooser.h"
+#include "../chtmlwidget.h"
+#include "../../backend/cswordkey.h"
+#include "../../printing/cprintitem.h"
+#include "../../printing/cprinter.h"
+#include "../cbtconfig.h"
+#include "cdisplaysettingsbutton.h"
+
+//Qt includes
+#include <qpopupmenu.h>
+
+//KDE includes
+#include <kaccel.h>
+
+CSwordPresenter::CSwordPresenter(ListCSwordModuleInfo useModules, QWidget *parent, const char *name )
+ : KMainWindow(parent,name,0),
+ m_mainToolBar(0),
+ m_popup(0), m_savePopup(0), m_copyPopup(0), m_printPopup(0),
+ m_lexiconPopup(new QPopupMenu(this)),
+ m_keyChooser(0),
+ m_htmlWidget(0),
+ m_moduleChooserBar(0),
+ m_displaySettingsButton(0),
+ m_moduleList(useModules),
+ m_accel(0),
+ m_moduleOptions( CBTConfig::getFilterOptionDefaults() ),
+ m_displayOptions( CBTConfig::getDisplayOptionDefaults() ),
+ m_features(0),
+ m_initialized(false)
+{
+ ListCSwordModuleInfo& modules = backend()->moduleList();
+ for (modules.first(); modules.current(); modules.next()) {
+ if (modules.current()->type() == CSwordModuleInfo::Lexicon) {
+ m_lexiconPopup->insertItem( modules.current()->name() );
+ }
+ }
+ connect(m_lexiconPopup, SIGNAL(activated(int)),this, SLOT(lookupWord(int)));
+ resize(350,350);
+ setCaption(windowCaption());
+
+ setFocusPolicy(QWidget::WheelFocus);
+}
+
+
+/** Returns the features used by this presenter. */
+int CSwordPresenter::getFeatures(){
+ return m_features;
+}
+
+/** Refreshes the presenter depending on the events given as parameter. */
+//void CSwordPresenter::refresh( ){
+//}
+
+/** Prints the key given as parameter. */
+//void CSwordPresenter::printKey(const QString& startKey, const QString& stopKey, CSwordModuleInfo* module) {
+//// printer()->addItemToQueue( new CPrintItem(module, startKey, stopKey) );
+// CExportManager::printKey(module, startKey, stopKey);
+//}
+
+/** Refreshes the supported features. */
+//void CSwordPresenter::refreshFeatures(){
+// m_features = 0;
+// for (m_moduleList.first(); m_moduleList.current(); m_moduleList.next()) {
+// if (m_moduleList.current()->supportsFeature( CSwordBackend::strongNumbers )){
+// if (m_features != 0)
+// m_features |= strongNumbers;
+// else
+// m_features = strongNumbers;
+// }
+// if (m_moduleList.current()->supportsFeature( CSwordBackend::footnotes )){
+// if (m_features != 0)
+// m_features |= footnotes;
+// else
+// m_features = footnotes;
+// }
+// if (m_moduleList.current()->supportsFeature( CSwordBackend::headings )){
+// if (m_features != 0)
+// m_features |= headings;
+// else
+// m_features = headings;
+// }
+// if (m_moduleList.current()->supportsFeature( CSwordBackend::morphTags )){
+// if (m_features != 0)
+// m_features |= morphTags;
+// else
+// m_features = morphTags;
+// }
+// }
+//}
+
+void CSwordPresenter::lookupWord(int moduleID){
+ const QString module = m_lexiconPopup->text(moduleID);
+ const QString text = m_htmlWidget->selectedText();
+ if (!text.isEmpty())
+ emit lookupInLexicon(text,module);
+}
+
+/** Look up the key given as parameter. */
+void CSwordPresenter::lookup(const QString& module, const QString& key){
+
+}
+
+/** Returns the listof used modules. */
+ListCSwordModuleInfo& CSwordPresenter::getModuleList() {
+ return m_moduleList;
+}
+
+/** Returns the used keychooser object of this presenter. */
+CKeyChooser* CSwordPresenter::keyChooser() const {
+ return m_keyChooser;
+}
+
+/** No descriptions */
+const QString CSwordPresenter::windowCaption() {
+ QString ret;
+ if (!m_moduleList.count()) {
+ return QString::null;
+ }
+ ret = m_moduleList.first()->name();
+ if (m_moduleList.count() > 1) {
+ for (m_moduleList.next(); m_moduleList.current(); m_moduleList.next()) {
+ ret += " | " + m_moduleList.current()->name();
+ }
+ }
+ return ret;
+}
+
+/** Sets the caption of this display window */
+void CSwordPresenter::setCaption(const QString&){
+ QWidget::setCaption( windowCaption() ); //set everytime our own caption
+}
+
+/** Applies the settings given in the parameter to the window. */
+void CSwordPresenter::applySettings( CProfileWindow* settings ){
+ setUpdatesEnabled(false);
+
+ if (settings->maximized()) {
+ showMaximized();
+ }
+ else {
+ const QRect rect = settings->geometry();
+ resize(rect.width(), rect.height());
+ parentWidget()->move(rect.x(), rect.y());
+ //setGeometry( settings->geometry() );
+ }
+ m_htmlWidget->horizontalScrollBar()->setValue( settings->scrollbarPositions().horizontal );
+ m_htmlWidget->verticalScrollBar()->setValue( settings->scrollbarPositions().vertical );
+
+ setUpdatesEnabled(true);
+}
+
+/** Stores the settings of this window in the CProfileWindow object given as parameter. */
+void CSwordPresenter::storeSettings( CProfileWindow* settings ){
+ QRect rect;
+ rect.setX(parentWidget()->x());
+ rect.setY(parentWidget()->y());
+ rect.setWidth(width());
+ rect.setHeight(height());
+ settings->setGeometry(rect);
+
+ settings->setScrollbarPositions( m_htmlWidget->horizontalScrollBar()->value(), m_htmlWidget->verticalScrollBar()->value() );
+ settings->setType(m_moduleList.first()->type());
+ settings->setMaximized(isMaximized() || parentWidget()->isMaximized());
+
+ CSwordKey* key = keyChooser()->key();
+ if (key) {
+ VerseKey* vk = dynamic_cast<VerseKey*>(key);
+ QString oldLang;
+ if (vk) {
+ oldLang = QString::fromLatin1(vk->getLocale());
+ vk->setLocale("en"); //save english locale names as default!
+ }
+ settings->setKey( key->key() );
+ if (vk) {
+ vk->setLocale(oldLang.latin1());
+ }
+ }
+
+ QStringList modules;
+ for (CSwordModuleInfo* m = m_moduleList.first(); m; m = m_moduleList.next()) {
+ modules.append(m->name());
+ }
+ settings->setModules(modules);
+}
+
+/** Is called when the presenter should be closed. To delete the presenter it emits "close(CPresenter*)".*/
+void CSwordPresenter::closeEvent(QCloseEvent* e) {
+ if (!queryClose()) {
+ e->ignore();
+ }
+ else {
+ e->accept();
+ emit(closePresenter(this));
+ }
+}
+
+/** Inserts the action used by this display window in the given KAccel object. */
+void CSwordPresenter::insertKeyboardActions( KAccel* a ){
+ a->setConfigGroup("General window");
+}
+
+void CSwordPresenter::initAccels(){
+}
+
+/** Initilizes widget before shown and after constructor. */
+void CSwordPresenter::polish(){
+ KMainWindow::polish();
+ m_accel = new KAccel(this);
+ initAccels();
+}
+
+/** Is called when this display window looses the focus. */
+void CSwordPresenter::focusInEvent( QFocusEvent* e ){
+ KMainWindow::focusInEvent(e);
+ if (m_accel)
+ m_accel->setEnabled(true);
+}
+
+/** Is called when this display window looses the focus. */
+void CSwordPresenter::focusOutEvent( QFocusEvent* e ){
+// qDebug("CSwordPresenter::focusOutEvent( QFocusEvent* e )");
+ KMainWindow::focusOutEvent(e);
+ if (m_accel)
+ m_accel->setEnabled(false);
+}
+
+/** Is called when this display window looses the focus. */
+void CSwordPresenter::refresh(){
+// qWarning("CSwordPresenter::refresh()");
+ m_moduleOptions = CBTConfig::getFilterOptionDefaults();
+ m_displayOptions = CBTConfig::getDisplayOptionDefaults();
+
+ if (m_displaySettingsButton)
+ m_displaySettingsButton->reset(m_moduleList);
+}
+
+/** Is called when a reference was dropped on this window. */
+void CSwordPresenter::referenceDropped(const QString& ref){
+ lookup(m_moduleList.first()->name(), ref);
+}
+
+/** Reimplementation from KMainWindow. */
+bool CSwordPresenter::queryClose(){
+ return true;
+}
+
+/** Returns true if the display window is fully initialized. */
+const bool CSwordPresenter::initialized(){
+ return m_initialized;
+}
+
+/** Sets the display window to the initialized state. */
+void CSwordPresenter::setInitialized(){
+ m_initialized = true;
+}
diff --git a/bibletime/frontend/presenters/cswordpresenter.h b/bibletime/frontend/presenters/cswordpresenter.h
new file mode 100644
index 0000000..7a9727e
--- /dev/null
+++ b/bibletime/frontend/presenters/cswordpresenter.h
@@ -0,0 +1,184 @@
+/***************************************************************************
+ cswordpresenter.h - description
+ -------------------
+ begin : Sun Mar 18 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSWORDPRESENTER_H
+#define CSWORDPRESENTER_H
+
+//BibleTime includes
+#include "../../backend/cswordmoduleinfo.h"
+#include "../../backend/cswordbackend.h"
+//#include "../../structdef.h"
+#include "../cpointers.h"
+#include "../cprofilewindow.h"
+
+//Qt includes
+#include <qwidget.h>
+
+//KDE includes
+#include <kmainwindow.h>
+
+class KPopupMenu;
+class KToolBar;
+
+class CKeyChooser;
+class CHTMLWidget;
+
+class CModuleChooserBar;
+class CDisplaySettingsButton;
+
+class CSwordKey;
+class KAccel;
+
+/** Base class for all Sword based presneters
+ * The base class for all Sword based presenters.
+ *
+ * @author The BibleTime team
+ */
+class CSwordPresenter : public KMainWindow, public CPointers {
+ Q_OBJECT
+public:
+ /**
+ * Default constructor
+ */
+ CSwordPresenter(ListCSwordModuleInfo useModules, QWidget *parent=0, const char *name=0);
+ /**
+ * Returns the features used by this presenter.
+ */
+ int getFeatures();
+ /**
+ * Refreshes the presenter.
+ */
+ virtual void refresh();
+ /**
+ * Returns the listof used modules.
+ */
+ ListCSwordModuleInfo& getModuleList();
+ /**
+ * Returns the caption for this Sword display window.
+ */
+ const QString windowCaption();
+ /**
+ * Stores the settings of this window in the CProfileWindow object given as parameter.
+ */
+ virtual void storeSettings( CProfileWindow* p );
+ /**
+ * Applies the settings given in the parameter to the window.
+ */
+ virtual void applySettings( CProfileWindow* settings );
+
+public slots: // Public slots
+ /**
+ * Look up the key given as parameter.
+ */
+ virtual void lookup(const QString&, const QString&);
+ /**
+ * Returns the used keychooser object of this presenter.
+ */
+ CKeyChooser* keyChooser() const;
+ /**
+ * Sets the caption of this display window
+ */
+ virtual void setCaption(const QString&);
+ /**
+ * Is called when a reference was dropped on this window.
+ */
+ virtual void referenceDropped(const QString&);
+ /** Reimplementation from KMainWindow. */
+ virtual bool queryClose();
+ /** Returns true if the display window is fully initialized. */
+ const bool initialized();
+ /**
+ * Inserts the action used by this display window in the given KAccel object.
+ */
+ static void insertKeyboardActions( KAccel* accel );
+
+protected: // Protected methods
+ /**
+ * Prints the key given as parameter.
+ */
+// void printKey(const QString& startKey, const QString& stopKey, CSwordModuleInfo* module);
+ /**
+ * Refreshes the supported features.
+ */
+// void refreshFeatures();
+ /**
+ * Is called when the presenter should be closed. To delete the presenter it emits "close(CPresenter*)".
+ */
+ virtual void closeEvent(QCloseEvent*e);
+ /** Initializes the accelerators used by this windows.
+ * Derived classes have to call this function too if the reimplemented this function.
+ * e.g.
+ * @code
+ * //init own additional accelerators
+ * CSwordPresenter::initAccel();
+ */
+ virtual void initAccels();
+
+ KToolBar* m_mainToolBar;
+
+ KPopupMenu* m_popup;
+ KPopupMenu* m_savePopup;
+ KPopupMenu* m_copyPopup;
+ KPopupMenu* m_printPopup;
+
+ QPopupMenu* m_lexiconPopup;
+ CKeyChooser* m_keyChooser;
+ CHTMLWidget* m_htmlWidget;
+
+ CModuleChooserBar* m_moduleChooserBar;
+ CDisplaySettingsButton* m_displaySettingsButton;
+
+ ListCSwordModuleInfo m_moduleList;
+ QString m_highlightedVerse;
+
+ KAccel* m_accel;
+
+ CSwordBackend::FilterOptionsBool m_moduleOptions;
+ CSwordBackend::DisplayOptionsBool m_displayOptions;
+
+protected slots: // Protected slots
+ void lookupWord(int ID);
+ /**
+ * Initilizes widget before shown and after constructor.
+ */
+ virtual void polish();
+ /**
+ * Is called when this display window looses the focus.
+ */
+ virtual void focusInEvent( QFocusEvent* e );
+ /**
+ * Is called when this display window looses the focus.
+ */
+ virtual void focusOutEvent( QFocusEvent* e );
+ /**
+ * Sets the display window to the initialized state.
+ */
+ void setInitialized();
+
+
+private:
+ int m_features;
+ bool m_initialized;
+
+signals: // Signals
+ void lookupInLexicon(const QString& text, const QString& lexicon);
+ void lookupInModule(const QString& module, const QString& text);
+ void closePresenter(CSwordPresenter*);
+
+};
+
+#endif
diff --git a/bibletime/frontend/searchdialog/Makefile.am b/bibletime/frontend/searchdialog/Makefile.am
new file mode 100644
index 0000000..bdcd8a4
--- /dev/null
+++ b/bibletime/frontend/searchdialog/Makefile.am
@@ -0,0 +1,26 @@
+INCLUDES = $(all_includes)
+
+libsearchdialog_a_METASOURCES = AUTO
+
+noinst_LIBRARIES = libsearchdialog.a
+
+libsearchdialog_a_SOURCES = \
+csearchdialog.cpp \
+csearchdialoganalysis.cpp \
+csearchdialogresultview.cpp \
+csearchdialogresult.cpp \
+csearchdialogtext.cpp \
+csearchdialogscope.cpp \
+csearchdialogmodulechooser.cpp
+
+all_headers = csearchdialogmodulechooser.h \
+csearchdialogtext.h \
+csearchdialogscope.h \
+csearchdialogresult.h \
+csearchdialogresultview.h \
+csearchdialoganalysis.h \
+csearchdialogmodulechooser.h \
+csearchdialog.h
+
+EXTRA_DIST = $(libsearchdialog_a_SOURCES) $(all_headers)
+
diff --git a/bibletime/frontend/searchdialog/Makefile.in b/bibletime/frontend/searchdialog/Makefile.in
new file mode 100644
index 0000000..29c86f8
--- /dev/null
+++ b/bibletime/frontend/searchdialog/Makefile.in
@@ -0,0 +1,646 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+INCLUDES = $(all_includes)
+
+#>- libsearchdialog_a_METASOURCES = AUTO
+
+noinst_LIBRARIES = libsearchdialog.a
+
+libsearchdialog_a_SOURCES = csearchdialog.cpp csearchdialoganalysis.cpp csearchdialogresultview.cpp csearchdialogresult.cpp csearchdialogtext.cpp csearchdialogscope.cpp csearchdialogmodulechooser.cpp
+
+
+all_headers = csearchdialogmodulechooser.h csearchdialogtext.h csearchdialogscope.h csearchdialogresult.h csearchdialogresultview.h csearchdialoganalysis.h csearchdialogmodulechooser.h csearchdialog.h
+
+
+EXTRA_DIST = $(libsearchdialog_a_SOURCES) $(all_headers)
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../../config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I../../..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libsearchdialog_a_LIBADD =
+#>- libsearchdialog_a_OBJECTS = csearchdialog.$(OBJEXT) \
+#>- csearchdialoganalysis.$(OBJEXT) csearchdialogresultview.$(OBJEXT) \
+#>- csearchdialogresult.$(OBJEXT) csearchdialogtext.$(OBJEXT) \
+#>- csearchdialogscope.$(OBJEXT) csearchdialogmodulechooser.$(OBJEXT)
+#>+ 9
+libsearchdialog_a_final_OBJECTS = libsearchdialog_a.all_cpp.o
+libsearchdialog_a_nofinal_OBJECTS = csearchdialog.$(OBJEXT) \
+csearchdialoganalysis.$(OBJEXT) csearchdialogresultview.$(OBJEXT) \
+csearchdialogresult.$(OBJEXT) csearchdialogtext.$(OBJEXT) \
+csearchdialogscope.$(OBJEXT) csearchdialogmodulechooser.$(OBJEXT)\
+csearchdialogresult.moc.o csearchdialog.moc.o csearchdialoganalysis.moc.o csearchdialogresultview.moc.o csearchdialogmodulechooser.moc.o csearchdialogscope.moc.o csearchdialogtext.moc.o \
+libsearchdialog_a_meta_unload.o
+@KDE_USE_FINAL_FALSE@libsearchdialog_a_OBJECTS = $(libsearchdialog_a_nofinal_OBJECTS)
+@KDE_USE_FINAL_TRUE@libsearchdialog_a_OBJECTS = $(libsearchdialog_a_final_OBJECTS)
+AR = ar
+CXXFLAGS = @CXXFLAGS@
+#>- CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+CXXLD = $(CXX)
+#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
+#>+ 1
+CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+#>- DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+#>+ 4
+KDE_DIST=csearchdialogresultview.h csearchdialogtext.h csearchdialogmodulechooser.h csearchdialogscope.h csearchdialoganalysis.h csearchdialog.h csearchdialogresult.h
+
+DISTFILES= $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
+
+
+TAR = tar
+GZIP_ENV = --best
+#>- DEP_FILES = .deps/csearchdialog.P .deps/csearchdialoganalysis.P \
+#>- .deps/csearchdialogmodulechooser.P .deps/csearchdialogresult.P \
+#>- .deps/csearchdialogresultview.P .deps/csearchdialogscope.P \
+#>- .deps/csearchdialogtext.P
+#>+ 10
+@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/csearchdialogresult.moc.P $(DEPDIR)/csearchdialog.moc.P $(DEPDIR)/csearchdialoganalysis.moc.P $(DEPDIR)/csearchdialogresultview.moc.P $(DEPDIR)/csearchdialogmodulechooser.moc.P $(DEPDIR)/csearchdialogscope.moc.P $(DEPDIR)/csearchdialogtext.moc.P $(DEPDIR)/libsearchdialog_a_meta_unload.P $(DEPDIR)/libsearchdialog_a.all_cpp.P \
+ .deps/csearchdialog.P .deps/csearchdialoganalysis.P \
+.deps/csearchdialogmodulechooser.P .deps/csearchdialogresult.P \
+.deps/csearchdialogresultview.P .deps/csearchdialogscope.P \
+.deps/csearchdialogtext.P
+@KDE_USE_FINAL_FALSE@DEP_FILES = $(DEPDIR)/csearchdialogresult.moc.P $(DEPDIR)/csearchdialog.moc.P $(DEPDIR)/csearchdialoganalysis.moc.P $(DEPDIR)/csearchdialogresultview.moc.P $(DEPDIR)/csearchdialogmodulechooser.moc.P $(DEPDIR)/csearchdialogscope.moc.P $(DEPDIR)/csearchdialogtext.moc.P $(DEPDIR)/libsearchdialog_a_meta_unload.P .deps/csearchdialog.P .deps/csearchdialoganalysis.P \
+.deps/csearchdialogmodulechooser.P .deps/csearchdialogresult.P \
+.deps/csearchdialogresultview.P .deps/csearchdialogscope.P \
+.deps/csearchdialogtext.P
+
+SOURCES = $(libsearchdialog_a_SOURCES)
+OBJECTS = $(libsearchdialog_a_OBJECTS)
+
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .cpp .lo .o .obj .s
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/searchdialog/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/searchdialog/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/frontend/searchdialog/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.s.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libsearchdialog.a: $(libsearchdialog_a_OBJECTS) $(libsearchdialog_a_DEPENDENCIES)
+ -rm -f libsearchdialog.a
+ $(AR) cru libsearchdialog.a $(libsearchdialog_a_OBJECTS) $(libsearchdialog_a_LIBADD)
+ $(RANLIB) libsearchdialog.a
+.cpp.o:
+ $(CXXCOMPILE) -c $<
+.cpp.obj:
+ $(CXXCOMPILE) -c `cygpath -w $<`
+.cpp.lo:
+ $(LTCXXCOMPILE) -c $<
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/frontend/searchdialog
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/frontend/searchdialog/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+ -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+ @echo '$(COMPILE) -c $<'; \
+ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.c
+ @echo '$(LTCOMPILE) -c $<'; \
+ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+
+%.o: %.cpp
+ @echo '$(CXXCOMPILE) -c $<'; \
+ $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.cpp
+ @echo '$(LTCXXCOMPILE) -c $<'; \
+ $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
+ mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+#>- clean-am: clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+#>- clean-depend clean-generic mostlyclean-am
+#>+ 2
+clean-am: clean-metasources clean-moc-classes clean-final clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+ clean-depend clean-generic mostlyclean-am
+
+#>- clean: clean-am
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+distclean-am: distclean-noinstLIBRARIES distclean-compile \
+ distclean-libtool distclean-tags distclean-depend \
+ distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-tags maintainer-clean-depend \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 3
+csearchdialogresult.moc.cpp: $(srcdir)/csearchdialogresult.h
+ $(MOC) $(srcdir)/csearchdialogresult.h -o csearchdialogresult.moc.cpp
+
+#>+ 3
+csearchdialog.moc.cpp: $(srcdir)/csearchdialog.h
+ $(MOC) $(srcdir)/csearchdialog.h -o csearchdialog.moc.cpp
+
+#>+ 3
+csearchdialoganalysis.moc.cpp: $(srcdir)/csearchdialoganalysis.h
+ $(MOC) $(srcdir)/csearchdialoganalysis.h -o csearchdialoganalysis.moc.cpp
+
+#>+ 3
+csearchdialogresultview.moc.cpp: $(srcdir)/csearchdialogresultview.h
+ $(MOC) $(srcdir)/csearchdialogresultview.h -o csearchdialogresultview.moc.cpp
+
+#>+ 3
+csearchdialogmodulechooser.moc.cpp: $(srcdir)/csearchdialogmodulechooser.h
+ $(MOC) $(srcdir)/csearchdialogmodulechooser.h -o csearchdialogmodulechooser.moc.cpp
+
+#>+ 3
+csearchdialogscope.moc.cpp: $(srcdir)/csearchdialogscope.h
+ $(MOC) $(srcdir)/csearchdialogscope.h -o csearchdialogscope.moc.cpp
+
+#>+ 3
+csearchdialogtext.moc.cpp: $(srcdir)/csearchdialogtext.h
+ $(MOC) $(srcdir)/csearchdialogtext.h -o csearchdialogtext.moc.cpp
+
+#>+ 3
+clean-metasources:
+ -rm -f csearchdialogresult.moc.cpp csearchdialog.moc.cpp csearchdialoganalysis.moc.cpp csearchdialogresultview.moc.cpp csearchdialogmodulechooser.moc.cpp csearchdialogscope.moc.cpp csearchdialogtext.moc.cpp
+
+#>+ 2
+docs-am:
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/searchdialog/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/frontend/searchdialog/Makefile.in
+
+
+#>+ 10
+libsearchdialog_a_meta_unload.cpp: csearchdialogresult.moc.cpp csearchdialog.moc.cpp csearchdialogmodulechooser.moc.cpp csearchdialogresultview.moc.cpp csearchdialoganalysis.moc.cpp csearchdialogscope.moc.cpp csearchdialogtext.moc.cpp
+ @echo 'creating libsearchdialog_a_meta_unload.cpp'
+ @-rm -f libsearchdialog_a_meta_unload.cpp
+ @echo 'static const char * _metalist_libsearchdialog_a[] = {' > libsearchdialog_a_meta_unload.cpp
+ @cat csearchdialogresult.moc.cpp csearchdialog.moc.cpp csearchdialogmodulechooser.moc.cpp csearchdialogresultview.moc.cpp csearchdialoganalysis.moc.cpp csearchdialogscope.moc.cpp csearchdialogtext.moc.cpp | grep 'char.*className' | sed -e 's/.*[^A-Za-z0-9_:]\([A-Za-z0-9_:]*\)::className.*$$/\"\1\",/' | sort | uniq >> libsearchdialog_a_meta_unload.cpp
+ @echo '0};' >> libsearchdialog_a_meta_unload.cpp
+ @echo '#include <kunload.h>' >> libsearchdialog_a_meta_unload.cpp
+ @echo '_UNLOAD(libsearchdialog_a)' >> libsearchdialog_a_meta_unload.cpp
+
+
+#>+ 3
+clean-moc-classes:
+ -rm -f libsearchdialog_a_meta_unload.cpp
+
+#>+ 11
+libsearchdialog_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/csearchdialog.cpp $(srcdir)/csearchdialoganalysis.cpp $(srcdir)/csearchdialogresultview.cpp $(srcdir)/csearchdialogresult.cpp $(srcdir)/csearchdialogtext.cpp $(srcdir)/csearchdialogscope.cpp $(srcdir)/csearchdialogmodulechooser.cpp libsearchdialog_a_meta_unload.cpp csearchdialogresult.moc.cpp csearchdialog.moc.cpp csearchdialoganalysis.moc.cpp csearchdialogresultview.moc.cpp csearchdialogmodulechooser.moc.cpp csearchdialogscope.moc.cpp csearchdialogtext.moc.cpp
+ @echo 'creating libsearchdialog_a.all_cpp.cpp ...'; \
+ rm -f libsearchdialog_a.all_cpp.files libsearchdialog_a.all_cpp.final; \
+ echo "#define KDE_USE_FINAL 1" >> libsearchdialog_a.all_cpp.final; \
+ for file in csearchdialog.cpp csearchdialoganalysis.cpp csearchdialogresultview.cpp csearchdialogresult.cpp csearchdialogtext.cpp csearchdialogscope.cpp csearchdialogmodulechooser.cpp libsearchdialog_a_meta_unload.cpp csearchdialogresult.moc.cpp csearchdialog.moc.cpp csearchdialoganalysis.moc.cpp csearchdialogresultview.moc.cpp csearchdialogmodulechooser.moc.cpp csearchdialogscope.moc.cpp csearchdialogtext.moc.cpp; do \
+ echo "#include \"$$file\"" >> libsearchdialog_a.all_cpp.files; \
+ test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libsearchdialog_a.all_cpp.final; \
+ done; \
+ cat libsearchdialog_a.all_cpp.final libsearchdialog_a.all_cpp.files > libsearchdialog_a.all_cpp.cpp; \
+ rm -f libsearchdialog_a.all_cpp.final libsearchdialog_a.all_cpp.files
+
+#>+ 3
+clean-final:
+ -rm -f libsearchdialog_a.all_cpp.cpp
+
+#>+ 2
+final:
+ $(MAKE) libsearchdialog_a_OBJECTS="$(libsearchdialog_a_final_OBJECTS)" all-am
+#>+ 2
+no-final:
+ $(MAKE) libsearchdialog_a_OBJECTS="$(libsearchdialog_a_nofinal_OBJECTS)" all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/frontend/searchdialog/csearchdialog.cpp b/bibletime/frontend/searchdialog/csearchdialog.cpp
new file mode 100644
index 0000000..fe1965a
--- /dev/null
+++ b/bibletime/frontend/searchdialog/csearchdialog.cpp
@@ -0,0 +1,290 @@
+/***************************************************************************
+ csearchdialog.cpp - description
+ -------------------
+ begin : Wed Jan 19 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "csearchdialog.h"
+#include "csearchdialogmodulechooser.h"
+#include "csearchdialogtext.h"
+#include "csearchdialogresult.h"
+#include "csearchdialoganalysis.h"
+#include "csearchdialogscope.h"
+#include "frontend/chtmldialog.h"
+#include "backend/cswordmodulesearch.h"
+#include "backend/cswordversekey.h"
+#include "backend/cswordmoduleinfo.h"
+#include "frontend/ctoolclass.h"
+#include "frontend/cbtconfig.h"
+#include "resource.h"
+
+//KDE includes
+#include <kapp.h>
+#include <klocale.h>
+#include <kkeydialog.h>
+#include <kfontdialog.h>
+#include <kfiledialog.h>
+#include <kapp.h>
+
+//QT includes
+#include <qlabel.h>
+#include <qframe.h>
+#include <qbutton.h>
+#include <qdict.h>
+#include <qlayout.h>
+#include <qhbox.h>
+#include <qvbox.h>
+#include <qgrid.h>
+#include <qhbuttongroup.h>
+#include <qpushbutton.h>
+#include <qcanvas.h>
+
+CSearchDialog::CSearchDialog( ListCSwordModuleInfo& modules, QWidget *parent, const char *name )
+ : KDialogBase(Tabbed, i18n("Search Dialog"), Close | User1 | User2, User1, parent, name, false, true, i18n("Search"), i18n("Interrupt"), QString::null)
+{
+ setIcon(MODULE_SEARCH_ICON_SMALL);
+ m_searcher.connectPercentUpdate(this, SLOT(percentUpdate()));
+ m_searcher.connectFinished(this, SLOT(searchFinished()));
+
+ initView();
+ readSettings();
+
+ setModuleList( modules );
+ if (modules.count())
+ showPage(pageIndex(m_searchTextPage));
+}
+
+CSearchDialog::~CSearchDialog(){
+ saveSettings();
+}
+
+/** Reads the settings from the configfile */
+void CSearchDialog::readSettings(){
+}
+
+/** Saves the settings to the config file */
+void CSearchDialog::saveSettings(){
+}
+
+/** Initializs the view */
+void CSearchDialog::initView() {
+ enableButton(User2,false);
+
+ m_moduleChooserPage = addVBoxPage(i18n("Choose modules"), i18n("Choose the modules for the search"));
+ m_moduleChooser = new CSearchDialogModuleChooser(m_moduleChooserPage);
+ connect(m_moduleChooser, SIGNAL(chosenModulesChanged()), SLOT(chosenModulesChanged()));
+
+ m_searchTextPage = addVBoxPage(i18n("Search Text"), i18n("Enter the text to search for"));
+ m_searchText = new CSearchDialogText(m_searchTextPage);
+ m_searchTextPage->setEnabled(false);
+
+ m_searchResultPage = addHBoxPage(i18n("Search Result"), i18n("The result of your search"));
+ m_searchResult = new CSearchDialogResult(m_searchResultPage);
+ m_searchResultPage->setEnabled(false);
+
+ m_searchAnalysisPage = addVBoxPage(i18n("Search Analysis"), i18n("Graphical analysis of your search result"));
+ m_searchAnalysis = new CSearchDialogAnalysis(m_searchAnalysisPage);
+ m_searchAnalysisView = new CSearchDialogAnalysisView(m_searchAnalysis, m_searchAnalysisPage);
+ m_searchAnalysisPage->setEnabled(false);
+
+ m_searchAnalysisSaveButton = new QPushButton("Save Analysis to Disk", m_searchAnalysisPage);
+
+ connect(m_searchAnalysisSaveButton, SIGNAL(clicked()),
+ this, SLOT(slotSaveSearchAnalysis()));
+}
+
+ListCSwordModuleInfo& CSearchDialog::getModuleList() {
+// ASSERT(moduleList);
+ m_moduleList = m_moduleChooser->getChosenModules();
+ return m_moduleList;
+}
+
+void CSearchDialog::setModuleList(ListCSwordModuleInfo& list) {
+ //if (m_moduleList != list) // this is an inefficient hack to allow compile on gcc3 ???WDG
+ m_moduleList = list; //copy the items of "list"
+
+ m_moduleChooser->blockSignals(true);
+ m_moduleChooser->setChosenModules(m_moduleList);
+ m_moduleChooser->blockSignals(false);
+
+ m_searchTextPage->setEnabled(m_moduleList.count()>0);
+ m_searchResult->clearResult();
+ m_searchAnalysis->reset();
+}
+
+void CSearchDialog::slotSaveSearchAnalysis(){
+ const QString file = KFileDialog::getSaveFileName(QString::null, QString::fromLatin1("*.html | %1").arg(i18n("HTML files")), 0, i18n("Save Search Analysis"));
+ if (!file.isNull()) {
+ int moduleIndex = 0;
+ int count = 0;
+ QString countStr = "";
+ QString m_searchAnalysisHTML = "";
+ QString tableTitle = "";
+ QString tableTotals = "";
+ QString VerseRange = "";
+ const QString txtCSS = QString::fromLatin1("<style type='text/css'>\nTD {border: thin solid black;}\nTH {font-size: 130%;text-align: left;vertical-align:top;}\n</style>\n");
+ CSwordVerseKey key(0);
+ ListKey searchResult;
+
+ key.key("Genesis 1:1");
+
+ if (m_searchText->scopeChooser->getScopeType() != CSwordModuleSearch::Scope_NoScope) {
+ ListKey verses = m_searcher.scope();
+ for (int i = 0; i < verses.Count(); ++i) {
+ VerseKey* element = dynamic_cast<VerseKey*>(verses.GetElement(i));
+ if (element) {
+ VerseRange += QString("%1 - %2").arg(QString::fromLocal8Bit((const char*)element->LowerBound())).arg(QString::fromLocal8Bit((const char*)element->UpperBound())) + "<br>";
+ }
+ }
+ }
+
+ QDict<CSearchDialogAnalysisItem>* m_searchAnalysisItems = m_searchAnalysis->getSearchAnalysisItemList();
+ CSearchDialogAnalysisItem* analysisItem = m_searchAnalysisItems->find( key.book() );
+
+ QString text = "<html>\n<head>\n<title>" + i18n("BibleTime Search Analysis") + "</title>\n" + txtCSS + "</head>\n<body>\n";
+ text += "<table>\n<tr><th>" + i18n("Search Text :") + "</th><th>" + m_searchText->getText() + "</th></tr>\n";
+ text += "<tr><th>" + i18n("Search Type :") + "</th><th>" + m_searchText->getSearchTypeString() + "</th></tr>\n";
+ text += "<tr><th>" + i18n("Search Scope:") + "</th><th>" + ((m_searchText->scopeChooser->getScopeType() != CSwordModuleSearch::Scope_NoScope) ? VerseRange : m_searchText->scopeChooser->getScopeTypeString()) + "</th></tr>\n</table>\n<br>\n";
+
+
+ tableTitle = "<tr><th align=\"left\">" + i18n("Book") + "</th>";
+ tableTotals = "<tr><td align=\"left\">" + i18n("Total Hits") + "</td>";
+ for (moduleIndex = 0,m_moduleList.first(); m_moduleList.current(); m_moduleList.next(),++moduleIndex) {
+ tableTitle += QString::fromLatin1("<th align=\"left\">") + m_moduleList.current()->name() + QString::fromLatin1("</th>");
+ searchResult = m_moduleList.current()->searchResult();
+ countStr.setNum(searchResult.Count());
+ tableTotals += QString::fromLatin1("<td align=\"right\">") + countStr + QString::fromLatin1("</td>");
+ }
+ tableTitle += QString::fromLatin1("</tr>\n");
+ tableTotals += QString::fromLatin1("</tr>\n");
+
+ m_searchAnalysisHTML = "";
+ bool ok = true;
+ while (ok) {
+ m_searchAnalysisHTML += QString::fromLatin1("<tr><td>") + key.book() + QString::fromLatin1("</td>");
+ analysisItem = m_searchAnalysisItems->find( key.book() );
+ for (moduleIndex = 0,m_moduleList.first(); m_moduleList.current(); m_moduleList.next(), ++moduleIndex) {
+ count = analysisItem->getCountForModule(moduleIndex);
+ countStr.setNum(count);
+ m_searchAnalysisHTML += QString::fromLatin1("<td align=\"right\">") + countStr + QString::fromLatin1("</td>");
+ }
+ m_searchAnalysisHTML += QString::fromLatin1("</tr>\n");
+ ok = key.next(CSwordVerseKey::UseBook);
+ }
+ text += QString::fromLatin1("<table>\n") + tableTitle + tableTotals + m_searchAnalysisHTML + QString::fromLatin1("</table>\n");
+ text += QString::fromLatin1("<center>") + i18n("Created by") + QString::fromLatin1(" <a href=\"http://www.bibletime.de/\">BibleTime</a></center>");
+ text += QString::fromLatin1("</body></html>");
+ CToolClass::savePlainFile(file, text);
+ }
+}
+
+void CSearchDialog::slotUser1() {
+ startSearch();
+}
+
+void CSearchDialog::slotUser2() {
+// if (searcher->isSearching())
+ m_searcher.interruptSearch();
+}
+
+void CSearchDialog::startSearch(void) {
+ int searchFlags = m_searchText->getSearchType();
+ // set the parameters
+ m_searchText->updateCurrentProgress(0);
+ m_searchText->updateOverallProgress(0);
+ m_searchText->setText( m_searchText->getText() );
+
+ m_searcher.setModules( getModuleList() );
+ m_searcher.setSearchedText(m_searchText->getText());
+
+ if (m_searchText->isCaseSensitive())
+ searchFlags |= CSwordModuleSearch::caseSensitive;
+ m_searcher.resetSearchScope();
+ CSwordModuleSearch::scopeType scopeType = m_searchText->scopeChooser->getScopeType();
+
+ if (scopeType == CSwordModuleSearch::Scope_LastSearch) {
+ searchFlags |= CSwordModuleSearch::useLastResult;
+ }
+ else if ( scopeType == CSwordModuleSearch::Scope_Bounds ) {
+ searchFlags |= CSwordModuleSearch::useScope;
+ m_searcher.setSearchScope( m_searchText->scopeChooser->getScope() );
+ }
+ m_searcher.setSearchOptions(searchFlags);
+ enableButton(User1,false);
+ enableButton(User2,true);
+ m_searchAnalysis->reset();
+ m_searchResult->clearResult();
+
+ m_searcher.startSearchThread();
+}
+
+void CSearchDialog::setSearchText(const QString text){
+ m_searchText->setText(text);
+ if (!text.isEmpty())
+ showPage(pageIndex(m_searchTextPage));
+}
+
+/** Returns the search text. If no text was entered return QString::null. */
+const QString CSearchDialog::getSearchedText() const {
+ return m_searchText->getText();
+}
+
+/** No descriptions */
+void CSearchDialog::chosenModulesChanged(){
+ setModuleList(getModuleList());
+}
+
+/** Reimplementation to show the "First time opened" dialog. */
+void CSearchDialog::show(){
+ KDialogBase::show();
+
+ if ( CBTConfig::get(CBTConfig::firstSearchDialog) ){
+ CHTMLDialog dlg(HELPDIALOG_FIRSTTIME_SEARCH);
+ dlg.exec();
+ CBTConfig::set(CBTConfig::firstSearchDialog, false);
+ }
+}
+
+/** No descriptions */
+void CSearchDialog::searchFinished(){
+// qWarning("CSearchDialog::searchFinished()");
+ m_searchText->updateCurrentProgress(100);
+ m_searchText->updateOverallProgress(100);
+ m_searchAnalysis->reset();
+ if ( m_searcher.foundItems() ){
+ m_searchResult->setModuleList(getModuleList());
+ m_searchAnalysis->setModuleList(getModuleList());
+ m_searchAnalysisView->setContentsPos(0,0);
+ m_searchResultPage->setEnabled(true);
+ m_searchAnalysisPage->setEnabled(true);
+ showPage(pageIndex(m_searchResultPage)); //the result page
+
+ m_searchAnalysis->analyse();
+ }
+ else
+ m_searchResult->clearResult();
+
+ enableButton(User2,false);
+ enableButton(User1,true);
+}
+
+/** No descriptions */
+void CSearchDialog::percentUpdate(){
+// old_overallProgress = m_searcher.getPercent(CSwordModuleSearch::currentModule);
+ m_searchText->updateOverallProgress(m_searcher.getPercent(CSwordModuleSearch::allModules));
+
+// old_currentProgress = m_searcher.getPercent(CSwordModuleSearch::currentModule);
+ m_searchText->updateCurrentProgress(m_searcher.getPercent(CSwordModuleSearch::currentModule));
+ KApplication::kapp->processEvents();
+}
diff --git a/bibletime/frontend/searchdialog/csearchdialog.h b/bibletime/frontend/searchdialog/csearchdialog.h
new file mode 100644
index 0000000..ae7a332
--- /dev/null
+++ b/bibletime/frontend/searchdialog/csearchdialog.h
@@ -0,0 +1,136 @@
+/***************************************************************************
+ csearchdialog.h - description
+ -------------------
+ begin : Wed Jan 19 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+/* $HEADER */
+/* $REVISION */
+
+#ifndef CSEARCHDIALOG_H
+#define CSEARCHDIALOG_H
+
+//BibleTime includes
+#include "backend/cswordmoduleinfo.h"
+#include "backend/cswordmodulesearch.h"
+#include "frontend/cpointers.h"
+
+//QT includes
+
+//KDE includes
+#include <kdialogbase.h>
+#include <kaccel.h>
+
+
+class QPushButton;
+class QHBox;
+class QVBox;
+class QGrid;
+class CSearchDialogModuleChooser;
+class CSearchDialogText;
+class CSearchDialogScopeEdit;
+class CSearchDialogResult;
+class CSearchDialogAnalysis;
+class CSearchDialogAnalysisView;
+
+class CSwordModuleInfo;
+class CSwordModuleSearch;
+
+/**
+ * The searchdialog of BibleTime
+ * @author The BibleTime Team
+ */
+class CSearchDialog : public KDialogBase, public CPointers {
+ Q_OBJECT
+public:
+ /**
+ * The constructor of the CSearchDialog class.
+ * @param parent The widget this dialog is centered on
+ * @param name The name of this Qt widget
+ */
+ CSearchDialog(ListCSwordModuleInfo& modules,QWidget *parent=0, const char *name=0 );
+ ~CSearchDialog();
+ /**
+ *
+ */
+ ListCSwordModuleInfo& getModuleList();
+ /**
+ * Sets the module list for this dialog.
+ * The module lsit contains the modules where we should search in
+ */
+ void setModuleList(ListCSwordModuleInfo&);
+ /**
+ * Sets the text we should search in the modules
+ */
+ void setSearchText(const QString);
+ /**
+ * Reimplementation from Qt.
+ * This is used to refresh the progres bars
+ * and to switch to the resultpage if the search was finished.
+ */
+// virtual void timerEvent(QTimerEvent *e);
+ /**
+ * Returns the search text. If no text was enetered return QSTring::null.
+ */
+ const QString getSearchedText() const;
+ void startSearch();
+
+protected: // Protected methods
+ /**
+ * Initializs the view
+ */
+ void initView();
+ /**
+ * Reads the settings from the configfile
+ */
+ void readSettings();
+ /**
+ * Saves the settings of this widget to the config file
+ */
+ void saveSettings();
+
+private:
+ friend class CSearchDialogResult;
+ QVBox* m_moduleChooserPage;
+ QVBox* m_searchTextPage;
+ QHBox* m_searchResultPage;
+ QVBox* m_searchAnalysisPage;
+ CSearchDialogModuleChooser *m_moduleChooser;
+ CSearchDialogText *m_searchText;
+ CSearchDialogResult *m_searchResult;
+ CSearchDialogAnalysis* m_searchAnalysis;
+ CSearchDialogAnalysisView* m_searchAnalysisView;
+ CSwordModuleSearch m_searcher;
+ ListCSwordModuleInfo m_moduleList;
+// int old_overallProgress;
+// int old_currentProgress;
+
+ QPushButton* m_searchAnalysisSaveButton;
+
+private slots: // Private slots
+ void chosenModulesChanged();
+ virtual void slotUser1();
+ virtual void slotUser2();
+ void slotSaveSearchAnalysis();
+ void searchFinished();
+ void percentUpdate();
+
+public slots: // Public slots
+ /**
+ * Reimplementation to show the "First time opened" dialog.
+ */
+ virtual void show();
+};
+
+#endif
diff --git a/bibletime/frontend/searchdialog/csearchdialoganalysis.cpp b/bibletime/frontend/searchdialog/csearchdialoganalysis.cpp
new file mode 100644
index 0000000..fa0784a
--- /dev/null
+++ b/bibletime/frontend/searchdialog/csearchdialoganalysis.cpp
@@ -0,0 +1,446 @@
+/***************************************************************************
+ csearchdialoganalysis.cpp - description
+ -------------------
+ begin : Sat Mar 4 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+#include "csearchdialoganalysis.h"
+#include "backend/cswordmoduleinfo.h"
+#include "backend/cswordbiblemoduleinfo.h"
+#include "backend/cswordcommentarymoduleinfo.h"
+#include "backend/cswordlexiconmoduleinfo.h"
+#include "backend/cswordversekey.h"
+#include "backend/cswordbackend.h"
+#include "frontend/ctoolclass.h"
+#include "csearchdialog.h"
+#include "whatsthisdef.h"
+
+//QT includes
+#include <qpixmap.h>
+#include <qdatetime.h>
+#include <qlist.h>
+#include <qpicture.h>
+#include <qpainter.h>
+#include <qtooltip.h>
+#include <qrect.h>
+#include <qpoint.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qstring.h>
+
+//KDE includes
+#include <kfiledialog.h>
+#include <klocale.h>
+#include <kapp.h>
+
+//Sword includes
+#include <swkey.h>
+#include <swmodule.h>
+#include <versekey.h>
+
+//library includes
+#include <iostream.h>
+
+//our defines
+#define SPACE_BETWEEN_PARTS 5
+#define RIGHT_BORDER 15
+#define LEFT_BORDER 15
+#define LOWER_BORDER 10
+#define UPPER_BORDER 10
+
+#define ITEM_TEXT_SIZE 8
+#define LABEL_TEXT_SIZE 6
+
+//used for the shift between the bars
+#define BAR_DELTAX 4
+#define BAR_DELTAY 2
+#define BAR_WIDTH 2+2*BAR_DELTAX //should be equal or bigger than the label font size
+//used for the text below the bars
+#define BAR_LOWER_BORDER 100
+
+#define LEGEND_INNER_BORDER 5
+#define LEGEND_DELTAY 4
+#define LEGEND_WIDTH 85
+
+CSearchDialogAnalysis::CSearchDialogAnalysis(QObject *parent, const char *name )
+ : QCanvas(parent,name) {
+
+ m_scaleFactor = 0.0;
+ m_legend = 0;
+ setBackgroundColor(Qt::white);
+ m_canvasItemList.resize(67);
+ m_canvasItemList.setAutoDelete(true);
+ resize(1,1);
+ connect(this, SIGNAL(resized()), SLOT(slotResized()));
+}
+
+CSearchDialogAnalysis::~CSearchDialogAnalysis(){
+// qWarning("CSearchDialogAnalysis::~CSearchDialogAnalysis()");
+ reset(); // deletes the legend and the items
+}
+
+QDict<CSearchDialogAnalysisItem>* CSearchDialogAnalysis::getSearchAnalysisItemList(){
+ // Returns pointer to the search analysis items
+ return &m_canvasItemList;
+}
+
+/** Starts the analysis of the search result. This should be called only once because QCanvas handles the updates automatically. */
+void CSearchDialogAnalysis::analyse(){
+ qDebug("void CSearchDialogAnalysis::analyse()");
+ /**
+ * Steps of analysing our search result;
+ * -Create the items for all available books ("Genesis" - "Revelation")
+ * -Iterate through all modules we analyse
+ * -Go through all books of this module
+ * -Find out how many times we found the book
+ * -Set the count to the items which belongs to the book
+ */
+ m_lastPosList.clear();
+ const int numberOfModules = m_moduleList.count();
+ if (!numberOfModules)
+ return;
+ m_legend = new CSearchDialogAnalysisLegendItem(this, &m_moduleList);
+ m_legend->setX(LEFT_BORDER);
+ m_legend->setY(UPPER_BORDER);
+ m_legend->setSize(LEGEND_WIDTH,
+ LEGEND_INNER_BORDER*2 + ITEM_TEXT_SIZE*numberOfModules + LEGEND_DELTAY*(numberOfModules-1));
+ m_legend->show();
+
+ int xPos = LEFT_BORDER + m_legend->width() + SPACE_BETWEEN_PARTS;
+ int moduleIndex = 0;
+ m_maxCount = 0;
+ int count = 0;
+ CSwordVerseKey key(0);
+ key.key("Genesis 1:1");
+
+ CSearchDialogAnalysisItem* analysisItem = m_canvasItemList[key.book()];
+ bool ok = true;
+ while (ok && analysisItem) {
+ for (moduleIndex = 0,m_moduleList.first(); m_moduleList.current(); m_moduleList.next(),++moduleIndex) {
+ KApplication::kApplication()->processEvents(10);
+ if (!m_lastPosList.contains(m_moduleList.current()))
+ m_lastPosList.insert(m_moduleList.current(),0);
+ analysisItem->setCountForModule(moduleIndex, (count = getCount(key.book(),m_moduleList.current())));
+ m_maxCount = (count > m_maxCount) ? count : m_maxCount;
+ }
+ analysisItem->setX(xPos);
+ analysisItem->setY(UPPER_BORDER);
+ analysisItem->show();
+
+ xPos += (int)analysisItem->width() + SPACE_BETWEEN_PARTS;
+ ok = key.next(CSwordVerseKey::UseBook);
+ analysisItem = m_canvasItemList[key.book()];
+ }
+ resize(xPos+BAR_WIDTH+(m_moduleList.count()-1)*BAR_DELTAX+RIGHT_BORDER, height() );
+ slotResized();
+}
+
+/** Sets te module list used for the analysis. */
+void CSearchDialogAnalysis::setModuleList(ListCSwordModuleInfo& modules){
+// ASSERT(modules);
+ m_moduleList.clear();
+ for (modules.first(); modules.current(); modules.next())
+ if ( modules.current()->type() == CSwordModuleInfo::Bible || modules.current()->type() == CSwordModuleInfo::Commentary )//a Bible or an commentary
+ m_moduleList.append(modules.current());
+
+ m_canvasItemList.clear();
+ CSearchDialogAnalysisItem* analysisItem = 0;
+ CSwordVerseKey key(0);
+ key.key("Genesis 1:1");
+ do {
+ analysisItem = new CSearchDialogAnalysisItem(this, m_moduleList.count(), key.book(), &m_scaleFactor, &m_moduleList);
+ analysisItem->hide();
+ m_canvasItemList.insert(key.book(), analysisItem);
+ } while (key.next(CSwordVerseKey::UseBook));
+ update();
+}
+
+/** Sets back the items and deletes things to cleanup */
+void CSearchDialogAnalysis::reset(){
+ m_scaleFactor = 0.0;
+ QDictIterator<CSearchDialogAnalysisItem> it( m_canvasItemList ); // iterator for items
+ while ( it.current() ) {
+ it.current()->hide();
+ ++it;
+ }
+ m_lastPosList.clear();
+
+ if (m_legend)
+ m_legend->hide();
+ delete m_legend;
+ m_legend = 0;
+ update();
+}
+
+/** No descriptions */
+void CSearchDialogAnalysis::slotResized(){
+ m_scaleFactor = (double)( (double)(height()-UPPER_BORDER-LOWER_BORDER-BAR_LOWER_BORDER-(m_moduleList.count()-1)*BAR_DELTAY)
+ /(double)m_maxCount);
+ QDictIterator<CSearchDialogAnalysisItem> it( m_canvasItemList );
+ while ( it.current() ) {
+ it.current()->setSize(BAR_WIDTH + (m_moduleList.count()-1)*BAR_DELTAX, height()-UPPER_BORDER-LOWER_BORDER);
+ it.current()->setY(UPPER_BORDER);
+ ++it;
+ }
+ update();
+}
+
+/** This function returns a color for each module */
+QColor CSearchDialogAnalysis::getColor(int index){
+ switch (index){
+ case 0: return Qt::red;
+ case 1: return Qt::darkGreen;
+ case 2: return Qt::blue;
+ case 3: return Qt::cyan;
+ case 4: return Qt::magenta;
+ case 5: return Qt::darkRed;
+ case 6: return Qt::darkGray;
+ case 7: return Qt::black;
+ case 8: return Qt::darkCyan;
+ case 9: return Qt::darkMagenta;
+ default: return Qt::red;
+ }
+}
+
+/** Returns the count of the book in the module */
+const unsigned int CSearchDialogAnalysis::getCount( const QString book, CSwordModuleInfo* module ){
+ ListKey& result = module->searchResult();
+ const int length = book.length();
+ unsigned int i = m_lastPosList[module];
+ unsigned int count = 0;
+ const unsigned int resultCount = result.Count();
+ while (i < resultCount) {
+ if ( strncmp(book.local8Bit(), (const char*)*result.GetElement(i), length) )
+ break;
+ i++;
+ ++count;
+ }
+ m_lastPosList.contains(module) ? m_lastPosList.replace(module,i) : m_lastPosList.insert(module,i);
+// m_lastPosList.replace(module,i);
+ return count;
+}
+
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+CSearchDialogAnalysisItem::CSearchDialogAnalysisItem(QCanvas *parent, const int moduleCount, const QString &bookname, double *scaleFactor, ListCSwordModuleInfo* modules)
+ : QCanvasRectangle(parent),
+ m_moduleList( modules ),
+ m_scaleFactor(scaleFactor),
+ m_bookName(bookname),
+ m_moduleCount(moduleCount),
+ m_bufferPixmap(0)
+{
+ m_resultCountArray.resize(m_moduleCount);
+ int index = 0;
+ for (index = 0; index < m_moduleCount; ++index)
+ m_resultCountArray[index] = 0;
+}
+
+CSearchDialogAnalysisItem::~CSearchDialogAnalysisItem() {
+// qWarning("CSearchDialogAnalysisItem::~CSearchDialogAnalysisItem()");
+// if (m_bufferPixmap)
+ delete m_bufferPixmap;
+}
+
+/** Sets the resultcount of this item for the given module */
+void CSearchDialogAnalysisItem::setCountForModule( const int moduleIndex, const int count) {
+ m_resultCountArray[moduleIndex] = count;
+}
+
+/** Returns the resultcount of this item for the given module */
+int CSearchDialogAnalysisItem::getCountForModule( const int moduleIndex) {
+ return m_resultCountArray[moduleIndex];
+}
+
+/** Reimplementation. Draws the content of this item. */
+void CSearchDialogAnalysisItem::draw(QPainter& painter) {
+ QFont f = painter.font();
+ f.setPointSize(ITEM_TEXT_SIZE);
+ painter.setFont(f);
+
+ setPen(QPen(black,1));
+ setBrush(Qt::red);
+ /**
+ * We have to paint so many bars as we have modules available (we use m_moduleCount)
+ * We paint inside the area which is given by height and widt of this rectangle item
+ */
+ int index = 0;
+ int drawn = 0;
+ int Value = 0;
+
+ //find out the biggest value
+ for (index=0;index < m_moduleCount; index++)
+ if (m_resultCountArray[index] > Value)
+ Value = m_resultCountArray[index];
+
+ while (drawn < m_moduleCount){
+ for (index=0; index < m_moduleCount; index++){
+ if (m_resultCountArray[index] == Value){
+ QPoint p1((int)x()+(m_moduleCount-drawn-1)*BAR_DELTAX,
+ height()+(int)y()-BAR_LOWER_BORDER-(m_moduleCount-drawn)*BAR_DELTAY);
+ QPoint p2((int)p1.x() + BAR_WIDTH,
+ (int)(p1.y() - (!m_resultCountArray[index] ? 0 : ((m_resultCountArray[index])*(*m_scaleFactor))) ));
+ QRect r(p1, p2);
+ painter.fillRect(r, QBrush(CSearchDialogAnalysis::getColor(index)) );
+ painter.drawRect(r);
+ drawn++;
+ }
+ }
+ //finds the next smaller value
+ int newValue = 0;
+ for (index=0;index < m_moduleCount; index++)
+ if (m_resultCountArray[index] < Value && m_resultCountArray[index] >= newValue)
+ newValue = m_resultCountArray[index];
+ Value = newValue;
+ }
+ if (!m_bufferPixmap) {
+ m_bufferPixmap = new QPixmap();
+ m_bufferPixmap->resize(width(),BAR_LOWER_BORDER);
+ m_bufferPixmap->fill();
+ QPainter p(m_bufferPixmap);
+ f = p.font();
+ f.setPointSize(ITEM_TEXT_SIZE);
+ p.setFont(f);
+ p.rotate(90);
+ p.drawText(QPoint(5,0), m_bookName);
+ }
+ painter.drawPixmap(QPoint((int)x(),height()+(int)y()-BAR_LOWER_BORDER), *m_bufferPixmap);
+}
+
+/** Returns the width of this item. */
+int CSearchDialogAnalysisItem::width(){
+ return m_moduleCount*(m_moduleCount>1 ? BAR_DELTAX : 0) + BAR_WIDTH;
+}
+
+/** Returns the tooltip for this item. */
+const QString CSearchDialogAnalysisItem::getToolTip(){
+ QString ret = QString::fromLatin1("<CENTER><B>%1</B></CENTER><HR>").arg(m_bookName);
+ ret.append("<TABLE CELLPADDING=\"3\" WIDTH=\"100%\" ALIGN=\"center\">");
+ for (int i = 0; i < m_moduleCount; ++i) {
+ CSwordModuleInfo* info = m_moduleList->at(i);
+ const QColor c = CSearchDialogAnalysis::getColor(i);
+ ret.append(
+ QString::fromLatin1("<TR BGCOLOR=\"white\"><TD><B><FONT COLOR=\"#%1\">%2</FONT></B></TD><TD>%3</TD></TR>")
+ .arg(QString().sprintf("%02X%02X%02X",c.red(),c.green(),c.blue()))
+ .arg(info ? info->name() : QString::null)
+ .arg(m_resultCountArray[i])
+ );
+ }
+ ret.append("</TABLE>");
+ return ret;
+}
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+CSearchDialogAnalysisView::CSearchDialogAnalysisView(QCanvas* canvas, QWidget* parent)
+ : QCanvasView(canvas, parent) {
+ QWhatsThis::add(this, WT_SD_ANALYSIS_VIEW);
+ setFocusPolicy(QWidget::WheelFocus);
+ m_toolTip = new ToolTip(this);
+ resize(sizeHint());
+
+}
+
+/** Returns the sizeHint for this view */
+QSize CSearchDialogAnalysisView::sizeHint(){
+ if ( parentWidget() )
+ return parentWidget()->sizeHint();
+ return QCanvasView::sizeHint();
+}
+
+/** No descriptions */
+void CSearchDialogAnalysisView::resizeEvent( QResizeEvent* e){
+ QCanvasView::resizeEvent(e);
+ canvas()->resize( canvas()->width(), viewport()->height() );
+}
+
+CSearchDialogAnalysisView::ToolTip::ToolTip(QWidget* parent) : QToolTip(parent) {
+}
+
+void CSearchDialogAnalysisView::ToolTip::maybeTip(const QPoint& p) {
+ CSearchDialogAnalysisView* view = dynamic_cast<CSearchDialogAnalysisView*>(parentWidget());
+ if (!view)
+ return;
+ QPoint point(p);
+ point = view->viewport()->mapFrom(view, point);
+ CSearchDialogAnalysisItem* i = view->itemAt( view->viewportToContents(point) );
+ if (!i)
+ return;
+
+ //get type of item and display correct text
+ QString text = i->getToolTip();
+ if (text.isEmpty())
+ return;
+
+ QPoint p1 = view->viewport()->mapTo(view, view->contentsToViewport(i->rect().topLeft()));
+ p1.setY(0);
+ QPoint p2 = view->viewport()->mapTo(view, view->contentsToViewport(i->rect().bottomRight()));
+ p2.setY(view->height());
+ QRect r = QRect( p1, p2 );
+ if (r.contains(p))
+ tip(r, text);
+}
+
+
+/** Returns the item at position p. If there no item at that point return 0. */
+CSearchDialogAnalysisItem* CSearchDialogAnalysisView::itemAt( const QPoint& p ){
+ QCanvasItemList l = canvas()->collisions(p);
+ if (!l.count())
+ return 0;
+ return dynamic_cast<CSearchDialogAnalysisItem*>(l.first());
+}
+
+//------------------------------------------------------------------
+//------------------------------------------------------------------
+
+CSearchDialogAnalysisLegendItem::CSearchDialogAnalysisLegendItem(QCanvas *parent, ListCSwordModuleInfo *list )
+ : QCanvasRectangle(parent) {
+ m_moduleList = list;
+}
+
+/** Reimplementation. Draws the content of this item. */
+void CSearchDialogAnalysisLegendItem::draw (QPainter& painter) {
+ painter.save();
+
+ setPen( QPen(black,2) );
+ setBrush( Qt::white );
+ //the outer rectangle
+ QPoint p1((int)x(),(int)y());
+ QPoint p2((int)x()+width(), (int)y()+height());
+ QRect r(p1, p2);
+ r.normalize();
+ painter.drawRect(r);
+
+ QFont f = painter.font();
+ f.setPointSize(ITEM_TEXT_SIZE);
+ painter.setFont(f);
+
+ for (unsigned int index=0; index < m_moduleList->count(); index++){
+ // the module color indicators
+ QPoint p1((int)x()+LEGEND_INNER_BORDER, (int)y() + LEGEND_INNER_BORDER + index*(LEGEND_DELTAY + ITEM_TEXT_SIZE));
+ QPoint p2( (int)p1.x() + ITEM_TEXT_SIZE, (int)p1.y() + ITEM_TEXT_SIZE);
+ QRect r(p1,p2);
+ painter.fillRect(r, QBrush(CSearchDialogAnalysis::getColor(index)) );
+ r.normalize();
+ painter.drawRect(r);
+
+ QPoint p3( p2.x() + LEGEND_INNER_BORDER, p2.y() );
+ painter.drawText(p3, m_moduleList->at(index)->name() );
+ }
+ painter.restore();
+}
diff --git a/bibletime/frontend/searchdialog/csearchdialoganalysis.h b/bibletime/frontend/searchdialog/csearchdialoganalysis.h
new file mode 100644
index 0000000..1b1b61c
--- /dev/null
+++ b/bibletime/frontend/searchdialog/csearchdialoganalysis.h
@@ -0,0 +1,187 @@
+/***************************************************************************
+ csearchdialoganalysis.h - description
+ -------------------
+ begin : Sat Mar 4 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSEARCHDIALOGANALYSIS_H
+#define CSEARCHDIALOGANALYSIS_H
+
+//BibleTime includes
+#include "backend/cswordmoduleinfo.h"
+#include "backend/cswordbackend.h"
+
+//Qt includes
+#include <qwidget.h>
+#include <qcanvas.h>
+#include <qarray.h>
+#include <qdict.h>
+#include <qtooltip.h>
+
+class QPixmap;
+class QString;
+
+class CSearchDialog;
+class CSearchDialogAnalysisItem;
+class CSearchDialogAnalysisLegendItem;
+
+/**
+ * CSearchDialogAnaylsis shows the graphical analysis of the search result.
+ * @author The BibleTime Team
+ */
+class CSearchDialogAnalysis : public QCanvas {
+ Q_OBJECT
+public:
+ CSearchDialogAnalysis(QObject *parent=0, const char *name=0);
+ virtual ~CSearchDialogAnalysis();
+ /**
+ * Sets the module list used for the analysis.
+ */
+ void setModuleList(ListCSwordModuleInfo&);
+ /**
+ * Starts the analysis of the search result.
+ * This should be called only once because
+ * QCanvas handles the updates automatically.
+ */
+ void analyse();
+ /**
+ * Sets back the items and deletes things to cleanup
+ */
+ void reset();
+ /**
+ * This function returns a color for each module
+ * @return The color at position index in the list
+ */
+ static QColor getColor(int index);
+ /*
+ * This function returns a pointer to the list of AnalysisItems
+ */
+ QDict<CSearchDialogAnalysisItem>* getSearchAnalysisItemList();
+
+
+protected slots: // Protected slots
+ /**
+ * No descriptions
+ */
+ void slotResized();
+
+private:
+ /**
+ * Returns the count of the book in the module
+ */
+ const unsigned int getCount( const QString book, CSwordModuleInfo* module );
+
+ ListCSwordModuleInfo m_moduleList;
+ QDict<CSearchDialogAnalysisItem> m_canvasItemList;
+ QMap<CSwordModuleInfo*,unsigned int> m_lastPosList;
+ int m_maxCount;
+ double m_scaleFactor;
+ CSearchDialogAnalysisLegendItem* m_legend;
+
+};
+
+
+//----------------------------------------------------------
+//----------------------------------------------------------
+
+/** Paints the bars for one book for one or more modules
+ *
+ */
+class CSearchDialogAnalysisItem : public QCanvasRectangle {
+public:
+ /**
+ * Standard constructor.
+ */
+ CSearchDialogAnalysisItem(QCanvas* parent, const int moduleCount, const QString& bookname, double *scaleFactor, ListCSwordModuleInfo* modules);
+ virtual ~CSearchDialogAnalysisItem();
+ /**
+ * Sets the resultcount of this item
+ */
+ void setCountForModule( const int moduleIndex, const int count);
+
+ /**
+ * Returns the resultcount of this item
+ */
+ int getCountForModule( const int moduleIndex);
+ /**
+ * Returns the width of this item.
+ */
+ virtual int width();
+ /**
+ * Returns the tooltip for this item.
+ */
+ const QString getToolTip();
+
+private:
+ virtual void draw (QPainter & painter);
+
+ ListCSwordModuleInfo* m_moduleList;
+ double *m_scaleFactor;
+ QString m_bookName;
+ int m_moduleCount;
+ QArray<int> m_resultCountArray;
+ QPixmap* m_bufferPixmap;
+};
+
+class CSearchDialogAnalysisLegendItem : public QCanvasRectangle {
+
+public:
+ CSearchDialogAnalysisLegendItem(QCanvas* parent, ListCSwordModuleInfo* list );
+
+private:
+ virtual void draw (QPainter & painter);
+ ListCSwordModuleInfo* m_moduleList;
+};
+
+//----------------------------------------------------------
+//----------------------------------------------------------
+class CSearchDialogAnalysisView : public QCanvasView {
+ Q_OBJECT
+public:
+ /**
+ * Standard constructor
+ */
+ CSearchDialogAnalysisView(QCanvas* canvas, QWidget* parent);
+ /**
+ * Returns the sizeHint for this view
+ * We give back the size of the parent widgetas default.
+ * This is a reimplementation from QCanvasView::sizeHint().
+ */
+ virtual QSize sizeHint();
+ /**
+ * Returns the item at position p.
+ * If there no item at that point return 0.
+ */
+ CSearchDialogAnalysisItem* itemAt( const QPoint& p );
+
+protected:
+ /**
+ * Reimplementation.
+ */
+ virtual void resizeEvent(QResizeEvent* e);
+
+private:
+ class ToolTip : public QToolTip {
+ public:
+ ToolTip(QWidget* parent);
+ /**
+ * Displays a tooltip for position p
+ */
+ virtual void maybeTip(const QPoint &pos);
+ };
+ ToolTip* m_toolTip;
+};
+
+
+#endif
diff --git a/bibletime/frontend/searchdialog/csearchdialogmodulechooser.cpp b/bibletime/frontend/searchdialog/csearchdialogmodulechooser.cpp
new file mode 100644
index 0000000..b098624
--- /dev/null
+++ b/bibletime/frontend/searchdialog/csearchdialogmodulechooser.cpp
@@ -0,0 +1,215 @@
+
+/***************************************************************************
+ csearchdialogmodulechooser.cpp - description
+ -------------------
+ begin : Fri Mar 30 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime's includes
+#include "csearchdialogmodulechooser.h"
+
+#include "backend/cswordbackend.h"
+#include "frontend/groupmanager/cgroupmanager.h"
+#include "frontend/groupmanager/cgroupmanageritem.h"
+#include "frontend/ctoolclass.h"
+#include "whatsthisdef.h"
+#include "tooltipdef.h"
+
+//Qt includes
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qtoolbutton.h>
+#include <qlist.h>
+#include <qlistbox.h>
+#include <qwhatsthis.h>
+#include <qtooltip.h>
+
+//KDE includes
+#include <klocale.h>
+#include <kiconloader.h>
+
+CSearchDialogModuleChooser::CSearchDialogModuleChooser(QWidget *parent, const char *name ) : QWidget(parent,name) {
+ m_initialized = false;
+
+ m_moduleList = 0;
+// m_itemsDict.setAutoDelete(false);
+
+ QVBoxLayout* mainLayout = new QVBoxLayout(this);
+
+ mainLayout->addWidget(CToolClass::explanationLabel(this, i18n("Choose modules"), i18n("Choose the module you want to use for the search. The tree on the left contains all available modules, the tree on the right the modules for the search. Use the two arrow buttons to add or remove modules from the right tree.")));
+ mainLayout->addSpacing(5);
+
+ QHBoxLayout* chooserLayout = new QHBoxLayout();
+
+ m_moduleIndex = new CGroupManager(this, "module index", &backend()->moduleList(), false, false, false, false, false, false);
+ QWhatsThis::add(m_moduleIndex, WT_SD_MODULECHOOSER);
+
+ m_moduleList = new QListBox(this);
+ QWhatsThis::add(m_moduleList, WT_SD_MC_MODULELIST);
+
+ QVBoxLayout* buttonLayout = new QVBoxLayout();
+
+ QToolButton* addButton = new QToolButton(this);
+ addButton->setOnIconSet(SmallIcon("forward"));
+ addButton->setOffIconSet(SmallIcon("forward"));
+ addButton->setFixedSize( addButton->sizeHint() );
+ QWhatsThis::add(addButton, WT_SD_MC_ADD_MODULE);
+ QToolTip::add(addButton, TT_SD_MC_ADD_MODULE);
+ connect( addButton, SIGNAL(clicked()), SLOT(addCurrentItem()));
+
+ QToolButton* removeButton = new QToolButton(this);
+ removeButton->setOnIconSet(SmallIcon("back"));
+ removeButton->setOffIconSet(SmallIcon("back"));
+ removeButton->setFixedSize( removeButton->sizeHint() );
+ QToolTip::add(removeButton, TT_SD_MC_REMOVE_MODULE);
+ QWhatsThis::add(removeButton, WT_SD_MC_REMOVE_MODULE);
+ connect(removeButton, SIGNAL(clicked()), SLOT(removeCurrentItem()));
+
+ buttonLayout->addWidget(addButton,0);
+ buttonLayout->addSpacing(5);
+ buttonLayout->addWidget(removeButton,0);
+ buttonLayout->addStretch(5);
+
+ chooserLayout->addWidget(m_moduleIndex,2);
+ chooserLayout->addLayout(buttonLayout,0);
+ chooserLayout->addWidget(m_moduleList,2);
+
+ mainLayout->addLayout(chooserLayout);
+
+ QListViewItem* child = m_moduleIndex->firstChild();
+ while (child) {
+ QListViewItem* nextChild = child->nextSibling();
+ if (child->childCount())
+ child->setOpen(true);
+ else {
+ CGroupManagerItem* i = (CGroupManagerItem*)child;
+ if (i && (i->type() == CGroupManagerItem::Group)) {
+ if (m_moduleIndex->isChild(child, nextChild)) {
+ delete child;
+ nextChild = m_moduleIndex->firstChild();
+ }
+ else
+ delete child;
+ }
+ }
+ child = nextChild;
+ }
+ m_initialized = true;
+}
+
+CSearchDialogModuleChooser::~CSearchDialogModuleChooser(){
+}
+
+/** Sets the chosen modules for this object. */
+void CSearchDialogModuleChooser::setChosenModules(ListCSwordModuleInfo& modules){
+// if (!modules.coun)
+// return;
+ if (getChosenModules() == modules)
+ return;
+
+ m_moduleList->clear();
+ m_itemsDict.clear();
+ m_moduleIndex->clear();
+ m_moduleIndex->readSettings();
+
+ for (modules.first(); modules.current(); modules.next()) {
+ const QString module = modules.current()->name();
+ QListViewItemIterator it( m_moduleIndex );
+ for ( ; it.current(); ++it )
+ if (it.current()->text(0) == module) {
+ m_moduleIndex->setCurrentItem(it.current());
+ m_moduleIndex->setSelected(it.current(), true);
+ addCurrentItem();
+ }
+ }
+}
+
+/** Returns the modules chosen in this widget. */
+ListCSwordModuleInfo CSearchDialogModuleChooser::getChosenModules(){
+ ListCSwordModuleInfo modules;
+ for (unsigned int i=0; i < m_moduleList->count(); ++i) {
+ CSwordModuleInfo* m = backend()->findModuleByName(m_moduleList->text(i));
+ if (m)
+ modules.append(m);
+ }
+ return modules;
+}
+
+/** Adds the selected item to the list */
+void CSearchDialogModuleChooser::addCurrentItem(){
+ CGroupManagerItem* i = dynamic_cast<CGroupManagerItem*>(m_moduleIndex->selectedItem());
+ QListViewItem* nextItem = 0;
+ if (i)
+ nextItem = i->itemBelow();
+ if (i && !nextItem)
+ nextItem = i->itemAbove();
+
+ if ( i && (i->type() == CGroupManagerItem::Module) && i->moduleInfo() ) {
+ m_moduleList->insertItem( CToolClass::getIconForModule(i->moduleInfo()), i->moduleInfo()->name(),-1 );
+ QListViewItem* parentItem = i->parent();
+ m_itemsDict.insert(i, parentItem ? (const char*)parentItem->text(0).latin1() : "");//I don't know why .local8Bit() doesn't work
+ parentItem ? parentItem->takeItem(i) : m_moduleIndex->takeItem(i);
+
+ if (nextItem)
+ m_moduleIndex->setSelected(nextItem, true);
+ }
+ if (m_initialized)
+ emit chosenModulesChanged();
+}
+
+/** Removes the selected item from the module list */
+void CSearchDialogModuleChooser::removeCurrentItem(){
+ if (!m_itemsDict.count())
+ return;
+ QString text = QString::null;
+ if (m_moduleList->currentItem() != -1) {
+ text = m_moduleList->text(m_moduleList->currentItem());
+ const int currentItem = m_moduleList->currentItem();
+ int newIndex = currentItem;
+
+ if (currentItem+1 < (int)m_moduleList->count())
+ newIndex = currentItem+1;
+ else
+ newIndex = currentItem-1;
+ m_moduleList->removeItem(m_moduleList->currentItem());
+ if (newIndex != -1)
+ m_moduleList->setSelected(newIndex, true);
+ }
+ else
+ return;
+
+ QPtrDictIterator<char> m_it( m_itemsDict ); // iterator for dict
+ while ( m_it.current() ) {
+ QString parentName = QString::fromLatin1(m_it.current());
+ CGroupManagerItem* item = (CGroupManagerItem*)m_it.currentKey();
+ if (item && item->text(0) == text) {
+ CGroupManagerItem* folder = 0;
+ QListViewItemIterator l_it( m_moduleIndex );
+ for ( ; l_it.current(); ++l_it ) {
+ folder = dynamic_cast<CGroupManagerItem*>(l_it.current());
+ if (folder && folder->text(0) == parentName)
+ break;
+ }
+ if (folder)
+ folder->insertItem(item);
+ else
+ m_moduleIndex->insertItem(item);
+ m_itemsDict.remove(item);
+ break;
+ }
+ ++m_it;
+ }
+ if (m_initialized)
+ emit chosenModulesChanged();
+}
diff --git a/bibletime/frontend/searchdialog/csearchdialogmodulechooser.h b/bibletime/frontend/searchdialog/csearchdialogmodulechooser.h
new file mode 100644
index 0000000..c9b170a
--- /dev/null
+++ b/bibletime/frontend/searchdialog/csearchdialogmodulechooser.h
@@ -0,0 +1,71 @@
+/***************************************************************************
+ csearchdialogmodulechooser.h - description
+ -------------------
+ begin : Fri Mar 30 2001
+ copyright : (C) 2001 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSEARCHDIALOGMODULECHOOSER_H
+#define CSEARCHDIALOGMODULECHOOSER_H
+
+#include "backend/cswordmoduleinfo.h"
+#include "frontend/cpointers.h"
+
+//Qt includes
+#include <qwidget.h>
+#include <qptrdict.h>
+
+class CGroupManager;
+class QListBox;
+
+/** A widget to select the modules in which you want to search.
+ * @author The BibleTime team
+ */
+class CSearchDialogModuleChooser : public QWidget, public CPointers {
+ Q_OBJECT
+public:
+ CSearchDialogModuleChooser(QWidget *parent, const char *name=0);
+ ~CSearchDialogModuleChooser();
+ /**
+ * Sets the chosen modules for this object.
+ */
+ void setChosenModules( ListCSwordModuleInfo& modules );
+ /**
+ * Returns the modules chosen in this widget.
+ */
+ ListCSwordModuleInfo getChosenModules();
+
+private:
+ CGroupManager* m_moduleIndex;
+ QListBox* m_moduleList;
+ QPtrDict<char> m_itemsDict;
+ bool m_initialized;
+
+private slots: // Private slots
+ /**
+ * Removes the selected item from the module list
+ */
+ void removeCurrentItem();
+ /**
+ * Adds the selected item to the list
+ */
+ void addCurrentItem();
+
+signals: // Signals
+ /**
+ * No descriptions
+ */
+ void chosenModulesChanged();
+};
+
+#endif
diff --git a/bibletime/frontend/searchdialog/csearchdialogresult.cpp b/bibletime/frontend/searchdialog/csearchdialogresult.cpp
new file mode 100644
index 0000000..0373527
--- /dev/null
+++ b/bibletime/frontend/searchdialog/csearchdialogresult.cpp
@@ -0,0 +1,182 @@
+/***************************************************************************
+ csearchdialogresult.cpp - description
+ -------------------
+ begin : Mit Jan 19 12:57:15 CET 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+
+//BIbleTime includes
+#include "../../backend/cswordmodulesearch.h"
+#include "../../whatsthisdef.h"
+#include "csearchdialog.h"
+#include "csearchdialogtext.h"
+#include "csearchdialogresult.h"
+#include "csearchdialogresultview.h"
+#include "../ctoolclass.h"
+#include "../cbtconfig.h"
+
+//Qt includes
+#include <qpixmap.h>
+#include <qregexp.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qheader.h>
+#include <qstringlist.h>
+#include <qwidget.h>
+#include <qsplitter.h>
+
+// KDE includes
+#include <klocale.h>
+#include <kstringhandler.h>
+
+CSearchDialogResult::CSearchDialogResult(QWidget *parent, const char *name) : QWidget(parent, name) {
+
+ QHBoxLayout* l = new QHBoxLayout(this);
+ m_splitter = new QSplitter(Qt::Vertical, this, "result splitter");
+ l->addWidget(m_splitter);
+
+ QWidget* d = new QWidget(m_splitter);
+ QHBoxLayout* main_layout = new QHBoxLayout(d);
+ QLabel *label1 = new QLabel(d, "label1");
+ label1->setText( i18n( "Modules:" ) );
+ label1->setAutoResize(true);
+ QLabel* label2 = new QLabel(d, "label2");
+ label2->setText( i18n("Entries found:") );
+ label2->setAutoResize(true);
+
+ resultModuleTree = new CSearchDialogResultModuleView(d, "resultModuleTree");
+ resultTree = new CSearchDialogResultView( d, "resultTree");
+
+ html_widget = new CHTMLWidget(true, m_splitter, "html_widget");
+ html_widget->setMinimumHeight(80);
+
+ connect(resultModuleTree, SIGNAL(moduleSelected(CSwordModuleInfo*)), resultTree, SLOT(setModule(CSwordModuleInfo*)));
+ connect(resultTree, SIGNAL(keySelected(const QString)), this, SLOT(updatePreview(const QString)));
+
+ QVBoxLayout* layout_1 = new QVBoxLayout();
+ QVBoxLayout* layout_2 = new QVBoxLayout();
+
+ layout_1->addWidget(label1);
+ layout_1->addWidget(resultModuleTree);
+
+ layout_2->addWidget(label2);
+ layout_2->addWidget(resultTree, 5);
+
+ main_layout->addLayout(layout_1);
+ main_layout->addSpacing(2);
+ main_layout->addLayout(layout_2);
+}
+
+void CSearchDialogResult::setModuleList(ListCSwordModuleInfo& modules) {
+ moduleList = modules;
+
+ resultModuleTree->setModuleList(moduleList);
+ resultModuleTree->clear();
+ resultModuleTree->setupTree();
+
+ resultTree->clear();
+}
+
+
+/** preview items data in the HTML previewer */
+void CSearchDialogResult::updatePreview(const QString newText) {
+ qDebug("CSearchDialogResult::updatePreview(const QString newText) ");
+ QString text = newText;
+ //find text page
+ QString searchedText;
+ CSearchDialogText* textPart = 0;
+ for (QObject* w = parent(); w; w = w->parent()) {
+ if (w->isA("CSearchDialog")) {
+ CSearchDialog* dlg = dynamic_cast<CSearchDialog*>(w);
+ searchedText = dlg->getSearchedText().stripWhiteSpace();
+ textPart = dlg->m_searchText;
+ break;
+ }
+ }
+
+ const QString part1( "<font color=\"red\"><b>");
+ const QString part2("</b></font>");
+ const int insertLength(part1.length()+part2.length());
+
+ int searchType(textPart->getSearchType());
+ if (searchType & CSwordModuleSearch::exactPhrase) {
+ for (int pos = 0 ; pos != -1;){
+ pos = text.find(searchedText,pos,textPart->isCaseSensitive());
+ if (pos!=-1 && !CToolClass::inHTMLTag(pos, text)) { //something was found
+ text.insert(pos + searchedText.length(),part2);
+ text.insert(pos, part1);
+ pos += searchedText.length() + insertLength;
+ }
+ }
+ }
+ else if (searchType & CSwordModuleSearch::multipleWords) {
+ QStringList searchedWords;
+ int wordIndex = 0;
+ QString word = QString::null;
+ while (!(word = KStringHandler::word(searchedText, wordIndex)).isEmpty()) {
+ searchedWords.append(word);
+ ++wordIndex;
+ }
+
+ QString currentWord;
+ for (unsigned int i=0; i < searchedWords.count(); i++) {
+ currentWord = searchedWords[i];
+ int count = text.contains(currentWord, textPart->isCaseSensitive());
+ int pos = 0;
+ int i2 = 0;
+ while (i2 < count) {
+ pos = text.find(currentWord,pos?pos+1:0, textPart->isCaseSensitive());
+ if (pos!=-1 && !CToolClass::inHTMLTag(pos, text)) { //something was found
+
+ text.insert(pos + currentWord.length(), part2);
+ text.insert(pos, part1);
+
+ pos += currentWord.length() + insertLength;
+ }
+ ++i2;
+ }
+ }
+ }
+ else if (searchType & CSwordModuleSearch::regExp) {
+ QRegExp regExp(searchedText);
+ regExp.setCaseSensitive( textPart->isCaseSensitive() );
+ int matchLength = 0;
+ for (int pos = 0; pos != -1;){
+ pos = regExp.match(text,pos,&matchLength);
+ if (pos!=-1 && matchLength > 0 && !CToolClass::inHTMLTag(pos, text)) {
+ text.insert(pos + matchLength, part2);
+ text.insert(pos, part1);
+ pos += matchLength + insertLength;
+ }
+ }
+ }
+
+ //module is Unicode-based
+ if (resultModuleTree->getCurrentModule()->isUnicode() ) {
+ const QFont f = CBTConfig::get( CBTConfig::unicode);
+ text = QString::fromLatin1("<FONT FACE=\"%1\" SIZE=\"%2\">%3</FONT>").arg(f.family()).arg(f.pointSize()).arg(text);
+ }
+ html_widget->setText(
+ QString::fromLatin1("<HTML><HEAD></HEAD><BODY><FONT color=\"red\">%1 </FONT><SMALL>(%2)</SMALL><BR><HR>%3</BODY></HTML>")
+ .arg(resultTree->currentText())
+ .arg((resultModuleTree->getCurrentModule()) ? resultModuleTree->getCurrentModule()->config(CSwordModuleInfo::Description) : QString::fromLatin1("<I>%1</I>").arg(i18n("module not set")) )
+ .arg(text)
+ );
+}
+
+void CSearchDialogResult::clearResult() {
+ resultTree->clear();
+ resultModuleTree->clear();
+ html_widget->setText("<HTML><HEAD></HEAD><BODY></BODY></HTML>");
+}
diff --git a/bibletime/frontend/searchdialog/csearchdialogresult.h b/bibletime/frontend/searchdialog/csearchdialogresult.h
new file mode 100644
index 0000000..a5b1271
--- /dev/null
+++ b/bibletime/frontend/searchdialog/csearchdialogresult.h
@@ -0,0 +1,66 @@
+/***************************************************************************
+ csearchdialogresult.h - description
+ -------------------
+ begin : Mit Jan 19 12:57:15 CET 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSEARCHDIALOGRESULT_H
+#define CSEARCHDIALOGRESULT_H
+
+#include <qwidget.h>
+
+#include "backend/cswordmoduleinfo.h"
+#include "frontend/chtmlwidget.h"
+
+class CSearchDialog;
+class CSearchDialogResultModuleView;
+class CSearchDialogResultView;
+class CSearchResultItem;
+
+class QSplitter;
+
+class CSearchDialogResult : public QWidget
+{
+ Q_OBJECT
+ friend class CSearchDialog;
+public:
+ /**
+ * Standard constructor
+ */
+ CSearchDialogResult(QWidget *parent = 0, const char *name = 0);
+ /**
+ * Sets the module list and clears the result list.
+ */
+ void setModuleList(ListCSwordModuleInfo& moduleList);
+ /**
+ * Removes the listed module items and the current search result from the lists
+ */
+ void clearResult();
+
+public slots:
+ /**
+ * Updates the preview using the parameter as new key.
+ */
+ void updatePreview(const QString);
+
+private:
+ ListCSwordModuleInfo moduleList;
+ CSearchDialogResultModuleView *resultModuleTree;
+ CSearchDialogResultView *resultTree;
+ CHTMLWidget *html_widget;
+ QSplitter* m_splitter;
+};
+
+
+#endif
diff --git a/bibletime/frontend/searchdialog/csearchdialogresultview.cpp b/bibletime/frontend/searchdialog/csearchdialogresultview.cpp
new file mode 100644
index 0000000..bb66330
--- /dev/null
+++ b/bibletime/frontend/searchdialog/csearchdialogresultview.cpp
@@ -0,0 +1,437 @@
+/***************************************************************************
+ csearchdialogresultview.cpp - description
+ -------------------
+ begin : Wed Jan 19 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//own includes
+#include "csearchdialogresultview.h"
+#include "csearchdialog.h"
+#include "../../resource.h"
+#include "../../whatsthisdef.h"
+#include "../../tooltipdef.h"
+#include "../../backend/cswordbiblemoduleinfo.h"
+#include "../../backend/cswordlexiconmoduleinfo.h"
+#include "../../backend/cswordversekey.h"
+#include "../../backend/cswordldkey.h"
+#include "../../backend/creferencemanager.h"
+#include "../cexportmanager.h"
+#include "../ctoolclass.h"
+#include "../cbtconfig.h"
+#include "../../printing/cprintitem.h"
+#include "../../printing/cprinter.h"
+
+#include "../../util/scoped_resource.h"
+
+//QT includes
+#include <qlist.h>
+#include <qheader.h>
+#include <qevent.h>
+#include <qmessagebox.h>
+#include <qdragobject.h>
+#include <qwidget.h>
+#include <qclipboard.h>
+#include <qprogressdialog.h>
+#include <qwhatsthis.h>
+#include <qtooltip.h>
+
+//KDE includes
+#include <kfiledialog.h>
+#include <klocale.h>
+#include <kstddirs.h>
+#include <kiconloader.h>
+#include <kapp.h>
+#include <kpopupmenu.h>
+#include <kglobalsettings.h>
+#include <kaction.h>
+
+//Sword includes
+#include <listkey.h>
+#include <swmodule.h>
+
+CSearchDialogResultModuleView::CSearchDialogResultModuleView(QWidget *parent, const char *name)
+ : QListView ( parent, name ) {
+ initView();
+ adjustSize();
+}
+
+CSearchDialogResultModuleView::~CSearchDialogResultModuleView() {
+ qDebug("CSearchDialogResultModuleView::~CSearchDialogResultModuleView()");
+}
+
+/** Initializes the tree of this ResultView */
+void CSearchDialogResultModuleView::setupTree() {
+ ListKey moduleSearchResult;
+ QListViewItem *module = 0;
+
+ for (moduleList.first(); moduleList.current(); moduleList.next()) {
+ moduleSearchResult = moduleList.current()->searchResult();
+ module = new QListViewItem(this, QString("%1 [%2]").arg( moduleList.current()->name() ).arg( moduleSearchResult.Count() ));
+ module->setPixmap(0,CToolClass::getIconForModule(moduleList.current()) );
+ }
+ setFixedWidth( sizeHint().width() );
+// resize(sizeHint());
+}
+
+void CSearchDialogResultModuleView::viewportMousePressEvent(QMouseEvent *e) {
+ qDebug("CSearchDialogResultModuleView::viewportMousePressEvent");
+ QListView::viewportMousePressEvent(e);
+
+ m_currentItem = (QListViewItem*)itemAt(e->pos());
+ if (!m_currentItem)
+ {
+ qDebug("item is NULL");
+ return;
+ }
+ if ((e->state() & ControlButton) || (e->state() & ShiftButton))
+ return;
+ for (moduleList.first();moduleList.current();moduleList.next()){
+ QString modName = m_currentItem->text(0);
+ modName = modName.left( modName.find(" [") );
+ m_currentModule = backend()->findModuleByName(modName);
+ if (m_currentModule)
+ emit moduleSelected(m_currentModule);
+ }
+ if (e->button() == RightButton)
+ m_popup->popup( mapToGlobal(e->pos()) );
+}
+
+/** Initializes this widget */
+void CSearchDialogResultModuleView::initView(){
+ QWhatsThis::add(this, WT_SD_RESULT_MODULE_VIEW);
+
+ setFocusPolicy(QWidget::WheelFocus);
+ setAllColumnsShowFocus( true );
+ setRootIsDecorated( false );
+ addColumn( i18n( "Modules" ), -1 );
+ header()->hide();
+ setSorting( -1 );
+
+ m_popup = new KPopupMenu(this);
+
+ m_copyPopup = new KPopupMenu(m_popup);
+ m_copyPopup->insertItem(i18n("Search result"), this, SLOT(slotCopySearchResult()));
+ m_copyPopup->insertItem(i18n("Search result with text"), this, SLOT(slotCopySearchResultWithKeytext()));
+
+ m_printPopup = new KPopupMenu(m_popup);
+ m_printPopup->insertItem(i18n("Search result"), this, SLOT(printSearchResult()));
+
+ m_savePopup = new KPopupMenu(m_popup);
+ m_savePopup->insertItem(i18n("Search result"), this, SLOT(slotSaveSearchResult()));
+ m_savePopup->insertItem(i18n("Search result with text"), this, SLOT(slotSaveSearchResultWithKeytext()));
+
+ m_popup->insertItem(SmallIcon(ICON_EDIT_COPY), i18n("Copy..."), m_copyPopup);
+ m_popup->insertItem(SmallIcon(ICON_FILE_PRINT), i18n("Add to printing queue..."), m_printPopup);
+ m_popup->insertItem(SmallIcon(ICON_FILE_SAVE), i18n("Save..."), m_savePopup);
+}
+
+/** Returns the module belonging to the selected item. */
+CSwordModuleInfo* CSearchDialogResultModuleView::getCurrentModule() {
+ return m_currentModule;
+}
+
+/** Reimplementation. Sets the cortrect QHeader width. */
+void CSearchDialogResultModuleView::resizeEvent( QResizeEvent* e){
+ QListView::resizeEvent(e);
+ header()->resize( visibleWidth(), header()->height() );
+}
+
+/** Adds all items of the search result of this module to the printing queue of BibleTime. */
+void CSearchDialogResultModuleView::printSearchResult(){
+ CExportManager::printKeyList( &(m_currentModule->searchResult()), m_currentModule, i18n("Appending keys to the printing queue ...") );
+}
+
+/** This function copies the search result into the clipboard */
+void CSearchDialogResultModuleView::slotCopySearchResult(){
+ //get the searched text
+// QString searchedText;
+// for (QObject* w = parent(); w; w = w->parent()) {
+// if (w->isA("CSearchDialog")) {
+// CSearchDialog* dlg = (CSearchDialog*)w;
+// searchedText = dlg->getSearchedText().stripWhiteSpace();
+// break;
+// }
+// }
+ CExportManager::copyKeyList(&m_currentModule->searchResult(), m_currentModule, i18n("Copying search result to clipboard..."), false);
+}
+
+/** This slot saves the search result to disk. */
+void CSearchDialogResultModuleView::slotSaveSearchResult(){
+ //get the searched text
+ QString searchedText;
+ for (QObject* w = parent(); w; w = w->parent()) {
+ if (w->isA("CSearchDialog")) {
+ CSearchDialog* dlg = dynamic_cast<CSearchDialog*>(w);
+ searchedText = dlg->getSearchedText().stripWhiteSpace();
+ break;
+ }
+ }
+ ListKey& searchResult = m_currentModule->searchResult();
+ CExportManager::saveKeyList(&searchResult, m_currentModule, i18n("Saving the search result ..."), false, true);
+}
+
+
+void CSearchDialogResultModuleView::slotCopySearchResultWithKeytext(){
+ //get the searched text
+ QString searchedText;
+ for (QObject* w = parent(); w; w = w->parent()) {
+ if (w->isA("CSearchDialog")) {
+ CSearchDialog* dlg = (CSearchDialog*)w;
+ searchedText = dlg->getSearchedText().stripWhiteSpace();
+ break;
+ }
+ }
+ CExportManager::copyKeyList(&m_currentModule->searchResult(), m_currentModule, i18n("Copying search result to clipboard..."), true );
+}
+
+/** This slot saves the search result to disk. */
+void CSearchDialogResultModuleView::slotSaveSearchResultWithKeytext(){
+ //get the searched text
+ QString searchedText;
+ for (QObject* w = parent(); w; w = w->parent()) {
+ if (w->isA("CSearchDialog")) {
+ CSearchDialog* dlg = (CSearchDialog*)w;
+ searchedText = dlg->getSearchedText().stripWhiteSpace();
+ break;
+ }
+ }
+ CExportManager::saveKeyList(&m_currentModule->searchResult(), m_currentModule,i18n("Saving the search result..."), true, true);
+}
+
+//------------class CSearchDialogResultView-----------//
+CSearchDialogResultView::CSearchDialogResultView(QWidget *parent, const char *name)
+ : QListBox(parent,name),
+ m_module(0),
+ m_currentItem(0),
+ m_pressedPos()
+{
+ initView();
+ initConnections();
+}
+
+CSearchDialogResultView::~CSearchDialogResultView() {
+}
+
+/** Initializes the tree of this ResultView */
+void CSearchDialogResultView::setupTree() {
+ ListKey& moduleSearchResult = m_module->searchResult();
+ const int count = moduleSearchResult.Count();
+
+ clear();
+ setUpdatesEnabled(false);
+ for (int index = 0; index < count; index++) {
+ insertItem( QString::fromLocal8Bit((const char*)*moduleSearchResult.GetElement(index)), -1);
+ }
+ setUpdatesEnabled(true);
+}
+
+/** Initializes the connections of this class */
+void CSearchDialogResultView::initConnections() {
+ connect(m_popup, SIGNAL(aboutToShow()),
+ this, SLOT(popupAboutToShow()));
+// connect(this, SIGNAL(pressed(QListBoxItem*)),
+// this, SLOT(mousePressed(QListBoxItem*)));
+
+ connect(this, SIGNAL(currentChanged(QListBoxItem*)),
+ this, SLOT(mousePressed(QListBoxItem*)));
+
+ connect(this, SIGNAL(rightButtonPressed(QListBoxItem*, const QPoint&)),
+ this, SLOT(rightButtonPressed(QListBoxItem*, const QPoint&)));
+}
+
+/** Initializes this widget */
+void CSearchDialogResultView::initView(){
+ QWhatsThis::add(this, WT_SD_RESULT_RESULT_VIEW);
+ setSelectionMode(QListBox::Extended);
+
+ m_popup = new KPopupMenu(this);
+ m_copyPopup = new KPopupMenu(m_popup);
+ m_copyPopup->insertItem(i18n("Key"), this, SLOT(slotCopyCurrent()));
+ m_copyPopup->insertItem(i18n("Key with text"), this, SLOT(slotCopyCurrentWithKeytext()));
+
+ m_printPopup = new KPopupMenu(m_popup);
+ m_printPopup->insertItem(i18n("Key with text"), this, SLOT(printItem()));
+
+ m_savePopup = new KPopupMenu(m_popup);
+ m_savePopup->insertItem(i18n("Key"), this, SLOT(slotSaveCurrent()));
+ m_savePopup->insertItem(i18n("Key with text"), this, SLOT(slotSaveCurrentWithKeytext()));
+
+ m_popup->insertItem(SmallIcon(ICON_EDIT_COPY), i18n("Copy..."), m_copyPopup);
+ m_popup->insertItem(SmallIcon(ICON_FILE_PRINT),i18n("Add to printing queue..."),m_printPopup);
+ m_popup->insertItem(SmallIcon(ICON_FILE_SAVE), i18n("Save..."), m_savePopup);
+
+ setFocusPolicy(QWidget::WheelFocus);
+}
+
+
+/** Is called before the menu is shown */
+void CSearchDialogResultView::popupAboutToShow(){
+}
+
+/** */
+void CSearchDialogResultView::viewportMouseMoveEvent(QMouseEvent *e){
+// qDebug("CSearchDialogResultView::viewportMouseMoveEvent(QMouseEvent *e)");
+ if ( !(e->state() & QMouseEvent::LeftButton) ){
+ QListBox::viewportMouseMoveEvent(e);
+ return;
+ }
+
+ //Is it time to start a drag?
+ if (m_currentItem && (abs(e->pos().x() - m_pressedPos.x()) > KGlobalSettings::dndEventDelay() ||
+ abs(e->pos().y() - m_pressedPos.y()) > KGlobalSettings::dndEventDelay()) )
+ {
+ QString mod;
+ QString ref;
+ mod = m_module->name();
+ ref = m_currentItem->text();
+
+ QTextDrag *d = new QTextDrag(CReferenceManager::encodeReference(mod,ref), viewport());
+ if (d){
+ d->setSubtype(REFERENCE);
+ d->setPixmap(REFERENCE_ICON_SMALL);
+ d->drag();
+ return;
+ }
+ }
+ else
+ QListBox::viewportMouseMoveEvent(e);
+}
+
+/** */
+void CSearchDialogResultView::printItem() {
+ QList<QListBoxItem> list = selectedItems();
+ if (!list.count())
+ return;
+ for (list.first(); list.current(); list.next()) {
+ CExportManager::printKey(m_module,list.current()->text(),QString::null);
+ }
+}
+
+/** This slot is called when the current item changed. */
+void CSearchDialogResultView::itemChanged(QListBoxItem* item){
+ m_currentItem = item;
+}
+
+/** Opens the popup menu. */
+void CSearchDialogResultView::rightButtonPressed( QListBoxItem* item, const QPoint& p){
+ m_currentItem = item;
+ if (m_currentItem) {
+ mousePressed(item);
+ m_popup->popup(p);
+ }
+}
+
+/** */
+void CSearchDialogResultView::mousePressed(QListBoxItem* item){
+ qDebug("CSearchDialogResultView::mousePressed(QListBoxItem* item)");
+ if (!( m_currentItem = item ))
+ return;
+ QString text = QString::null;
+
+ //we have to set the standard module view options for the module!!
+ util::scoped_ptr<CSwordKey> key(CSwordKey::createInstance(m_module));
+ if ( key ) {
+ backend()->setFilterOptions( CBTConfig::getFilterOptionDefaults() );
+ key->key(item->text());
+ emit keySelected(key->renderedText());
+ }
+}
+
+/** This slot copies the current active item into the clipboard. */
+void CSearchDialogResultView::slotCopyCurrent(){
+ QString text;
+ QList<QListBoxItem> list = selectedItems();
+ for (list.first(); list.current(); list.next()) {
+ text += list.current()->text()+"\n";
+ }
+ KApplication::clipboard()->setText(text);
+}
+
+/** This slot copies the current active item into the clipboard. */
+void CSearchDialogResultView::slotCopyCurrentWithKeytext(){
+ QList<QListBoxItem> list = selectedItems();
+ QString text;
+ QString keyText, keyName;
+ for (list.first(); list.current(); list.next()) {
+ CSwordKey* key = CSwordKey::createInstance(m_module);
+ if (!key)
+ continue;
+
+ key->key(list.current()->text());
+ keyName = key->key();
+ keyText = key->strippedText();
+
+ delete key;
+
+ text += QString("%1\n%2\n\n").arg(keyName).arg(keyText);
+ }
+
+ KApplication::clipboard()->setText(text);
+}
+
+/** This slot copies the current active item into the clipboard. */
+void CSearchDialogResultView::slotSaveCurrent(){
+ const QString file = KFileDialog::getSaveFileName (QString::null, i18n("*.txt | Text files\n *.* | All files (*.*)"), 0, i18n("Save key ..."));
+ if (!file.isNull()) {
+ QList<QListBoxItem> list = selectedItems();
+ QString text;
+ for (list.first(); list.current(); list.next())
+ text += list.current()->text()+"\n";
+ CToolClass::savePlainFile(file, text);
+ }
+}
+
+/** This slot copies the current active item into the clipboard. */
+void CSearchDialogResultView::slotSaveCurrentWithKeytext(){
+ QList<QListBoxItem> list = selectedItems();
+ QString text;
+ QString keyText, keyName;
+ for (list.first(); list.current(); list.next()) {
+ CSwordKey* key = CSwordKey::createInstance(m_module);
+ if (!key)
+ continue;
+
+ key->key(list.current()->text());
+ keyName = key->key();
+ keyText = key->strippedText();
+
+ delete key;
+
+ text += QString("%1\n%2\n\n").arg(keyName).arg(keyText);
+ }
+
+ const QString file = KFileDialog::getSaveFileName (QString::null, i18n("*.txt | Text files\n *.* | All files (*.*)"), 0, i18n("Save key ..."));
+ if (!file.isNull()) {
+ CToolClass::savePlainFile( file, text);
+ }
+}
+
+/** Returns the selected items of this listbox. */
+QList<QListBoxItem> CSearchDialogResultView::selectedItems(){
+ QList<QListBoxItem> list;
+ QListBoxItem* item = firstItem();
+ while (item) {
+ if (item->selected())
+ list.append(item);
+ item = item->next();
+ }
+ return list;
+}
+
+/** Reimplementation to make Drag&Drop work. */
+void CSearchDialogResultView::viewportMousePressEvent( QMouseEvent* e ){
+ qDebug("CSearchDialogResultView::viewportMousePressEvent( QMouseEvent* e )");
+ m_pressedPos = e->pos();
+ QListBox::viewportMousePressEvent(e);
+}
diff --git a/bibletime/frontend/searchdialog/csearchdialogresultview.h b/bibletime/frontend/searchdialog/csearchdialogresultview.h
new file mode 100644
index 0000000..107fe0c
--- /dev/null
+++ b/bibletime/frontend/searchdialog/csearchdialogresultview.h
@@ -0,0 +1,200 @@
+/***************************************************************************
+ csearchdialogresultview.h - description
+ -------------------
+ begin : Wed Jan 19 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSEARCHDIALOGRESULTVIEW_H
+#define CSEARCHDIALOGRESULTVIEW_H
+
+//BibleTime includes
+#include "../../backend/cswordmoduleinfo.h"
+#include "../cpointers.h"
+
+//QT includes
+#include <qwidget.h>
+#include <qlistview.h>
+#include <qlistbox.h>
+#include <qlistview.h>
+
+class KPopupMenu;
+class CSearchDialogResultItem;
+class CSearchDialog;
+class KAction;
+
+/**
+ * Handles the search result
+ * @author The BibleTime Team
+ */
+class CSearchDialogResultModuleView : public QListView, public CPointers {
+ Q_OBJECT
+public:
+ CSearchDialogResultModuleView(QWidget *parent=0, const char *name=0);
+ virtual ~CSearchDialogResultModuleView();
+ /**
+ * Sets te modulelist displayed in this module tree.
+ */
+ void setModuleList(ListCSwordModuleInfo& modules) { this->moduleList = modules; };
+ /**
+ * Initializes the tree of this CGroupmanager
+ */
+ void setupTree();
+ /**
+ * Initiales the view of this widget.
+ */
+ void initView();
+ /**
+ * Returns the module belonging to the selected item.
+ */
+ CSwordModuleInfo* getCurrentModule();
+ /**
+ * Reimplementation. Sets the cortrect QHeader width.
+ */
+ void resizeEvent( QResizeEvent* e);
+
+protected:
+ void viewportMousePressEvent(QMouseEvent *e);
+
+protected slots: // Protected slots
+ /**
+ * Adds all items of the search result of this module
+ * to the printing queue of BibleTime.
+ */
+ void printSearchResult();
+ /**
+ * This slot saves the search result to disk.
+ */
+ void slotSaveSearchResult();
+ /**
+ * This function copies the search result into the clipboard
+ */
+ void slotCopySearchResult();
+ /**
+ * This slot saves the search result to disk.
+ */
+ void slotSaveSearchResultWithKeytext();
+ /**
+ * This function copies the search result into the clipboard
+ */
+ void slotCopySearchResultWithKeytext();
+
+signals: // Signals
+ /**
+ * Is emitted when a module in the tree was selected.
+ */
+ void moduleSelected(CSwordModuleInfo*);
+
+private:
+ ListCSwordModuleInfo moduleList;
+ QListViewItem* m_currentItem;
+ CSwordModuleInfo* m_currentModule;
+
+ KPopupMenu* m_popup;
+ KPopupMenu* m_copyPopup;
+ KPopupMenu* m_savePopup;
+ KPopupMenu* m_printPopup;
+};
+
+
+class CSearchDialogResultView : public QListBox, public CPointers {
+ Q_OBJECT
+public:
+ CSearchDialogResultView(QWidget *parent=0, const char *name=0);
+ virtual ~CSearchDialogResultView();
+ /**
+ * Initializes the tree of this CGroupmanager
+ */
+ void setupTree();
+ /**
+ * Initialzes the view of this widget.
+ */
+ void initView();
+
+protected:
+ /**
+ * Initializes the connections of this class
+ */
+ void initConnections();
+ void viewportMouseMoveEvent(QMouseEvent *e);
+ /**
+ * Returns the selected items of this listbox.
+ */
+ QList<QListBoxItem> selectedItems();
+ /**
+ Reimplementation to make Drag&Drop work.
+ */
+ virtual void viewportMousePressEvent( QMouseEvent* e );
+
+public slots:
+ /**
+ * Appends the selected item to prinint queue
+ */
+ void printItem();
+ /**
+ *
+ */
+ void setModule(CSwordModuleInfo *module) { if (module) m_module = module; setupTree();};
+
+protected slots: // Protected slots
+ /**
+ * Is called before the menu is shown
+ */
+ void popupAboutToShow();
+ /**
+ * This slot is called when the current item changed.
+ */
+ void itemChanged(QListBoxItem*);
+ /**
+ * Reimplementation from QListBox
+ */
+ void mousePressed(QListBoxItem*);
+ /**
+ * Opens the popup menu.
+ */
+ void rightButtonPressed( QListBoxItem*, const QPoint&);
+ /**
+ * This slot copies the current active item into the clipboard.
+ */
+ void slotCopyCurrent();
+ /**
+ * This slot copies the current active item into the clipboard.
+ */
+ void slotCopyCurrentWithKeytext();
+ /**
+ * This slot copies the current active item into the clipboard.
+ */
+ void slotSaveCurrent();
+ /**
+ * This slot copies the current active item into the clipboard.
+ */
+ void slotSaveCurrentWithKeytext();
+
+private:
+ KPopupMenu *m_popup;
+ KPopupMenu* m_copyPopup;
+ KPopupMenu* m_savePopup;
+ KPopupMenu* m_printPopup;
+
+ CSwordModuleInfo* m_module;
+ QListBoxItem *m_currentItem;
+ QPoint m_pressedPos;
+
+signals: // Signals
+ /**
+ * Is emitted when a key in the tree was selected.
+ */
+ void keySelected(const QString);
+};
+
+#endif
diff --git a/bibletime/frontend/searchdialog/csearchdialogscope.cpp b/bibletime/frontend/searchdialog/csearchdialogscope.cpp
new file mode 100644
index 0000000..38203aa
--- /dev/null
+++ b/bibletime/frontend/searchdialog/csearchdialogscope.cpp
@@ -0,0 +1,373 @@
+/***************************************************************************
+ csearchdialogscope.cpp - description
+ -------------------
+ begin : Sun Nov 12 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "csearchdialogscope.h"
+#include "../../whatsthisdef.h"
+#include "../../tooltipdef.h"
+
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+#include <qbuttongroup.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qlistbox.h>
+#include <qgroupbox.h>
+#include <qinputdialog.h>
+#include <qlineedit.h>
+#include <qcombobox.h>
+#include <qwhatsthis.h>
+#include <qtooltip.h>
+
+#include <klocale.h>
+#include <ksimpleconfig.h>
+
+#include "versekey.h"
+
+CSearchDialogScopeChooser::CSearchDialogScopeChooser(QWidget *parent, const char *name ) : QWidget(parent,name) {
+
+ QHBoxLayout* HLayout = new QHBoxLayout(this);
+
+ noScope = new QRadioButton(i18n("No scope" ),this);
+ QToolTip::add(noScope, TT_SD_SCOPE_NO_SCOPE);
+ QWhatsThis::add(noScope, WT_SD_SCOPE_NO_SCOPE);
+
+ lastResultScope = new QRadioButton(i18n("Last result"),this);
+ QToolTip::add(lastResultScope, TT_SD_SCOPE_LAST_RESULT);
+ QWhatsThis::add(lastResultScope, WT_SD_SCOPE_LAST_RESULT);
+
+ useScope = new QRadioButton(i18n("Use scope" ),this);
+ QToolTip::add(useScope, TT_SD_SCOPE_OWN_SCOPE);
+ QWhatsThis::add(useScope, WT_SD_SCOPE_OWN_SCOPE);
+
+ group = new QButtonGroup();
+ group->insert(noScope);
+ group->insert(lastResultScope);
+ group->insert(useScope);
+ noScope->setChecked(true);
+
+ RangeChooser = new QComboBox(this);
+ RangeLabel = new QLabel(RangeChooser, i18n("Choose custom range"),this);
+ QToolTip::add(RangeChooser, TT_SD_SCOPE_CHOOSER);
+ QWhatsThis::add(RangeChooser, WT_SD_SCOPE_CHOOSER);
+
+ editButton = new QPushButton(i18n("Edit ranges"),this);
+ editButton->setFixedWidth(editButton->sizeHint().width());
+ QToolTip::add(editButton, TT_SD_SCOPE_EDIT_SCOPE_BUTTON);
+ QWhatsThis::add(editButton, WT_SD_SCOPE_EDIT_SCOPE_BUTTON);
+ connect(editButton,SIGNAL(clicked()),this,SLOT(editButtonClicked()));
+ connect(group,SIGNAL(clicked(int)),this,SLOT(scopeChanged()));
+
+ QVBoxLayout* VLayout_1 = new QVBoxLayout(HLayout);
+ VLayout_1->addWidget(noScope, Qt::AlignTop);
+ VLayout_1->addWidget(lastResultScope, Qt::AlignTop);
+ VLayout_1->addWidget(useScope, Qt::AlignTop);
+
+ HLayout->addStretch();
+
+ QVBoxLayout* VLayout_2 = new QVBoxLayout(HLayout);
+ VLayout_2->addWidget(RangeLabel);
+ VLayout_2->addWidget(RangeChooser);
+ VLayout_2->addWidget(editButton);
+
+ HLayout->addStretch();
+
+ config = new KSimpleConfig("bt-custom_ranges", false);
+ //we use this to use the global standard
+ config->setGroup(QString::fromLatin1("main"));
+ if (config->readBoolEntry("first usage", true)) {
+ config->writeEntry("first usage", false);
+ config->setGroup(QString::fromLatin1("custom ranges"));
+
+ QMap<QString,QString> entryMap;
+ entryMap.insert(i18n("Old testament"), QString::fromLatin1("Gen - Mal"));
+ entryMap.insert(i18n("Moses/Pentateuch/Torah"), QString::fromLatin1("Gen - Deut"));
+ entryMap.insert(i18n("History"), QString::fromLatin1("Jos - Est"));
+ entryMap.insert(i18n("Prophets"), QString::fromLatin1("Isa - Mal"));
+ entryMap.insert(i18n("New testament"), QString::fromLatin1("Mat - Rev"));
+ entryMap.insert(i18n("Gospels"), QString::fromLatin1("Mat - Joh"));
+ entryMap.insert(i18n("Letters/Epistels"), QString::fromLatin1("Rom - Jude"));
+ entryMap.insert(i18n("Paul's Epistels"), QString::fromLatin1("Rom - Phile"));
+
+ QMap<QString,QString>::Iterator it;
+
+ for ( it = entryMap.begin(); it != entryMap.end(); ++it) {
+ if (it.key() != QString::null) {
+ QString text = QString::null;
+ ListKey lk = VerseKey().ParseVerseList(it.data().local8Bit(),"Genesis 1:1",true);
+ for (int i = 0; i < lk.Count(); ++i) {
+ if (i)
+ text.append(";");
+ VerseKey* element = dynamic_cast<VerseKey*>(lk.GetElement(i));
+ if (element)
+ text += QString::fromLatin1("%1 - %2")
+ .arg( QString::fromLocal8Bit((const char*)element->LowerBound()) )
+ .arg( QString::fromLocal8Bit((const char*)element->UpperBound()) );
+ else
+ text += QString::fromLocal8Bit((const char*)*lk.GetElement(i));
+ }
+ config->writeEntry(it.key(),text);
+ }
+ }
+ }
+
+ config->setGroup(QString("custom ranges"));
+ QMap<QString,QString> entryMap = config->entryMap(QString("custom ranges"));
+ QMap<QString,QString>::Iterator it;
+ for ( it = entryMap.begin(); it != entryMap.end(); ++it)
+ if (it.key() != QString::null)
+ RangeChooser->insertItem( it.key() );
+ scopeChanged(); //set initial state
+}
+
+ListKey CSearchDialogScopeChooser::getScope(){
+ return VerseKey().ParseVerseList( config->readEntry( RangeChooser->currentText() ).local8Bit(), "Genesis 1:1", true);
+}
+
+const CSwordModuleSearch::scopeType CSearchDialogScopeChooser::getScopeType() const {
+ if (noScope->isChecked()) return CSwordModuleSearch::Scope_NoScope;
+ if (lastResultScope->isChecked()) return CSwordModuleSearch::Scope_LastSearch;
+ if (useScope->isChecked()) return CSwordModuleSearch::Scope_Bounds;
+
+ return CSwordModuleSearch::Scope_NoScope;
+}
+
+const QString CSearchDialogScopeChooser::getScopeTypeString() {
+ if (noScope->isChecked()) return noScope->text();
+ if (lastResultScope->isChecked()) return lastResultScope->text();
+ if (useScope->isChecked()) return useScope->text();
+
+ return noScope->text();
+}
+void CSearchDialogScopeChooser::editButtonClicked(){
+ CSearchDialogScopeEdit *dialog = new CSearchDialogScopeEdit(this->config, this, "ranges dialog");
+ dialog->exec();
+
+ //refresh the rangechooser
+ RangeChooser->clear();
+
+ QMap<QString,QString> entryMap = config->entryMap(QString("custom ranges"));
+ QMap<QString,QString>::Iterator it;
+ for ( it = entryMap.begin(); it != entryMap.end(); ++it) {
+ qDebug(it.key().local8Bit());
+ if (it.key() != QString::null)
+ RangeChooser->insertItem( it.key() );
+ }
+}
+
+/** No descriptions */
+void CSearchDialogScopeChooser::scopeChanged(){
+ RangeLabel->setEnabled (getScopeType() == CSwordModuleSearch::Scope_Bounds ? true : false);
+ RangeChooser->setEnabled(getScopeType() == CSwordModuleSearch::Scope_Bounds ? true : false);
+ editButton->setEnabled (getScopeType() == CSwordModuleSearch::Scope_Bounds ? true : false);
+}
+
+
+CSearchDialogScopeChooser::~CSearchDialogScopeChooser(){
+ if (config) {
+ config->setGroup(QString("main"));
+ config->writeEntry("firstUsage", true);
+ config->sync();
+ delete config;
+ }
+}
+
+CSearchDialogScopeEdit::~CSearchDialogScopeEdit(){
+ //not delete config, because it points to the parent config
+}
+
+CSearchDialogScopeEdit::CSearchDialogScopeEdit(KSimpleConfig *parentconfig, QWidget *parent, const char *name ) : QDialog(parent,name,/*modal*/true) {
+
+ QGridLayout* Layout = new QGridLayout(this, 5, 5, 5, 0);
+
+ RangeChooser = new QComboBox(this);
+ QToolTip::add(RangeChooser, TT_SD_SCOPE_CHOOSER);
+ QWhatsThis::add(RangeChooser, WT_SD_SCOPE_CHOOSER);
+ RangeChooser->setEnabled(false);
+
+ RangeEdit = new QLineEdit(this);
+ QToolTip::add(RangeChooser, TT_SD_SCOPE_EDIT_LINE);
+ QWhatsThis::add(RangeChooser, WT_SD_SCOPE_EDIT_LINE);
+ RangeEdit->setEnabled(false);
+
+ RangeDisp = new QListBox(this);
+ QToolTip::add(RangeDisp, TT_SD_SCOPE_PARSED_LIST);
+ QWhatsThis::add(RangeDisp, WT_SD_SCOPE_PARSED_LIST);
+
+ newButton = new QPushButton(i18n("Add"),this);
+ QToolTip::add(newButton, TT_SD_SCOPE_NEW_SCOPE);
+ QWhatsThis::add(newButton, WT_SD_SCOPE_NEW_SCOPE);
+
+ deleteButton= new QPushButton(i18n("Delete"),this);
+ deleteButton->setEnabled(false);
+ QToolTip::add(deleteButton, TT_SD_SCOPE_DELETE_SCOPE);
+ QWhatsThis::add(deleteButton, WT_SD_SCOPE_DELETE_SCOPE);
+
+ closeButton = new QPushButton(i18n("Close"),this);
+ QToolTip::add(closeButton, TT_SD_SCOPE_CLOSE);
+ QWhatsThis::add(closeButton, WT_SD_SCOPE_CLOSE);
+
+ QLabel* RangeLabel = new QLabel(i18n("Choose custom range"),this);
+ QLabel* RangeEditLabel = new QLabel(i18n("Define range text"),this);
+ QLabel* RangeDispLabel = new QLabel(i18n("Range parsing results"),this);
+
+
+ Layout->addMultiCellWidget(RangeLabel, 0,0,0,2);
+ Layout->addMultiCellWidget(RangeChooser,1,1,0,2);
+
+ Layout->addMultiCellWidget(RangeEditLabel,0,0,4,4);
+ Layout->addMultiCellWidget(RangeEdit, 1,1,4,4);
+
+ Layout->addMultiCellWidget(RangeDispLabel,2,2,4,4);
+ Layout->addMultiCellWidget(RangeDisp, 3,4,4,4);
+
+ Layout->addMultiCellWidget(newButton, 3,3,0,0, Qt::AlignCenter);
+ Layout->addMultiCellWidget(deleteButton,3,3,2,2, Qt::AlignCenter);
+ Layout->addMultiCellWidget(closeButton, 4,4,0,2, Qt::AlignCenter);
+
+ Layout->addRowSpacing(0, RangeLabel->sizeHint().height());
+ Layout->addRowSpacing(1, RangeChooser->sizeHint().height());
+ Layout->addRowSpacing(2, RangeDispLabel->sizeHint().height());
+ Layout->addRowSpacing(3, newButton->sizeHint().height());
+ Layout->addRowSpacing(4, RangeEdit->sizeHint().height() * 4);// 4 lines
+ Layout->setRowStretch(4, 1); //only 4 will be stretched
+
+ Layout->addColSpacing(0, newButton->sizeHint().width());
+ Layout->addColSpacing(1, 2);
+ Layout->addColSpacing(2, deleteButton->sizeHint().width());
+ Layout->addColSpacing(3, 10);
+ Layout->addColSpacing(4, RangeLabel->sizeHint().width() * 2);
+ Layout->setColStretch(4, 1);//only 4 ill be stretched
+
+
+ connect(newButton,SIGNAL(clicked()),
+ this,SLOT(NewButtonClicked()));
+ connect(deleteButton, SIGNAL(clicked()),
+ this,SLOT(DeleteButtonClicked()));
+ connect(closeButton, SIGNAL(clicked()),
+ this,SLOT(closeButtonClicked()));
+ connect(RangeEdit,SIGNAL(textChanged(const QString &)),
+ this,SLOT(RangeEditTextChanged(const QString &)));
+ connect(RangeChooser,SIGNAL(activated(int)),
+ this,SLOT(RangeChooserActivated(int)));
+
+
+ config = parentconfig;
+
+ config->setGroup(QString("custom ranges"));
+ QMap<QString,QString> entryMap = config->entryMap(QString("custom ranges"));
+ QMap<QString,QString>::Iterator it;
+ for ( it = entryMap.begin(); it != entryMap.end(); ++it) {
+ qDebug(it.key().local8Bit());
+ if (it.key() != QString::null)
+ RangeChooser->insertItem( it.key() );
+ }
+ if (RangeChooser->count()>0){
+ RangeChooser->setEnabled(true);
+ RangeEdit->setEnabled(true);
+ deleteButton->setEnabled(true);
+ RangeEdit->setFocus();
+ emit RangeChooserActivated(0);
+ }
+}
+
+void CSearchDialogScopeEdit::NewButtonClicked(){
+ bool ok = false;
+ QString text = QInputDialog::getText( i18n( "Range name" ), i18n( "Please enter a name for the new range" ), QString::null, &ok, this );
+ if (!ok)
+ return;
+
+ if ( !text.isEmpty() /*&& !config->hasKey( text )*/ )
+ config->writeEntry(text, QString::null);// user entered something and pressed ok
+ //refresh the rangechooser
+ RangeChooser->clear();
+
+ QMap<QString,QString> entryMap = config->entryMap(QString("custom ranges"));
+ QMap<QString,QString>::Iterator it;
+ for ( it = entryMap.begin(); it != entryMap.end(); ++it) {
+ qDebug(it.key().local8Bit());
+ if (it.key() != QString::null)
+ RangeChooser->insertItem( it.key() );
+ }
+ if (RangeChooser->count()>0){
+ RangeChooser->setEnabled(true);
+ RangeEdit->setEnabled(true);
+ deleteButton->setEnabled(true);
+ RangeChooser->setCurrentItem( RangeChooser->count()-1 );
+ emit RangeChooserActivated( RangeChooser->currentItem() );
+ RangeEdit->setFocus();
+ }
+}
+
+void CSearchDialogScopeEdit::DeleteButtonClicked(void){
+ int index = RangeChooser->currentItem();
+ QString text=RangeChooser->currentText();
+ if ( !text.isEmpty() ){
+ config->deleteEntry(text,false);
+
+ //refresh the rangechooser
+ RangeChooser->clear();
+
+ QMap<QString,QString> entryMap = config->entryMap(QString("custom ranges"));
+ QMap<QString,QString>::Iterator it;
+ for ( it = entryMap.begin(); it != entryMap.end(); ++it) {
+ qDebug(it.key().local8Bit());
+ if (it.key() != QString::null)
+ RangeChooser->insertItem( it.key() );
+ }
+ if (RangeChooser->count()>0){
+ RangeChooser->setCurrentItem( (index>0)?(index-1):0 );
+ emit RangeChooserActivated( RangeChooser->currentItem() );
+ }
+ else{
+ RangeChooser->setEnabled(false);
+ RangeEdit->setEnabled(false);
+ deleteButton->setEnabled(false);
+ //clear
+ RangeEdit->setText(QString::null);
+ RangeDisp->clear();
+
+ }
+ }
+}
+
+void CSearchDialogScopeEdit::RangeChooserActivated(int index){
+ QString value = config->readEntry(RangeChooser->text(index));
+ RangeEdit->setText(value);
+
+ //a workaround, maybe emitted twice, which is no problem
+ emit RangeEditTextChanged(value);
+}
+
+void CSearchDialogScopeEdit::RangeEditTextChanged(const QString &text){
+ config->writeEntry(RangeChooser->currentText(), text);
+ RangeDisp->clear();
+ VerseKey key;
+ ListKey verses = key.ParseVerseList((const char*)text.local8Bit(), key, true);
+ for (int i = 0; i < verses.Count(); ++i) {
+ VerseKey* element = dynamic_cast<VerseKey*>(verses.GetElement(i));
+ if (element)
+ RangeDisp->insertItem(QString("%1 - %2").arg(QString::fromLocal8Bit((const char*)element->LowerBound())).arg(QString::fromLocal8Bit((const char*)element->UpperBound())));
+ else
+ RangeDisp->insertItem(QString::fromLocal8Bit((const char*)*verses.GetElement(i)));
+ }
+}
+
+
+/** No descriptions */
+void CSearchDialogScopeEdit::closeButtonClicked(){
+ close();
+}
diff --git a/bibletime/frontend/searchdialog/csearchdialogscope.h b/bibletime/frontend/searchdialog/csearchdialogscope.h
new file mode 100644
index 0000000..c05f253
--- /dev/null
+++ b/bibletime/frontend/searchdialog/csearchdialogscope.h
@@ -0,0 +1,98 @@
+/***************************************************************************
+ csearchdialogscope.h - description
+ -------------------
+ begin : Sun Nov 12 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSEARCHDIALOGSCOPE_H
+#define CSEARCHDIALOGSCOPE_H
+
+#include <qwidget.h>
+#include <qdialog.h>
+
+#include <listkey.h>
+#include "../../backend/cswordmodulesearch.h"
+
+class QComboBox;
+class QLineEdit;
+class QPushButton;
+class QListBox;
+class QLabel;
+class QRadioButton;
+class QButtonGroup;
+class KSimpleConfig;
+
+/**
+ * This class (CSearchDialogScope) provides the graphical user interface
+ * for the scope part of the searchdialog.
+ * It provides an easy to use interface with the following functions:
+ *
+ * -Possibility to define mltiple scopes for each module
+ * -Possibilty to define wheter we want to use no scope,
+ * the result of the last search as scope or an own set of ranges
+ *
+ * @author The BibleTime team
+ */
+
+
+
+class CSearchDialogScopeChooser : public QWidget {
+ Q_OBJECT
+public:
+ CSearchDialogScopeChooser(QWidget *parent, const char *name=0);
+ ~CSearchDialogScopeChooser();
+ ListKey getScope();
+ const CSwordModuleSearch::scopeType getScopeType() const;
+ const QString getScopeTypeString();
+
+private:
+ QComboBox* RangeChooser;
+ QButtonGroup* group;
+ KSimpleConfig* config;
+ QRadioButton *noScope;
+ QRadioButton *lastResultScope;
+ QRadioButton *useScope;
+ QPushButton *editButton;
+ QLabel *RangeLabel;
+
+private slots:
+ void editButtonClicked();
+ void scopeChanged();
+};
+
+class CSearchDialogScopeEdit : public QDialog {
+ Q_OBJECT
+public:
+ CSearchDialogScopeEdit(KSimpleConfig *config, QWidget *parent, const char *name=0);
+ ~CSearchDialogScopeEdit();
+
+private:
+ QComboBox* RangeChooser;
+ QLineEdit* RangeEdit;
+ QListBox* RangeDisp;
+ KSimpleConfig* config;
+ QPushButton* newButton;
+ QPushButton* deleteButton;
+ QPushButton* closeButton;
+
+private slots: // Private slots
+ void NewButtonClicked(void);
+ void DeleteButtonClicked(void);
+ void RangeChooserActivated(int);
+ void RangeEditTextChanged(const QString &);
+ void closeButtonClicked();
+};
+
+
+#endif
diff --git a/bibletime/frontend/searchdialog/csearchdialogtext.cpp b/bibletime/frontend/searchdialog/csearchdialogtext.cpp
new file mode 100644
index 0000000..844e423
--- /dev/null
+++ b/bibletime/frontend/searchdialog/csearchdialogtext.cpp
@@ -0,0 +1,216 @@
+/***************************************************************************
+ csearchdialogtext.cpp - description
+ -------------------
+ begin : Mit Jan 19 12:57:15 CET 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+
+//BibleTime includes
+#include "csearchdialogtext.h"
+#include "csearchdialogscope.h"
+#include "../../whatsthisdef.h"
+#include "../../tooltipdef.h"
+#include "../../backend/cswordmodulesearch.h"
+#include "../cbtconfig.h"
+
+//QT includes
+#include <qpixmap.h>
+#include <qlayout.h>
+#include <qvbuttongroup.h>
+#include <qhbuttongroup.h>
+#include <qradiobutton.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qvbox.h>
+#include <qcombobox.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+
+//KDE includes
+#include <kcombobox.h>
+#include <kiconloader.h>
+#include <kprogress.h>
+#include <klocale.h>
+
+
+CSearchDialogText::CSearchDialogText(QWidget *parent, const char *name)
+ : QWidget(parent, name, 48)
+{
+ /* the first main Group - search text, options etc.*/
+ QGroupBox *textBox = new QGroupBox(2,Qt::Vertical,i18n("Search properties"),this,"textBox");
+
+ m_editCombo = new KHistoryCombo(textBox);
+ m_editCombo->setInsertionPolicy(QComboBox::AtTop);
+ m_editCombo->setMaxCount(25);
+ m_editCombo->setDuplicatesEnabled(false);
+ m_editCombo->setFocusPolicy(QWidget::StrongFocus);
+ m_editCombo->setFocus();
+ connect( m_editCombo, SIGNAL( activated( const QString& )), m_editCombo, SLOT( addToHistory( const QString& )));
+ connect( m_editCombo, SIGNAL(returnPressed ( const QString& )),m_editCombo, SLOT(addToHistory(const QString&)) );
+
+ QToolTip::add(m_editCombo, TT_SD_SEARCH_TEXT_EDIT);
+ QWhatsThis::add(m_editCombo, WT_SD_SEARCH_TEXT_EDIT);
+
+ QHBox *settingsBox = new QHBox(textBox,"settingsBox");
+ QVBox *radioBox = new QVBox(settingsBox,"radioBox");
+
+ m_radioMultipleWords = new QRadioButton( radioBox,"RadioButton_1");
+ m_radioMultipleWords->setFocusPolicy(QWidget::TabFocus);
+ m_radioMultipleWords->setText( i18n( "Multiple Words" ) );
+ m_radioMultipleWords->setAutoResize( true );
+ m_radioMultipleWords->setChecked( true );
+ QToolTip::add(m_radioMultipleWords, TT_SD_SEARCH_MULTIPLE_WORDS);
+ QWhatsThis::add(m_radioMultipleWords, WT_SD_SEARCH_MULTIPLE_WORDS);
+
+ m_radioExactSearch = new QRadioButton(radioBox, "RadioButton_2");
+ m_radioExactSearch->setFocusPolicy(QWidget::TabFocus);
+ m_radioExactSearch->setText( i18n( "Exact Search" ) );
+ m_radioExactSearch->setAutoResize( true );
+ QToolTip::add(m_radioExactSearch, TT_SD_SEARCH_EXACT_MATCH);
+ QWhatsThis::add(m_radioExactSearch, WT_SD_SEARCH_EXACT_MATCH);
+
+ m_radioRegularExpression = new QRadioButton(radioBox, "RadioButton_3");
+ m_radioRegularExpression->setFocusPolicy(QWidget::TabFocus);
+ m_radioRegularExpression->setText( i18n( "Regular Expression" ) );
+ m_radioRegularExpression->setAutoResize( true );
+ QToolTip::add(m_radioRegularExpression, TT_SD_SEARCH_REGEXP );
+ QWhatsThis::add(m_radioRegularExpression, WT_SD_SEARCH_REGEXP );
+
+ /* this widget is hidden - it is only used for exclusive radio button management*/
+ QVButtonGroup *bgroup1 = new QVButtonGroup();
+ bgroup1->insert(m_radioMultipleWords); //they are automatically exclusive
+ bgroup1->insert(m_radioExactSearch);
+ bgroup1->insert(m_radioRegularExpression);
+
+ m_checkCaseSensitive = new QCheckBox(settingsBox, "CheckBox_1");
+ m_checkCaseSensitive->setFocusPolicy(QWidget::TabFocus);
+ m_checkCaseSensitive->setText( i18n("Case Sensitive") );
+ QToolTip::add(m_checkCaseSensitive, TT_SD_SEARCH_CASE_SENSITIVE);
+ QWhatsThis::add(m_checkCaseSensitive, WT_SD_SEARCH_CASE_SENSITIVE);
+
+ QGroupBox *scopeBox = new QGroupBox(2,Qt::Horizontal,i18n("Search scope"),this,"scopeBox");
+ scopeChooser = new CSearchDialogScopeChooser(scopeBox, "scopeChooser");
+
+ /*the third main groupbox - progress indication */
+ QGroupBox *progressBox = new QGroupBox(2,Qt::Horizontal,i18n("Search progress"),this,"progressBox");
+
+ /* manages the 2 buttons (vertically)*/
+ QVBox *buttonBox = new QVBox(progressBox,"currentBox");
+
+ (void)new QLabel(m_editCombo,i18n("Current module:"),buttonBox);
+ (void)new QLabel(m_editCombo,i18n("Overall:"),buttonBox);
+
+ /* manages the 2 bars (vertically) */
+ QVBox *barBox = new QVBox(progressBox,"overallBox");
+ m_currentProgressBar = new KProgress(0,100,0,Horizontal,barBox, "m_currentProgressBar");
+ m_overallProgressBar = new KProgress(0,100,0,Horizontal,barBox, "m_overallProgressBar");
+
+ /* the main layout for the 3 groupboxes (vertical)*/
+ QVBoxLayout* layout_1 = new QVBoxLayout( this );
+ layout_1->setAutoAdd(false);
+
+ textBox->setFixedHeight( textBox->sizeHint().height() );
+ layout_1->addWidget( textBox,1, Qt::AlignTop );
+
+ layout_1->addWidget( scopeBox, Qt::AlignVCenter);
+ scopeBox->setFixedHeight( scopeBox->sizeHint().height() );
+
+ progressBox->setFixedHeight( progressBox->sizeHint().height() );
+ layout_1->addWidget( progressBox,1,Qt::AlignBottom );
+
+
+ readSettings();
+}
+
+CSearchDialogText::~CSearchDialogText() {
+ saveSettings();
+}
+
+const QString CSearchDialogText::getText() const {
+ return m_editCombo->currentText();
+}
+
+void CSearchDialogText::setText(const QString text){
+ //only insert the item to the list if it's not yet included
+ bool found = false;
+ for (int i = 0; !found && i < m_editCombo->count(); ++i) {
+ if (m_editCombo->text(i) == text)
+ found = true;
+ }
+ if (!found) {
+ m_editCombo->insertItem(text,0);
+ m_editCombo->setCurrentItem(0);
+ }
+ m_editCombo->setFocus();
+}
+
+const bool CSearchDialogText::isCaseSensitive() {
+ return m_checkCaseSensitive->isChecked();
+}
+
+const int CSearchDialogText::getSearchType() {
+ int ret = CSwordModuleSearch::multipleWords; //"multiple words" is standard
+ if (m_radioExactSearch->isChecked()) {
+ ret = CSwordModuleSearch::exactPhrase;
+ }
+ else if (m_radioRegularExpression->isChecked()) {
+ ret = CSwordModuleSearch::regExp;
+ }
+ return ret;
+}
+
+const QString CSearchDialogText::getSearchTypeString() {
+ QString ret = m_radioMultipleWords->text(); //"multiple words" is standard
+ if (m_radioExactSearch->isChecked()) {
+ ret = m_radioExactSearch->text();
+ }
+ else if (m_radioRegularExpression->isChecked()) {
+ ret = m_radioRegularExpression->text();
+ }
+ return ret;
+
+}
+void CSearchDialogText::updateCurrentProgress(const unsigned short int percent){
+ m_currentProgressBar->setValue(percent);
+}
+
+void CSearchDialogText::updateOverallProgress(const unsigned short int percent){
+ m_overallProgressBar->setValue(percent);
+}
+
+/** resets the widgets. */
+void CSearchDialogText::reset(){
+ m_currentProgressBar->setValue(0);
+ m_overallProgressBar->setValue(0);
+ m_editCombo->clear();
+}
+
+/** Reads settings to restore the last used state. */
+void CSearchDialogText::readSettings(){
+ QStringList list = CBTConfig::get( CBTConfig::searchCompletionTexts );
+ m_editCombo->completionObject()->setItems( list );
+
+ list = CBTConfig::get(CBTConfig::searchTexts);
+ m_editCombo->setHistoryItems( list );
+}
+
+void CSearchDialogText::saveSettings(){
+ QStringList list = m_editCombo->completionObject()->items();
+ CBTConfig::set(CBTConfig::searchCompletionTexts, list);
+
+ list = m_editCombo->historyItems();
+ CBTConfig::set(CBTConfig::searchTexts, list);
+}
diff --git a/bibletime/frontend/searchdialog/csearchdialogtext.h b/bibletime/frontend/searchdialog/csearchdialogtext.h
new file mode 100644
index 0000000..e76b87f
--- /dev/null
+++ b/bibletime/frontend/searchdialog/csearchdialogtext.h
@@ -0,0 +1,92 @@
+/***************************************************************************
+ csearchdialogtext.h - description
+ -------------------
+ begin : Mit Jan 19 12:57:15 CET 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSEARCHDIALOGTEXT_H
+#define CSEARCHDIALOGTEXT_H
+
+//Qt includes
+#include <qwidget.h>
+
+class KHistoryCombo;
+class QRadioButton;
+class QCheckBox;
+class KProgress;
+class CSearchDialogScopeChooser;
+
+/** First tab page of the searchdialog.
+ * This class is the first tab pge of the searchdialog.
+ * It provides the interface to define the search text, the search scope and the modules to search in.
+ */
+class CSearchDialogText : public QWidget
+{
+ Q_OBJECT
+public:
+ /**
+ * The constructor of the search dialog search tab page.
+ */
+ CSearchDialogText(QWidget *parent = 0, const char *name = 0);
+ virtual ~CSearchDialogText();
+ /**
+ * Returns the scopechooser
+ */
+ CSearchDialogScopeChooser *scopeChooser;
+ /**
+ * Returns the text the user want to search for
+ */
+ const QString getText() const;
+ /**
+ * Sets the search text
+ */
+ void setText(const QString);
+ /**
+ * Returns true if case sensitive search is enabled.
+ */
+ const bool isCaseSensitive();
+ /**
+ * Returns the current type of search.
+ */
+ const int getSearchType();
+ /**
+ * Returns the string of current type of search.
+ */
+ const QString getSearchTypeString();
+ /**
+ * Updates the progress bar for the modulw which is searched at the moment
+ */
+ void updateCurrentProgress(const unsigned short int);
+ /**
+ * Updates the progres bar which gives the progress for the whole search
+ */
+ void updateOverallProgress(const unsigned short int);
+ /**
+ * Resets the widgets.
+ */
+ void reset();
+
+private:
+ void readSettings();
+ void saveSettings();
+
+ KHistoryCombo *m_editCombo;
+ QRadioButton *m_radioMultipleWords;
+ QRadioButton *m_radioExactSearch;
+ QRadioButton *m_radioRegularExpression;
+ QCheckBox *m_checkCaseSensitive;
+ KProgress *m_currentProgressBar;
+ KProgress *m_overallProgressBar;
+};
+#endif
diff --git a/bibletime/frontend/thirdparty/Makefile.am b/bibletime/frontend/thirdparty/Makefile.am
new file mode 100644
index 0000000..ba0e987
--- /dev/null
+++ b/bibletime/frontend/thirdparty/Makefile.am
@@ -0,0 +1,10 @@
+KDE_CXXFLAGS=-fno-rtti -fno-exceptions
+SUBDIRS = qt3stuff
+INCLUDES = $(all_includes)
+libthirdparty_a_METASOURCES = AUTO
+noinst_LIBRARIES = libthirdparty.a
+libthirdparty_a_SOURCES = dummy.cpp
+EXTRA_DIST = $(libthirdparty_a_SOURCES)
+
+dummy.cpp:
+ touch dummy.cpp
diff --git a/bibletime/frontend/thirdparty/Makefile.in b/bibletime/frontend/thirdparty/Makefile.in
new file mode 100644
index 0000000..06993a3
--- /dev/null
+++ b/bibletime/frontend/thirdparty/Makefile.in
@@ -0,0 +1,646 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+KDE_CXXFLAGS = -fno-rtti -fno-exceptions
+SUBDIRS = qt3stuff
+INCLUDES = $(all_includes)
+#>- libthirdparty_a_METASOURCES = AUTO
+noinst_LIBRARIES = libthirdparty.a
+libthirdparty_a_SOURCES = dummy.cpp
+EXTRA_DIST = $(libthirdparty_a_SOURCES)
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../../config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I../../..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libthirdparty_a_LIBADD =
+#>- libthirdparty_a_OBJECTS = dummy.$(OBJEXT)
+#>+ 1
+libthirdparty_a_OBJECTS = dummy.$(OBJEXT)
+AR = ar
+CXXFLAGS = @CXXFLAGS@
+#>- CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+CXXLD = $(CXX)
+#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
+#>+ 1
+CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+#>- DEP_FILES = .deps/dummy.P
+#>+ 4
+@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/libthirdparty_a.all_cpp.P \
+ .deps/dummy.P
+@KDE_USE_FINAL_FALSE@DEP_FILES = .deps/dummy.P
+
+SOURCES = $(libthirdparty_a_SOURCES)
+OBJECTS = $(libthirdparty_a_OBJECTS)
+
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .cpp .lo .o .obj .s
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/thirdparty/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/thirdparty/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/frontend/thirdparty/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.s.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libthirdparty.a: $(libthirdparty_a_OBJECTS) $(libthirdparty_a_DEPENDENCIES)
+ -rm -f libthirdparty.a
+ $(AR) cru libthirdparty.a $(libthirdparty_a_OBJECTS) $(libthirdparty_a_LIBADD)
+ $(RANLIB) libthirdparty.a
+.cpp.o:
+ $(CXXCOMPILE) -c $<
+.cpp.obj:
+ $(CXXCOMPILE) -c `cygpath -w $<`
+.cpp.lo:
+ $(LTCXXCOMPILE) -c $<
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+@SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+ rev="$$subdir $$rev"; \
+ test "$$subdir" = "." && dot_seen=yes; \
+ done; \
+ test "$$dot_seen" = "no" && rev=". $$rev"; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/frontend/thirdparty
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/frontend/thirdparty/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+ for subdir in $(SUBDIRS); do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ chmod 777 $(distdir)/$$subdir; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
+ || exit 1; \
+ fi; \
+ done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+ -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+ @echo '$(COMPILE) -c $<'; \
+ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.c
+ @echo '$(LTCOMPILE) -c $<'; \
+ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+
+%.o: %.cpp
+ @echo '$(CXXCOMPILE) -c $<'; \
+ $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.cpp
+ @echo '$(LTCXXCOMPILE) -c $<'; \
+ $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am:
+uninstall: uninstall-recursive
+all-am: Makefile $(LIBRARIES)
+all-redirect: all-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
+ mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+#>- clean-am: clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+#>- clean-depend clean-generic mostlyclean-am
+#>+ 2
+clean-am: clean-final clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+ clean-depend clean-generic mostlyclean-am
+
+#>- clean: clean-recursive
+#>+ 1
+clean: kde-rpo-clean clean-recursive
+
+distclean-am: distclean-noinstLIBRARIES distclean-compile \
+ distclean-libtool distclean-tags distclean-depend \
+ distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-recursive
+
+maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-tags maintainer-clean-depend \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool install-data-recursive \
+uninstall-data-recursive install-exec-recursive \
+uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
+all-recursive check-recursive installcheck-recursive info-recursive \
+dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs-am installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+dummy.cpp:
+ touch dummy.cpp
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 2
+docs-am:
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/thirdparty/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/frontend/thirdparty/Makefile.in
+
+
+#>+ 11
+libthirdparty_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/dummy.cpp
+ @echo 'creating libthirdparty_a.all_cpp.cpp ...'; \
+ rm -f libthirdparty_a.all_cpp.files libthirdparty_a.all_cpp.final; \
+ echo "#define KDE_USE_FINAL 1" >> libthirdparty_a.all_cpp.final; \
+ for file in dummy.cpp ; do \
+ echo "#include \"$$file\"" >> libthirdparty_a.all_cpp.files; \
+ test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libthirdparty_a.all_cpp.final; \
+ done; \
+ cat libthirdparty_a.all_cpp.final libthirdparty_a.all_cpp.files > libthirdparty_a.all_cpp.cpp; \
+ rm -f libthirdparty_a.all_cpp.final libthirdparty_a.all_cpp.files
+
+#>+ 3
+clean-final:
+ -rm -f libthirdparty_a.all_cpp.cpp
+
+#>+ 2
+final:
+ $(MAKE) all-am
+#>+ 2
+no-final:
+ $(MAKE) all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/frontend/thirdparty/dummy.cpp b/bibletime/frontend/thirdparty/dummy.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/bibletime/frontend/thirdparty/dummy.cpp
diff --git a/bibletime/frontend/thirdparty/qt3stuff/Makefile.am b/bibletime/frontend/thirdparty/qt3stuff/Makefile.am
new file mode 100644
index 0000000..b10c1cb
--- /dev/null
+++ b/bibletime/frontend/thirdparty/qt3stuff/Makefile.am
@@ -0,0 +1,25 @@
+KDE_OPTIONS = qtonly
+
+INCLUDES = $(all_includes)
+
+libqt3stuff_a_METASOURCES = AUTO
+
+noinst_LIBRARIES = libqt3stuff.a
+
+libqt3stuff_a_SOURCES = \
+qrichtext.cpp \
+qstylesheet.cpp \
+qtextview.cpp \
+qtextedit.cpp \
+qcomplextext.cpp
+
+all_headers = qrichtext_p.h \
+qstylesheet.h \
+qtextview.h \
+qtextedit.h \
+qcomplextext_p.h \
+qt3stuff.h \
+qcleanuphandler.h
+
+EXTRA_DIST = $(libqt3stuff_a_SOURCES) $(all_headers)
+
diff --git a/bibletime/frontend/thirdparty/qt3stuff/Makefile.in b/bibletime/frontend/thirdparty/qt3stuff/Makefile.in
new file mode 100644
index 0000000..5c435d4
--- /dev/null
+++ b/bibletime/frontend/thirdparty/qt3stuff/Makefile.in
@@ -0,0 +1,610 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../../../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+KDE_OPTIONS = qtonly
+
+INCLUDES = $(all_includes)
+
+#>- libqt3stuff_a_METASOURCES = AUTO
+
+noinst_LIBRARIES = libqt3stuff.a
+
+libqt3stuff_a_SOURCES = qrichtext.cpp qstylesheet.cpp qtextview.cpp qtextedit.cpp qcomplextext.cpp
+
+
+all_headers = qrichtext_p.h qstylesheet.h qtextview.h qtextedit.h qcomplextext_p.h qt3stuff.h qcleanuphandler.h
+
+
+EXTRA_DIST = $(libqt3stuff_a_SOURCES) $(all_headers)
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../../../config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I../../../..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libqt3stuff_a_LIBADD =
+#>- libqt3stuff_a_OBJECTS = qrichtext.$(OBJEXT) qstylesheet.$(OBJEXT) \
+#>- qtextview.$(OBJEXT) qtextedit.$(OBJEXT) qcomplextext.$(OBJEXT)
+#>+ 6
+libqt3stuff_a_final_OBJECTS = libqt3stuff_a.all_cpp.o
+libqt3stuff_a_nofinal_OBJECTS = qrichtext.$(OBJEXT) qstylesheet.$(OBJEXT) \
+qtextview.$(OBJEXT) qtextedit.$(OBJEXT) qcomplextext.$(OBJEXT)\
+qstylesheet.moc.o qrichtext_p.moc.o qtextview.moc.o qtextedit.moc.o
+@KDE_USE_FINAL_FALSE@libqt3stuff_a_OBJECTS = $(libqt3stuff_a_nofinal_OBJECTS)
+@KDE_USE_FINAL_TRUE@libqt3stuff_a_OBJECTS = $(libqt3stuff_a_final_OBJECTS)
+AR = ar
+CXXFLAGS = @CXXFLAGS@
+#>- CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+CXXLD = $(CXX)
+#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
+#>+ 1
+CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+#>- DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+#>+ 4
+KDE_DIST=qcomplextext_p.h qtextview.h qcleanuphandler.h qtextedit.h qt3stuff.h qrichtext_p.h qstylesheet.h
+
+DISTFILES= $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
+
+
+TAR = tar
+GZIP_ENV = --best
+#>- DEP_FILES = .deps/qcomplextext.P .deps/qrichtext.P .deps/qstylesheet.P \
+#>- .deps/qtextedit.P .deps/qtextview.P
+#>+ 6
+@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/qstylesheet.moc.P $(DEPDIR)/qrichtext_p.moc.P $(DEPDIR)/qtextview.moc.P $(DEPDIR)/qtextedit.moc.P $(DEPDIR)/libqt3stuff_a.all_cpp.P \
+ .deps/qcomplextext.P .deps/qrichtext.P .deps/qstylesheet.P \
+.deps/qtextedit.P .deps/qtextview.P
+@KDE_USE_FINAL_FALSE@DEP_FILES = $(DEPDIR)/qstylesheet.moc.P $(DEPDIR)/qrichtext_p.moc.P $(DEPDIR)/qtextview.moc.P $(DEPDIR)/qtextedit.moc.P .deps/qcomplextext.P .deps/qrichtext.P .deps/qstylesheet.P \
+.deps/qtextedit.P .deps/qtextview.P
+
+SOURCES = $(libqt3stuff_a_SOURCES)
+OBJECTS = $(libqt3stuff_a_OBJECTS)
+
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .cpp .lo .o .obj .s
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/thirdparty/qt3stuff/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/thirdparty/qt3stuff/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/frontend/thirdparty/qt3stuff/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.s.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libqt3stuff.a: $(libqt3stuff_a_OBJECTS) $(libqt3stuff_a_DEPENDENCIES)
+ -rm -f libqt3stuff.a
+ $(AR) cru libqt3stuff.a $(libqt3stuff_a_OBJECTS) $(libqt3stuff_a_LIBADD)
+ $(RANLIB) libqt3stuff.a
+.cpp.o:
+ $(CXXCOMPILE) -c $<
+.cpp.obj:
+ $(CXXCOMPILE) -c `cygpath -w $<`
+.cpp.lo:
+ $(LTCXXCOMPILE) -c $<
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/frontend/thirdparty/qt3stuff
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/frontend/thirdparty/qt3stuff/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+ -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+ @echo '$(COMPILE) -c $<'; \
+ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.c
+ @echo '$(LTCOMPILE) -c $<'; \
+ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+
+%.o: %.cpp
+ @echo '$(CXXCOMPILE) -c $<'; \
+ $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.cpp
+ @echo '$(LTCXXCOMPILE) -c $<'; \
+ $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
+ mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+#>- clean-am: clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+#>- clean-depend clean-generic mostlyclean-am
+#>+ 2
+clean-am: clean-metasources clean-final clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+ clean-depend clean-generic mostlyclean-am
+
+#>- clean: clean-am
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+distclean-am: distclean-noinstLIBRARIES distclean-compile \
+ distclean-libtool distclean-tags distclean-depend \
+ distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-tags maintainer-clean-depend \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 3
+qstylesheet.moc.cpp: $(srcdir)/qstylesheet.h
+ $(MOC) $(srcdir)/qstylesheet.h -o qstylesheet.moc.cpp
+
+#>+ 3
+qrichtext_p.moc.cpp: $(srcdir)/qrichtext_p.h
+ $(MOC) $(srcdir)/qrichtext_p.h -o qrichtext_p.moc.cpp
+
+#>+ 3
+qtextview.moc.cpp: $(srcdir)/qtextview.h
+ $(MOC) $(srcdir)/qtextview.h -o qtextview.moc.cpp
+
+#>+ 3
+qtextedit.moc.cpp: $(srcdir)/qtextedit.h
+ $(MOC) $(srcdir)/qtextedit.h -o qtextedit.moc.cpp
+
+#>+ 3
+clean-metasources:
+ -rm -f qstylesheet.moc.cpp qrichtext_p.moc.cpp qtextview.moc.cpp qtextedit.moc.cpp
+
+#>+ 2
+docs-am:
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/frontend/thirdparty/qt3stuff/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/frontend/thirdparty/qt3stuff/Makefile.in
+
+
+#>+ 11
+libqt3stuff_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/qrichtext.cpp $(srcdir)/qstylesheet.cpp $(srcdir)/qtextview.cpp $(srcdir)/qtextedit.cpp $(srcdir)/qcomplextext.cpp qstylesheet.moc.cpp qrichtext_p.moc.cpp qtextview.moc.cpp qtextedit.moc.cpp
+ @echo 'creating libqt3stuff_a.all_cpp.cpp ...'; \
+ rm -f libqt3stuff_a.all_cpp.files libqt3stuff_a.all_cpp.final; \
+ echo "#define KDE_USE_FINAL 1" >> libqt3stuff_a.all_cpp.final; \
+ for file in qrichtext.cpp qstylesheet.cpp qtextview.cpp qtextedit.cpp qcomplextext.cpp qstylesheet.moc.cpp qrichtext_p.moc.cpp qtextview.moc.cpp qtextedit.moc.cpp; do \
+ echo "#include \"$$file\"" >> libqt3stuff_a.all_cpp.files; \
+ test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libqt3stuff_a.all_cpp.final; \
+ done; \
+ cat libqt3stuff_a.all_cpp.final libqt3stuff_a.all_cpp.files > libqt3stuff_a.all_cpp.cpp; \
+ rm -f libqt3stuff_a.all_cpp.final libqt3stuff_a.all_cpp.files
+
+#>+ 3
+clean-final:
+ -rm -f libqt3stuff_a.all_cpp.cpp
+
+#>+ 2
+final:
+ $(MAKE) libqt3stuff_a_OBJECTS="$(libqt3stuff_a_final_OBJECTS)" all-am
+#>+ 2
+no-final:
+ $(MAKE) libqt3stuff_a_OBJECTS="$(libqt3stuff_a_nofinal_OBJECTS)" all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/frontend/thirdparty/qt3stuff/qcleanuphandler.h b/bibletime/frontend/thirdparty/qt3stuff/qcleanuphandler.h
new file mode 100644
index 0000000..39f5af8
--- /dev/null
+++ b/bibletime/frontend/thirdparty/qt3stuff/qcleanuphandler.h
@@ -0,0 +1,113 @@
+#ifndef QCLEANUPHANDLER_H
+#define QCLEANUPHANDLER_H
+
+#ifndef QT_H
+#include <qlist.h>
+#include <qguardedptr.h>
+#endif // QT_H
+
+template<class Type>
+class Q_EXPORT QGuardedCleanupHandler
+{
+public:
+ ~QGuardedCleanupHandler() { clear(); }
+
+ void add( Type* object )
+ {
+ cleanupObjects.insert( 0, new QGuardedPtr<Type>(object) );
+ }
+
+ void remove( Type *object )
+ {
+ QListIterator<QGuardedPtr<Type> > it( cleanupObjects );
+ while ( it.current() ) {
+ QGuardedPtr<Type>* guard = it.current();
+ ++it;
+ if ( (Type *)guard == object ) {
+ cleanupObjects.removeRef( guard );
+ delete guard;
+ break;
+ }
+ }
+ }
+
+ bool isEmpty() const
+ {
+ QListIterator<QGuardedPtr<Type> > it( cleanupObjects );
+ while ( it.current() ) {
+ QGuardedPtr<Type>* guard = it.current();
+ ++it;
+ if ( (Type*)*guard )
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+ void clear() {
+ QListIterator<QGuardedPtr<Type> > it( cleanupObjects );
+ it.toLast();
+ while ( it.current() ) {
+ QGuardedPtr<Type>* guard = it.current();
+ --it;
+ cleanupObjects.removeRef( guard );
+ delete (Type*)*guard;
+ delete guard;
+ }
+ }
+
+private:
+ QList<QGuardedPtr<Type> > cleanupObjects;
+};
+
+template<class Type>
+class Q_EXPORT QCleanupHandler
+{
+public:
+ QCleanupHandler() : cleanupObjects( 0 )
+ {}
+ ~QCleanupHandler() { clear(); }
+
+ void add( Type* object )
+ {
+ if ( !cleanupObjects ) {
+ cleanupObjects = new QList<Type>;
+ }
+ cleanupObjects->insert( 0, object );
+ }
+
+ void remove( Type *object )
+ {
+ if ( !cleanupObjects )
+ return;
+ if ( object )
+ cleanupObjects->removeRef( object );
+ }
+
+ bool isEmpty() const
+ {
+ return cleanupObjects ? cleanupObjects->isEmpty() : TRUE;
+ }
+
+ void clear()
+ {
+ if ( !cleanupObjects )
+ return;
+
+ QListIterator<Type> it( *cleanupObjects );
+ it.toLast();
+ while ( it.current() ) {
+ Type* object = it.current();
+ --it;
+ cleanupObjects->removeRef( object );
+ delete object;
+ }
+
+ delete cleanupObjects;
+ cleanupObjects = 0;
+ }
+
+private:
+ QList<Type> *cleanupObjects;
+};
+
+#endif //QCLEANUPHANDLER_H
diff --git a/bibletime/frontend/thirdparty/qt3stuff/qcomplextext.cpp b/bibletime/frontend/thirdparty/qt3stuff/qcomplextext.cpp
new file mode 100644
index 0000000..8f675f2
--- /dev/null
+++ b/bibletime/frontend/thirdparty/qt3stuff/qcomplextext.cpp
@@ -0,0 +1,1313 @@
+#include "qcomplextext_p.h"
+#include "qrichtext_p.h"
+//#include "qfontdata_p.h"
+#include "qfontmetrics.h"
+#include "qrect.h"
+#include <stdlib.h>
+
+using namespace Qt3;
+
+// -----------------------------------------------------
+
+/* a small helper class used internally to resolve Bidi embedding levels.
+ Each line of text caches the embedding level at the start of the line for faster
+ relayouting
+*/
+QBidiContext::QBidiContext( uchar l, QChar::Direction e, QBidiContext *p, bool o )
+ : level(l) , override(o), dir(e)
+{
+ if ( p )
+ p->ref();
+ parent = p;
+ count = 0;
+}
+
+QBidiContext::~QBidiContext()
+{
+ if( parent && parent->deref() )
+ delete parent;
+}
+
+//static QChar *shapeBuffer = 0;
+//static int shapeBufSize = 0;
+
+/*
+ Arabic shaping obeys a number of rules according to the joining classes (see Unicode book, section on
+ arabic).
+
+ Each unicode char has a joining class (right, dual (left&right), center (joincausing) or transparent).
+ transparent joining is not encoded in QChar::joining(), but applies to all combining marks and format marks.
+
+ Right join-causing: dual + center
+ Left join-causing: dual + right + center
+
+ Rules are as follows (for a string already in visual order, as we have it here):
+
+ R1 Transparent characters do not affect joining behaviour.
+ R2 A right joining character, that has a right join-causing char on the right will get form XRight
+ (R3 A left joining character, that has a left join-causing char on the left will get form XLeft)
+ Note: the above rule is meaningless, as there are no pure left joining characters defined in Unicode
+ R4 A dual joining character, that has a left join-causing char on the left and a right join-causing char on
+ the right will get form XMedial
+ R5 A dual joining character, that has a right join causing char on the right, and no left join causing char on the left
+ will get form XRight
+ R6 A dual joining character, that has a left join causing char on the left, and no right join causing char on the right
+ will get form XLeft
+ R7 Otherwise the character will get form XIsolated
+
+ Additionally we have to do the minimal ligature support for lam-alef ligatures:
+
+ L1 Transparent characters do not affect ligature behaviour.
+ L2 Any sequence of Alef(XRight) + Lam(XMedial) will form the ligature Alef.Lam(XLeft)
+ L3 Any sequence of Alef(XRight) + Lam(XLeft) will form the ligature Alef.Lam(XIsolated)
+
+ The two functions defined in this class do shaping in visual and logical order. For logical order just replace right with
+ previous and left with next in the above rules ;-)
+*/
+
+/*
+ Two small helper functions for arabic shaping. They get the next shape causing character on either
+ side of the char in question. Implements rule R1.
+
+ leftChar() returns true if the char to the left is a left join-causing char
+ rightChar() returns true if the char to the right is a right join-causing char
+*/
+static inline const QChar *prevChar( const QString &str, int pos )
+{
+ //qDebug("leftChar: pos=%d", pos);
+ pos--;
+ const QChar *ch = str.unicode() + pos;
+ while( pos > -1 ) {
+ if( !ch->isMark() )
+ return ch;
+ pos--;
+ ch--;
+ }
+ return &QChar::replacement;
+}
+
+static inline const QChar *nextChar( const QString &str, int pos)
+{
+ pos++;
+ int len = str.length();
+ const QChar *ch = str.unicode() + pos;
+ while( pos < len ) {
+ //qDebug("rightChar: %d isLetter=%d, joining=%d", pos, ch.isLetter(), ch.joining());
+ if( !ch->isMark() )
+ return ch;
+ // assume it's a transparent char, this might not be 100% correct
+ pos++;
+ ch++;
+ }
+ return &QChar::replacement;
+}
+
+static inline bool prevVisualCharJoins( const QString &str, int pos)
+{
+ return ( prevChar( str, pos )->joining() != QChar::OtherJoining );
+}
+
+static inline bool nextVisualCharJoins( const QString &str, int pos)
+{
+ QChar::Joining join = nextChar( str, pos )->joining();
+ return ( join == QChar::Dual || join == QChar::Center );
+}
+
+// QT2HACK
+#if 0
+
+QComplexText::Shape QComplexText::glyphVariant( const QString &str, int pos)
+{
+ // ignores L1 - L3, done in the codec
+ QChar::Joining joining = str[pos].joining();
+ //qDebug("checking %x, joining=%d", str[pos].unicode(), joining);
+ switch ( joining ) {
+ case QChar::OtherJoining:
+ case QChar::Center:
+ // these don't change shape
+ return XIsolated;
+ case QChar::Right:
+ // only rule R2 applies
+ if( nextVisualCharJoins( str, pos ) )
+ return XFinal;
+ return XIsolated;
+ case QChar::Dual:
+ bool right = nextVisualCharJoins( str, pos );
+ bool left = prevVisualCharJoins( str, pos );
+ //qDebug("dual: right=%d, left=%d", right, left);
+ if( right && left )
+ return XMedial;
+ else if ( right )
+ return XFinal;
+ else if ( left )
+ return XInitial;
+ else
+ return XIsolated;
+ }
+ return XIsolated;
+}
+
+/* and the same thing for logical ordering :)
+ */
+static inline bool prevLogicalCharJoins( const QString &str, int pos)
+{
+ return ( nextChar( str, pos )->joining() != QChar::OtherJoining );
+}
+
+static inline bool nextLogicalCharJoins( const QString &str, int pos)
+{
+ QChar::Joining join = prevChar( str, pos )->joining();
+ return ( join == QChar::Dual || join == QChar::Center );
+}
+
+
+QComplexText::Shape QComplexText::glyphVariantLogical( const QString &str, int pos)
+{
+ // ignores L1 - L3, ligatures are job of the codec
+ QChar::Joining joining = str[pos].joining();
+ //qDebug("checking %x, joining=%d", str[pos].unicode(), joining);
+ switch ( joining ) {
+ case QChar::OtherJoining:
+ case QChar::Center:
+ // these don't change shape
+ return XIsolated;
+ case QChar::Right:
+ // only rule R2 applies
+ if( nextLogicalCharJoins( str, pos ) )
+ return XFinal;
+ return XIsolated;
+ case QChar::Dual:
+ bool right = nextLogicalCharJoins( str, pos );
+ bool left = prevLogicalCharJoins( str, pos );
+ //qDebug("dual: right=%d, left=%d", right, left);
+ if( right && left )
+ return XMedial;
+ else if ( right )
+ return XFinal;
+ else if ( left )
+ return XInitial;
+ else
+ return XIsolated;
+ }
+ return XIsolated;
+}
+
+// -------------------------------------------------------------
+
+// The unicode to unicode shaping codec.
+// does only presentation forms B at the moment, but that should be enough for
+// simple display
+static const ushort arabicUnicodeMapping[256][4] = {
+ // base of shaped forms, and number-1 of them ( 0 for non shaping,
+ // 1 for right binding and 3 for dual binding
+ { 0x0600, 0 }, // 0x600
+ { 0x0601, 0 }, // 0x601
+ { 0x0602, 0 }, // 0x602
+ { 0x0603, 0 }, // 0x603
+ { 0x0604, 0 }, // 0x604
+ { 0x0605, 0 }, // 0x605
+ { 0x0606, 0 }, // 0x606
+ { 0x0607, 0 }, // 0x607
+ { 0x0608, 0 }, // 0x608
+ { 0x0609, 0 }, // 0x609
+ { 0x060a, 0 }, // 0x60a
+ { 0x060b, 0 }, // 0x60b
+ { 0x060c, 0 }, // 0x60c Arabic comma
+ { 0x060d, 0 }, // 0x60d
+ { 0x060e, 0 }, // 0x60e
+ { 0x060f, 0xfffd, 0xfffd, 0xfffd }, // 0x60f
+
+ { 0x0610, 0 }, // 0x610
+ { 0x0611, 0 }, // 0x611
+ { 0x0612, 0 }, // 0x612
+ { 0x0613, 0 }, // 0x613
+ { 0x0614, 0 }, // 0x614
+ { 0x0615, 0 }, // 0x615
+ { 0x0616, 0 }, // 0x616
+ { 0x0617, 0 }, // 0x617
+ { 0x0618, 0 }, // 0x618
+ { 0x0619, 0 }, // 0x619
+ { 0x061a, 0 }, // 0x61a
+ { 0x061b, 0 }, // 0x61b Arabic semicolon
+ { 0x061c, 0 }, // 0x61c
+ { 0x061d, 0 }, // 0x61d
+ { 0x061e, 0 }, // 0x61e
+ { 0x061f, 0 }, // 0x61f Arabic question mark
+
+ { 0x0620, 0 }, // 0x620
+ { 0xfe80, 0 }, // 0x621 Hamza
+ { 0xfe81, 1 }, // 0x622 R Alef with Madda above
+ { 0xfe83, 1 }, // 0x623 R Alef with Hamza above
+ { 0xfe85, 1 }, // 0x624 R Waw with Hamza above
+ { 0xfe87, 1 }, // 0x625 R Alef with Hamza below
+ { 0xfe89, 3 }, // 0x626 D Yeh with Hamza above
+ { 0xfe8d, 1 }, // 0x627 R Alef
+ { 0xfe8f, 3 }, // 0x628 D Beh
+ { 0xfe93, 1 }, // 0x629 R Teh Marbuta
+ { 0xfe95, 3 }, // 0x62a D Teh
+ { 0xfe99, 3 }, // 0x62b D Theh
+ { 0xfe9d, 3 }, // 0x62c D Jeem
+ { 0xfea1, 3 }, // 0x62d D Hah
+ { 0xfea5, 3 }, // 0x62e D Khah
+ { 0xfea9, 1 }, // 0x62f R Dal
+
+ { 0xfeab, 1 }, // 0x630 R Thal
+ { 0xfead, 1 }, // 0x631 R Reh
+ { 0xfeaf, 1 }, // 0x632 R Zain
+ { 0xfeb1, 1 }, // 0x633 D Seen
+ { 0xfeb5, 3 }, // 0x634 D Sheen
+ { 0xfeb9, 3 }, // 0x635 D Sad
+ { 0xfebd, 3 }, // 0x636 D Dad
+ { 0xfec1, 3 }, // 0x637 D Tah
+ { 0xfec5, 3 }, // 0x638 D Zah
+ { 0xfec9, 3 }, // 0x639 D Ain
+ { 0xfecd, 3 }, // 0x63a D Ghain
+ { 0x063b, 0 }, // 0x63b
+ { 0x063c, 0 }, // 0x63c
+ { 0x063d, 0 }, // 0x63d
+ { 0x063e, 0 }, // 0x63e
+ { 0x063f, 0 }, // 0x63f
+
+ { 0x0640, 0 }, // 0x640 C Tatweel
+ { 0xfed1, 3 }, // 0x641 D Feh
+ { 0xfed5, 3 }, // 0x642 D Qaf
+ { 0xfed9, 3 }, // 0x643 D Kaf
+ { 0xfedd, 3 }, // 0x644 D Lam
+ { 0xfee1, 3 }, // 0x645 D Meem
+ { 0xfee5, 3 }, // 0x646 D Noon
+ { 0xfee9, 3 }, // 0x647 D Heh
+ { 0xfeed, 1 }, // 0x648 R Waw
+ { 0xfeef, 1 }, // 0x649 R Alef Maksura // ### Dual according to newest arabicshaping.txt
+ { 0xfef1, 3 }, // 0x64a D Yeh
+ { 0x064b, 0 }, // 0x64b Mark Fathatan
+ { 0x064c, 0 }, // 0x64c Mark Dammatan
+ { 0x064d, 0 }, // 0x64d Mark Kasratan
+ { 0x064e, 0 }, // 0x64e Mark Fatha
+ { 0x064f, 0 }, // 0x64f Mark Damma
+
+ { 0x0650, 0 }, // 0x650 Mark Kasra
+ { 0x0651, 0 }, // 0x651 Mark Shadda
+ { 0x0652, 0 }, // 0x652 Mark Sukan
+ // these do not exist in latin6 anymore:
+ { 0x0653, 0 }, // 0x653 Mark Maddah above
+ { 0x0654, 0 }, // 0x654 Mark Hamza above
+ { 0x0655, 0 }, // 0x655 Mark Hamza below
+ { 0x0656, 0 }, // 0x656
+ { 0x0657, 0 }, // 0x657
+ { 0x0658, 0 }, // 0x658
+ { 0x0659, 0 }, // 0x659
+ { 0x065a, 0 }, // 0x65a
+ { 0x065b, 0 }, // 0x65b
+ { 0x065c, 0 }, // 0x65c
+ { 0x065d, 0 }, // 0x65d
+ { 0x065e, 0 }, // 0x65e
+ { 0x065f, 0 }, // 0x65f
+
+ { 0x0660, 0 }, // 0x660 Arabic 0
+ { 0x0661, 0 }, // 0x661 Arabic 1
+ { 0x0662, 0 }, // 0x662 Arabic 2
+ { 0x0663, 0 }, // 0x663 Arabic 3
+ { 0x0664, 0 }, // 0x664 Arabic 4
+ { 0x0665, 0 }, // 0x665 Arabic 5
+ { 0x0666, 0 }, // 0x666 Arabic 6
+ { 0x0667, 0 }, // 0x667 Arabic 7
+ { 0x0668, 0 }, // 0x668 Arabic 8
+ { 0x0669, 0 }, // 0x669 Arabic 9
+ { 0x066a, 0 }, // 0x66a Arabic % sign
+ { 0x066b, 0 }, // 0x66b Arabic decimal separator
+ { 0x066c, 0 }, // 0x66c Arabic thousands separator
+ { 0x066d, 0 }, // 0x66d Arabic five pointed star
+ { 0x066e, 0 }, // 0x66e
+ { 0x066f, 0 }, // 0x66f
+
+ // ### some glyphs do not have shaped mappings in the presentation forms A.
+ // these have the shaping set to 0 for the moment. Will have to find out better mappings for them.
+ { 0x0670, 0 }, // 0x670
+ { 0xfb50, 1 }, // 0x671 R Alef Wasla
+ { 0x0672, 0 }, // 0x672 R Alef with wavy Hamza above
+ { 0x0673, 0 }, // 0x673 R Alef with wavy Hamza below
+ { 0x0674, 0 }, // 0x674 U High Hamza
+ { 0x0675, 0 }, // 0x675 R High Hamza Alef
+ { 0x0676, 0 }, // 0x676 R High Hamza Wav
+ { 0xfbdd, 0 }, // 0x677 R U with hamza above // ### only isolated form found...
+ { 0x0678, 0 }, // 0x678 D High hamza yeh
+ { 0xfb66, 3 }, // 0x679 D ttheh
+ { 0xfb5e, 3 }, // 0x67a D theheh
+ { 0xfb52, 3 }, // 0x67b D beeh
+ { 0x067c, 0 }, // 0x67cD teh with ring
+ { 0x067d, 0 }, // 0x67d D teh with three dots above downwards
+ { 0xfb56, 3 }, // 0x67e D peh
+ { 0xfb62, 3 }, // 0x67f D teheh
+
+ { 0xfb5a, 3 }, // 0x680 D beheh
+ { 0x0681, 0 }, // 0x681 D hah with hamza above
+ { 0x0682, 0 }, // 0x682 D hah with two dots vertical above
+ { 0xfb76, 3 }, // 0x683 D nyeh
+ { 0xfb72, 3 }, // 0x684 D dyeh
+ { 0x0685, 0 }, // 0x685 D hah with three dots above
+ { 0xfb7a, 3 }, // 0x686 D tcheh
+ { 0xfb7e, 3 }, // 0x687 D tcheheh
+ { 0xfb88, 1 }, // 0x688 R ddal
+ { 0x0689, 0 }, // 0x689 R dal with ring
+ { 0x068a, 0 }, // 0x68a R dal with dot
+ { 0x068b, 0 }, // 0x68b R dal with dot below and small tah
+ { 0xfb84, 1 }, // 0x68cR dahal
+ { 0xfb82, 1 }, // 0x68d R ddahal
+ { 0xfb86, 1 }, // 0x68e R dul
+ { 0x068f, 0 }, // 0x68f R dal with three dots above downwards
+
+ { 0x0690, 0 }, // 0x690 R dal with four dots above
+ { 0xfb8c, 1 }, // 0x691 R rreh
+ { 0x0692, 0 }, // 0x692 R reh with small v
+ { 0x0693, 0 }, // 0x693 R reh with ring
+ { 0x0694, 0 }, // 0x694 R reh with dot below
+ { 0x0695, 0 }, // 0x695 R reh with small v below
+ { 0x0696, 0 }, // 0x696 R reh with dot below and dot above
+ { 0x0697, 0 }, // 0x697 R reh with two dots above
+ { 0xfb8a, 1 }, // 0x698 R jeh
+ { 0x0699, 0 }, // 0x699 R reh with four dots above
+ { 0x069a, 0 }, // 0x69a D seen with dot below and dot above
+ { 0x069b, 0 }, // 0x69b D seen with three dots below
+ { 0x069c, 0 }, // 0x69cD seen with three dots below and three dots above
+ { 0x069d, 0 }, // 0x69d D sad with two dots below
+ { 0x069e, 0 }, // 0x69e D sad with three dots above
+ { 0x069f, 0 }, // 0x69f D tah with three dots above
+
+ { 0x06a0, 0 }, // 0x6a0 D ain with three dots above
+ { 0x06a1, 0 }, // 0x6a1 D dotless feh
+ { 0x06a2, 0 }, // 0x6a2 D feh with dot moved below
+ { 0x06a3, 0 }, // 0x6a3 D feh with dot below
+ { 0xfb6a, 3 }, // 0x6a4 D veh
+ { 0x06a5, 0 }, // 0x6a5 D feh with three dots below
+ { 0xfb6e, 3 }, // 0x6a6 D peheh
+ { 0x06a7, 0 }, // 0x6a7 D qaf with dot above
+ { 0x06a8, 0 }, // 0x6a8 D qaf woith three dots above
+ { 0xfb8e, 3 }, // 0x6a9 D keheh
+ { 0x06aa, 0 }, // 0x6aa D swash kaf
+ { 0x06ab, 0 }, // 0x6ab D kaf with ring
+ { 0x06ac, 0 }, // 0x6acD kaf with dot above
+ { 0xfbd3, 3 }, // 0x6ad D ng
+ { 0x06ae, 0 }, // 0x6ae D kaf with three dots below
+ { 0xfb92, 3 }, // 0x6af D gaf
+
+ { 0x06b0, 0 }, // 0x6b0 D gaf with ring
+ { 0xfb9a, 3 }, // 0x6b1 D ngoeh
+ { 0x06b2, 0 }, // 0x6b2 D gaf with two dots below
+ { 0xfb96, 3 }, // 0x6b3 D gueh
+ { 0x06b4, 0 }, // 0x6b4 D gaf with three dots above
+ { 0x06b5, 0 }, // 0x6b5 D lam with small v
+ { 0x06b6, 0 }, // 0x6b6 D lam with dot above
+ { 0x06b7, 0 }, // 0x6b7 D lam with three dots above
+ { 0x06b8, 0 }, // 0x6b8 D lam with three dots below
+ { 0x06b9, 0 }, // 0x6b9 D noon with dot below
+ { 0xfb9e, 1 }, // 0x6ba R noon ghunna
+ { 0xfba0, 3 }, // 0x6bb D rnoon
+ { 0x06bc, 0 }, // 0x6bcD noon with ring
+ { 0x06bd, 0 }, // 0x6bd D noon with three dots above
+ { 0xfbaa, 3 }, // 0x6be D heh doachashmee
+ { 0x06bf, 0 }, // 0x6bf D tcheh with dot above
+
+ { 0xfba4, 1 }, // 0x6c0 R heh with yeh above = ligature hamza on hah (06d5 + 0654)
+ { 0xfba6, 3 }, // 0x6c1 D heh goal
+ { 0x06c2, 0 }, // 0x6c2 R heh goal with hamza above (06c1 + 0654)
+ { 0x06c3, 0 }, // 0x6c3 R teh marbuta goal
+ { 0x06c4, 0 }, // 0x6c4 R waw with ring
+ { 0xfbe0, 1 }, // 0x6c5 R kirghiz oe
+ { 0xfbd9, 1 }, // 0x6c6 R oe
+ { 0xfbd7, 1 }, // 0x6c7 R u
+ { 0xfbdb, 1 }, // 0x6c8 R yu
+ { 0xfbe2, 1 }, // 0x6c9 R kirghiz yu
+ { 0x06ca, 0 }, // 0x6ca R waw with teo dots above
+ { 0xfbde, 1 }, // 0x6cb R ve
+ { 0x06cc, 0 }, // 0x6cc D farsi yeh
+ { 0x06cd, 0 }, // 0x6cd R yeh with tail
+ { 0x06ce, 0 }, // 0x6ce D yeh with small v
+ { 0x06cf, 0 }, // 0x6cf R waw with dot above
+
+ { 0xfbe4, 3 }, // 0x6d0 D e
+ { 0x06d1, 0 }, // 0x6d1 D yeh with three dots below
+ { 0xfbae, 1 }, // 0x6d2 R yeh barree
+ { 0xfbb0, 1 }, // 0x6d3 R yeh barree with hamza above
+ { 0x06d4, 0 }, // 0x6d4 U full stop
+ { 0x06d5, 0 }, // 0x6d5 D ae
+ { 0x06d6, 0 }, // 0x6d6 koreanic annotaion signs
+ { 0x06d7, 0 }, // 0x6d7 ...
+ { 0x06d8, 0 }, // 0x6d8
+ { 0x06d9, 0 }, // 0x6d9
+ { 0x06da, 0 }, // 0x6da
+ { 0x06db, 0 }, // 0x6db
+ { 0x06dc, 0 }, // 0x6dc
+ { 0x06dd, 0 }, // 0x6dd
+ { 0x06de, 0 }, // 0x6de
+ { 0x06df, 0 }, // 0x6df
+
+ { 0x06e0, 0 }, // 0x6e0
+ { 0x06e1, 0 }, // 0x6e1
+ { 0x06e2, 0 }, // 0x6e2
+ { 0x06e3, 0 }, // 0x6e3
+ { 0x06e4, 0 }, // 0x6e4
+ { 0x06e5, 0 }, // 0x6e5
+ { 0x06e6, 0 }, // 0x6e6
+ { 0x06e7, 0 }, // 0x6e7
+ { 0x06e8, 0 }, // 0x6e8
+ { 0x06e9, 0 }, // 0x6e9
+ { 0x06ea, 0 }, // 0x6ea
+ { 0x06eb, 0 }, // 0x6eb
+ { 0x06ec, 0 }, // 0x6ec
+ { 0x06ed, 0 }, // 0x6ed
+ { 0x06ee, 0 }, // 0x6ee
+ { 0x06ef, 0 }, // 0x6ef
+
+ { 0x06f0, 0 }, // 0x6f0 Arabic indic digit 0
+ { 0x06f1, 0 }, // 0x6f1
+ { 0x06f2, 0 }, // 0x6f2
+ { 0x06f3, 0 }, // 0x6f3
+ { 0x06f4, 0 }, // 0x6f4
+ { 0x06f5, 0 }, // 0x6f5
+ { 0x06f6, 0 }, // 0x6f6
+ { 0x06f7, 0 }, // 0x6f7
+ { 0x06f8, 0 }, // 0x6f8
+ { 0x06f9, 0 }, // 0x6f9 Arabic indic digit 9
+ { 0x06fa, 0 }, // 0x6fa D Sheen with dot below
+ { 0x06fb, 0 }, // 0x6fb D dad with dot below
+ { 0x06fc, 0 }, // 0x6fc D ghain with dot below
+ { 0x06fd, 0 }, // 0x6fd Sindhi ampersand
+ { 0x06fe, 0 }, // 0x6fe sindhi postposition
+ { 0x06ff, 0 }, // 0x6ff
+
+};
+
+// this is a bit tricky. Alef always binds to the right, so the second parameter descibing the shape
+// of the lam can be either initial of medial. So initial maps to the isolated form of the ligature,
+// medial to the final form
+static const ushort arabicUnicodeLamAlefMapping[6][4] = {
+ { 0xfffd, 0xfffd, 0xfef5, 0xfef6 }, // 0x622 R Alef with Madda above
+ { 0xfffd, 0xfffd, 0xfef7, 0xfef8 }, // 0x623 R Alef with Hamza above
+ { 0xfffd, 0xfffd, 0xfffd, 0xfffd }, // 0x624 R Waw with Hamza above
+ { 0xfffd, 0xfffd, 0xfef9, 0xfefa }, // 0x625 R Alef with Hamza below
+ { 0xfffd, 0xfffd, 0xfffd, 0xfffd }, // 0x626 D Yeh with Hamza above
+ { 0xfffd, 0xfffd, 0xfefb, 0xfefc } // 0x627 R Alef
+};
+
+QString QComplexText::shapedString(const QString& uc, int from, int len, QPainter::TextDirection dir )
+{
+ if( len < 0 )
+ len = uc.length() - from;
+ if( len == 0 ) {
+ return QString::null;
+ }
+
+ // we have to ignore NSMs at the beginning and add at the end.
+ int num = uc.length() - from - len;
+ const QChar *ch = uc.unicode() + from + len;
+ while ( num > 0 && ch->combiningClass() != 0 ) {
+ ch++;
+ num--;
+ len++;
+ }
+ ch = uc.unicode() + from;
+ while ( len > 0 && ch->combiningClass() != 0 ) {
+ ch++;
+ len--;
+ from++;
+ }
+ if ( len == 0 ) return QString::null;
+
+ if( !shapeBuffer || len > shapeBufSize ) {
+ if( shapeBuffer ) free( (void *) shapeBuffer );
+ shapeBuffer = (QChar *) malloc( len*sizeof( QChar ) );
+// delete [] shapeBuffer;
+// shapeBuffer = new QChar[ len + 1];
+ shapeBufSize = len;
+ }
+
+ int lenOut = 0;
+ QChar *data = shapeBuffer;
+ if ( dir == QPainter::RTL )
+ ch += len - 1;
+ for ( int i = 0; i < len; i++ ) {
+ uchar r = ch->row();
+ uchar c = ch->cell();
+ if ( r != 0x06 ) {
+ *data = *ch;
+ data++;
+ lenOut++;
+ } else {
+ int pos = i + from;
+ if ( dir == QPainter::RTL )
+ pos = from + len - 1 - i;
+ int shape = glyphVariantLogical( uc, pos );
+ //qDebug("mapping U+%x to shape %d glyph=0x%x", ch->unicode(), shape, arabicUnicodeMapping[ch->cell()][shape]);
+ // take care of lam-alef ligatures (lam right of alef)
+ ushort map;
+ switch ( c ) {
+ case 0x44: { // lam
+ const QChar *pch = nextChar( uc, pos );
+ if ( pch->row() == 0x06 ) {
+ switch ( pch->cell() ) {
+ case 0x22:
+ case 0x23:
+ case 0x25:
+ case 0x27:
+ //qDebug(" lam of lam-alef ligature");
+ map = arabicUnicodeLamAlefMapping[pch->cell() - 0x22][shape];
+ goto next;
+ default:
+ break;
+ }
+ }
+ break;
+ }
+ case 0x22: // alef with madda
+ case 0x23: // alef with hamza above
+ case 0x25: // alef with hamza below
+ case 0x27: // alef
+ if ( prevChar( uc, pos )->unicode() == 0x0644 ) {
+ // have a lam alef ligature
+ //qDebug(" alef of lam-alef ligature");
+ goto skip;
+ }
+ default:
+ break;
+ }
+ map = arabicUnicodeMapping[c][0] + shape;
+ next:
+ *data = map;
+ data++;
+ lenOut++;
+ }
+ skip:
+ if ( dir == QPainter::RTL )
+ ch--;
+ else
+ ch++;
+ }
+
+ if ( dir == QPainter::RTL ) {
+ // reverses the non spacing marks to be again after the base char
+ QChar *s = shapeBuffer;
+ int i = 0;
+ while ( i < lenOut ) {
+ if ( s->combiningClass() != 0 ) {
+ // non spacing marks
+ int clen = 1;
+ QChar *ch = s;
+ do {
+ ch++;
+ clen++;
+ } while ( ch->combiningClass() != 0 );
+
+ int j = 0;
+ QChar *cp = s;
+ while ( j < clen/2 ) {
+ QChar tmp = *cp;
+ *cp = *ch;
+ *ch = tmp;
+ cp++;
+ ch--;
+ j++;
+ }
+ s += clen;
+ i += clen;
+ } else {
+ s++;
+ i++;
+ }
+ }
+ }
+
+ return QConstString( shapeBuffer, lenOut ).string();
+}
+
+QChar QComplexText::shapedCharacter( const QString &str, int pos )
+{
+ const QChar *ch = str.unicode() + pos;
+ if ( ch->row() != 0x06 )
+ return *ch;
+ else {
+ int shape = glyphVariantLogical( str, pos );
+ //qDebug("mapping U+%x to shape %d glyph=0x%x", ch->unicode(), shape, arabicUnicodeMapping[ch->cell()][shape]);
+ // lam aleph ligatures
+ switch ( ch->cell() ) {
+ case 0x44: { // lam
+ const QChar *nch = nextChar( str, pos );
+ if ( nch->row() == 0x06 ) {
+ switch ( nch->cell() ) {
+ case 0x22:
+ case 0x23:
+ case 0x25:
+ case 0x27:
+ return QChar(arabicUnicodeLamAlefMapping[nch->cell() - 0x22][shape]);
+ default:
+ break;
+ }
+ }
+ break;
+ }
+ case 0x22: // alef with madda
+ case 0x23: // alef with hamza above
+ case 0x25: // alef with hamza below
+ case 0x27: // alef
+ if ( prevChar( str, pos )->unicode() == 0x0644 )
+ // have a lam alef ligature
+ return QChar(0);
+ default:
+ break;
+ }
+ return QChar(arabicUnicodeMapping[ch->cell()][0] + shape);
+ }
+}
+
+QPointArray QComplexText::positionMarks( QFontPrivate *f, const QString &str, int pos, QRect *boundingRect )
+{
+ int len = str.length();
+ int nmarks = 0;
+ while ( pos + nmarks < len && str[pos+nmarks +1].combiningClass() > 0 )
+ nmarks++;
+
+ if ( !nmarks )
+ return QPointArray();
+
+ QChar baseChar = QComplexText::shapedCharacter( str, pos );
+ QRect baseRect = f->boundingRect( baseChar );
+ int baseOffset = f->textWidth( str, pos, 1 );
+
+ //qDebug( "base char: bounding rect at %d/%d (%d/%d)", baseRect.x(), baseRect.y(), baseRect.width(), baseRect.height() );
+ int offset = f->request.pixelSize / 10 + 1;
+ QPointArray pa( nmarks );
+ int i;
+ unsigned char lastCmb = 0;
+ QRect attachmentRect;
+ if ( boundingRect )
+ *boundingRect = baseRect;
+ for( i = 0; i < nmarks; i++ ) {
+ QChar mark = str[pos+i+1];
+ unsigned char cmb = mark.combiningClass();
+ // combining marks of different class don't interact. Reset the rectangle.
+ if ( cmb != lastCmb ) {
+ //qDebug( "resetting rect" );
+ attachmentRect = baseRect;
+ }
+
+ QPoint p;
+ QRect markRect = f->boundingRect( mark );
+ switch( cmb ) {
+ case QChar::Combining_DoubleBelow:
+ // ### wrong in rtl context!
+ case QChar::Combining_BelowLeft:
+ p += QPoint( 0, offset );
+ case QChar::Combining_BelowLeftAttached:
+ p += attachmentRect.bottomLeft() - markRect.topLeft();
+ break;
+ case QChar::Combining_Below:
+ p += QPoint( 0, offset );
+ case QChar::Combining_BelowAttached:
+ p += attachmentRect.bottomLeft() - markRect.topLeft();
+ p += QPoint( (attachmentRect.width() - markRect.width())/2 , 0 );
+ break;
+ case QChar::Combining_BelowRight:
+ p += QPoint( 0, offset );
+ case QChar::Combining_BelowRightAttached:
+ p += attachmentRect.bottomRight() - markRect.topRight();
+ break;
+ case QChar::Combining_Left:
+ p += QPoint( -offset, 0 );
+ case QChar::Combining_LeftAttached:
+ break;
+ case QChar::Combining_Right:
+ p += QPoint( offset, 0 );
+ case QChar::Combining_RightAttached:
+ break;
+ case QChar::Combining_DoubleAbove:
+ // ### wrong in RTL context!
+ case QChar::Combining_AboveLeft:
+ p += QPoint( 0, -offset );
+ case QChar::Combining_AboveLeftAttached:
+ p += attachmentRect.topLeft() - markRect.bottomLeft();
+ break;
+ case QChar::Combining_Above:
+ p += QPoint( 0, -offset );
+ case QChar::Combining_AboveAttached:
+ p += attachmentRect.topLeft() - markRect.bottomLeft();
+ p += QPoint( (attachmentRect.width() - markRect.width())/2 , 0 );
+ break;
+ case QChar::Combining_AboveRight:
+ p += QPoint( 0, -offset );
+ case QChar::Combining_AboveRightAttached:
+ p += attachmentRect.topRight() - markRect.bottomRight();
+ break;
+
+ case QChar::Combining_IotaSubscript:
+ default:
+ break;
+ }
+ //qDebug( "char=%x combiningClass = %d offset=%d/%d", mark.unicode(), cmb, p.x(), p.y() );
+ markRect.moveBy( p.x(), p.y() );
+ p += QPoint( -baseOffset, 0 );
+ attachmentRect |= markRect;
+ if ( boundingRect )
+ *boundingRect |= markRect;
+ lastCmb = cmb;
+ pa.setPoint( i, p );
+ }
+ return pa;
+}
+
+//#define BIDI_DEBUG 2
+#ifdef BIDI_DEBUG
+#include <iostream>
+#endif
+
+
+// transforms one line of the paragraph to visual order
+// the caller is responisble to delete the returned list of QTextRuns.
+QList<QTextRun> *QComplexText::bidiReorderLine( QBidiControl *control, const QString &text, int start, int len )
+{
+ int last = start + len - 1;
+ //printf("doing BiDi reordering from %d to %d!\n", start, last);
+
+ QList<QTextRun> *runs = new QList<QTextRun>;
+ runs->setAutoDelete(TRUE);
+
+ QBidiContext *context = control->context;
+ if ( !context ) {
+ // first line
+ if( start != 0 )
+ qDebug( "bidiReorderLine::internal error");
+ if( text.isRightToLeft() )
+ context = new QBidiContext( 1, QChar::DirR );
+ else
+ context = new QBidiContext( 0, QChar::DirL );
+ }
+
+ QBidiStatus status = control->status;
+ QChar::Direction dir = QChar::DirON;
+
+ int sor = start;
+ int eor = start;
+
+ int current = start;
+ while(current < last) {
+ QChar::Direction dirCurrent;
+ if(current == (int)text.length()) {
+ QBidiContext *c = context;
+ while ( c->parent )
+ c = c->parent;
+ dirCurrent = c->dir;
+ } else
+ dirCurrent = text.at(current).direction();
+
+
+#if BIDI_DEBUG > 1
+ cout << "directions: dir=" << dir << " current=" << dirCurrent << " last=" << status.last << " eor=" << status.eor << " lastStrong=" << status.lastStrong << " embedding=" << context->dir << " level =" << (int)context->level << endl;
+#endif
+
+ switch(dirCurrent) {
+
+ // embedding and overrides (X1-X9 in the BiDi specs)
+ case QChar::DirRLE:
+ {
+ uchar level = context->level;
+ if(level%2) // we have an odd level
+ level += 2;
+ else
+ level++;
+ if(level < 61) {
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ context = new QBidiContext(level, QChar::DirR, context);
+ status.last = QChar::DirR;
+ status.lastStrong = QChar::DirR;
+ }
+ break;
+ }
+ case QChar::DirLRE:
+ {
+ uchar level = context->level;
+ if(level%2) // we have an odd level
+ level++;
+ else
+ level += 2;
+ if(level < 61) {
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ context = new QBidiContext(level, QChar::DirL, context);
+ status.last = QChar::DirL;
+ status.lastStrong = QChar::DirL;
+ }
+ break;
+ }
+ case QChar::DirRLO:
+ {
+ uchar level = context->level;
+ if(level%2) // we have an odd level
+ level += 2;
+ else
+ level++;
+ if(level < 61) {
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ context = new QBidiContext(level, QChar::DirR, context, TRUE);
+ dir = QChar::DirR;
+ status.last = QChar::DirR;
+ status.lastStrong = QChar::DirR;
+ }
+ break;
+ }
+ case QChar::DirLRO:
+ {
+ uchar level = context->level;
+ if(level%2) // we have an odd level
+ level++;
+ else
+ level += 2;
+ if(level < 61) {
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ context = new QBidiContext(level, QChar::DirL, context, TRUE);
+ dir = QChar::DirL;
+ status.last = QChar::DirL;
+ status.lastStrong = QChar::DirL;
+ }
+ break;
+ }
+ case QChar::DirPDF:
+ {
+ QBidiContext *c = context->parent;
+ if(c) {
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ status.last = context->dir;
+ if( context->deref() ) delete context;
+ context = c;
+ if(context->override)
+ dir = context->dir;
+ else
+ dir = QChar::DirON;
+ status.lastStrong = context->dir;
+ }
+ break;
+ }
+
+ // strong types
+ case QChar::DirL:
+ if(dir == QChar::DirON)
+ dir = QChar::DirL;
+ switch(status.last)
+ {
+ case QChar::DirL:
+ eor = current; status.eor = QChar::DirL; break;
+ case QChar::DirR:
+ case QChar::DirAL:
+ case QChar::DirEN:
+ case QChar::DirAN:
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ break;
+ case QChar::DirES:
+ case QChar::DirET:
+ case QChar::DirCS:
+ case QChar::DirBN:
+ case QChar::DirB:
+ case QChar::DirS:
+ case QChar::DirWS:
+ case QChar::DirON:
+ if(dir != QChar::DirL) {
+ //last stuff takes embedding dir
+ if( context->dir == QChar::DirR ) {
+ if(status.eor != QChar::DirR) {
+ // AN or EN
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ dir = QChar::DirR;
+ }
+ else
+ eor = current - 1;
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ } else {
+ if(status.eor == QChar::DirR) {
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ dir = QChar::DirL;
+ } else {
+ eor = current; status.eor = QChar::DirL; break;
+ }
+ }
+ } else {
+ eor = current; status.eor = QChar::DirL;
+ }
+ default:
+ break;
+ }
+ status.lastStrong = QChar::DirL;
+ break;
+ case QChar::DirAL:
+ case QChar::DirR:
+ if(dir == QChar::DirON) dir = QChar::DirR;
+ switch(status.last)
+ {
+ case QChar::DirR:
+ case QChar::DirAL:
+ eor = current; status.eor = QChar::DirR; break;
+ case QChar::DirL:
+ case QChar::DirEN:
+ case QChar::DirAN:
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ break;
+ case QChar::DirES:
+ case QChar::DirET:
+ case QChar::DirCS:
+ case QChar::DirBN:
+ case QChar::DirB:
+ case QChar::DirS:
+ case QChar::DirWS:
+ case QChar::DirON:
+ if( status.eor != QChar::DirR && status.eor != QChar::DirAL ) {
+ //last stuff takes embedding dir
+ if(context->dir == QChar::DirR || status.lastStrong == QChar::DirR) {
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ dir = QChar::DirR;
+ eor = current;
+ } else {
+ eor = current - 1;
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ dir = QChar::DirR;
+ }
+ } else {
+ eor = current; status.eor = QChar::DirR;
+ }
+ default:
+ break;
+ }
+ status.lastStrong = dirCurrent;
+ break;
+
+ // weak types:
+
+ case QChar::DirNSM:
+ // ### if @sor, set dir to dirSor
+ break;
+ case QChar::DirEN:
+ if(status.lastStrong != QChar::DirAL) {
+ // if last strong was AL change EN to AL
+ if(dir == QChar::DirON) {
+ if(status.lastStrong == QChar::DirL)
+ dir = QChar::DirL;
+ else
+ dir = QChar::DirAN;
+ }
+ switch(status.last)
+ {
+ case QChar::DirET:
+ if ( status.lastStrong == QChar::DirR || status.lastStrong == QChar::DirAL ) {
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; status.eor = QChar::DirON;
+ dir = QChar::DirAN;
+ }
+ // fall through
+ case QChar::DirEN:
+ case QChar::DirL:
+ eor = current;
+ status.eor = dirCurrent;
+ break;
+ case QChar::DirR:
+ case QChar::DirAL:
+ case QChar::DirAN:
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; status.eor = QChar::DirEN;
+ dir = QChar::DirAN; break;
+ case QChar::DirES:
+ case QChar::DirCS:
+ if(status.eor == QChar::DirEN) {
+ eor = current; break;
+ }
+ case QChar::DirBN:
+ case QChar::DirB:
+ case QChar::DirS:
+ case QChar::DirWS:
+ case QChar::DirON:
+ if(status.eor == QChar::DirR) {
+ // neutrals go to R
+ eor = current - 1;
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirEN;
+ dir = QChar::DirAN;
+ }
+ else if( status.eor == QChar::DirL ||
+ (status.eor == QChar::DirEN && status.lastStrong == QChar::DirL)) {
+ eor = current; status.eor = dirCurrent;
+ } else {
+ // numbers on both sides, neutrals get right to left direction
+ if(dir != QChar::DirL) {
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ eor = current - 1;
+ dir = QChar::DirR;
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ dir = QChar::DirAN;
+ } else {
+ eor = current; status.eor = dirCurrent;
+ }
+ }
+ default:
+ break;
+ }
+ break;
+ }
+ case QChar::DirAN:
+ dirCurrent = QChar::DirAN;
+ if(dir == QChar::DirON) dir = QChar::DirAN;
+ switch(status.last)
+ {
+ case QChar::DirL:
+ case QChar::DirAN:
+ eor = current; status.eor = QChar::DirAN; break;
+ case QChar::DirR:
+ case QChar::DirAL:
+ case QChar::DirEN:
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ break;
+ case QChar::DirCS:
+ if(status.eor == QChar::DirAN) {
+ eor = current; status.eor = QChar::DirR; break;
+ }
+ case QChar::DirES:
+ case QChar::DirET:
+ case QChar::DirBN:
+ case QChar::DirB:
+ case QChar::DirS:
+ case QChar::DirWS:
+ case QChar::DirON:
+ if(status.eor == QChar::DirR) {
+ // neutrals go to R
+ eor = current - 1;
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ dir = QChar::DirAN;
+ } else if( status.eor == QChar::DirL ||
+ (status.eor == QChar::DirEN && status.lastStrong == QChar::DirL)) {
+ eor = current; status.eor = dirCurrent;
+ } else {
+ // numbers on both sides, neutrals get right to left direction
+ if(dir != QChar::DirL) {
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ eor = current - 1;
+ dir = QChar::DirR;
+ runs->append( new QTextRun(sor, eor, context, dir) );
+ ++eor; sor = eor; dir = QChar::DirON; status.eor = QChar::DirON;
+ dir = QChar::DirAN;
+ } else {
+ eor = current; status.eor = dirCurrent;
+ }
+ }
+ default:
+ break;
+ }
+ break;
+ case QChar::DirES:
+ case QChar::DirCS:
+ break;
+ case QChar::DirET:
+ if(status.last == QChar::DirEN) {
+ dirCurrent = QChar::DirEN;
+ eor = current; status.eor = dirCurrent;
+ break;
+ }
+ break;
+
+ // boundary neutrals should be ignored
+ case QChar::DirBN:
+ break;
+ // neutrals
+ case QChar::DirB:
+ // ### what do we do with newline and paragraph separators that come to here?
+ break;
+ case QChar::DirS:
+ // ### implement rule L1
+ break;
+ case QChar::DirWS:
+ case QChar::DirON:
+ break;
+ default:
+ break;
+ }
+
+ //cout << " after: dir=" << // dir << " current=" << dirCurrent << " last=" << status.last << " eor=" << status.eor << " lastStrong=" << status.lastStrong << " embedding=" << context->dir << endl;
+
+ if(current >= (int)text.length()) break;
+
+ // set status.last as needed.
+ switch(dirCurrent)
+ {
+ case QChar::DirET:
+ case QChar::DirES:
+ case QChar::DirCS:
+ case QChar::DirS:
+ case QChar::DirWS:
+ case QChar::DirON:
+ switch(status.last)
+ {
+ case QChar::DirL:
+ case QChar::DirR:
+ case QChar::DirAL:
+ case QChar::DirEN:
+ case QChar::DirAN:
+ status.last = dirCurrent;
+ break;
+ default:
+ status.last = QChar::DirON;
+ }
+ break;
+ case QChar::DirNSM:
+ case QChar::DirBN:
+ // ignore these
+ break;
+ default:
+ status.last = dirCurrent;
+ }
+
+ ++current;
+ }
+
+#ifdef BIDI_DEBUG
+ cout << "reached end of line current=" << current << ", eor=" << eor << endl;
+#endif
+ eor = current;
+
+ runs->append( new QTextRun(sor, eor, context, dir) );
+
+ // reorder line according to run structure...
+
+ // first find highest and lowest levels
+ uchar levelLow = 128;
+ uchar levelHigh = 0;
+ QTextRun *r = runs->first();
+ while ( r ) {
+ //printf("level = %d\n", r->level);
+ if ( r->level > levelHigh )
+ levelHigh = r->level;
+ if ( r->level < levelLow )
+ levelLow = r->level;
+ r = runs->next();
+ }
+
+ // implements reordering of the line (L2 according to BiDi spec):
+ // L2. From the highest level found in the text to the lowest odd level on each line,
+ // reverse any contiguous sequence of characters that are at that level or higher.
+
+ // reversing is only done up to the lowest odd level
+ if(!(levelLow%2)) levelLow++;
+
+#ifdef BIDI_DEBUG
+ cout << "reorderLine: lineLow = " << (uint)levelLow << ", lineHigh = " << (uint)levelHigh << endl;
+ cout << "logical order is:" << endl;
+ QListIterator<QTextRun> it2(*runs);
+ QTextRun *r2;
+ for ( ; (r2 = it2.current()); ++it2 )
+ cout << " " << r2 << " start=" << r2->start << " stop=" << r2->stop << " level=" << (uint)r2->level << endl;
+#endif
+
+ int count = runs->count() - 1;
+
+ while(levelHigh >= levelLow)
+ {
+ int i = 0;
+ while ( i < count )
+ {
+ while(i < count && runs->at(i)->level < levelHigh) i++;
+ int start = i;
+ while(i <= count && runs->at(i)->level >= levelHigh) i++;
+ int end = i-1;
+
+ if(start != end)
+ {
+ //cout << "reversing from " << start << " to " << end << endl;
+ for(int j = 0; j < (end-start+1)/2; j++)
+ {
+ QTextRun *first = runs->take(start+j);
+ QTextRun *last = runs->take(end-j-1);
+ runs->insert(start+j, last);
+ runs->insert(end-j, first);
+ }
+ }
+ i++;
+ if(i >= count) break;
+ }
+ levelHigh--;
+ }
+
+#ifdef BIDI_DEBUG
+ cout << "visual order is:" << endl;
+ QListIterator<QTextRun> it3(*runs);
+ QTextRun *r3;
+ for ( ; (r3 = it3.current()); ++it3 )
+ {
+ cout << " " << r3 << endl;
+ }
+#endif
+
+ control->setContext( context );
+ control->status = status;
+
+ return runs;
+}
+
+
+QString QComplexText::bidiReorderString( const QString &str, QChar::Direction /*basicDir*/ )
+{
+ // ### fix basic direction
+ QBidiControl *control = new QBidiControl();
+ int lineStart = 0;
+ int lineEnd = 0;
+ int len = str.length();
+ QString visual;
+ visual.setUnicode( 0, len );
+ QChar *vch = (QChar *)visual.unicode();
+ const QChar *ch = str.unicode();
+ while( lineStart < len ) {
+ lineEnd = lineStart;
+ while( *ch != '\n' && lineEnd < len ) {
+ ch++;
+ lineEnd++;
+ }
+ QList<QTextRun> *runs = bidiReorderLine( control, str, lineStart, lineEnd - lineStart );
+
+ // reorder the content of the line, and output to visual
+ QTextRun *r = runs->first();
+ while ( r ) {
+ if(r->level %2) {
+ // odd level, need to reverse the string
+ int pos = r->stop;
+ while(pos >= r->start) {
+ *vch = str[pos];
+ vch++;
+ pos--;
+ }
+ } else {
+ int pos = r->start;
+ while(pos <= r->stop) {
+ *vch = str[pos];
+ vch++;
+ pos++;
+ }
+ }
+ r = runs->next();
+ }
+ if ( *ch == '\n' ) {
+ *vch = *ch;
+ vch++;
+ ch++;
+ lineEnd++;
+ }
+ lineStart = lineEnd;
+ }
+ return visual;
+}
+#endif
diff --git a/bibletime/frontend/thirdparty/qt3stuff/qcomplextext_p.h b/bibletime/frontend/thirdparty/qt3stuff/qcomplextext_p.h
new file mode 100644
index 0000000..0111a1a
--- /dev/null
+++ b/bibletime/frontend/thirdparty/qt3stuff/qcomplextext_p.h
@@ -0,0 +1,102 @@
+#ifndef QCOMPLEXTEXT_H
+#define QCOMPLEXTEXT_H
+
+#ifndef QT_H
+#include <qstring.h>
+#include <qpointarray.h>
+#include <qfont.h>
+#include <qpainter.h>
+#include <qlist.h>
+#include <qshared.h>
+#endif // QT_H
+
+class QFontPrivate;
+
+namespace Qt3 {
+
+// bidi helper classes. Internal to Qt
+struct Q_EXPORT QBidiStatus {
+ QBidiStatus() {
+ eor = QChar::DirON;
+ lastStrong = QChar::DirON;
+ last = QChar:: DirON;
+ }
+ QChar::Direction eor : 5;
+ QChar::Direction lastStrong : 5;
+ QChar::Direction last : 5;
+};
+
+struct Q_EXPORT QBidiContext : public QShared {
+ // ### ref and deref parent?
+ QBidiContext( uchar level, QChar::Direction embedding, QBidiContext *parent = 0, bool override = FALSE );
+ ~QBidiContext();
+
+ unsigned char level;
+ bool override : 1;
+ QChar::Direction dir : 5;
+
+ QBidiContext *parent;
+};
+
+struct Q_EXPORT QBidiControl {
+ QBidiControl() { context = 0; }
+ QBidiControl( QBidiContext *c, QBidiStatus s)
+ { context = c; if( context ) context->ref(); status = s; }
+ ~QBidiControl() { if ( context && context->deref() ) delete context; }
+ void setContext( QBidiContext *c ) { if ( context == c ) return; if ( context && context->deref() ) delete context; context = c; context->ref(); }
+ QBidiContext *context;
+ QBidiStatus status;
+};
+
+struct Q_EXPORT QTextRun {
+ QTextRun(int _start, int _stop, QBidiContext *context, QChar::Direction dir) {
+ start = _start;
+ stop = _stop;
+ if(dir == QChar::DirON) dir = context->dir;
+
+ level = context->level;
+
+ // add level of run (cases I1 & I2)
+ if( level % 2 ) {
+ if(dir == QChar::DirL || dir == QChar::DirAN)
+ level++;
+ } else {
+ if( dir == QChar::DirR )
+ level++;
+ else if( dir == QChar::DirAN )
+ level += 2;
+ }
+ //printf("new run: level = %d\n", level);
+ }
+
+ int start;
+ int stop;
+ // explicit + implicit levels here
+ uchar level;
+};
+
+class Q_EXPORT QComplexText {
+public:
+ enum Shape {
+ XIsolated,
+ XFinal,
+ XInitial,
+ XMedial
+ };
+ static Shape glyphVariant( const QString &str, int pos);
+ static Shape glyphVariantLogical( const QString &str, int pos);
+
+ //QT2HACK
+ //static QString shapedString( const QString &str, int from = 0, int len = -1, QPainter::TextDirection dir = QPainter::Auto);
+ static QChar shapedCharacter(const QString &str, int pos);
+
+ // positions non spacing marks relative to the base character at position pos.
+ static QPointArray positionMarks( QFontPrivate *f, const QString &str, int pos, QRect *boundingRect = 0 );
+
+ static QList<QTextRun> *bidiReorderLine( QBidiControl *control, const QString &str, int start, int len );
+ static QString bidiReorderString( const QString &str, QChar::Direction basicDir = QChar::DirON );
+};
+
+}; // namespace
+
+#endif
diff --git a/bibletime/frontend/thirdparty/qt3stuff/qrichtext.cpp b/bibletime/frontend/thirdparty/qt3stuff/qrichtext.cpp
new file mode 100644
index 0000000..98b8eef
--- /dev/null
+++ b/bibletime/frontend/thirdparty/qt3stuff/qrichtext.cpp
@@ -0,0 +1,7124 @@
+/****************************************************************************
+** Implementation of the internal Qt classes dealing with rich text
+**
+** Created : 990101
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the kernel module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qrichtext_p.h"
+#include "qstringlist.h"
+#include "qfont.h"
+#include "qtextstream.h"
+#include "qfile.h"
+#include "qregexp.h"
+#include "qapplication.h"
+#include "qclipboard.h"
+#include "qmap.h"
+#include "qfileinfo.h"
+#include "qstylesheet.h"
+#include "qmime.h"
+#include "qregexp.h"
+#include "qimage.h"
+#include "qdragobject.h"
+#include "qpaintdevicemetrics.h"
+#include "qpainter.h"
+#include "qdrawutil.h"
+#include "qcursor.h"
+#include "qstack.h"
+#include "qcomplextext_p.h"
+
+#include <stdlib.h>
+
+using namespace Qt3;
+
+//#define PARSER_DEBUG
+//#define DEBUG_COLLECTION
+//#define DEBUG_TABLE_RENDERING
+
+static QTextFormatCollection *qFormatCollection = 0;
+
+//ANY_CHARSET_BEGIN
+QMap<QString, QFont::CharSet>* m_charsetMap = 0;
+//ANY_CHARSET_END
+
+#if defined(PARSER_DEBUG)
+static QString debug_indent;
+#endif
+
+static double scale_factor( double v )
+{
+ return v/QPaintDevice::x11AppDpiY();
+}
+
+static bool is_printer( QPainter *p )
+{
+ //if ( !p || !p->device() )
+ return FALSE;
+ //return p->device()->devType() == QInternal::Printer;
+}
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+void QTextCommandHistory::addCommand( QTextCommand *cmd )
+{
+ if ( current < (int)history.count() - 1 ) {
+ QPtrList<QTextCommand> commands;
+ commands.setAutoDelete( FALSE );
+
+ for( int i = 0; i <= current; ++i ) {
+ commands.insert( i, history.at( 0 ) );
+ history.take( 0 );
+ }
+
+ commands.append( cmd );
+ history.clear();
+ history = commands;
+ history.setAutoDelete( TRUE );
+ } else {
+ history.append( cmd );
+ }
+
+ if ( (int)history.count() > steps )
+ history.removeFirst();
+ else
+ ++current;
+}
+
+QTextCursor *QTextCommandHistory::undo( QTextCursor *c )
+{
+ if ( current > -1 ) {
+ QTextCursor *c2 = history.at( current )->unexecute( c );
+ --current;
+ return c2;
+ }
+ return 0;
+}
+
+QTextCursor *QTextCommandHistory::redo( QTextCursor *c )
+{
+ if ( current > -1 ) {
+ if ( current < (int)history.count() - 1 ) {
+ ++current;
+ return history.at( current )->execute( c );
+ }
+ } else {
+ if ( history.count() > 0 ) {
+ ++current;
+ return history.at( current )->execute( c );
+ }
+ }
+ return 0;
+}
+
+bool QTextCommandHistory::isUndoAvailable()
+{
+ return current > -1;
+}
+
+bool QTextCommandHistory::isRedoAvailable()
+{
+ return current > -1 || history.count() > 0;
+}
+
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+QTextDeleteCommand::QTextDeleteCommand( QTextDocument *d, int i, int idx, const QMemArray<QTextStringChar> &str,
+ const QValueList< QPtrVector<QStyleSheetItem> > &os,
+ const QValueList<QStyleSheetItem::ListStyle> &ols,
+ const QMemArray<int> &oas)
+ : QTextCommand( d ), id( i ), index( idx ), parag( 0 ), text( str ), oldStyles( os ), oldListStyles( ols ), oldAligns( oas )
+{
+ for ( int j = 0; j < (int)text.size(); ++j ) {
+ if ( text[ j ].format() )
+ text[ j ].format()->addRef();
+ }
+}
+
+QTextDeleteCommand::QTextDeleteCommand( QTextParag *p, int idx, const QMemArray<QTextStringChar> &str )
+ : QTextCommand( 0 ), id( -1 ), index( idx ), parag( p ), text( str )
+{
+ for ( int i = 0; i < (int)text.size(); ++i ) {
+ if ( text[ i ].format() )
+ text[ i ].format()->addRef();
+ }
+}
+
+QTextDeleteCommand::~QTextDeleteCommand()
+{
+ for ( int i = 0; i < (int)text.size(); ++i ) {
+ if ( text[ i ].format() )
+ text[ i ].format()->removeRef();
+ }
+ text.resize( 0 );
+}
+
+QTextCursor *QTextDeleteCommand::execute( QTextCursor *c )
+{
+ QTextParag *s = doc ? doc->paragAt( id ) : parag;
+ if ( !s ) {
+// qWarning( "can't locate parag at %d, last parag: %d", id, doc->lastParag()->paragId() );
+ return 0;
+ }
+
+ cursor.setParag( s );
+ cursor.setIndex( index );
+ int len = text.size();
+ if ( c )
+ *c = cursor;
+ if ( doc ) {
+ doc->setSelectionStart( QTextDocument::Temp, &cursor );
+ for ( int i = 0; i < len; ++i )
+ cursor.gotoRight();
+ doc->setSelectionEnd( QTextDocument::Temp, &cursor );
+ doc->removeSelectedText( QTextDocument::Temp, &cursor );
+ if ( c )
+ *c = cursor;
+ } else {
+ s->remove( index, len );
+ }
+
+ return c;
+}
+
+QTextCursor *QTextDeleteCommand::unexecute( QTextCursor *c )
+{
+ QTextParag *s = doc ? doc->paragAt( id ) : parag;
+ if ( !s ) {
+// qWarning( "can't locate parag at %d, last parag: %d", id, doc->lastParag()->paragId() );
+ return 0;
+ }
+
+ cursor.setParag( s );
+ cursor.setIndex( index );
+ QString str = QTextString::toString( text );
+ cursor.insert( str, TRUE, &text );
+ cursor.setParag( s );
+ cursor.setIndex( index );
+ if ( c ) {
+ c->setParag( s );
+ c->setIndex( index );
+ for ( int i = 0; i < (int)text.size(); ++i )
+ c->gotoRight();
+ }
+
+ QValueList< QPtrVector<QStyleSheetItem> >::Iterator it = oldStyles.begin();
+ QValueList<QStyleSheetItem::ListStyle>::Iterator lit = oldListStyles.begin();
+ int i = 0;
+ QTextParag *p = s;
+ bool end = FALSE;
+ while ( p ) {
+ if ( it != oldStyles.end() )
+ p->setStyleSheetItems( *it );
+ else
+ end = TRUE;
+ if ( lit != oldListStyles.end() )
+ p->setListStyle( *lit );
+ else
+ end = TRUE;
+ if ( i < (int)oldAligns.size() )
+ p->setAlignment( oldAligns.at( i ) );
+ else
+ end = TRUE;
+ if ( end )
+ break;
+ p = p->next();
+ ++it;
+ ++lit;
+ ++i;
+ }
+
+ s = cursor.parag();
+ while ( s ) {
+ s->format();
+ s->setChanged( TRUE );
+ if ( s == c->parag() )
+ break;
+ s = s->next();
+ }
+
+ return &cursor;
+}
+
+QTextFormatCommand::QTextFormatCommand( QTextDocument *d, int sid, int sidx, int eid, int eidx,
+ const QMemArray<QTextStringChar> &old, QTextFormat *f, int fl )
+ : QTextCommand( d ), startId( sid ), startIndex( sidx ), endId( eid ), endIndex( eidx ), format( f ), oldFormats( old ), flags( fl )
+{
+ format = d->formatCollection()->format( f );
+ for ( int j = 0; j < (int)oldFormats.size(); ++j ) {
+ if ( oldFormats[ j ].format() )
+ oldFormats[ j ].format()->addRef();
+ }
+}
+
+QTextFormatCommand::~QTextFormatCommand()
+{
+ format->removeRef();
+ for ( int j = 0; j < (int)oldFormats.size(); ++j ) {
+ if ( oldFormats[ j ].format() )
+ oldFormats[ j ].format()->removeRef();
+ }
+}
+
+QTextCursor *QTextFormatCommand::execute( QTextCursor *c )
+{
+ QTextParag *sp = doc->paragAt( startId );
+ QTextParag *ep = doc->paragAt( endId );
+ if ( !sp || !ep )
+ return c;
+
+ QTextCursor start( doc );
+ start.setParag( sp );
+ start.setIndex( startIndex );
+ QTextCursor end( doc );
+ end.setParag( ep );
+ end.setIndex( endIndex );
+
+ doc->setSelectionStart( QTextDocument::Temp, &start );
+ doc->setSelectionEnd( QTextDocument::Temp, &end );
+ doc->setFormat( QTextDocument::Temp, format, flags );
+ doc->removeSelection( QTextDocument::Temp );
+ *c = end;
+ return c;
+}
+
+QTextCursor *QTextFormatCommand::unexecute( QTextCursor *c )
+{
+ QTextParag *sp = doc->paragAt( startId );
+ QTextParag *ep = doc->paragAt( endId );
+ if ( !sp || !ep )
+ return 0;
+
+ int idx = startIndex;
+ int fIndex = 0;
+ while ( TRUE ) {
+ if ( oldFormats.at( fIndex ).c == '\n' ) {
+ if ( idx > 0 ) {
+ if ( idx < sp->length() && fIndex > 0 )
+ sp->setFormat( idx, 1, oldFormats.at( fIndex - 1 ).format() );
+ if ( sp == ep )
+ break;
+ sp = sp->next();
+ idx = 0;
+ }
+ fIndex++;
+ }
+ if ( oldFormats.at( fIndex ).format() )
+ sp->setFormat( idx, 1, oldFormats.at( fIndex ).format() );
+ idx++;
+ fIndex++;
+ if ( fIndex >= (int)oldFormats.size() )
+ break;
+ if ( idx >= sp->length() ) {
+ if ( sp == ep )
+ break;
+ sp = sp->next();
+ idx = 0;
+ }
+ }
+
+ QTextCursor end( doc );
+ end.setParag( ep );
+ end.setIndex( endIndex );
+ *c = end;
+ return c;
+}
+
+QTextAlignmentCommand::QTextAlignmentCommand( QTextDocument *d, int fParag, int lParag, int na, const QMemArray<int> &oa )
+ : QTextCommand( d ), firstParag( fParag ), lastParag( lParag ), newAlign( na ), oldAligns( oa )
+{
+}
+
+QTextCursor *QTextAlignmentCommand::execute( QTextCursor *c )
+{
+ QTextParag *p = doc->paragAt( firstParag );
+ if ( !p )
+ return c;
+ while ( p ) {
+ p->setAlignment( newAlign );
+ if ( p->paragId() == lastParag )
+ break;
+ p = p->next();
+ }
+ return c;
+}
+
+QTextCursor *QTextAlignmentCommand::unexecute( QTextCursor *c )
+{
+ QTextParag *p = doc->paragAt( firstParag );
+ if ( !p )
+ return c;
+ int i = 0;
+ while ( p ) {
+ if ( i < (int)oldAligns.size() )
+ p->setAlignment( oldAligns.at( i ) );
+ if ( p->paragId() == lastParag )
+ break;
+ p = p->next();
+ ++i;
+ }
+ return c;
+}
+
+QTextParagTypeCommand::QTextParagTypeCommand( QTextDocument *d, int fParag, int lParag, bool l,
+ QStyleSheetItem::ListStyle s, const QValueList< QPtrVector<QStyleSheetItem> > &os,
+ const QValueList<QStyleSheetItem::ListStyle> &ols )
+ : QTextCommand( d ), firstParag( fParag ), lastParag( lParag ), list( l ), listStyle( s ), oldStyles( os ), oldListStyles( ols )
+{
+}
+
+QTextCursor *QTextParagTypeCommand::execute( QTextCursor *c )
+{
+ QTextParag *p = doc->paragAt( firstParag );
+ if ( !p )
+ return c;
+ while ( p ) {
+ p->setList( list, (int)listStyle );
+ if ( p->paragId() == lastParag )
+ break;
+ p = p->next();
+ }
+ return c;
+}
+
+QTextCursor *QTextParagTypeCommand::unexecute( QTextCursor *c )
+{
+ QTextParag *p = doc->paragAt( firstParag );
+ if ( !p )
+ return c;
+ QValueList< QPtrVector<QStyleSheetItem> >::Iterator it = oldStyles.begin();
+ QValueList<QStyleSheetItem::ListStyle>::Iterator lit = oldListStyles.begin();
+ while ( p ) {
+ if ( it != oldStyles.end() )
+ p->setStyleSheetItems( *it );
+ if ( lit != oldListStyles.end() )
+ p->setListStyle( *lit );
+ if ( p->paragId() == lastParag )
+ break;
+ p = p->next();
+ ++it;
+ ++lit;
+ }
+ return c;
+}
+
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+QTextCursor::QTextCursor( QTextDocument *d )
+ : doc( d ), ox( 0 ), oy( 0 )
+{
+ nested = FALSE;
+ idx = 0;
+ string = doc ? doc->firstParag() : 0;
+ tmpIndex = -1;
+}
+
+QTextCursor::QTextCursor()
+{
+}
+
+QTextCursor::QTextCursor( const QTextCursor &c )
+{
+ doc = c.doc;
+ ox = c.ox;
+ oy = c.oy;
+ nested = c.nested;
+ idx = c.idx;
+ string = c.string;
+ tmpIndex = c.tmpIndex;
+ indices = c.indices;
+ parags = c.parags;
+ xOffsets = c.xOffsets;
+ yOffsets = c.yOffsets;
+}
+
+QTextCursor &QTextCursor::operator=( const QTextCursor &c )
+{
+ doc = c.doc;
+ ox = c.ox;
+ oy = c.oy;
+ nested = c.nested;
+ idx = c.idx;
+ string = c.string;
+ tmpIndex = c.tmpIndex;
+ indices = c.indices;
+ parags = c.parags;
+ xOffsets = c.xOffsets;
+ yOffsets = c.yOffsets;
+
+ return *this;
+}
+
+bool QTextCursor::operator==( const QTextCursor &c ) const
+{
+ return doc == c.doc && string == c.string && idx == c.idx;
+}
+
+int QTextCursor::totalOffsetX() const
+{
+ if ( !nested )
+ return 0;
+ QValueStack<int>::ConstIterator xit = xOffsets.begin();
+ int xoff = ox;
+ for ( ; xit != xOffsets.end(); ++xit )
+ xoff += *xit;
+ return xoff;
+}
+
+int QTextCursor::totalOffsetY() const
+{
+ if ( !nested )
+ return 0;
+ QValueStack<int>::ConstIterator yit = yOffsets.begin();
+ int yoff = oy;
+ for ( ; yit != yOffsets.end(); ++yit )
+ yoff += *yit;
+ return yoff;
+}
+
+void QTextCursor::gotoIntoNested( const QPoint &globalPos )
+{
+ if ( !doc )
+ return;
+ push();
+ ox = 0;
+ int bl, y;
+ string->lineHeightOfChar( idx, &bl, &y );
+ oy = y + string->rect().y();
+ nested = TRUE;
+ QPoint p( globalPos.x() - offsetX(), globalPos.y() - offsetY() );
+ Q_ASSERT( string->at( idx )->isCustom() );
+ string->at( idx )->customItem()->enterAt( this, doc, string, idx, ox, oy, p );
+}
+
+void QTextCursor::invalidateNested()
+{
+ if ( nested ) {
+ QValueStack<QTextParag*>::Iterator it = parags.begin();
+ QValueStack<int>::Iterator it2 = indices.begin();
+ for ( ; it != parags.end(); ++it, ++it2 ) {
+ if ( *it == string )
+ continue;
+ (*it)->invalidate( 0 );
+ if ( (*it)->at( *it2 )->isCustom() )
+ (*it)->at( *it2 )->customItem()->invalidate();
+ }
+ }
+}
+
+void QTextCursor::insert( const QString &str, bool checkNewLine, QMemArray<QTextStringChar> *formatting )
+{
+ tmpIndex = -1;
+ bool justInsert = TRUE;
+ QString s( str );
+#if defined(Q_WS_WIN)
+ if ( checkNewLine )
+ s = s.replace( QRegExp( "\\r" ), "" );
+#endif
+ if ( checkNewLine )
+ justInsert = s.find( '\n' ) == -1;
+ if ( justInsert ) {
+ string->insert( idx, s );
+ if ( formatting ) {
+ for ( int i = 0; i < (int)s.length(); ++i ) {
+ if ( formatting->at( i ).format() ) {
+ formatting->at( i ).format()->addRef();
+ string->string()->setFormat( idx + i, formatting->at( i ).format(), TRUE );
+ }
+ }
+ }
+ idx += s.length();
+ } else {
+ QStringList lst = QStringList::split( '\n', s, TRUE );
+ QStringList::Iterator it = lst.begin();
+ int y = string->rect().y() + string->rect().height();
+ int lastIndex = 0;
+ for ( ; it != lst.end(); ++it ) {
+ if ( it != lst.begin() ) {
+ splitAndInsertEmptyParag( FALSE, TRUE );
+ string->setEndState( -1 );
+ string->prev()->format( -1, FALSE );
+ }
+ QString s = *it;
+ if ( s.isEmpty() )
+ continue;
+ string->insert( idx, s );
+ if ( formatting ) {
+ int len = s.length();
+ if ( it != --lst.end() )
+ len++;
+ for ( int i = 0; i < len; ++i ) {
+ if ( formatting->at( i + lastIndex ).format() ) {
+ formatting->at( i + lastIndex ).format()->addRef();
+ string->string()->setFormat( i + idx, formatting->at( i + lastIndex ).format(), TRUE );
+ }
+ }
+ lastIndex += len;
+ }
+
+ idx += s.length();
+ }
+ string->format( -1, FALSE );
+ int dy = string->rect().y() + string->rect().height() - y;
+ QTextParag *p = string;
+ p->setParagId( p->prev()->paragId() + 1 );
+ p = p->next();
+ while ( p ) {
+ p->setParagId( p->prev()->paragId() + 1 );
+ p->move( dy );
+ p->invalidate( 0 );
+ p->setEndState( -1 );
+ p = p->next();
+ }
+ }
+
+ int h = string->rect().height();
+ string->format( -1, TRUE );
+ if ( h != string->rect().height() )
+ invalidateNested();
+ else if ( doc && doc->parent() )
+ doc->nextDoubleBuffered = TRUE;
+}
+
+void QTextCursor::gotoLeft()
+{
+ tmpIndex = -1;
+
+ if ( idx > 0 ) {
+ idx--;
+ } else if ( string->prev() ) {
+ string = string->prev();
+ while ( !string->isVisible() )
+ string = string->prev();
+ idx = string->length() - 1;
+ } else {
+ if ( nested ) {
+ pop();
+ processNesting( Prev );
+ if ( idx == -1 ) {
+ pop();
+ if ( idx > 0 ) {
+ idx--;
+ } else if ( string->prev() ) {
+ string = string->prev();
+ idx = string->length() - 1;
+ }
+ }
+ }
+ }
+
+ if ( string->at( idx )->isCustom() &&
+ string->at( idx )->customItem()->isNested() ) {
+ processNesting( EnterEnd );
+ }
+}
+
+void QTextCursor::push()
+{
+ indices.push( idx );
+ parags.push( string );
+ xOffsets.push( ox );
+ yOffsets.push( oy );
+ nestedStack.push( nested );
+}
+
+void QTextCursor::pop()
+{
+ if ( !doc )
+ return;
+ idx = indices.pop();
+ string = parags.pop();
+ ox = xOffsets.pop();
+ oy = yOffsets.pop();
+ if ( doc->parent() )
+ doc = doc->parent();
+ nested = nestedStack.pop();
+}
+
+void QTextCursor::restoreState()
+{
+ while ( !indices.isEmpty() )
+ pop();
+}
+
+bool QTextCursor::place( const QPoint &p, QTextParag *s )
+{
+ QPoint pos( p );
+ QRect r;
+ if ( pos.y() < s->rect().y() )
+ pos.setY( s->rect().y() );
+ while ( s ) {
+ r = s->rect();
+ r.setWidth( doc ? doc->width() : QWIDGETSIZE_MAX );
+ if ( !s->next() || ( pos.y() >= r.y() && pos.y() < s->next()->rect().y() ) )
+ break;
+ s = s->next();
+ }
+
+ if ( !s )
+ return FALSE;
+
+ setParag( s, FALSE );
+ int y = s->rect().y();
+ int lines = s->lines();
+ QTextStringChar *chr = 0;
+ int index = 0;
+ int i = 0;
+ int cy = 0;
+ //int ch = 0;
+ for ( ; i < lines; ++i ) {
+ chr = s->lineStartOfLine( i, &index );
+ cy = s->lineY( i );
+ //ch = s->lineHeight( i );
+ if ( !chr )
+ return FALSE;
+ if ( i < lines - 1 && pos.y() >= y + cy && pos.y() <= y + s->lineY( i+1 ) )
+ break;
+ }
+ int nextLine;
+ if ( i < lines - 1 )
+ s->lineStartOfLine( i+1, &nextLine );
+ else
+ nextLine = s->length();
+ i = index;
+ int x = s->rect().x();
+ if ( pos.x() < x )
+ pos.setX( x + 1 );
+ int cw;
+ int curpos = s->length()-1;
+ int dist = 10000000;
+ bool inCustom = FALSE;
+ while ( i < nextLine ) {
+ chr = s->at(i);
+ int cpos = x + chr->x;
+ cw = s->string()->width( i );
+ if ( chr->isCustom() && chr->customItem()->isNested() ) {
+ if ( pos.x() >= cpos && pos.x() <= cpos + cw &&
+ pos.y() >= y + cy && pos.y() <= y + cy + chr->height() ) {
+ inCustom = TRUE;
+ curpos = i;
+ break;
+ }
+ } else {
+ if( chr->rightToLeft )
+ cpos += cw;
+ int d = cpos - pos.x();
+ bool dm = d < 0 ? !chr->rightToLeft : chr->rightToLeft;
+ if ( QABS( d ) < dist || (dist == d && dm == TRUE ) ) {
+ dist = QABS( d );
+ curpos = i;
+ }
+ }
+ i++;
+ }
+ setIndex( curpos, FALSE );
+
+ if ( inCustom && doc && parag()->at( curpos )->isCustom() && parag()->at( curpos )->customItem()->isNested() ) {
+ gotoIntoNested( pos );
+ QPoint p( pos.x() - offsetX(), pos.y() - offsetY() );
+ if ( !place( p, document()->firstParag() ) )
+ pop();
+ }
+ return TRUE;
+}
+
+void QTextCursor::processNesting( Operation op )
+{
+ if ( !doc )
+ return;
+ push();
+ ox = 0;
+ int bl, y;
+ string->lineHeightOfChar( idx, &bl, &y );
+ oy = y + string->rect().y();
+ nested = TRUE;
+
+ switch ( op ) {
+ case EnterBegin:
+ string->at( idx )->customItem()->enter( this, doc, string, idx, ox, oy );
+ break;
+ case EnterEnd:
+ string->at( idx )->customItem()->enter( this, doc, string, idx, ox, oy, TRUE );
+ break;
+ case Next:
+ string->at( idx )->customItem()->next( this, doc, string, idx, ox, oy );
+ break;
+ case Prev:
+ string->at( idx )->customItem()->prev( this, doc, string, idx, ox, oy );
+ break;
+ case Down:
+ string->at( idx )->customItem()->down( this, doc, string, idx, ox, oy );
+ break;
+ case Up:
+ string->at( idx )->customItem()->up( this, doc, string, idx, ox, oy );
+ break;
+ }
+}
+
+void QTextCursor::gotoRight()
+{
+ tmpIndex = -1;
+
+ if ( string->at( idx )->isCustom() &&
+ string->at( idx )->customItem()->isNested() ) {
+ processNesting( EnterBegin );
+ return;
+ }
+
+ if ( idx < string->length() - 1 ) {
+ idx++;
+ } else if ( string->next() ) {
+ string = string->next();
+ while ( !string->isVisible() )
+ string = string->next();
+ idx = 0;
+ } else {
+ if ( nested ) {
+ pop();
+ processNesting( Next );
+ if ( idx == -1 ) {
+ pop();
+ if ( idx < string->length() - 1 ) {
+ idx++;
+ } else if ( string->next() ) {
+ string = string->next();
+ idx = 0;
+ }
+ }
+ }
+ }
+}
+
+void QTextCursor::gotoUp()
+{
+ int indexOfLineStart;
+ int line;
+ QTextStringChar *c = string->lineStartOfChar( idx, &indexOfLineStart, &line );
+ if ( !c )
+ return;
+
+ tmpIndex = QMAX( tmpIndex, idx - indexOfLineStart );
+ if ( indexOfLineStart == 0 ) {
+ if ( !string->prev() ) {
+ if ( !nested )
+ return;
+ pop();
+ processNesting( Up );
+ if ( idx == -1 ) {
+ pop();
+ if ( !string->prev() )
+ return;
+ idx = tmpIndex = 0;
+ } else {
+ tmpIndex = -1;
+ return;
+ }
+ }
+ string = string->prev();
+ while ( !string->isVisible() )
+ string = string->prev();
+ int lastLine = string->lines() - 1;
+ if ( !string->lineStartOfLine( lastLine, &indexOfLineStart ) )
+ return;
+ if ( indexOfLineStart + tmpIndex < string->length() )
+ idx = indexOfLineStart + tmpIndex;
+ else
+ idx = string->length() - 1;
+ } else {
+ --line;
+ int oldIndexOfLineStart = indexOfLineStart;
+ if ( !string->lineStartOfLine( line, &indexOfLineStart ) )
+ return;
+ if ( indexOfLineStart + tmpIndex < oldIndexOfLineStart )
+ idx = indexOfLineStart + tmpIndex;
+ else
+ idx = oldIndexOfLineStart - 1;
+ }
+}
+
+void QTextCursor::gotoDown()
+{
+ int indexOfLineStart;
+ int line;
+ QTextStringChar *c = string->lineStartOfChar( idx, &indexOfLineStart, &line );
+ if ( !c )
+ return;
+
+ tmpIndex = QMAX( tmpIndex, idx - indexOfLineStart );
+ if ( line == string->lines() - 1 ) {
+ if ( !string->next() ) {
+ if ( !nested )
+ return;
+ pop();
+ processNesting( Down );
+ if ( idx == -1 ) {
+ pop();
+ if ( !string->next() )
+ return;
+ idx = tmpIndex = 0;
+ } else {
+ tmpIndex = -1;
+ return;
+ }
+ }
+ string = string->next();
+ while ( !string->isVisible() )
+ string = string->next();
+ if ( !string->lineStartOfLine( 0, &indexOfLineStart ) )
+ return;
+ int end;
+ if ( string->lines() == 1 )
+ end = string->length();
+ else
+ string->lineStartOfLine( 1, &end );
+ if ( indexOfLineStart + tmpIndex < end )
+ idx = indexOfLineStart + tmpIndex;
+ else
+ idx = end - 1;
+ } else {
+ ++line;
+ int end;
+ if ( line == string->lines() - 1 )
+ end = string->length();
+ else
+ string->lineStartOfLine( line + 1, &end );
+ if ( !string->lineStartOfLine( line, &indexOfLineStart ) )
+ return;
+ if ( indexOfLineStart + tmpIndex < end )
+ idx = indexOfLineStart + tmpIndex;
+ else
+ idx = end - 1;
+ }
+}
+
+void QTextCursor::gotoLineEnd()
+{
+ tmpIndex = -1;
+ int indexOfLineStart;
+ int line;
+ QTextStringChar *c = string->lineStartOfChar( idx, &indexOfLineStart, &line );
+ if ( !c )
+ return;
+
+ if ( line == string->lines() - 1 ) {
+ idx = string->length() - 1;
+ } else {
+ c = string->lineStartOfLine( ++line, &indexOfLineStart );
+ indexOfLineStart--;
+ idx = indexOfLineStart;
+ }
+}
+
+void QTextCursor::gotoLineStart()
+{
+ tmpIndex = -1;
+ int indexOfLineStart;
+ int line;
+ QTextStringChar *c = string->lineStartOfChar( idx, &indexOfLineStart, &line );
+ if ( !c )
+ return;
+
+ idx = indexOfLineStart;
+}
+
+void QTextCursor::gotoHome()
+{
+ tmpIndex = -1;
+ if ( doc )
+ string = doc->firstParag();
+ idx = 0;
+}
+
+void QTextCursor::gotoEnd()
+{
+ if ( doc && !doc->lastParag()->isValid() )
+ {
+ qDebug("Last parag, %d, is invalid - aborting gotoEnd() !",doc->lastParag()->paragId());
+ return;
+ }
+
+ tmpIndex = -1;
+ if ( doc )
+ string = doc->lastParag();
+ idx = string->length() - 1;
+ qDebug("gotoEnd: going to parag %d, index %d",string->paragId(),idx);
+}
+
+void QTextCursor::gotoPageUp( int visibleHeight )
+{
+ tmpIndex = -1;
+ QTextParag *s = string;
+ int h = visibleHeight;
+ int y = s->rect().y();
+ while ( s ) {
+ if ( y - s->rect().y() >= h )
+ break;
+ s = s->prev();
+ }
+
+ if ( !s && doc )
+ s = doc->firstParag();
+
+ string = s;
+ idx = 0;
+}
+
+void QTextCursor::gotoPageDown( int visibleHeight )
+{
+ tmpIndex = -1;
+ QTextParag *s = string;
+ int h = visibleHeight;
+ int y = s->rect().y();
+ while ( s ) {
+ if ( s->rect().y() - y >= h )
+ break;
+ s = s->next();
+ }
+
+ if ( !s && doc ) {
+ s = doc->lastParag();
+ string = s;
+ idx = string->length() - 1;
+ return;
+ }
+
+ if ( !s->isValid() )
+ return;
+
+ string = s;
+ idx = 0;
+}
+
+void QTextCursor::gotoWordLeft()
+{
+ gotoLeft();
+ tmpIndex = -1;
+ QTextString *s = string->string();
+ bool allowSame = FALSE;
+ for ( int i = idx - 1; i >= 0; --i ) {
+ if ( s->at( i ).c.isSpace() || s->at( i ).c == '\t' ) {
+ if ( !allowSame && s->at( i ).c == s->at( idx ).c )
+ continue;
+ idx = i + 1;
+ return;
+ }
+ if ( !allowSame && s->at( i ).c != s->at( idx ).c )
+ allowSame = TRUE;
+ }
+
+ idx = 0;
+}
+
+void QTextCursor::gotoWordRight()
+{
+ tmpIndex = -1;
+ QTextString *s = string->string();
+ bool allowSame = FALSE;
+ for ( int i = idx + 1; i < (int)s->length(); ++i ) {
+ if ( s->at( i ).c.isSpace() || s->at( i ).c == '\t' ) {
+ if ( !allowSame && s->at( i ).c == s->at( idx ).c )
+ continue;
+ idx = i;
+ return;
+ }
+ if ( !allowSame && s->at( i ).c != s->at( idx ).c )
+ allowSame = TRUE;
+ }
+
+ if ( string->next() ) {
+ string = string->next();
+ while ( !string->isVisible() )
+ string = string->next();
+ idx = 0;
+ } else {
+ gotoLineEnd();
+ }
+}
+
+bool QTextCursor::atParagStart()
+{
+ return idx == 0;
+}
+
+bool QTextCursor::atParagEnd()
+{
+ return idx == string->length() - 1;
+}
+
+void QTextCursor::splitAndInsertEmptyParag( bool ind, bool updateIds )
+{
+ if ( !doc )
+ return;
+ tmpIndex = -1;
+ QTextFormat *f = 0;
+ if ( doc->useFormatCollection() ) {
+ f = string->at( idx )->format();
+ if ( idx == string->length() - 1 && idx > 0 )
+ f = string->at( idx - 1 )->format();
+ if ( f->isMisspelled() ) {
+ f->removeRef();
+ f = doc->formatCollection()->format( f->font(), f->color() );
+ }
+ }
+
+ if ( atParagStart() ) {
+ QTextParag *p = string->prev();
+ QTextParag *s = doc->createParag( doc, p, string, updateIds );
+ if ( f )
+ s->setFormat( 0, 1, f, TRUE );
+ s->copyParagData( string );
+ if ( ind ) {
+ s->indent();
+ s->format();
+ indent();
+ string->format();
+ }
+ } else if ( atParagEnd() ) {
+ QTextParag *n = string->next();
+ QTextParag *s = doc->createParag( doc, string, n, updateIds );
+ if ( f )
+ s->setFormat( 0, 1, f, TRUE );
+ s->copyParagData( string );
+ if ( ind ) {
+ int oi, ni;
+ s->indent( &oi, &ni );
+ string = s;
+ idx = ni;
+ } else {
+ string = s;
+ idx = 0;
+ }
+ } else {
+ QString str = string->string()->toString().mid( idx, 0xFFFFFF );
+ QTextParag *n = string->next();
+ QTextParag *s = doc->createParag( doc, string, n, updateIds );
+ s->copyParagData( string );
+ s->remove( 0, 1 );
+ s->append( str, TRUE );
+ for ( uint i = 0; i < str.length(); ++i ) {
+ s->setFormat( i, 1, string->at( idx + i )->format(), TRUE );
+ if ( string->at( idx + i )->isCustom() ) {
+ QTextCustomItem * item = string->at( idx + i )->customItem();
+ s->at( i )->setCustomItem( item );
+ string->at( idx + i )->loseCustomItem();
+#if 0
+ s->addCustomItem();
+ string->removeCustomItem();
+#endif
+ doc->unregisterCustomItem( item, string );
+ doc->registerCustomItem( item, s );
+ }
+ }
+ string->truncate( idx );
+ if ( ind ) {
+ int oi, ni;
+ s->indent( &oi, &ni );
+ string = s;
+ idx = ni;
+ } else {
+ string = s;
+ idx = 0;
+ }
+ }
+
+ invalidateNested();
+}
+
+bool QTextCursor::remove()
+{
+ tmpIndex = -1;
+ if ( !atParagEnd() ) {
+ string->remove( idx, 1 );
+ int h = string->rect().height();
+ string->format( -1, TRUE );
+ if ( h != string->rect().height() )
+ invalidateNested();
+ else if ( doc && doc->parent() )
+ doc->nextDoubleBuffered = TRUE;
+ return FALSE;
+ } else if ( string->next() ) {
+
+ if ( string->length() == 1 ) {
+ string->next()->setPrev( string->prev() );
+ if ( string->prev() )
+ string->prev()->setNext( string->next() );
+ QTextParag *p = string->next();
+ delete string;
+ string = p;
+ string->invalidate( 0 );
+ QTextParag *s = string;
+ while ( s ) {
+ s->id = s->p ? s->p->id + 1 : 0;
+ s->state = -1;
+ s->needPreProcess = TRUE;
+ s->changed = TRUE;
+ s = s->n;
+ }
+ string->format();
+ } else {
+ string->join( string->next() );
+ }
+ invalidateNested();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void QTextCursor::killLine()
+{
+ if ( atParagEnd() )
+ return;
+ string->remove( idx, string->length() - idx - 1 );
+ int h = string->rect().height();
+ string->format( -1, TRUE );
+ if ( h != string->rect().height() )
+ invalidateNested();
+ else if ( doc && doc->parent() )
+ doc->nextDoubleBuffered = TRUE;
+}
+
+void QTextCursor::indent()
+{
+ int oi = 0, ni = 0;
+ string->indent( &oi, &ni );
+ if ( oi == ni )
+ return;
+
+ if ( idx >= oi )
+ idx += ni - oi;
+ else
+ idx = ni;
+}
+
+void QTextCursor::setDocument( QTextDocument *d )
+{
+ doc = d;
+ string = d->firstParag();
+ idx = 0;
+ nested = FALSE;
+ restoreState();
+ tmpIndex = -1;
+}
+
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+QTextDocument::QTextDocument( QTextDocument *p )
+ : par( p ), parParag( 0 ), tc( 0 ), tArray( 0 ), tStopWidth( 0 )
+{
+ fCollection = new QTextFormatCollection;
+ init();
+}
+
+QTextDocument::QTextDocument( QTextDocument *p, QTextFormatCollection *f )
+ : par( p ), parParag( 0 ), tc( 0 ), tArray( 0 ), tStopWidth( 0 )
+{
+ fCollection = f;
+ init();
+}
+
+void QTextDocument::init()
+{
+//ANY_CHARSET_BEGIN
+ m_assignedFontMap = false;
+ charsetMap = new QMap<QString, QFont::CharSet>;
+// ASSERT(m_charsetMap);
+
+ if (!m_charsetMap) {
+ m_assignedFontMap = true;
+ m_charsetMap = charsetMap;
+ }
+//ANY_CHARSET_END
+
+#if defined(PARSER_DEBUG)
+ qDebug( "new QTextDocument (%p)", this );
+#endif
+ if ( par )
+ par->insertChild( this );
+ pProcessor = 0;
+ useFC = TRUE;
+ pFormatter = 0;
+ indenter = 0;
+ fParag = 0;
+ txtFormat = Qt::AutoText;
+ preferRichText = FALSE;
+ pages = FALSE;
+ focusIndicator.parag = 0;
+ minw = 0;
+ minwParag = 0;
+ align = Qt3::AlignAuto;
+ nSelections = 1;
+ addMargs = FALSE;
+
+ sheet_ = QStyleSheet::defaultSheet();
+ factory_ = QMimeSourceFactory::defaultFactory();
+ contxt = QString::null;
+ fCollection->setStyleSheet( sheet_ );
+
+ linkC = Qt::blue;
+ underlLinks = TRUE;
+ backBrush = 0;
+ buf_pixmap = 0;
+ nextDoubleBuffered = FALSE;
+
+ if ( par )
+ withoutDoubleBuffer = par->withoutDoubleBuffer;
+ else
+ withoutDoubleBuffer = FALSE;
+
+ lParag = fParag = createParag( this, 0, 0 );
+ tmpCursor = 0;
+
+ cx = 0;
+ cy = 2;
+ if ( par )
+ cx = cy = 0;
+ cw = 600;
+ vw = 0;
+ flow_ = new QTextFlow;
+ flow_->setWidth( cw );
+
+ selectionColors[ Standard ] = QApplication::palette().color( QPalette::Active, QColorGroup::Highlight );
+ selectionText[ Standard ] = TRUE;
+ commandHistory = new QTextCommandHistory( 100 );
+ tStopWidth = formatCollection()->defaultFormat()->width( 'x' ) * 8;
+}
+
+QTextDocument::~QTextDocument()
+{
+ if ( par )
+ par->removeChild( this );
+ clear();
+ delete commandHistory;
+ delete flow_;
+ if ( !par )
+ delete pFormatter;
+ delete fCollection;
+ delete pProcessor;
+ delete buf_pixmap;
+ delete indenter;
+ delete backBrush;
+ if ( tArray )
+ delete [] tArray;
+//ANY_CHARSET_BEGIN
+ if (charsetMap) {
+ delete charsetMap;
+ charsetMap = 0;
+ if (m_assignedFontMap)
+ m_charsetMap = 0;
+ m_assignedFontMap = false;
+ }
+//ANY_CHARSET_END
+}
+
+void QTextDocument::clear( bool createEmptyParag )
+{
+ if ( flow_ )
+ flow_->clear();
+ while ( fParag ) {
+ QTextParag *p = fParag->next();
+ delete fParag;
+ fParag = p;
+ }
+ fParag = lParag = 0;
+ if ( createEmptyParag )
+ fParag = lParag = createParag( this );
+ selections.clear();
+}
+
+int QTextDocument::widthUsed() const
+{
+ QTextParag *p = fParag;
+ int w = 0;
+ while ( p ) {
+ int a = p->alignment();
+ p->setAlignment( Qt::AlignLeft );
+ p->invalidate( 0 );
+ p->format();
+ w = QMAX( w, p->rect().width() );
+ p->setAlignment( a );
+ p->invalidate( 0 );
+ p = p->next();
+ }
+ return w;
+}
+
+QTextParag *QTextDocument::createParag( QTextDocument *d, QTextParag *pr, QTextParag *nx, bool updateIds )
+{
+ return new QTextParag( d, pr, nx, updateIds );
+}
+
+bool QTextDocument::setMinimumWidth( int w, QTextParag *p )
+{
+ if ( w == -1 ) {
+ minw = 0;
+ p = 0;
+ }
+ if ( p == minwParag ) {
+ minw = w;
+ emit minimumWidthChanged( minw );
+ } else if ( w > minw ) {
+ minw = w;
+ minwParag = p;
+ emit minimumWidthChanged( minw );
+ }
+ cw = QMAX( minw, cw );
+ return TRUE;
+}
+
+void QTextDocument::setPlainText( const QString &text )
+{
+ clear();
+ preferRichText = FALSE;
+
+ QString s;
+ lParag = 0;
+ QStringList lst = QStringList::split( '\n', text, TRUE );
+ for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) {
+ lParag = createParag( this, lParag, 0 );
+ if ( !fParag )
+ fParag = lParag;
+ s = *it;
+ if ( !s.isEmpty() ) {
+ if ( s[ (int)s.length() - 1 ] == '\r' )
+ s.remove( s.length() - 1, 1 );
+ lParag->append( s );
+ }
+ }
+
+ if ( !lParag )
+ lParag = fParag = createParag( this, 0, 0 );
+}
+
+struct Q_EXPORT Tag {
+ Tag(){}
+ Tag( const QString&n, const QStyleSheetItem* s ):name(n),style(s) {
+ wsm = QStyleSheetItem::WhiteSpaceNormal;
+ }
+ QString name;
+ const QStyleSheetItem* style;
+ QStyleSheetItem::WhiteSpaceMode wsm;
+ QTextFormat format;
+
+#if defined(Q_FULL_TEMPLATE_INSTANTIATION)
+ bool operator==( const Tag& ) const { return FALSE; }
+#endif
+};
+
+#define NEWPAR if ( !curpar || ( curtag.name != "table" && curtag.name != "li" ) || curpar->length() > 1 ) { if ( !hasNewPar ) curpar = createParag( this, curpar ); \
+ hasNewPar = TRUE; \
+ QPtrVector<QStyleSheetItem> vec( tags.count() ); \
+ int i = 0; \
+ for ( QValueStack<Tag>::Iterator it = tags.begin(); it != tags.end(); ++it ) \
+ vec.insert( i++, (*it).style ); \
+ curpar->setStyleSheetItems( vec ); }while(FALSE)
+#define NEWPAROPEN(nstyle) if ( !curpar || ( curtag.name != "table" && curtag.name != "li" ) || curpar->length() > 1 ) { if ( !hasNewPar ) curpar = createParag( this, curpar ); \
+ hasNewPar = TRUE; \
+ QPtrVector<QStyleSheetItem> vec( tags.count()+1 ); \
+ int i = 0; \
+ for ( QValueStack<Tag>::Iterator it = tags.begin(); it != tags.end(); ++it ) \
+ vec.insert( i++, (*it).style ); \
+ vec.insert( i, nstyle ); \
+ curpar->setStyleSheetItems( vec ); }while(FALSE)
+
+
+void QTextDocument::setRichText( const QString &text, const QString &context )
+{
+ setTextFormat( Qt::RichText );
+ if ( !context.isEmpty() )
+ setContext( context );
+ clear();
+ fParag = lParag = createParag( this );
+ setRichTextInternal( text );
+}
+
+void QTextDocument::setRichTextInternal( const QString &text )
+{
+ QTextParag* curpar = lParag;
+ int pos = 0;
+ QValueStack<Tag> tags;
+ Tag curtag( "", sheet_->item("") );
+ curtag.format = *formatCollection()->defaultFormat();
+ bool space = FALSE;
+
+ QString doc = text;
+ int depth = 0;
+ bool hasNewPar = TRUE;
+ QStyleSheetItem::ListStyle curListStyle;
+ while ( pos < int( doc.length() ) ) {
+ if (hasPrefix(doc, pos, '<' ) ){
+ if (!hasPrefix(doc, pos+1, QChar('/'))) {
+ // open tag
+ QMap<QString, QString> attr;
+ bool emptyTag = FALSE;
+ QString tagname = parseOpenTag(doc, pos, attr, emptyTag);
+ if ( tagname.isEmpty() )
+ continue; // nothing we could do with this, probably parse error
+ while ( eat( doc, pos, '\n' ) )
+ ; // eliminate newlines right after openings
+
+ const QStyleSheetItem* nstyle = sheet_->item(tagname);
+ if ( nstyle ) {
+ // we might have to close some 'forgotten' tags
+ while ( !nstyle->allowedInContext( curtag.style ) ) {
+ QString msg;
+ msg.sprintf( "QText Warning: Document not valid ( '%s' not allowed in '%s' #%d)",
+ tagname.ascii(), curtag.style->name().ascii(), pos);
+ sheet_->error( msg );
+ if ( tags.isEmpty() )
+ break;
+ curtag = tags.pop();
+ depth--;
+ }
+ if ( nstyle->name() == "ol" ) {
+ curListStyle = nstyle->listStyle();
+ QMap<QString, QString>::Iterator it = attr.find( "type" );
+ if ( it != attr.end() ) {
+ QString sl = *it;
+ if ( sl == "1" ) {
+ curListStyle = QStyleSheetItem::ListDecimal;
+ } else if ( sl == "a" ) {
+ curListStyle = QStyleSheetItem::ListLowerAlpha;
+ } else if ( sl == "A" ) {
+ curListStyle = QStyleSheetItem::ListUpperAlpha;
+ } else {
+ sl = sl.lower();
+ if ( sl == "square" )
+ curListStyle = QStyleSheetItem::ListSquare;
+ else if ( sl == "disc" )
+ curListStyle = QStyleSheetItem::ListDisc;
+ else if ( sl == "circle" )
+ curListStyle = QStyleSheetItem::ListCircle;
+ }
+ }
+ }
+ }
+
+ QTextCustomItem* custom = 0;
+ // some well-known empty tags
+ if ( tagname == "br" ) {
+ emptyTag = TRUE;
+ NEWPAR;
+ } else if ( tagname == "hr" ) {
+ emptyTag = TRUE;
+ custom = sheet_->tag( tagname, attr, contxt, *factory_ , emptyTag, this );
+ NEWPAR;
+ } else if ( tagname == "table" ) {
+ QTextFormat format = curtag.format.makeTextFormat( nstyle, attr );
+ custom = parseTable( attr, format, doc, pos, curpar );
+ (void ) eatSpace( doc, pos );
+ emptyTag = TRUE;
+ } else {
+ custom = sheet_->tag( tagname, attr, contxt, *factory_ , emptyTag, this );
+ }
+
+ if ( !nstyle && !custom ) // we have no clue what this tag could be, ignore it
+ continue;
+
+ if ( custom ) {
+ QTextFormat format = curtag.format.makeTextFormat( nstyle, attr );
+ int index = curpar->length() - 1;
+ if ( index < 0 )
+ index = 0;
+ curpar->append( QChar('b') );
+ curpar->setFormat( index, 1, &format );
+ curpar->at( index )->setCustomItem( custom );
+ curpar->addCustomItem();
+ registerCustomItem( custom, curpar );
+ hasNewPar = FALSE;
+ } else if ( !emptyTag ) {
+ tags += curtag;
+ if ( nstyle ) {
+ // ignore whitespace for inline elements if there was already one
+ if ( nstyle->whiteSpaceMode() == QStyleSheetItem::WhiteSpaceNormal
+ && ( space || nstyle->displayMode() != QStyleSheetItem::DisplayInline ) )
+ eatSpace( doc, pos );
+
+ // some styles are not self nesting
+ if ( nstyle == curtag.style && !nstyle->selfNesting() )
+ (void) tags.pop();
+
+ if ( curtag.style->displayMode() == QStyleSheetItem::DisplayListItem )
+ hasNewPar = FALSE; // we want empty paragraphs in this case
+ if ( nstyle->displayMode() != QStyleSheetItem::DisplayInline )
+ NEWPAROPEN(nstyle);
+ if ( nstyle->displayMode() == QStyleSheetItem::DisplayListItem )
+ curpar->setListStyle( curListStyle );
+ curtag.style = nstyle;
+ curtag.wsm = nstyle->whiteSpaceMode();
+ curtag.format = curtag.format.makeTextFormat( nstyle, attr );
+ if ( nstyle->displayMode() != QStyleSheetItem::DisplayInline )
+ curpar->setFormat( &curtag.format );
+ if ( nstyle->name() == "li" ) {
+ if ( attr.find( "value" ) != attr.end() )
+ curpar->setListValue( (*attr.find( "value" )).toInt() );
+ }
+ }
+ curtag.name = tagname;
+ if ( curtag.name == "a" && attr.find( "name" ) != attr.end() && doc[ pos] == '<' ) // hack to be sure
+ doc.insert( pos, " " ); // <a name=".."></a> formats or inserted
+ if ( attr.find( "align" ) != attr.end() &&
+ ( curtag.name == "p" || curtag.name == "li" || curtag.name[ 0 ] == 'h' ) ) {
+ if ( *attr.find( "align" ) == "center" )
+ curpar->setAlignment( Qt::AlignCenter );
+ else if ( *attr.find( "align" ) == "right" )
+ curpar->setAlignment( Qt::AlignRight );
+ else if ( *attr.find( "align" ) == "justify" )
+ curpar->setAlignment( Qt3::AlignJustify );
+ }
+ depth++;
+ }
+ } else {
+ // close tag
+ QString tagname = parseCloseTag( doc, pos );
+ if ( tagname.isEmpty() )
+ continue; // nothing we could do with this, probably parse error
+ while ( eat( doc, pos, '\n' ) )
+ ; // eliminate newlines right after closings
+ if ( !sheet_->item( tagname ) ) // ignore unknown tags
+ continue;
+ depth--;
+ while ( curtag.name != tagname ) {
+ QString msg;
+ msg.sprintf( "QText Warning: Document not valid ( '%s' not closed before '%s' #%d)",
+ curtag.name.ascii(), tagname.ascii(), pos);
+ sheet_->error( msg );
+ if ( !hasNewPar && curtag.style->displayMode() != QStyleSheetItem::DisplayInline
+ && curtag.wsm == QStyleSheetItem::WhiteSpaceNormal ) {
+ eatSpace( doc, pos );
+ NEWPAR;
+ }
+ if ( tags.isEmpty() )
+ break;
+ curtag = tags.pop();
+ depth--;
+ }
+
+ if ( !hasNewPar && curtag.style->displayMode() != QStyleSheetItem::DisplayInline
+ && curtag.wsm == QStyleSheetItem::WhiteSpaceNormal ) {
+ eatSpace( doc, pos );
+ NEWPAR;
+ }
+ if ( !tags.isEmpty() )
+ curtag = tags.pop();
+ }
+ } else {
+ // normal contents
+ QString s;
+ QChar c;
+ bool hadNonSpace = !curpar->string()->toString().simplifyWhiteSpace().isEmpty();
+ while ( pos < int( doc.length() ) && !hasPrefix(doc, pos, '<' ) ){
+ c = parseChar( doc, pos, curtag.wsm );
+ space = c.isSpace();
+ hadNonSpace = hadNonSpace || !space;
+ if ( c == '\n' ) // happens in WhiteSpacePre mode
+ break;
+ if ( !hadNonSpace && space && curtag.wsm == QStyleSheetItem::WhiteSpaceNormal )
+ continue;
+ if ( c == '\r' )
+ continue;
+ s += c;
+ }
+ if ( !s.isEmpty() && curtag.style->displayMode() != QStyleSheetItem::DisplayNone ) {
+ hasNewPar = FALSE;
+ int index = curpar->length() - 1;
+ if ( index < 0 )
+ index = 0;
+ curpar->append( s );
+ curpar->setFormat( index, s.length(), &curtag.format );
+ }
+ if ( c == '\n' )
+ NEWPAR;
+
+ }
+ }
+}
+
+void QTextDocument::setText( const QString &text, const QString &context )
+{
+ oText = text;
+ focusIndicator.parag = 0;
+ selections.clear();
+ if ( txtFormat == Qt::AutoText && QStyleSheet::mightBeRichText( text ) ||
+ txtFormat == Qt::RichText )
+ setRichText( text, context );
+ else
+ setPlainText( text );
+}
+
+QString QTextDocument::plainText( QTextParag *p ) const
+{
+ if ( !p ) {
+ QString buffer;
+ QString s;
+ QTextParag *p = fParag;
+ while ( p ) {
+ s = p->string()->toString();
+ s.remove( s.length() - 1, 1 );
+ if ( p->next() )
+ s += "\n";
+ buffer += s;
+ p = p->next();
+ }
+ return buffer;
+ } else {
+ return p->string()->toString();
+ }
+}
+
+static QString align_to_string( const QString &tag, int a )
+{
+ if ( tag == "p" || tag == "li" || tag[ 0 ] == 'h' ) {
+ if ( a & Qt::AlignRight )
+ return " align=right ";
+ if ( a & Qt::AlignCenter )
+ return " align=center ";
+ if ( a & Qt3::AlignJustify )
+ return " align=justify ";
+ }
+ return "";
+}
+
+QString QTextDocument::richText( QTextParag *p ) const
+{
+ QString s;
+ if ( !p ) {
+ p = fParag;
+ QPtrVector<QStyleSheetItem> lastItems, items;
+ while ( p ) {
+ items = p->styleSheetItems();
+ if ( items.size() ) {
+ QStyleSheetItem *item = items[ items.size() - 1 ];
+ items.resize( items.size() - 1 );
+ if ( items.size() > lastItems.size() ) {
+ for ( int i = lastItems.size(); i < (int)items.size(); ++i ) {
+ if ( items[ i ]->name().isEmpty() )
+ continue;
+ if ( items[ i ]->name() == "li" && p->listValue() != -1 )
+ s += "<li value=\"" + QString::number( p->listValue() ) + "\">";
+ else
+ s += "<" + items[ i ]->name() + align_to_string( items[ i ]->name(), p->alignment() ) + ">";
+ }
+ } else {
+ QString end;
+ for ( int i = items.size(); i < (int)lastItems.size(); ++i ) {
+ if ( lastItems[ i ]->name().isEmpty() )
+ continue;
+ end.prepend( "</" + lastItems[ i ]->name() + ">" );
+ }
+ s += end;
+ }
+ lastItems = items;
+ if ( item->name() == "li" && p->listValue() != -1 )
+ s += "<li value=\"" + QString::number( p->listValue() ) + "\">";
+ else
+ s += "<" + item->name() + align_to_string( item->name(), p->alignment() ) + ">" +
+ p->richText() + "</" + item->name() + ">\n";
+ } else {
+ QString end;
+ for ( int i = 0; i < (int)lastItems.size(); ++i ) {
+ if ( lastItems[ i ]->name().isEmpty() )
+ continue;
+ end.prepend( "</" + lastItems[ i ]->name() + ">" );
+ }
+ s += end;
+ s += "<p" + align_to_string( "p", p->alignment() ) + ">" + p->richText() + "</p>\n";
+ lastItems = items;
+ }
+ p = p->next();
+ }
+ } else {
+ s = p->richText();
+ }
+
+ return s;
+}
+
+QString QTextDocument::text() const
+{
+ if ( plainText().simplifyWhiteSpace().isEmpty() )
+ return QString::null;
+ if ( txtFormat == Qt::AutoText && preferRichText || txtFormat == Qt::RichText )
+ return richText();
+ return plainText( 0 );
+}
+
+QString QTextDocument::text( int parag ) const
+{
+ QTextParag *p = paragAt( parag );
+ if ( !p )
+ return QString::null;
+
+ if ( txtFormat == Qt::AutoText && preferRichText || txtFormat == Qt::RichText )
+ return richText( p );
+ else
+ return plainText( p );
+}
+
+void QTextDocument::invalidate()
+{
+ QTextParag *s = fParag;
+ while ( s ) {
+ s->invalidate( 0 );
+ s = s->next();
+ }
+}
+
+void QTextDocument::selectionStart( int id, int &paragId, int &index )
+{
+ QMap<int, QTextDocumentSelection>::Iterator it = selections.find( id );
+ if ( it == selections.end() )
+ return;
+ QTextDocumentSelection &sel = *it;
+ paragId = !sel.swapped ? sel.startCursor.parag()->paragId() : sel.endCursor.parag()->paragId();
+ index = !sel.swapped ? sel.startCursor.index() : sel.endCursor.index();
+}
+
+QTextCursor QTextDocument::selectionStartCursor( int id)
+{
+ QMap<int, QTextDocumentSelection>::Iterator it = selections.find( id );
+ if ( it == selections.end() )
+ return QTextCursor( this );
+ QTextDocumentSelection &sel = *it;
+ if ( sel.swapped )
+ return sel.endCursor;
+ return sel.startCursor;
+}
+
+QTextCursor QTextDocument::selectionEndCursor( int id)
+{
+ QMap<int, QTextDocumentSelection>::Iterator it = selections.find( id );
+ if ( it == selections.end() )
+ return QTextCursor( this );
+ QTextDocumentSelection &sel = *it;
+ if ( !sel.swapped )
+ return sel.endCursor;
+ return sel.startCursor;
+}
+
+void QTextDocument::selectionEnd( int id, int &paragId, int &index )
+{
+ QMap<int, QTextDocumentSelection>::Iterator it = selections.find( id );
+ if ( it == selections.end() )
+ return;
+ QTextDocumentSelection &sel = *it;
+ paragId = sel.swapped ? sel.startCursor.parag()->paragId() : sel.endCursor.parag()->paragId();
+ index = sel.swapped ? sel.startCursor.index() : sel.endCursor.index();
+}
+
+QTextParag *QTextDocument::selectionStart( int id )
+{
+ QMap<int, QTextDocumentSelection>::Iterator it = selections.find( id );
+ if ( it == selections.end() )
+ return 0;
+ QTextDocumentSelection &sel = *it;
+ if ( sel.startCursor.parag()->paragId() < sel.endCursor.parag()->paragId() )
+ return sel.startCursor.parag();
+ return sel.endCursor.parag();
+}
+
+QTextParag *QTextDocument::selectionEnd( int id )
+{
+ QMap<int, QTextDocumentSelection>::Iterator it = selections.find( id );
+ if ( it == selections.end() )
+ return 0;
+ QTextDocumentSelection &sel = *it;
+ if ( sel.startCursor.parag()->paragId() > sel.endCursor.parag()->paragId() )
+ return sel.startCursor.parag();
+ return sel.endCursor.parag();
+}
+
+void QTextDocument::addSelection( int id )
+{
+ nSelections = QMAX( nSelections, id + 1 );
+}
+
+bool QTextDocument::setSelectionEnd( int id, QTextCursor *cursor )
+{
+ QMap<int, QTextDocumentSelection>::Iterator it = selections.find( id );
+ if ( it == selections.end() )
+ return FALSE;
+
+ QTextDocumentSelection &sel = *it;
+
+ QTextCursor start = sel.startCursor;
+ QTextCursor end = *cursor;
+
+ if ( sel.endCursor.parag() == end.parag() ) {
+ QTextCursor c1 = start;
+ QTextCursor c2 = end;
+ if ( sel.swapped ) {
+ c1 = end;
+ c2 = start;
+ }
+
+ c1.parag()->removeSelection( id );
+ c2.parag()->removeSelection( id );
+ if ( c1.parag() != c2.parag() ) {
+ c1.parag()->setSelection( id, c1.index(), c1.parag()->length() - 1 );
+ c2.parag()->setSelection( id, 0, c2.index() );
+ } else {
+ c1.parag()->setSelection( id, QMIN( c1.index(), c2.index() ), QMAX( c1.index(), c2.index() ) );
+ }
+
+ sel.startCursor = start;
+ sel.endCursor = end;
+ if ( sel.startCursor.parag() == sel.endCursor.parag() )
+ sel.swapped = sel.startCursor.index() > sel.endCursor.index();
+
+ return TRUE;
+ }
+
+ bool inSelection = FALSE;
+ QTextCursor c( this );
+ QTextCursor tmp = sel.startCursor;
+ if ( sel.swapped )
+ tmp = sel.endCursor;
+ tmp.restoreState();
+ QTextCursor tmp2 = *cursor;
+ tmp2.restoreState();
+ c.setParag( tmp.parag()->paragId() < tmp2.parag()->paragId() ? tmp.parag() : tmp2.parag() );
+ QTextCursor old;
+ bool hadStart = FALSE;
+ bool hadEnd = FALSE;
+ bool hadStartParag = FALSE;
+ bool hadEndParag = FALSE;
+ bool hadOldStart = FALSE;
+ bool hadOldEnd = FALSE;
+ bool leftSelection = FALSE;
+ sel.swapped = FALSE;
+ while ( TRUE ) {
+ if ( c == start )
+ hadStart = TRUE;
+ if ( c == end )
+ hadEnd = TRUE;
+ if ( c.parag() == start.parag() )
+ hadStartParag = TRUE;
+ if ( c.parag() == end.parag() )
+ hadEndParag = TRUE;
+ if ( c == sel.startCursor )
+ hadOldStart = TRUE;
+ if ( c == sel.endCursor )
+ hadOldEnd = TRUE;
+
+ if ( !sel.swapped &&
+ ( hadEnd && !hadStart ||
+ hadEnd && hadStart && start.parag() == end.parag() && start.index() > end.index() ) )
+ sel.swapped = TRUE;
+
+ if ( c == end && hadStartParag ||
+ c == start && hadEndParag ) {
+ QTextCursor tmp = c;
+ tmp.restoreState();
+ if ( tmp.parag() != c.parag() ) {
+ int sstart = tmp.parag()->selectionStart( id );
+ tmp.parag()->removeSelection( id );
+ tmp.parag()->setSelection( id, sstart, tmp.index() );
+ }
+ }
+
+ if ( inSelection &&
+ ( c == end && hadStart || c == start && hadEnd ) )
+ leftSelection = TRUE;
+ else if ( !leftSelection && !inSelection && ( hadStart || hadEnd ) )
+ inSelection = TRUE;
+
+ bool noSelectionAnymore = hadOldStart && hadOldEnd && leftSelection && !inSelection && !c.parag()->hasSelection( id ) && c.atParagEnd();
+ if ( !c.parag()->hasChanged() ) {
+ c.parag()->removeSelection( id );
+ if ( inSelection ) {
+ if ( c.parag() == start.parag() && start.parag() == end.parag() ) {
+ c.parag()->setSelection( id, QMIN( start.index(), end.index() ), QMAX( start.index(), end.index() ) );
+ } else if ( c.parag() == start.parag() && !hadEndParag ) {
+ c.parag()->setSelection( id, start.index(), c.parag()->length() - 1 );
+ } else if ( c.parag() == end.parag() && !hadStartParag ) {
+ c.parag()->setSelection( id, end.index(), c.parag()->length() - 1 );
+ } else if ( c.parag() == end.parag() && hadEndParag ) {
+ c.parag()->setSelection( id, 0, end.index() );
+ } else if ( c.parag() == start.parag() && hadStartParag ) {
+ c.parag()->setSelection( id, 0, start.index() );
+ } else {
+ c.parag()->setSelection( id, 0, c.parag()->length() - 1 );
+ }
+ }
+ }
+
+ if ( leftSelection )
+ inSelection = FALSE;
+
+ old = c;
+ c.gotoRight();
+ if ( old == c || noSelectionAnymore )
+ break;
+ }
+
+ if ( !sel.swapped )
+ sel.startCursor.parag()->setSelection( id, sel.startCursor.index(), sel.startCursor.parag()->length() - 1 );
+
+ sel.startCursor = start;
+ sel.endCursor = end;
+ if ( sel.startCursor.parag() == sel.endCursor.parag() )
+ sel.swapped = sel.startCursor.index() > sel.endCursor.index();
+
+ return TRUE;
+}
+
+void QTextDocument::selectAll( int id )
+{
+ removeSelection( id );
+
+ QTextDocumentSelection sel;
+ sel.swapped = FALSE;
+ QTextCursor c( this );
+
+ c.setParag( fParag );
+ c.setIndex( 0 );
+ sel.startCursor = c;
+
+ c.setParag( lParag );
+ c.setIndex( lParag->length() - 1 );
+ sel.endCursor = c;
+
+ QTextParag *p = fParag;
+ while ( p ) {
+ p->setSelection( id, 0, p->length() - 1 );
+ p = p->next();
+ }
+
+ selections.insert( id, sel );
+}
+
+bool QTextDocument::removeSelection( int id )
+{
+ QMap<int, QTextDocumentSelection>::Iterator it = selections.find( id );
+ if ( it == selections.end() )
+ return FALSE;
+
+ QTextDocumentSelection &sel = *it;
+
+ QTextCursor c( this );
+ QTextCursor tmp = sel.startCursor;
+ if ( sel.swapped )
+ tmp = sel.endCursor;
+ tmp.restoreState();
+ c.setParag( tmp.parag() );
+ QTextCursor old;
+ bool hadStart = FALSE;
+ bool hadEnd = FALSE;
+ QTextParag *lastParag = 0;
+ bool leftSelection = FALSE;
+ bool inSelection = FALSE;
+ sel.swapped = FALSE;
+ while ( TRUE ) {
+ if ( c.parag() == sel.startCursor.parag() )
+ hadStart = TRUE;
+ if ( c.parag() == sel.endCursor.parag() )
+ hadEnd = TRUE;
+
+ if ( inSelection &&
+ ( c == sel.endCursor && hadStart || c == sel.startCursor && hadEnd ) )
+ leftSelection = TRUE;
+ else if ( !leftSelection && !inSelection && ( c.parag() == sel.startCursor.parag() || c.parag() == sel.endCursor.parag() ) )
+ inSelection = TRUE;
+
+ bool noSelectionAnymore = leftSelection && !inSelection && !c.parag()->hasSelection( id ) && c.atParagEnd();
+
+ if ( lastParag != c.parag() )
+ c.parag()->removeSelection( id );
+
+ old = c;
+ lastParag = c.parag();
+ c.gotoRight();
+ if ( old == c || noSelectionAnymore )
+ break;
+ }
+
+ selections.remove( id );
+ return TRUE;
+}
+
+QString QTextDocument::selectedText( int id ) const
+{
+ // ######## TODO: look at textFormat() and return rich text or plain text (like the text() method!)
+ QMap<int, QTextDocumentSelection>::ConstIterator it = selections.find( id );
+ if ( it == selections.end() )
+ return QString::null;
+
+ QTextDocumentSelection sel = *it;
+
+ QTextCursor c1 = sel.startCursor;
+ QTextCursor c2 = sel.endCursor;
+ if ( sel.swapped ) {
+ c2 = sel.startCursor;
+ c1 = sel.endCursor;
+ }
+
+ c2.restoreState();
+ c1.restoreState();
+
+ if ( c1.parag() == c2.parag() )
+ return c1.parag()->string()->toString().mid( c1.index(), c2.index() - c1.index() );
+
+ QString s;
+ s += c1.parag()->string()->toString().mid( c1.index() ) + "\n";
+ QTextParag *p = c1.parag()->next();
+ while ( p && p != c2.parag() ) {
+ s += p->string()->toString() + "\n";
+ p = p->next();
+ }
+ s += c2.parag()->string()->toString().left( c2.index() );
+ return s;
+}
+
+void QTextDocument::setFormat( int id, QTextFormat *f, int flags )
+{
+ QMap<int, QTextDocumentSelection>::ConstIterator it = selections.find( id );
+ if ( it == selections.end() )
+ return;
+
+ QTextDocumentSelection sel = *it;
+
+ QTextCursor c1 = sel.startCursor;
+ QTextCursor c2 = sel.endCursor;
+ if ( sel.swapped ) {
+ c2 = sel.startCursor;
+ c1 = sel.endCursor;
+ }
+
+ c2.restoreState();
+ c1.restoreState();
+
+ if ( c1.parag() == c2.parag() ) {
+ c1.parag()->setFormat( c1.index(), c2.index() - c1.index(), f, TRUE, flags );
+ return;
+ }
+
+ c1.parag()->setFormat( c1.index(), c1.parag()->length() - c1.index(), f, TRUE, flags );
+ QTextParag *p = c1.parag()->next();
+ while ( p && p != c2.parag() ) {
+ p->setFormat( 0, p->length() /*- 1 removed, bug #26064*/, f, TRUE, flags );
+ p = p->next();
+ }
+ c2.parag()->setFormat( 0, c2.index(), f, TRUE, flags );
+}
+
+void QTextDocument::copySelectedText( int id )
+{
+#ifndef QT_NO_CLIPBOARD
+ if ( !hasSelection( id ) )
+ return;
+
+ QApplication::clipboard()->setText( selectedText( id ) );
+#endif
+}
+
+void QTextDocument::removeSelectedText( int id, QTextCursor *cursor )
+{
+ QMap<int, QTextDocumentSelection>::Iterator it = selections.find( id );
+ if ( it == selections.end() )
+ return;
+
+ QTextDocumentSelection sel = *it;
+
+ QTextCursor c1 = sel.startCursor;
+ QTextCursor c2 = sel.endCursor;
+ if ( sel.swapped ) {
+ c2 = sel.startCursor;
+ c1 = sel.endCursor;
+ }
+
+ // ### no support for editing tables yet
+ if ( c1.nestedDepth() || c2.nestedDepth() )
+ return;
+
+ c2.restoreState();
+ c1.restoreState();
+
+ *cursor = c1;
+ removeSelection( id );
+
+ if ( c1.parag() == c2.parag() ) {
+ c1.parag()->remove( c1.index(), c2.index() - c1.index() );
+ return;
+ }
+
+ if ( c1.index() == 0 )
+ cursor->gotoLeft();
+
+ c1.parag()->remove( c1.index(), c1.parag()->length() - c1.index() );
+ QTextParag *p = c1.parag()->next();
+ int dy = 0;
+ QTextParag *tmp;
+ while ( p && p != c2.parag() ) {
+ tmp = p->next();
+ dy -= p->rect().height();
+ delete p;
+ p = tmp;
+ }
+ c2.parag()->remove( 0, c2.index() );
+ while ( p ) {
+ p->move( dy );
+ p->invalidate( 0 );
+ p->setEndState( -1 );
+ p = p->next();
+ }
+
+ c1.parag()->join( c2.parag() );
+}
+
+void QTextDocument::indentSelection( int id )
+{
+ QMap<int, QTextDocumentSelection>::Iterator it = selections.find( id );
+ if ( it == selections.end() )
+ return;
+
+ QTextDocumentSelection sel = *it;
+ QTextParag *startParag = sel.startCursor.parag();
+ QTextParag *endParag = sel.endCursor.parag();
+ if ( sel.endCursor.parag()->paragId() < sel.startCursor.parag()->paragId() ) {
+ endParag = sel.startCursor.parag();
+ startParag = sel.endCursor.parag();
+ }
+
+ QTextParag *p = startParag;
+ while ( p && p != endParag ) {
+ p->indent();
+ p = p->next();
+ }
+}
+
+void QTextDocument::addCommand( QTextCommand *cmd )
+{
+ commandHistory->addCommand( cmd );
+}
+
+QTextCursor *QTextDocument::undo( QTextCursor *c )
+{
+ return commandHistory->undo( c );
+}
+
+QTextCursor *QTextDocument::redo( QTextCursor *c )
+{
+ return commandHistory->redo( c );
+}
+
+bool QTextDocument::find( const QString &expr, bool cs, bool wo, bool forward,
+ int *parag, int *index, QTextCursor *cursor )
+{
+ QTextParag *p = forward ? fParag : lParag;
+ if ( parag )
+ p = paragAt( *parag );
+ else if ( cursor )
+ p = cursor->parag();
+ bool first = TRUE;
+
+ while ( p ) {
+ QString s = p->string()->toString();
+ s.remove( s.length() - 1, 1 ); // get rid of trailing space
+ int start = forward ? 0 : s.length() - 1;
+ if ( first && index )
+ start = *index;
+ else if ( first )
+ start = cursor->index();
+ first = FALSE;
+ int res = forward ? s.find( expr, start, cs ) : s.findRev( expr, start, cs );
+ if ( res != -1 ) {
+ bool ok = TRUE;
+ if ( wo ) {
+ int end = res + expr.length();
+ if ( ( res == 0 || s[ res ].isSpace() || s[ res ].isPunct() ) &&
+ ( end == (int)s.length() - 1 || s[ end ].isSpace() || s[ end ].isPunct() ) )
+ ok = TRUE;
+ else
+ ok = FALSE;
+ }
+ if ( ok ) {
+ cursor->setParag( p );
+ cursor->setIndex( res );
+ setSelectionStart( Standard, cursor );
+ cursor->setIndex( res + expr.length() );
+ setSelectionEnd( Standard, cursor );
+ if ( parag )
+ *parag = p->paragId();
+ if ( index )
+ *index = res;
+ return TRUE;
+ }
+ }
+ p = forward ? p->next() : p->prev();
+ }
+
+ return FALSE;
+}
+
+void QTextDocument::setTextFormat( Qt::TextFormat f )
+{
+ txtFormat = f;
+}
+
+Qt::TextFormat QTextDocument::textFormat() const
+{
+ return txtFormat;
+}
+
+bool QTextDocument::inSelection( int selId, const QPoint &pos ) const
+{
+ QMap<int, QTextDocumentSelection>::ConstIterator it = selections.find( selId );
+ if ( it == selections.end() )
+ return FALSE;
+
+ QTextDocumentSelection sel = *it;
+ QTextParag *startParag = sel.startCursor.parag();
+ QTextParag *endParag = sel.endCursor.parag();
+ if ( sel.startCursor.parag() == sel.endCursor.parag() &&
+ sel.startCursor.parag()->selectionStart( selId ) == sel.endCursor.parag()->selectionEnd( selId ) )
+ return FALSE;
+ if ( sel.endCursor.parag()->paragId() < sel.startCursor.parag()->paragId() ) {
+ endParag = sel.startCursor.parag();
+ startParag = sel.endCursor.parag();
+ }
+
+ QTextParag *p = startParag;
+ while ( p ) {
+ if ( p->rect().contains( pos ) ) {
+ bool inSel = FALSE;
+ int selStart = p->selectionStart( selId );
+ int selEnd = p->selectionEnd( selId );
+ int y = 0;
+ int h = 0;
+ for ( int i = 0; i < p->length(); ++i ) {
+ if ( i == selStart )
+ inSel = TRUE;
+ if ( i == selEnd )
+ break;
+ if ( p->at( i )->lineStart ) {
+ y = (*p->lineStarts.find( i ))->y;
+ h = (*p->lineStarts.find( i ))->h;
+ }
+ if ( pos.y() - p->rect().y() >= y && pos.y() - p->rect().y() <= y + h ) {
+ if ( inSel && pos.x() >= p->at( i )->x &&
+ pos.x() <= p->at( i )->x + p->at( i )->format()->width( p->at( i )->c ) )
+ return TRUE;
+ }
+ }
+ }
+ if ( pos.y() < p->rect().y() )
+ break;
+ if ( p == endParag )
+ break;
+ p = p->next();
+ }
+
+ return FALSE;
+}
+
+void QTextDocument::doLayout( QPainter *p, int w )
+{
+ withoutDoubleBuffer = ( p != 0 );
+ flow_->setWidth( w );
+ cw = w;
+ vw = w;
+ if ( !par && is_printer( p ) )
+ fCollection->setPainter( p );
+ QTextParag *parag = fParag;
+ while ( parag ) {
+ parag->invalidate( 0 );
+ if ( is_printer( p ) )
+ parag->setPainter( p );
+ parag->format();
+ parag = parag->next();
+ }
+ if ( !par && is_printer( p ) ) {
+ fCollection->setPainter( 0 );
+ parag = fParag;
+ while ( parag ) {
+ parag->setPainter( 0 );
+ parag = parag->next();
+ }
+ }
+}
+
+QPixmap *QTextDocument::bufferPixmap( const QSize &s )
+{
+ if ( !buf_pixmap ) {
+ buf_pixmap = new QPixmap( s );
+ } else {
+ if ( buf_pixmap->width() < s.width() ||
+ buf_pixmap->height() < s.height() ) {
+ buf_pixmap->resize( QMAX( s.width(), buf_pixmap->width() ),
+ QMAX( s.height(), buf_pixmap->height() ) );
+ }
+ }
+
+ return buf_pixmap;
+}
+
+void QTextDocument::draw( QPainter *p, const QRegion &reg, const QColorGroup &cg, const QBrush *paper )
+{
+ if ( !firstParag() )
+ return;
+
+ if ( paper ) {
+//QT2HACK
+// p->setBrushOrigin( -(int)p->translationX(),
+// -(int)p->translationY() );
+ p->setBrushOrigin( -(int)p->worldMatrix().dx(),
+ -(int)p->worldMatrix().dy() );
+ p->fillRect( reg.boundingRect(), *paper );
+ }
+
+ QTextParag *parag = firstParag();
+ QRect cr;
+ if ( !reg.isNull() )
+ cr = reg.boundingRect();
+ while ( parag ) {
+ if ( !parag->isValid() )
+ parag->format();
+ int y = parag->rect().y();
+ QRect pr( parag->rect() );
+ pr.setX( 0 );
+ pr.setWidth( QWIDGETSIZE_MAX );
+ if ( !reg.isNull() && !cr.isNull() && !cr.intersects( pr ) ) {
+ parag = parag->next();
+ continue;
+ }
+ p->translate( 0, y );
+ parag->paint( *p, cg, 0, FALSE );
+ p->translate( 0, -y );
+ parag = parag->next();
+ }
+}
+
+void QTextDocument::drawParag( QPainter *p, QTextParag *parag, int cx, int cy, int cw, int ch,
+ QPixmap *&doubleBuffer, const QColorGroup &cg,
+ bool drawCursor, QTextCursor *cursor, bool resetChanged )
+{
+ QPainter *painter = 0;
+ if ( resetChanged )
+ parag->setChanged( FALSE );
+ QRect ir( parag->rect() );
+ bool useDoubleBuffer = !parag->document()->parent();
+ if ( !useDoubleBuffer && parag->document()->nextDoubleBuffered )
+ useDoubleBuffer = TRUE;
+ if ( p->device()->devType() == QInternal::Printer )
+ useDoubleBuffer = FALSE;
+
+ if ( useDoubleBuffer ) {
+ painter = new QPainter;
+ if ( cx >= 0 && cy >= 0 )
+ ir = ir.intersect( QRect( cx, cy, cw, ch ) );
+ if ( !doubleBuffer ||
+ ir.width() > doubleBuffer->width() ||
+ ir.height() > doubleBuffer->height() ) {
+ doubleBuffer = bufferPixmap( ir.size() );
+ painter->begin( doubleBuffer );
+ } else {
+ painter->begin( doubleBuffer );
+ }
+ } else {
+ painter = p;
+ painter->translate( ir.x(), ir.y() );
+ }
+
+ painter->setBrushOrigin( -ir.x(), -ir.y() );
+
+ if ( useDoubleBuffer ) {
+ painter->fillRect( QRect( 0, 0, ir.width(), ir.height() ),
+ cg.brush( QColorGroup::Base ) );
+ } else {
+ if ( cursor && cursor->parag() == parag ) {
+ painter->fillRect( QRect( parag->at( cursor->index() )->x, 0, 2, ir.height() ),
+ cg.brush( QColorGroup::Base ) );
+ }
+ }
+
+ painter->translate( -( ir.x() - parag->rect().x() ),
+ -( ir.y() - parag->rect().y() ) );
+ parag->paint( *painter, cg, drawCursor ? cursor : 0, TRUE, cx, cy, cw, ch );
+ if ( !flow()->isEmpty() ) {
+ painter->translate( 0, -parag->rect().y() );
+ QRect cr( cx, cy, cw, ch );
+ cr = cr.intersect( QRect( 0, parag->rect().y(), parag->rect().width(), parag->rect().height() ) );
+ flow()->drawFloatingItems( painter, cr.x(), cr.y(), cr.width(), cr.height(), cg, FALSE );
+ painter->translate( 0, +parag->rect().y() );
+ }
+
+ if ( useDoubleBuffer ) {
+ delete painter;
+ painter = 0;
+ p->drawPixmap( ir.topLeft(), *doubleBuffer, QRect( QPoint( 0, 0 ), ir.size() ) );
+ } else {
+ painter->translate( -ir.x(), -ir.y() );
+ }
+
+ if ( parag->rect().x() + parag->rect().width() < parag->document()->x() + parag->document()->width() ) {
+ p->fillRect( parag->rect().x() + parag->rect().width(), parag->rect().y(),
+ ( parag->document()->x() + parag->document()->width() ) -
+ ( parag->rect().x() + parag->rect().width() ),
+ parag->rect().height(), cg.brush( QColorGroup::Base ) );
+ }
+
+ if ( verticalBreak() && parag->lastInFrame && parag->document()->flow() )
+ parag->document()->flow()->eraseAfter( parag, p, cg );
+
+ parag->document()->nextDoubleBuffered = FALSE;
+}
+
+QTextParag *QTextDocument::draw( QPainter *p, int cx, int cy, int cw, int ch, const QColorGroup &cg,
+ bool onlyChanged, bool drawCursor, QTextCursor *cursor, bool resetChanged )
+{
+ if ( withoutDoubleBuffer || par && par->withoutDoubleBuffer ) {
+ withoutDoubleBuffer = TRUE;
+ QRegion rg;
+ draw( p, rg, cg );
+ return 0;
+ }
+ withoutDoubleBuffer = FALSE;
+
+ if ( !firstParag() )
+ return 0;
+
+ if ( drawCursor && cursor )
+ tmpCursor = cursor;
+ if ( cx < 0 && cy < 0 ) {
+ cx = 0;
+ cy = 0;
+ cw = width();
+ ch = height();
+ }
+
+ QTextParag *lastFormatted = 0;
+ QTextParag *parag = firstParag();
+
+ QPixmap *doubleBuffer = 0;
+ QPainter painter;
+
+ while ( parag ) {
+ lastFormatted = parag;
+ if ( !parag->isValid() )
+ parag->format();
+
+ if ( !parag->rect().intersects( QRect( cx, cy, cw, ch ) ) ) {
+ QRect pr( parag->rect() );
+ pr.setWidth( parag->document()->width() );
+ if ( pr.intersects( QRect( cx, cy, cw, ch ) ) )
+ p->fillRect( pr.intersect( QRect( cx, cy, cw, ch ) ), cg.brush( QColorGroup::Base ) );
+ if ( parag->rect().y() > cy + ch ) {
+ tmpCursor = 0;
+ if ( buf_pixmap && buf_pixmap->height() > 300 ) {
+ delete buf_pixmap;
+ buf_pixmap = 0;
+ }
+ if ( verticalBreak() && flow() )
+ flow()->draw( p, cx, cy, cw, ch );
+
+ return lastFormatted;
+ }
+ parag = parag->next();
+ continue;
+ }
+
+ if ( !parag->hasChanged() && onlyChanged ) {
+ parag = parag->next();
+ continue;
+ }
+
+ drawParag( p, parag, cx, cy, cw, ch, doubleBuffer, cg, drawCursor, cursor, resetChanged );
+ parag = parag->next();
+ }
+
+ parag = lastParag();
+ if ( parag->rect().y() + parag->rect().height() < parag->document()->height() ) {
+ p->fillRect( 0, parag->rect().y() + parag->rect().height(), parag->document()->width(),
+ parag->document()->height() - ( parag->rect().y() + parag->rect().height() ),
+ cg.brush( QColorGroup::Base ) );
+ if ( !flow()->isEmpty() ) {
+ QRect cr( cx, cy, cw, ch );
+ cr = cr.intersect( QRect( 0, parag->rect().y() + parag->rect().height(), parag->document()->width(),
+ parag->document()->height() - ( parag->rect().y() + parag->rect().height() ) ) );
+ flow()->drawFloatingItems( p, cr.x(), cr.y(), cr.width(), cr.height(), cg, FALSE );
+ }
+ }
+
+ if ( buf_pixmap && buf_pixmap->height() > 300 ) {
+ delete buf_pixmap;
+ buf_pixmap = 0;
+ }
+
+ if ( verticalBreak() && flow() )
+ flow()->draw( p, cx, cy, cw, ch );
+
+ tmpCursor = 0;
+ return lastFormatted;
+}
+
+void QTextDocument::setDefaultFont( const QFont &f )
+{
+ updateFontSizes( f.pointSize() );
+}
+
+void QTextDocument::registerCustomItem( QTextCustomItem *i, QTextParag *p )
+{
+ if ( i && i->placement() != QTextCustomItem::PlaceInline ) {
+ flow_->registerFloatingItem( i, i->placement() == QTextCustomItem::PlaceRight );
+ p->registerFloatingItem( i );
+ }
+ i->setParagraph( p );
+ customItems.append( i );
+}
+
+void QTextDocument::unregisterCustomItem( QTextCustomItem *i, QTextParag *p )
+{
+ flow_->unregisterFloatingItem( i );
+ p->unregisterFloatingItem( i );
+ customItems.removeRef( i );
+ i->setParagraph( 0L );
+}
+
+bool QTextDocument::focusNextPrevChild( bool next )
+{
+ if ( !focusIndicator.parag ) {
+ if ( next ) {
+ focusIndicator.parag = fParag;
+ focusIndicator.start = 0;
+ focusIndicator.len = 0;
+ } else {
+ focusIndicator.parag = lParag;
+ focusIndicator.start = lParag->length();
+ focusIndicator.len = 0;
+ }
+ } else {
+ focusIndicator.parag->setChanged( TRUE );
+ }
+ focusIndicator.href = QString::null;
+
+ if ( next ) {
+ QTextParag *p = focusIndicator.parag;
+ int index = focusIndicator.start + focusIndicator.len;
+ while ( p ) {
+ for ( int i = index; i < p->length(); ++i ) {
+ if ( p->at( i )->format()->isAnchor() ) {
+ p->setChanged( TRUE );
+ focusIndicator.parag = p;
+ focusIndicator.start = i;
+ focusIndicator.len = 0;
+ focusIndicator.href = p->at( i )->format()->anchorHref();
+ while ( i < p->length() ) {
+ if ( !p->at( i )->format()->isAnchor() )
+ return TRUE;
+ focusIndicator.len++;
+ i++;
+ }
+ }
+ }
+ index = 0;
+ p = p->next();
+ }
+ } else {
+ QTextParag *p = focusIndicator.parag;
+ int index = focusIndicator.start - 1;
+ while ( p ) {
+ for ( int i = index; i >= 0; --i ) {
+ if ( p->at( i )->format()->isAnchor() ) {
+ p->setChanged( TRUE );
+ focusIndicator.parag = p;
+ focusIndicator.start = i;
+ focusIndicator.len = 0;
+ focusIndicator.href = p->at( i )->format()->anchorHref();
+ while ( i >= -1 ) {
+ if ( i < 0 || !p->at( i )->format()->isAnchor() ) {
+ focusIndicator.start++;
+ return TRUE;
+ }
+ if ( i < 0 )
+ break;
+ focusIndicator.len++;
+ focusIndicator.start--;
+ i--;
+ }
+ }
+ }
+ p = p->prev();
+ if ( p )
+ index = p->length() - 1;
+ }
+ }
+
+ return FALSE;
+}
+
+int QTextDocument::length() const
+{
+ int l = 0;
+ QTextParag *p = fParag;
+ while ( p ) {
+ l += p->length();
+ p = p->next();
+ }
+ return l;
+}
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+int QTextFormat::width( const QChar &c ) const
+{
+ if ( c.unicode() == 0xad ) // soft hyphen
+ return 0;
+ if ( !painter || !painter->isActive() ) {
+ if ( c == '\t' )
+ return fm.width( 'x' ) * 8;
+ if ( ha == AlignNormal ) {
+ int w;
+ if ( c.row() )
+ w = fm.width( c );
+ else
+ w = widths[ c.unicode() ];
+ if ( w == 0 && !c.row() ) {
+ w = fm.width( c );
+ ( (QTextFormat*)this )->widths[ c.unicode() ] = w;
+ }
+ return w;
+ } else {
+ QFont f( fn );
+ f.setPointSize( ( f.pointSize() * 2 ) / 3 );
+ QFontMetrics fm_( f );
+ return fm_.width( c );
+ }
+ }
+
+ QFont f( fn );
+ if ( ha != AlignNormal )
+ f.setPointSize( ( f.pointSize() * 2 ) / 3 );
+ painter->setFont( f );
+
+ return painter->fontMetrics().width( c );
+}
+
+int QTextFormat::width( const QString &str, int pos ) const
+{
+ int w;
+ if ( str[ pos ].unicode() == 0xad )
+ return 0;
+ if ( !painter || !painter->isActive() ) {
+ if ( ha == AlignNormal ) {
+// w = fm.charWidth( str, pos );
+ w = fm.width( str[pos] );
+ } else {
+ QFont f( fn );
+ f.setPointSize( ( f.pointSize() * 2 ) / 3 );
+ QFontMetrics fm_( f );
+ w = fm_.width( str[pos] );
+// w = fm_.charWidth( str, pos );
+ }
+ } else {
+ QFont f( fn );
+ if ( ha != AlignNormal )
+ f.setPointSize( ( f.pointSize() * 2 ) / 3 );
+ painter->setFont( f );
+ w = painter->fontMetrics().width( str[pos] );
+// w = painter->fontMetrics().charWidth( str, pos );
+ }
+ return w;
+}
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+QTextString::QTextString()
+{
+ textChanged = FALSE;
+ bidi = FALSE;
+ rightToLeft = FALSE;
+}
+
+QTextString::QTextString( const QTextString &s )
+{
+ textChanged = s.textChanged;
+ bidi = s.bidi;
+ rightToLeft = s.rightToLeft;
+ data = s.subString();
+}
+
+void QTextString::insert( int index, const QString &s, QTextFormat *f )
+{
+ int os = data.size();
+ data.resize( data.size() + s.length() );
+ if ( index < os ) {
+ memmove( data.data() + index + s.length(), data.data() + index,
+ sizeof( QTextStringChar ) * ( os - index ) );
+ }
+ for ( int i = 0; i < (int)s.length(); ++i ) {
+ data[ (int)index + i ].x = 0;
+ data[ (int)index + i ].lineStart = 0;
+ data[ (int)index + i ].d.format = 0;
+ data[ (int)index + i ].type = QTextStringChar::Regular;
+ data[ (int)index + i ].rightToLeft = 0;
+ data[ (int)index + i ].startOfRun = 0;
+#if defined(Q_WS_X11)
+ //### workaround for broken courier fonts on X11
+ if ( s[ i ] == QChar( 0x00a0U ) )
+ data[ (int)index + i ].c = ' ';
+ else
+ data[ (int)index + i ].c = s[ i ];
+#else
+ data[ (int)index + i ].c = s[ i ];
+#endif
+#ifdef DEBUG_COLLECTION
+ qDebug("QTextString::insert setting format %p to character %d",f,(int)index+i);
+#endif
+ data[ (int)index + i ].setFormat( f );
+ }
+ textChanged = TRUE;
+}
+
+QTextString::~QTextString()
+{
+ clear();
+}
+
+void QTextString::insert( int index, QTextStringChar *c )
+{
+ int os = data.size();
+ data.resize( data.size() + 1 );
+ if ( index < os ) {
+ memmove( data.data() + index + 1, data.data() + index,
+ sizeof( QTextStringChar ) * ( os - index ) );
+ }
+ data[ (int)index ].c = c->c;
+ data[ (int)index ].x = 0;
+ data[ (int)index ].lineStart = 0;
+ data[ (int)index ].rightToLeft = 0;
+ data[ (int)index ].d.format = 0;
+ data[ (int)index ].type = QTextStringChar::Regular;
+ data[ (int)index ].setFormat( c->format() );
+ textChanged = TRUE;
+}
+
+void QTextString::truncate( int index )
+{
+ index = QMAX( index, 0 );
+ index = QMIN( index, (int)data.size() - 1 );
+ if ( index < (int)data.size() ) {
+ for ( int i = index + 1; i < (int)data.size(); ++i ) {
+ if ( data[ i ].isCustom() ) {
+ delete data[ i ].customItem();
+ if ( data[ i ].d.custom->format )
+ data[ i ].d.custom->format->removeRef();
+ data[ i ].d.custom = 0;
+ } else if ( data[ i ].format() ) {
+ data[ i ].format()->removeRef();
+ }
+ }
+ }
+ data.truncate( index );
+ textChanged = TRUE;
+}
+
+void QTextString::remove( int index, int len )
+{
+ for ( int i = index; i < (int)data.size() && i - index < len; ++i ) {
+ if ( data[ i ].isCustom() ) {
+ delete data[ i ].customItem();
+ if ( data[ i ].d.custom->format )
+ data[ i ].d.custom->format->removeRef();
+ data[ i ].d.custom = 0;
+ } else if ( data[ i ].format() ) {
+ data[ i ].format()->removeRef();
+ }
+ }
+ memmove( data.data() + index, data.data() + index + len,
+ sizeof( QTextStringChar ) * ( data.size() - index - len ) );
+ data.resize( data.size() - len );
+ textChanged = TRUE;
+}
+
+void QTextString::clear()
+{
+ for ( int i = 0; i < (int)data.count(); ++i ) {
+ if ( data[ i ].isCustom() ) {
+ delete data[ i ].customItem();
+ if ( data[ i ].d.custom->format )
+ data[ i ].d.custom->format->removeRef();
+ delete data[ i ].d.custom;
+ data[ i ].d.custom = 0;
+ } else if ( data[ i ].format() ) {
+ data[ i ].format()->removeRef();
+ }
+ }
+ data.resize( 0 );
+}
+
+void QTextString::setFormat( int index, QTextFormat *f, bool useCollection )
+{
+// qDebug("QTextString::setFormat index=%d f=%p",index,f);
+ if ( useCollection && data[ index ].format() )
+ {
+ //qDebug("QTextString::setFormat removing ref on old format %p",data[ index ].format());
+ data[ index ].format()->removeRef();
+ }
+ data[ index ].setFormat( f );
+}
+
+void QTextString::checkBidi() const
+{
+ int len = data.size();
+ const QTextStringChar *c = data.data();
+ ((QTextString *)this)->bidi = FALSE;
+ ((QTextString *)this)->rightToLeft = FALSE;
+ while( len ) {
+ uchar row = c->c.row();
+ if( (row > 0x04 && row < 0x09) || row > 0xfa ) {
+ ((QTextString *)this)->bidi = TRUE;
+ basicDirection();
+ return;
+ }
+ len--;
+ ++c;
+ }
+}
+
+void QTextString::basicDirection() const
+{
+ int pos = 0;
+ ((QTextString *)this)->rightToLeft = FALSE;
+ while( pos < length() ) {
+ switch( at(pos).c.direction() )
+ {
+ case QChar::DirL:
+ case QChar::DirLRO:
+ case QChar::DirLRE:
+ return;
+ case QChar::DirR:
+ case QChar::DirAL:
+ case QChar::DirRLO:
+ case QChar::DirRLE:
+ ((QTextString *)this)->rightToLeft = TRUE;
+ return;
+ default:
+ break;
+ }
+ ++pos;
+ }
+ return;
+}
+
+
+void QTextDocument::setStyleSheet( QStyleSheet *s )
+{
+ if ( !s )
+ return;
+ sheet_ = s;
+ fCollection->setStyleSheet( s );
+ updateStyles();
+}
+
+void QTextDocument::updateStyles()
+{
+ invalidate();
+ fCollection->updateStyles();
+ for ( QTextDocument *d = childList.first(); d; d = childList.next() )
+ d->updateStyles();
+}
+
+void QTextDocument::updateFontSizes( int base )
+{
+ for ( QTextDocument *d = childList.first(); d; d = childList.next() )
+ d->updateFontSizes( base );
+ invalidate();
+ fCollection->updateFontSizes( base );
+}
+
+void QTextDocument::updateFontAttributes( const QFont &f, const QFont &old )
+{
+ for ( QTextDocument *d = childList.first(); d; d = childList.next() )
+ d->updateFontAttributes( f, old );
+ invalidate();
+ fCollection->updateFontAttributes( f, old );
+}
+
+void QTextStringChar::setFormat( QTextFormat *f )
+{
+ if ( type == Regular ) {
+ d.format = f;
+ } else {
+ if ( !d.custom ) {
+ d.custom = new CustomData;
+ d.custom->custom = 0;
+ }
+ d.custom->format = f;
+ }
+}
+
+void QTextStringChar::setCustomItem( QTextCustomItem *i )
+{
+ if ( !isCustom() ) {
+ QTextFormat *f = format();
+ d.custom = new CustomData;
+ d.custom->format = f;
+ type = Custom;
+ } else {
+ delete d.custom->custom;
+ }
+ d.custom->custom = i;
+}
+
+void QTextStringChar::loseCustomItem() // setRegular() might be a better name
+{
+ if ( isCustom() ) {
+ QTextFormat *f = d.custom->format;
+ d.custom->custom = 0;
+ delete d.custom;
+ type = Regular;
+ d.format = f;
+ }
+}
+
+int QTextString::width(int idx) const
+{
+ int w = 0;
+ QTextStringChar *c = &at( idx );
+ if ( c->c.unicode() == 0xad )
+ return 0;
+ if( c->isCustom() ) {
+ if( c->customItem()->placement() == QTextCustomItem::PlaceInline )
+ w = c->customItem()->width;
+ } else if ( c->type == QTextStringChar::Mark ) {
+ return 0;
+ } else {
+ int r = c->c.row();
+ if( r < 0x06 || r > 0x1f )
+ w = c->format()->width( c->c );
+ else {
+ // complex text. We need some hacks to get the right metric here
+ QString str;
+ int pos = 0;
+ if( idx > 3 )
+ pos = idx - 3;
+ int off = idx - pos;
+ int end = QMIN( length(), idx + 3 );
+ while ( pos < end ) {
+ str += at(pos).c;
+ pos++;
+ }
+ w = c->format()->width( str, off );
+ }
+ }
+ return w;
+}
+
+QMemArray<QTextStringChar> QTextString::subString( int start, int len ) const
+{
+ if ( len == 0xFFFFFF )
+ len = data.size();
+ QMemArray<QTextStringChar> a;
+ a.resize( len );
+ for ( int i = 0; i < len; ++i ) {
+ QTextStringChar *c = &data[ i + start ];
+ a[ i ].c = c->c;
+ a[ i ].x = 0;
+ a[ i ].lineStart = 0;
+ a[ i ].rightToLeft = 0;
+ a[ i ].d.format = 0;
+ a[ i ].type = QTextStringChar::Regular;
+ a[ i ].setFormat( c->format() );
+ if ( c->format() )
+ c->format()->addRef();
+ }
+ return a;
+}
+
+QTextStringChar *QTextStringChar::clone() const
+{
+ QTextStringChar *chr = new QTextStringChar;
+ chr->c = c;
+ chr->x = 0;
+ chr->lineStart = 0;
+ chr->rightToLeft = 0;
+ chr->d.format = 0;
+ chr->type = QTextStringChar::Regular;
+ chr->setFormat( format() );
+ if ( chr->format() )
+ chr->format()->addRef();
+ return chr;
+}
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+QTextParag::QTextParag( QTextDocument *d, QTextParag *pr, QTextParag *nx, bool updateIds )
+ : invalid( 0 ), p( pr ), n( nx ), doc( d ), align( -1 ), numSubParag( -1 ),
+ tm( -1 ), bm( -1 ), lm( -1 ), rm( -1 ), flm( -1 ), tc( 0 ),
+ numCustomItems( 0 ), pFormatter( 0 ),
+ tArray( 0 ), tabStopWidth( 0 ), eData( 0 ), pntr( 0 )
+{
+ visible = TRUE;
+ list_val = -1;
+ newLinesAllowed = FALSE;
+ lastInFrame = FALSE;
+ movedDown = FALSE;
+ defFormat = formatCollection()->defaultFormat();
+ if ( !doc ) {
+ tabStopWidth = defFormat->width( 'x' ) * 8;
+ commandHistory = new QTextCommandHistory( 100 );
+ }
+#if defined(PARSER_DEBUG)
+ qDebug( "new QTextParag" );
+#endif
+ fullWidth = TRUE;
+
+ if ( p ) {
+ p->n = this;
+ if ( p->tc )
+ tc = p->tc;
+ }
+ if ( n ) {
+ n->p = this;
+ if ( n->tc )
+ tc = n->tc;
+ }
+
+ if ( !tc && d && d->tableCell() )
+ tc = d->tableCell();
+
+ if ( !p && doc )
+ doc->setFirstParag( this );
+ if ( !n && doc )
+ doc->setLastParag( this );
+
+ changed = FALSE;
+ firstFormat = TRUE;
+ state = -1;
+ needPreProcess = FALSE;
+
+ if ( p )
+ id = p->id + 1;
+ else
+ id = 0;
+ if ( n && updateIds ) {
+ QTextParag *s = n;
+ while ( s ) {
+ s->id = s->p->id + 1;
+ s->numSubParag = -1;
+ s->lm = s->rm = s->tm = s->bm = -1, s->flm = -1;
+ s = s->n;
+ }
+ }
+ firstPProcess = TRUE;
+
+ str = new QTextString();
+ str->insert( 0, " ", formatCollection()->defaultFormat() );
+}
+
+QTextParag::~QTextParag()
+{
+ //qDebug("QTextParag::~QTextParag %p id=%d",this,paragId());
+ delete str;
+ if ( doc && p == doc->minwParag ) {
+ doc->minwParag = 0;
+ doc->minw = 0;
+ }
+ if ( !doc ) {
+ delete pFormatter;
+ delete commandHistory;
+ }
+ if ( tArray )
+ delete [] tArray;
+ delete eData;
+ QMap<int, QTextParagLineStart*>::Iterator it = lineStarts.begin();
+ for ( ; it != lineStarts.end(); ++it )
+ delete *it;
+}
+
+void QTextParag::setNext( QTextParag *s )
+{
+ n = s;
+ if ( !n && doc )
+ doc->setLastParag( this );
+}
+
+void QTextParag::setPrev( QTextParag *s )
+{
+ p = s;
+ if ( !p && doc )
+ doc->setFirstParag( this );
+}
+
+void QTextParag::invalidate( int chr )
+{
+ if ( invalid < 0 )
+ invalid = chr;
+ else
+ invalid = QMIN( invalid, chr );
+ for ( QTextCustomItem *i = floatingItems.first(); i; i = floatingItems.next() )
+ i->move( 0, -1 );
+ lm = rm = bm = tm = flm = -1;
+}
+
+void QTextParag::insert( int index, const QString &s )
+{
+ if ( doc && !doc->useFormatCollection() && doc->preProcessor() )
+ str->insert( index, s,
+ doc->preProcessor()->format( QTextPreProcessor::Standard ) );
+ else
+ str->insert( index, s, formatCollection()->defaultFormat() );
+ invalidate( index );
+ needPreProcess = TRUE;
+}
+
+void QTextParag::truncate( int index )
+{
+ str->truncate( index );
+ insert( length(), " " );
+ needPreProcess = TRUE;
+}
+
+void QTextParag::remove( int index, int len )
+{
+ if ( index + len - str->length() > 0 )
+ return;
+ for ( int i = index; i < len; ++i ) {
+ QTextStringChar *c = at( i );
+ if ( doc && c->isCustom() ) {
+ doc->unregisterCustomItem( c->customItem(), this );
+ removeCustomItem();
+ }
+ }
+ str->remove( index, len );
+ invalidate( 0 );
+ needPreProcess = TRUE;
+}
+
+void QTextParag::join( QTextParag *s )
+{
+ //qDebug("QTextParag::join this=%d (length %d) with %d (length %d)",paragId(),length(),s->paragId(),s->length());
+ int oh = r.height() + s->r.height();
+ n = s->n;
+ if ( n )
+ n->p = this;
+ else if ( doc )
+ doc->setLastParag( this );
+
+ int start = str->length();
+ if ( length() > 0 && at( length() - 1 )->c == ' ' ) {
+ remove( length() - 1, 1 );
+ --start;
+ }
+ append( s->str->toString(), TRUE );
+
+ for ( int i = 0; i < s->length(); ++i ) {
+ if ( !doc || doc->useFormatCollection() ) {
+ s->str->at( i ).format()->addRef();
+ str->setFormat( i + start, s->str->at( i ).format(), TRUE );
+ }
+ if ( s->str->at( i ).isCustom() ) {
+ QTextCustomItem * item = s->str->at( i ).customItem();
+ str->at( i + start ).setCustomItem( item );
+ s->str->at( i ).loseCustomItem();
+ doc->unregisterCustomItem( item, s );
+ doc->registerCustomItem( item, this );
+ }
+ }
+ ASSERT(str->at(str->length()-1).c == ' ');
+
+ if ( !extraData() && s->extraData() ) {
+ setExtraData( s->extraData() );
+ s->setExtraData( 0 );
+ } else if ( extraData() && s->extraData() ) {
+ extraData()->join( s->extraData() );
+ }
+ delete s;
+ invalidate( 0 );
+ r.setHeight( oh );
+ needPreProcess = TRUE;
+ if ( n ) {
+ QTextParag *s = n;
+ while ( s ) {
+ s->id = s->p->id + 1;
+ s->state = -1;
+ s->needPreProcess = TRUE;
+ s->changed = TRUE;
+ s = s->n;
+ }
+ }
+ format();
+ state = -1;
+}
+
+void QTextParag::move( int &dy )
+{
+ //qDebug("QTextParag::move paragId=%d dy=%d",paragId(),dy);
+ if ( dy == 0 )
+ return;
+ changed = TRUE;
+ r.moveBy( 0, dy );
+ for ( QTextCustomItem *i = floatingItems.first(); i; i = floatingItems.next() )
+ i->move( i->x(), i->y() + dy );
+ if ( p )
+ p->lastInFrame = FALSE;
+ movedDown = FALSE;
+ if ( doc && doc->verticalBreak() ) {
+ const int oy = r.y();
+ int y = oy;
+ doc->flow()->adjustFlow( y, r.width(), r.height(), this, TRUE );
+ if ( oy != y ) {
+ if ( p ) {
+ p->lastInFrame = TRUE;
+ p->setChanged( TRUE );
+ }
+ movedDown = TRUE;
+ int oh = r.height();
+ r.setY( y );
+ r.setHeight( oh );
+ dy += y - oy;
+ //qDebug("QTextParag::move done. paragId=%d dy=%d lastInFrame=true",paragId(),dy);
+ }
+ }
+}
+
+void QTextParag::format( int start, bool doMove )
+{
+ if ( str->length() == 0 || !formatter() )
+ return;
+
+ if ( doc &&
+ doc->preProcessor() &&
+ ( needPreProcess || state == -1 ) )
+ doc->preProcessor()->process( doc, this, invalid <= 0 ? 0 : invalid );
+ needPreProcess = FALSE;
+
+ if ( invalid == -1 )
+ return;
+
+ //qDebug("QTextParag::format id=%d invalid, formatting (moving after previous parag)",paragId());
+ r.moveTopLeft( QPoint( documentX(), p ? p->r.y() + p->r.height() : documentY() ) );
+ r.setWidth( documentWidth() );
+ if ( p )
+ p->lastInFrame = FALSE;
+ movedDown = FALSE;
+ formatAgain:
+ if ( doc ) {
+ for ( QTextCustomItem *i = floatingItems.first(); i; i = floatingItems.next() ) {
+ if ( i->placement() == QTextCustomItem::PlaceRight )
+ i->move( r.x() + r.width() - i->width, r.y() );
+ else
+ i->move( 0, r.y() );
+ doc->flow()->updateHeight( i );
+ }
+ }
+ QMap<int, QTextParagLineStart*> oldLineStarts = lineStarts;
+ lineStarts.clear();
+ int y = formatter()->format( doc, this, start, oldLineStarts );
+ r.setWidth( QMAX( r.width(), minimumWidth() ) );
+ QMap<int, QTextParagLineStart*>::Iterator it = oldLineStarts.begin();
+ for ( ; it != oldLineStarts.end(); ++it )
+ delete *it;
+
+ QTextStringChar *c = 0;
+ if ( lineStarts.count() == 1 && ( !doc || doc->flow()->isEmpty() ) && !string()->isBidi() ) {
+ c = &str->at( str->length() - 1 );
+ r.setWidth( c->x + str->width( str->length() - 1 ) );
+ }
+
+ if ( newLinesAllowed ) {
+ it = lineStarts.begin();
+ int usedw = 0;
+ for ( ; it != lineStarts.end(); ++it )
+ usedw = QMAX( usedw, (*it)->w );
+ r.setWidth( QMIN( usedw, r.width() ) );
+ }
+
+ if ( y != r.height() )
+ r.setHeight( y );
+
+ if ( !visible )
+ r.setHeight( 0 );
+
+ if ( doc && doc->verticalBreak() ) {
+ const int oy = r.y();
+ int y = oy;
+ doc->flow()->adjustFlow( y, r.width(), r.height(), this, TRUE );
+ if ( oy != y ) {
+ if ( p ) {
+ p->lastInFrame = TRUE;
+ p->setChanged( TRUE );
+ }
+ movedDown = TRUE;
+ int oh = r.height();
+ r.setY( y );
+ r.setHeight( oh );
+ goto formatAgain;
+ }
+
+ }
+
+ if ( n && doMove && n->invalid == -1 && r.y() + r.height() != n->r.y() ) {
+ int dy = ( r.y() + r.height() ) - n->r.y();
+ QTextParag *s = n;
+ bool makeInvalid = p && p->lastInFrame;
+ //qDebug("moving. previous's lastInFrame (=makeInvalid): %d",makeInvalid);
+ while ( s && dy ) {
+ if ( !s->isFullWidth() || s->movedDown )
+ makeInvalid = TRUE;
+ if ( makeInvalid )
+ s->invalidate( 0 );
+ s->move( dy );
+ if ( s->lastInFrame )
+ makeInvalid = TRUE;
+ s = s->n;
+ }
+ }
+
+ firstFormat = FALSE;
+ changed = TRUE;
+ invalid = -1;
+ string()->setTextChanged( FALSE );
+}
+
+int QTextParag::lineHeightOfChar( int i, int *bl, int *y ) const
+{
+ if ( !isValid() )
+ ( (QTextParag*)this )->format();
+
+ QMap<int, QTextParagLineStart*>::ConstIterator it = lineStarts.end();
+ --it;
+ for ( ;; ) {
+ if ( i >= it.key() ) {
+ if ( bl )
+ *bl = ( *it )->baseLine;
+ if ( y )
+ *y = ( *it )->y;
+ return ( *it )->h;
+ }
+ if ( it == lineStarts.begin() )
+ break;
+ --it;
+ }
+
+// qWarning( "QTextParag::lineHeightOfChar: couldn't find lh for %d", i );
+ return 15;
+}
+
+QTextStringChar *QTextParag::lineStartOfChar( int i, int *index, int *line ) const
+{
+ if ( !isValid() )
+ ( (QTextParag*)this )->format();
+
+ int l = lineStarts.count() - 1;
+ QMap<int, QTextParagLineStart*>::ConstIterator it = lineStarts.end();
+ --it;
+ for ( ;; ) {
+ if ( i >= it.key() ) {
+ if ( index )
+ *index = it.key();
+ if ( line )
+ *line = l;
+ return &str->at( it.key() );
+ }
+ if ( it == lineStarts.begin() )
+ break;
+ --it;
+ --l;
+ }
+
+// qWarning( "QTextParag::lineStartOfChar: couldn't find %d", i );
+ return 0;
+}
+
+int QTextParag::lines() const
+{
+ if ( !isValid() )
+ ( (QTextParag*)this )->format();
+
+ return lineStarts.count();
+}
+
+QTextStringChar *QTextParag::lineStartOfLine( int line, int *index ) const
+{
+ if ( !isValid() )
+ ( (QTextParag*)this )->format();
+
+ if ( line >= 0 && line < (int)lineStarts.count() ) {
+ QMap<int, QTextParagLineStart*>::ConstIterator it = lineStarts.begin();
+ while ( line-- > 0 )
+ ++it;
+ int i = it.key();
+ if ( index )
+ *index = i;
+ return &str->at( i );
+ }
+
+// qWarning( "QTextParag::lineStartOfLine: couldn't find %d", line );
+ return 0;
+}
+
+void QTextParag::setFormat( int index, int len, QTextFormat *f, bool useCollection, int flags )
+{
+ if ( index < 0 )
+ index = 0;
+ if ( index > str->length() - 1 )
+ index = str->length() - 1;
+ if ( index + len >= str->length() )
+ len = str->length() - index;
+
+ QTextFormatCollection *fc = 0;
+ if ( useCollection )
+ fc = formatCollection();
+ QTextFormat *of;
+ for ( int i = 0; i < len; ++i ) {
+ of = str->at( i + index ).format();
+ if ( !changed && f->key() != of->key() )
+ changed = TRUE;
+ if ( invalid == -1 &&
+ ( f->font().family() != of->font().family() ||
+ f->font().pointSize() != of->font().pointSize() ||
+ f->font().weight() != of->font().weight() ||
+ f->font().italic() != of->font().italic() ||
+ f->vAlign() != of->vAlign() ) ) {
+ invalidate( 0 );
+ }
+ if ( flags == -1 || flags == QTextFormat::Format || !fc ) {
+#ifdef DEBUG_COLLECTION
+ qDebug(" QTextParag::setFormat, will use format(f) %p %s", f, f->key().latin1());
+#endif
+ if ( fc )
+ f = fc->format( f );
+ str->setFormat( i + index, f, useCollection );
+ } else {
+#ifdef DEBUG_COLLECTION
+ qDebug(" QTextParag::setFormat, will use format(of,f,flags) of=%p %s, f=%p %s", of, of->key().latin1(), f, f->key().latin1() );
+#endif
+ QTextFormat *fm = fc->format( of, f, flags );
+#ifdef DEBUG_COLLECTION
+ qDebug(" QTextParag::setFormat, format(of,f,flags) returned %p %s ", fm,fm->key().latin1());
+#endif
+ str->setFormat( i + index, fm, useCollection );
+ }
+ }
+}
+
+void QTextParag::indent( int *oldIndent, int *newIndent )
+{
+ if ( !doc || !doc->indent() || style() && style()->displayMode() != QStyleSheetItem::DisplayBlock ) {
+ if ( oldIndent )
+ *oldIndent = 0;
+ if ( newIndent )
+ *newIndent = 0;
+ if ( oldIndent && newIndent )
+ *newIndent = *oldIndent;
+ return;
+ }
+ doc->indent()->indent( doc, this, oldIndent, newIndent );
+}
+
+void QTextParag::paint( QPainter &painter, const QColorGroup &cg, QTextCursor *cursor, bool drawSelections,
+ int clipx, int clipy, int clipw, int cliph )
+{
+ if ( !visible )
+ return;
+ QTextStringChar *chr = at( 0 );
+ ASSERT( chr );
+ if (!chr) { qDebug("paragraph %p %d, can't paint, EMPTY !", this, paragId()); return; }
+ int i = 0;
+ int h = 0;
+ int baseLine = 0, lastBaseLine = 0;
+ QTextFormat *lastFormat = 0;
+ int lastY = -1;
+ int startX = 0;
+ int bw = 0;
+ int cy = 0;
+ int curx = -1, cury = 0, curh = 0, curline = 0;
+ bool lastDirection = chr->rightToLeft;
+ QTextStringChar::Type lastType = chr->type;
+ int tw = 0;
+
+ QString qstr = str->toString();
+
+ const int nSels = doc ? doc->numSelections() : 1;
+ QMemArray<int> selectionStarts( nSels );
+ QMemArray<int> selectionEnds( nSels );
+ if ( drawSelections ) {
+ bool hasASelection = FALSE;
+ for ( i = 0; i < nSels; ++i ) {
+ if ( !hasSelection( i ) ) {
+ selectionStarts[ i ] = -1;
+ selectionEnds[ i ] = -1;
+ } else {
+ hasASelection = TRUE;
+ selectionStarts[ i ] = selectionStart( i );
+ int end = selectionEnd( i );
+ if ( end == length() - 1 && n && n->hasSelection( i ) )
+ end++;
+ selectionEnds[ i ] = end;
+ }
+ }
+ if ( !hasASelection )
+ drawSelections = FALSE;
+ }
+
+ int line = -1;
+ int cw;
+ bool didListLabel = FALSE;
+ int paintStart = 0;
+ int paintEnd = -1;
+ int lasth = 0;
+ for ( i = 0; i < length(); i++ ) {
+ chr = at( i );
+ if ( !str->isBidi() && is_printer( &painter ) ) { // ### fix our broken ps-printer
+ if ( !chr->lineStart )
+ chr->x = QMAX( chr->x, tw );
+ else
+ tw = 0;
+ }
+ cw = string()->width( i );
+ if ( chr->c == '\t' && i < length() - 1 )
+ cw = at( i + 1 )->x - chr->x + 1;
+ if ( chr->c.unicode() == 0xad && i < length() - 1 )
+ cw = 0;
+
+ // init a new line
+ if ( chr->lineStart ) {
+ tw = 0;
+ ++line;
+ lineInfo( line, cy, h, baseLine );
+ lasth = h;
+ if ( clipy != -1 && cy > clipy - r.y() + cliph ) // outside clip area, leave
+ break;
+ if ( lastBaseLine == 0 )
+ lastBaseLine = baseLine;
+ }
+
+ // draw bullet list items
+ if ( !didListLabel && line == 0 && style() && style()->displayMode() == QStyleSheetItem::DisplayListItem ) {
+ didListLabel = TRUE;
+ drawLabel( &painter, chr->x, cy, 0, 0, baseLine, cg );
+ }
+
+ // check for cursor mark
+ if ( cursor && this == cursor->parag() && i == cursor->index() ) {
+ curx = chr->x;
+ if ( chr->rightToLeft )
+ curx += cw;
+ curh = h;
+ cury = cy;
+ curline = line;
+ }
+
+ // first time - start again...
+ if ( !lastFormat || lastY == -1 ) {
+ lastFormat = chr->format();
+ lastY = cy;
+ startX = chr->x;
+ if ( !chr->isCustom() && chr->c != '\n' )
+ paintEnd = i;
+ bw = cw;
+ if ( !chr->isCustom() )
+ continue;
+ }
+
+ // check if selection state changed
+ bool selectionChange = FALSE;
+ if ( drawSelections ) {
+ for ( int j = 0; j < nSels; ++j ) {
+ selectionChange = selectionStarts[ j ] == i || selectionEnds[ j ] == i;
+ if ( selectionChange )
+ break;
+ }
+ }
+
+ //if something (format, etc.) changed, draw what we have so far
+ if ( ( ( ( alignment() & Qt3::AlignJustify ) == Qt3::AlignJustify && at(paintEnd)->c.isSpace() ) ||
+ lastDirection != (bool)chr->rightToLeft ||
+ chr->startOfRun ||
+ lastY != cy || chr->format() != lastFormat ||
+ ( paintEnd != -1 && at( paintEnd )->c =='\t' ) || chr->c == '\t' ||
+ ( paintEnd != -1 && at( paintEnd )->c.unicode() == 0xad ) || chr->c.unicode() == 0xad ||
+ selectionChange || chr->isCustom() ) ) {
+ if ( paintStart <= paintEnd ) {
+ // ### temporary hack until I get the new placement/shaping stuff working
+ int x = startX;
+ if ( lastType == QTextStringChar::Mark && i > 0 ) {
+ if ( !lastDirection )
+ x += str->at(i - 1).d.mark->xoff;
+ else if ( i > 1 )
+ x -= str->at(i - 1).d.mark->xoff + str->width( i - 2 );
+ }
+ drawParagString( painter, qstr, paintStart, paintEnd - paintStart + 1, x, lastY,
+ lastBaseLine, bw, lasth, drawSelections,
+ lastFormat, i, selectionStarts, selectionEnds, cg, lastDirection );
+ }
+ if ( !str->isBidi() && is_printer( &painter ) ) { // ### fix our broken ps-printer
+ if ( !chr->lineStart ) {
+ // ### the next line doesn't look 100% correct for arabic
+ tw = startX + painter.fontMetrics().width( qstr.mid(paintStart, paintEnd - paintStart +1) );
+ chr->x = QMAX( chr->x, tw );
+ } else {
+ tw = 0;
+ }
+ }
+ if ( !chr->isCustom() ) {
+ if ( chr->c != '\n' ) {
+ paintStart = i;
+ paintEnd = i;
+ } else {
+ paintStart = i+1;
+ paintEnd = -1;
+ }
+ lastFormat = chr->format();
+ lastY = cy;
+ startX = chr->x;
+ bw = cw;
+ } else {
+ if ( chr->customItem()->placement() == QTextCustomItem::PlaceInline ) {
+ chr->customItem()->draw( &painter, chr->x, cy, clipx - r.x(), clipy - r.y(), clipw, cliph, cg,
+ nSels && selectionStarts[ 0 ] <= i && selectionEnds[ 0 ] >= i );
+ paintStart = i+1;
+ paintEnd = -1;
+ lastFormat = chr->format();
+ lastY = cy;
+ startX = chr->x + string()->width( i );
+ bw = 0;
+ } else {
+ chr->customItem()->resize( pntr, chr->customItem()->width );
+ paintStart = i+1;
+ paintEnd = -1;
+ lastFormat = chr->format();
+ lastY = cy;
+ startX = chr->x + string()->width( i );
+ bw = 0;
+ }
+ }
+ } else {
+ if ( chr->c != '\n' ) {
+ if( chr->rightToLeft ) {
+ startX = chr->x;
+ }
+ paintEnd = i;
+ }
+ bw += cw;
+ }
+ lastBaseLine = baseLine;
+ lasth = h;
+ lastDirection = chr->rightToLeft;
+ lastType = chr->type;
+ }
+
+ // if we are through the parag, but still have some stuff left to draw, draw it now
+ if ( paintStart <= paintEnd ) {
+ bool selectionChange = FALSE;
+ if ( drawSelections ) {
+ for ( int j = 0; j < nSels; ++j ) {
+ selectionChange = selectionStarts[ j ] == i || selectionEnds[ j ] == i;
+ if ( selectionChange )
+ break;
+ }
+ }
+ // ### temporary hack until I get the new placement/shaping stuff working
+ int x = startX;
+ if ( lastType == QTextStringChar::Mark && i > 0 ) {
+ if ( !lastDirection )
+ x += str->at(i - 1).d.mark->xoff;
+ else if ( i > 1 )
+ x -= str->at(i - 1).d.mark->xoff + str->width( i - 2 );
+ }
+ drawParagString( painter, qstr, paintStart, paintEnd-paintStart+1, x, lastY,
+ lastBaseLine, bw, h, drawSelections,
+ lastFormat, i, selectionStarts, selectionEnds, cg, lastDirection );
+ }
+
+ // if we should draw a cursor, draw it now
+ if ( curx != -1 && cursor ) {
+ painter.fillRect( QRect( curx, cury, 1, curh - lineSpacing( curline ) ), cg.color( QColorGroup::Text ) );
+ painter.save();
+ if ( string()->isBidi() ) {
+ const int d = 4;
+ if ( at( cursor->index() )->rightToLeft ) {
+ painter.setPen( Qt::black );
+ painter.drawLine( curx, cury, curx - d / 2, cury + d / 2 );
+ painter.drawLine( curx, cury + d, curx - d / 2, cury + d / 2 );
+ } else {
+ painter.setPen( Qt::black );
+ painter.drawLine( curx, cury, curx + d / 2, cury + d / 2 );
+ painter.drawLine( curx, cury + d, curx + d / 2, cury + d / 2 );
+ }
+ }
+ painter.restore();
+ }
+}
+
+void QTextParag::drawParagString( QPainter &painter, const QString &s, int start, int len, int startX,
+ int lastY, int baseLine, int bw, int h, bool drawSelections,
+ QTextFormat *lastFormat, int i, const QMemArray<int> &selectionStarts,
+ const QMemArray<int> &selectionEnds, const QColorGroup &cg, bool /*rightToLeft*/ )
+{
+ if ( start + len == length() )
+ len--;
+ QString str( s );
+ if ( str[ (int)str.length() - 1 ].unicode() == 0xad )
+ str.remove( str.length() - 1, 1 );
+ painter.setPen( QPen( lastFormat->color() ) );
+ painter.setFont( lastFormat->font() );
+
+ if ( doc && lastFormat->isAnchor() && !lastFormat->anchorHref().isEmpty() && lastFormat->useLinkColor() ) {
+ painter.setPen( QPen( Qt::blue /* cg.link() */ ) ); // QT2HACK
+ if ( doc->underlineLinks() ) {
+ QFont fn = lastFormat->font();
+ fn.setUnderline( TRUE );
+ painter.setFont( fn );
+ }
+ }
+
+ if ( drawSelections ) {
+ const int nSels = doc ? doc->numSelections() : 1;
+ const int startSel = painter.device()->devType() != QInternal::Printer ? 0 : 1;
+ for ( int j = startSel; j < nSels; ++j ) {
+ if ( i > selectionStarts[ j ] && i <= selectionEnds[ j ] ) {
+ if ( !doc || doc->invertSelectionText( j ) )
+ painter.setPen( QPen( cg.color( QColorGroup::HighlightedText ) ) );
+ if ( j == QTextDocument::Standard )
+ painter.fillRect( startX, lastY, bw, h, cg.color( QColorGroup::Highlight ) );
+ else
+ painter.fillRect( startX, lastY, bw, h, doc ? doc->selectionColor( j ) : cg.color( QColorGroup::Highlight ) );
+ }
+ }
+ }
+ //QT2HACK
+ //QPainter::TextDirection dir = QPainter::LTR;
+ //if ( rightToLeft )
+ //dir = QPainter::RTL;
+ if ( str[start] != '\t' && str[ start ].unicode() != 0xad ) {
+ if ( lastFormat->vAlign() == QTextFormat::AlignNormal ) {
+ //QT2HACK painter.drawText( startX, lastY + baseLine, str, start, len, dir );
+ painter.drawText( startX, lastY + baseLine, str.mid(start), len );
+ } else if ( lastFormat->vAlign() == QTextFormat::AlignSuperScript ) {
+ QFont f( painter.font() );
+ f.setPointSize( ( f.pointSize() * 2 ) / 3 );
+ painter.setFont( f );
+ //QT2HACK painter.drawText( startX, lastY + baseLine - ( h - painter.fontMetrics().height() ), str, start, len, dir );
+ painter.drawText( startX, lastY + baseLine - ( h - painter.fontMetrics().height() ), str.mid(start), len );
+ } else if ( lastFormat->vAlign() == QTextFormat::AlignSubScript ) {
+ QFont f( painter.font() );
+ f.setPointSize( ( f.pointSize() * 2 ) / 3 );
+ painter.setFont( f );
+ //QT2HACK painter.drawText( startX, lastY + baseLine, str, start, len, dir );
+ painter.drawText( startX, lastY + baseLine, str.mid(start), len );
+ }
+ }
+ if ( i + 1 < length() && at( i + 1 )->lineStart && at( i )->c.unicode() == 0xad ) {
+ painter.drawText( startX + bw, lastY + baseLine, "\xad" );
+ }
+ if ( lastFormat->isMisspelled() ) {
+ painter.save();
+ painter.setPen( QPen( Qt::red, 1, Qt::DotLine ) );
+ painter.drawLine( startX, lastY + baseLine + 1, startX + bw, lastY + baseLine + 1 );
+ painter.restore();
+ }
+
+ i -= len;
+ if ( doc && lastFormat->isAnchor() && !lastFormat->anchorHref().isEmpty() &&
+ doc->focusIndicator.parag == this &&
+ doc->focusIndicator.start >= i &&
+ doc->focusIndicator.start + doc->focusIndicator.len <= i + len ) {
+ painter.drawWinFocusRect( QRect( startX, lastY, bw, h ) );
+ }
+
+}
+
+void QTextParag::drawLabel( QPainter* p, int x, int y, int w, int h, int base, const QColorGroup& cg )
+{
+ if ( !style() )
+ return;
+ QRect r ( x, y, w, h );
+ QStyleSheetItem::ListStyle s = listStyle();
+
+ QFont font = p->font();
+ p->setFont( defFormat->font() );
+ QFontMetrics fm( p->fontMetrics() );
+ int size = fm.lineSpacing() / 3;
+
+ switch ( s ) {
+ case QStyleSheetItem::ListDecimal:
+ case QStyleSheetItem::ListLowerAlpha:
+ case QStyleSheetItem::ListUpperAlpha:
+ {
+ int n = numberOfSubParagraph();
+ QString l;
+ switch ( s ) {
+ case QStyleSheetItem::ListLowerAlpha:
+ if ( n < 27 ) {
+ l = QChar( ('a' + (char) (n-1)));
+ break;
+ }
+ case QStyleSheetItem::ListUpperAlpha:
+ if ( n < 27 ) {
+ l = QChar( ('A' + (char) (n-1)));
+ break;
+ }
+ break;
+ default: //QStyleSheetItem::ListDecimal:
+ l.setNum( n );
+ break;
+ }
+ l += QString::fromLatin1(". ");
+ p->drawText( r.right() - fm.width( l ), r.top() + base, l );
+ }
+ break;
+ case QStyleSheetItem::ListSquare:
+ {
+ QRect er( r.right() - size * 2, r.top() + base - fm.boundingRect( 'A' ).height() / 2 - size / 2 - 1, size, size );
+ p->fillRect( er , cg.brush( QColorGroup::Foreground ) );
+ }
+ break;
+ case QStyleSheetItem::ListCircle:
+ {
+ QRect er( r.right()-size*2, r.top() + base - fm.boundingRect('A').height()/2 - size/2 - 1, size, size);
+ p->drawEllipse( er );
+ }
+ break;
+ case QStyleSheetItem::ListDisc:
+ default:
+ {
+ p->setBrush( cg.brush( QColorGroup::Foreground ));
+ QRect er( r.right()-size*2, r.top() + base - fm.boundingRect('A').height()/2 - size/2 - 1, size, size);
+ p->drawEllipse( er );
+ p->setBrush( Qt::NoBrush );
+ }
+ break;
+ }
+
+ p->setFont( font );
+}
+
+void QTextParag::setStyleSheetItems( const QPtrVector<QStyleSheetItem> &vec )
+{
+ styleSheetItemsVec = vec;
+ invalidate( 0 );
+ lm = rm = tm = bm = flm = -1;
+ numSubParag = -1;
+}
+
+void QTextParag::setList( bool b, int listStyle )
+{
+ if ( !doc )
+ return;
+
+ if ( !style() ) {
+ styleSheetItemsVec.resize( 2 );
+ styleSheetItemsVec.insert( 0, doc->styleSheet()->item( "html" ) );
+ styleSheetItemsVec.insert( 1, doc->styleSheet()->item( "p" ) );
+ }
+
+ if ( b ) {
+ if ( style()->displayMode() != QStyleSheetItem::DisplayListItem || this->listStyle() != listStyle ) {
+ styleSheetItemsVec.remove( styleSheetItemsVec.size() - 1 );
+ QStyleSheetItem *item = styleSheetItemsVec[ styleSheetItemsVec.size() - 2 ];
+ if ( item )
+ styleSheetItemsVec.remove( styleSheetItemsVec.size() - 2 );
+ styleSheetItemsVec.insert( styleSheetItemsVec.size() - 2,
+ listStyle == QStyleSheetItem::ListDisc || listStyle == QStyleSheetItem::ListCircle
+ || listStyle == QStyleSheetItem::ListSquare ?
+ doc->styleSheet()->item( "ul" ) : doc->styleSheet()->item( "ol" ) );
+ styleSheetItemsVec.insert( styleSheetItemsVec.size() - 1, doc->styleSheet()->item( "li" ) );
+ setListStyle( (QStyleSheetItem::ListStyle)listStyle );
+ } else {
+ return;
+ }
+ } else {
+ if ( style()->displayMode() != QStyleSheetItem::DisplayBlock ) {
+ styleSheetItemsVec.remove( styleSheetItemsVec.size() - 1 );
+ if ( styleSheetItemsVec.size() >= 2 ) {
+ styleSheetItemsVec.remove( styleSheetItemsVec.size() - 2 );
+ styleSheetItemsVec.resize( styleSheetItemsVec.size() - 2 );
+ } else {
+ styleSheetItemsVec.resize( styleSheetItemsVec.size() - 1 );
+ }
+ } else {
+ return;
+ }
+ }
+ invalidate( 0 );
+ lm = rm = tm = bm = flm = -1;
+ numSubParag = -1;
+ if ( next() ) {
+ QTextParag *s = next();
+ while ( s ) {
+ s->numSubParag = -1;
+ s->lm = s->rm = s->tm = s->bm = flm = -1;
+ s->numSubParag = -1;
+ s->invalidate( 0 );
+ s = s->next();
+ }
+ }
+}
+
+void QTextParag::incDepth()
+{
+ if ( !style() || !doc )
+ return;
+ if ( style()->displayMode() != QStyleSheetItem::DisplayListItem )
+ return;
+ styleSheetItemsVec.resize( styleSheetItemsVec.size() + 1 );
+ styleSheetItemsVec.insert( styleSheetItemsVec.size() - 1, styleSheetItemsVec[ styleSheetItemsVec.size() - 2 ] );
+ styleSheetItemsVec.insert( styleSheetItemsVec.size() - 2,
+ listStyle() == QStyleSheetItem::ListDisc || listStyle() == QStyleSheetItem::ListCircle ||
+ listStyle() == QStyleSheetItem::ListSquare ?
+ doc->styleSheet()->item( "ul" ) : doc->styleSheet()->item( "ol" ) );
+ invalidate( 0 );
+ lm = -1;
+ flm = -1;
+}
+
+void QTextParag::decDepth()
+{
+ if ( !style() || !doc )
+ return;
+ if ( style()->displayMode() != QStyleSheetItem::DisplayListItem )
+ return;
+ int numLists = 0;
+ QStyleSheetItem *lastList = 0;
+ int lastIndex = 0;
+ int i;
+ for ( i = 0; i < (int)styleSheetItemsVec.size(); ++i ) {
+ QStyleSheetItem *item = styleSheetItemsVec[ i ];
+ if ( item->name() == "ol" || item->name() == "ul" ) {
+ lastList = item;
+ lastIndex = i;
+ numLists++;
+ }
+ }
+
+ if ( !lastList )
+ return;
+ styleSheetItemsVec.remove( lastIndex );
+ for ( i = lastIndex; i < (int)styleSheetItemsVec.size() - 1; ++i )
+ styleSheetItemsVec.insert( i, styleSheetItemsVec[ i + 1 ] );
+ styleSheetItemsVec.resize( styleSheetItemsVec.size() - 1 );
+ if ( numLists == 1 )
+ setList( FALSE, -1 );
+ invalidate( 0 );
+ lm = -1;
+ flm = -1;
+}
+
+int QTextParag::nextTab( int, int x )
+{
+ int *ta = tArray;
+ if ( doc ) {
+ if ( !ta )
+ ta = doc->tabArray();
+ tabStopWidth = doc->tabStopWidth();
+ }
+ if ( ta ) {
+ int i = 0;
+ while ( ta[ i ] ) {
+ if ( ta[ i ] >= x )
+ return tArray[ i ];
+ ++i;
+ }
+ return tArray[ 0 ];
+ } else {
+ int d;
+ if ( tabStopWidth != 0 )
+ d = x / tabStopWidth;
+ else
+ return x;
+ return tabStopWidth * ( d + 1 );
+ }
+}
+
+void QTextParag::setPainter( QPainter *p )
+{
+ pntr = p;
+ for ( int i = 0; i < length(); ++i ) {
+ if ( at( i )->isCustom() )
+ at( i )->customItem()->adjustToPainter( p );
+ }
+}
+
+QTextFormatCollection *QTextParag::formatCollection() const
+{
+ if ( doc )
+ return doc->formatCollection();
+ if ( !qFormatCollection )
+ qFormatCollection = new QTextFormatCollection;
+ return qFormatCollection;
+}
+
+QString QTextParag::richText() const
+{
+ QString s;
+ QTextFormat *lastFormat = 0;
+ for ( int i = 0; i < length(); ++i ) {
+ QTextStringChar *c = &str->at( i );
+ if ( !lastFormat || ( lastFormat->key() != c->format()->key() && c->c != ' ' ) ) {
+ s += c->format()->makeFormatChangeTags( lastFormat );
+ lastFormat = c->format();
+ }
+ if ( c->c == '<' ) {
+ s += "&lt;";
+ } else if ( c->c == '>' ) {
+ s += "&gt;";
+ } else if ( c->isCustom() ) {
+ s += c->customItem()->richText();
+ } else {
+ s += c->c;
+ }
+ }
+ return s;
+}
+
+void QTextParag::addCommand( QTextCommand *cmd )
+{
+ if ( !doc )
+ commandHistory->addCommand( cmd );
+ else
+ doc->commands()->addCommand( cmd );
+}
+
+QTextCursor *QTextParag::undo( QTextCursor *c )
+{
+ if ( !doc )
+ return commandHistory->undo( c );
+ return doc->commands()->undo( c );
+}
+
+QTextCursor *QTextParag::redo( QTextCursor *c )
+{
+ if ( !doc )
+ return commandHistory->redo( c );
+ return doc->commands()->redo( c );
+}
+
+int QTextParag::topMargin() const
+{
+ if ( !p && ( !doc || !doc->addMargins() ) )
+ return 0;
+ if ( tm != -1 )
+ return tm;
+ QStyleSheetItem *item = style();
+ if ( !item ) {
+ ( (QTextParag*)this )->tm = 0;
+ return 0;
+ }
+
+ int m = 0;
+ if ( item->margin( QStyleSheetItem::MarginTop ) != QStyleSheetItem::Undefined )
+ m = item->margin( QStyleSheetItem::MarginTop );
+ QStyleSheetItem *it = 0;
+ QStyleSheetItem *p = prev() ? prev()->style() : 0;
+ for ( int i = (int)styleSheetItemsVec.size() - 2 ; i >= 0; --i ) {
+ it = styleSheetItemsVec[ i ];
+ if ( it != p )
+ break;
+ int mar = it->margin( QStyleSheetItem::MarginTop );
+ m += mar != QStyleSheetItem::Undefined ? mar : 0;
+ if ( it->displayMode() != QStyleSheetItem::DisplayInline )
+ break;
+ }
+
+ if ( is_printer( painter() ) ) {
+ QPaintDeviceMetrics metrics( painter()->device() );
+ double yscale = scale_factor( metrics.logicalDpiY() );
+ m = (int)( (double)m * yscale );
+ }
+
+ ( (QTextParag*)this )->tm = m;
+ return tm;
+}
+
+int QTextParag::bottomMargin() const
+{
+ if ( bm != -1 )
+ return bm;
+ QStyleSheetItem *item = style();
+ if ( !item ) {
+ ( (QTextParag*)this )->bm = 0;
+ return 0;
+ }
+
+ int m = 0;
+ if ( item->margin( QStyleSheetItem::MarginBottom ) != QStyleSheetItem::Undefined )
+ m = item->margin( QStyleSheetItem::MarginBottom );
+ QStyleSheetItem *it = 0;
+ QStyleSheetItem *n = next() ? next()->style() : 0;
+ for ( int i =(int)styleSheetItemsVec.size() - 2 ; i >= 0; --i ) {
+ it = styleSheetItemsVec[ i ];
+ if ( it != n )
+ break;
+ int mar = it->margin( QStyleSheetItem::MarginBottom );
+ m += mar != QStyleSheetItem::Undefined ? mar : 0;
+ if ( it->displayMode() != QStyleSheetItem::DisplayInline )
+ break;
+ }
+
+ if ( is_printer( painter() ) ) {
+ QPaintDeviceMetrics metrics( painter()->device() );
+ double yscale = scale_factor( metrics.logicalDpiY() );
+ m = (int)( (double)m * yscale );
+ }
+
+ ( (QTextParag*)this )->bm = m;
+ return bm;
+}
+
+int QTextParag::leftMargin() const
+{
+ if ( lm != -1 )
+ return lm;
+ QStyleSheetItem *item = style();
+ if ( !item ) {
+ ( (QTextParag*)this )->lm = 0;
+ return 0;
+ }
+ int m = 0;
+ for ( int i = 0; i < (int)styleSheetItemsVec.size(); ++i ) {
+ item = styleSheetItemsVec[ i ];
+ int mar = item->margin( QStyleSheetItem::MarginLeft );
+ m += mar != QStyleSheetItem::Undefined ? mar : 0;
+ if ( item->name() == "ol" || item->name() == "ul" ) {
+ m += defFormat->width( '1' ) +
+ defFormat->width( '2' ) +
+ defFormat->width( '3' ) +
+ defFormat->width( '.' );
+ }
+ }
+
+ if ( is_printer( painter() ) ) {
+ QPaintDeviceMetrics metrics( painter()->device() );
+ double yscale = scale_factor( metrics.logicalDpiY() );
+ m = (int)( (double)m * yscale );
+ }
+
+ ( (QTextParag*)this )->lm = m;
+ return lm;
+}
+
+int QTextParag::firstLineMargin() const
+{
+ if ( flm != -1 )
+ return lm;
+ QStyleSheetItem *item = style();
+ if ( !item ) {
+ ( (QTextParag*)this )->flm = 0;
+ return 0;
+ }
+ int m = 0;
+ for ( int i = 0; i < (int)styleSheetItemsVec.size(); ++i ) {
+ item = styleSheetItemsVec[ i ];
+ int mar = item->margin( QStyleSheetItem::MarginFirstLine );
+ m += mar != QStyleSheetItem::Undefined ? mar : 0;
+ }
+
+ if ( is_printer( painter() ) ) {
+ QPaintDeviceMetrics metrics( painter()->device() );
+ double yscale = scale_factor( metrics.logicalDpiY() );
+ m = (int)( (double)m * yscale );
+ }
+
+ ( (QTextParag*)this )->flm = m;
+ return flm;
+}
+
+int QTextParag::rightMargin() const
+{
+ if ( rm != -1 )
+ return rm;
+ QStyleSheetItem *item = style();
+ if ( !item ) {
+ ( (QTextParag*)this )->rm = 0;
+ return 0;
+ }
+ int m = 0;
+ for ( int i = 0; i < (int)styleSheetItemsVec.size(); ++i ) {
+ item = styleSheetItemsVec[ i ];
+ int mar = item->margin( QStyleSheetItem::MarginRight );
+ m += mar != QStyleSheetItem::Undefined ? mar : 0;
+ }
+
+ if ( is_printer( painter() ) ) {
+ QPaintDeviceMetrics metrics( painter()->device() );
+ double yscale = scale_factor( metrics.logicalDpiY() );
+ m = (int)( (double)m * yscale );
+ }
+
+ ( (QTextParag*)this )->rm = m;
+ return rm;
+}
+
+int QTextParag::lineSpacing( int /*line*/ ) const
+{
+ QStyleSheetItem *item = style();
+ if ( !item )
+ return 0;
+
+ int ls = item->lineSpacing();
+ if ( ls == QStyleSheetItem::Undefined )
+ return 0;
+ if ( is_printer( painter() ) ) {
+ QPaintDeviceMetrics metrics( painter()->device() );
+ double yscale = scale_factor( metrics.logicalDpiY() );
+ ls = (int)( (double)ls * yscale );
+ }
+
+ return ls;
+}
+
+void QTextParag::copyParagData( QTextParag *parag )
+{
+ setStyleSheetItems( parag->styleSheetItems() );
+ setListStyle( parag->listStyle() );
+ setAlignment( parag->alignment() );
+}
+
+void QTextParag::show()
+{
+ if ( visible || !doc )
+ return;
+ visible = TRUE;
+}
+
+void QTextParag::hide()
+{
+ if ( !visible || !doc )
+ return;
+ visible = FALSE;
+}
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+
+QTextPreProcessor::QTextPreProcessor()
+{
+}
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+QTextFormatter::QTextFormatter()
+ : wrapEnabled( TRUE ), wrapColumn( -1 ), biw( FALSE )
+{
+}
+
+/* only used for bidi or complex text reordering
+ */
+QTextParagLineStart *QTextFormatter::formatLine( QTextParag * /*parag*/, QTextString *string, QTextParagLineStart *line,
+ QTextStringChar *startChar, QTextStringChar *lastChar, int align, int space )
+{
+//QT2HACK
+#if 0
+ if( string->isBidi() )
+ return bidiReorderLine( parag, string, line, startChar, lastChar, align, space );
+#endif
+ space = QMAX( space, 0 ); // #### with nested tables this gets negative because of a bug I didn't find yet, so workaround for now. This also means non-left aligned nested tables do not work at the moment
+ int start = (startChar - &string->at(0));
+ int last = (lastChar - &string->at(0) );
+ // do alignment Auto == Left in this case
+ if ( align & Qt::AlignHCenter || align & Qt::AlignRight ) {
+ if ( align & Qt::AlignHCenter )
+ space /= 2;
+ for ( int j = start; j <= last; ++j )
+ string->at( j ).x += space;
+ } else if ( align & Qt3::AlignJustify ) {
+ int numSpaces = 0;
+ for ( int j = start; j < last; ++j ) {
+ if( isBreakable( string, j ) ) {
+ numSpaces++;
+ }
+ }
+ int toAdd = 0;
+ for ( int k = start + 1; k <= last; ++k ) {
+ if( isBreakable( string, k ) && numSpaces ) {
+ int s = space / numSpaces;
+ toAdd += s;
+ space -= s;
+ numSpaces--;
+ }
+ string->at( k ).x += toAdd;
+ }
+ }
+
+ if ( last >= 0 && last < string->length() )
+ line->w = string->at( last ).x + string->width( last ); // #### Lars, I guess this breaks for Bidi
+ else
+ line->w = 0;
+
+ return new QTextParagLineStart();
+}
+
+//QT2HACK
+#if 0
+
+#ifdef BIDI_DEBUG
+#include <iostream>
+#endif
+
+// collects one line of the paragraph and transforms it to visual order
+QTextParagLineStart *QTextFormatter::bidiReorderLine( QTextParag *parag, QTextString *text, QTextParagLineStart *line,
+ QTextStringChar *startChar, QTextStringChar *lastChar, int align, int space )
+{
+ int start = (startChar - &text->at(0));
+ int last = (lastChar - &text->at(0) );
+ //printf("doing BiDi reordering from %d to %d!\n", start, last);
+
+ QBidiControl *control = new QBidiControl( line->context(), line->status );
+ QString str;
+ str.setUnicode( 0, last - start + 1 );
+ // fill string with logically ordered chars.
+ QTextStringChar *ch = startChar;
+ QChar *qch = (QChar *)str.unicode();
+ while( ch <= lastChar ) {
+ *qch = ch->c;
+ qch++;
+ ch++;
+ }
+
+ QPtrList<QTextRun> *runs;
+ runs = QComplexText::bidiReorderLine(control, str, 0, last - start + 1);
+
+ // now construct the reordered string out of the runs...
+
+ int left = parag->document() ? parag->leftMargin() + 4 : 4;
+ int x = left + ( parag->document() ? parag->firstLineMargin() : 0 );
+ if ( parag->document() )
+ x = parag->document()->flow()->adjustLMargin( parag->rect().y(), parag->rect().height(), left, 4 );
+ int numSpaces = 0;
+ // set the correct alignment. This is a bit messy....
+ if( align == Qt3::AlignAuto ) {
+ // align according to directionality of the paragraph...
+ if ( text->isRightToLeft() )
+ align = Qt::AlignRight;
+ }
+
+ if ( align & Qt::AlignHCenter )
+ x += space/2;
+ else if ( align & Qt::AlignRight )
+ x += space;
+ else if ( align & Qt3::AlignJustify ) {
+ for ( int j = start; j < last; ++j ) {
+ if( isBreakable( text, j ) ) {
+ numSpaces++;
+ }
+ }
+ }
+ int toAdd = 0;
+
+ // in rtl text the leftmost character is usually a space
+ // this space should not take up visible space on the left side, to get alignment right.
+ // the following bool is used for that purpose
+ bool first = TRUE;
+ QTextRun *r = runs->first();
+ while ( r ) {
+ if(r->level %2) {
+ // odd level, need to reverse the string
+ int pos = r->stop + start;
+ while(pos >= r->start + start) {
+ QTextStringChar *c = &text->at(pos);
+ if( numSpaces && !first && isBreakable( text, pos ) ) {
+ int s = space / numSpaces;
+ toAdd += s;
+ space -= s;
+ numSpaces--;
+ }
+ if ( first ) {
+ first = FALSE;
+ if ( c->c == ' ' )
+ x -= text->width( pos );
+ }
+ c->x = x + toAdd;
+ c->rightToLeft = TRUE;
+ c->startOfRun = FALSE;
+ int ww = 0;
+ if ( c->c.unicode() >= 32 || c->c == '\t' || c->isCustom() ) {
+ ww = text->width( pos );
+ } else {
+ ww = c->format()->width( ' ' );
+ }
+ //qDebug("setting char %d at pos %d width=%d", pos, x, ww);
+ x += ww;
+ pos--;
+ }
+ } else {
+ int pos = r->start + start;
+ while(pos <= r->stop + start) {
+ QTextStringChar* c = &text->at(pos);
+ if( numSpaces && !first && isBreakable( text, pos ) ) {
+ int s = space / numSpaces;
+ toAdd += s;
+ space -= s;
+ numSpaces--;
+ }
+ if ( first ) {
+ first = FALSE;
+ if ( c->c == ' ' )
+ x -= text->width( pos );
+ }
+ c->x = x + toAdd;
+ c->rightToLeft = FALSE;
+ c->startOfRun = FALSE;
+ int ww = 0;
+ if ( c->c.unicode() >= 32 || c->c == '\t' || c->isCustom() ) {
+ ww = text->width( pos );
+ } else {
+ ww = c->format()->width( ' ' );
+ }
+ //qDebug("setting char %d at pos %d", pos, x);
+ x += ww;
+ pos++;
+ }
+ }
+ text->at( r->start ).startOfRun = TRUE;
+ r = runs->next();
+ }
+ QTextParagLineStart *ls = new QTextParagLineStart( control->context, control->status );
+ delete control;
+ delete runs;
+ return ls;
+}
+#endif
+
+bool QTextFormatter::isBreakable( QTextString *string, int pos ) const
+{
+ const QChar &c = string->at( pos ).c;
+ char ch = c.latin1();
+ if ( c.isSpace() && ch != '\n' )
+ return TRUE;
+ if ( c.unicode() == 0xad ) // soft hyphen
+ return TRUE;
+ if ( !ch ) {
+ // not latin1, need to do more sophisticated checks for other scripts
+ uchar row = c.row();
+ if ( row == 0x0e ) {
+ // 0e00 - 0e7f == Thai
+ if ( c.cell() < 0x80 ) {
+#ifdef HAVE_THAI_BREAKS
+ // check for thai
+ if( string != cachedString ) {
+ // build up string of thai chars
+ QTextCodec *thaiCodec = QTextCodec::codecForMib(2259);
+ if ( !thaiCache )
+ thaiCache = new QCString;
+ if ( !thaiIt )
+ thaiIt = ThBreakIterator::createWordInstance();
+ *thaiCache = thaiCodec->fromUnicode( s->string() );
+ }
+ thaiIt->setText(thaiCache->data());
+ for(int i = thaiIt->first(); i != thaiIt->DONE; i = thaiIt->next() ) {
+ if( i == pos )
+ return TRUE;
+ if( i > pos )
+ return FALSE;
+ }
+ return FALSE;
+#else
+ // if we don't have a thai line breaking lib, allow
+ // breaks everywhere except directly before punctuation.
+ return TRUE;
+#endif
+ } else
+ return FALSE;
+ }
+ if ( row < 0x11 ) // no asian font
+ return FALSE;
+ if ( row > 0x2d && row < 0xfb || row == 0x11 )
+ // asian line breaking. Everywhere allowed except directly
+ // in front of a punctuation character.
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void QTextFormatter::insertLineStart( QTextParag *parag, int index, QTextParagLineStart *ls )
+{
+ if ( index > 0 ) { // we can assume that only first line starts are insrted multiple times
+ parag->lineStartList().insert( index, ls );
+ return;
+ }
+ QMap<int, QTextParagLineStart*>::Iterator it;
+ if ( ( it = parag->lineStartList().find( index ) ) == parag->lineStartList().end() ) {
+ parag->lineStartList().insert( index, ls );
+ } else {
+ delete *it;
+ parag->lineStartList().remove( it );
+ parag->lineStartList().insert( index, ls );
+ }
+}
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+QTextFormatterBreakInWords::QTextFormatterBreakInWords()
+{
+}
+
+int QTextFormatterBreakInWords::format( QTextDocument *doc,QTextParag *parag,
+ int start, const QMap<int, QTextParagLineStart*> & )
+{
+ QTextStringChar *c = 0;
+ QTextStringChar *firstChar = 0;
+ int left = doc ? parag->leftMargin() + 4 : 4;
+ int x = left + ( doc ? parag->firstLineMargin() : 0 );
+ int dw = parag->documentVisibleWidth() - ( doc ? 8 : 0 );
+ int y = doc->addMargins() ? parag->topMargin() : 0;
+ int h = y;
+ int len = parag->length();
+ if ( doc )
+ x = doc->flow()->adjustLMargin( y + parag->rect().y(), parag->rect().height(), x, 4 );
+ int rm = parag->rightMargin();
+ int w = dw - ( doc ? doc->flow()->adjustRMargin( y + parag->rect().y(), parag->rect().height(), rm, 4 ) : 0 );
+ bool fullWidth = TRUE;
+ int minw = 0;
+
+ start = 0;
+ if ( start == 0 )
+ c = &parag->string()->at( 0 );
+
+ int i = start;
+ QTextParagLineStart *lineStart = new QTextParagLineStart( y, y, 0 );
+ insertLineStart( parag, 0, lineStart );
+
+ int col = 0;
+ int ww = 0;
+ QChar lastChr;
+ for ( ; i < len; ++i, ++col ) {
+ if ( c )
+ lastChr = c->c;
+ c = &parag->string()->at( i );
+ if ( i > 0 ) {
+ c->lineStart = 0;
+ } else {
+ c->lineStart = 1;
+ firstChar = c;
+ }
+ if ( c->c.unicode() >= 32 || c->isCustom() ) {
+ ww = parag->string()->width( i );
+ } else if ( c->c == '\t' ) {
+ int nx = parag->nextTab( i, x );
+ if ( nx < x )
+ ww = w - x;
+ else
+ ww = nx - x + 1;
+ } else {
+ ww = c->format()->width( ' ' );
+ }
+
+ if ( c->isCustom() && c->customItem()->ownLine() ) {
+ if ( doc )
+ x = doc ? doc->flow()->adjustLMargin( y + parag->rect().y(), parag->rect().height(), left, 4 ) : left;
+ w = dw - ( doc ? doc->flow()->adjustRMargin( y + parag->rect().y(), parag->rect().height(), rm, 4 ) : 0 );
+ c->customItem()->resize( parag->painter(), dw );
+ if ( x != left || w != dw )
+ fullWidth = FALSE;
+ w = dw;
+ y += h;
+ h = c->height();
+ lineStart = new QTextParagLineStart( y, h, h );
+ insertLineStart( parag, i, lineStart );
+ c->lineStart = 1;
+ firstChar = c;
+ x = 0xffffff;
+ continue;
+ }
+
+ if ( isWrapEnabled() &&
+ ( wrapAtColumn() == -1 && x + ww > w ||
+ wrapAtColumn() != -1 && col >= wrapAtColumn() ) ||
+ parag->isNewLinesAllowed() && lastChr == '\n' ) {
+ x = doc ? parag->document()->flow()->adjustLMargin( y + parag->rect().y(), parag->rect().height(), left, 4 ) : left;
+ if ( x != left )
+ fullWidth = FALSE;
+ w = dw;
+ y += h;
+ h = c->height();
+ lineStart = formatLine( parag, parag->string(), lineStart, firstChar, c-1 );
+ lineStart->y = y;
+ insertLineStart( parag, i, lineStart );
+ lineStart->baseLine = c->ascent();
+ lineStart->h = c->height();
+ c->lineStart = 1;
+ firstChar = c;
+ col = 0;
+ if ( wrapAtColumn() != -1 )
+ minw = QMAX( minw, w );
+ } else if ( lineStart ) {
+ lineStart->baseLine = QMAX( lineStart->baseLine, c->ascent() );
+ h = QMAX( h, c->height() );
+ lineStart->h = h;
+ }
+
+ c->x = x;
+ x += ww;
+ }
+
+ int m = parag->bottomMargin();
+ if ( parag->next() && !doc->addMargins() )
+ m = QMAX( m, parag->next()->topMargin() );
+ parag->setFullWidth( fullWidth );
+ if ( is_printer( parag->painter() ) ) {
+ QPaintDeviceMetrics metrics( parag->painter()->device() );
+ double yscale = scale_factor( metrics.logicalDpiY() );
+ m = (int)( (double)m * yscale );
+ }
+ y += h + m;
+ if ( !isWrapEnabled() )
+ minw = QMAX( minw, c->x + ww ); // #### Lars: Fix this for BiDi, please
+ if ( doc )
+ doc->setMinimumWidth( minw, parag );
+ return y;
+}
+
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+QTextFormatterBreakWords::QTextFormatterBreakWords()
+{
+}
+
+int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
+ int start, const QMap<int, QTextParagLineStart*> & )
+{
+ QTextStringChar *c = 0;
+ start = 0;
+ if ( start == 0 )
+ c = &parag->string()->at( 0 );
+
+ QTextStringChar *firstChar = 0;
+ int firstCharIndex = 0;
+ QTextString *string = parag->string();
+ int left = doc ? parag->leftMargin() + 4 : 0;
+ int x = left + ( doc ? parag->firstLineMargin() : 0 );
+ int curLeft = left;
+ int y = doc && doc->addMargins() ? parag->topMargin() : 0;
+ int h = 0;
+ int len = parag->length();
+
+ int initialHeight = h + c->height(); // remember what adjustLMargin was called with
+ if ( doc )
+ x = doc->flow()->adjustLMargin( y + parag->rect().y(), h + c->height(), x, 4 );
+ int initialLMargin = x; // and remember the resulting adjustement we got
+ int dw = parag->documentVisibleWidth() - ( doc ? ( left != x ? 0 : 8 ) : -4 );
+
+ curLeft = x;
+ int rm = parag->rightMargin();
+ int initialRMargin = doc ? doc->flow()->adjustRMargin( y + parag->rect().y(), h + c->height(), rm, 4 ) : 0;
+ int w = dw - initialRMargin;
+ bool fullWidth = TRUE;
+ int marg = left + initialRMargin;
+ int minw = 0;
+ int tminw = marg;
+ int line = 0;
+
+ int i = start;
+ //qDebug( "Initial QTextParagLineStart at y=%d", y );
+ QTextParagLineStart *lineStart = new QTextParagLineStart( y, 0, 0 );
+ insertLineStart( parag, 0, lineStart );
+ int lastBreak = -1;
+ int tmpBaseLine = 0, tmph = 0;
+ bool lastWasNonInlineCustom = FALSE;
+
+ int align = parag->alignment();
+ if ( align == Qt3::AlignAuto && doc && doc->alignment() != Qt3::AlignAuto )
+ align = doc->alignment();
+
+ int col = 0;
+ int ww = 0;
+ QChar lastChr;
+ for ( ; i < len; ++i, ++col ) {
+ if ( c )
+ lastChr = c->c;
+ c = &string->at( i );
+ if ( i > 0 && x > curLeft || lastWasNonInlineCustom ) {
+ c->lineStart = 0;
+ } else {
+ c->lineStart = 1;
+ firstChar = c;
+ firstCharIndex = i;
+ }
+
+ if ( c->isCustom() && c->customItem()->placement() != QTextCustomItem::PlaceInline )
+ lastWasNonInlineCustom = TRUE;
+ else
+ lastWasNonInlineCustom = FALSE;
+
+ if ( c->c.unicode() >= 32 || c->isCustom() ) {
+ ww = string->width( i );
+ } else if ( c->c == '\t' ) {
+ int nx = parag->nextTab( i, x );
+ if ( nx < x )
+ ww = w - x;
+ else
+ ww = nx - x + 1;
+ } else {
+ ww = c->format()->width( ' ' );
+ }
+
+ // Custom item that forces a new line
+ if ( c->isCustom() && c->customItem()->ownLine() ) {
+ x = doc ? doc->flow()->adjustLMargin( y + parag->rect().y(), c->height(), left, 4 ) : left;
+ w = dw - ( doc ? doc->flow()->adjustRMargin( y + parag->rect().y(), c->height(), rm, 4 ) : 0 );
+ QTextParagLineStart *lineStart2 = formatLine( parag, string, lineStart, firstChar, c-1, align, w - x );
+ c->customItem()->resize( parag->painter(), dw );
+ if ( x != left || w != dw )
+ fullWidth = FALSE;
+ curLeft = x;
+ if ( i == 0 || !isBreakable( string, i - 1 ) || string->at( i - 1 ).lineStart == 0 ) {
+ // Create a new line for this custom item
+ lineStart->h += doc ? parag->lineSpacing( line++ ) : 0;
+ y += QMAX( h, tmph );
+ tmph = c->height();
+ h = tmph;
+ lineStart = lineStart2;
+ lineStart->y = y;
+ insertLineStart( parag, i, lineStart );
+ c->lineStart = 1;
+ firstChar = c;
+ } else {
+ // No need for a new line, already at beginning of line
+ tmph = c->height();
+ h = tmph;
+ delete lineStart2;
+ }
+ lineStart->h = h;
+ lineStart->baseLine = h;
+ tmpBaseLine = lineStart->baseLine;
+ lastBreak = -2;
+ x = 0xffffff;
+ minw = QMAX( minw, tminw );
+ int tw = QMAX( c->customItem()->minimumWidth(), QMIN( c->customItem()->widthHint(), c->customItem()->width ) );
+ if ( tw < 32000 )
+ tminw = tw;
+ else
+ tminw = marg;
+ continue;
+ }
+ //qDebug("c=%c i=%d/%d x=%d ww=%d w=%d (test is x+ww>w) lastBreak=%d isBreakable=%d",c->c.latin1(),i,len,x,ww,w,lastBreak,isBreakable(string,i));
+ // Wrapping at end of line
+ if ( isWrapEnabled() &&
+ ( !isBreakable( string, i ) || ( i > 0 && !isBreakable( string, i - 1 ) ) ) && // break after ' '
+ ( lastBreak != -1 || allowBreakInWords() ) &&
+ ( wrapAtColumn() == -1 && x + ww > w && lastBreak != -1 ||
+ wrapAtColumn() == -1 && x + ww > w - 4 && lastBreak == -1 && allowBreakInWords() ||
+ wrapAtColumn() != -1 && col >= wrapAtColumn() ) ||
+ parag->isNewLinesAllowed() && lastChr == '\n' ) {
+ //qDebug( "BREAKING" );
+ if ( wrapAtColumn() != -1 )
+ minw = QMAX( minw, x + ww );
+ // No breakable char found -> break at current char
+ if ( lastBreak < 0 ) {
+ ASSERT( lineStart );
+ //if ( lineStart ) {
+ // (combine lineStart and tmpBaseLine/tmph)
+ int belowBaseLine = QMAX( h - lineStart->baseLine, tmph - tmpBaseLine );
+ lineStart->baseLine = QMAX( lineStart->baseLine, tmpBaseLine );
+ h = lineStart->baseLine + belowBaseLine;
+ lineStart->h = h;
+ //}
+ QTextParagLineStart *lineStart2 = formatLine( parag, string, lineStart, firstChar, c-1, align, w - x );
+ lineStart->h += doc ? parag->lineSpacing( line++ ) : 0;
+ y += lineStart->h;
+
+ lineStart = lineStart2;
+ tmph = c->height();
+ h = 0;
+ x = doc ? doc->flow()->adjustLMargin( y + parag->rect().y(), tmph, left, 4 ) : left;
+ initialHeight = tmph;
+ initialLMargin = x;
+ initialRMargin = ( doc ? doc->flow()->adjustRMargin( y + parag->rect().y(), tmph, rm, 4 ) : 0 );
+ w = dw - initialRMargin;
+ if ( parag->isNewLinesAllowed() && c->c == '\t' ) {
+ int nx = parag->nextTab( i, x );
+ if ( nx < x )
+ ww = w - x;
+ else
+ ww = nx - x + 1;
+ }
+ if ( x != left || w != dw )
+ fullWidth = FALSE;
+ curLeft = x;
+ lineStart->y = y;
+ insertLineStart( parag, i, lineStart );
+ lineStart->baseLine = c->ascent();
+ lineStart->h = c->height();
+ c->lineStart = 1;
+ firstChar = c;
+ tmpBaseLine = lineStart->baseLine;
+ lastBreak = -1;
+ col = 0;
+ } else {
+ // Breakable char was found
+ i = lastBreak;
+ QTextParagLineStart *lineStart2 = formatLine( parag, string, lineStart, firstChar, parag->at( lastBreak ), align, w - string->at( i ).x );
+ lineStart->h += doc ? parag->lineSpacing( line++ ) : 0;
+ y += lineStart->h;
+ lineStart = lineStart2;
+ tmph = c->height();
+ h = tmph;
+ x = doc ? doc->flow()->adjustLMargin( y + parag->rect().y(), h, left, 4 ) : left;
+ initialHeight = h;
+ initialLMargin = x;
+ initialRMargin = ( doc ? doc->flow()->adjustRMargin( y + parag->rect().y(), h, rm, 4 ) : 0 );
+ w = dw - initialRMargin;
+ if ( parag->isNewLinesAllowed() && c->c == '\t' ) {
+ int nx = parag->nextTab( i, x );
+ if ( nx < x )
+ ww = w - x;
+ else
+ ww = nx - x + 1;
+ }
+ if ( x != left || w != dw )
+ fullWidth = FALSE;
+ curLeft = x;
+ lineStart->y = y;
+ insertLineStart( parag, i + 1, lineStart );
+ lineStart->baseLine = c->ascent();
+ lineStart->h = c->height();
+ c->lineStart = 1;
+ firstChar = c;
+ tmpBaseLine = lineStart->baseLine;
+ lastBreak = -1;
+ col = 0;
+ tminw = marg;
+ continue;
+ }
+ } else if ( lineStart && ( isBreakable( string, i ) || parag->isNewLinesAllowed() && c->c == '\n' ) ) {
+ // Breakable character
+ if ( len <= 2 || i < len - 1 ) {
+ //qDebug( " Breakable character (i=%d len=%d): combining %d/%d with %d/%d", i, len,
+ // tmpBaseLine, tmph, c->ascent(), c->height()+ls );
+ // (combine tmpBaseLine/tmph and this character)
+ int belowBaseLine = QMAX( tmph - tmpBaseLine, c->height() - c->ascent() );
+ tmpBaseLine = QMAX( tmpBaseLine, c->ascent() );
+ tmph = tmpBaseLine + belowBaseLine;
+ //qDebug( " -> tmpBaseLine/tmph : %d/%d", tmpBaseLine, tmph );
+ }
+ minw = QMAX( minw, tminw );
+ tminw = marg + ww;
+ // (combine lineStart and tmpBaseLine/tmph)
+ //qDebug( "Breakable character: combining %d/%d with %d/%d", lineStart->baseLine, h, tmpBaseLine, tmph );
+ int belowBaseLine = QMAX( h - lineStart->baseLine, tmph - tmpBaseLine );
+ lineStart->baseLine = QMAX( lineStart->baseLine, tmpBaseLine );
+ h = lineStart->baseLine + belowBaseLine;
+ lineStart->h = h;
+ // if h > initialHeight, call adjust[LR]Margin, and if the result is != initial[LR]Margin,
+ // format this line again
+ if ( doc && h > initialHeight )
+ {
+ int newLMargin = doc->flow()->adjustLMargin( y + parag->rect().y(), h, left, 4 );
+ int newRMargin = doc->flow()->adjustRMargin( y + parag->rect().y(), h, rm, 4 );
+ //qDebug("new height: %d => newLMargin=%d newRMargin=%d", h, newLMargin, newRMargin);
+ if ( newLMargin != initialLMargin || newRMargin != initialRMargin )
+ {
+ //qDebug("formatting again");
+ i = firstCharIndex;
+ x = newLMargin;
+ w = dw - newRMargin;
+ initialLMargin = newLMargin;
+ initialRMargin = newRMargin;
+ initialHeight = h;
+ curLeft = x;
+ lastBreak = -1;
+ col = 0;
+ if ( parag->isNewLinesAllowed() && firstChar->c == '\t' ) {
+ int nx = parag->nextTab( i, x );
+ if ( nx < x )
+ ww = w - x;
+ else
+ ww = nx - x + 1;
+ }
+ //minw ? tminw ?
+ }
+ }
+
+ //qDebug( " -> lineStart->baseLine/lineStart->h : %d/%d", lineStart->baseLine, lineStart->h );
+ if ( i < len - 2 || c->c != ' ' )
+ lastBreak = i;
+ } else {
+ // Non-breakable character
+ tminw += ww;
+ //qDebug( " Non-breakable character: combining %d/%d with %d/%d", tmpBaseLine, tmph, c->ascent(), c->height()+ls );
+ // (combine tmpBaseLine/tmph and this character)
+ int belowBaseLine = QMAX( tmph - tmpBaseLine, c->height() - c->ascent() );
+ tmpBaseLine = QMAX( tmpBaseLine, c->ascent() );
+ tmph = tmpBaseLine + belowBaseLine;
+ //qDebug( " -> tmpBaseLine/tmph : %d/%d", tmpBaseLine, tmph );
+ }
+
+ c->x = x;
+ //qDebug("setting c->x to %d",c->x);
+ if ( c->isCustom() )
+ {
+ //qDebug("custom item -> moving to %d,%d",x,y);
+ c->customItem()->move( x, y );
+ }
+ x += ww;
+ //qDebug("added %d -> now x=%d",ww,x);
+ }
+
+ // Finish formatting the last line
+ if ( lineStart ) {
+ //qDebug( "Last Line.... Combining %d/%d with %d/%d", lineStart->baseLine, h, tmpBaseLine, tmph );
+ // (combine lineStart and tmpBaseLine/tmph)
+ int belowBaseLine = QMAX( h - lineStart->baseLine, tmph - tmpBaseLine );
+ lineStart->baseLine = QMAX( lineStart->baseLine, tmpBaseLine );
+ h = lineStart->baseLine + belowBaseLine;
+ lineStart->h = h;
+ //qDebug( " -> lineStart->baseLine/lineStart->h : %d/%d", lineStart->baseLine, lineStart->h );
+ // last line in a paragraph is not justified
+ if ( align == Qt3::AlignJustify )
+ align = Qt3::AlignAuto;
+ QTextParagLineStart *lineStart2 = formatLine( parag, string, lineStart, firstChar, c, align, w - x );
+ h += doc ? parag->lineSpacing( line++ ) : 0;
+ lineStart->h = h;
+ delete lineStart2;
+ }
+
+ minw = QMAX( minw, tminw );
+
+ int m = parag->bottomMargin();
+ if ( parag->next() && !doc->addMargins() )
+ m = QMAX( m, parag->next()->topMargin() );
+ parag->setFullWidth( fullWidth );
+ if ( is_printer( parag->painter() ) ) {
+ QPaintDeviceMetrics metrics( parag->painter()->device() );
+ double yscale = scale_factor( metrics.logicalDpiY() );
+ m = (int)( (double)m * yscale );
+ }
+ //qDebug( "Adding h(%d) and bottomMargin(%d) to y(%d) => %d", h, m, y, y+h+m );
+ y += h + m;
+ //if ( doc && doc->addMargins() )
+ // y -= parag->topMargin(); // Was already in y's initial value
+
+ if ( !isWrapEnabled() )
+ minw = QMAX( minw, c->x + ww ); // #### Lars: Fix this for BiDi, please
+ if ( doc ) {
+ if ( minw < 32000 )
+ doc->setMinimumWidth( minw, parag );
+ }
+
+ return y;
+}
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+QTextIndent::QTextIndent()
+{
+}
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+QTextFormatCollection::QTextFormatCollection()
+ : cKey( 307 ), sheet( 0 )
+{
+#ifdef DEBUG_COLLECTION
+ qDebug("QTextFormatCollection::QTextFormatCollection %p", this);
+#endif
+ defFormat = new QTextFormat( QApplication::font(),
+ QApplication::palette().color( QPalette::Active, QColorGroup::Text ) );
+ lastFormat = cres = 0;
+ cflags = -1;
+ cKey.setAutoDelete( TRUE );
+ cachedFormat = 0;
+}
+
+QTextFormatCollection::~QTextFormatCollection()
+{
+#ifdef DEBUG_COLLECTION
+ qDebug("QTextFormatCollection::~QTextFormatCollection %p", this);
+#endif
+ delete defFormat;
+}
+
+QTextFormat *QTextFormatCollection::format( const QTextFormat *f )
+{
+ if ( f->parent() == this || f == defFormat ) {
+#ifdef DEBUG_COLLECTION
+ qDebug( " format(f) need '%s', best case!", f->key().latin1() );
+#endif
+ lastFormat = const_cast<QTextFormat*>(f);
+ lastFormat->addRef();
+ return lastFormat;
+ }
+
+ if ( f == lastFormat || ( lastFormat && f->key() == lastFormat->key() ) ) {
+#ifdef DEBUG_COLLECTION
+ qDebug( " format(f) need '%s', good case!", f->key().latin1() );
+#endif
+ lastFormat->addRef();
+ return lastFormat;
+ }
+
+#if 0 // #### disabled, because if this format is not in the
+ // formatcollection, it doesn't get the painter through
+ // QTextFormatCollection::setPainter() which breaks printing on
+ // windows
+ if ( f->isAnchor() ) {
+ lastFormat = createFormat( *f );
+ lastFormat->collection = 0;
+ return lastFormat;
+ }
+#endif
+
+ QTextFormat *fm = cKey.find( f->key() );
+ if ( fm ) {
+#ifdef DEBUG_COLLECTION
+ qDebug( " format(f) need '%s', normal case!", f->key().latin1() );
+#endif
+ lastFormat = fm;
+ lastFormat->addRef();
+ return lastFormat;
+ }
+
+#ifdef DEBUG_COLLECTION
+ qDebug( " format(f) need '%s', worst case!", f->key().latin1() );
+#endif
+ lastFormat = createFormat( *f );
+ lastFormat->collection = this;
+ cKey.insert( lastFormat->key(), lastFormat );
+ return lastFormat;
+}
+
+QTextFormat *QTextFormatCollection::format( QTextFormat *of, QTextFormat *nf, int flags )
+{
+ if ( cres && kof == of->key() && knf == nf->key() && cflags == flags ) {
+#ifdef DEBUG_COLLECTION
+ qDebug( " format(of,nf,flags) mix of '%s' and '%s, best case!", of->key().latin1(), nf->key().latin1() );
+#endif
+ cres->addRef();
+ return cres;
+ }
+
+#ifdef DEBUG_COLLECTION
+ qDebug(" format(of,nf,%d) calling createFormat(of=%p %s)",flags,of,of->key().latin1());
+#endif
+ cres = createFormat( *of );
+ kof = of->key();
+ knf = nf->key();
+ cflags = flags;
+
+#ifdef DEBUG_COLLECTION
+ qDebug(" format(of,nf,%d) calling copyFormat(nf=%p %s)",flags,nf,nf->key().latin1());
+#endif
+ cres->copyFormat( *nf, flags );
+
+ QTextFormat *fm = cKey.find( cres->key() );
+ if ( !fm ) {
+#ifdef DEBUG_COLLECTION
+ qDebug( " format(of,nf,flags) mix of '%s' and '%s, worst case!", of->key().latin1(), nf->key().latin1() );
+#endif
+ cres->collection = this;
+ cKey.insert( cres->key(), cres );
+ } else {
+#ifdef DEBUG_COLLECTION
+ qDebug( " format(of,nf,flags) mix of '%s' and '%s, good case!", of->key().latin1(), nf->key().latin1() );
+#endif
+ delete cres;
+ cres = fm;
+ cres->addRef();
+ }
+
+ return cres;
+}
+
+QTextFormat *QTextFormatCollection::format( const QFont &f, const QColor &c )
+{
+ if ( cachedFormat && cfont == f && ccol == c ) {
+#ifdef DEBUG_COLLECTION
+ qDebug( " format of font and col '%s' - best case", cachedFormat->key().latin1() );
+#endif
+ cachedFormat->addRef();
+ return cachedFormat;
+ }
+
+ QString key = QTextFormat::getKey( f, c, FALSE, QString::null, QString::null, QTextFormat::AlignNormal );
+ cachedFormat = cKey.find( key );
+ cfont = f;
+ ccol = c;
+
+ if ( cachedFormat ) {
+#ifdef DEBUG_COLLECTION
+ qDebug( " format of font and col '%s' - good case", cachedFormat->key().latin1() );
+#endif
+ cachedFormat->addRef();
+ return cachedFormat;
+ }
+
+ cachedFormat = createFormat( f, c );
+ cachedFormat->collection = this;
+ cKey.insert( cachedFormat->key(), cachedFormat );
+#ifdef DEBUG_COLLECTION
+ qDebug( " format of font and col '%s' - worst case", cachedFormat->key().latin1() );
+#endif
+ return cachedFormat;
+}
+
+void QTextFormatCollection::remove( QTextFormat *f )
+{
+ if ( lastFormat == f )
+ lastFormat = 0;
+ if ( cres == f )
+ cres = 0;
+ if ( cachedFormat == f )
+ cachedFormat = 0;
+ cKey.remove( f->key() );
+}
+
+void QTextFormatCollection::setPainter( QPainter *p )
+{
+ QDictIterator<QTextFormat> it( cKey );
+ QTextFormat *f;
+ while ( ( f = it.current() ) ) {
+ ++it;
+ f->setPainter( p );
+ }
+}
+
+void QTextFormatCollection::debug()
+{
+ qDebug( "------------ QTextFormatCollection: debug --------------- BEGIN" );
+ QDictIterator<QTextFormat> it( cKey );
+ for ( ; it.current(); ++it ) {
+ qDebug( "format '%s' (%p): refcount: %d", it.current()->key().latin1(),
+ it.current(), it.current()->ref );
+ }
+ qDebug( "------------ QTextFormatCollection: debug --------------- END" );
+}
+
+void QTextFormatCollection::updateStyles()
+{
+ QDictIterator<QTextFormat> it( cKey );
+ QTextFormat *f;
+ while ( ( f = it.current() ) ) {
+ ++it;
+ f->updateStyle();
+ }
+}
+
+void QTextFormatCollection::updateFontSizes( int base )
+{
+ QDictIterator<QTextFormat> it( cKey );
+ QTextFormat *f;
+ while ( ( f = it.current() ) ) {
+ ++it;
+ f->stdPointSize = base;
+ f->fn.setPointSize( f->stdPointSize );
+ styleSheet()->scaleFont( f->fn, f->logicalFontSize );
+ f->update();
+ }
+ f = defFormat;
+ f->stdPointSize = base;
+ f->fn.setPointSize( f->stdPointSize );
+ styleSheet()->scaleFont( f->fn, f->logicalFontSize );
+ f->update();
+}
+
+void QTextFormatCollection::updateFontAttributes( const QFont &f, const QFont &old )
+{
+ QDictIterator<QTextFormat> it( cKey );
+ QTextFormat *fm;
+ while ( ( fm = it.current() ) ) {
+ ++it;
+ if ( fm->fn.family() == old.family() &&
+ fm->fn.weight() == old.weight() &&
+ fm->fn.italic() == old.italic() &&
+ fm->fn.underline() == old.underline() ) {
+ fm->fn.setFamily( f.family() );
+ fm->fn.setWeight( f.weight() );
+ fm->fn.setItalic( f.italic() );
+ fm->fn.setUnderline( f.underline() );
+ fm->update();
+ }
+ }
+ fm = defFormat;
+ if ( fm->fn.family() == old.family() &&
+ fm->fn.weight() == old.weight() &&
+ fm->fn.italic() == old.italic() &&
+ fm->fn.underline() == old.underline() ) {
+ fm->fn.setFamily( f.family() );
+ fm->fn.setWeight( f.weight() );
+ fm->fn.setItalic( f.italic() );
+ fm->fn.setUnderline( f.underline() );
+ fm->update();
+ }
+}
+
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+void QTextFormat::copyFormat( const QTextFormat & nf, int flags )
+{
+ if ( flags & QTextFormat::Bold )
+ fn.setBold( nf.fn.bold() );
+ if ( flags & QTextFormat::Italic )
+ fn.setItalic( nf.fn.italic() );
+ if ( flags & QTextFormat::Underline )
+ fn.setUnderline( nf.fn.underline() );
+ if ( flags & QTextFormat::Family )
+ fn.setFamily( nf.fn.family() );
+ if ( flags & QTextFormat::Size )
+ fn.setPointSize( nf.fn.pointSize() );
+ if ( flags & QTextFormat::Color )
+ col = nf.col;
+ if ( flags & QTextFormat::Misspelled )
+ missp = nf.missp;
+ if ( flags & QTextFormat::VAlign )
+ ha = nf.ha;
+ update();
+}
+
+void QTextFormat::setBold( bool b )
+{
+ if ( b == fn.bold() )
+ return;
+ fn.setBold( b );
+ update();
+}
+
+void QTextFormat::setMisspelled( bool b )
+{
+ if ( b == (bool)missp )
+ return;
+ missp = b;
+ update();
+}
+
+void QTextFormat::setVAlign( VerticalAlignment a )
+{
+ if ( a == ha )
+ return;
+ ha = a;
+ update();
+}
+
+void QTextFormat::setItalic( bool b )
+{
+ if ( b == fn.italic() )
+ return;
+ fn.setItalic( b );
+ update();
+}
+
+void QTextFormat::setUnderline( bool b )
+{
+ if ( b == fn.underline() )
+ return;
+ fn.setUnderline( b );
+ update();
+}
+
+void QTextFormat::setFamily( const QString &f )
+{
+ if ( f == fn.family() )
+ return;
+ fn.setFamily( f );
+
+//ANY_CHARSET_BEGIN
+ if ( m_charsetMap && m_charsetMap->contains(f) ) {
+ fn.setCharSet((*m_charsetMap)[f]);
+ }
+//ANY_CHARSET_END
+ update();
+}
+
+void QTextFormat::setPointSize( int s )
+{
+ if ( s == fn.pointSize() )
+ return;
+ fn.setPointSize( s );
+ update();
+}
+
+void QTextFormat::setFont( const QFont &f )
+{
+ if ( f == fn && !k.isEmpty() )
+ return;
+ fn = f;
+//ANY_CHARSET_BEGIN
+ if (m_charsetMap && m_charsetMap->contains(fn.family()))
+ fn.setCharSet((*m_charsetMap)[fn.family()]);
+//ANY_CHARSET_END
+ update();
+}
+
+void QTextFormat::setColor( const QColor &c )
+{
+ if ( c == col )
+ return;
+ col = c;
+ update();
+}
+
+void QTextFormat::setPainter( QPainter *p )
+{
+ painter = p;
+ update();
+}
+
+static int makeLogicFontSize( int s )
+{
+ int defSize = QApplication::font().pointSize();
+ if ( s < defSize - 4 )
+ return 1;
+ if ( s < defSize )
+ return 2;
+ if ( s < defSize + 4 )
+ return 3;
+ if ( s < defSize + 8 )
+ return 4;
+ if ( s < defSize + 12 )
+ return 5;
+ if (s < defSize + 16 )
+ return 6;
+ return 7;
+}
+
+static QTextFormat *defaultFormat = 0;
+
+QString QTextFormat::makeFormatChangeTags( QTextFormat *f ) const
+{
+ if ( !defaultFormat )
+ defaultFormat = new QTextFormat( QApplication::font(),
+ QApplication::palette().color( QPalette::Active, QColorGroup::Text ) );
+
+ QString tag;
+
+ if ( f ) {
+ if ( f->font() != defaultFormat->font() ||
+ f->color().rgb() != defaultFormat->color().rgb() )
+ tag += "</font>";
+ if ( f->font() != defaultFormat->font() ) {
+ if ( f->font().underline() && f->font().underline() != defaultFormat->font().underline() )
+ tag += "</u>";
+ if ( f->font().italic() && f->font().italic() != defaultFormat->font().italic() )
+ tag += "</i>";
+ if ( f->font().bold() && f->font().bold() != defaultFormat->font().bold() )
+ tag += "</b>";
+ }
+ if ( f->isAnchor() && !f->anchorHref().isEmpty() )
+ tag += "</a>";
+ }
+
+ if ( isAnchor() ) {
+ if ( !anchor_href.isEmpty() )
+ tag += "<a href=\"" + anchor_href + "\">";
+ else
+ tag += "<a name=\"" + anchor_name + "\"></a>";
+ }
+
+ if ( font() != defaultFormat->font() ) {
+ if ( font().bold() && font().bold() != defaultFormat->font().bold() )
+ tag += "<b>";
+ if ( font().italic() && font().italic() != defaultFormat->font().italic() )
+ tag += "<i>";
+ if ( font().underline() && font().underline() != defaultFormat->font().underline() )
+ tag += "<u>";
+ }
+ if ( font() != defaultFormat->font() ||
+ color().rgb() != defaultFormat->color().rgb() ) {
+ tag += "<font ";
+ if ( font().family() != defaultFormat->font().family() )
+ tag +="face=\"" + fn.family() + "\" ";
+ if ( font().pointSize() != defaultFormat->font().pointSize() )
+ tag +="size=\"" + QString::number( makeLogicFontSize( fn.pointSize() ) ) + "\" ";
+ if ( color().rgb() != defaultFormat->color().rgb() )
+ tag +="color=\"" + col.name() + "\" ";
+ tag += ">";
+ }
+
+ return tag;
+}
+
+QString QTextFormat::makeFormatEndTags() const
+{
+ if ( !defaultFormat )
+ defaultFormat = new QTextFormat( QApplication::font(),
+ QApplication::palette().color( QPalette::Active, QColorGroup::Text ) );
+
+ QString tag;
+ if ( font() != defaultFormat->font() ||
+ color().rgb() != defaultFormat->color().rgb() )
+ tag += "</font>";
+ if ( font() != defaultFormat->font() ) {
+ if ( font().underline() && font().underline() != defaultFormat->font().underline() )
+ tag += "</u>";
+ if ( font().italic() && font().italic() != defaultFormat->font().italic() )
+ tag += "</i>";
+ if ( font().bold() && font().bold() != defaultFormat->font().bold() )
+ tag += "</b>";
+ }
+ if ( isAnchor() && anchorHref().isEmpty() )
+ tag += "</a>";
+ return tag;
+}
+
+QTextFormat QTextFormat::makeTextFormat( const QStyleSheetItem *style, const QMap<QString,QString>& attr ) const
+{
+ QTextFormat format(*this);
+ bool changed = FALSE;
+ if ( style ) {
+ format.style = style->name();
+ if ( style->name() == "font") {
+ if ( attr.contains("color") ) {
+ QString s = attr["color"];
+ if ( !s.isEmpty() ) {
+ format.col.setNamedColor( s );
+ format.linkColor = FALSE;
+ }
+ }
+ if ( attr.contains("size") ) {
+ QString a = attr["size"];
+ int n = a.toInt();
+ if ( a[0] == '+' || a[0] == '-' )
+ n += format.logicalFontSize;
+ format.logicalFontSize = n;
+ format.fn.setPointSize( format.stdPointSize );
+ style->styleSheet()->scaleFont( format.fn, format.logicalFontSize );
+ }
+ if ( attr.contains("face") ) {
+ QString a = attr["face"];
+ if ( a.contains(',') )
+ a = a.left( a.find(',') );
+ format.fn.setFamily( a );
+//ANY_CHARSET_BEGIN
+ if (m_charsetMap && m_charsetMap->contains(format.fn.family())) {
+ format.fn.setCharSet((*m_charsetMap)[format.fn.family()]);
+ }
+//ANY_CHARSET_END
+ }
+ } else {
+
+ if ( style->isAnchor() ) {
+ format.anchor_href = attr["href"];
+ format.anchor_name = attr["name"];
+ changed = TRUE;
+ }
+
+ if ( style->fontWeight() != QStyleSheetItem::Undefined )
+ format.fn.setWeight( style->fontWeight() );
+ if ( style->fontSize() != QStyleSheetItem::Undefined )
+ format.fn.setPointSize( style->fontSize() );
+ else if ( style->logicalFontSize() != QStyleSheetItem::Undefined ) {
+ format.logicalFontSize = style->logicalFontSize();
+ format.fn.setPointSize( format.stdPointSize );
+ style->styleSheet()->scaleFont( format.fn, format.logicalFontSize );
+ }
+ else if ( style->logicalFontSizeStep() ) {
+ format.logicalFontSize += style->logicalFontSizeStep();
+ format.fn.setPointSize( format.stdPointSize );
+ style->styleSheet()->scaleFont( format.fn, format.logicalFontSize );
+ }
+ if ( !style->fontFamily().isEmpty() )
+ format.fn.setFamily( style->fontFamily() );
+//ANY_CHARSET_BEGIN
+ if ( !style->fontFamily().isEmpty() )
+ if (m_charsetMap && m_charsetMap->contains(style->fontFamily()))
+ format.fn.setCharSet( (*m_charsetMap)[style->fontFamily()] );
+//ANY_CHARSET_END
+ if ( style->color().isValid() )
+ format.col = style->color();
+ if ( style->definesFontItalic() )
+ format.fn.setItalic( style->fontItalic() );
+ if ( style->definesFontUnderline() )
+ format.fn.setUnderline( style->fontUnderline() );
+ }
+ }
+
+ if ( fn != format.fn || changed || col != format.col ) // slight performance improvement
+ format.generateKey();
+ format.update();
+ return format;
+}
+
+QTextCustomItem::QTextCustomItem( QTextDocument *p )
+ : width(-1), height(0), parent(p), xpos(0), ypos(-1), parag(0)
+{
+}
+
+QTextCustomItem::~QTextCustomItem()
+{
+}
+
+struct QPixmapInt
+{
+ QPixmapInt() : ref( 0 ) {}
+ QPixmap pm;
+ int ref;
+};
+
+static QMap<QString, QPixmapInt> *pixmap_map = 0;
+
+QTextImage::QTextImage( QTextDocument *p, const QMap<QString, QString> &attr, const QString& context,
+ QMimeSourceFactory &factory )
+ : QTextCustomItem( p )
+{
+#if defined(PARSER_DEBUG)
+ qDebug( debug_indent + "new QTextImage (pappi: %p)", p );
+#endif
+
+ width = height = 0;
+ if ( attr.contains("width") )
+ width = attr["width"].toInt();
+ if ( attr.contains("height") )
+ height = attr["height"].toInt();
+
+ reg = 0;
+ QString imageName = attr["src"];
+
+ if (!imageName)
+ imageName = attr["source"];
+
+#if defined(PARSER_DEBUG)
+ qDebug( debug_indent + " .." + imageName );
+#endif
+
+ if ( !imageName.isEmpty() ) {
+ imgId = QString( "%1,%2,%3,%4" ).arg( imageName ).arg( width ).arg( height ).arg( (ulong)&factory );
+ if ( !pixmap_map )
+ pixmap_map = new QMap<QString, QPixmapInt>;
+ if ( pixmap_map->contains( imgId ) ) {
+ QPixmapInt& pmi = pixmap_map->operator[](imgId);
+ pm = pmi.pm;
+ pmi.ref++;
+ width = pm.width();
+ height = pm.height();
+ } else {
+ QImage img;
+ const QMimeSource* m =
+ factory.data( imageName, context );
+ if ( !m ) {
+// qWarning("QTextImage: no mimesource for %s", imageName.latin1() );
+ }
+ else {
+ if ( !QImageDrag::decode( m, img ) ) {
+// qWarning("QTextImage: cannot decode %s", imageName.latin1() );
+ }
+ }
+
+ if ( !img.isNull() ) {
+ if ( width == 0 ) {
+ width = img.width();
+ if ( height != 0 ) {
+ width = img.width() * height / img.height();
+ }
+ }
+ if ( height == 0 ) {
+ height = img.height();
+ if ( width != img.width() ) {
+ height = img.height() * width / img.width();
+ }
+ }
+
+ if ( img.width() != width || img.height() != height ){
+ img = img.smoothScale(width, height);
+ width = img.width();
+ height = img.height();
+ }
+ pm.convertFromImage( img );
+ }
+ if ( !pm.isNull() ) {
+ QPixmapInt& pmi = pixmap_map->operator[](imgId);
+ pmi.pm = pm;
+ pmi.ref++;
+ }
+ }
+ if ( pm.mask() ) {
+ QRegion mask( *pm.mask() );
+ QRegion all( 0, 0, pm.width(), pm.height() );
+ reg = new QRegion( all.subtract( mask ) );
+ }
+ }
+
+ if ( pm.isNull() && (width*height)==0 )
+ width = height = 50;
+
+ place = PlaceInline;
+ if ( attr["align"] == "left" )
+ place = PlaceLeft;
+ else if ( attr["align"] == "right" )
+ place = PlaceRight;
+
+ tmpwidth = width;
+ tmpheight = height;
+
+ attributes = attr;
+}
+
+QTextImage::~QTextImage()
+{
+ if ( pixmap_map && pixmap_map->contains( imgId ) ) {
+ QPixmapInt& pmi = pixmap_map->operator[](imgId);
+ pmi.ref--;
+ if ( !pmi.ref ) {
+ pixmap_map->remove( imgId );
+ if ( pixmap_map->isEmpty() ) {
+ delete pixmap_map;
+ pixmap_map = 0;
+ }
+ }
+ }
+}
+
+QString QTextImage::richText() const
+{
+ QString s;
+ s += "<img ";
+ QMap<QString, QString>::ConstIterator it = attributes.begin();
+ for ( ; it != attributes.end(); ++it )
+ s += it.key() + "=" + *it + " ";
+ s += ">";
+ return s;
+}
+
+void QTextImage::adjustToPainter( QPainter* p )
+{
+ width = tmpwidth;
+ height = tmpheight;
+ if ( !is_printer( p ) )
+ return;
+ QPaintDeviceMetrics metrics(p->device());
+ width = int( width * scale_factor( metrics.logicalDpiX() ) );
+ height = int( height * scale_factor( metrics.logicalDpiY() ) );
+}
+
+#if !defined(Q_WS_X11)
+#include <qbitmap.h>
+#include <qcleanuphandler.h>
+static QPixmap *qrt_selection = 0;
+static QCleanupHandler<QPixmap> qrt_cleanup_pixmap;
+static void qrt_createSelectionPixmap( const QColorGroup &cg )
+{
+ qrt_selection = new QPixmap( 2, 2 );
+ qrt_cleanup_pixmap.add( qrt_selection );
+ qrt_selection->fill( Qt::color0 );
+ QBitmap m( 2, 2 );
+ m.fill( Qt::color1 );
+ QPainter p( &m );
+ p.setPen( Qt::color0 );
+ for ( int j = 0; j < 2; ++j ) {
+ p.drawPoint( j % 2, j );
+ }
+ p.end();
+ qrt_selection->setMask( m );
+ qrt_selection->fill( cg.highlight() );
+}
+#endif
+
+void QTextImage::draw( QPainter* p, int x, int y, int cx, int cy, int cw, int ch, const QColorGroup& cg, bool selected )
+{
+ if ( placement() != PlaceInline ) {
+ x = xpos;
+ y = ypos;
+ }
+
+ if ( pm.isNull() ) {
+ p->fillRect( x , y, width, height, cg.dark() );
+ return;
+ }
+
+ if ( is_printer( p ) ) {
+#ifndef QT_NO_TRANSFORMATIONS
+ p->saveWorldMatrix();
+ QPaintDeviceMetrics metrics( p->device() );
+ p->translate( x, y );
+ p->scale( scale_factor( metrics.logicalDpiY() ),
+ scale_factor( metrics.logicalDpiY() ) );
+ p->drawPixmap( 0, 0, pm );
+ p->restoreWorldMatrix();
+#else
+ p->drawPixmap( x, y, pm );
+#endif
+ return;
+ }
+
+ if ( placement() != PlaceInline && !QRect( xpos, ypos, width, height ).intersects( QRect( cx, cy, cw, ch ) ) )
+ return;
+
+ if ( placement() == PlaceInline )
+ p->drawPixmap( x , y, pm );
+ else
+ p->drawPixmap( cx , cy, pm, cx - x, cy - y, cw, ch );
+
+ if ( selected && placement() == PlaceInline && p->device()->devType() != QInternal::Printer ) {
+ p->save();
+#if defined(Q_WS_X11)
+ p->fillRect( QRect( QPoint( x, y ), pm.size() ), QBrush( cg.highlight(), QBrush::Dense4Pattern) );
+#else // in WIN32 Dense4Pattern doesn't work correctly (transparency problem), so work around it
+ if ( !qrt_selection )
+ qrt_createSelectionPixmap( cg );
+ p->drawTiledPixmap( x, y, pm.width(), pm.height(), *qrt_selection );
+#endif
+ }
+}
+
+void QTextHorizontalLine::adjustToPainter( QPainter* p )
+{
+ if ( !is_printer( p ) )
+ return;
+ QPaintDeviceMetrics metrics(p->device());
+ height = int( tmpheight * scale_factor( metrics.logicalDpiY() ) );
+}
+
+
+QTextHorizontalLine::QTextHorizontalLine( QTextDocument *p )
+ : QTextCustomItem( p )
+{
+ height = tmpheight = 8;
+}
+
+QTextHorizontalLine::~QTextHorizontalLine()
+{
+}
+
+QString QTextHorizontalLine::richText() const
+{
+ return "<hr>";
+}
+
+void QTextHorizontalLine::draw( QPainter* p, int x, int y, int , int , int , int , const QColorGroup& cg, bool selected )
+{
+ QRect r( x, y, width, height);
+ if ( is_printer( p ) || ( p && p->device() && p->device()->devType() == QInternal::Printer ) ) {
+ QPen oldPen = p->pen();
+ p->setPen( QPen( cg.text(), height/8 ) );
+ p->drawLine( r.left()-1, y + height / 2, r.right() + 1, y + height / 2 );
+ p->setPen( oldPen );
+ } else {
+ if ( selected )
+ p->fillRect( r.left(), y, r.right(), y + height, cg.highlight() );
+ qDrawShadeLine( p, r.left() - 1, y + height / 2, r.right() + 1, y + height / 2, cg, TRUE, height / 8 );
+ }
+}
+
+
+/*****************************************************************/
+// Small set of utility functions to make the parser a bit simpler
+//
+
+bool QTextDocument::hasPrefix(const QString& doc, int pos, QChar c)
+{
+ if ( pos >= (int)doc.length() )
+ return FALSE;
+ return ( doc.unicode() )[ pos ].lower() == c.lower();
+}
+
+bool QTextDocument::hasPrefix( const QString& doc, int pos, const QString& s )
+{
+ if ( pos + s.length() >= doc.length() )
+ return FALSE;
+ for ( int i = 0; i < (int)s.length(); i++ ) {
+ if ( ( doc.unicode() )[ pos + i ].lower() != s[ i ].lower() )
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static bool qt_is_cell_in_use( QPtrList<QTextTableCell>& cells, int row, int col )
+{
+ for ( QTextTableCell* c = cells.first(); c; c = cells.next() ) {
+ if ( row >= c->row() && row < c->row() + c->rowspan()
+ && col >= c->column() && col < c->column() + c->colspan() )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+QTextCustomItem* QTextDocument::parseTable( const QMap<QString, QString> &attr, const QTextFormat &fmt,
+ const QString &doc, int& pos, QTextParag *curpar )
+{
+
+ QTextTable* table = new QTextTable( this, attr );
+ int row = -1;
+ int col = -1;
+
+ QString rowbgcolor;
+ QString rowalign;
+ QString tablebgcolor = attr["bgcolor"];
+
+ QPtrList<QTextTableCell> multicells;
+
+ QString tagname;
+ (void) eatSpace(doc, pos);
+ while ( pos < int(doc.length() )) {
+ int beforePos = pos;
+ if (hasPrefix(doc, pos, QChar('<')) ){
+ if (hasPrefix(doc, pos+1, QChar('/'))) {
+ tagname = parseCloseTag( doc, pos );
+ if ( tagname == "table" ) {
+ pos = beforePos;
+#if defined(PARSER_DEBUG)
+ debug_indent.remove( debug_indent.length() - 3, 2 );
+#endif
+ return table;
+ }
+ } else {
+ QMap<QString, QString> attr2;
+ bool emptyTag = FALSE;
+ tagname = parseOpenTag( doc, pos, attr2, emptyTag );
+ if ( tagname == "tr" ) {
+ rowbgcolor = attr2["bgcolor"];
+ rowalign = attr2["align"];
+ row++;
+ col = -1;
+ }
+ else if ( tagname == "td" || tagname == "th" ) {
+ col++;
+ while ( qt_is_cell_in_use( multicells, row, col ) ) {
+ col++;
+ }
+
+ if ( row >= 0 && col >= 0 ) {
+ const QStyleSheetItem* s = sheet_->item(tagname);
+ if ( !attr2.contains("bgcolor") ) {
+ if (!rowbgcolor.isEmpty() )
+ attr2["bgcolor"] = rowbgcolor;
+ else if (!tablebgcolor.isEmpty() )
+ attr2["bgcolor"] = tablebgcolor;
+ }
+ if ( !attr2.contains("align") ) {
+ if (!rowalign.isEmpty() )
+ attr2["align"] = rowalign;
+ }
+
+ // extract the cell contents
+ int end = pos;
+ while ( end < (int) doc.length()
+ && !hasPrefix( doc, end, "</td")
+ && !hasPrefix( doc, end, "<td")
+ && !hasPrefix( doc, end, "</th")
+ && !hasPrefix( doc, end, "<th")
+ && !hasPrefix( doc, end, "<td")
+ && !hasPrefix( doc, end, "</tr")
+ && !hasPrefix( doc, end, "<tr")
+ && !hasPrefix( doc, end, "</table") ) {
+ if ( hasPrefix( doc, end, "<table" ) ) { // nested table
+ int nested = 1;
+ ++end;
+ while ( end < (int)doc.length() && nested != 0 ) {
+ if ( hasPrefix( doc, end, "</table" ) )
+ nested--;
+ if ( hasPrefix( doc, end, "<table" ) )
+ nested++;
+ end++;
+ }
+ }
+ end++;
+ }
+ QTextTableCell* cell = new QTextTableCell( table, row, col,
+ attr2, s, fmt.makeTextFormat( s, attr2 ),
+ contxt, *factory_, sheet_, doc.mid( pos, end - pos ) );
+ cell->richText()->parParag = curpar;
+ if ( cell->colspan() > 1 || cell->rowspan() > 1 )
+ multicells.append( cell );
+ col += cell->colspan()-1;
+ pos = end;
+ }
+ }
+ }
+
+ } else {
+ ++pos;
+ }
+ }
+#if defined(PARSER_DEBUG)
+ debug_indent.remove( debug_indent.length() - 3, 2 );
+#endif
+ return table;
+}
+
+bool QTextDocument::eatSpace(const QString& doc, int& pos, bool includeNbsp )
+{
+ int old_pos = pos;
+ while (pos < int(doc.length()) && (doc.unicode())[pos].isSpace() && ( includeNbsp || (doc.unicode())[pos] != QChar::nbsp ) )
+ pos++;
+ return old_pos < pos;
+}
+
+bool QTextDocument::eat(const QString& doc, int& pos, QChar c)
+{
+ bool ok = pos < int(doc.length()) && ((doc.unicode())[pos] == c);
+ if ( ok )
+ pos++;
+ return ok;
+}
+/*****************************************************************/
+
+
+
+static QMap<QCString, QChar> *html_map = 0;
+static void qt_cleanup_html_map()
+{
+ delete html_map;
+ html_map = 0;
+}
+
+static QMap<QCString, QChar> *htmlMap()
+{
+ if ( !html_map ) {
+ html_map = new QMap<QCString, QChar>;
+ qAddPostRoutine( qt_cleanup_html_map );
+ html_map->insert( "lt", '<');
+ html_map->insert( "gt", '>');
+ html_map->insert( "amp", '&');
+ html_map->insert( "nbsp", 0x00a0U);
+ html_map->insert( "bull", 0x2022U);
+ html_map->insert( "aring", '\xe5');
+ html_map->insert( "oslash", '\xf8');
+ html_map->insert( "ouml", '\xf6');
+ html_map->insert( "auml", '\xe4');
+ html_map->insert( "uuml", '\xfc');
+ html_map->insert( "Ouml", '\xd6');
+ html_map->insert( "Auml", '\xc4');
+ html_map->insert( "Uuml", '\xdc');
+ html_map->insert( "szlig", '\xdf');
+ html_map->insert( "copy", '\xa9');
+ html_map->insert( "deg", '\xb0');
+ html_map->insert( "micro", '\xb5');
+ html_map->insert( "plusmn", '\xb1');
+ html_map->insert( "middot", '*');
+ html_map->insert( "quot", '\"');
+ html_map->insert( "commat", '@');
+ html_map->insert( "num", '#');
+ html_map->insert( "dollar", '$');
+ html_map->insert( "ldquo", '`');
+ html_map->insert( "rdquo", '\'');
+ html_map->insert( "sol", '/' );
+ html_map->insert( "bsol", '\\');
+ html_map->insert( "lowbar", '_');
+ html_map->insert( "shy", '\xad');
+ }
+ return html_map;
+}
+
+QChar QTextDocument::parseHTMLSpecialChar(const QString& doc, int& pos)
+{
+ QCString s;
+ pos++;
+ int recoverpos = pos;
+ while ( pos < int(doc.length()) && (doc.unicode())[pos] != ';' && !(doc.unicode())[pos].isSpace() && pos < recoverpos + 6) {
+ s += (doc.unicode())[pos];
+ pos++;
+ }
+ if ((doc.unicode())[pos] != ';' && !(doc.unicode())[pos].isSpace() ) {
+ pos = recoverpos;
+ return '&';
+ }
+ pos++;
+
+ if ( s.length() > 1 && s[0] == '#') {
+ int num = s.mid(1).toInt();
+ if ( num == 151 ) // ### hack for designer manual
+ return '-';
+ return num;
+ }
+
+ QMap<QCString, QChar>::Iterator it = htmlMap()->find(s);
+ if ( it != htmlMap()->end() ) {
+ return *it;
+ }
+
+ pos = recoverpos;
+ return '&';
+}
+
+QString QTextDocument::parseWord(const QString& doc, int& pos, bool lower)
+{
+ QString s;
+
+ if ((doc.unicode())[pos] == '"') {
+ pos++;
+ while ( pos < int(doc.length()) && (doc.unicode())[pos] != '"' ) {
+ s += (doc.unicode())[pos];
+ pos++;
+ }
+ eat(doc, pos, '"');
+ } else {
+ static QString term = QString::fromLatin1("/>");
+ while( pos < int(doc.length()) &&
+ ((doc.unicode())[pos] != '>' && !hasPrefix( doc, pos, term))
+ && (doc.unicode())[pos] != '<'
+ && (doc.unicode())[pos] != '='
+ && !(doc.unicode())[pos].isSpace())
+ {
+ if ( (doc.unicode())[pos] == '&')
+ s += parseHTMLSpecialChar( doc, pos );
+ else {
+ s += (doc.unicode())[pos];
+ pos++;
+ }
+ }
+ if (lower)
+ s = s.lower();
+ }
+ return s;
+}
+
+QChar QTextDocument::parseChar(const QString& doc, int& pos, QStyleSheetItem::WhiteSpaceMode wsm )
+{
+ if ( pos >= int(doc.length() ) )
+ return QChar::null;
+
+ QChar c = (doc.unicode())[pos++];
+
+ if (c == '<' )
+ return QChar::null;
+
+ if ( c.isSpace() && c != QChar::nbsp ) {
+ if ( wsm == QStyleSheetItem::WhiteSpacePre ) {
+ if ( c == ' ' )
+ return QChar::nbsp;
+ else
+ return c;
+ } else { // non-pre mode: collapse whitespace except nbsp
+ while ( pos< int(doc.length() ) &&
+ (doc.unicode())[pos].isSpace() && (doc.unicode())[pos] != QChar::nbsp )
+ pos++;
+ if ( wsm == QStyleSheetItem::WhiteSpaceNoWrap )
+ return QChar::nbsp;
+ else
+ return ' ';
+ }
+ }
+ else if ( c == '&' )
+ return parseHTMLSpecialChar( doc, --pos );
+ else
+ return c;
+}
+
+QString QTextDocument::parseOpenTag(const QString& doc, int& pos,
+ QMap<QString, QString> &attr, bool& emptyTag)
+{
+ emptyTag = FALSE;
+ pos++;
+ if ( hasPrefix(doc, pos, '!') ) {
+ if ( hasPrefix( doc, pos+1, "--")) {
+ pos += 3;
+ // eat comments
+ QString pref = QString::fromLatin1("-->");
+ while ( !hasPrefix(doc, pos, pref ) && pos < int(doc.length()) )
+ pos++;
+ if ( hasPrefix(doc, pos, pref ) ) {
+ pos += 3;
+ eatSpace(doc, pos, TRUE);
+ }
+ emptyTag = TRUE;
+ return QString::null;
+ }
+ else {
+ // eat strange internal tags
+ while ( !hasPrefix(doc, pos, '>') && pos < int(doc.length()) )
+ pos++;
+ if ( hasPrefix(doc, pos, '>') ) {
+ pos++;
+ eatSpace(doc, pos, TRUE);
+ }
+ return QString::null;
+ }
+ }
+
+ QString tag = parseWord(doc, pos );
+ eatSpace(doc, pos, TRUE);
+ static QString term = QString::fromLatin1("/>");
+ static QString s_TRUE = QString::fromLatin1("TRUE");
+
+ while ((doc.unicode())[pos] != '>' && ! (emptyTag = hasPrefix(doc, pos, term) )) {
+ QString key = parseWord(doc, pos );
+ eatSpace(doc, pos, TRUE);
+ if ( key.isEmpty()) {
+ // error recovery
+ while ( pos < int(doc.length()) && (doc.unicode())[pos] != '>' )
+ pos++;
+ break;
+ }
+ QString value;
+ if (hasPrefix(doc, pos, '=') ){
+ pos++;
+ eatSpace(doc, pos);
+ value = parseWord(doc, pos, FALSE);
+ }
+ else
+ value = s_TRUE;
+ attr.insert(key, value );
+ eatSpace(doc, pos, TRUE);
+ }
+
+ if (emptyTag) {
+ eat(doc, pos, '/');
+ eat(doc, pos, '>');
+ }
+ else
+ eat(doc, pos, '>');
+
+ return tag;
+}
+
+QString QTextDocument::parseCloseTag( const QString& doc, int& pos )
+{
+ pos++;
+ pos++;
+ QString tag = parseWord(doc, pos );
+ eatSpace(doc, pos, TRUE);
+ eat(doc, pos, '>');
+ return tag;
+}
+
+QTextFlow::QTextFlow()
+{
+ width = height = pagesize = 0;
+ leftItems.setAutoDelete( FALSE );
+ rightItems.setAutoDelete( FALSE );
+}
+
+QTextFlow::~QTextFlow()
+{
+}
+
+void QTextFlow::clear()
+{
+ leftItems.clear();
+ rightItems.clear();
+}
+
+void QTextFlow::setWidth( int w )
+{
+ height = 0;
+ width = w;
+}
+
+int QTextFlow::adjustLMargin( int yp, int, int margin, int space )
+{
+ for ( QTextCustomItem* item = leftItems.first(); item; item = leftItems.next() ) {
+ if ( item->y() == -1 )
+ continue;
+ if ( yp >= item->y() && yp < item->y() + item->height )
+ margin = QMAX( margin, item->x() + item->width + space );
+ }
+ return margin;
+}
+
+int QTextFlow::adjustRMargin( int yp, int, int margin, int space )
+{
+ for ( QTextCustomItem* item = rightItems.first(); item; item = rightItems.next() ) {
+ if ( item->y() == -1 )
+ continue;
+ if ( yp >= item->y() && yp < item->y() + item->height )
+ margin = QMAX( margin, width - item->x() - space );
+ }
+ return margin;
+}
+
+void QTextFlow::adjustFlow( int &yp, int , int h, QTextParag *, bool pages )
+{
+ if ( pages && pagesize > 0 ) { // check pages
+ int ty = yp;
+ int yinpage = ty % pagesize;
+ if ( yinpage < 2 )
+ yp += 2 - yinpage;
+ else
+ if ( yinpage + h > pagesize - 2 )
+ yp += ( pagesize - yinpage ) + 2;
+ }
+
+ if ( yp + h > height )
+ {
+ height = yp + h;
+ //qDebug("QTextFlow::adjustFlow now height=%d",height);
+ }
+}
+
+void QTextFlow::unregisterFloatingItem( QTextCustomItem* item )
+{
+ leftItems.removeRef( item );
+ rightItems.removeRef( item );
+}
+
+void QTextFlow::registerFloatingItem( QTextCustomItem* item, bool right )
+{
+ if ( right ) {
+ if ( !rightItems.contains( item ) )
+ rightItems.append( item );
+ } else if ( !leftItems.contains( item ) ) {
+ leftItems.append( item );
+ }
+}
+
+void QTextFlow::drawFloatingItems( QPainter* p, int cx, int cy, int cw, int ch, const QColorGroup& cg, bool selected )
+{
+ QTextCustomItem *item;
+ for ( item = leftItems.first(); item; item = leftItems.next() ) {
+ if ( item->x() == -1 || item->y() == -1 )
+ continue;
+ item->draw( p, item->x(), item->y(), cx, cy, cw, ch, cg, selected );
+ }
+
+ for ( item = rightItems.first(); item; item = rightItems.next() ) {
+ if ( item->x() == -1 || item->y() == -1 )
+ continue;
+ item->draw( p, item->x(), item->y(), cx, cy, cw, ch, cg, selected );
+ }
+}
+
+void QTextFlow::updateHeight( QTextCustomItem *i )
+{
+ height = QMAX( height, i->y() + i->height );
+}
+
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+QTextTable::QTextTable( QTextDocument *p, const QMap<QString, QString> & attr )
+ : QTextCustomItem( p ), painter( 0 )
+{
+ cells.setAutoDelete( FALSE );
+#if defined(PARSER_DEBUG)
+ debug_indent += "\t";
+ qDebug( debug_indent + "new QTextTable (%p)", this );
+ debug_indent += "\t";
+#endif
+ cellspacing = 2;
+ if ( attr.contains("cellspacing") )
+ cellspacing = attr["cellspacing"].toInt();
+ cellpadding = 1;
+ if ( attr.contains("cellpadding") )
+ cellpadding = attr["cellpadding"].toInt();
+ border = 0;
+ innerborder = us_ib = 1;
+ if ( attr.contains("border" ) ) {
+ QString s( attr["border"] );
+ if ( s == "TRUE" )
+ border = 1;
+ else
+ border = attr["border"].toInt();
+ }
+ us_b = border;
+
+ if ( border )
+ cellspacing += 2;
+ us_cs = cellspacing;
+ outerborder = cellspacing + border;
+ us_ob = outerborder;
+ layout = new QGridLayout( 1, 1, cellspacing );
+
+ fixwidth = 0;
+ stretch = 0;
+ if ( attr.contains("width") ) {
+ bool b;
+ QString s( attr["width"] );
+ int w = s.toInt( &b );
+ if ( b ) {
+ fixwidth = w;
+ } else {
+ s = s.stripWhiteSpace();
+ if ( s.length() > 1 && s[ (int)s.length()-1 ] == '%' )
+ stretch = s.left( s.length()-1).toInt();
+ }
+ }
+
+ place = PlaceInline;
+ if ( attr["align"] == "left" )
+ place = PlaceLeft;
+ else if ( attr["align"] == "right" )
+ place = PlaceRight;
+ cachewidth = 0;
+ attributes = attr;
+}
+
+QTextTable::~QTextTable()
+{
+ delete layout;
+}
+
+QString QTextTable::richText() const
+{
+ QString s;
+ s = "<table ";
+ QMap<QString, QString>::ConstIterator it = attributes.begin();
+ for ( ; it != attributes.end(); ++it )
+ s += it.key() + "=" + *it + " ";
+ s += ">\n";
+
+ int lastRow = -1;
+ bool needEnd = FALSE;
+ QPtrListIterator<QTextTableCell> it2( cells );
+ while ( it2.current() ) {
+ QTextTableCell *cell = it2.current();
+ ++it2;
+ if ( lastRow != cell->row() ) {
+ if ( lastRow != -1 )
+ s += "</tr>\n";
+ s += "<tr>";
+ lastRow = cell->row();
+ needEnd = TRUE;
+ }
+ s += "<td ";
+ it = cell->attributes.begin();
+ for ( ; it != cell->attributes.end(); ++it )
+ s += it.key() + "=" + *it + " ";
+ s += ">";
+ s += cell->richText()->richText();
+ s += "</td>";
+ }
+ if ( needEnd )
+ s += "</tr>\n";
+ s += "</table>\n";
+ return s;
+}
+
+void QTextTable::adjustToPainter( QPainter* p)
+{
+ painter = p;
+ if ( is_printer( p ) ) {
+ QPaintDeviceMetrics metrics(p->device());
+ double xscale = QMAX( scale_factor( metrics.logicalDpiX() ),
+ scale_factor( metrics.logicalDpiY() ) );
+ xscale = QMAX( xscale, 1 );
+ cellspacing = int(us_cs * xscale);
+ border = int(us_b * xscale);
+ innerborder = int(us_ib * xscale);
+ outerborder = int(us_ob * xscale);
+ }
+ for ( QTextTableCell* cell = cells.first(); cell; cell = cells.next() )
+ cell->adjustToPainter();
+
+ width = 0;
+}
+
+void QTextTable::verticalBreak( int yt, QTextFlow* flow )
+{
+ if ( flow->pageSize() <= 0 )
+ return;
+ int shift = 0;
+ for (QTextTableCell* cell = cells.first(); cell; cell = cells.next() ) {
+ QRect r = cell->geometry();
+ r.moveBy(0, shift );
+ cell->setGeometry( r );
+ if ( cell->column() == 0 ) {
+ int y = yt + outerborder + cell->geometry().y();
+ int oldy = y;
+ flow->adjustFlow( y, width, cell->geometry().height() + 2*cellspacing, 0 );
+ shift += y - oldy;
+ r = cell->geometry();
+ r.moveBy(0, y - oldy );
+ cell->setGeometry( r );
+ }
+ }
+ height += shift;
+}
+
+void QTextTable::draw(QPainter* p, int x, int y, int cx, int cy, int cw, int ch, const QColorGroup& cg, bool selected )
+{
+ if ( placement() != PlaceInline ) {
+ x = xpos;
+ y = ypos;
+ }
+
+ lastX = x;
+ lastY = y;
+
+ painter = p;
+
+ for (QTextTableCell* cell = cells.first(); cell; cell = cells.next() ) {
+ if ( cx < 0 && cy < 0 ||
+ QRect( cx, cy, cw, ch ).intersects( QRect( x + outerborder + cell->geometry().x(),
+ y + outerborder + cell->geometry().y(),
+ cell->geometry().width(), cell->geometry().height() ) ) ) {
+ cell->draw( x+outerborder, y+outerborder, cx, cy, cw, ch, cg, selected );
+ if ( border ) {
+ QRect r( x+outerborder+cell->geometry().x() - us_ib,
+ y+outerborder+cell->geometry().y() - us_ib,
+ cell->geometry().width() + 2 * us_ib,
+ cell->geometry().height() + 2 * us_ib );
+ int s = cellspacing;
+ if ( is_printer( p ) || ( p && p->device() && p->device()->devType() == QInternal::Printer ) ) {
+ qDrawPlainRect( p, r, cg.text(), us_ib );
+ } else {
+ p->fillRect( r.left()-s, r.top(), s, r.height(), cg.button() );
+ p->fillRect( r.right(), r.top(), s, r.height(), cg.button() );
+ p->fillRect( r.left()-s, r.top()-s, r.width()+2*s, s, cg.button() );
+ p->fillRect( r.left()-s, r.bottom(), r.width()+2*s, s, cg.button() );
+ qDrawShadePanel( p, r, cg, TRUE, us_ib );
+ }
+ }
+ }
+ }
+ if ( border ) {
+ QRect r ( x, y, width, height );
+ if ( is_printer( p ) || ( p && p->device() && p->device()->devType() == QInternal::Printer ) ) {
+ qDrawPlainRect( p, QRect(QMAX( 0, r.x()+1 ), QMAX( 0, r.y()+1 ), QMAX( r.width()-2, 0 ), QMAX( 0, r.height()-2 ) ), cg.text(), us_b );
+ } else {
+ int s = border;
+ p->fillRect( r.left(), r.top(), s, r.height(), cg.button() );
+ p->fillRect( r.right()-s, r.top(), s, r.height(), cg.button() );
+ p->fillRect( r.left(), r.top(), r.width(), s, cg.button() );
+ p->fillRect( r.left(), r.bottom()-s, r.width(), s, cg.button() );
+ qDrawShadePanel( p, r, cg, FALSE, us_b );
+ }
+ }
+
+#if defined(DEBUG_TABLE_RENDERING)
+ p->save();
+ p->setPen( Qt::red );
+ p->drawRect( x, y, width, height );
+ p->restore();
+#endif
+}
+
+void QTextTable::resize( QPainter* p, int nwidth )
+{
+ if ( fixwidth && cachewidth != 0 )
+ return;
+ if ( nwidth == cachewidth )
+ return;
+ cachewidth = nwidth;
+ int w = nwidth;
+ painter = p;
+ if ( is_printer( painter ) ) {
+ adjustToPainter( painter );
+ } else {
+ painter = 0;
+ }
+ format( w );
+ if ( nwidth >= 32000 )
+ nwidth = w;
+ if ( stretch )
+ nwidth = nwidth * stretch / 100;
+
+ width = nwidth + 2*outerborder;
+ layout->invalidate();
+ int shw = layout->sizeHint().width() + 2*outerborder;
+ int mw = layout->minimumSize().width() + 2*outerborder;
+ if ( stretch )
+ width = QMAX( mw, nwidth );
+ else
+ width = QMAX( mw, QMIN( nwidth, shw ) );
+
+ if ( fixwidth )
+ width = fixwidth;
+
+ layout->invalidate();
+ mw = layout->minimumSize().width() + 2*outerborder;
+ width = QMAX( width, mw );
+
+ int h = layout->heightForWidth( width-2*outerborder );
+ layout->setGeometry( QRect(0, 0, width-2*outerborder, h) );
+ height = layout->geometry().height()+2*outerborder;
+};
+
+void QTextTable::format( int &w )
+{
+ for ( int i = 0; i < (int)cells.count(); ++i ) {
+ QTextTableCell *cell = cells.at( i );
+ cell->richText()->doLayout( painter, QWIDGETSIZE_MAX );
+ cell->cached_sizehint = cell->richText()->widthUsed() + 2 * ( innerborder + 4 );
+ if ( cell->cached_sizehint > 32000 ) // nested table in paragraph
+ cell->cached_sizehint = cell->minimumSize().width();
+ cell->richText()->doLayout( painter, cell->cached_sizehint );
+ cell->cached_width = -1;
+ }
+ w = widthHint();
+ layout->invalidate();
+ layout->activate();
+ width = minimumWidth();
+}
+
+void QTextTable::addCell( QTextTableCell* cell )
+{
+ cells.append( cell );
+ layout->addMultiCell( cell, cell->row(), cell->row() + cell->rowspan()-1,
+ cell->column(), cell->column() + cell->colspan()-1 );
+}
+
+void QTextTable::enter( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy, bool atEnd )
+{
+ currCell.remove( c );
+ if ( !atEnd ) {
+ next( c, doc, parag, idx, ox, oy );
+ } else {
+ currCell.insert( c, cells.count() );
+ prev( c, doc, parag, idx, ox, oy );
+ }
+}
+
+void QTextTable::enterAt( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy, const QPoint &pos )
+{
+ currCell.remove( c );
+ int lastCell = -1;
+ int lastY = -1;
+ for ( int i = 0; i < (int)cells.count(); ++i ) {
+ QTextTableCell *cell = cells.at( i );
+ if ( !cell )
+ continue;
+ if ( cell->geometry().x() - innerborder <= pos.x() &&
+ cell->geometry().x() + cell->geometry().width() + innerborder >= pos.x() ) {
+ if ( cell->geometry().y() > lastY ) {
+ lastCell = i;
+ lastY = cell->geometry().y();
+ }
+ if ( cell->geometry().y() - innerborder <= pos.y() &&
+ cell->geometry().y() + cell->geometry().height() + innerborder >= pos.y() ) {
+ currCell.insert( c, i );
+ break;
+ }
+ }
+ }
+
+ if ( currCell.find( c ) == currCell.end() ) {
+ if ( lastY != -1 )
+ currCell.insert( c, lastCell );
+ }
+
+ QTextTableCell *cell = cells.at( *currCell.find( c ) );
+ if ( !cell )
+ return;
+ doc = cell->richText();
+ parag = doc->firstParag();
+ idx = 0;
+ ox += cell->geometry().x() + outerborder + parent->x();
+ oy += cell->geometry().y() + outerborder;
+}
+
+void QTextTable::next( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy )
+{
+ int cc = *currCell.find( c );
+ if ( cc > (int)cells.count() - 1 || cc < 0 )
+ cc = -1;
+ currCell.remove( c );
+ currCell.insert( c, ++cc );
+ if ( cc >= (int)cells.count() ) {
+ currCell.insert( c, 0 );
+ QTextCustomItem::next( c, doc, parag, idx, ox, oy );
+ QTextTableCell *cell = cells.at( 0 );
+ if ( !cell )
+ return;
+ doc = cell->richText();
+ idx = -1;
+ return;
+ }
+
+ QTextTableCell *cell = cells.at( *currCell.find( c ) );
+ if ( !cell )
+ return;
+ doc = cell->richText();
+ parag = doc->firstParag();
+ idx = 0;
+ ox += cell->geometry().x() + outerborder + parent->x();
+ oy += cell->geometry().y() + outerborder;
+}
+
+void QTextTable::prev( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy )
+{
+ int cc = *currCell.find( c );
+ if ( cc > (int)cells.count() - 1 || cc < 0 )
+ cc = cells.count();
+ currCell.remove( c );
+ currCell.insert( c, --cc );
+ if ( cc < 0 ) {
+ currCell.insert( c, 0 );
+ QTextCustomItem::prev( c, doc, parag, idx, ox, oy );
+ QTextTableCell *cell = cells.at( 0 );
+ if ( !cell )
+ return;
+ doc = cell->richText();
+ idx = -1;
+ return;
+ }
+
+ QTextTableCell *cell = cells.at( *currCell.find( c ) );
+ if ( !cell )
+ return;
+ doc = cell->richText();
+ parag = doc->firstParag();
+ idx = parag->length() - 1;
+ ox += cell->geometry().x() + outerborder + parent->x();
+ oy += cell->geometry().y() + outerborder;
+}
+
+void QTextTable::down( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy )
+{
+ QTextTableCell *cell = cells.at( *currCell.find( c ) );
+ if ( cell->row_ == layout->numRows() - 1 ) {
+ currCell.insert( c, 0 );
+ QTextCustomItem::down( c, doc, parag, idx, ox, oy );
+ QTextTableCell *cell = cells.at( 0 );
+ if ( !cell )
+ return;
+ doc = cell->richText();
+ idx = -1;
+ return;
+ }
+
+ int oldRow = cell->row_;
+ int oldCol = cell->col_;
+ int cc = *currCell.find( c );
+ for ( int i = cc; i < (int)cells.count(); ++i ) {
+ cell = cells.at( i );
+ if ( cell->row_ > oldRow && cell->col_ == oldCol ) {
+ currCell.insert( c, i );
+ break;
+ }
+ }
+ doc = cell->richText();
+ if ( !cell )
+ return;
+ parag = doc->firstParag();
+ idx = 0;
+ ox += cell->geometry().x() + outerborder + parent->x(),
+ oy += cell->geometry().y() + outerborder;
+}
+
+void QTextTable::up( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy )
+{
+ QTextTableCell *cell = cells.at( *currCell.find( c ) );
+ if ( cell->row_ == 0 ) {
+ currCell.insert( c, 0 );
+ QTextCustomItem::up( c, doc, parag, idx, ox, oy );
+ QTextTableCell *cell = cells.at( 0 );
+ if ( !cell )
+ return;
+ doc = cell->richText();
+ idx = -1;
+ return;
+ }
+
+ int oldRow = cell->row_;
+ int oldCol = cell->col_;
+ int cc = *currCell.find( c );
+ for ( int i = cc; i >= 0; --i ) {
+ cell = cells.at( i );
+ if ( cell->row_ < oldRow && cell->col_ == oldCol ) {
+ currCell.insert( c, i );
+ break;
+ }
+ }
+ doc = cell->richText();
+ if ( !cell )
+ return;
+ parag = doc->lastParag();
+ idx = parag->length() - 1;
+ ox += cell->geometry().x() + outerborder + parent->x();
+ oy += cell->geometry().y() + outerborder;
+}
+
+QTextTableCell::QTextTableCell( QTextTable* table,
+ int row, int column,
+ const QMap<QString, QString> &attr,
+ const QStyleSheetItem* /*style*/, // ### use them
+ const QTextFormat& /*fmt*/, const QString& context,
+ QMimeSourceFactory &factory, QStyleSheet *sheet,
+ const QString& doc)
+{
+#if defined(PARSER_DEBUG)
+ qDebug( debug_indent + "new QTextTableCell1 (pappi: %p)", table );
+ qDebug( debug_indent + doc );
+#endif
+ cached_width = -1;
+ cached_sizehint = -1;
+
+ maxw = QWIDGETSIZE_MAX;
+ minw = 0;
+
+ parent = table;
+ row_ = row;
+ col_ = column;
+ stretch_ = 0;
+ richtext = new QTextDocument( table->parent );
+ richtext->setTableCell( this );
+ QString align = *attr.find( "align" );
+ if ( !align.isEmpty() ) {
+ if ( align.lower() == "left" )
+ richtext->setAlignment( Qt::AlignLeft );
+ else if ( align.lower() == "center" )
+ richtext->setAlignment( Qt::AlignHCenter );
+ else if ( align.lower() == "right" )
+ richtext->setAlignment( Qt::AlignRight );
+ }
+ richtext->setFormatter( table->parent->formatter() );
+ richtext->setUseFormatCollection( table->parent->useFormatCollection() );
+ richtext->setMimeSourceFactory( &factory );
+ richtext->setStyleSheet( sheet );
+ richtext->setDefaultFont( table->parent->formatCollection()->defaultFormat()->font() );
+ richtext->setRichText( doc, context );
+ rowspan_ = 1;
+ colspan_ = 1;
+ if ( attr.contains("colspan") )
+ colspan_ = attr["colspan"].toInt();
+ if ( attr.contains("rowspan") )
+ rowspan_ = attr["rowspan"].toInt();
+
+ background = 0;
+ if ( attr.contains("bgcolor") ) {
+ background = new QBrush(QColor( attr["bgcolor"] ));
+ }
+
+ hasFixedWidth = FALSE;
+ if ( attr.contains("width") ) {
+ bool b;
+ QString s( attr["width"] );
+ int w = s.toInt( &b );
+ if ( b ) {
+ maxw = w;
+ minw = maxw;
+ hasFixedWidth = TRUE;
+ } else {
+ s = s.stripWhiteSpace();
+ if ( s.length() > 1 && s[ (int)s.length()-1 ] == '%' )
+ stretch_ = s.left( s.length()-1).toInt();
+ }
+ }
+
+ attributes = attr;
+
+ parent->addCell( this );
+}
+
+QTextTableCell::QTextTableCell( QTextTable* table, int row, int column )
+{
+#if defined(PARSER_DEBUG)
+ qDebug( debug_indent + "new QTextTableCell2( pappi: %p", table );
+#endif
+ maxw = QWIDGETSIZE_MAX;
+ minw = 0;
+ cached_width = -1;
+ cached_sizehint = -1;
+
+ parent = table;
+ row_ = row;
+ col_ = column;
+ stretch_ = 0;
+ richtext = new QTextDocument( table->parent );
+ richtext->setTableCell( this );
+ richtext->setFormatter( table->parent->formatter() );
+ richtext->setUseFormatCollection( table->parent->useFormatCollection() );
+ richtext->setDefaultFont( table->parent->formatCollection()->defaultFormat()->font() );
+ richtext->setRichText( "<html></html>", QString::null );
+ rowspan_ = 1;
+ colspan_ = 1;
+ background = 0;
+ hasFixedWidth = FALSE;
+ parent->addCell( this );
+}
+
+
+QTextTableCell::~QTextTableCell()
+{
+ delete background;
+ background = 0;
+ delete richtext;
+ richtext = 0;
+}
+
+QSize QTextTableCell::sizeHint() const
+{
+ if ( cached_sizehint != -1 )
+ return QSize( cached_sizehint, 0 );
+ QTextTableCell *that = (QTextTableCell*)this;
+ if ( stretch_ )
+ return QSize( ( that->cached_sizehint = QWIDGETSIZE_MAX ), 0 );
+ return QSize( ( that->cached_sizehint = richtext->widthUsed() + 2 * ( table()->innerborder + 4 ) ), 0 );
+}
+
+QSize QTextTableCell::minimumSize() const
+{
+ if ( stretch_ )
+ return QSize( QMAX( minw, parent->width * stretch_ / 100 - 2*parent->cellspacing), 0 );
+ return QSize(QMAX( richtext->minimumWidth(), minw ),0);
+}
+
+QSize QTextTableCell::maximumSize() const
+{
+ return QSize( QWIDGETSIZE_MAX, QWIDGETSIZE_MAX );
+}
+
+QSizePolicy::ExpandData QTextTableCell::expanding() const
+{
+ return QSizePolicy::BothDirections;
+}
+
+bool QTextTableCell::isEmpty() const
+{
+ return FALSE;
+}
+void QTextTableCell::setGeometry( const QRect& r )
+{
+ if ( r.width() != cached_width )
+ richtext->doLayout( painter(), r.width() );
+ cached_width = r.width();
+ richtext->setWidth( r.width() );
+ richtext->flow()->height = r.height();
+ geom = r;
+}
+
+QRect QTextTableCell::geometry() const
+{
+ return geom;
+}
+
+bool QTextTableCell::hasHeightForWidth() const
+{
+ return TRUE;
+}
+
+int QTextTableCell::heightForWidth( int w ) const
+{
+ w = QMAX( minw, w );
+
+ if ( cached_width != w ) {
+ QTextTableCell* that = (QTextTableCell*) this;
+ that->richtext->doLayout( painter(), w );
+ that->cached_width = w;
+ }
+ return richtext->height() + 2 * parent->innerborder;
+}
+
+void QTextTableCell::adjustToPainter()
+{
+ if ( !is_printer( painter() ) )
+ return;
+ richtext->formatCollection()->setPainter( painter() );
+ QTextParag *parag = richtext->firstParag();
+ while ( parag ) {
+ parag->setPainter( painter() );
+ parag = parag->next();
+ }
+}
+
+QPainter* QTextTableCell::painter() const
+{
+ return parent->painter;
+}
+
+void QTextTableCell::draw( int x, int y, int cx, int cy, int cw, int ch, const QColorGroup& cg, bool )
+{
+ if ( cached_width != geom.width() ) {
+ richtext->doLayout( painter(), geom.width() );
+ cached_width = geom.width();
+ }
+ QColorGroup g( cg );
+ if ( background )
+ g.setBrush( QColorGroup::Base, *background );
+ else if ( richtext->paper() )
+ g.setBrush( QColorGroup::Base, *richtext->paper() );
+
+ painter()->save();
+ painter()->translate( x + geom.x(), y + geom.y() );
+ if ( background )
+ painter()->fillRect( 0, 0, geom.width(), geom.height(), *background );
+ else if ( richtext->paper() )
+ painter()->fillRect( 0, 0, geom.width(), geom.height(), *richtext->paper() );
+
+ QRegion r;
+ QTextCursor *c = 0;
+ if ( richtext->parent()->tmpCursor )
+ c = richtext->parent()->tmpCursor;
+ if ( cx >= 0 && cy >= 0 )
+ richtext->draw( painter(), cx - ( x + geom.x() ), cy - ( y + geom.y() ), cw, ch, g, FALSE, (c != 0), c );
+ else
+ richtext->draw( painter(), -1, -1, -1, -1, g, FALSE, (c != 0), c );
+
+#if defined(DEBUG_TABLE_RENDERING)
+ painter()->save();
+ painter()->setPen( Qt::blue );
+ painter()->drawRect( 0, 0, geom.width(), geom.height() );
+ painter()->restore();
+#endif
+
+ painter()->restore();
+}
+
+
+///// Some of this is in qrichtext_p.cpp in qt-rsync at the moment
+
+QTextFormat::QTextFormat()
+ : fm( QFontMetrics( fn ) ), linkColor( TRUE ), logicalFontSize( 3 ), stdPointSize( qApp->font().pointSize() ),
+ painter( 0 ), different( NoFlags )
+{
+ ref = 0;
+ missp = FALSE;
+ ha = AlignNormal;
+ collection = 0;
+//#ifdef DEBUG_COLLECTION
+// qDebug("QTextFormat simple ctor, no addRef ! %p",this);
+//#endif
+}
+
+QTextFormat::QTextFormat( const QStyleSheetItem *style )
+ : fm( QFontMetrics( fn ) ), linkColor( TRUE ), logicalFontSize( 3 ), stdPointSize( qApp->font().pointSize() ),
+ painter( 0 ), different( NoFlags )
+{
+#ifdef DEBUG_COLLECTION
+ qDebug("QTextFormat::QTextFormat( const QStyleSheetItem *style )");
+#endif
+ ref = 0;
+ this->style = style->name();
+ missp = FALSE;
+ ha = AlignNormal;
+ collection = 0;
+ fn = QFont( style->fontFamily(),
+ style->fontSize(),
+ style->fontWeight(),
+ style->fontItalic() );
+ fn.setUnderline( style->fontUnderline() );
+ col = style->color();
+ fm = QFontMetrics( fn );
+ leftBearing = fm.minLeftBearing();
+ rightBearing = fm.minRightBearing();
+ hei = fm.height();
+ asc = fm.ascent();
+ dsc = fm.descent();
+ missp = FALSE;
+ ha = AlignNormal;
+ memset( widths, 0, 256 );
+ generateKey();
+ addRef();
+ updateStyleFlags();
+}
+
+QTextFormat::QTextFormat( const QFont &f, const QColor &c, QTextFormatCollection * coll )
+ : fn( f ), col( c ), fm( QFontMetrics( f ) ), linkColor( TRUE ),
+ logicalFontSize( 3 ), stdPointSize( f.pointSize() ), painter( 0 ),
+ different( NoFlags )
+{
+#ifdef DEBUG_COLLECTION
+ qDebug("QTextFormat with font & color & coll (%p), addRef. %p",coll,this);
+#endif
+ ref = 0;
+ collection = coll;
+ leftBearing = fm.minLeftBearing();
+ rightBearing = fm.minRightBearing();
+ hei = fm.height();
+ asc = fm.ascent();
+ dsc = fm.descent();
+ missp = FALSE;
+ ha = AlignNormal;
+ memset( widths, 0, 256 );
+ generateKey();
+ addRef();
+ updateStyleFlags();
+}
+
+QTextFormat::QTextFormat( const QTextFormat &f )
+ : fm( f.fm )
+{
+#ifdef DEBUG_COLLECTION
+ //qDebug("QTextFormat::QTextFormat %p copy ctor (copying %p). Will addRef.",this,&f);
+#endif
+ ref = 0;
+ collection = 0;
+ fn = f.fn;
+ col = f.col;
+ painter = f.painter;
+ leftBearing = f.leftBearing;
+ rightBearing = f.rightBearing;
+ memset( widths, 0, 256 );
+ hei = f.hei;
+ asc = f.asc;
+ dsc = f.dsc;
+ stdPointSize = f.stdPointSize;
+ logicalFontSize = f.logicalFontSize;
+ missp = f.missp;
+ ha = f.ha;
+ k = f.k;
+ anchor_name = f.anchor_name;
+ anchor_href = f.anchor_href;
+ linkColor = f.linkColor;
+ style = f.style;
+ different = f.different;
+ addRef();
+}
+
+QTextFormat& QTextFormat::operator=( const QTextFormat &f )
+{
+#ifdef DEBUG_COLLECTION
+ qDebug("QTextFormat::operator= %p (copying %p). Will addRef",this,&f);
+#endif
+ ref = 0;
+ collection = f.collection;
+ fn = f.fn;
+ col = f.col;
+ fm = f.fm;
+ leftBearing = f.leftBearing;
+ rightBearing = f.rightBearing;
+ memset( widths, 0, 256 );
+ hei = f.hei;
+ asc = f.asc;
+ dsc = f.dsc;
+ stdPointSize = f.stdPointSize;
+ logicalFontSize = f.logicalFontSize;
+ missp = f.missp;
+ ha = f.ha;
+ k = f.k;
+ anchor_name = f.anchor_name;
+ anchor_href = f.anchor_href;
+ linkColor = f.linkColor;
+ style = f.style;
+ different = f.different;
+ addRef();
+ return *this;
+}
+
+void QTextFormat::update()
+{
+ fm = QFontMetrics( fn );
+ leftBearing = fm.minLeftBearing();
+ rightBearing = fm.minRightBearing();
+ hei = fm.height();
+ asc = fm.ascent();
+ dsc = fm.descent();
+ memset( widths, 0, 256 );
+ generateKey();
+ updateStyleFlags();
+}
+
+void QTextFormat::addRef()
+{
+ ref++;
+#ifdef DEBUG_COLLECTION
+ if ( collection )
+ qDebug( " add ref of '%s' to %d (%p) (coll %p)", k.latin1(), ref, this, collection );
+#endif
+}
+
+void QTextFormat::removeRef()
+{
+ ref--;
+ if ( !collection )
+ return;
+#ifdef DEBUG_COLLECTION
+ qDebug( " remove ref of '%s' to %d (%p) (coll %p)", k.latin1(), ref, this, collection );
+#endif
+ if ( ref == 0 )
+ collection->remove( this );
+}
+
+void QTextParag::setTabArray( int *a )
+{
+ if ( tArray )
+ delete [] tArray;
+ tArray = a;
+}
+
+void QTextParag::setTabStops( int tw )
+{
+ if ( doc )
+ doc->setTabStops( tw );
+ else
+ tabStopWidth = tw;
+}
+
+
+
diff --git a/bibletime/frontend/thirdparty/qt3stuff/qrichtext_p.h b/bibletime/frontend/thirdparty/qt3stuff/qrichtext_p.h
new file mode 100644
index 0000000..a04db64
--- /dev/null
+++ b/bibletime/frontend/thirdparty/qt3stuff/qrichtext_p.h
@@ -0,0 +1,2446 @@
+/****************************************************************************
+**
+** Definition of internal rich text classes
+**
+** Created : 990124
+**
+** Copyright (C) 1999-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the kernel module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QT3_QRICHTEXT_P_H
+#define QT3_QRICHTEXT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of a number of Qt sources files. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+//
+
+#ifndef QT_H
+#include "qt3stuff.h"
+#include "qstring.h"
+#include "qlist.h"
+#include "qrect.h"
+#include "qfontmetrics.h"
+#include "qintdict.h"
+#include "qmap.h"
+#include "qstringlist.h"
+#include "qfont.h"
+#include "qcolor.h"
+#include "qsize.h"
+#include "qvaluelist.h"
+#include "qvaluestack.h"
+#include "qobject.h"
+#include "qdict.h"
+#include "qtextstream.h"
+#include "qpixmap.h"
+#include "qstylesheet.h"
+#include "qvector.h"
+#include "qpainter.h"
+#include "qlayout.h"
+#include "qobject.h"
+#include <limits.h>
+#include "qcomplextext_p.h"
+#include "qapplication.h"
+#endif // QT_H
+
+// We need this to avoid clashes
+namespace Qt3 {
+
+class QTextDocument;
+class QTextString;
+class QTextPreProcessor;
+class QTextFormat;
+class QTextCursor;
+class QTextParag;
+class QTextFormatter;
+class QTextIndent;
+class QTextFormatCollection;
+class QStyleSheetItem;
+class QTextCustomItem;
+class QTextFlow;
+struct QBidiContext;
+
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+class Q_EXPORT QTextStringChar
+{
+ friend class QTextString;
+
+public:
+ // this is never called, initialize variables in QTextString::insert()!!!
+ QTextStringChar() : lineStart( 0 ), type( Regular ), startOfRun( 0 ) {d.format=0;}
+ ~QTextStringChar();
+ QChar c;
+ enum Type { Regular, Custom, Mark, Shaped };
+ uint lineStart : 1;
+ uint rightToLeft : 1;
+ uint hasCursor : 1;
+ uint canBreak : 1;
+ Type type : 2;
+ uint startOfRun : 1;
+
+ int x;
+ int height() const;
+ int ascent() const;
+ int descent() const;
+ bool isCustom() const { return type == Custom; }
+ QTextFormat *format() const;
+ QTextCustomItem *customItem() const;
+ void setFormat( QTextFormat *f );
+ void setCustomItem( QTextCustomItem *i );
+ void loseCustomItem();
+ QTextStringChar *clone() const;
+ struct CustomData
+ {
+ QTextFormat *format;
+ QTextCustomItem *custom;
+ };
+
+ struct MarkData
+ {
+ QTextFormat *format;
+ short xoff; // x offset for painting the Mark
+ short yoff; // y offset for painting the Mark
+ };
+
+ struct ShapedData
+ {
+ QTextFormat *format;
+ QChar shapedGlyph;
+ };
+
+ union {
+ QTextFormat* format;
+ CustomData* custom;
+ MarkData *mark;
+ ShapedData *shaped;
+ } d;
+
+private:
+ QTextStringChar &operator=( const QTextStringChar & ) {
+ //abort();
+ return *this;
+ }
+ QTextStringChar( const QTextStringChar & ); // copy-constructor, forbidden
+ friend class QComplexText;
+ friend class QTextParag;
+};
+
+#if defined(Q_TEMPLATEDLL)
+// MOC_SKIP_BEGIN
+template class Q_EXPORT QMemArray<QTextStringChar>;
+// MOC_SKIP_END
+#endif
+
+class Q_EXPORT QTextString
+{
+public:
+
+ QTextString();
+ QTextString( const QTextString &s );
+ ~QTextString();
+
+ QString toString() const;
+ static QString toString( const QMemArray<QTextStringChar> &data );
+ QString toReverseString() const;
+
+ QTextStringChar &at( int i ) const;
+ int length() const;
+
+ int width( int idx ) const;
+
+ void insert( int index, const QString &s, QTextFormat *f );
+ void insert( int index, QTextStringChar *c );
+ void truncate( int index );
+ void remove( int index, int len );
+ void clear();
+
+ void setFormat( int index, QTextFormat *f, bool useCollection );
+
+ void setTextChanged( bool b ) { textChanged = b; }
+ void setBidi( bool b ) { bidi = b; }
+ bool isTextChanged() const { return textChanged; }
+ bool isBidi() const;
+ bool isRightToLeft() const;
+
+ QMemArray<QTextStringChar> subString( int start = 0, int len = 0xFFFFFF ) const;
+ QMemArray<QTextStringChar> rawData() const { return data; }
+
+ void operator=( const QString &s ) { clear(); insert( 0, s, 0 ); }
+ void operator+=( const QString &s );
+ void prepend( const QString &s ) { insert( 0, s, 0 ); }
+
+private:
+ void checkBidi() const;
+ void basicDirection() const;
+
+ QMemArray<QTextStringChar> data;
+ uint textChanged : 1;
+ uint bidi : 1; // true when the paragraph has right to left characters
+ uint rightToLeft : 1; // true if the basic direction of the paragraph is right to left.
+};
+
+inline bool QTextString::isBidi() const
+{
+ if ( textChanged )
+ checkBidi();
+ return bidi;
+}
+
+inline bool QTextString::isRightToLeft() const
+{
+ if ( textChanged )
+ checkBidi();
+ return rightToLeft;
+}
+
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+#if defined(Q_TEMPLATEDLL)
+// MOC_SKIP_BEGIN
+template class Q_EXPORT QValueStack<int>;
+template class Q_EXPORT QValueStack<QTextParag*>;
+template class Q_EXPORT QValueStack<bool>;
+// MOC_SKIP_END
+#endif
+
+class Q_EXPORT QTextCursor
+{
+public:
+ QTextCursor( QTextDocument *d );
+ QTextCursor();
+ QTextCursor( const QTextCursor &c );
+ QTextCursor &operator=( const QTextCursor &c );
+ bool operator==( const QTextCursor &c ) const;
+ bool operator!=( const QTextCursor &c ) const { return !(*this == c); }
+
+ QTextDocument *document() const { return doc; }
+ void setDocument( QTextDocument *d );
+
+ QTextParag *parag() const;
+ int index() const;
+ void setParag( QTextParag *s, bool restore = TRUE );
+
+ void gotoLeft();
+ void gotoRight();
+ void gotoUp();
+ void gotoDown();
+ void gotoLineEnd();
+ void gotoLineStart();
+ void gotoHome();
+ void gotoEnd();
+ void gotoPageUp( int visibleHeight );
+ void gotoPageDown( int visibleHeight );
+ void gotoWordLeft();
+ void gotoWordRight();
+
+ void insert( const QString &s, bool checkNewLine, QMemArray<QTextStringChar> *formatting = 0 );
+ void splitAndInsertEmptyParag( bool ind = TRUE, bool updateIds = TRUE );
+ bool remove();
+ void killLine();
+ void indent();
+
+ bool atParagStart();
+ bool atParagEnd();
+
+ void setIndex( int i, bool restore = TRUE );
+
+ void checkIndex();
+
+ int offsetX() const { return ox; }
+ int offsetY() const { return oy; }
+
+ QTextParag *topParag() const { return parags.isEmpty() ? string : parags.first(); }
+ int totalOffsetX() const;
+ int totalOffsetY() const;
+
+ bool place( const QPoint &pos, QTextParag *s );
+ void restoreState();
+
+ int x() const;
+ int y() const;
+
+ int nestedDepth() const { return indices.count(); }
+
+private:
+ enum Operation { EnterBegin, EnterEnd, Next, Prev, Up, Down };
+
+ void push();
+ void pop();
+ void processNesting( Operation op );
+ void invalidateNested();
+ void gotoIntoNested( const QPoint &globalPos );
+
+ QTextParag *string;
+ QTextDocument *doc;
+ int idx, tmpIndex;
+ int ox, oy;
+ QValueStack<int> indices;
+ QValueStack<QTextParag*> parags;
+ QValueStack<int> xOffsets;
+ QValueStack<int> yOffsets;
+ QValueStack<bool> nestedStack;
+ bool nested;
+
+};
+
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+class Q_EXPORT QTextCommand
+{
+public:
+ enum Commands { Invalid, Insert, Delete, Format, Alignment, ParagType };
+
+ QTextCommand( QTextDocument *d ) : doc( d ), cursor( d ) {}
+ virtual ~QTextCommand() {}
+ virtual Commands type() const { return Invalid; };
+
+ virtual QTextCursor *execute( QTextCursor *c ) = 0;
+ virtual QTextCursor *unexecute( QTextCursor *c ) = 0;
+
+protected:
+ QTextDocument *doc;
+ QTextCursor cursor;
+
+};
+
+#if defined(Q_TEMPLATEDLL)
+// MOC_SKIP_BEGIN
+template class Q_EXPORT QPtrList<QTextCommand>;
+// MOC_SKIP_END
+#endif
+
+class Q_EXPORT QTextCommandHistory
+{
+public:
+ QTextCommandHistory( int s ) : current( -1 ), steps( s ) { history.setAutoDelete( TRUE ); }
+ ~QTextCommandHistory() { clear(); }
+
+ void clear() { history.clear(); current = -1; }
+
+ void addCommand( QTextCommand *cmd );
+ QTextCursor *undo( QTextCursor *c );
+ QTextCursor *redo( QTextCursor *c );
+
+ bool isUndoAvailable();
+ bool isRedoAvailable();
+
+ void setUndoDepth( int d ) { steps = d; }
+ int undoDepth() const { return steps; }
+
+private:
+ QPtrList<QTextCommand> history;
+ int current, steps;
+
+};
+
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+class Q_EXPORT QTextCustomItem
+{
+public:
+ QTextCustomItem( QTextDocument *p );
+ virtual ~QTextCustomItem();
+
+ virtual void draw(QPainter* p, int x, int y, int cx, int cy, int cw, int ch, const QColorGroup& cg, bool selected ) = 0;
+
+ virtual void move( int x, int y ) { xpos = x; ypos = y; }
+ int x() const { return xpos; }
+ int y() const { return ypos; }
+
+ virtual void adjustToPainter( QPainter* ) { width = 0; }
+
+ enum Placement { PlaceInline = 0, PlaceLeft, PlaceRight };
+ virtual Placement placement() const { return PlaceInline; }
+ bool placeInline() { return placement() == PlaceInline; }
+
+ virtual bool ownLine() const { return FALSE; }
+ virtual void resize( QPainter*, int nwidth ){ width = nwidth; };
+ virtual void invalidate() {};
+
+ virtual bool isNested() const { return FALSE; }
+ virtual int minimumWidth() const { return 0; }
+ virtual int widthHint() const { return 0; }
+
+ virtual QString richText() const { return QString::null; }
+
+ int width;
+ int height;
+
+ virtual void enter( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy, bool atEnd = FALSE ) {
+ doc = doc; parag = parag; idx = idx; ox = ox; oy = oy; Q_UNUSED( atEnd )
+ }
+ virtual void enterAt( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy, const QPoint & ) {
+ doc = doc; parag = parag; idx = idx; ox = ox; oy = oy;
+ }
+ virtual void next( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy ) {
+ doc = doc; parag = parag; idx = idx; ox = ox; oy = oy;
+ }
+ virtual void prev( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy ) {
+ doc = doc; parag = parag; idx = idx; ox = ox; oy = oy;
+ }
+ virtual void down( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy ) {
+ doc = doc; parag = parag; idx = idx; ox = ox; oy = oy;
+ }
+ virtual void up( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy ) {
+ doc = doc; parag = parag; idx = idx; ox = ox; oy = oy;
+ }
+
+ QTextDocument *parent; // obsolete?
+
+ QTextParag *paragraph() const { return parag; }
+ void setParagraph( QTextParag * p ) { parag = p; }
+protected:
+ int xpos;
+ int ypos;
+private:
+ QTextParag *parag;
+};
+
+#if defined(Q_TEMPLATEDLL)
+// MOC_SKIP_BEGIN
+template class Q_EXPORT QMap<QString, QString>;
+// MOC_SKIP_END
+#endif
+
+class Q_EXPORT QTextImage : public QTextCustomItem
+{
+public:
+ QTextImage( QTextDocument *p, const QMap<QString, QString> &attr, const QString& context,
+ QMimeSourceFactory &factory);
+ ~QTextImage();
+
+ Placement placement() const { return place; }
+ void adjustToPainter( QPainter* );
+ int widthHint() const { return width; }
+ int minimumWidth() const { return width; }
+
+ QString richText() const;
+
+ void draw( QPainter* p, int x, int y, int cx, int cy, int cw, int ch, const QColorGroup& cg, bool selected );
+
+private:
+ QRegion* reg;
+ QPixmap pm;
+ Placement place;
+ int tmpwidth, tmpheight;
+ QMap<QString, QString> attributes;
+ QString imgId;
+
+};
+
+class Q_EXPORT QTextHorizontalLine : public QTextCustomItem
+{
+public:
+ QTextHorizontalLine( QTextDocument *p );
+ ~QTextHorizontalLine();
+ void adjustToPainter( QPainter* );
+ void draw(QPainter* p, int x, int y, int cx, int cy, int cw, int ch, const QColorGroup& cg, bool selected );
+ QString richText() const;
+
+ bool ownLine() const { return TRUE; }
+
+private:
+ int tmpheight;
+
+};
+
+#if defined(Q_TEMPLATEDLL)
+// MOC_SKIP_BEGIN
+template class Q_EXPORT QPtrList<QTextCustomItem>;
+// MOC_SKIP_END
+#endif
+
+class Q_EXPORT QTextFlow
+{
+ friend class QTextDocument;
+ friend class QTextTableCell;
+
+public:
+ QTextFlow();
+ virtual ~QTextFlow();
+
+ virtual void setWidth( int w );
+ virtual void setPageSize( int ps ) { pagesize = ps; }
+ int pageSize() const { return pagesize; }
+
+ virtual int adjustLMargin( int yp, int h, int margin, int space );
+ virtual int adjustRMargin( int yp, int h, int margin, int space );
+
+ virtual void registerFloatingItem( QTextCustomItem* item, bool right = FALSE );
+ virtual void unregisterFloatingItem( QTextCustomItem* item );
+ virtual void drawFloatingItems(QPainter* p, int cx, int cy, int cw, int ch, const QColorGroup& cg, bool selected );
+ virtual void adjustFlow( int &yp, int w, int h, QTextParag *parag, bool pages = TRUE );
+
+ virtual bool isEmpty() { return leftItems.isEmpty() && rightItems.isEmpty(); }
+ virtual void updateHeight( QTextCustomItem *i );
+
+ virtual void draw( QPainter *, int , int , int , int ) {}
+ virtual void eraseAfter( QTextParag *, QPainter *, const QColorGroup& ) {}
+
+ void clear();
+
+private:
+ int width;
+ int height;
+
+ int pagesize;
+
+ QPtrList<QTextCustomItem> leftItems;
+ QPtrList<QTextCustomItem> rightItems;
+
+};
+
+class QTextTable;
+
+class Q_EXPORT QTextTableCell : public QLayoutItem
+{
+ friend class QTextTable;
+
+public:
+ QTextTableCell( QTextTable* table,
+ int row, int column,
+ const QMap<QString, QString> &attr,
+ const QStyleSheetItem* style,
+ const QTextFormat&, const QString& context,
+ QMimeSourceFactory &factory, QStyleSheet *sheet, const QString& doc );
+ QTextTableCell( QTextTable* table, int row, int column );
+
+ ~QTextTableCell();
+ QSize sizeHint() const ;
+ QSize minimumSize() const ;
+ QSize maximumSize() const ;
+ QSizePolicy::ExpandData expanding() const;
+ bool isEmpty() const;
+ void setGeometry( const QRect& ) ;
+ QRect geometry() const;
+
+ bool hasHeightForWidth() const;
+ int heightForWidth( int ) const;
+
+ void adjustToPainter();
+
+ int row() const { return row_; }
+ int column() const { return col_; }
+ int rowspan() const { return rowspan_; }
+ int colspan() const { return colspan_; }
+ int stretch() const { return stretch_; }
+
+ QTextDocument* richText() const { return richtext; }
+ QTextTable* table() const { return parent; }
+
+ void draw( int x, int y, int cx, int cy, int cw, int ch, const QColorGroup& cg, bool selected );
+
+ QBrush *backGround() const { return background; }
+ virtual void invalidate() { cached_width = -1; cached_sizehint = -1; }
+
+private:
+ QPainter* painter() const;
+ QRect geom;
+ QTextTable* parent;
+ QTextDocument* richtext;
+ int row_;
+ int col_;
+ int rowspan_;
+ int colspan_;
+ int stretch_;
+ int maxw;
+ int minw;
+ bool hasFixedWidth;
+ QBrush *background;
+ int cached_width;
+ int cached_sizehint;
+ QMap<QString, QString> attributes;
+
+};
+
+#if defined(Q_TEMPLATEDLL)
+// MOC_SKIP_BEGIN
+template class Q_EXPORT QPtrList<QTextTableCell>;
+template class Q_EXPORT QMap<QTextCursor*, int>;
+// MOC_SKIP_END
+#endif
+
+class Q_EXPORT QTextTable: public QTextCustomItem
+{
+ friend class QTextTableCell;
+
+public:
+ QTextTable( QTextDocument *p, const QMap<QString, QString> &attr );
+ ~QTextTable();
+ void adjustToPainter( QPainter *p );
+ void verticalBreak( int y, QTextFlow* flow );
+ void draw( QPainter* p, int x, int y, int cx, int cy, int cw, int ch,
+ const QColorGroup& cg, bool selected );
+
+ bool noErase() const { return TRUE; };
+ bool ownLine() const { return TRUE; }
+ Placement placement() const { return place; }
+ bool isNested() const { return TRUE; }
+ void resize( QPainter*, int nwidth );
+ virtual void invalidate() { cachewidth = -1; };
+ /// ## QString anchorAt( QPainter* p, int x, int y );
+
+ virtual void enter( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy, bool atEnd = FALSE );
+ virtual void enterAt( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy, const QPoint &pos );
+ virtual void next( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy );
+ virtual void prev( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy );
+ virtual void down( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy );
+ virtual void up( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy );
+
+ QString richText() const;
+
+ int minimumWidth() const { return layout ? layout->minimumSize().width() : 0; }
+ int widthHint() const { return ( layout ? layout->sizeHint().width() : 0 ) + 2 * outerborder; }
+
+private:
+ void format( int &w );
+ void addCell( QTextTableCell* cell );
+
+private:
+ QGridLayout* layout;
+ QPtrList<QTextTableCell> cells;
+ QPainter* painter;
+ int cachewidth;
+ int fixwidth;
+ int cellpadding;
+ int cellspacing;
+ int border;
+ int outerborder;
+ int stretch;
+ int innerborder;
+ int us_ib, us_b, us_ob, us_cs;
+ int lastX, lastY;
+ QMap<QString, QString> attributes;
+
+ QMap<QTextCursor*, int> currCell;
+
+ Placement place;
+};
+
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+class QTextTableCell;
+class QTextParag;
+
+struct Q_EXPORT QTextDocumentSelection
+{
+ QTextCursor startCursor, endCursor;
+ bool swapped;
+};
+
+#if defined(Q_TEMPLATEDLL)
+// MOC_SKIP_BEGIN
+template class Q_EXPORT QMap<int, QColor>;
+template class Q_EXPORT QMap<int, bool>;
+template class Q_EXPORT QMap<int, QTextDocumentSelection>;
+template class Q_EXPORT QPtrList<QTextDocument>;
+// MOC_SKIP_END
+#endif
+
+class Q_EXPORT QTextDocument : public QObject
+{
+ Q_OBJECT
+
+ friend class QTextTableCell;
+ friend class QTextCursor;
+ friend class QTextView;
+ friend class QTextParag;
+
+public:
+//ANY_CHARSET_BEGIN
+ QMap<QString,QFont::CharSet>* charsetMap;
+//ANY_CHARSET_END
+
+ enum SelectionIds {
+ Standard = 0,
+ Temp = 32000 // This selection must not be drawn, it's used e.g. by undo/redo to
+ // remove multiple lines with removeSelectedText()
+ };
+
+ QTextDocument( QTextDocument *p );
+ QTextDocument( QTextDocument *d, QTextFormatCollection *f );
+ ~QTextDocument();
+ QTextDocument *parent() const { return par; }
+ QTextParag *parentParag() const { return parParag; }
+
+ void setText( const QString &text, const QString &context );
+ QMap<QString, QString> attributes() const { return attribs; }
+ void setAttributes( const QMap<QString, QString> &attr ) { attribs = attr; }
+
+ QString text() const;
+ QString text( int parag ) const;
+ QString originalText() const;
+
+ int x() const;
+ int y() const;
+ int width() const;
+ int widthUsed() const;
+ int visibleWidth() const;
+ int height() const;
+ void setWidth( int w );
+ int minimumWidth() const;
+ bool setMinimumWidth( int w, QTextParag *parag );
+
+ QTextParag *firstParag() const;
+ QTextParag *lastParag() const;
+ void setFirstParag( QTextParag *p );
+ void setLastParag( QTextParag *p );
+
+ void invalidate();
+
+ void setPreProcessor( QTextPreProcessor *sh );
+ QTextPreProcessor *preProcessor() const;
+
+ void setFormatter( QTextFormatter *f );
+ QTextFormatter *formatter() const;
+
+ void setIndent( QTextIndent *i );
+ QTextIndent *indent() const;
+
+ QColor selectionColor( int id ) const;
+ bool invertSelectionText( int id ) const;
+ void setSelectionColor( int id, const QColor &c );
+ void setInvertSelectionText( int id, bool b );
+ bool hasSelection( int id ) const;
+ void setSelectionStart( int id, QTextCursor *cursor );
+ bool setSelectionEnd( int id, QTextCursor *cursor );
+ void selectAll( int id );
+ bool removeSelection( int id );
+ void selectionStart( int id, int &paragId, int &index );
+ QTextCursor selectionStartCursor( int id );
+ QTextCursor selectionEndCursor( int id );
+ void selectionEnd( int id, int &paragId, int &index );
+ void setFormat( int id, QTextFormat *f, int flags );
+ QTextParag *selectionStart( int id );
+ QTextParag *selectionEnd( int id );
+ int numSelections() const { return nSelections; }
+ void addSelection( int id );
+
+ QString selectedText( int id ) const;
+ void copySelectedText( int id );
+ void removeSelectedText( int id, QTextCursor *cursor );
+ void indentSelection( int id );
+
+ QTextParag *paragAt( int i ) const;
+
+ void addCommand( QTextCommand *cmd );
+ QTextCursor *undo( QTextCursor *c = 0 );
+ QTextCursor *redo( QTextCursor *c = 0 );
+ QTextCommandHistory *commands() const { return commandHistory; }
+
+ QTextFormatCollection *formatCollection() const;
+
+ bool find( const QString &expr, bool cs, bool wo, bool forward, int *parag, int *index, QTextCursor *cursor );
+
+ void setTextFormat( Qt::TextFormat f );
+ Qt::TextFormat textFormat() const;
+
+ bool inSelection( int selId, const QPoint &pos ) const;
+
+ QStyleSheet *styleSheet() const { return sheet_; }
+ QMimeSourceFactory *mimeSourceFactory() const { return factory_; }
+ QString context() const { return contxt; }
+
+ void setStyleSheet( QStyleSheet *s );
+ void updateStyles();
+ void updateFontSizes( int base );
+ void updateFontAttributes( const QFont &f, const QFont &old );
+ void setMimeSourceFactory( QMimeSourceFactory *f ) { if ( f ) factory_ = f; }
+ void setContext( const QString &c ) { if ( !c.isEmpty() ) contxt = c; }
+
+ void setUnderlineLinks( bool b ) { underlLinks = b; }
+ bool underlineLinks() const { return underlLinks; }
+
+ void setPaper( QBrush *brush ) { if ( backBrush ) delete backBrush; backBrush = brush; }
+ QBrush *paper() const { return backBrush; }
+
+ void doLayout( QPainter *p, int w );
+ void draw( QPainter *p, const QRegion &reg, const QColorGroup &cg, const QBrush *paper = 0 );
+ void drawParag( QPainter *p, QTextParag *parag, int cx, int cy, int cw, int ch,
+ QPixmap *&doubleBuffer, const QColorGroup &cg,
+ bool drawCursor, QTextCursor *cursor, bool resetChanged = TRUE );
+ QTextParag *draw( QPainter *p, int cx, int cy, int cw, int ch, const QColorGroup &cg,
+ bool onlyChanged = FALSE, bool drawCursor = FALSE, QTextCursor *cursor = 0,
+ bool resetChanged = TRUE );
+
+ void setDefaultFont( const QFont &f );
+
+ void registerCustomItem( QTextCustomItem *i, QTextParag *p );
+ void unregisterCustomItem( QTextCustomItem *i, QTextParag *p );
+ const QList<QTextCustomItem> & allCustomItems() const { return customItems; }
+
+ void setFlow( QTextFlow *f );
+ QTextFlow *flow() const { return flow_; }
+ bool verticalBreak() const { return pages; }
+ void setVerticalBreak( bool b ) { pages = b; }
+
+ void setUseFormatCollection( bool b ) { useFC = b; }
+ bool useFormatCollection() const { return useFC; }
+
+ QTextTableCell *tableCell() const { return tc; }
+ void setTableCell( QTextTableCell *c ) { tc = c; }
+
+ void setPlainText( const QString &text );
+ void setRichText( const QString &text, const QString &context );
+ QString richText( QTextParag *p = 0 ) const;
+ QString plainText( QTextParag *p = 0 ) const;
+
+ bool focusNextPrevChild( bool next );
+
+ int alignment() const;
+ void setAlignment( int a );
+
+ int *tabArray() const;
+ int tabStopWidth() const;
+ void setTabArray( int *a );
+ void setTabStops( int tw );
+
+ void setUndoDepth( int d ) { commandHistory->setUndoDepth( d ); }
+ int undoDepth() const { return commandHistory->undoDepth(); }
+
+ int length() const;
+ void clear( bool createEmptyParag = FALSE );
+
+ virtual QTextParag *createParag( QTextDocument *d, QTextParag *pr = 0, QTextParag *nx = 0, bool updateIds = TRUE );
+ void insertChild( QObject *o ) { QObject::insertChild( o ); }
+ void removeChild( QObject *o ) { QObject::removeChild( o ); }
+ void insertChild( QTextDocument *d ) { childList.append( d ); }
+ void removeChild( QTextDocument *d ) { childList.removeRef( d ); }
+ QPtrList<QTextDocument> children() const { return childList; }
+
+ void setAddMargins( bool b ) { addMargs = b; }
+ int addMargins() const { return addMargs; }
+
+signals:
+ void minimumWidthChanged( int );
+
+private:
+//ANY_CHARSET_BEGIN
+ bool m_assignedFontMap;
+//ANY_CHARSET_END
+ void init();
+ QPixmap *bufferPixmap( const QSize &s );
+ // HTML parser
+ bool hasPrefix(const QString& doc, int pos, QChar c);
+ bool hasPrefix(const QString& doc, int pos, const QString& s);
+ QTextCustomItem* parseTable( const QMap<QString, QString> &attr, const QTextFormat &fmt, const QString &doc, int& pos, QTextParag *curpar );
+ bool eatSpace(const QString& doc, int& pos, bool includeNbsp = FALSE );
+ bool eat(const QString& doc, int& pos, QChar c);
+ QString parseOpenTag(const QString& doc, int& pos, QMap<QString, QString> &attr, bool& emptyTag);
+ QString parseCloseTag( const QString& doc, int& pos );
+ QChar parseHTMLSpecialChar(const QString& doc, int& pos);
+ QString parseWord(const QString& doc, int& pos, bool lower = TRUE);
+ QChar parseChar(const QString& doc, int& pos, QStyleSheetItem::WhiteSpaceMode wsm );
+ void setRichTextInternal( const QString &text );
+
+private:
+ struct Q_EXPORT Focus {
+ QTextParag *parag;
+ int start, len;
+ QString href;
+ };
+
+ int cx, cy, cw, vw;
+ QTextParag *fParag, *lParag;
+ QTextPreProcessor *pProcessor;
+ QMap<int, QColor> selectionColors;
+ QMap<int, QTextDocumentSelection> selections;
+ QMap<int, bool> selectionText;
+ QTextCommandHistory *commandHistory;
+ QTextFormatter *pFormatter;
+ QTextIndent *indenter;
+ QTextFormatCollection *fCollection;
+ Qt::TextFormat txtFormat;
+ bool preferRichText;
+ QTextFlow *flow_;
+ QPtrList<QTextCustomItem> customItems;
+ bool pages;
+ QTextDocument *par;
+ QTextParag *parParag;
+ bool useFC;
+ QTextTableCell *tc;
+ bool withoutDoubleBuffer;
+ QTextCursor *tmpCursor;
+ bool underlLinks;
+ QColor linkC;
+ QBrush *backBrush;
+ QPixmap *buf_pixmap;
+ bool nextDoubleBuffered;
+ Focus focusIndicator;
+ int minw;
+ QTextParag *minwParag;
+ QStyleSheet* sheet_;
+ QMimeSourceFactory* factory_;
+ QString contxt;
+ QMap<QString, QString> attribs;
+ int align;
+ int *tArray;
+ int tStopWidth;
+ int uDepth;
+ QString oText;
+ QPtrList<QTextDocument> childList;
+ int nSelections;
+ bool addMargs;
+
+};
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+
+class Q_EXPORT QTextDeleteCommand : public QTextCommand
+{
+public:
+ QTextDeleteCommand( QTextDocument *d, int i, int idx, const QMemArray<QTextStringChar> &str,
+ const QValueList< QPtrVector<QStyleSheetItem> > &os,
+ const QValueList<QStyleSheetItem::ListStyle> &ols,
+ const QMemArray<int> &oas );
+ QTextDeleteCommand( QTextParag *p, int idx, const QMemArray<QTextStringChar> &str );
+ ~QTextDeleteCommand();
+ Commands type() const { return Delete; };
+ QTextCursor *execute( QTextCursor *c );
+ QTextCursor *unexecute( QTextCursor *c );
+
+protected:
+ int id, index;
+ QTextParag *parag;
+ QMemArray<QTextStringChar> text;
+ QValueList< QPtrVector<QStyleSheetItem> > oldStyles;
+ QValueList<QStyleSheetItem::ListStyle> oldListStyles;
+ QMemArray<int> oldAligns;
+
+};
+
+class Q_EXPORT QTextInsertCommand : public QTextDeleteCommand
+{
+public:
+ QTextInsertCommand( QTextDocument *d, int i, int idx, const QMemArray<QTextStringChar> &str,
+ const QValueList< QPtrVector<QStyleSheetItem> > &os,
+ const QValueList<QStyleSheetItem::ListStyle> &ols,
+ const QMemArray<int> &oas )
+ : QTextDeleteCommand( d, i, idx, str, os, ols, oas ) {}
+ QTextInsertCommand( QTextParag *p, int idx, const QMemArray<QTextStringChar> &str )
+ : QTextDeleteCommand( p, idx, str ) {}
+ Commands type() const { return Insert; };
+ QTextCursor *execute( QTextCursor *c ) { return QTextDeleteCommand::unexecute( c ); }
+ QTextCursor *unexecute( QTextCursor *c ) { return QTextDeleteCommand::execute( c ); }
+
+};
+
+class Q_EXPORT QTextFormatCommand : public QTextCommand
+{
+public:
+ QTextFormatCommand( QTextDocument *d, int sid, int sidx, int eid, int eidx, const QMemArray<QTextStringChar> &old, QTextFormat *f, int fl );
+ ~QTextFormatCommand();
+ Commands type() const { return Format; }
+ QTextCursor *execute( QTextCursor *c );
+ QTextCursor *unexecute( QTextCursor *c );
+
+protected:
+ int startId, startIndex, endId, endIndex;
+ QTextFormat *format;
+ QMemArray<QTextStringChar> oldFormats;
+ int flags;
+
+};
+
+class Q_EXPORT QTextAlignmentCommand : public QTextCommand
+{
+public:
+ QTextAlignmentCommand( QTextDocument *d, int fParag, int lParag, int na, const QMemArray<int> &oa );
+ Commands type() const { return Alignment; }
+ QTextCursor *execute( QTextCursor *c );
+ QTextCursor *unexecute( QTextCursor *c );
+
+private:
+ int firstParag, lastParag;
+ int newAlign;
+ QMemArray<int> oldAligns;
+
+};
+
+class Q_EXPORT QTextParagTypeCommand : public QTextCommand
+{
+public:
+ QTextParagTypeCommand( QTextDocument *d, int fParag, int lParag, bool l,
+ QStyleSheetItem::ListStyle s, const QValueList< QPtrVector<QStyleSheetItem> > &os,
+ const QValueList<QStyleSheetItem::ListStyle> &ols );
+ Commands type() const { return ParagType; }
+ QTextCursor *execute( QTextCursor *c );
+ QTextCursor *unexecute( QTextCursor *c );
+
+private:
+ int firstParag, lastParag;
+ bool list;
+ QStyleSheetItem::ListStyle listStyle;
+ QValueList< QPtrVector<QStyleSheetItem> > oldStyles;
+ QValueList<QStyleSheetItem::ListStyle> oldListStyles;
+
+};
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+struct Q_EXPORT QTextParagSelection
+{
+ int start, end;
+};
+
+struct Q_EXPORT QTextParagLineStart
+{
+ QTextParagLineStart() : y( 0 ), baseLine( 0 ), h( 0 ), bidicontext( 0 ) { }
+ QTextParagLineStart( ushort y_, ushort bl, ushort h_ ) : y( y_ ), baseLine( bl ), h( h_ ),
+ w( 0 ), bidicontext( 0 ) { }
+ QTextParagLineStart( QBidiContext *c, QBidiStatus s ) : y(0), baseLine(0), h(0),
+ status( s ), bidicontext( c ) { if ( bidicontext ) bidicontext->ref(); }
+ ~QTextParagLineStart() { if ( bidicontext && bidicontext->deref() ) delete bidicontext; }
+ void setContext( QBidiContext *c ) {
+ if ( c == bidicontext )
+ return;
+ if ( bidicontext && bidicontext->deref() )
+ delete bidicontext;
+ bidicontext = c;
+ if ( bidicontext )
+ bidicontext->ref();
+ }
+ QBidiContext *context() const { return bidicontext; }
+
+public:
+ ushort y, baseLine, h;
+ QBidiStatus status;
+ int w;
+
+private:
+ QBidiContext *bidicontext;
+
+};
+
+#if defined(Q_TEMPLATEDLL)
+// MOC_SKIP_BEGIN
+template class Q_EXPORT QMap<int, QTextParagSelection>;
+template class Q_EXPORT QMap<int, QTextParagLineStart*>;
+// MOC_SKIP_END
+#endif
+
+class Q_EXPORT QTextParagData
+{
+public:
+ QTextParagData() {}
+ virtual ~QTextParagData() {}
+ virtual void join( QTextParagData * ) {}
+};
+
+class Q_EXPORT QTextParag
+{
+ friend class QTextDocument;
+ friend class QTextCursor;
+
+public:
+ QTextParag( QTextDocument *d, QTextParag *pr = 0, QTextParag *nx = 0, bool updateIds = TRUE );
+ virtual ~QTextParag();
+
+ QTextString *string() const;
+ QTextStringChar *at( int i ) const; // maybe remove later
+ int length() const; // maybe remove later
+
+ void setListStyle( QStyleSheetItem::ListStyle ls );
+ QStyleSheetItem::ListStyle listStyle() const;
+ void setListValue( int v ) { list_val = v; }
+ int listValue() const { return list_val; }
+
+ void setList( bool b, int listStyle );
+ void incDepth();
+ void decDepth();
+
+ void setFormat( QTextFormat *fm );
+ QTextFormat *paragFormat() const;
+
+ QTextDocument *document() const;
+
+ QRect rect() const;
+ void setHeight( int h ) { r.setHeight( h ); }
+ void setWidth( int w ) { r.setWidth( w ); }
+ void show();
+ void hide();
+ bool isVisible() const { return visible; }
+
+ bool isLastInFrame() const { return lastInFrame; }
+ void setMovedDown( bool b ) { movedDown = b; }
+ bool isMovedDown() const { return movedDown; }
+
+ QTextParag *prev() const;
+ QTextParag *next() const;
+ void setPrev( QTextParag *s );
+ void setNext( QTextParag *s );
+
+ void insert( int index, const QString &s );
+ void append( const QString &s, bool reallyAtEnd = FALSE );
+ void truncate( int index );
+ void remove( int index, int len );
+ void join( QTextParag *s );
+
+ void invalidate( int chr );
+
+ void move( int &dy );
+ void format( int start = -1, bool doMove = TRUE );
+
+ bool isValid() const;
+ bool hasChanged() const;
+ void setChanged( bool b, bool recursive = FALSE );
+
+ int lineHeightOfChar( int i, int *bl = 0, int *y = 0 ) const;
+ QTextStringChar *lineStartOfChar( int i, int *index = 0, int *line = 0 ) const;
+ int lines() const;
+ QTextStringChar *lineStartOfLine( int line, int *index = 0 ) const;
+ int lineY( int l ) const;
+ int lineBaseLine( int l ) const;
+ int lineHeight( int l ) const;
+ void lineInfo( int l, int &y, int &h, int &bl ) const;
+
+ void setSelection( int id, int start, int end );
+ void removeSelection( int id );
+ int selectionStart( int id ) const;
+ int selectionEnd( int id ) const;
+ bool hasSelection( int id ) const;
+ bool hasAnySelection() const;
+ bool fullSelected( int id ) const;
+
+ void setEndState( int s );
+ int endState() const;
+
+ void setParagId( int i );
+ int paragId() const;
+
+ bool firstPreProcess() const;
+ void setFirstPreProcess( bool b );
+
+ void indent( int *oldIndent = 0, int *newIndent = 0 );
+
+ void setExtraData( QTextParagData *data );
+ QTextParagData *extraData() const;
+
+ QMap<int, QTextParagLineStart*> &lineStartList();
+
+ void setFormat( int index, int len, QTextFormat *f, bool useCollection = TRUE, int flags = -1 );
+
+ void setAlignment( int a );
+ int alignment() const;
+
+ virtual void paint( QPainter &painter, const QColorGroup &cg, QTextCursor *cursor = 0, bool drawSelections = FALSE,
+ int clipx = -1, int clipy = -1, int clipw = -1, int cliph = -1 );
+
+ void setStyleSheetItems( const QPtrVector<QStyleSheetItem> &vec );
+ QPtrVector<QStyleSheetItem> styleSheetItems() const;
+ QStyleSheetItem *style() const;
+
+ virtual int topMargin() const;
+ virtual int bottomMargin() const;
+ virtual int leftMargin() const;
+ virtual int firstLineMargin() const;
+ virtual int rightMargin() const;
+ virtual int lineSpacing( int line ) const;
+
+ int numberOfSubParagraph() const;
+ void registerFloatingItem( QTextCustomItem *i );
+ void unregisterFloatingItem( QTextCustomItem *i );
+
+ void setFullWidth( bool b ) { fullWidth = b; }
+ bool isFullWidth() const { return fullWidth; }
+
+ QTextTableCell *tableCell() const { return tc; }
+ void setTableCell( QTextTableCell *c ) { tc = c; }
+
+ void addCustomItem();
+ void removeCustomItem();
+ int customItems() const;
+
+ QBrush *background() const;
+
+ void setDocumentRect( const QRect &r );
+ int documentWidth() const;
+ int documentVisibleWidth() const;
+ int documentX() const;
+ int documentY() const;
+ QTextFormatCollection *formatCollection() const;
+ void setFormatter( QTextFormatter *f );
+ QTextFormatter *formatter() const;
+ int minimumWidth() const;
+
+ virtual int nextTab( int i, int x );
+ void setTabArray( int *a );
+ void setTabStops( int tw );
+ int *tabArray() const { return tArray; }
+
+ void setPainter( QPainter *p );
+ QPainter *painter() const { return pntr; }
+
+ void setNewLinesAllowed( bool b );
+ bool isNewLinesAllowed() const;
+
+ QString richText() const;
+
+ void addCommand( QTextCommand *cmd );
+ QTextCursor *undo( QTextCursor *c = 0 );
+ QTextCursor *redo( QTextCursor *c = 0 );
+ QTextCommandHistory *commands() const { return commandHistory; }
+ virtual void copyParagData( QTextParag *parag );
+
+protected:
+ virtual void drawLabel( QPainter* p, int x, int y, int w, int h, int base, const QColorGroup& cg );
+ virtual void drawParagString( QPainter &painter, const QString &str, int start, int len, int startX,
+ int lastY, int baseLine, int bw, int h, bool drawSelections,
+ QTextFormat *lastFormat, int i, const QMemArray<int> &selectionStarts,
+ const QMemArray<int> &selectionEnds, const QColorGroup &cg, bool rightToLeft );
+
+private:
+
+ QMap<int, QTextParagLineStart*> lineStarts;
+ int invalid;
+ QRect r;
+ QTextParag *p, *n;
+ QTextDocument *doc;
+ bool changed : 1;
+ bool firstFormat : 1;
+ bool firstPProcess : 1;
+ bool needPreProcess : 1;
+ bool fullWidth : 1;
+ bool newLinesAllowed : 1;
+ bool movedDown : 1;
+ bool lastInFrame : 1;
+ bool visible : 1;
+ QMap<int, QTextParagSelection> selections;
+ int state, id;
+ QTextString *str;
+ int align;
+ QPtrVector<QStyleSheetItem> styleSheetItemsVec;
+ QStyleSheetItem::ListStyle listS;
+ int numSubParag;
+ int tm, bm, lm, rm, flm;
+ QTextFormat *defFormat;
+ QPtrList<QTextCustomItem> floatingItems;
+ QTextTableCell *tc;
+ int numCustomItems;
+ QRect docRect;
+ QTextFormatter *pFormatter;
+ int *tArray;
+ int tabStopWidth;
+ QTextParagData *eData;
+ QPainter *pntr;
+ QTextCommandHistory *commandHistory;
+ int list_val;
+
+};
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+class Q_EXPORT QTextFormatter
+{
+public:
+ QTextFormatter();
+ virtual ~QTextFormatter() {}
+ virtual int format( QTextDocument *doc, QTextParag *parag, int start, const QMap<int, QTextParagLineStart*> &oldLineStarts ) = 0;
+
+ bool isWrapEnabled() const { return wrapEnabled;}
+ int wrapAtColumn() const { return wrapColumn;}
+ virtual void setWrapEnabled( bool b ) { wrapEnabled = b; }
+ virtual void setWrapAtColumn( int c ) { wrapColumn = c; }
+ virtual void setAllowBreakInWords( bool b ) { biw = b; }
+ bool allowBreakInWords() const { return biw; }
+
+protected:
+ virtual QTextParagLineStart *formatLine( QTextParag *parag, QTextString *string, QTextParagLineStart *line, QTextStringChar *start,
+ QTextStringChar *last, int align = Qt3::AlignAuto, int space = 0 );
+ //QTextStringChar
+ //virtual QTextParagLineStart *bidiReorderLine( QTextParag *parag, QTextString *string, QTextParagLineStart *line, QTextStringChar *start,
+ // QTextStringChar *last, int align, int space );
+ virtual bool isBreakable( QTextString *string, int pos ) const;
+ void insertLineStart( QTextParag *parag, int index, QTextParagLineStart *ls );
+
+private:
+ bool wrapEnabled;
+ int wrapColumn;
+ bool biw;
+
+#ifdef HAVE_THAI_BREAKS
+ static QCString *thaiCache;
+ static QTextString *cachedString;
+ static ThBreakIterator *thaiIt;
+#endif
+};
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+class Q_EXPORT QTextFormatterBreakInWords : public QTextFormatter
+{
+public:
+ QTextFormatterBreakInWords();
+ int format( QTextDocument *doc, QTextParag *parag, int start, const QMap<int, QTextParagLineStart*> &oldLineStarts );
+
+};
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+class Q_EXPORT QTextFormatterBreakWords : public QTextFormatter
+{
+public:
+ QTextFormatterBreakWords();
+ int format( QTextDocument *doc, QTextParag *parag, int start, const QMap<int, QTextParagLineStart*> &oldLineStarts );
+
+};
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+class Q_EXPORT QTextIndent
+{
+public:
+ QTextIndent();
+ virtual void indent( QTextDocument *doc, QTextParag *parag, int *oldIndent = 0, int *newIndent = 0 ) = 0;
+
+};
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+class Q_EXPORT QTextPreProcessor
+{
+public:
+ enum Ids {
+ Standard = 0
+ };
+
+ QTextPreProcessor();
+ virtual void process( QTextDocument *doc, QTextParag *, int, bool = TRUE ) = 0;
+ virtual QTextFormat *format( int id ) = 0;
+
+};
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+class Q_EXPORT QTextFormat
+{
+ friend class QTextFormatCollection;
+
+public:
+ enum Flags {
+ NoFlags,
+ Bold = 1,
+ Italic = 2,
+ Underline = 4,
+ Family = 8,
+ Size = 16,
+ Color = 32,
+ Misspelled = 64,
+ VAlign = 128,
+ Font = Bold | Italic | Underline | Family | Size,
+ Format = Font | Color | Misspelled | VAlign
+ };
+
+ enum VerticalAlignment { AlignNormal, AlignSubScript, AlignSuperScript };
+
+ QTextFormat();
+ virtual ~QTextFormat() {}
+ QTextFormat( const QStyleSheetItem *s );
+ QTextFormat( const QFont &f, const QColor &c, QTextFormatCollection *parent = 0 );
+ QTextFormat( const QTextFormat &fm );
+ QTextFormat makeTextFormat( const QStyleSheetItem *style, const QMap<QString,QString>& attr ) const;
+ QTextFormat& operator=( const QTextFormat &fm );
+ virtual void copyFormat( const QTextFormat &fm, int flags );
+ QColor color() const;
+ QFont font() const;
+ bool isMisspelled() const;
+ VerticalAlignment vAlign() const;
+ int minLeftBearing() const;
+ int minRightBearing() const;
+ int width( const QChar &c ) const;
+ int width( const QString &str, int pos ) const;
+ int height() const;
+ int ascent() const;
+ int descent() const;
+ QString anchorHref() const;
+ QString anchorName() const;
+ bool isAnchor() const;
+ bool useLinkColor() const;
+
+ void setBold( bool b );
+ void setItalic( bool b );
+ void setUnderline( bool b );
+ void setFamily( const QString &f );
+ void setPointSize( int s );
+ void setFont( const QFont &f );
+ void setColor( const QColor &c );
+ void setMisspelled( bool b );
+ void setVAlign( VerticalAlignment a );
+
+ bool operator==( const QTextFormat &f ) const;
+ QTextFormatCollection *parent() const;
+ void setCollection( QTextFormatCollection *parent ) { collection = parent; }
+ QString key() const;
+
+ static QString getKey( const QFont &f, const QColor &c, bool misspelled, const QString &lhref, const QString &lnm, VerticalAlignment vAlign );
+
+ void addRef();
+ void removeRef();
+
+ QString makeFormatChangeTags( QTextFormat *f ) const;
+ QString makeFormatEndTags() const;
+
+ void setPainter( QPainter *p );
+ void updateStyle();
+ void updateStyleFlags();
+ void setStyle( const QString &s );
+ QString styleName() const { return style; }
+
+ int changed() const { return different; }
+
+protected:
+ virtual void generateKey();
+ QFont fn;
+ void update();
+ void setKey( const QString &key ) { k = key; }
+
+private:
+ QString k;
+ QColor col;
+ QFontMetrics fm;
+ uint missp : 1;
+ uint linkColor : 1;
+ int leftBearing, rightBearing;
+ VerticalAlignment ha;
+ uchar widths[ 256 ];
+ int hei, asc, dsc;
+ QTextFormatCollection *collection;
+ int ref;
+ int logicalFontSize;
+ int stdPointSize;
+ QString anchor_href;
+ QString anchor_name;
+ QPainter *painter;
+ QString style;
+ int different;
+
+};
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+#if defined(Q_TEMPLATEDLL)
+// MOC_SKIP_BEGIN
+template class Q_EXPORT QDict<QTextFormat>;
+// MOC_SKIP_END
+#endif
+
+class Q_EXPORT QTextFormatCollection
+{
+ friend class QTextDocument;
+
+public:
+ QTextFormatCollection();
+ virtual ~QTextFormatCollection();
+
+ void setDefaultFormat( QTextFormat *f );
+ QTextFormat *defaultFormat() const;
+ QTextFormat *format( const QTextFormat *f );
+ virtual QTextFormat *format( QTextFormat *of, QTextFormat *nf, int flags );
+ virtual QTextFormat *format( const QFont &f, const QColor &c );
+ virtual void remove( QTextFormat *f );
+ virtual QTextFormat *createFormat( const QTextFormat &f ) { return new QTextFormat( f ); }
+ virtual QTextFormat *createFormat( const QFont &f, const QColor &c ) { return new QTextFormat( f, c, this ); }
+ void debug();
+
+ void setPainter( QPainter *p );
+ QStyleSheet *styleSheet() const { return sheet; }
+ void setStyleSheet( QStyleSheet *s ) { sheet = s; }
+ void updateStyles();
+ void updateFontSizes( int base );
+ void updateFontAttributes( const QFont &f, const QFont &old );
+
+ QDict<QTextFormat> & dict() { return cKey; }
+
+private:
+ QTextFormat *defFormat, *lastFormat, *cachedFormat;
+ QDict<QTextFormat> cKey;
+ QTextFormat *cres;
+ QFont cfont;
+ QColor ccol;
+ QString kof, knf;
+ int cflags;
+ QStyleSheet *sheet;
+
+};
+
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+inline int QTextString::length() const
+{
+ return data.size();
+}
+
+inline void QTextString::operator+=( const QString &s )
+{
+ insert( length(), s, 0 );
+}
+
+inline int QTextParag::length() const
+{
+ return str->length();
+}
+
+inline QRect QTextParag::rect() const
+{
+ return r;
+}
+
+inline QTextParag *QTextCursor::parag() const
+{
+ return string;
+}
+
+inline int QTextCursor::index() const
+{
+ return idx;
+}
+
+inline void QTextCursor::setIndex( int i, bool restore )
+{
+ if ( restore )
+ restoreState();
+ tmpIndex = -1;
+ idx = i;
+}
+
+inline void QTextCursor::setParag( QTextParag *s, bool restore )
+{
+ if ( restore )
+ restoreState();
+ idx = 0;
+ string = s;
+ tmpIndex = -1;
+}
+
+inline void QTextCursor::checkIndex()
+{
+ if ( idx >= string->length() )
+ idx = string->length() - 1;
+}
+
+inline int QTextCursor::x() const
+{
+ QTextStringChar *c = string->at( idx );
+ int curx = c->x;
+ if ( c->rightToLeft )
+ curx += string->string()->width( idx );
+ return curx;
+}
+
+inline int QTextCursor::y() const
+{
+ int dummy, line;
+ string->lineStartOfChar( idx, &dummy, &line );
+ return string->lineY( line );
+}
+
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+inline int QTextDocument::x() const
+{
+ return cx;
+}
+
+inline int QTextDocument::y() const
+{
+ return cy;
+}
+
+inline int QTextDocument::width() const
+{
+ return QMAX( cw, flow_->width );
+}
+
+inline int QTextDocument::visibleWidth() const
+{
+ return vw;
+}
+
+inline int QTextDocument::height() const
+{
+ if ( lParag )
+ return QMAX( flow_->height, lParag->rect().top() + lParag->rect().height() + 1 );
+ return 0;
+}
+
+inline QTextParag *QTextDocument::firstParag() const
+{
+ return fParag;
+}
+
+inline QTextParag *QTextDocument::lastParag() const
+{
+ return lParag;
+}
+
+inline void QTextDocument::setFirstParag( QTextParag *p )
+{
+ fParag = p;
+}
+
+inline void QTextDocument::setLastParag( QTextParag *p )
+{
+ lParag = p;
+}
+
+inline void QTextDocument::setWidth( int w )
+{
+ cw = QMAX( w, minw );
+ flow_->setWidth( cw );
+ vw = w;
+}
+
+inline int QTextDocument::minimumWidth() const
+{
+ return minw;
+}
+
+inline QTextPreProcessor *QTextDocument::preProcessor() const
+{
+ return pProcessor;
+}
+
+inline void QTextDocument::setPreProcessor( QTextPreProcessor * sh )
+{
+ pProcessor = sh;
+}
+
+inline void QTextDocument::setFormatter( QTextFormatter *f )
+{
+ delete pFormatter;
+ pFormatter = f;
+}
+
+inline QTextFormatter *QTextDocument::formatter() const
+{
+ return pFormatter;
+}
+
+inline void QTextDocument::setIndent( QTextIndent *i )
+{
+ indenter = i;
+}
+
+inline QTextIndent *QTextDocument::indent() const
+{
+ return indenter;
+}
+
+inline QColor QTextDocument::selectionColor( int id ) const
+{
+ return selectionColors[ id ];
+}
+
+inline bool QTextDocument::invertSelectionText( int id ) const
+{
+ return selectionText[ id ];
+}
+
+inline void QTextDocument::setSelectionColor( int id, const QColor &c )
+{
+ selectionColors[ id ] = c;
+}
+
+inline void QTextDocument::setInvertSelectionText( int id, bool b )
+{
+ selectionText[ id ] = b;
+}
+
+inline bool QTextDocument::hasSelection( int id ) const
+{
+ return selections.find( id ) != selections.end();
+}
+
+inline void QTextDocument::setSelectionStart( int id, QTextCursor *cursor )
+{
+ QTextDocumentSelection sel;
+ sel.startCursor = *cursor;
+ sel.endCursor = *cursor;
+ sel.swapped = FALSE;
+ selections[ id ] = sel;
+}
+
+inline QTextParag *QTextDocument::paragAt( int i ) const
+{
+ QTextParag *s = fParag;
+ while ( s ) {
+ if ( s->paragId() == i )
+ return s;
+ s = s->next();
+ }
+ return 0;
+}
+
+inline QTextFormatCollection *QTextDocument::formatCollection() const
+{
+ return fCollection;
+}
+
+inline int QTextDocument::alignment() const
+{
+ return align;
+}
+
+inline void QTextDocument::setAlignment( int a )
+{
+ align = a;
+}
+
+inline int *QTextDocument::tabArray() const
+{
+ return tArray;
+}
+
+inline int QTextDocument::tabStopWidth() const
+{
+ return tStopWidth;
+}
+
+inline void QTextDocument::setTabArray( int *a )
+{
+ tArray = a;
+}
+
+inline void QTextDocument::setTabStops( int tw )
+{
+ tStopWidth = tw;
+}
+
+inline QString QTextDocument::originalText() const
+{
+ return oText;
+}
+
+inline void QTextDocument::setFlow( QTextFlow *f )
+{
+ if ( flow_ )
+ delete flow_;
+ flow_ = f;
+}
+
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+inline QColor QTextFormat::color() const
+{
+ return col;
+}
+
+inline QFont QTextFormat::font() const
+{
+ return fn;
+}
+
+inline bool QTextFormat::isMisspelled() const
+{
+ return missp;
+}
+
+inline QTextFormat::VerticalAlignment QTextFormat::vAlign() const
+{
+ return ha;
+}
+
+inline int QTextFormat::minLeftBearing() const
+{
+ if ( !painter || !painter->isActive() )
+ return leftBearing;
+ painter->setFont( fn );
+ return painter->fontMetrics().minLeftBearing();
+}
+
+inline int QTextFormat::minRightBearing() const
+{
+ if ( !painter || !painter->isActive() )
+ return rightBearing;
+ painter->setFont( fn );
+ return painter->fontMetrics().minRightBearing();
+}
+
+inline int QTextFormat::height() const
+{
+ if ( !painter || !painter->isActive() )
+ return hei;
+ painter->setFont( fn );
+ return painter->fontMetrics().height();
+}
+
+inline int QTextFormat::ascent() const
+{
+ if ( !painter || !painter->isActive() )
+ return asc;
+ painter->setFont( fn );
+ return painter->fontMetrics().ascent();
+}
+
+inline int QTextFormat::descent() const
+{
+ if ( !painter || !painter->isActive() )
+ return dsc;
+ painter->setFont( fn );
+ return painter->fontMetrics().descent();
+}
+
+inline bool QTextFormat::operator==( const QTextFormat &f ) const
+{
+ return k == f.k;
+}
+
+inline QTextFormatCollection *QTextFormat::parent() const
+{
+ return collection;
+}
+
+inline QString QTextFormat::key() const
+{
+ return k;
+}
+
+inline void QTextFormat::generateKey()
+{
+ k = QString::null;
+ QTextOStream ts( &k );
+ ts << fn.pointSize()
+ << fn.weight()
+ << (int)fn.underline()
+ << (int)fn.strikeOut()
+ << (int)fn.italic()
+ << col.pixel()
+ << fn.family()
+ << (int)isMisspelled()
+ << anchor_href
+ << anchor_name
+ << (int)vAlign();
+}
+
+inline QString QTextFormat::getKey( const QFont &fn, const QColor &col, bool misspelled,
+ const QString &lhref, const QString &lnm, VerticalAlignment a )
+{
+ QString k;
+ QTextOStream ts( &k );
+ ts << fn.pointSize()
+ << fn.weight()
+ << (int)fn.underline()
+ << (int)fn.strikeOut()
+ << (int)fn.italic()
+ << col.pixel()
+ << fn.family()
+ << (int)misspelled
+ << lhref
+ << lnm
+ << (int)a;
+ return k;
+}
+
+inline QString QTextFormat::anchorHref() const
+{
+ return anchor_href;
+}
+
+inline QString QTextFormat::anchorName() const
+{
+ return anchor_name;
+}
+
+inline bool QTextFormat::isAnchor() const
+{
+ return !anchor_href.isEmpty() || !anchor_name.isEmpty();
+}
+
+inline bool QTextFormat::useLinkColor() const
+{
+ return linkColor;
+}
+
+inline void QTextFormat::setStyle( const QString &s )
+{
+ style = s;
+ updateStyleFlags();
+}
+
+inline void QTextFormat::updateStyle()
+{
+ if ( !collection || !collection->styleSheet() )
+ return;
+ QStyleSheetItem *item = collection->styleSheet()->item( style );
+ if ( !item )
+ return;
+ if ( !( different & Color ) && item->color().isValid() )
+ col = item->color();
+ if ( !( different & Size ) && item->fontSize() != -1 )
+ fn.setPointSize( item->fontSize() );
+ if ( !( different & Family ) && !item->fontFamily().isEmpty() )
+ fn.setFamily( item->fontFamily() );
+ if ( !( different & Bold ) && item->fontWeight() != -1 )
+ fn.setWeight( item->fontWeight() );
+ if ( !( different & Italic ) && item->definesFontItalic() )
+ fn.setItalic( item->fontItalic() );
+ if ( !( different & Underline ) && item->definesFontUnderline() )
+ fn.setUnderline( item->fontUnderline() );
+ generateKey();
+ update();
+
+}
+
+inline void QTextFormat::updateStyleFlags()
+{
+ different = NoFlags;
+ if ( !collection || !collection->styleSheet() )
+ return;
+ QStyleSheetItem *item = collection->styleSheet()->item( style );
+ if ( !item )
+ return;
+ if ( item->color() != col )
+ different |= Color;
+ if ( item->fontSize() != fn.pointSize() )
+ different |= Size;
+ if ( item->fontFamily() != fn.family() )
+ different |= Family;
+ if ( item->fontItalic() != fn.italic() )
+ different |= Italic;
+ if ( item->fontUnderline() != fn.underline() )
+ different |= Underline;
+ if ( item->fontWeight() != fn.weight() )
+ different |= Bold;
+}
+
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+inline QTextStringChar &QTextString::at( int i ) const
+{
+ return data[ i ];
+}
+
+inline QString QTextString::toString( const QArray<QTextStringChar> &data )
+{
+ QString s;
+ int l = data.size();
+ s.setUnicode( 0, l );
+ QTextStringChar *c = data.data();
+ QChar *uc = (QChar *)s.unicode();
+ while ( l-- ) {
+ *uc = c->c;
+ uc++;
+ c++;
+ }
+
+ return s;
+}
+
+inline QString QTextString::toString() const
+{
+ return toString( data );
+}
+
+inline QString QTextString::toReverseString() const
+{
+ QString s;
+ int l = length();
+ s.setUnicode(0, l);
+ QTextStringChar *c = data.data() + (l-1);
+ QChar *uc = (QChar *)s.unicode();
+ while ( l-- ) {
+ *uc = c->c;
+ uc++;
+ c--;
+ }
+
+ return s;
+}
+
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+inline QTextStringChar *QTextParag::at( int i ) const
+{
+ return &str->at( i );
+}
+
+inline bool QTextParag::isValid() const
+{
+ return invalid == -1;
+}
+
+inline bool QTextParag::hasChanged() const
+{
+ return changed;
+}
+
+inline void QTextParag::setChanged( bool b, bool recursive )
+{
+ changed = b;
+ if ( recursive ) {
+ if ( doc && doc->parentParag() )
+ doc->parentParag()->setChanged( b, recursive );
+ }
+}
+
+inline void QTextParag::append( const QString &s, bool reallyAtEnd )
+{
+ if ( reallyAtEnd )
+ insert( str->length(), s );
+ else
+ insert( QMAX( str->length() - 1, 0 ), s );
+}
+
+inline QTextParag *QTextParag::prev() const
+{
+ return p;
+}
+
+inline QTextParag *QTextParag::next() const
+{
+ return n;
+}
+
+inline void QTextParag::setSelection( int id, int start, int end )
+{
+ QMap<int, QTextParagSelection>::ConstIterator it = selections.find( id );
+ if ( it != selections.end() ) {
+ if ( start == ( *it ).start && end == ( *it ).end )
+ return;
+ }
+
+ QTextParagSelection sel;
+ sel.start = start;
+ sel.end = end;
+ selections[ id ] = sel;
+ setChanged( TRUE, TRUE );
+}
+
+inline void QTextParag::removeSelection( int id )
+{
+ if ( !hasSelection( id ) )
+ return;
+ selections.remove( id );
+ setChanged( TRUE, TRUE );
+}
+
+inline int QTextParag::selectionStart( int id ) const
+{
+ QMap<int, QTextParagSelection>::ConstIterator it = selections.find( id );
+ if ( it == selections.end() )
+ return -1;
+ return ( *it ).start;
+}
+
+inline int QTextParag::selectionEnd( int id ) const
+{
+ QMap<int, QTextParagSelection>::ConstIterator it = selections.find( id );
+ if ( it == selections.end() )
+ return -1;
+ return ( *it ).end;
+}
+
+inline bool QTextParag::hasSelection( int id ) const
+{
+ QMap<int, QTextParagSelection>::ConstIterator it = selections.find( id );
+ if ( it == selections.end() )
+ return FALSE;
+ return ( *it ).start != ( *it ).end || length() == 1;
+}
+
+inline bool QTextParag::hasAnySelection() const
+{
+ return !selections.isEmpty();
+}
+
+inline bool QTextParag::fullSelected( int id ) const
+{
+ QMap<int, QTextParagSelection>::ConstIterator it = selections.find( id );
+ if ( it == selections.end() )
+ return FALSE;
+ return ( *it ).start == 0 && ( *it ).end == str->length() - 1;
+}
+
+inline void QTextParag::setEndState( int s )
+{
+ if ( s == state )
+ return;
+ state = s;
+}
+
+inline int QTextParag::endState() const
+{
+ return state;
+}
+
+inline void QTextParag::setParagId( int i )
+{
+ id = i;
+}
+
+inline int QTextParag::paragId() const
+{
+// if ( id == -1 )
+// qWarning( "invalid parag id!!!!!!!! (%p)", (void*)this );
+ return id;
+}
+
+inline bool QTextParag::firstPreProcess() const
+{
+ return firstPProcess;
+}
+
+inline void QTextParag::setFirstPreProcess( bool b )
+{
+ firstPProcess = b;
+}
+
+inline QMap<int, QTextParagLineStart*> &QTextParag::lineStartList()
+{
+ return lineStarts;
+}
+
+inline int QTextParag::lineY( int l ) const
+{
+ if ( l > (int)lineStarts.count() - 1 ) {
+// qWarning( "QTextParag::lineY: line %d out of range!", l );
+ return 0;
+ }
+
+ if ( !isValid() )
+ ( (QTextParag*)this )->format();
+
+ QMap<int, QTextParagLineStart*>::ConstIterator it = lineStarts.begin();
+ while ( l-- > 0 )
+ ++it;
+ return ( *it )->y;
+}
+
+inline int QTextParag::lineBaseLine( int l ) const
+{
+ if ( l > (int)lineStarts.count() - 1 ) {
+// qWarning( "QTextParag::lineBaseLine: line %d out of range!", l );
+ return 10;
+ }
+
+ if ( !isValid() )
+ ( (QTextParag*)this )->format();
+
+ QMap<int, QTextParagLineStart*>::ConstIterator it = lineStarts.begin();
+ while ( l-- > 0 )
+ ++it;
+ return ( *it )->baseLine;
+}
+
+inline int QTextParag::lineHeight( int l ) const
+{
+ if ( l > (int)lineStarts.count() - 1 ) {
+// qWarning( "QTextParag::lineHeight: line %d out of range!", l );
+ return 15;
+ }
+
+ if ( !isValid() )
+ ( (QTextParag*)this )->format();
+
+ QMap<int, QTextParagLineStart*>::ConstIterator it = lineStarts.begin();
+ while ( l-- > 0 )
+ ++it;
+ return ( *it )->h;
+}
+
+inline void QTextParag::lineInfo( int l, int &y, int &h, int &bl ) const
+{
+ if ( l > (int)lineStarts.count() - 1 ) {
+// qWarning( "QTextParag::lineInfo: line %d out of range!", l );
+ qDebug( "%d %d", lineStarts.count() - 1, l );
+ y = 0;
+ h = 15;
+ bl = 10;
+ return;
+ }
+
+ if ( !isValid() )
+ ( (QTextParag*)this )->format();
+
+ QMap<int, QTextParagLineStart*>::ConstIterator it = lineStarts.begin();
+ while ( l-- > 0 )
+ ++it;
+ y = ( *it )->y;
+ h = ( *it )->h;
+ bl = ( *it )->baseLine;
+}
+
+inline QTextString *QTextParag::string() const
+{
+ return str;
+}
+
+inline QTextDocument *QTextParag::document() const
+{
+ return doc;
+}
+
+inline void QTextParag::setAlignment( int a )
+{
+ if ( a == align )
+ return;
+ align = a;
+ invalidate( 0 );
+}
+
+inline int QTextParag::alignment() const
+{
+ if ( align != -1 )
+ return align;
+ QStyleSheetItem *item = style();
+ if ( !item )
+ return Qt3::AlignAuto;
+ for ( int i = 0; i < (int)styleSheetItemsVec.size(); ++i ) {
+ item = styleSheetItemsVec[ i ];
+ if ( item->alignment() != QStyleSheetItem::Undefined )
+ return item->alignment();
+ }
+ return Qt3::AlignAuto;
+}
+
+inline QVector<QStyleSheetItem> QTextParag::styleSheetItems() const
+{
+ QVector<QStyleSheetItem> vec;
+ vec.resize( styleSheetItemsVec.size() );
+ for ( int i = 0; i < (int)vec.size(); ++i )
+ vec.insert( i, styleSheetItemsVec[ i ] );
+ return vec;
+}
+
+inline QStyleSheetItem *QTextParag::style() const
+{
+ if ( styleSheetItemsVec.size() == 0 )
+ return 0;
+ return styleSheetItemsVec[ styleSheetItemsVec.size() - 1 ];
+}
+
+inline int QTextParag::numberOfSubParagraph() const
+{
+ if ( numSubParag != -1 )
+ return numSubParag;
+ int n = 0;
+ QTextParag *p = (QTextParag*)this;
+ while ( p && style() == p->style() && listStyle() == p->listStyle() ) {
+ ++n;
+ p = p->prev();
+ }
+ ( (QTextParag*)this )->numSubParag = n;
+ return n;
+}
+
+inline void QTextParag::setListStyle( QStyleSheetItem::ListStyle ls )
+{
+ listS = ls;
+ invalidate( 0 );
+}
+
+inline QStyleSheetItem::ListStyle QTextParag::listStyle() const
+{
+ return listS;
+}
+
+inline void QTextParag::setFormat( QTextFormat *fm )
+{
+ bool doUpdate = (bool)defFormat && defFormat != formatCollection()->defaultFormat();
+ defFormat = formatCollection()->format( fm );
+ if ( !doUpdate )
+ return;
+ for ( int i = 0; i < length(); ++i ) {
+ if ( at( i )->format()->styleName() == defFormat->styleName() )
+ at( i )->format()->updateStyle();
+ }
+}
+
+inline QTextFormat *QTextParag::paragFormat() const
+{
+ return defFormat;
+}
+
+inline void QTextParag::registerFloatingItem( QTextCustomItem *i )
+{
+ floatingItems.append( i );
+}
+
+inline void QTextParag::unregisterFloatingItem( QTextCustomItem *i )
+{
+ floatingItems.removeRef( i );
+}
+
+inline void QTextParag::addCustomItem()
+{
+ numCustomItems++;
+}
+
+inline void QTextParag::removeCustomItem()
+{
+ numCustomItems--;
+}
+
+inline int QTextParag::customItems() const
+{
+ return numCustomItems;
+}
+
+inline QBrush *QTextParag::background() const
+{
+ return tc ? tc->backGround() : 0;
+}
+
+
+inline void QTextParag::setDocumentRect( const QRect &r )
+{
+ docRect = r;
+}
+
+inline int QTextParag::documentWidth() const
+{
+ return doc ? doc->width() : docRect.width();
+}
+
+inline int QTextParag::documentVisibleWidth() const
+{
+ return doc ? doc->visibleWidth() : docRect.width();
+}
+
+inline int QTextParag::documentX() const
+{
+ return doc ? doc->x() : docRect.x();
+}
+
+inline int QTextParag::documentY() const
+{
+ return doc ? doc->y() : docRect.y();
+}
+
+inline QTextFormatter *QTextParag::formatter() const
+{
+ if ( doc )
+ return doc->formatter();
+ if ( pFormatter )
+ return pFormatter;
+ return ( ( (QTextParag*)this )->pFormatter = new QTextFormatterBreakWords );
+}
+
+inline void QTextParag::setFormatter( QTextFormatter *f )
+{
+ if ( doc ) return;
+ if ( pFormatter ) delete pFormatter;
+ pFormatter = f;
+}
+
+inline int QTextParag::minimumWidth() const
+{
+ return doc ? doc->minimumWidth() : 0;
+}
+
+inline void QTextParag::setExtraData( QTextParagData *data )
+{
+ eData = data;
+}
+
+inline QTextParagData *QTextParag::extraData() const
+{
+ return eData;
+}
+
+inline void QTextParag::setNewLinesAllowed( bool b )
+{
+ newLinesAllowed = b;
+}
+
+inline bool QTextParag::isNewLinesAllowed() const
+{
+ return newLinesAllowed;
+}
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+inline void QTextFormatCollection::setDefaultFormat( QTextFormat *f )
+{
+ defFormat = f;
+}
+
+inline QTextFormat *QTextFormatCollection::defaultFormat() const
+{
+ return defFormat;
+}
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+inline QTextStringChar::~QTextStringChar()
+{
+ if ( format() )
+ format()->removeRef();
+ switch ( type ) {
+ case Custom:
+ delete d.custom; break;
+ case Mark:
+ delete d.mark; break;
+ case Shaped:
+ delete d.shaped; break;
+ default:
+ break;
+ }
+}
+
+inline QTextFormat *QTextStringChar::format() const
+{
+ return (type == Regular) ? d.format : d.custom->format;
+}
+
+
+inline QTextCustomItem *QTextStringChar::customItem() const
+{
+ return isCustom() ? d.custom->custom : 0;
+}
+
+inline int QTextStringChar::height() const
+{
+ return !isCustom() ? format()->height() : ( customItem()->placement() == QTextCustomItem::PlaceInline ? customItem()->height : 0 );
+}
+
+inline int QTextStringChar::ascent() const
+{
+ return !isCustom() ? format()->ascent() : ( customItem()->placement() == QTextCustomItem::PlaceInline ? customItem()->height : 0 );
+}
+
+inline int QTextStringChar::descent() const
+{
+ return !isCustom() ? format()->descent() : 0;
+}
+
+}; // namespace
+
+#endif
+
diff --git a/bibletime/frontend/thirdparty/qt3stuff/qstylesheet.cpp b/bibletime/frontend/thirdparty/qt3stuff/qstylesheet.cpp
new file mode 100644
index 0000000..98dc721
--- /dev/null
+++ b/bibletime/frontend/thirdparty/qt3stuff/qstylesheet.cpp
@@ -0,0 +1,1349 @@
+/****************************************************************************
+** $Id: qstylesheet.cpp,v 1.5 2001/06/15 13:32:21 joachim Exp $
+**
+** Implementation of the QStyleSheet class
+**
+** Created : 990101
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the kernel module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qstylesheet.h"
+
+#ifndef QT_NO_RICHTEXT
+
+#include "qrichtext_p.h"
+#include "qlayout.h"
+#include "qpainter.h"
+#include "qcleanuphandler.h"
+
+#include <stdio.h>
+
+using namespace Qt3;
+
+class QStyleSheetItem::Data
+{
+public:
+ QStyleSheetItem::DisplayMode disp;
+ int fontitalic;
+ int fontunderline;
+ int fontweight;
+ int fontsize;
+ int fontsizelog;
+ int fontsizestep;
+ int lineSpacing;
+ QString fontfamily;
+ QStyleSheetItem *parentstyle;
+ QString stylename;
+ int ncolumns;
+ QColor col;
+ bool anchor;
+ int align;
+ int margin[5];
+ QStyleSheetItem::ListStyle list;
+ QStyleSheetItem::WhiteSpaceMode whitespacemode;
+ QString contxt;
+ bool selfnest;
+ QStyleSheet* sheet;
+};
+
+/*!
+ \class QStyleSheetItem qstylesheet.h
+ \brief The QStyleSheetItem class encapsulates a text format.
+
+ A style consists of a name and a set of font, color, and other
+ display properties. When used in a \link QStyleSheet style
+ sheet\endlink, items define the name of a rich text tag and the
+ display property changes associated with it.
+*/
+
+
+/*! \enum QStyleSheetItem::WhiteSpaceMode
+
+ This enum defines the ways in which QStyleSheet can treat whitespace. There are three values at present:
+
+ \value WhiteSpaceNormal any sequence of whitespace is equivalent
+ to a single space and is a line-break position.
+
+ \value WhiteSpacePre whitespace must be output exactly as given
+ in the input.
+
+ \value WhiteSpaceNoWrap multiple spaces are collapsed as with
+ WhiteSpaceNormal, but no automatic linebreaks occur. To break lines manually,
+ use the <tt>&lt;br&gt;</tt> tag.
+
+*/
+
+/*! \enum QStyleSheetItem::Margin
+
+ \value MarginLeft left margin
+ \value MarginRight right margin
+ \value MarginTop top margin
+ \value MarginBottom bottom margin
+ \value MarginAll all margins (left, right, top and bottom)
+ \value MarginVertical top and bottom margins
+ \value MarginHorizontal left and right margins
+ \value MarginFirstLine margin (indentation) of the first line of a paragarph (in addition to the MarginLeft of the paragraph)
+*/
+
+/*!
+ Constructs a new style named \a name for the stylesheet \a parent.
+
+ All properties in QStyleSheetItem are initially in the "do not change" state,
+ except \link QStyleSheetItem::DisplayMode display mode\endlink, which defaults
+ to \c DisplayInline.
+*/
+QStyleSheetItem::QStyleSheetItem( QStyleSheet* parent, const QString& name )
+{
+ d = new Data;
+ d->stylename = name.lower();
+ d->sheet = parent;
+ init();
+ if (parent)
+ parent->insert( this );
+}
+
+/*!
+ Copy constructor. Constructs a copy of \a other that is
+ not bound to any style sheet.
+ */
+QStyleSheetItem::QStyleSheetItem( const QStyleSheetItem & other )
+{
+ d = new Data;
+ *d = *other.d;
+}
+
+
+/*!
+ Destructs the style. Note that QStyleSheetItem objects become owned
+ by QStyleSheet when they are created.
+ */
+QStyleSheetItem::~QStyleSheetItem()
+{
+ delete d;
+}
+
+
+
+/*!
+ Returns the style sheet this item is in.
+ */
+QStyleSheet* QStyleSheetItem::styleSheet()
+{
+ return d->sheet;
+}
+
+/*!
+ Returns the style sheet this item is in.
+ */
+const QStyleSheet* QStyleSheetItem::styleSheet() const
+{
+ return d->sheet;
+}
+
+/*!
+ \internal
+ Internal initialization
+ */
+void QStyleSheetItem::init()
+{
+ d->disp = DisplayInline;
+
+ d->fontitalic = Undefined;
+ d->fontunderline = Undefined;
+ d->fontweight = Undefined;
+ d->fontsize = Undefined;
+ d->fontsizelog = Undefined;
+ d->fontsizestep = 0;
+ d->ncolumns = Undefined;
+ d->col = QColor(); // !isValid()
+ d->anchor = FALSE;
+ d->align = Undefined;
+ d->margin[0] = Undefined;
+ d->margin[1] = Undefined;
+ d->margin[2] = Undefined;
+ d->margin[3] = Undefined;
+ d->margin[4] = Undefined;
+ d->list = QStyleSheetItem::ListDisc;
+ d->whitespacemode = QStyleSheetItem::WhiteSpaceNormal;
+ d->selfnest = TRUE;
+ d->lineSpacing = Undefined;
+}
+
+/*!
+ Returns the name of style.
+*/
+QString QStyleSheetItem::name() const
+{
+ return d->stylename;
+}
+
+/*!
+ Returns the \link QStyleSheetItem::DisplayMode display mode\endlink of the style.
+
+ \sa setDisplayMode()
+ */
+QStyleSheetItem::DisplayMode QStyleSheetItem::displayMode() const
+{
+ return d->disp;
+}
+
+/*! \enum QStyleSheetItem::DisplayMode
+
+ This enum type defines the way adjacent elements are displayed. The possible values are:
+
+ \value DisplayBlock elements are displayed as a rectangular block (e.g.,
+ &lt;P&gt; ... &lt;/P&gt;).
+
+ \value DisplayInline elements are displayed in a horizontally flowing
+ sequence (e.g., &lt;EM&gt; ... &lt;/EM&gt;).
+
+ \value DisplayListItem elements are displayed in a vertically sequence
+ (e.g., &lt;EM&gt; ... &lt;/EM&gt;).
+
+ \value DisplayNone elements are not displayed at all.
+*/
+
+/*!
+ Sets the display mode of the style to \a m.
+
+ \sa displayMode()
+ */
+void QStyleSheetItem::setDisplayMode(DisplayMode m)
+{
+ d->disp=m;
+}
+
+
+/*!
+ Returns the alignment of this style. Possible values are AlignAuto, AlignLeft,
+ AlignRight, AlignCenter and AlignJustify.
+
+ \sa setAlignment(), Qt::AlignmentFlags
+ */
+int QStyleSheetItem::alignment() const
+{
+ return d->align;
+}
+
+/*!
+ Sets the alignment. This only makes sense for styles with
+ \link QStyleSheetItem::DisplayMode display mode\endlink
+ DisplayBlock. Possible values are AlignAuto, AlignLeft, AlignRight,
+ AlignCenter and AlignJustify.
+
+ \sa alignment(), displayMode(), Qt::AlignmentFlags
+ */
+void QStyleSheetItem::setAlignment( int f )
+{
+ d->align = f;
+}
+
+
+/*!
+ Returns whether the style sets an italic or upright font.
+
+ \sa setFontItalic(), definesFontItalic()
+ */
+bool QStyleSheetItem::fontItalic() const
+{
+ return d->fontitalic > 0;
+}
+
+/*!
+ Sets italic or upright shape for the style.
+
+ \sa fontItalic(), definesFontItalic()
+ */
+void QStyleSheetItem::setFontItalic(bool italic)
+{
+ d->fontitalic = italic?1:0;
+}
+
+/*!
+ Returns whether the style defines a font shape. A style
+ does not define any shape until setFontItalic() is called.
+
+ \sa setFontItalic(), fontItalic()
+ */
+bool QStyleSheetItem::definesFontItalic() const
+{
+ return d->fontitalic != Undefined;
+}
+
+/*!
+ Returns whether the style sets an underlined font.
+
+ \sa setFontUnderline(), definesFontUnderline()
+ */
+bool QStyleSheetItem::fontUnderline() const
+{
+ return d->fontunderline > 0;
+}
+
+/*!
+ Sets underline for the style.
+
+ \sa fontUnderline(), definesFontUnderline()
+ */
+void QStyleSheetItem::setFontUnderline(bool underline)
+{
+ d->fontunderline = underline?1:0;
+}
+
+/*!
+ Returns whether the style defines a setting for the underline
+ property of the font. A style does not define this until
+ setFontUnderline() is called.
+
+ \sa setFontUnderline(), fontUnderline() */
+bool QStyleSheetItem::definesFontUnderline() const
+{
+ return d->fontunderline != Undefined;
+}
+
+
+/*!
+ Returns the font weight setting of the style. This is either a
+ valid QFont::Weight or the value QStyleSheetItem::Undefined.
+
+ \sa setFontWeight(), QFont
+ */
+int QStyleSheetItem::fontWeight() const
+{
+ return d->fontweight;
+}
+
+/*!
+ Sets the font weight setting of the style. Valid values are
+ those defined by QFont::Weight.
+
+ \sa QFont, fontWeight()
+ */
+void QStyleSheetItem::setFontWeight(int w)
+{
+ d->fontweight = w;
+}
+
+/*!
+ Returns the logical font size setting of the style. This is either a valid
+ size between 1 and 7 or QStyleSheetItem::Undefined.
+
+ \sa setLogicalFontSize(), setLogicalFontSizeStep(), QFont::pointSize(), QFont::setPointSize()
+ */
+int QStyleSheetItem::logicalFontSize() const
+{
+ return d->fontsizelog;
+}
+
+
+/*!
+ Sets the logical font size setting of the style tp \a s.
+ Valid logical sizes are 1 to 7.
+
+ \sa logicalFontSize(), QFont::pointSize(), QFont::setPointSize()
+ */
+void QStyleSheetItem::setLogicalFontSize(int s)
+{
+ d->fontsizelog = s;
+}
+
+/*!
+ Returns the logical font size step of this style.
+
+ The default is 0. Tags such as \c big define \c +1; \c small defines
+ \c -1.
+
+ \sa setLogicalFontSizeStep()
+ */
+int QStyleSheetItem::logicalFontSizeStep() const
+{
+ return d->fontsizestep;
+}
+
+/*!
+ Sets the logical font size step of this style to \a s.
+
+ \sa logicalFontSizeStep()
+ */
+void QStyleSheetItem::setLogicalFontSizeStep( int s )
+{
+ d->fontsizestep = s;
+}
+
+
+
+/*!
+ Sets the font size setting of the style in point measures.
+
+ \sa fontSize(), QFont::pointSize(), QFont::setPointSize()
+ */
+void QStyleSheetItem::setFontSize(int s)
+{
+ d->fontsize = s;
+}
+
+/*!
+ Returns the font size setting of the style. This is either a valid
+ point size or QStyleSheetItem::Undefined.
+
+ \sa setFontSize(), QFont::pointSize(), QFont::setPointSize()
+ */
+int QStyleSheetItem::fontSize() const
+{
+ return d->fontsize;
+}
+
+
+/*!
+ Returns the font family setting of the style. This is either a valid
+ font family or QString::null if no family has been set.
+
+ \sa setFontFamily(), QFont::family(), QFont::setFamily()
+ */
+QString QStyleSheetItem::fontFamily() const
+{
+ return d->fontfamily;
+}
+
+/*!
+ Sets the font family setting of the style.
+
+ \sa fontFamily(), QFont::family(), QFont::setFamily()
+ */
+void QStyleSheetItem::setFontFamily( const QString& fam)
+{
+ d->fontfamily = fam;
+}
+
+
+/*!\obsolete
+ Returns the number of columns for this style.
+
+ \sa setNumberOfColumns(), displayMode(), setDisplayMode()
+
+ */
+int QStyleSheetItem::numberOfColumns() const
+{
+ return d->ncolumns;
+}
+
+
+/*!\obsolete
+ Sets the number of columns for this style. Elements in the style
+ are divided into columns.
+
+ This makes sense only if the style uses a block display mode
+ (see QStyleSheetItem::DisplayMode).
+
+ \sa numberOfColumns()
+ */
+void QStyleSheetItem::setNumberOfColumns(int ncols)
+{
+ if (ncols > 0)
+ d->ncolumns = ncols;
+}
+
+
+/*!
+ Returns the text color of this style or an invalid color
+ if no color has been set yet.
+
+ \sa setColor() QColor::isValid()
+ */
+QColor QStyleSheetItem::color() const
+{
+ return d->col;
+}
+
+/*!
+ Sets the text color of this style.
+
+ \sa color()
+ */
+void QStyleSheetItem::setColor( const QColor &c)
+{
+ d->col = c;
+}
+
+/*!
+ Returns whether this style is an anchor.
+
+ \sa setAnchor()
+ */
+bool QStyleSheetItem::isAnchor() const
+{
+ return d->anchor;
+}
+
+/*!
+ Sets whether the style is an anchor (link). Elements in this style
+ have connections to other documents or anchors.
+
+ \sa isAnchor()
+ */
+void QStyleSheetItem::setAnchor(bool anc)
+{
+ d->anchor = anc;
+}
+
+
+/*!
+ Returns the whitespace mode.
+
+ \sa setWhiteSpaceMode()
+ */
+QStyleSheetItem::WhiteSpaceMode QStyleSheetItem::whiteSpaceMode() const
+{
+ return d->whitespacemode;
+}
+
+/*!
+ Sets the whitespace mode to \a m. Possible values are
+ <ul>
+ <li> \c WhiteSpaceNormal
+ - whitespace in the document serves only as separators.
+ Multiple spaces or indentation are ignored.
+ <li> \c WhiteSpacePre
+ - whitespace is preserved. This is particulary useful to
+ display programming code.
+ <li> \c WhiteSpaceNoWrap
+ - multiple spaces are collapsed as with WhiteSpaceNormal, but no
+ automatic linebreaks occur. To break lines manually use the
+ <tt>&lt;br&gt;</tt> tag.
+ </ul>
+ */
+void QStyleSheetItem::setWhiteSpaceMode(WhiteSpaceMode m)
+{
+ d->whitespacemode = m;
+}
+
+
+/*!
+ Returns the width of margin \a m in pixel.
+
+ The margin determinator \a m can be \c MarginLeft, \c MarginRight,
+ \c MarginTop, \c MarginBottom, \c MarginAll, \c MarginVertical or \c
+ MarginHorizontal.
+
+ \sa setMargin()
+ */
+int QStyleSheetItem::margin(Margin m) const
+{
+ return d->margin[m];
+}
+
+
+/*!
+ Sets the width of margin \a m to \a v pixels.
+
+ The margin determinator \a m can be \c MarginLeft, \c MarginRight,
+ \c MarginTop, \c MarginBottom, \c MarginAll, \c MarginVertical or \c
+ MarginHorizontal. The value \a v must be >= 0.
+
+ \sa margin()
+ */
+void QStyleSheetItem::setMargin(Margin m, int v)
+{
+ if (m == MarginAll ) {
+ d->margin[0] = v;
+ d->margin[1] = v;
+ d->margin[2] = v;
+ d->margin[3] = v;
+ d->margin[4] = v;
+ } else if (m == MarginVertical ) {
+ d->margin[MarginTop] = v;
+ d->margin[MarginBottom] = v;
+ } else if (m == MarginHorizontal ) {
+ d->margin[MarginLeft] = v;
+ d->margin[MarginRight] = v;
+ } else {
+ d->margin[m] = v;
+ }
+}
+
+
+/*!
+ Returns the list style of the style.
+
+ \sa setListStyle()
+ */
+QStyleSheetItem::ListStyle QStyleSheetItem::listStyle() const
+{
+ return d->list;
+}
+
+/*! \enum QStyleSheetItem::ListStyle
+
+ This enum type defines how the items in a list are prefixed when
+ displayed. The currently defined values are:
+
+ \value ListDisc a filled circle
+ \value ListCircle an unfilled circle
+ \value ListSquare a filled circle
+ \value ListDecimal an integer in base 10: \e 1, \e 2, \e 3, ...
+ \value ListLowerAlpha a lowercase letter: \e a, \e b, \e c, ...
+ \value ListUpperAlpha an uppercase letter: \e A, \e B, \e C, ...
+*/
+/*!
+ Sets the list style of the style.
+
+ This is used by nested elements that have a display mode of
+ DisplayListItem.
+
+ \sa listStyle() DisplayMode
+ */
+void QStyleSheetItem::setListStyle(ListStyle s)
+{
+ d->list=s;
+}
+
+
+/*! Returns a space-separated list of names of styles that may
+ contain elements of this style. If nothing has been set, contexts()
+ returns an empty string, which indicates that this style can be
+ nested everywhere.
+
+ \sa setContexts()
+ */
+QString QStyleSheetItem::contexts() const
+{
+ return d->contxt;
+}
+
+/*!
+ Sets a space-separated list of names of styles that may contain
+ elements of this style. If \a c is empty, the style can be nested
+ everywhere.
+
+ \sa contexts()
+ */
+void QStyleSheetItem::setContexts( const QString& c)
+{
+ d->contxt = QChar(' ') + c + QChar(' ');
+}
+
+/*!
+ Returns TRUE if this style can be nested into an element
+ of style \a s, and FALSE otherwise.
+
+ \sa contxts(), setContexts()
+ */
+bool QStyleSheetItem::allowedInContext( const QStyleSheetItem* s) const
+{
+ if ( d->contxt.isEmpty() )
+ return TRUE;
+ return d->contxt.find( QChar(' ')+s->name()+QChar(' ')) != -1;
+}
+
+
+/*!
+ Returns whether this style has self-nesting enabled.
+
+ \sa setSelfNesting()
+ */
+bool QStyleSheetItem::selfNesting() const
+{
+ return d->selfnest;
+}
+
+/*!
+ Sets the self-nesting property for this style to \a nesting.
+
+ In order to support "dirty" HTML, paragraphs &lt;p&gt and list items
+ &lt;li&gt are not self-nesting. This means that starting a new
+ paragraph or list item automatically closes the previous one.
+
+ \sa selfNesting()
+ */
+void QStyleSheetItem::setSelfNesting( bool nesting )
+{
+ d->selfnest = nesting;
+}
+
+/*! Sets the linespacing to be \a ls pixels */
+
+void QStyleSheetItem::setLineSpacing( int ls )
+{
+ d->lineSpacing = ls;
+}
+
+/*! Returns the linespacing */
+
+int QStyleSheetItem::lineSpacing() const
+{
+ return d->lineSpacing;
+}
+
+//************************************************************************
+
+
+
+
+//************************************************************************
+
+
+/*!
+ \class QStyleSheet qstylesheet.h
+ \brief A collection of styles for rich text rendering and a generator of tags.
+
+ \ingroup drawing
+ \ingroup helpsystem
+
+ By creating QStyleSheetItem objects for a style sheet you build a
+ definition of a set of tags. This definition will be used by the
+ internal rich text rendering system to parse and display text
+ documents to which the style sheet applies. Rich text is normally
+ visualized in a QTextView or a QTextBrowser. However, QLabel,
+ QWhatsThis and QMessageBox also support it, and other classes are likely to
+ follow. With QSimpleRichText it is possible to use the rich text
+ renderer for custom widgets as well.
+
+ The default QStyleSheet object has the following style bindings,
+ sorted by structuring bindings, anchors, character style bindings
+ (i.e., inline styles), special elements such as horizontal lines or
+ images, and other tags. In addition, rich text supports simple HTML
+ tables.
+
+ The structuring tags are
+ <ul>
+ <li><tt>&lt;qt&gt;</tt>...<tt>&lt;/qt&gt;</tt>
+ - A Qt rich text document. It understands the following attributes:
+ <ul>
+ <li> \c title
+ - The caption of the document. This attribute is easily accessible with
+ QTextView::documentTitle().
+ <li> \c type
+ - The type of the document. The default type is \c page . It indicates that
+ the document is displayed in a page of its own. Another style is \c detail,
+ which can be used to explain certain expressions in more detail in a few
+ sentences. The QTextBrowser will then keep the current page and display the
+ new document in a small popup similar to QWhatsThis. Note that links
+ will not work in documents with <tt>&lt;qt type="detail"&gt;</tt>...&lt;/qt&gt.
+ <li> \c bgcolor
+ - The background color, for example \c bgcolor="yellow" or \c bgcolor="#0000FF".
+ <li> \c background
+ - The background pixmap, for example \c background="granit.xpm". The pixmap name
+ will be resolved by a QMimeSourceFactory().
+ <li> \c text
+ - The default text color, for example \c text="red".
+ <li> \c link
+ - The link color, for example \c link="green".
+ </ul>
+ <li><tt>&lt;h1&gt;</tt>...<tt>&lt;/h1&gt;</tt>
+ - A top-level heading.
+ <li><tt>&lt;h2&gt;</tt>...<tt>&lt;/h2&gt;</tt>
+ - A sublevel heading.
+ <li><tt>&lt;h3&gt;</tt>...<tt>&lt;/h3&gt;</tt>
+ - A sub-sublevel heading.
+ <li><tt>&lt;p&gt;</tt>...<tt>&lt;/p&gt;</tt>
+ - A left-aligned paragraph. Adjust the alignment with
+ the \c align attribute. Possible values are
+ \c left, \c right and \c center.
+ <li><tt>&lt;center&gt;</tt>...<tt>&lt;/center&gt;</tt>
+ - A centered paragraph.
+ <li><tt>&lt;blockquote&gt;</tt>...<tt>&lt;/blockquote&gt;</tt>
+ - An indented paragraph that is useful for quotes.
+ <li><tt>&lt;ul&gt;</tt>...<tt>&lt;/ul&gt;</tt>
+ - An unordered list. You can also pass a type argument to
+ define the bullet style. The default is \c type=disc; other
+ types are \c circle and \c square.
+ <li><tt>&lt;ol&gt;</tt>...<tt>&lt;/ol&gt;</tt>
+ - An ordered list. You can also pass a type argument to define
+ the enumeration label style. The default is \c type="1"; other
+ types are \c "a" and \c "A".
+ <li><tt>&lt;li&gt;</tt>...<tt>&lt;/li&gt;</tt>
+ - A list item. This tag can be used only within the context of
+ \c ol or \c ul.
+ <li><tt>&lt;pre&gt;</tt>...<tt>&lt;/pre&gt;</tt>
+ - For larger junks of code. Whitespaces in the contents are preserved.
+ For small bits of code use the inline-style \c code.
+ </ul>
+
+ Anchors and links are done with a single tag:
+ <ul>
+ <li><tt>&lt;a&gt;</tt>...<tt>&lt;/a&gt;</tt>
+ - An anchor or link. The reference target is defined in the
+ \c href attribute of the tag as in <tt>&lt;a href="target.qml"&gt;</tt>...<tt>&lt;/a&gt;</tt>.
+ You can also specify an additional anchor within the specified target document, for
+ example <tt>&lt;a href="target.qml#123"&gt;</tt>...<tt>&lt;/a&gt;</tt>. If
+ \c a is meant to be an anchor, the reference source is given in
+ the \c name attribute.
+ </ul>
+
+ The default character style bindings are
+ <ul>
+ <li><tt>&lt;em&gt;</tt>...<tt>&lt;/em&gt;</tt>
+ - Emphasized. By default this is the same as <tt>&lt;i&gt;</tt>...<tt>&lt;/i&gt;</tt> (italic).
+ <li><tt>&lt;strong&gt;</tt>...<tt>&lt;/strong&gt;</tt>
+ - Strong. By default this is the same as <tt>&lt;bold&gt;</tt>...<tt>&lt;/bold&gt;</tt> (bold).
+ <li><tt>&lt;i&gt;</tt>...<tt>&lt;/i&gt;</tt>
+ - Italic font style.
+ <li><tt>&lt;b&gt;</tt>...<tt>&lt;/b&gt;</tt>
+ - Bold font style.
+ <li><tt>&lt;u&gt;</tt>...<tt>&lt;/u&gt;</tt>
+ - Underlined font style.
+ <li><tt>&lt;big&gt;</tt>...<tt>&lt;/big&gt;</tt>
+ - A larger font size.
+ <li><tt>&lt;small&gt;</tt>...<tt>&lt;/small&gt;</tt>
+ - A smaller font size.
+ <li><tt>&lt;code&gt;</tt>...<tt>&lt;/code&gt;</tt>
+ - Indicates code. By default this is the same as <tt>&lt;tt&gt;</tt>...<tt>&lt;/tt&gt;</tt> (typewriter). For
+ larger junks of code use the block-tag \c pre.
+ <li><tt>&lt;tt&gt;</tt>...<tt>&lt;/tt&gt;</tt>
+ - Typewriter font style.
+ <li><tt>&lt;font&gt;</tt>...<tt>&lt;/font&gt;</tt>
+ - Customizes the font size, family and text color. The tag understands
+ the following attributes:
+ <ul>
+ <li> \c color
+ - The text color, for example \c color="red" or \c color="#FF0000".
+ <li> \c size
+ - The logical size of the font. Logical sizes 1 to 7 are supported.
+ The value may either be absolute (for example,
+ \c size=3) or relative (\c size=-2). In the latter case the sizes
+ are simply added.
+ <li> \c face
+ - The family of the font, for example \c face=times.
+ </ul>
+ </ul>
+
+ Special elements are:
+ <ul>
+ <li><tt>&lt;img/&gt;</tt>
+ - An image. The image name for the mime source
+ factory is given in the source attribute, for example
+ <tt>&lt;img src="qt.xpm"/&gt;</tt>. The image tag also
+ understands the attributes \c width and \c height that determine
+ the size of the image. If the pixmap does not fit the specified
+ size it will be scaled automatically (by using QImage::smoothScale()).
+
+ The \c align attribute determines where the image is
+ placed. By default, an image is placed inline just like a
+ normal character. Specify \c left or \c right to place the
+ image at the respective side.
+ <li><tt>&lt;hr/&gt;</tt>
+ - A horizonal line.
+ <li><tt>&lt;br/&gt;</tt>
+ - A line break.
+ </ul>
+
+ Another tag not in any of the above cathegories is
+ <ul>
+ <li><tt>&lt;nobr&gt;</tt>...<tt>&lt;/nobr&gt;</tt>
+ - No break. Prevents word wrap.
+ </ul>
+
+ In addition, rich text supports simple HTML tables. A table consists
+ of a set of rows in which each row contains some number of cells. Cells
+ are either data cells or header cells, depending on their
+ content. Usually a cell fills one rectangle in the table grid. It
+ may, however, also span several rows, columns or both.
+
+ <ul>
+ <li><tt>&lt;table&gt;</tt>...<tt>&lt;/table&gt;</tt>
+ - A table definition.
+ The default table is frameless. Specify the boolean attribute
+ \c border in order to get a frame. Other attributes are
+ <ul>
+ <li>\c bgcolor
+ - The background color.
+ <li> \c width
+ - The table width. This is either absolute in pixels or relative
+ in percent of the column width, for example \c width=80%.
+ <li> \c border
+ - The width of the table border. The default is 0 (= no border).
+ <li> \c cellspacing
+ - Additional space around the table cells. The default is 2.
+ <li> \c cellpadding
+ - Additional space around the contents of table cells. The default is 1.
+ </ul>
+ <li><tt>&lt;tr&gt;</tt>...<tt>&lt;/tr&gt;</tt>
+ - A table row. Can be used only within \c table. Understands the attributes.
+ <ul>
+ <li>\c bgcolor
+ - The background color.
+ </ul>
+ <li><tt>&lt;td&gt;</tt>...<tt>&lt;/td&gt;</tt>
+ - A table data cell. Can be used only within \c tr. Understands the attributes.
+ <ul>
+ <li>\c bgcolor
+ - The background color.
+ <li> \c width
+ - The cell width. This is either absolute in pixels or relative
+ in percent of the entire table width, for example \c width=50%.
+ <li> \c colspan
+ - Defines how many columns this cell spans. The default is 1.
+ <li> \c rowspan
+ - Defines how many rows this cell spans. The default is 1.
+ <li> \c align
+ - Alignment; possible values are \c left, \c right, and \c center. The
+ default is left-aligned.
+ </ul>
+ <li><tt>&lt;th&gt;</tt>...<tt>&lt;/th&gt;</tt>
+ - A table header cell. Similar to \c td, but defaults to center alignment
+ and a bold font.
+ </ul>
+*/
+
+/*!
+ Creates a style sheet. Like any QObject, the created object will be
+ deleted when its parent destructs (if the child still exists).
+
+ By default the style sheet has the tag definitions defined above.
+*/
+QStyleSheet::QStyleSheet( QObject *parent, const char *name )
+ : QObject( parent, name )
+{
+ init();
+}
+
+/*!
+ Destructs the style sheet. All styles inserted into the style sheet
+ will be deleted.
+*/
+QStyleSheet::~QStyleSheet()
+{
+}
+
+/*!
+ \internal
+ Initialized the style sheet to the basic Qt style.
+*/
+void QStyleSheet::init()
+{
+ styles.setAutoDelete( TRUE );
+
+ nullstyle = new QStyleSheetItem( this,
+ QString::fromLatin1("") );
+
+ QStyleSheetItem* style;
+
+ style = new QStyleSheetItem( this, "qml" ); // compatibility
+ style->setDisplayMode( QStyleSheetItem::DisplayBlock );
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("qt") );
+ style->setDisplayMode( QStyleSheetItem::DisplayBlock );
+ //style->setMargin( QStyleSheetItem::MarginAll, 4 );
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("a") );
+ style->setAnchor( TRUE );
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("em") );
+ style->setFontItalic( TRUE );
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("i") );
+ style->setFontItalic( TRUE );
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("big") );
+ style->setLogicalFontSizeStep( 1 );
+ style = new QStyleSheetItem( this, QString::fromLatin1("large") ); // compatibility
+ style->setLogicalFontSizeStep( 1 );
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("small") );
+ style->setLogicalFontSizeStep( -1 );
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("strong") );
+ style->setFontWeight( QFont::Bold);
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("b") );
+ style->setFontWeight( QFont::Bold);
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("h1") );
+ style->setFontWeight( QFont::Bold);
+ style->setLogicalFontSize(6);
+ style->setDisplayMode(QStyleSheetItem::DisplayBlock);
+ style-> setMargin(QStyleSheetItem::MarginTop, 12);
+ style-> setMargin(QStyleSheetItem::MarginBottom, 6);
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("h2") );
+ style->setFontWeight( QFont::Bold);
+ style->setLogicalFontSize(5);
+ style->setDisplayMode(QStyleSheetItem::DisplayBlock);
+ style-> setMargin(QStyleSheetItem::MarginTop, 10);
+ style-> setMargin(QStyleSheetItem::MarginBottom, 5);
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("h3") );
+ style->setFontWeight( QFont::Bold);
+ style->setLogicalFontSize(4);
+ style->setDisplayMode(QStyleSheetItem::DisplayBlock);
+ style-> setMargin(QStyleSheetItem::MarginTop, 8);
+ style-> setMargin(QStyleSheetItem::MarginBottom, 4);
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("p") );
+ style->setDisplayMode(QStyleSheetItem::DisplayBlock);
+ style-> setMargin(QStyleSheetItem::MarginVertical, 4);
+ style->setSelfNesting( FALSE );
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("center") );
+ style->setDisplayMode(QStyleSheetItem::DisplayBlock);
+ style->setAlignment( AlignCenter );
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("twocolumn") );
+ style->setDisplayMode(QStyleSheetItem::DisplayBlock);
+ style->setNumberOfColumns( 2 );
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("multicol") );
+ style->setDisplayMode(QStyleSheetItem::DisplayBlock);
+ (void) new QStyleSheetItem( this, QString::fromLatin1("font") );
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("ul") );
+ style->setDisplayMode(QStyleSheetItem::DisplayBlock);
+ style-> setMargin(QStyleSheetItem::MarginVertical, 4);
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("ol") );
+ style->setDisplayMode(QStyleSheetItem::DisplayBlock);
+ style->setListStyle( QStyleSheetItem::ListDecimal );
+ style-> setMargin(QStyleSheetItem::MarginVertical, 4);
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("li") );
+ style->setDisplayMode(QStyleSheetItem::DisplayListItem);
+ style->setSelfNesting( FALSE );
+ style->setContexts(QString::fromLatin1("ol ul"));
+ style-> setMargin(QStyleSheetItem::MarginVertical, 4);
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("code") );
+ style->setFontFamily( QString::fromLatin1("courier") );
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("tt") );
+ style->setFontFamily( QString::fromLatin1("courier") );
+
+ new QStyleSheetItem(this, QString::fromLatin1("img"));
+ new QStyleSheetItem(this, QString::fromLatin1("br"));
+ new QStyleSheetItem(this, QString::fromLatin1("hr"));
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("pre") );
+ style->setFontFamily( QString::fromLatin1("courier") );
+ style->setDisplayMode(QStyleSheetItem::DisplayBlock);
+ style->setWhiteSpaceMode(QStyleSheetItem::WhiteSpacePre);
+ style = new QStyleSheetItem( this, QString::fromLatin1("blockquote") );
+ style->setDisplayMode(QStyleSheetItem::DisplayBlock);
+ style->setMargin(QStyleSheetItem::MarginHorizontal, 40 );
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("head") );
+ style->setDisplayMode(QStyleSheetItem::DisplayNone);
+ style = new QStyleSheetItem( this, QString::fromLatin1("div") );
+ style->setDisplayMode(QStyleSheetItem::DisplayInline ); // #### set this to DisplayBlock after the parser in the new engine has been fixed for div
+ style = new QStyleSheetItem( this, QString::fromLatin1("dl") );
+ style->setDisplayMode(QStyleSheetItem::DisplayBlock);
+ style = new QStyleSheetItem( this, QString::fromLatin1("dt") );
+ style->setDisplayMode(QStyleSheetItem::DisplayBlock);
+ style->setContexts(QString::fromLatin1("dl") );
+ style = new QStyleSheetItem( this, QString::fromLatin1("dd") );
+ style->setDisplayMode(QStyleSheetItem::DisplayBlock);
+ style->setMargin(QStyleSheetItem::MarginLeft, 30);
+ style->setContexts(QString::fromLatin1("dt dl") );
+ style = new QStyleSheetItem( this, QString::fromLatin1("u") );
+ style->setFontUnderline( TRUE);
+ style = new QStyleSheetItem( this, QString::fromLatin1("nobr") );
+ style->setWhiteSpaceMode( QStyleSheetItem::WhiteSpaceNoWrap );
+
+ // tables
+ style = new QStyleSheetItem( this, QString::fromLatin1("table") );
+ style = new QStyleSheetItem( this, QString::fromLatin1("tr") );
+ style->setContexts(QString::fromLatin1("table"));
+ style = new QStyleSheetItem( this, QString::fromLatin1("td") );
+ style->setContexts(QString::fromLatin1("tr"));
+ style = new QStyleSheetItem( this, QString::fromLatin1("th") );
+ style->setFontWeight( QFont::Bold );
+ style->setAlignment( Qt::AlignCenter );
+ style->setContexts(QString::fromLatin1("tr"));
+
+ style = new QStyleSheetItem( this, QString::fromLatin1("html") );
+}
+
+
+
+static QStyleSheet* defaultsheet = 0;
+static QCleanupHandler<QStyleSheet> qt_cleanup_stylesheet;
+
+/*!
+ Returns the application-wide default style sheet.This style sheet is
+ used by rich text rendering classes such as QSimpleRichText,
+ QWhatsThis and also QMessageBox to define the rendering style and
+ available tags within rich text documents. It serves also as initial
+ style sheet for the more complex render widgets QTextView and
+ QTextBrowser.
+
+ \sa setDefaultSheet()
+*/
+QStyleSheet* QStyleSheet::defaultSheet()
+{
+ if (!defaultsheet) {
+ defaultsheet = new QStyleSheet();
+ qt_cleanup_stylesheet.add( defaultsheet );
+ }
+ return defaultsheet;
+}
+
+/*!
+ Sets the application-wide default style sheet, deleting any style
+ sheet previously set. The ownership is transferred.
+
+ \sa defaultSheet()
+*/
+void QStyleSheet::setDefaultSheet( QStyleSheet* sheet)
+{
+ if ( defaultsheet != sheet ) {
+ if ( defaultsheet )
+ qt_cleanup_stylesheet.remove( defaultsheet );
+ delete defaultsheet;
+ if ( sheet )
+ qt_cleanup_stylesheet.add( sheet );
+ }
+ defaultsheet = sheet;
+}
+
+/*!\internal
+ Inserts \a style. Any tags generated after this time will be
+ bound to this style. Note that \a style becomes owned by the
+ style sheet and will be deleted when the style sheet destructs.
+*/
+void QStyleSheet::insert( QStyleSheetItem* style )
+{
+ styles.insert(style->name(), style);
+}
+
+
+/*!
+ Returns the style with name \a name or 0 if there is no such style.
+ */
+QStyleSheetItem* QStyleSheet::item( const QString& name)
+{
+ if ( name.isNull() )
+ return 0;
+ return styles[name];
+}
+
+/*!
+ Returns the style with name \a name or 0 if there is no such style (const version)
+ */
+const QStyleSheetItem* QStyleSheet::item( const QString& name) const
+{
+ if ( name.isNull() )
+ return 0;
+ return styles[name];
+}
+
+
+/*!
+ Generates an internal object for tag named \a name, given the
+ attributes \a attr, and using additional information provided
+ by the mime source factory \a factory .
+
+ This function should not (yet) be used in application code.
+*/
+QTextCustomItem* QStyleSheet::tag( const QString& name,
+ const QMap<QString, QString> &attr,
+ const QString& context,
+ const QMimeSourceFactory& factory,
+ bool /*emptyTag */, QTextDocument *doc ) const
+{
+ static QString s_img = QString::fromLatin1("img");
+ static QString s_hr = QString::fromLatin1("hr");
+
+ const QStyleSheetItem* style = item( name );
+ // first some known tags
+ if ( !style )
+ return 0;
+ if ( style->name() == s_img )
+ return new QTextImage( doc, attr, context, (QMimeSourceFactory&)factory);
+ if ( style->name() == s_hr )
+ return new QTextHorizontalLine( doc );
+ return 0;
+}
+
+
+/*!
+ Auxiliary function. Converts the plain text string \a plain to a
+ rich text formatted string while preserving its look.
+ */
+QString QStyleSheet::convertFromPlainText( const QString& plain)
+{
+ int col = 0;
+ QString rich;
+ rich += "<p>";
+ for ( int i = 0; i < int(plain.length()); ++i ) {
+ if ( plain[i] == '\n' ){
+ if ( col == 1 )
+ rich += "<p></p>";
+ else
+ rich += "<br>";
+ col = 0;
+ }
+ else if ( plain[i] == '\t' ){
+ rich += 0x00a0U;
+ // while ( col / 4.0 != int( col/4 ) ) { // weird
+ while ( col % 4 ) {
+ rich += 0x00a0U;
+ ++col;
+ }
+ }
+ else if ( plain[i].isSpace() )
+ rich += 0x00a0U;
+ else if ( plain[i] == '<' )
+ rich +="&lt;";
+ else if ( plain[i] == '>' )
+ rich +="&gt;";
+ else if ( plain[i] == '&' )
+ rich +="&amp;";
+ else
+ rich += plain[i];
+ ++col;
+ }
+ rich += "</p>";
+ return rich;
+}
+
+// Must doc this enum somewhere, and it is logically related to QStyleSheet
+
+/*!
+ \enum Qt::TextFormat
+
+ This enum is used in widgets that can display both plain text and
+ rich text, e.g., QLabel. It is used for deciding whether a text
+ string should be interpreted as one or the other. This is
+ normally done by passing one of the enum values to a setTextFormat()
+ function.
+
+ \value PlainText The text string is interpreted as a normal text string.
+
+ \value RichText The text string is interpreted as a rich text
+ according to the current QStyleSheet::defaultSheet().
+
+ \value AutoText The text string is interpreted as for \c RichText if
+ QStyleSheet::mightBeRichText() returns TRUE, otherwise as for \c
+ PlainText.
+*/
+
+/*!
+ Returns whether the string \a text is likely to be rich text
+ formatted.
+
+ Note: The function uses a fast and therefore simple heuristic. It
+ mainly checks whether there is something that looks like a tag
+ before the first line break. Although the result may be correct for
+ most common cases, there is no guarantee.
+*/
+bool QStyleSheet::mightBeRichText( const QString& text)
+{
+ if ( text.isEmpty() )
+ return FALSE;
+ if ( text.left(5).lower() == "<!doc" )
+ return TRUE;
+ int open = 0;
+ while ( open < int(text.length()) && text[open] != '<'
+ && text[open] != '\n' && text[open] != '&')
+ ++open;
+ if ( text[open] == '&' ) {
+ if ( text.mid(open+1,3) == "lt;" )
+ return TRUE; // support desperate attempt of user to see <...>
+ } else if ( text[open] == '<' ) {
+ int close = text.find('>', open);
+ if ( close > -1 ) {
+ QString tag;
+ for (int i = open+1; i < close; ++i) {
+ if ( text[i].isDigit() || text[i].isLetter() )
+ tag += text[i];
+ else if ( !tag.isEmpty() && text[i].isSpace() )
+ break;
+ else if ( !text[i].isSpace() && (!tag.isEmpty() || text[i] != '!' ) )
+ return FALSE; // that's not a tag
+ }
+ return defaultSheet()->item( tag.lower() ) != 0;
+ }
+ }
+ return FALSE;
+}
+
+
+/*! \fn void QStyleSheet::error( const QString& msg) const
+
+ This virtual function is called when an error occurs when
+ processing rich text. Reimplement it if you need to catch
+ error messages.
+
+ Errors might occur if some rich text strings contain tags that are
+ not understood by the stylesheet, if some tags are nested incorrectly, or
+ if tags are not closed properly.
+
+ \a msg is the error message.
+*/
+void QStyleSheet::error( const QString& ) const
+{
+}
+
+
+/*!
+ Scales the font \a font to the appropriate physical point size
+ corresponding to the logical font size \a logicalSize.
+
+ When calling this function, \a font has a point size corresponding to
+ the logical font size 3.
+
+ Typical logical font sizes range from 1 to 7, with 1 being the smallest.
+
+ \sa QStyleSheetItem::logicalFontSize(),
+ QStyleSheetItem::logicalFontSizeStep(), QFont::setPointSize()
+ */
+void QStyleSheet::scaleFont( QFont& font, int logicalSize ) const
+{
+ if ( logicalSize < 1 )
+ logicalSize = 1;
+ if ( logicalSize > 7 )
+ logicalSize = 7;
+ int basePointSize = font.pointSize();
+ int s;
+ switch ( logicalSize ) {
+ case 1:
+ s = basePointSize/2;
+ break;
+ case 2:
+ s = (8 * basePointSize) / 10;
+ break;
+ case 4:
+ s = (12 * basePointSize) / 10;
+ break;
+ case 5:
+ s = (15 * basePointSize) / 10;
+ break;
+ case 6:
+ s = 2 * basePointSize;
+ break;
+ case 7:
+ s = (24 * basePointSize) / 10;
+ break;
+ default:
+ s = basePointSize;
+ }
+ font.setPointSize( s );
+}
+
+#endif // QT_NO_RICHTEXT
diff --git a/bibletime/frontend/thirdparty/qt3stuff/qstylesheet.h b/bibletime/frontend/thirdparty/qt3stuff/qstylesheet.h
new file mode 100644
index 0000000..929cd81
--- /dev/null
+++ b/bibletime/frontend/thirdparty/qt3stuff/qstylesheet.h
@@ -0,0 +1,215 @@
+/****************************************************************************
+** $Id: qstylesheet.h,v 1.5 2002/03/19 01:15:54 joachim Exp $
+**
+** Definition of the QStyleSheet class
+**
+** Created : 990101
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the kernel module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QT3_QSTYLESHEET_H
+#define QT3_QSTYLESHEET_H
+
+#ifndef QT_H
+#include "qnamespace.h"
+#include "qstring.h"
+#include "qvaluelist.h"
+#include "qvector.h"
+#include "qdict.h"
+#include "qobject.h"
+#endif // QT_H
+
+#ifndef QT_NO_RICHTEXT
+
+template<class Key, class T> class QMap;
+
+namespace Qt3 {
+
+class QStyleSheet;
+class QTextDocument;
+
+class Q_EXPORT QStyleSheetItem : public Qt
+{
+public:
+ QStyleSheetItem( QStyleSheet* parent, const QString& name );
+ QStyleSheetItem( const QStyleSheetItem & );
+ ~QStyleSheetItem();
+
+ QString name() const;
+
+ QStyleSheet* styleSheet();
+ const QStyleSheet* styleSheet() const;
+
+ enum AdditionalStyleValues { Undefined = - 1};
+
+ enum DisplayMode {
+ DisplayBlock,
+ DisplayInline,
+ DisplayListItem,
+ DisplayNone
+ };
+
+ DisplayMode displayMode() const;
+ void setDisplayMode(DisplayMode m);
+
+ int alignment() const;
+ void setAlignment( int f);
+
+ int fontWeight() const;
+ void setFontWeight(int w);
+
+ int logicalFontSize() const;
+ void setLogicalFontSize(int s);
+
+ int logicalFontSizeStep() const;
+ void setLogicalFontSizeStep( int s );
+
+ int fontSize() const;
+ void setFontSize(int s);
+
+ QString fontFamily() const;
+ void setFontFamily( const QString& );
+
+ int numberOfColumns() const;
+ void setNumberOfColumns(int ncols);
+
+ QColor color() const;
+ void setColor( const QColor &);
+
+ bool fontItalic() const;
+ void setFontItalic( bool );
+ bool definesFontItalic() const;
+
+ bool fontUnderline() const;
+ void setFontUnderline( bool );
+ bool definesFontUnderline() const;
+
+ bool isAnchor() const;
+ void setAnchor(bool anc);
+
+ enum WhiteSpaceMode { WhiteSpaceNormal, WhiteSpacePre, WhiteSpaceNoWrap };
+ WhiteSpaceMode whiteSpaceMode() const;
+ void setWhiteSpaceMode(WhiteSpaceMode m);
+
+ enum Margin {
+ MarginLeft,
+ MarginRight,
+ MarginTop,
+ MarginBottom,
+ MarginFirstLine,
+ MarginAll,
+ MarginVertical,
+ MarginHorizontal
+ };
+
+ int margin( Margin m) const;
+ void setMargin( Margin, int);
+
+ enum ListStyle {
+ ListDisc,
+ ListCircle,
+ ListSquare,
+ ListDecimal,
+ ListLowerAlpha,
+ ListUpperAlpha
+ };
+
+ ListStyle listStyle() const;
+ void setListStyle( ListStyle );
+
+ QString contexts() const;
+ void setContexts( const QString& );
+ bool allowedInContext( const QStyleSheetItem* ) const;
+
+ bool selfNesting() const;
+ void setSelfNesting( bool );
+
+ void setLineSpacing( int ls );
+ int lineSpacing() const;
+
+private:
+ void init();
+ class Data;
+ Data* d;
+};
+
+
+#if defined(Q_TEMPLATEDLL)
+// MOC_SKIP_BEGIN
+template class Q_EXPORT QDict<QStyleSheetItem>;
+template class Q_EXPORT QValueList< QVector<QStyleSheetItem> >;
+template class Q_EXPORT QVector<QStyleSheetItem>;
+template class Q_EXPORT QValueList<QStyleSheetItem::ListStyle>;
+// MOC_SKIP_END
+#endif
+
+class QTextCustomItem;
+
+class Q_EXPORT QStyleSheet : public QObject
+{
+ Q_OBJECT
+public:
+ QStyleSheet( QObject *parent=0, const char *name=0 );
+ virtual ~QStyleSheet();
+
+ static QStyleSheet* defaultSheet();
+ static void setDefaultSheet( QStyleSheet* );
+
+
+ QStyleSheetItem* item( const QString& name);
+ const QStyleSheetItem* item( const QString& name) const;
+
+ void insert( QStyleSheetItem* item);
+
+ virtual QTextCustomItem* tag( const QString& name,
+ const QMap<QString, QString> &attr,
+ const QString& context,
+ const QMimeSourceFactory& factory,
+ bool emptyTag, QTextDocument *doc ) const;
+
+ static QString convertFromPlainText( const QString& );
+ static bool mightBeRichText( const QString& );
+
+ virtual void scaleFont( QFont& font, int logicalSize ) const;
+
+ virtual void error( const QString& ) const;
+
+private:
+ void init();
+ QDict<QStyleSheetItem> styles;
+ QStyleSheetItem* nullstyle;
+};
+
+} // namespace
+
+#endif // QT_NO_RICHTEXT
+
+#endif // QSTYLESHEET_H
diff --git a/bibletime/frontend/thirdparty/qt3stuff/qt3stuff.h b/bibletime/frontend/thirdparty/qt3stuff/qt3stuff.h
new file mode 100644
index 0000000..2443c60
--- /dev/null
+++ b/bibletime/frontend/thirdparty/qt3stuff/qt3stuff.h
@@ -0,0 +1,87 @@
+#ifndef QT3STUFF_H
+#define QT3STUFF_H
+
+// This file is where the dirty hacks go :)
+#include <qnamespace.h>
+
+namespace Qt3 { // can't be Qt, a class already exists with that name :(
+
+ enum NewFlags {
+ AlignAuto = 0x0000,
+ AlignJustify = 0x0080, // This is NOT the Qt 3 value, but we have to use another one !
+ AlignHorizontal_Mask = Qt::AlignLeft | Qt::AlignRight | Qt::AlignHCenter | AlignJustify,
+ AlignVertical_Mask = Qt::AlignTop | Qt::AlignBottom | Qt::AlignVCenter,
+ WStaticContents = Qt::WNorthWestGravity,
+ WType_Dialog = 0x00000002,
+ WStyle_Dialog = 0x00000002
+ };
+
+ enum TextFlags {
+ SingleLine = 0x0080, // misc. flags
+ DontClip = 0x0100,
+ ExpandTabs = 0x0200,
+ ShowPrefix = 0x0400,
+ WordBreak = 0x0800,
+ DontPrint = 0x1000 // internal
+ };
+
+ enum WordWrap {
+ NoWrap = 0x0000,
+ WidgetWidth = 0x2000,
+ FixedPixelWidth = 0x3000,
+ FixedColumnWidth= 0x4000
+ };
+
+ enum WrapPolicy {
+ AtWordBoundary = 0x0000,
+ AtWhiteSpace = AtWordBoundary, // deprecated, don't use
+ Anywhere = 0x8000
+ };
+
+ /*enum CursorShape {
+ ArrowCursor,
+ UpArrowCursor,
+ CrossCursor,
+ WaitCursor,
+ IbeamCursor,
+ SizeVerCursor,
+ SizeHorCursor,
+ SizeBDiagCursor,
+ SizeFDiagCursor,
+ SizeAllCursor,
+ BlankCursor,
+ SplitVCursor,
+ SplitHCursor,
+ PointingHandCursor,
+ ForbiddenCursor,
+ LastCursor = ForbiddenCursor,
+ BitmapCursor = 24
+ };*/
+
+ enum Dock { Unmanaged, TornOff, Top, Bottom, Right, Left, Minimized };
+ // compatibility
+ //typedef Dock ToolBarDock;
+
+ enum DateFormat {
+ TextDate, // default Qt
+ ISODate, // ISO 8601
+ LocalDate // locale dependant
+ };
+
+};
+
+// Called _blah in Qt 2 and Q_blah in Qt 3
+#if defined(_WS_X11)
+#define Q_WS_X11
+#endif
+
+#define Q_ASSERT ASSERT
+
+// Classes renamed in Qt 3
+#define QPtrList QList
+#define QPtrListIterator QListIterator
+#define QPtrVector QVector
+#define QMemArray QArray
+
+#endif // QNAMESPACE_H
+
diff --git a/bibletime/frontend/thirdparty/qt3stuff/qtextedit.cpp b/bibletime/frontend/thirdparty/qt3stuff/qtextedit.cpp
new file mode 100644
index 0000000..8eb3fc6
--- /dev/null
+++ b/bibletime/frontend/thirdparty/qt3stuff/qtextedit.cpp
@@ -0,0 +1,539 @@
+/****************************************************************************
+** $Id: qtextedit.cpp,v 1.5 2002/03/19 01:15:55 joachim Exp $
+**
+** Definition of the QTextEdit class
+**
+** Created : 990101
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the widgets module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qtextedit.h"
+#include "qcursor.h"
+
+/*!
+ \class QTextEdit qtextedit.h
+ \brief The QTextEdit widget provides a sophisticated single-page text editor.
+
+ \ingroup basic
+
+ QTextEdit is an advanced WYSIWYG editor supporting rich text
+ formatting. It is optimized to handle large text documents and
+ respond quickly to user input.
+
+ If you create a new an empty QTextEdit, and want to allow the user
+ to edit rich text (HTML), call setTextFormat(Qt::RichText) to be
+ sure that text() returns the formatted text.
+
+ QTextEdit extends QTextView with keyboard and mouse handling for
+ user input and functions to set/get/modify formatting, text, etc.
+
+ As it is derived from QTextView, it supports the same functions to
+ set and load plain and HTML text.
+
+ QTextEdit internally works on paragraphs. A paragraph is a formatted
+ string which is word-wrapped to fit into the width of the
+ widget. Paragraphs are seperated by hard breaks.
+
+ For user input selections are important. To work with selections use
+ setSelection() and QTextView::getSelection(). To set or get the
+ position of the cursor use setCursorPosition() or
+ getCursorPosition().
+
+ To change the current format (the format at the cursor position) or
+ the format of a selection, use setBold(), setItalic(),
+ setUnderline(), setFamily(), setPointSize(), setFont() or
+ setColor(). To change paragraph formatting use setAlignment() or
+ setParagType(). When the cursor is moved, the signals
+ currentFontChanged(), currentColorChanged() and
+ currentAlignmentChanged() are emitted to inform about the format at
+ the cursor position.
+
+ To insert text at the cursor position use insert(). cut(), copy()
+ and paste() can also be done through the API. If the text changes,
+ the textChanged() signal is emitted, and if the user inserts a new
+ line by pressing return/enter returnPressed() is emitted.
+
+ QTextEdit provides command-based undo/redo. To set the depth of the
+ command history use setUndoDepth() - it defaults to 100 steps. To
+ undo or redo the last opetarion call undo() or redo(). The signals
+ undoAvailable() and redoAvailable() inform about when undo or redo
+ operations can be executed.
+
+ Here is a list of key-bindings which are implemented for editing
+
+ <ul>
+ <li><i> Left Arrow </i> Move the cursor one character left
+ <li><i> Right Arrow </i> Move the cursor one character right
+ <li><i> Up Arrow </i> Move the cursor one line up
+ <li><i> Down Arrow </i> Move the cursor one line down
+ <li><i> Page Up </i> Move the cursor one page up
+ <li><i> Page Down </i> Move the cursor one page down
+ <li><i> Backspace </i> Delete the character to the left of the cursor
+ <li><i> Home </i> Move the cursor to the beginning of the line
+ <li><i> End </i> Move the cursor to the end of the line
+ <li><i> Delete </i> Delete the character to the right of the cursor
+ <li><i> Ctrl+A </i> Move the cursor to the beginning of the line
+ <li><i> Ctrl+B </i> Move the cursor one character left
+ <li><i> Ctrl+C </i> Copy the marked text to the clipboard (also
+ <i>Ctrl+Insert</i> under Windows)
+ <li><i> Ctrl+D </i> Delete the character to the right of the cursor
+ <li><i> Ctrl+E </i> Move the cursor to the end of the line
+ <li><i> Ctrl+F </i> Move the cursor one character right
+ <li><i> Ctrl+H </i> Delete the character to the left of the cursor
+ <li><i> Ctrl+K </i> Delete to end of line
+ <li><i> Ctrl+N </i> Move the cursor one line down
+ <li><i> Ctrl+P </i> Move the cursor one line up
+ <li><i> Ctrl+V </i> Paste the clipboard text into line edit (also
+ <i>Shift+Insert</i> under Windows)
+ <li><i> Ctrl+X </i> Cut the marked text, copy to clipboard (also
+ <i>Shift+Delete</i> under Windows)
+ <li><i> Ctrl+Z </i> Undo the last operation
+ <li><i> Ctrl+Y </i> Redo the last operation
+ <li><i> Ctrl+Left Arrow </i> Move the cursor one word left
+ <li><i> Ctrl+Right Arrow </i> Move the cursor one word right
+ <li><i> Ctrl+Up Arrow </i> Move the cursor one word up
+ <li><i> Ctrl+Down Arrow </i> Move the cursor one word down
+ <li><i> Ctrl+Home Arrow </i> Move the cursor to the beginning of the text
+ <li><i> Ctrl+End Arrow </i> Move the cursor to the end of the text
+ </ul>
+
+ To select (mark) text hold down the Shift key whilst pressing one of
+ the movement keystrokes, for example, <i>Shift+Right Arrow</i> will
+ select the character to the right, and <i>Shift+Ctrl+Right Arrow</i>
+ will select the word to the right, etc.
+
+ All other keys with valid ASCII codes insert themselves into the
+ text at the cursor position.
+*/
+
+/*! \enum QTextEdit::KeyboardAction
+
+ This enum is used by doKeyboardAction() to specify which action
+ should be exectuted:
+
+ \value ActionBackspace Delete the character at the left of the cursor
+
+ \value ActionDelete Delete the character at the right of the cursor
+
+ \value ActionReturn Split the paragraph at the cursor position
+
+ \value ActionKill Delete the text until the end of the paragraph, or
+ if the cursor is at the end of the paragraph, join this and the next
+ paragraph.
+*/
+
+/*! \enum QTextEdit::MoveDirection
+
+ This enum is used by moveCursor() to specify into which direction
+ the cursor should be moved:
+
+ \value MoveLeft Moves the cursor to the left
+
+ \value MoveRight Moves the cursor to the right
+
+ \value MoveUp Moves the cursor up one line
+
+ \value MoveDown Moves the cursor down one line
+
+ \value MoveHome Moves the cursor to the begin of the line
+
+ \value MoveEnd Moves the cursor to the end of the line
+
+ \value MovePgUp Moves the cursor one page up
+
+ \value MovePgDown Moves the cursor one page down
+*/
+
+
+/*! \fn void QTextEdit::getCursorPosition( int &parag, int &index ) const
+
+ This functions sets the \a parag and \a index parameters to the
+ current cursor position.
+ */
+
+/*! \fn bool QTextEdit::isModified() const
+
+ This function returns whether the document has been modified by the
+ user.
+*/
+
+/*! \fn bool QTextEdit::italic() const
+
+ Returns whether the current format (the position where the cursor is
+ placed) is italic or not.
+*/
+
+/*! \fn bool QTextEdit::bold() const
+
+ Returns whether the current format (the position where the cursor
+ is placed) is bold or not.
+*/
+
+/*! \fn bool QTextEdit::underline() const
+
+ Returns whether the current format (the position where the cursor
+ is placed) is underlined or not.
+*/
+
+/*! \fn QString QTextEdit::family() const
+
+ Returns the font family of the current format (the position where
+ the cursor is placed).
+*/
+
+/*! \fn int QTextEdit::pointSize() const
+
+ Returns the poit size of the font of the current format (the
+ position where the cursor is placed).
+*/
+
+/*! \fn QColor QTextEdit::color() const
+
+ Returns the color of the current format (the position where the
+ cursor is placed).
+*/
+
+/*! \fn QFont QTextEdit::font() const
+
+ Returns the font of the current format (the position where the
+ cursor is placed).
+*/
+
+/*! \fn int QTextEdit::alignment() const
+
+ Returns the alignment of the paragraph at which the cursor is
+ currently placed.
+*/
+
+/*! \fn bool QTextEdit::isOverwriteMode() const
+
+ Returns TRUE if this editor is in overwrite mode, i.e. if
+ characters typed replace characters in the editor.
+*/
+
+/*! \fn int QTextEdit::undoDepth() const
+
+ Returns how many steps the undo/redo history can maximally store.
+*/
+
+/*! \fn void QTextEdit::insert( const QString &text, bool indent, bool checkNewLine, bool removeSelected )
+
+ Inserts \a text at the current cursor position. If \a indent is
+ TRUE, the paragraph is re-indented. If \a checkNewLine is TRUE,
+ newline characters in \a text result in hard breaks. Otherwise, the
+ result of newlines is not defined. If \ removeSelected is TRUE,
+ selected text is removed before the text is inserted, else the
+ inserted text gets selected.
+*/
+
+/*! \fn void QTextEdit::setOverwriteMode( bool b )
+
+ Sets overwrite mode if \a b on is TRUE. Overwrite mode means that
+ characters typed replace characters in the editor.
+*/
+
+/*! \fn void QTextEdit::undo()
+
+ Undoes the last operation.
+*/
+
+/*! \fn void QTextEdit::redo()
+
+ Redoes the last operation.
+*/
+
+/*! \fn void QTextEdit::cut()
+
+ Cuts the selected text (if there is any) and puts it on the
+ clipboard.
+*/
+
+/*! \fn void QTextEdit::paste()
+
+ Pastes the text from the clipboard (if there is any) at the current
+ cursor position. Only pastes plain text.
+
+ \sa pasteSubType()
+*/
+
+/*! \fn void QTextEdit::pasteSubType( const QCString &subtype )
+
+ Pastes the text from the clipboard (if there is any) of the format
+ \a subtype (this can be e.g. "plain", "html" ) at the current cursor
+ position.
+*/
+
+/*! \fn void QTextEdit::clear()
+
+ Removes all text.
+
+*/
+
+/*! \fn void QTextEdit::del()
+
+ Deletes the character on the right side of the text cursor. If a
+ text has been marked by the user (e.g. by clicking and dragging) the
+ cursor is put at the beginning of the marked text and the marked
+ text is removed.
+*/
+
+/*! \fn void QTextEdit::indent()
+
+ Re-indents the current paragraph.
+*/
+
+/*! \fn void QTextEdit::setItalic( bool b )
+
+ Sets the current format and the selected text (if there is any) to
+ italic, if \a b is TRUE, otherwise unsets the italic flag.
+*/
+
+/*! \fn void QTextEdit::setBold( bool b )
+
+ Sets the current format and the selected text (if there is any) to
+ bold, if \a b is TRUE, otherwise unsets the bold flag.
+*/
+
+/*! \fn void QTextEdit::setUnderline( bool b )
+
+ Sets the current format and the selected text (if there is any) to
+ underlined, if \a b is TRUE, otherwise unsets the underlined flag.
+*/
+
+/*! \fn void QTextEdit::setFamily( const QString &f )
+
+ Sets the family of the current format and the selected text (if
+ there is any) to \a f.
+*/
+
+/*! \fn void QTextEdit::setPointSize( int s )
+
+ Sets the point size of the current format and the selected text (if
+ there is any) to \a s.
+
+ Note that if \a s is zero or negative, the behaviour of this
+ function is not defined.
+*/
+
+/*! \fn void QTextEdit::setColor( const QColor &c )
+
+ Sets the color of the current format and the selected text (if there
+ is any) to \a c.
+*/
+
+/*! \fn void QTextEdit::setFont( const QFont &f )
+
+ Sets the font of the current format and the selected text (if there
+ is any) to \a f.
+*/
+
+/*! \fn void QTextEdit::setAlignment( int a )
+
+ Sets the alignment of the paragraph, at which the cursor is placed,
+ to \a a.
+*/
+
+/*! \fn void QTextEdit::setParagType( QStyleSheetItem::DisplayMode dm, QStyleSheetItem::ListStyle listStyle )
+
+ Sets the paragraph style of the paragraph at which the cursor is
+ placed to \a dm. If \a dm is QStyleSheetItem::DisplayListItem, the
+ type of the list item is set to \a listStyle.
+*/
+
+/*! \fn void QTextEdit::setCursorPosition( int parag, int index )
+
+ Sets the cursor to the index \a index in the paragraph \a parag.
+*/
+
+/*! \fn void QTextEdit::setSelection( int parag_from, int index_from, int parag_to, int index_to, int selNum )
+
+ Sets a selection which starts at the index \a index_from in the
+ paragraph \a parag_from and ends at index \a index_to in the
+ paragraph \a parag_to.
+
+ Uses the selection settings of selection \a selNum. If this is 0,
+ this is the default selection.
+*/
+
+/*! \fn void QTextEdit::setSelectionAttributes( int selNum, const QColor &back, bool invertText )
+
+ Sets the background color of the selection \a selNum to \a back and
+ specifies whether the text of this selection should be inverted by \a invertText.
+
+*/
+
+/*! \fn void QTextEdit::setModified( bool m )
+
+ Sets the modified flag of the document to \a m.
+*/
+
+/*! \fn void QTextEdit::resetFormat()
+
+ Resets the current format to the default format.
+*/
+
+/*! \fn void QTextEdit::setUndoDepth( int d )
+
+ Sets the number of steps the undo/redo history can maximally store
+ to \a d.
+*/
+
+/*! \fn void QTextEdit::undoAvailable( bool yes )
+
+ This signal is emitted when the availability of undo changes. If \a
+ yes is TRUE, then undo() will work until undoAvailable( FALSE ) is
+ next emitted.
+*/
+
+/*! \fn void QTextEdit::modificationChanged( bool m )
+
+ This signal is emitted when the modification of the document
+ changed. If \a m is TRUE, the document got modified, else the
+ modification state has been reset to unmodified.
+*/
+
+/*! \fn void QTextEdit::redoAvailable( bool yes )
+
+ This signal is emitted when the availability of redo changes. If \a
+ yes is TRUE, then redo() will work until redoAvailable( FALSE ) is
+ next emitted.
+*/
+
+/*! \fn void QTextEdit::currentFontChanged( const QFont &f )
+
+ This signal is emitted if the font of the current format (the format
+ at the position where the cursor is placed) has changed.
+
+ \a f contains the new font.
+*/
+
+/*! \fn void QTextEdit::currentColorChanged( const QColor &c )
+
+ This signal is emitted if the color of the current format (the
+ format at the position where the cursor is placed) has changed.
+
+ \a c contains the new color.
+*/
+
+/*! \fn void QTextEdit::currentAlignmentChanged( int a )
+
+ This signal is emitted if the alignment of the current paragraph
+ (the paragraph at which the cursor is placed) has changed.
+
+ \a a contains the new alignment.
+*/
+
+/*! \fn void QTextEdit::cursorPositionChanged( QTextCursor *c )
+
+ This signal is emitted if the position of the cursor changed. \a c
+ points to the text cursor object.
+*/
+
+/*! \fn void QTextEdit::returnPressed()
+
+ This signal is emitted if the user pressed the RETURN or ENTER key.
+*/
+
+/*! \fn void QTextEdit::setFormat( QTextFormat *f, int flags )
+
+ This functions sets the current format and the selected text (if
+ there is any) to \a f. Only the fields of \a f which are specified
+ by the \a flags are used.
+*/
+
+/*! \fn void QTextEdit::ensureCursorVisible()
+
+ Ensures that the cursor is visible by scrolling the view if needed.
+*/
+
+/*! \fn void QTextEdit::placeCursor( const QPoint &pos, QTextCursor *c )
+
+ Places the cursor \a c at the character which is closest to \a pos
+ (in contents coordinates). If \a c is 0, the default text cursor is
+ used.
+*/
+
+/*! \fn void QTextEdit::moveCursor( MoveDirection direction, bool shift, bool control )
+
+ Moves the text cursor into the \a direction. As this is normally
+ used by some keyevent handler, \a shift and \a control specify the
+ state of the key modifiers which have an influence on the cursor
+ moving.
+*/
+
+/*! \overload void QTextEdit::moveCursor( MoveDirection direction, bool control )
+*/
+
+/*! \fn void QTextEdit::removeSelectedText()
+
+ Deletes the text which is currently selected (if there is any
+ selected).
+*/
+
+/*! \fn void QTextEdit::doKeyboardAction( KeyboardAction action )
+
+ Exectutes the keyboard action \a action. This is normally called by
+ a key event handler.
+*/
+
+/*! \fn QTextCursor *QTextEdit::textCursor() const
+
+ Returns the text cursor if the editor. QTextCursor is not in the
+ public API, but for special cases you might use it anyway. But the
+ API of it might change in an incompatible manner in the future.
+*/
+
+/*! \fn bool QTextEdit::getFormat( int parag, int index, QFont &font, QColor &color )
+
+ This function sets \a font to the font and \a color to the color of
+ the character at position \a index in the paragraph \a parag.
+
+ If \a parag or \a index is out of range, FALSE is returned, else
+ TRUE is returned.
+*/
+
+/*! Constructs a QTextEdit. The \a parent and \a name arguments are as
+ for QWidget. */
+
+Qt3::QTextEdit::QTextEdit( QWidget *parent, const char *name )
+ : Qt3::QTextView( parent, name )
+{
+#ifndef QT_NO_CURSOR
+ viewport()->setCursor( ibeamCursor );
+#endif
+}
+
+/*! \reimp */
+
+Qt3::QTextEdit::~QTextEdit()
+{
+}
+
diff --git a/bibletime/frontend/thirdparty/qt3stuff/qtextedit.h b/bibletime/frontend/thirdparty/qt3stuff/qtextedit.h
new file mode 100644
index 0000000..f77a4e4
--- /dev/null
+++ b/bibletime/frontend/thirdparty/qt3stuff/qtextedit.h
@@ -0,0 +1,394 @@
+/****************************************************************************
+** $Id: qtextedit.h,v 1.5 2002/03/19 01:15:56 joachim Exp $
+**
+** Definition of the QTextEdit class
+**
+** Created : 990101
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the widgets module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QT3_QTEXTEDIT_H
+#define QT3_QTEXTEDIT_H
+
+#ifndef QT_H
+#include "qlist.h"
+#include "qpixmap.h"
+#include "qcolor.h"
+#endif // QT_H
+
+#include "qtextview.h"
+
+#ifndef QT_NO_TEXTEDIT
+
+namespace Qt3 {
+
+class Q_EXPORT QTextEdit : public Qt3::QTextView
+{
+ Q_OBJECT
+ Q_PROPERTY( int undoDepth READ undoDepth WRITE setUndoDepth )
+ Q_PROPERTY( bool overWriteMode READ isOverwriteMode WRITE setOverwriteMode )
+
+public:
+ QTextEdit(QWidget *parent = 0, const char *name = 0 );
+ ~QTextEdit();
+
+ void getCursorPosition( int &parag, int &index ) const;
+ bool isModified() const;
+ bool italic() const;
+ bool bold() const;
+ bool underline() const;
+ QString family() const;
+ int pointSize() const;
+ QColor color() const;
+ QFont font() const;
+ int alignment() const;
+ bool isOverwriteMode() const;
+ int undoDepth() const;
+ virtual void insert( const QString &text, bool indent = FALSE, bool checkNewLine = TRUE, bool removeSelected = TRUE );
+ virtual bool getFormat( int parag, int index, QFont &font, QColor &color );
+
+public slots:
+ virtual void setOverwriteMode( bool b );
+ virtual void undo();
+ virtual void redo();
+ virtual void cut();
+ virtual void paste();
+ virtual void pasteSubType( const QCString &subtype );
+ virtual void clear();
+ virtual void del();
+ virtual void indent();
+ virtual void setItalic( bool b );
+ virtual void setBold( bool b );
+ virtual void setUnderline( bool b );
+ virtual void setFamily( const QString &f );
+ virtual void setPointSize( int s );
+ virtual void setColor( const QColor &c );
+ virtual void setFont( const QFont &f );
+ virtual void setAlignment( int a );
+ virtual void setParagType( Qt3::QStyleSheetItem::DisplayMode dm, Qt3::QStyleSheetItem::ListStyle listStyle );
+ virtual void setCursorPosition( int parag, int index );
+ virtual void setSelection( int parag_from, int index_from, int parag_to, int index_to, int selNum = 0 );
+ virtual void setSelectionAttributes( int selNum, const QColor &back, bool invertText );
+ virtual void setModified( bool m );
+ virtual void resetFormat();
+ virtual void setUndoDepth( int d );
+ virtual void removeSelectedText();
+
+signals:
+ void undoAvailable( bool yes );
+ void redoAvailable( bool yes );
+ void currentFontChanged( const QFont &f );
+ void currentColorChanged( const QColor &c );
+ void currentAlignmentChanged( int a );
+ void cursorPositionChanged( Qt3::QTextCursor *c );
+ void returnPressed();
+ void modificationChanged( bool m );
+
+protected:
+ enum KeyboardAction { // keep in sync with QTextView
+ ActionBackspace,
+ ActionDelete,
+ ActionReturn,
+ ActionKill
+ };
+
+ enum MoveDirection { // keep in sync with QTextView
+ MoveLeft,
+ MoveRight,
+ MoveUp,
+ MoveDown,
+ MoveHome,
+ MoveEnd,
+ MovePgUp,
+ MovePgDown
+ };
+
+ void setFormat( Qt3::QTextFormat *f, int flags );
+ void ensureCursorVisible();
+ void placeCursor( const QPoint &pos, Qt3::QTextCursor *c = 0 );
+ void moveCursor( MoveDirection direction, bool shift, bool control );
+ void moveCursor( MoveDirection direction, bool control );
+ void doKeyboardAction( KeyboardAction action );
+ Qt3::QTextCursor *textCursor() const;
+
+private:
+ bool isReadOnly() const { return FALSE; }
+ void emitUndoAvailable( bool b ) { emit undoAvailable( b ); }
+ void emitRedoAvailable( bool b ) { emit redoAvailable( b ); }
+ void emitCurrentFontChanged( const QFont &f ) { emit currentFontChanged( f ); }
+ void emitCurrentColorChanged( const QColor &c ) { emit currentColorChanged( c ); }
+ void emitCurrentAlignmentChanged( int a ) { emit currentAlignmentChanged( a ); }
+ void emitCursorPositionChanged( Qt3::QTextCursor *c ) { emit cursorPositionChanged( c ); }
+ void emitReturnPressed() { emit returnPressed(); }
+ void emitModificationChanged( bool m ) { emit modificationChanged( m ); }
+
+private: // Disabled copy constructor and operator=
+#if defined(Q_DISABLE_COPY)
+ QTextEdit( const QTextEdit & );
+ QTextEdit& operator=( const QTextEdit & );
+#endif
+};
+
+};
+
+inline void Qt3::QTextEdit::getCursorPosition( int &parag, int &index ) const
+{
+ Qt3::QTextView::getCursorPosition( parag, index );
+}
+
+inline bool Qt3::QTextEdit::isModified() const
+{
+ return Qt3::QTextView::isModified();
+}
+
+inline bool Qt3::QTextEdit::italic() const
+{
+ return Qt3::QTextView::italic();
+}
+
+inline bool Qt3::QTextEdit::bold() const
+{
+ return Qt3::QTextView::bold();
+}
+
+inline bool Qt3::QTextEdit::underline() const
+{
+ return Qt3::QTextView::underline();
+}
+
+inline QString Qt3::QTextEdit::family() const
+{
+ return Qt3::QTextView::family();
+}
+
+inline int Qt3::QTextEdit::pointSize() const
+{
+ return Qt3::QTextView::pointSize();
+}
+
+inline QColor Qt3::QTextEdit::color() const
+{
+ return Qt3::QTextView::color();
+}
+
+inline QFont Qt3::QTextEdit::font() const
+{
+ return Qt3::QTextView::font();
+}
+
+inline int Qt3::QTextEdit::alignment() const
+{
+ return Qt3::QTextView::alignment();
+}
+
+inline bool Qt3::QTextEdit::isOverwriteMode() const
+{
+ return Qt3::QTextView::isOverwriteMode();
+}
+
+inline int Qt3::QTextEdit::undoDepth() const
+{
+ return Qt3::QTextView::undoDepth();
+}
+
+inline void Qt3::QTextEdit::insert( const QString &text, bool indent, bool checkNewLine, bool removeSelected )
+{
+ Qt3::QTextView::insert( text, indent, checkNewLine, removeSelected );
+}
+
+inline void Qt3::QTextEdit::setOverwriteMode( bool b )
+{
+ Qt3::QTextView::setOverwriteMode( b );
+}
+
+inline void Qt3::QTextEdit::undo()
+{
+ Qt3::QTextView::undo();
+}
+
+inline void Qt3::QTextEdit::redo()
+{
+ Qt3::QTextView::redo();
+}
+
+inline void Qt3::QTextEdit::cut()
+{
+ Qt3::QTextView::cut();
+}
+
+inline void Qt3::QTextEdit::paste()
+{
+ Qt3::QTextView::paste();
+}
+
+inline void Qt3::QTextEdit::pasteSubType( const QCString &subtype )
+{
+ Qt3::QTextView::pasteSubType( subtype );
+}
+
+inline void Qt3::QTextEdit::clear()
+{
+ Qt3::QTextView::clear();
+}
+
+inline void Qt3::QTextEdit::del()
+{
+ Qt3::QTextView::del();
+}
+
+inline void Qt3::QTextEdit::indent()
+{
+ Qt3::QTextView::indent();
+}
+
+inline void Qt3::QTextEdit::setItalic( bool b )
+{
+ Qt3::QTextView::setItalic( b );
+}
+
+inline void Qt3::QTextEdit::setBold( bool b )
+{
+ Qt3::QTextView::setBold( b );
+}
+
+inline void Qt3::QTextEdit::setUnderline( bool b )
+{
+ Qt3::QTextView::setUnderline( b );
+}
+
+inline void Qt3::QTextEdit::setFamily( const QString &f )
+{
+ Qt3::QTextView::setFamily( f );
+}
+
+inline void Qt3::QTextEdit::setPointSize( int s )
+{
+ Qt3::QTextView::setPointSize( s );
+}
+
+inline void Qt3::QTextEdit::setColor( const QColor &c )
+{
+ Qt3::QTextView::setColor( c );
+}
+
+inline void Qt3::QTextEdit::setFont( const QFont &f )
+{
+ Qt3::QTextView::setFontInternal( f );
+}
+
+inline void Qt3::QTextEdit::setAlignment( int a )
+{
+ Qt3::QTextView::setAlignment( a );
+}
+
+inline void Qt3::QTextEdit::setParagType( Qt3::QStyleSheetItem::DisplayMode dm, Qt3::QStyleSheetItem::ListStyle listStyle )
+{
+ Qt3::QTextView::setParagType( dm, listStyle );
+}
+
+inline void Qt3::QTextEdit::setCursorPosition( int parag, int index )
+{
+ Qt3::QTextView::setCursorPosition( parag, index );
+}
+
+inline void Qt3::QTextEdit::setSelection( int parag_from, int index_from, int parag_to, int index_to, int selNum )
+{
+ Qt3::QTextView::setSelection( parag_from, index_from, parag_to, index_to, selNum );
+}
+
+inline void Qt3::QTextEdit::setSelectionAttributes( int selNum, const QColor &back, bool invertText )
+{
+ Qt3::QTextView::setSelectionAttributes( selNum, back, invertText );
+}
+
+inline void Qt3::QTextEdit::setModified( bool m )
+{
+ Qt3::QTextView::setModified( m );
+}
+
+inline void Qt3::QTextEdit::resetFormat()
+{
+ Qt3::QTextView::resetFormat();
+}
+
+inline void Qt3::QTextEdit::setUndoDepth( int d )
+{
+ Qt3::QTextView::setUndoDepth( d );
+}
+
+inline void Qt3::QTextEdit::setFormat( Qt3::QTextFormat *f, int flags )
+{
+ Qt3::QTextView::setFormat( f, flags );
+}
+
+inline void Qt3::QTextEdit::ensureCursorVisible()
+{
+ Qt3::QTextView::ensureCursorVisible();
+}
+
+inline void Qt3::QTextEdit::placeCursor( const QPoint &pos, Qt3::QTextCursor *c )
+{
+ Qt3::QTextView::placeCursor( pos, c );
+}
+
+inline void Qt3::QTextEdit::moveCursor( MoveDirection direction, bool shift, bool control )
+{
+ Qt3::QTextView::moveCursor( (MoveDirectionPrivate)direction, shift, control );
+}
+
+inline void Qt3::QTextEdit::moveCursor( MoveDirection direction, bool control )
+{
+ Qt3::QTextView::moveCursor( (MoveDirectionPrivate)direction, control );
+}
+
+inline void Qt3::QTextEdit::removeSelectedText()
+{
+ Qt3::QTextView::removeSelectedText();
+}
+
+inline void Qt3::QTextEdit::doKeyboardAction( KeyboardAction action )
+{
+ Qt3::QTextView::doKeyboardAction( (KeyboardActionPrivate)action );
+}
+
+inline Qt3::QTextCursor *Qt3::QTextEdit::textCursor() const
+{
+ return cursor;
+}
+
+inline bool Qt3::QTextEdit::getFormat( int parag, int index, QFont &font, QColor &color )
+{
+ return Qt3::QTextView::getFormat( parag, index, font, color );
+}
+
+#endif // QT_NO_TEXTEDIT
+
+#endif
diff --git a/bibletime/frontend/thirdparty/qt3stuff/qtextview.cpp b/bibletime/frontend/thirdparty/qt3stuff/qtextview.cpp
new file mode 100644
index 0000000..528fd0e
--- /dev/null
+++ b/bibletime/frontend/thirdparty/qt3stuff/qtextview.cpp
@@ -0,0 +1,3155 @@
+/****************************************************************************
+** $Id: qtextview.cpp,v 1.4 2001/06/15 13:32:21 joachim Exp $
+**
+** Implementation of the QTextView class
+**
+** Created : 990101
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the widgets module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qtextview.h"
+#include "qrichtext_p.h"
+#include "qpainter.h"
+#include "qpen.h"
+#include "qbrush.h"
+#include "qpixmap.h"
+#include "qfont.h"
+#include "qcolor.h"
+#include "qsize.h"
+#include "qevent.h"
+#include "qtimer.h"
+#include "qapplication.h"
+#include "qlistbox.h"
+#include "qvbox.h"
+#include "qapplication.h"
+#include "qclipboard.h"
+#include "qcolordialog.h"
+#include "qfontdialog.h"
+#include "qstylesheet.h"
+#include "qdragobject.h"
+#include "qurl.h"
+#include "qcursor.h"
+#include "qregexp.h"
+#include "qpopupmenu.h"
+
+using namespace Qt3;
+
+struct Qt3::QUndoRedoInfoPrivate
+{
+ QTextString text;
+};
+
+class Qt3::QTextViewPrivate
+{
+public:
+ int id[ 7 ];
+};
+
+static bool block_set_alignment = FALSE;
+
+/*!
+ \class QTextView qtextview.h
+ \brief The QTextView class provides a sophisticated rich text viewer.
+ \ingroup basic
+ \ingroup helpsystem
+
+ QTextView is a widget which can show large amounts of read-only text
+ with varying fonts and font attributes, e.g. different point sizes,
+ colors, bold, italic etc. Paragraphs can have different alignments
+ and word-wrap policies. QTextView can also show images (using
+ QMimeSourceFactory), lists and tables. If the text is too large to
+ view within the widget's viewport, scrollbars will appear. The text
+ view can load both plain text and HTML files (a subset of HTML 4 and
+ CSS1 is supported).
+ The rendering style and valid tags are defined by a styleSheet().
+ Currently a subset of HTML 3.2 and 4, and CSS1 is supported, see
+ setStyleSheet() and QStyleSheet for details. The images identified
+ by image tags are displayed if they can be interpreted using the
+ text view's QMimeSourceFactory. (See setMimeSourceFactory() for
+ details.)
+
+ If you want to provide your users with editable rich text use
+ QTextEdit. If you want a text browser with more navigation use
+ QTextBrowser. If you just need to display a small piece of rich text
+ use QSimpleRichText or QLabel.
+
+ Set the text with setText(). You can include rich text directly in
+ code since it is based on HTML tags, e.g.
+ \code
+ textView->setText( "<font color=\"red\">Red</font>" );
+ \endcode
+ You can append text with append(), for example to display an output log.
+
+ By default the text view will try to guess the format of the text
+ (plain text or HTML) and render accordingly, but you can control
+ this with setTextFormat().
+
+ By default the text view wraps words at whitespace at the width of
+ the text view widget. The setWordWrap() function is used to specify
+ the kind of word wrap you want, or \c NoWrap.
+ Call setWordWrap() to set a fixed pixel width \c FixedPixelWidth, or
+ character column (e.g. 80 column) \c FixedColumnWidth with the
+ pixels or columns specified with setWrapColumnOrWidth(). If you use
+ word wrap to the widget's width \c WidgetWidth, you can specify
+ whether to break on whitespace or anywhere with setWrapPolicy().
+
+ The background color is set differently from other widgets, using
+ setPaper(). You specify a brush style which could be a plain color
+ or a complex pixmap. Hypertext links are automatically
+ underlined; this can be changed with setLinkUnderline(). The tab
+ stop width is set with setTabStops(). The zoomIn() and zoomOut()
+ functions can be used to resize the text by increasing (decreasing
+ for zoomOut()) the point size by one point per call. Images are not
+ affected.
+
+ The entire text is returned by text(), and the text of a particular
+ paragraph by text(int).
+
+ The user can select text in the text view using the mouse. If
+ they've selected text hasSelectedText() will return TRUE. The
+ selection's position can be obtained with getSelection(), and the
+ selection itself is returned by selectedText(). The selection can be
+ copied to the clipboard with copy(). The entire text can be selected
+ (or deselected) with selectAll().
+
+ The lines() function returns the number of lines in the text,
+ paragraphs() returns the number of paragraphs. The number of lines
+ within a particular paragraph is returned by linesOfParagraph(). The
+ length of the text in characters is returned by length().
+
+ You can scroll to an anchor in the text, e.g. \c{<a name="anchor">}
+ with scrollToAnchor(). The find() function can be used to find and
+ highlight (select) a given string within the text.
+
+ The user can navigate the text view by using the scrollbars and by
+ clicking hypertext links with the mouse. The following keyboard
+ shortcuts are also supported:
+
+ <ul>
+ <li><i> Up Arrow </i> Move one line up
+ <li><i> Down Arrow </i> Move one line down
+ <li><i> Left Arrow </i> Move one column left
+ <li><i> Right Arrow </i> Move one column right
+ <li><i> Page Up </i> Move one (viewport) page up
+ <li><i> Page Down </i> Move one (viewport) page down
+ <li><i> Home </i> Move to the beginning of the text
+ <li><i> End </i> Move to the end of the text
+ <li><i> Shift+Wheel</i> Scroll the page horizontally (the Wheel is
+ the mouse wheel)
+ <li><i> Ctrl+Wheel</i> Zoom the text
+ <li>
+ </ul>
+
+ The text view may be able to provide some meta-information. The
+ documentTitle() function will return the text from within HTML
+ \c{<title>} tags.
+
+ The text displayed in a text view has \e context. The context is a
+ path which the text view's QMimeSourceFactory uses to resolve the
+ locations of files and images. It is passed to the
+ mimeSourceFactory() when quering data. (See QTextView::QTextView()
+ and context().)
+
+ Note that we do not intend to add a full-featured web browser widget
+ to Qt (because that would easily double Qt's size and only few
+ applications would benefit from it). In particular, the rich text
+ support in Qt is designed to provide a fast, portable and efficient
+ way to add reasonable online help facilities to applications. We
+ will, however, extend it to some degree in future versions of Qt.
+
+*/
+
+/*! \fn void QTextView::copyAvailable (bool yes)
+
+ This signal is emitted when text is selected or deselected in the text
+ view.
+
+ When text is selected this signal will be emitted with \a yes set to
+ TRUE. If no text has been selected or if the selected text is
+ deselected this signal is emitted with \a yes set to FALSE.
+
+ If \a yes is TRUE, copy() can be used to copy the selection to the
+ clipboard. If \a yes is FALSE copy() does nothing.
+
+ \sa selectionChanged()
+*/
+
+
+/*! \fn void QTextView::textChanged()
+
+ This signal is emitted whenever the text in the view changes.
+
+ \sa setText() append()
+ */
+
+/*! \fn void QTextView::selectionChanged()
+
+ This signal is emitted whenever the selection changes.
+
+ \sa copyAvailable()
+*/
+
+/*! \fn QTextDocument *QTextView::document() const
+
+ This function returns the QTextDocument which is used by the text
+ view.
+
+ QTextDocument is not in the public API and its API might change in an
+ incompatible manner in the future.
+*/
+
+/*! \fn void QTextView::setDocument( QTextDocument *doc )
+
+ This function sets the QTextDocument which should be used by the text
+ view. This can be used, for example, if you want to display a document
+ using multiple views. You would create a QTextDocument and set it to
+ the text views which should display it. You would need to connect to
+ the textChanged() and selectionChanged() signals of all the text views
+ and update them all accordingly (preferably with a slight delay for
+ efficiency reasons).
+
+ QTextDocument is not in the public API and its API might change in an
+ incompatible manner in the future.
+*/
+
+/*! Constructs an empty QTextView with the usual \a parent and \a
+ name optional arguments.
+*/
+
+QTextView::QTextView( QWidget *parent, const char *name )
+ : QScrollView( parent, name, WNorthWestGravity | WRepaintNoErase | WResizeNoErase ),
+ doc( new QTextDocument( 0 ) ), undoRedoInfo( doc )
+{
+ init();
+}
+
+/*! Constructs a QTextView displaying the text \a text with
+ context \a context, with the usual \a parent and \a name optional
+ arguments.
+
+ The \a context is a path which the text view's QMimeSourceFactory
+ uses to resolve the locations of files and images. It is passed to
+ the mimeSourceFactory() when quering data.
+
+ For example if the text contains an image tag,
+ \c{<img src="image.png">}, and the context is "path/to/look/in", the
+ QMimeSourceFactory will try to load the image from
+ "path/to/look/in/image.png". If the tag was
+ \c{<img src="/image.png">}, the context will not be used (because
+ QMimeSourceFactory recognizes that we have given an absolute path)
+ and will try to load "/image.png". The context is applied in exactly
+ the same way to \e hrefs, for example,
+ \c{<a href="target.html">Target</a>}, would resolve to
+ "path/to/look/in/target.html".
+
+*/
+
+QTextView::QTextView( const QString& text, const QString& context,
+ QWidget *parent, const char *name)
+ : QScrollView( parent, name, WNorthWestGravity | WRepaintNoErase | WResizeNoErase ),
+ doc( new QTextDocument( 0 ) ), undoRedoInfo( doc )
+{
+ init();
+ setText( text, context );
+}
+
+/*! \reimp */
+
+QTextView::~QTextView()
+{
+ delete undoRedoInfo.d;
+ undoRedoInfo.d = 0;
+ delete cursor;
+ delete doc;
+ delete d;
+}
+
+void QTextView::init()
+{
+ d = new QTextViewPrivate;
+ connect( doc, SIGNAL( minimumWidthChanged( int ) ),
+ this, SLOT( setRealWidth( int ) ) );
+
+ mousePressed = FALSE;
+ inDoubleClick = FALSE;
+ modified = FALSE;
+ onLink = QString::null;
+ overWrite = FALSE;
+ wrapMode = WidgetWidth;
+ wrapWidth = -1;
+ wPolicy = AtWhiteSpace;
+ setMode = Auto;
+ inDnD = FALSE;
+
+ doc->setFormatter( new QTextFormatterBreakWords );
+ currentFormat = doc->formatCollection()->defaultFormat();
+ currentAlignment = Qt3::AlignAuto;
+
+ viewport()->setBackgroundMode( PaletteBase );
+ viewport()->setAcceptDrops( TRUE );
+ resizeContents( 0, doc->lastParag() ?
+ ( doc->lastParag()->paragId() + 1 ) * doc->formatCollection()->defaultFormat()->height() : 0 );
+
+ setKeyCompression( TRUE );
+ viewport()->setMouseTracking( TRUE );
+#ifndef QT_NO_CURSOR
+ viewport()->setCursor( isReadOnly() ? arrowCursor : ibeamCursor );
+#endif
+ cursor = new QTextCursor( doc );
+
+ formatTimer = new QTimer( this );
+ connect( formatTimer, SIGNAL( timeout() ),
+ this, SLOT( formatMore() ) );
+ lastFormatted = doc->firstParag();
+
+ scrollTimer = new QTimer( this );
+ connect( scrollTimer, SIGNAL( timeout() ),
+ this, SLOT( doAutoScroll() ) );
+
+ interval = 0;
+ changeIntervalTimer = new QTimer( this );
+ connect( changeIntervalTimer, SIGNAL( timeout() ),
+ this, SLOT( doChangeInterval() ) );
+
+ cursorVisible = TRUE;
+ blinkTimer = new QTimer( this );
+ connect( blinkTimer, SIGNAL( timeout() ),
+ this, SLOT( blinkCursor() ) );
+
+#ifndef QT_NO_DRAGANDDROP
+ dragStartTimer = new QTimer( this );
+ connect( dragStartTimer, SIGNAL( timeout() ),
+ this, SLOT( startDrag() ) );
+#endif
+
+ resizeTimer = new QTimer( this );
+ connect( resizeTimer, SIGNAL( timeout() ),
+ this, SLOT( doResize() ) );
+
+ formatMore();
+
+ blinkCursorVisible = FALSE;
+
+ connect( this, SIGNAL( textChanged() ),
+ this, SLOT( setModified() ) );
+ viewport()->setFocusProxy( this );
+ viewport()->setFocusPolicy( WheelFocus );
+ viewport()->installEventFilter( this );
+ installEventFilter( this );
+
+#if 0 // ### background paper test code
+ QBrush *b = new QBrush( red, QPixmap( "/home/reggie/kde2/share/wallpapers/All-Good-People-1.jpg" ) );
+ doc->setPaper( b );
+ QPalette pal( palette() );
+ pal.setBrush( QColorGroup::Base, *b );
+ setPalette( pal );
+#endif
+}
+
+void QTextView::paintDocument( bool drawAll, QPainter *p, int cx, int cy, int cw, int ch )
+{
+ bool drawCur = hasFocus() || viewport()->hasFocus();
+ if ( isReadOnly() || !cursorVisible )
+ drawCur = FALSE;
+ QColorGroup g = colorGroup();
+ if ( doc->paper() )
+ g.setBrush( QColorGroup::Base, *doc->paper() );
+
+ if ( contentsY() == 0 ) {
+ p->fillRect( contentsX(), contentsY(), visibleWidth(), doc->y(),
+ g.brush( QColorGroup::Base ) );
+ }
+
+ p->setBrushOrigin( -contentsX(), -contentsY() );
+
+ lastFormatted = doc->draw( p, cx, cy, cw, ch, g, !drawAll, drawCur, cursor );
+
+ if ( lastFormatted == doc->lastParag() )
+ resizeContents( contentsWidth(), doc->height() );
+
+ if ( contentsHeight() < visibleHeight() && ( !doc->lastParag() || doc->lastParag()->isValid() ) && drawAll )
+ p->fillRect( 0, contentsHeight(), visibleWidth(),
+ visibleHeight() - contentsHeight(), g.brush( QColorGroup::Base ) );
+}
+
+/*! \reimp */
+
+void QTextView::drawContents( QPainter *p, int cx, int cy, int cw, int ch )
+{
+ paintDocument( TRUE, p, cx, cy, cw, ch );
+}
+
+/*! \reimp */
+
+bool QTextView::event( QEvent *e )
+{
+ if ( e->type() == QEvent::AccelOverride && !isReadOnly() ) {
+ QKeyEvent* ke = (QKeyEvent*) e;
+ if ( ke->state() & ControlButton ) {
+ switch ( ke->key() ) {
+ case Key_A:
+ case Key_E:
+#if defined (Q_WS_WIN)
+ case Key_Insert:
+#endif
+ case Key_X:
+ case Key_V:
+ case Key_C:
+ case Key_Left:
+ case Key_Right:
+ case Key_Up:
+ case Key_Down:
+ case Key_Home:
+ case Key_End:
+ ke->accept();
+ default:
+ break;
+ }
+ } else {
+ switch ( ke->key() ) {
+ case Key_Delete:
+ case Key_Home:
+ case Key_End:
+ case Key_Backspace:
+ ke->accept();
+ default:
+ break;
+ }
+ }
+ }
+ return QWidget::event( e );
+}
+
+/*! Provides scrolling and paging.
+ */
+
+void QTextView::keyPressEvent( QKeyEvent *e )
+{
+ changeIntervalTimer->stop();
+ interval = 10;
+
+ if ( isReadOnly() ) {
+ handleReadOnlyKeyEvent( e );
+ changeIntervalTimer->start( 100, TRUE );
+ return;
+ }
+
+
+ bool selChanged = FALSE;
+ for ( int i = 1; i < doc->numSelections(); ++i ) // start with 1 as we don't want to remove the Standard-Selection
+ selChanged = doc->removeSelection( i ) || selChanged;
+
+ if ( selChanged ) {
+ cursor->parag()->document()->nextDoubleBuffered = TRUE;
+ repaintChanged();
+ }
+
+ bool clearUndoRedoInfo = TRUE;
+
+ switch ( e->key() ) {
+ case Key_Left:
+ moveCursor( MoveLeft, e->state() & ShiftButton, e->state() & ControlButton );
+ break;
+ case Key_Right:
+ moveCursor( MoveRight, e->state() & ShiftButton, e->state() & ControlButton );
+ break;
+ case Key_Up:
+ moveCursor( MoveUp, e->state() & ShiftButton, e->state() & ControlButton );
+ break;
+ case Key_Down:
+ moveCursor( MoveDown, e->state() & ShiftButton, e->state() & ControlButton );
+ break;
+ case Key_Home:
+ moveCursor( MoveHome, e->state() & ShiftButton, e->state() & ControlButton );
+ break;
+ case Key_End:
+ moveCursor( MoveEnd, e->state() & ShiftButton, e->state() & ControlButton );
+ break;
+ case Key_Prior:
+ moveCursor( MovePgUp, e->state() & ShiftButton, e->state() & ControlButton );
+ break;
+ case Key_Next:
+ moveCursor( MovePgDown, e->state() & ShiftButton, e->state() & ControlButton );
+ break;
+ case Key_Return: case Key_Enter:
+ doc->removeSelection( QTextDocument::Standard );
+#ifndef QT_NO_CURSOR
+ viewport()->setCursor( isReadOnly() ? arrowCursor : ibeamCursor );
+#endif
+ clearUndoRedoInfo = FALSE;
+ doKeyboardAction( ActionReturn );
+ emitReturnPressed();
+ break;
+ case Key_Delete:
+ if ( doc->hasSelection( QTextDocument::Standard ) ) {
+ removeSelectedText();
+ break;
+ }
+
+ doKeyboardAction( ActionDelete );
+ clearUndoRedoInfo = FALSE;
+
+ break;
+ case Key_Backspace:
+ if ( doc->hasSelection( QTextDocument::Standard ) ) {
+ removeSelectedText();
+ break;
+ }
+
+ if ( !cursor->parag()->prev() &&
+ cursor->atParagStart() )
+ break;
+
+ doKeyboardAction( ActionBackspace );
+ clearUndoRedoInfo = FALSE;
+
+ break;
+ case Key_F16: // Copy key on Sun keyboards
+ copy();
+ break;
+ case Key_F18: // Paste key on Sun keyboards
+ paste();
+ break;
+ case Key_F20: // Cut key on Sun keyboards
+ cut();
+ break;
+ default: {
+ if ( e->text().length() &&
+// !( e->state() & AltButton ) && !( e->state() & MetaButton ) &&
+ ( !e->ascii() || e->ascii() >= 32 ) ||
+ ( e->text() == "\t" && !( e->state() & ControlButton ) ) ) {
+ clearUndoRedoInfo = FALSE;
+ if ( e->key() == Key_Tab ) {
+ if ( cursor->index() == 0 && cursor->parag()->style() &&
+ cursor->parag()->style()->displayMode() == QStyleSheetItem::DisplayListItem ) {
+ cursor->parag()->incDepth();
+ drawCursor( FALSE );
+ repaintChanged();
+ drawCursor( TRUE );
+ break;
+ }
+ }
+ if ( cursor->parag()->style() &&
+ cursor->parag()->style()->displayMode() == QStyleSheetItem::DisplayBlock &&
+ cursor->index() == 0 && ( e->text() == "-" || e->text() == "*" ) ) {
+ setParagType( QStyleSheetItem::DisplayListItem, QStyleSheetItem::ListDisc );
+ } else {
+ insert( e->text(), TRUE, FALSE );
+ }
+ break;
+ }
+ if ( e->state() & ControlButton ) {
+ switch ( e->key() ) {
+ case Key_C: case Key_F16: // Copy key on Sun keyboards
+ copy();
+ break;
+ case Key_V:
+ paste();
+ break;
+ case Key_X:
+ cut();
+ break;
+ case Key_I: case Key_T: case Key_Tab:
+ indent();
+ break;
+ case Key_A:
+#if defined(Q_WS_X11)
+ moveCursor( MoveHome, e->state() & ShiftButton, FALSE );
+#else
+ selectAll( TRUE );
+#endif
+ break;
+ case Key_B:
+ moveCursor( MoveLeft, e->state() & ShiftButton, FALSE );
+ break;
+ case Key_F:
+ moveCursor( MoveRight, e->state() & ShiftButton, FALSE );
+ break;
+ case Key_D:
+ if ( doc->hasSelection( QTextDocument::Standard ) ) {
+ removeSelectedText();
+ break;
+ }
+ doKeyboardAction( ActionDelete );
+ clearUndoRedoInfo = FALSE;
+ break;
+ case Key_H:
+ if ( doc->hasSelection( QTextDocument::Standard ) ) {
+ removeSelectedText();
+ break;
+ }
+ if ( !cursor->parag()->prev() &&
+ cursor->atParagStart() )
+ break;
+
+ doKeyboardAction( ActionBackspace );
+ clearUndoRedoInfo = FALSE;
+ break;
+ case Key_E:
+ moveCursor( MoveEnd, e->state() & ShiftButton, FALSE );
+ break;
+ case Key_N:
+ moveCursor( MoveDown, e->state() & ShiftButton, FALSE );
+ break;
+ case Key_P:
+ moveCursor( MoveUp, e->state() & ShiftButton, FALSE );
+ break;
+ case Key_Z:
+ undo();
+ break;
+ case Key_Y:
+ redo();
+ break;
+ case Key_K:
+ doKeyboardAction( ActionKill );
+ break;
+ case Key_Insert:
+#if defined(Q_WS_WIN)
+ copy();
+#endif
+ break;
+ }
+ break;
+ }
+ }
+ }
+
+ emitCursorPositionChanged( cursor );
+ if ( clearUndoRedoInfo )
+ clearUndoRedo();
+ changeIntervalTimer->start( 100, TRUE );
+}
+
+void QTextView::doKeyboardAction( KeyboardActionPrivate action )
+{
+ if ( isReadOnly() )
+ return;
+
+ if ( cursor->nestedDepth() != 0 ) // #### for 3.0, disable editing of tables as this is not advanced enough
+ return;
+
+ lastFormatted = cursor->parag();
+ drawCursor( FALSE );
+
+ switch ( action ) {
+ case ActionDelete:
+ checkUndoRedoInfo( UndoRedoInfo::Delete );
+ if ( !undoRedoInfo.valid() ) {
+ undoRedoInfo.id = cursor->parag()->paragId();
+ undoRedoInfo.index = cursor->index();
+ undoRedoInfo.d->text = QString::null;
+ }
+ undoRedoInfo.d->text += cursor->parag()->at( cursor->index() )->c;
+ if ( cursor->parag()->at( cursor->index() )->format() ) {
+ cursor->parag()->at( cursor->index() )->format()->addRef();
+ undoRedoInfo.d->text.at( undoRedoInfo.d->text.length() - 1 ).setFormat( cursor->parag()->at( cursor->index() )->format() );
+ }
+ if ( cursor->remove() )
+ undoRedoInfo.d->text += "\n";
+ break;
+ case ActionBackspace:
+ if ( cursor->parag()->style() && cursor->parag()->style()->displayMode() == QStyleSheetItem::DisplayListItem &&
+ cursor->index() == 0 ) {
+ cursor->parag()->decDepth();
+ lastFormatted = cursor->parag();
+ repaintChanged();
+ drawCursor( TRUE );
+ return;
+ }
+ checkUndoRedoInfo( UndoRedoInfo::Delete );
+ if ( !undoRedoInfo.valid() ) {
+ undoRedoInfo.id = cursor->parag()->paragId();
+ undoRedoInfo.index = cursor->index();
+ undoRedoInfo.d->text = QString::null;
+ }
+ cursor->gotoLeft();
+ undoRedoInfo.d->text.prepend( QString( cursor->parag()->at( cursor->index() )->c ) );
+ if ( cursor->parag()->at( cursor->index() )->format() ) {
+ cursor->parag()->at( cursor->index() )->format()->addRef();
+ undoRedoInfo.d->text.at( 0 ).setFormat( cursor->parag()->at( cursor->index() )->format() );
+ }
+ undoRedoInfo.index = cursor->index();
+ if ( cursor->remove() ) {
+ undoRedoInfo.d->text.remove( 0, 1 );
+ undoRedoInfo.d->text.prepend( "\n" );
+ undoRedoInfo.index = cursor->index();
+ undoRedoInfo.id = cursor->parag()->paragId();
+ }
+ lastFormatted = cursor->parag();
+ break;
+ case ActionReturn:
+ checkUndoRedoInfo( UndoRedoInfo::Return );
+ if ( !undoRedoInfo.valid() ) {
+ undoRedoInfo.id = cursor->parag()->paragId();
+ undoRedoInfo.index = cursor->index();
+ undoRedoInfo.d->text = QString::null;
+ }
+ undoRedoInfo.d->text += "\n";
+ cursor->splitAndInsertEmptyParag();
+ if ( cursor->parag()->prev() )
+ lastFormatted = cursor->parag()->prev();
+ break;
+ case ActionKill:
+ checkUndoRedoInfo( UndoRedoInfo::Delete );
+ if ( !undoRedoInfo.valid() ) {
+ undoRedoInfo.id = cursor->parag()->paragId();
+ undoRedoInfo.index = cursor->index();
+ undoRedoInfo.d->text = QString::null;
+ }
+ if ( cursor->atParagEnd() ) {
+ undoRedoInfo.d->text += cursor->parag()->at( cursor->index() )->c;
+ if ( cursor->parag()->at( cursor->index() )->format() ) {
+ cursor->parag()->at( cursor->index() )->format()->addRef();
+ undoRedoInfo.d->text.at( undoRedoInfo.d->text.length() - 1 ).setFormat( cursor->parag()->at( cursor->index() )->format() );
+ }
+ if ( cursor->remove() )
+ undoRedoInfo.d->text += "\n";
+ } else {
+ int oldLen = undoRedoInfo.d->text.length();
+ undoRedoInfo.d->text += cursor->parag()->string()->toString().mid( cursor->index() );
+ for ( int i = cursor->index(); i < cursor->parag()->length(); ++i ) {
+ if ( cursor->parag()->at( i )->format() ) {
+ cursor->parag()->at( i )->format()->addRef();
+ undoRedoInfo.d->text.at( oldLen + i - cursor->index() ).setFormat( cursor->parag()->at( i )->format() );
+ }
+ }
+ undoRedoInfo.d->text.remove( undoRedoInfo.d->text.length() - 1, 1 );
+ cursor->killLine();
+ }
+ break;
+ }
+
+ formatMore();
+ repaintChanged();
+ ensureCursorVisible();
+ drawCursor( TRUE );
+
+ if ( hasFocus() || viewport()->hasFocus() ) {
+ int h = cursor->parag()->lineHeightOfChar( cursor->index() );
+ QFont f = cursor->parag()->at( cursor->index() )->format()->font();
+ setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
+ cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE/*, &f*/ ); // QT2HACK
+ }
+
+ updateCurrentFormat();
+ emit textChanged();
+}
+
+void QTextView::readFormats( QTextCursor &c1, QTextCursor &c2, int oldLen, QTextString &text, bool fillStyles )
+{
+ c2.restoreState();
+ c1.restoreState();
+ if ( c1.parag() == c2.parag() ) {
+ for ( int i = c1.index(); i < c2.index(); ++i ) {
+ if ( c1.parag()->at( i )->format() ) {
+ c1.parag()->at( i )->format()->addRef();
+ text.at( oldLen + i - c1.index() ).setFormat( c1.parag()->at( i )->format() );
+ }
+ }
+ if ( fillStyles ) {
+ undoRedoInfo.oldAligns[ 0 ] = c1.parag()->alignment();
+ undoRedoInfo.oldStyles << c1.parag()->styleSheetItems();
+ undoRedoInfo.oldListStyles << c1.parag()->listStyle();
+ }
+ } else {
+ int lastIndex = oldLen;
+ int i;
+ for ( i = c1.index(); i < c1.parag()->length(); ++i ) {
+ if ( c1.parag()->at( i )->format() ) {
+ c1.parag()->at( i )->format()->addRef();
+ text.at( lastIndex ).setFormat( c1.parag()->at( i )->format() );
+ lastIndex++;
+ }
+ }
+ lastIndex++;
+ QTextParag *p = c1.parag()->next();
+ while ( p && p != c2.parag() ) {
+ for ( int i = 0; i < p->length(); ++i ) {
+ if ( p->at( i )->format() ) {
+ p->at( i )->format()->addRef();
+ text.at( i + lastIndex ).setFormat( p->at( i )->format() );
+ }
+ }
+ lastIndex += p->length() + 1;
+ p = p->next();
+ }
+ for ( i = 0; i < c2.index(); ++i ) {
+ if ( c2.parag()->at( i )->format() ) {
+ c2.parag()->at( i )->format()->addRef();
+ text.at( i + lastIndex ).setFormat( c2.parag()->at( i )->format() );
+ }
+ }
+ if ( fillStyles ) {
+ QTextParag *p = c1.parag();
+ i = 0;
+ while ( p ) {
+ if ( i < (int)undoRedoInfo.oldAligns.size() )
+ undoRedoInfo.oldAligns[ i ] = p->alignment();
+ undoRedoInfo.oldStyles << p->styleSheetItems();
+ undoRedoInfo.oldListStyles << p->listStyle();
+ if ( p == c2.parag() )
+ break;
+ p = p->next();
+ ++i;
+ }
+ }
+ }
+}
+
+void QTextView::removeSelectedText()
+{
+ if ( isReadOnly() )
+ return;
+
+ for ( int i = 1; i < (int)doc->numSelections(); ++i )
+ doc->removeSelection( i );
+
+ drawCursor( FALSE );
+ checkUndoRedoInfo( UndoRedoInfo::RemoveSelected );
+ if ( !undoRedoInfo.valid() ) {
+ doc->selectionStart( QTextDocument::Standard, undoRedoInfo.id, undoRedoInfo.index );
+ undoRedoInfo.d->text = QString::null;
+ }
+ int oldLen = undoRedoInfo.d->text.length();
+ undoRedoInfo.d->text = doc->selectedText( QTextDocument::Standard );
+ QTextCursor c1 = doc->selectionStartCursor( QTextDocument::Standard );
+ QTextCursor c2 = doc->selectionEndCursor( QTextDocument::Standard );
+ undoRedoInfo.oldAligns.resize( undoRedoInfo.oldAligns.size() + QMAX( 0, c2.parag()->paragId() - c1.parag()->paragId() + 1 ) );
+ readFormats( c1, c2, oldLen, undoRedoInfo.d->text, TRUE );
+ doc->removeSelectedText( QTextDocument::Standard, cursor );
+ ensureCursorVisible();
+ lastFormatted = cursor->parag();
+ formatMore();
+ repaintChanged();
+ ensureCursorVisible();
+ drawCursor( TRUE );
+ clearUndoRedo();
+ emit textChanged();
+#if defined(Q_WS_WIN)
+ // there seems to be a problem with repainting or erasing the area
+ // of the scrollview which is not the contents on windows
+ if ( contentsHeight() < visibleHeight() )
+ viewport()->repaint( 0, contentsHeight(), visibleWidth(), visibleHeight() - contentsHeight(), TRUE );
+#endif
+#ifndef QT_NO_CURSOR
+ viewport()->setCursor( isReadOnly() ? arrowCursor : ibeamCursor );
+#endif
+ if ( hasFocus() || viewport()->hasFocus() ) {
+ int h = cursor->parag()->lineHeightOfChar( cursor->index() );
+ QFont f = cursor->parag()->at( cursor->index() )->format()->font();
+ setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
+ cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE/*, &f*/ ); // QT2HACK
+ }
+}
+
+void QTextView::moveCursor( MoveDirectionPrivate direction, bool shift, bool control )
+{
+ drawCursor( FALSE );
+ if ( shift ) {
+ if ( !doc->hasSelection( QTextDocument::Standard ) )
+ doc->setSelectionStart( QTextDocument::Standard, cursor );
+ moveCursor( direction, control );
+ if ( doc->setSelectionEnd( QTextDocument::Standard, cursor ) ) {
+ cursor->parag()->document()->nextDoubleBuffered = TRUE;
+ repaintChanged();
+ } else {
+ drawCursor( TRUE );
+ }
+ ensureCursorVisible();
+ emit selectionChanged();
+ emit copyAvailable( doc->hasSelection( QTextDocument::Standard ) );
+ } else {
+ bool redraw = doc->removeSelection( QTextDocument::Standard );
+ moveCursor( direction, control );
+ if ( !redraw ) {
+ ensureCursorVisible();
+ drawCursor( TRUE );
+ } else {
+ cursor->parag()->document()->nextDoubleBuffered = TRUE;
+ repaintChanged();
+ ensureCursorVisible();
+ drawCursor( TRUE );
+#ifndef QT_NO_CURSOR
+ viewport()->setCursor( isReadOnly() ? arrowCursor : ibeamCursor );
+#endif
+ }
+ if ( redraw ) {
+ emit copyAvailable( doc->hasSelection( QTextDocument::Standard ) );
+ emit selectionChanged();
+ }
+ }
+
+ drawCursor( TRUE );
+ updateCurrentFormat();
+ if ( hasFocus() || viewport()->hasFocus() ) {
+ int h = cursor->parag()->lineHeightOfChar( cursor->index() );
+ QFont f = cursor->parag()->at( cursor->index() )->format()->font();
+ setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
+ cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE/*, &f*/ ); // QT2HACK
+ }
+}
+
+void QTextView::moveCursor( MoveDirectionPrivate direction, bool control )
+{
+ switch ( direction ) {
+ case MoveLeft: {
+ if ( !control )
+ cursor->gotoLeft();
+ else
+ cursor->gotoWordLeft();
+ } break;
+ case MoveRight: {
+ if ( !control )
+ cursor->gotoRight();
+ else
+ cursor->gotoWordRight();
+ } break;
+ case MoveUp: {
+ if ( !control )
+ cursor->gotoUp();
+ else
+ cursor->gotoPageUp( visibleHeight() );
+ } break;
+ case MoveDown: {
+ if ( !control )
+ cursor->gotoDown();
+ else
+ cursor->gotoPageDown( visibleHeight() );
+ } break;
+ case MoveHome: {
+ if ( !control )
+ cursor->gotoLineStart();
+ else
+ cursor->gotoHome();
+ } break;
+ case MoveEnd: {
+ if ( !control )
+ cursor->gotoLineEnd();
+ else
+ cursor->gotoEnd();
+ } break;
+ case MovePgUp:
+ cursor->gotoPageUp( visibleHeight() );
+ break;
+ case MovePgDown:
+ cursor->gotoPageDown( visibleHeight() );
+ break;
+ }
+
+ if ( hasFocus() || viewport()->hasFocus() ) {
+ int h = cursor->parag()->lineHeightOfChar( cursor->index() );
+ QFont f = cursor->parag()->at( cursor->index() )->format()->font();
+ setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
+ cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE/*, &f*/ ); // QT2HACK
+ }
+ updateCurrentFormat();
+}
+
+/*! \reimp */
+
+void QTextView::resizeEvent( QResizeEvent *e )
+{
+ QScrollView::resizeEvent( e );
+#if defined(Q_WS_X11)
+ if ( e->oldSize().width() != e->size().width() )
+#endif
+ doResize();
+}
+
+void QTextView::ensureCursorVisible()
+{
+ lastFormatted = cursor->parag();
+ formatMore();
+ QTextStringChar *chr = cursor->parag()->at( cursor->index() );
+ int h = cursor->parag()->lineHeightOfChar( cursor->index() );
+ int x = cursor->parag()->rect().x() + chr->x + cursor->offsetX();
+ int y = 0; int dummy;
+ cursor->parag()->lineHeightOfChar( cursor->index(), &dummy, &y );
+ y += cursor->parag()->rect().y() + cursor->offsetY();
+ int w = 1;
+ ensureVisible( x, y + h / 2, w, h / 2 + 2 );
+}
+
+void QTextView::drawCursor( bool visible )
+{
+ if ( !cursor->parag() ||
+ !cursor->parag()->isValid() ||
+ ( !hasFocus() && !viewport()->hasFocus() && !inDnD ) ||
+ isReadOnly() )
+ return;
+
+ QPainter p( viewport() );
+ QRect r( cursor->topParag()->rect() );
+ cursor->parag()->setChanged( TRUE );
+ p.translate( -contentsX() + cursor->totalOffsetX(), -contentsY() + cursor->totalOffsetY() );
+ QPixmap *pix = 0;
+ QColorGroup cg( colorGroup() );
+ if ( cursor->parag()->background() )
+ cg.setBrush( QColorGroup::Base, *cursor->parag()->background() );
+ else if ( doc->paper() )
+ cg.setBrush( QColorGroup::Base, *doc->paper() );
+ p.setBrushOrigin( -contentsX(), -contentsY() );
+ cursor->parag()->document()->nextDoubleBuffered = TRUE;
+ if ( !cursor->nestedDepth() ) {
+ int h = cursor->parag()->lineHeightOfChar( cursor->index() );
+ p.setClipRect( QRect( r.x() - cursor->totalOffsetX() + cursor->x() - 5 - contentsX(),
+ r.y() - cursor->totalOffsetY() + cursor->y() - contentsY(), 10, h ) );
+ doc->drawParag( &p, cursor->parag(), r.x() - cursor->totalOffsetX() + cursor->x() - 5,
+ r.y() - cursor->totalOffsetY() + cursor->y(), 10, h, pix, cg, visible, cursor );
+ } else {
+ doc->drawParag( &p, cursor->parag(), r.x() - cursor->totalOffsetX(),
+ r.y() - cursor->totalOffsetY(), r.width(), r.height(),
+ pix, cg, visible, cursor );
+ }
+ cursorVisible = visible;
+}
+
+enum {
+ IdUndo = 0,
+ IdRedo = 1,
+ IdCut = 2,
+ IdCopy = 3,
+ IdPaste = 4,
+ IdClear = 5,
+ IdSelectAll = 6
+};
+
+/*! \reimp */
+
+void QTextView::contentsWheelEvent( QWheelEvent *e )
+{
+ if ( isReadOnly() ) {
+ if ( e->state() & ControlButton ) {
+ if ( e->delta() > 0 )
+ zoomOut();
+ else if ( e->delta() < 0 )
+ zoomIn();
+ return;
+ }
+ }
+ QScrollView::contentsWheelEvent( e );
+}
+
+/*! \reimp */
+
+void QTextView::contentsMousePressEvent( QMouseEvent *e )
+{
+ clearUndoRedo();
+ QTextCursor oldCursor = *cursor;
+ QTextCursor c = *cursor;
+ mousePos = e->pos();
+ mightStartDrag = FALSE;
+ pressedLink = QString::null;
+
+ if ( e->button() == LeftButton ) {
+ mousePressed = TRUE;
+ drawCursor( FALSE );
+ placeCursor( e->pos() );
+ ensureCursorVisible();
+
+ if ( isReadOnly() && linksEnabled() ) {
+ QTextCursor c = *cursor;
+ placeCursor( e->pos(), &c );
+ if ( c.parag() && c.parag()->at( c.index() ) &&
+ c.parag()->at( c.index() )->format()->isAnchor() ) {
+ pressedLink = c.parag()->at( c.index() )->format()->anchorHref();
+ }
+ }
+
+#ifndef QT_NO_DRAGANDDROP
+ if ( doc->inSelection( QTextDocument::Standard, e->pos() ) ) {
+ mightStartDrag = TRUE;
+ drawCursor( TRUE );
+ dragStartTimer->start( QApplication::startDragTime(), TRUE );
+ dragStartPos = e->pos();
+ return;
+ }
+#endif
+
+ bool redraw = FALSE;
+ if ( doc->hasSelection( QTextDocument::Standard ) ) {
+ emit copyAvailable( doc->hasSelection( QTextDocument::Standard ) );
+ emit selectionChanged();
+ if ( !( e->state() & ShiftButton ) ) {
+ redraw = doc->removeSelection( QTextDocument::Standard );
+ doc->setSelectionStart( QTextDocument::Standard, cursor );
+ } else {
+ redraw = doc->setSelectionEnd( QTextDocument::Standard, cursor ) || redraw;
+ }
+ } else {
+ if ( !( e->state() & ShiftButton ) ) {
+ doc->setSelectionStart( QTextDocument::Standard, cursor );
+ } else {
+ doc->setSelectionStart( QTextDocument::Standard, &c );
+ redraw = doc->setSelectionEnd( QTextDocument::Standard, cursor ) || redraw;
+ }
+ }
+
+ for ( int i = 1; i < doc->numSelections(); ++i ) // start with 1 as we don't want to remove the Standard-Selection
+ redraw = doc->removeSelection( i ) || redraw;
+
+ if ( !redraw ) {
+ drawCursor( TRUE );
+ } else {
+ repaintChanged();
+#ifndef QT_NO_CURSOR
+ viewport()->setCursor( isReadOnly() ? arrowCursor : ibeamCursor );
+#endif
+ }
+ } else if ( e->button() == MidButton ) {
+#if 0 // QT2HACK
+ if (QApplication::clipboard()->supportsSelection()) {
+#endif
+ // only do middle-click pasting on systems that have selections (ie. X11)
+#if 0 // QT2HACK
+ QApplication::clipboard()->setSelectionMode(TRUE);
+#endif
+ paste();
+#if 0 // QT2HACK
+ QApplication::clipboard()->setSelectionMode(FALSE);
+ }
+#endif
+ }
+
+ if ( *cursor != oldCursor )
+ updateCurrentFormat();
+}
+
+/*! \reimp */
+
+void QTextView::contentsMouseMoveEvent( QMouseEvent *e )
+{
+ if ( mousePressed ) {
+#ifndef QT_NO_DRAGANDDROP
+ if ( mightStartDrag ) {
+ dragStartTimer->stop();
+ if ( ( e->pos() - dragStartPos ).manhattanLength() > QApplication::startDragDistance() )
+ startDrag();
+ if ( !isReadOnly() )
+ viewport()->setCursor( ibeamCursor );
+ return;
+ }
+#endif
+ mousePos = e->pos();
+ doAutoScroll();
+ oldMousePos = mousePos;
+ }
+
+ if ( !isReadOnly() && !mousePressed ) {
+ if ( doc->hasSelection( QTextDocument::Standard ) && doc->inSelection( QTextDocument::Standard, e->pos() ) )
+ viewport()->setCursor( arrowCursor );
+ else
+ viewport()->setCursor( ibeamCursor );
+ }
+
+ if ( isReadOnly() && linksEnabled() ) {
+ QTextCursor c = *cursor;
+ placeCursor( e->pos(), &c );
+#ifndef QT_NO_NETWORKPROTOCOL
+ if ( c.parag() && c.parag()->at( c.index() ) &&
+ c.parag()->at( c.index() )->format()->isAnchor() ) {
+#ifndef QT_NO_CURSOR
+ viewport()->setCursor( pointingHandCursor );
+#endif
+ onLink = c.parag()->at( c.index() )->format()->anchorHref();
+ QUrl u( doc->context(), onLink, TRUE );
+ emitHighlighted( u.toString( FALSE, FALSE ) );
+ } else {
+#ifndef QT_NO_CURSOR
+ viewport()->setCursor( isReadOnly() ? arrowCursor : ibeamCursor );
+#endif
+ onLink = QString::null;
+ emitHighlighted( QString::null );
+ }
+#endif
+ }
+}
+
+/*! \reimp */
+
+void QTextView::contentsMouseReleaseEvent( QMouseEvent * )
+{
+ QTextCursor oldCursor = *cursor;
+ if ( scrollTimer->isActive() )
+ scrollTimer->stop();
+#ifndef QT_NO_DRAGANDDROP
+ if ( dragStartTimer->isActive() )
+ dragStartTimer->stop();
+ if ( mightStartDrag ) {
+ selectAll( FALSE );
+ mousePressed = FALSE;
+ }
+#endif
+ if ( mousePressed ) {
+ mousePressed = FALSE;
+#if 0 // QT2HACK
+ if (QApplication::clipboard()->supportsSelection()) {
+ QApplication::clipboard()->setSelectionMode(TRUE);
+#endif
+ // only do middle-click selection on systems that support it (ie. X11)
+ if ( !doc->selectedText( QTextDocument::Standard ).isEmpty() )
+ doc->copySelectedText( QTextDocument::Standard );
+#if 0 // QT2HACK
+ QApplication::clipboard()->setSelectionMode(FALSE);
+#endif
+ emit copyAvailable( doc->hasSelection( QTextDocument::Standard ) );
+ emit selectionChanged();
+#if 0 // QT2HACK
+ }
+#endif
+ }
+ emitCursorPositionChanged( cursor );
+ if ( oldCursor != *cursor )
+ updateCurrentFormat();
+ inDoubleClick = FALSE;
+
+#ifndef QT_NO_NETWORKPROTOCOL
+ if ( !onLink.isEmpty() && onLink == pressedLink && linksEnabled() ) {
+ QUrl u( doc->context(), onLink, TRUE );
+ emitLinkClicked( u.toString( FALSE, FALSE ) );
+ }
+#endif
+ drawCursor( TRUE );
+}
+
+/*! \reimp */
+
+void QTextView::contentsMouseDoubleClickEvent( QMouseEvent * )
+{
+ QTextCursor c1 = *cursor;
+ QTextCursor c2 = *cursor;
+ c1.gotoWordLeft();
+ c2.gotoWordRight();
+
+ doc->setSelectionStart( QTextDocument::Standard, &c1 );
+ doc->setSelectionEnd( QTextDocument::Standard, &c2 );
+
+ *cursor = c2;
+
+ repaintChanged();
+
+ inDoubleClick = TRUE;
+ mousePressed = TRUE;
+}
+
+#ifndef QT_NO_DRAGANDDROP
+
+/*! \reimp */
+
+void QTextView::contentsDragEnterEvent( QDragEnterEvent *e )
+{
+ e->acceptAction();
+ inDnD = TRUE;
+}
+
+/*! \reimp */
+
+void QTextView::contentsDragMoveEvent( QDragMoveEvent *e )
+{
+ drawCursor( FALSE );
+ placeCursor( e->pos(), cursor );
+ drawCursor( TRUE );
+ e->acceptAction();
+}
+
+/*! \reimp */
+
+void QTextView::contentsDragLeaveEvent( QDragLeaveEvent * )
+{
+ inDnD = FALSE;
+}
+
+/*! \reimp */
+
+void QTextView::contentsDropEvent( QDropEvent *e )
+{
+ if ( isReadOnly() )
+ return;
+ inDnD = FALSE;
+ e->acceptAction();
+ QString text;
+ int i = -1;
+ while ( ( i = text.find( '\r' ) ) != -1 )
+ text.replace( i, 1, "" );
+ if ( QTextDrag::decode( e, text ) ) {
+ if ( ( e->source() == this ||
+ e->source() == viewport() ) &&
+ e->action() == QDropEvent::Move ) {
+ removeSelectedText();
+ } else {
+ doc->removeSelection( QTextDocument::Standard );
+#ifndef QT_NO_CURSOR
+ viewport()->setCursor( isReadOnly() ? arrowCursor : ibeamCursor );
+#endif
+ }
+ drawCursor( FALSE );
+ placeCursor( e->pos(), cursor );
+ drawCursor( TRUE );
+ insert( text, FALSE, TRUE, FALSE );
+ }
+}
+
+#endif
+
+#if 0 // QT2HACK
+/*! \reimp */
+void QTextView::contentsContextMenuEvent( QContextMenuEvent *e )
+{
+ clearUndoRedo();
+
+ e->accept();
+ if ( !isReadOnly() ) {
+ QPopupMenu *popup = createPopupMenu();
+ int r = popup->exec( e->globalPos() );
+ delete popup;
+
+ if ( r == d->id[ IdClear ] )
+ clear();
+ else if ( r == d->id[ IdSelectAll ] )
+ selectAll();
+ else if ( r == d->id[ IdUndo ] )
+ undo();
+ else if ( r == d->id[ IdRedo ] )
+ redo();
+#ifndef QT_NO_CLIPBOARD
+ else if ( r == d->id[ IdCut ] )
+ cut();
+ else if ( r == d->id[ IdCopy ] )
+ copy();
+ else if ( r == d->id[ IdPaste ] )
+ paste();
+#endif
+ }
+}
+#endif
+
+void QTextView::doAutoScroll()
+{
+ if ( !mousePressed )
+ return;
+
+ QPoint pos( mapFromGlobal( QCursor::pos() ) );
+ drawCursor( FALSE );
+ QTextCursor oldCursor = *cursor;
+ placeCursor( viewportToContents( pos ) );
+ if ( inDoubleClick ) {
+ QTextCursor cl = *cursor;
+ cl.gotoWordLeft();
+ QTextCursor cr = *cursor;
+ cr.gotoWordRight();
+
+ int diff = QABS( oldCursor.parag()->at( oldCursor.index() )->x - mousePos.x() );
+ int ldiff = QABS( cl.parag()->at( cl.index() )->x - mousePos.x() );
+ int rdiff = QABS( cr.parag()->at( cr.index() )->x - mousePos.x() );
+
+
+ if ( cursor->parag()->lineStartOfChar( cursor->index() ) !=
+ oldCursor.parag()->lineStartOfChar( oldCursor.index() ) )
+ diff = 0xFFFFFF;
+
+ if ( rdiff < diff && rdiff < ldiff )
+ *cursor = cr;
+ else if ( ldiff < diff && ldiff < rdiff )
+ *cursor = cl;
+ else
+ *cursor = oldCursor;
+
+ }
+ ensureCursorVisible();
+
+ bool redraw = FALSE;
+ if ( doc->hasSelection( QTextDocument::Standard ) ) {
+ redraw = doc->setSelectionEnd( QTextDocument::Standard, cursor ) || redraw;
+ }
+
+ if ( !redraw ) {
+ drawCursor( TRUE );
+ } else {
+ repaintChanged();
+ drawCursor( TRUE );
+ }
+
+ if ( !scrollTimer->isActive() && pos.y() < 0 || pos.y() > height() )
+ scrollTimer->start( 100, FALSE );
+ else if ( scrollTimer->isActive() && pos.y() >= 0 && pos.y() <= height() )
+ scrollTimer->stop();
+}
+
+void QTextView::placeCursor( const QPoint &pos, QTextCursor *c )
+{
+ if ( !c )
+ c = cursor;
+
+ c->restoreState();
+ QTextParag *s = doc->firstParag();
+ c->place( pos, s );
+ if ( hasFocus() || viewport()->hasFocus() ) {
+ int h = cursor->parag()->lineHeightOfChar( cursor->index() );
+ QFont f = cursor->parag()->at( cursor->index() )->format()->font();
+ setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
+ cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE/*, &f*/ ); // QT2HACK
+ }
+}
+
+void QTextView::formatMore()
+{
+ if ( !lastFormatted )
+ return;
+
+ int bottom = contentsHeight();
+ int lastBottom = -1;
+ int to = !sender() ? 2 : 20;
+ bool firstVisible = FALSE;
+ QRect cr( contentsX(), contentsY(), visibleWidth(), visibleHeight() );
+ for ( int i = 0; ( i < to || firstVisible ) && lastFormatted; ++i ) {
+ lastFormatted->format();
+ if ( i == 0 )
+ firstVisible = lastFormatted->rect().intersects( cr );
+ else if ( firstVisible )
+ firstVisible = lastFormatted->rect().intersects( cr );
+ bottom = QMAX( bottom, lastFormatted->rect().top() +
+ lastFormatted->rect().height() );
+ lastBottom = lastFormatted->rect().top() + lastFormatted->rect().height();
+ lastFormatted = lastFormatted->next();
+ if ( lastFormatted )
+ lastBottom = -1;
+ }
+
+ if ( bottom > contentsHeight() && !cursor->document()->parent() )
+ resizeContents( contentsWidth(), QMAX( doc->height(), bottom ) );
+ else if ( lastBottom != -1 && lastBottom < contentsHeight() && !cursor->document()->parent() )
+ resizeContents( contentsWidth(), QMAX( doc->height(), lastBottom ) );
+
+ if ( lastFormatted )
+ formatTimer->start( interval, TRUE );
+ else
+ interval = QMAX( 0, interval );
+}
+
+void QTextView::doResize()
+{
+ if ( wrapMode != WidgetWidth )
+ return;
+ doc->setMinimumWidth( -1, 0 );
+ resizeContents( width() - verticalScrollBar()->width(), contentsHeight() );
+ QScrollView::setHScrollBarMode( AlwaysOff );
+ doc->setWidth( visibleWidth() );
+ wrapWidth = visibleWidth();
+ doc->invalidate();
+ viewport()->repaint( FALSE );
+ lastFormatted = doc->firstParag();
+ interval = 0;
+ formatMore();
+}
+
+/* \internal */
+
+void QTextView::doChangeInterval()
+{
+ interval = 0;
+}
+
+/*! \reimp */
+
+bool QTextView::eventFilter( QObject *o, QEvent *e )
+{
+ if ( !o || !e )
+ return TRUE;
+
+ if ( o == this || o == viewport() ) {
+ if ( e->type() == QEvent::FocusIn ) {
+ blinkTimer->start( QApplication::cursorFlashTime() / 2 );
+ return TRUE;
+ } else if ( e->type() == QEvent::FocusOut ) {
+ blinkTimer->stop();
+ drawCursor( FALSE );
+ return TRUE;
+ }
+ }
+
+ return QScrollView::eventFilter( o, e );
+}
+
+void QTextView::insert( const QString &text, bool indent, bool checkNewLine, bool removeSelected )
+{
+ if ( cursor->nestedDepth() != 0 ) // #### for 3.0, disable editing of tables as this is not advanced enough
+ return;
+ QTextCursor c2 = *cursor;
+ QString txt( text );
+ drawCursor( FALSE );
+ if ( !isReadOnly() && doc->hasSelection( QTextDocument::Standard ) && removeSelected ) {
+ checkUndoRedoInfo( UndoRedoInfo::RemoveSelected );
+ if ( !undoRedoInfo.valid() ) {
+ doc->selectionStart( QTextDocument::Standard, undoRedoInfo.id, undoRedoInfo.index );
+ undoRedoInfo.d->text = QString::null;
+ }
+ undoRedoInfo.d->text = doc->selectedText( QTextDocument::Standard );
+ doc->removeSelectedText( QTextDocument::Standard, cursor );
+ }
+ checkUndoRedoInfo( UndoRedoInfo::Insert );
+ if ( !undoRedoInfo.valid() ) {
+ undoRedoInfo.id = cursor->parag()->paragId();
+ undoRedoInfo.index = cursor->index();
+ undoRedoInfo.d->text = QString::null;
+ }
+ int oldLen = undoRedoInfo.d->text.length();
+ lastFormatted = checkNewLine && cursor->parag()->prev() ?
+ cursor->parag()->prev() : cursor->parag();
+ int idx = cursor->index();
+ QTextCursor oldCursor = *cursor;
+ cursor->insert( txt, checkNewLine );
+ if ( doc->useFormatCollection() )
+ cursor->parag()->setFormat( idx, txt.length(), currentFormat, TRUE );
+
+ if ( indent && ( txt == "{" || txt == "}" ) )
+ cursor->indent();
+ formatMore();
+ repaintChanged();
+ ensureCursorVisible();
+ drawCursor( TRUE );
+ undoRedoInfo.d->text += txt;
+
+ if ( !doc->preProcessor() ) {
+ for ( int i = 0; i < (int)txt.length(); ++i ) {
+ if ( txt[ i ] == '\n' )
+ continue;
+ if ( c2.parag()->at( c2.index() )->format() ) {
+ c2.parag()->at( c2.index() )->format()->addRef();
+ undoRedoInfo.d->text.setFormat( oldLen + i, c2.parag()->at( c2.index() )->format(), TRUE );
+ }
+ c2.gotoRight();
+ }
+ }
+
+ emit textChanged();
+ if ( !removeSelected ) {
+ doc->setSelectionStart( QTextDocument::Standard, &oldCursor );
+ doc->setSelectionEnd( QTextDocument::Standard, cursor );
+ repaintChanged();
+ }
+ if ( hasFocus() || viewport()->hasFocus() ) {
+ int h = cursor->parag()->lineHeightOfChar( cursor->index() );
+ QFont f = cursor->parag()->at( cursor->index() )->format()->font();
+ setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
+ cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE/*, &f*/ ); // QT2HACK
+ }
+}
+
+void QTextView::undo()
+{
+ if ( isReadOnly() )
+ return;
+
+ for ( int i = 0; i < (int)doc->numSelections(); ++i )
+ doc->removeSelection( i );
+
+#ifndef QT_NO_CURSOR
+ viewport()->setCursor( isReadOnly() ? arrowCursor : ibeamCursor );
+#endif
+
+ clearUndoRedo();
+ drawCursor( FALSE );
+ QTextCursor *c = doc->undo( cursor );
+ if ( !c ) {
+ drawCursor( TRUE );
+ return;
+ }
+ lastFormatted = 0;
+ ensureCursorVisible();
+ repaintChanged();
+ drawCursor( TRUE );
+ emit textChanged();
+ if ( hasFocus() || viewport()->hasFocus() ) {
+ int h = cursor->parag()->lineHeightOfChar( cursor->index() );
+ QFont f = cursor->parag()->at( cursor->index() )->format()->font();
+ setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
+ cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE/*, &f*/ ); // QT2HACK
+ }
+}
+
+void QTextView::redo()
+{
+ if ( isReadOnly() )
+ return;
+
+ for ( int i = 0; i < (int)doc->numSelections(); ++i )
+ doc->removeSelection( i );
+
+#ifndef QT_NO_CURSOR
+ viewport()->setCursor( isReadOnly() ? arrowCursor : ibeamCursor );
+#endif
+
+ clearUndoRedo();
+ drawCursor( FALSE );
+ QTextCursor *c = doc->redo( cursor );
+ if ( !c ) {
+ drawCursor( TRUE );
+ return;
+ }
+ lastFormatted = 0;
+ ensureCursorVisible();
+ repaintChanged();
+ ensureCursorVisible();
+ drawCursor( TRUE );
+ emit textChanged();
+ if ( hasFocus() || viewport()->hasFocus() ) {
+ int h = cursor->parag()->lineHeightOfChar( cursor->index() );
+ QFont f = cursor->parag()->at( cursor->index() )->format()->font();
+ setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
+ cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE/*, &f*/ ); // QT2HACK
+ }
+}
+
+void QTextView::paste()
+{
+#ifndef QT_NO_CLIPBOARD
+ if ( isReadOnly() )
+ return;
+ pasteSubType( "plain" );
+ if ( hasFocus() || viewport()->hasFocus() ) {
+ int h = cursor->parag()->lineHeightOfChar( cursor->index() );
+ QFont f = cursor->parag()->at( cursor->index() )->format()->font();
+ setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
+ cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE/*, &f*/ ); // QT2HACK
+ }
+#endif
+}
+
+void QTextView::checkUndoRedoInfo( UndoRedoInfo::Type t )
+{
+ if ( undoRedoInfo.valid() && t != undoRedoInfo.type ) {
+ clearUndoRedo();
+ }
+ undoRedoInfo.type = t;
+}
+
+/*! Repaints changed paragraphs.
+
+ Although used extensively internally you shouldn't need to call it
+ yourself.
+*/
+
+void QTextView::repaintChanged()
+{
+ QPainter p( viewport() );
+ p.translate( -contentsX(), -contentsY() );
+ paintDocument( FALSE, &p, contentsX(), contentsY(), visibleWidth(), visibleHeight() );
+}
+
+void QTextView::cut()
+{
+ if ( isReadOnly() )
+ return;
+
+ if ( doc->hasSelection( QTextDocument::Standard ) ) {
+ doc->copySelectedText( QTextDocument::Standard );
+ removeSelectedText();
+ }
+ if ( hasFocus() || viewport()->hasFocus() ) {
+ int h = cursor->parag()->lineHeightOfChar( cursor->index() );
+ QFont f = cursor->parag()->at( cursor->index() )->format()->font();
+ setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
+ cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE/*, &f*/ ); // QT2HACK
+ }
+}
+
+/*! Copies any selected text to the clipboard.
+
+ \sa hasSelectedText() copyAvailable()
+ */
+
+void QTextView::copy()
+{
+ if ( !doc->selectedText( QTextDocument::Standard ).isEmpty() )
+ doc->copySelectedText( QTextDocument::Standard );
+}
+
+void QTextView::indent()
+{
+ if ( isReadOnly() )
+ return;
+
+ drawCursor( FALSE );
+ if ( !doc->hasSelection( QTextDocument::Standard ) )
+ cursor->indent();
+ else
+ doc->indentSelection( QTextDocument::Standard );
+ repaintChanged();
+ drawCursor( TRUE );
+ emit textChanged();
+}
+
+/*! Reimplemented to allow tabbing through links
+ */
+
+bool QTextView::focusNextPrevChild( bool n )
+{
+ if ( !isReadOnly() || !linksEnabled() )
+ return FALSE;
+ bool b = doc->focusNextPrevChild( n );
+ if ( b ) {
+ repaintChanged();
+ makeParagVisible( doc->focusIndicator.parag );
+ }
+ return b;
+}
+
+void QTextView::setFormat( QTextFormat *f, int flags )
+{
+ if ( isReadOnly() )
+ return;
+
+ if ( doc->hasSelection( QTextDocument::Standard ) ) {
+ drawCursor( FALSE );
+ QString str = doc->selectedText( QTextDocument::Standard );
+ QTextCursor c1 = doc->selectionStartCursor( QTextDocument::Standard );
+ QTextCursor c2 = doc->selectionEndCursor( QTextDocument::Standard );
+ clearUndoRedo();
+ undoRedoInfo.type = UndoRedoInfo::Format;
+ undoRedoInfo.id = c1.parag()->paragId();
+ undoRedoInfo.index = c1.index();
+ undoRedoInfo.eid = c2.parag()->paragId();
+ undoRedoInfo.eindex = c2.index();
+ undoRedoInfo.d->text = str;
+ readFormats( c1, c2, 0, undoRedoInfo.d->text );
+ undoRedoInfo.format = f;
+ undoRedoInfo.flags = flags;
+ clearUndoRedo();
+ doc->setFormat( QTextDocument::Standard, f, flags );
+ repaintChanged();
+ formatMore();
+ drawCursor( TRUE );
+ emit textChanged();
+ }
+ if ( currentFormat && currentFormat->key() != f->key() ) {
+ currentFormat->removeRef();
+ currentFormat = doc->formatCollection()->format( f );
+ if ( currentFormat->isMisspelled() ) {
+ currentFormat->removeRef();
+ currentFormat = doc->formatCollection()->format( currentFormat->font(), currentFormat->color() );
+ }
+ emitCurrentFontChanged( currentFormat->font() );
+ emitCurrentColorChanged( currentFormat->color() );
+ if ( cursor->index() == cursor->parag()->length() - 1 ) {
+ currentFormat->addRef();
+ cursor->parag()->string()->setFormat( cursor->index(), currentFormat, TRUE );
+ }
+ }
+}
+
+/*! \reimp */
+
+void QTextView::setPalette( const QPalette &p )
+{
+ QScrollView::setPalette( p );
+ if ( textFormat() == PlainText ) {
+ QTextFormat *f = doc->formatCollection()->defaultFormat();
+ f->setColor( colorGroup().text() );
+ viewport()->repaint( FALSE );
+ }
+}
+
+void QTextView::setParagType( QStyleSheetItem::DisplayMode dm, QStyleSheetItem::ListStyle listStyle )
+{
+ if ( isReadOnly() )
+ return;
+
+ drawCursor( FALSE );
+ if ( !doc->hasSelection( QTextDocument::Standard ) ) {
+ clearUndoRedo();
+ undoRedoInfo.type = UndoRedoInfo::ParagType;
+ QValueList< QVector<QStyleSheetItem> > oldStyles;
+ undoRedoInfo.oldStyles.clear();
+ undoRedoInfo.oldStyles << cursor->parag()->styleSheetItems();
+ undoRedoInfo.oldListStyles.clear();
+ undoRedoInfo.oldListStyles << cursor->parag()->listStyle();
+ undoRedoInfo.list = dm == QStyleSheetItem::DisplayListItem;
+ undoRedoInfo.listStyle = listStyle;
+ undoRedoInfo.id = cursor->parag()->paragId();
+ undoRedoInfo.eid = cursor->parag()->paragId();
+ undoRedoInfo.d->text = " ";
+ undoRedoInfo.index = 1;
+ clearUndoRedo();
+ cursor->parag()->setList( dm == QStyleSheetItem::DisplayListItem, listStyle );
+ repaintChanged();
+ } else {
+ QTextParag *start = doc->selectionStart( QTextDocument::Standard );
+ QTextParag *end = doc->selectionEnd( QTextDocument::Standard );
+ lastFormatted = start;
+ clearUndoRedo();
+ undoRedoInfo.type = UndoRedoInfo::ParagType;
+ undoRedoInfo.id = start->paragId();
+ undoRedoInfo.eid = end->paragId();
+ undoRedoInfo.list = dm == QStyleSheetItem::DisplayListItem;
+ undoRedoInfo.listStyle = listStyle;
+ undoRedoInfo.oldStyles.clear();
+ undoRedoInfo.oldListStyles.clear();
+ while ( start ) {
+ undoRedoInfo.oldStyles << start->styleSheetItems();
+ undoRedoInfo.oldListStyles << start->listStyle();
+ start->setList( dm == QStyleSheetItem::DisplayListItem, listStyle );
+ if ( start == end )
+ break;
+ start = start->next();
+ }
+ undoRedoInfo.d->text = " ";
+ undoRedoInfo.index = 1;
+ clearUndoRedo();
+ repaintChanged();
+ formatMore();
+ }
+ drawCursor( TRUE );
+ emit textChanged();
+}
+
+void QTextView::setAlignment( int a )
+{
+ if ( isReadOnly() || block_set_alignment )
+ return;
+
+ drawCursor( FALSE );
+ if ( !doc->hasSelection( QTextDocument::Standard ) ) {
+ if ( cursor->parag()->alignment() != a ) {
+ clearUndoRedo();
+ undoRedoInfo.type = UndoRedoInfo::Alignment;
+ QArray<int> oa( 1 );
+ oa[ 0 ] = cursor->parag()->alignment();
+ undoRedoInfo.oldAligns = oa;
+ undoRedoInfo.newAlign = a;
+ undoRedoInfo.id = cursor->parag()->paragId();
+ undoRedoInfo.eid = cursor->parag()->paragId();
+ undoRedoInfo.d->text = " ";
+ undoRedoInfo.index = 1;
+ clearUndoRedo();
+ cursor->parag()->setAlignment( a );
+ repaintChanged();
+ }
+ } else {
+ QTextParag *start = doc->selectionStart( QTextDocument::Standard );
+ QTextParag *end = doc->selectionEnd( QTextDocument::Standard );
+ lastFormatted = start;
+ int len = end->paragId() - start->paragId() + 1;
+ clearUndoRedo();
+ undoRedoInfo.type = UndoRedoInfo::Alignment;
+ undoRedoInfo.id = start->paragId();
+ undoRedoInfo.eid = end->paragId();
+ QArray<int> oa( QMAX( 0, len ) );
+ int i = 0;
+ while ( start ) {
+ if ( i < (int)oa.size() )
+ oa[ i ] = start->alignment();
+ start->setAlignment( a );
+ if ( start == end )
+ break;
+ start = start->next();
+ ++i;
+ }
+ undoRedoInfo.oldAligns = oa;
+ undoRedoInfo.newAlign = a;
+ undoRedoInfo.d->text = " ";
+ undoRedoInfo.index = 1;
+ clearUndoRedo();
+ repaintChanged();
+ formatMore();
+ }
+ drawCursor( TRUE );
+ if ( currentAlignment != a ) {
+ currentAlignment = a;
+ emitCurrentAlignmentChanged( currentAlignment );
+ }
+ emit textChanged();
+}
+
+void QTextView::updateCurrentFormat()
+{
+ int i = cursor->index();
+ if ( i > 0 )
+ --i;
+ if ( currentFormat->key() != cursor->parag()->at( i )->format()->key() && doc->useFormatCollection() ) {
+ if ( currentFormat )
+ currentFormat->removeRef();
+ currentFormat = doc->formatCollection()->format( cursor->parag()->at( i )->format() );
+ if ( currentFormat->isMisspelled() ) {
+ currentFormat->removeRef();
+ currentFormat = doc->formatCollection()->format( currentFormat->font(), currentFormat->color() );
+ }
+ emitCurrentFontChanged( currentFormat->font() );
+ emitCurrentColorChanged( currentFormat->color() );
+ }
+
+ if ( currentAlignment != cursor->parag()->alignment() ) {
+ currentAlignment = cursor->parag()->alignment();
+ block_set_alignment = TRUE;
+ emitCurrentAlignmentChanged( currentAlignment );
+ block_set_alignment = FALSE;
+ }
+}
+
+void QTextView::setItalic( bool b )
+{
+ QTextFormat f( *currentFormat );
+ f.setItalic( b );
+ setFormat( &f, QTextFormat::Italic );
+}
+
+void QTextView::setBold( bool b )
+{
+ QTextFormat f( *currentFormat );
+ f.setBold( b );
+ setFormat( &f, QTextFormat::Bold );
+}
+
+void QTextView::setUnderline( bool b )
+{
+ QTextFormat f( *currentFormat );
+ f.setUnderline( b );
+ setFormat( &f, QTextFormat::Underline );
+}
+
+void QTextView::setFamily( const QString &f_ )
+{
+ QTextFormat f( *currentFormat );
+ f.setFamily( f_ );
+ setFormat( &f, QTextFormat::Family );
+}
+
+void QTextView::setPointSize( int s )
+{
+ QTextFormat f( *currentFormat );
+ f.setPointSize( s );
+ setFormat( &f, QTextFormat::Size );
+}
+
+void QTextView::setColor( const QColor &c )
+{
+ QTextFormat f( *currentFormat );
+ f.setColor( c );
+ setFormat( &f, QTextFormat::Color );
+}
+
+void QTextView::setFontInternal( const QFont &f_ )
+{
+ QTextFormat f( *currentFormat );
+ f.setFont( f_ );
+ setFormat( &f, QTextFormat::Font );
+}
+
+/*! Returns the text of the text view.
+
+ If the text view is readonly (i.e. it is a QTextView or
+ QTextBrowser), the text set with setText() or any append() additions
+ is returned.
+
+ If the text view is editable (i.e. it is a QTextEdit), the current
+ text is returned. If textFormat() is \c RichText the text will
+ contain HTML formatting tags.
+ */
+
+QString QTextView::text() const
+{
+ if ( isReadOnly() )
+ return doc->originalText();
+ return doc->text();
+}
+
+/*!
+ Returns the text of the paragraph \a para.
+
+ If textFormat() is \c RichText the text will contain HTML
+ formatting tags.
+*/
+
+QString QTextView::text( int para ) const
+{
+ return doc->text( para );
+}
+
+/*! Changes the text of the view to the string \a text and the
+ context to \a context. Any previous text is deleted.
+
+ \a text may be interpreted either as plain text or as rich text,
+ depending on the textFormat(). The default setting is \c AutoText,
+ i.e. the text view autodetects the format from \a text.
+
+ The optional \a context is a path which the text view's
+ QMimeSourceFactory uses to resolve the locations of files and images.
+ (See QTextView::QTextView().) It is passed to the mimeSourceFactory()
+ when quering data.
+
+ \sa text(), setTextFormat()
+*/
+
+void QTextView::setText( const QString &text, const QString &context )
+{
+ emitUndoAvailable( FALSE );
+ emitRedoAvailable( FALSE );
+ undoRedoInfo.clear();
+ doc->commands()->clear();
+
+ lastFormatted = 0;
+ cursor->restoreState();
+ doc->setText( text, context );
+ doc->setMinimumWidth( -1, 0 );
+ resizeContents( 0, 0 );
+ cursor->setDocument( doc );
+ cursor->setParag( doc->firstParag() );
+ cursor->setIndex( 0 );
+
+ if ( qApp->font().pointSize() != QScrollView::font().pointSize() )
+ setFont( QScrollView::font() );
+
+ viewport()->repaint( FALSE );
+ emit textChanged();
+ formatMore();
+ updateCurrentFormat();
+}
+
+
+/*! Finds the next occurrence of the string, \a expr, starting from
+ character position \a index within paragraph \a para.
+
+ If \a para and \a index are both 0 the search begins from the start
+ of the text. If \a cs is TRUE the search is case sensitive,
+ otherwise it is case insensitive. If \a wo is TRUE the search looks
+ for whole word matches only; otherwise it searches for any matching
+ text. If \a forward is TRUE (the default) the search works forward
+ from the starting position to the end of the text, otherwise it
+ works backwards to the beginning of the text.
+
+ If \a expr is found the function returns TRUE and overwrites \a para
+ with the number of the paragraph in which the first character of the
+ match was found and \a index with the index position of that
+ character within the \a para.
+
+ If \a expr is not found the function returns FALSE and the contents
+ of \a index and \a para are undefined.
+*/
+
+bool QTextView::find( const QString &expr, bool cs, bool wo, bool forward,
+ int *para, int *index )
+{
+ drawCursor( FALSE );
+ doc->removeSelection( QTextDocument::Standard );
+#ifndef QT_NO_CURSOR
+ viewport()->setCursor( isReadOnly() ? arrowCursor : ibeamCursor );
+#endif
+ bool found = doc->find( expr, cs, wo, forward, para, index, cursor );
+ ensureCursorVisible();
+ drawCursor( TRUE );
+ repaintChanged();
+ return found;
+}
+
+void QTextView::blinkCursor()
+{
+ if ( !cursorVisible )
+ return;
+ bool cv = cursorVisible;
+ blinkCursorVisible = !blinkCursorVisible;
+ drawCursor( blinkCursorVisible );
+ cursorVisible = cv;
+}
+
+void QTextView::setCursorPosition( int parag, int index )
+{
+ QTextParag *p = doc->paragAt( parag );
+ if ( !p )
+ return;
+
+ if ( index > p->length() - 1 )
+ index = p->length() - 1;
+
+ drawCursor( FALSE );
+ cursor->setParag( p );
+ cursor->setIndex( index );
+ ensureCursorVisible();
+ drawCursor( TRUE );
+}
+
+void QTextView::getCursorPosition( int &parag, int &index ) const
+{
+ parag = cursor->parag()->paragId();
+ index = cursor->index();
+}
+
+void QTextView::setSelection( int parag_from, int index_from,
+ int parag_to, int index_to, int selNum )
+{
+ if ( selNum > doc->numSelections() - 1 )
+ doc->addSelection( selNum );
+ QTextParag *p1 = doc->paragAt( parag_from );
+ if ( !p1 )
+ return;
+ QTextParag *p2 = doc->paragAt( parag_to );
+ if ( !p2 )
+ return;
+
+ if ( index_from > p1->length() - 1 )
+ index_from = p1->length() - 1;
+ if ( index_to > p2->length() - 1 )
+ index_to = p2->length() - 1;
+
+ drawCursor( FALSE );
+ QTextCursor c = *cursor;
+ c.setParag( p1 );
+ c.setIndex( index_from );
+ cursor->setParag( p2 );
+ cursor->setIndex( index_to );
+ doc->setSelectionStart( selNum, &c );
+ doc->setSelectionEnd( selNum, cursor );
+ repaintChanged();
+ ensureCursorVisible();
+ drawCursor( TRUE );
+}
+
+/*!
+ If there is a selection \a paraFrom is set to the number of the
+ paragraph in which the selection begins and \a paraTo is set to the
+ number of the paragraph in which the selection ends. (They could be
+ the same.) \a indexFrom is set to the index at which the selection
+ begins within \a paraFrom, and \a indexTo is set to the index at
+ which the selection ends within \a paraTo.
+
+ If there is no selection \a paraFrom, \a indexFrom, \a paraTo and
+ \a indexTo are all set to -1.
+
+ The \a selNum is the number of the selection (since multiple
+ selections are supported). It defaults to 0 (the first selection).
+
+ \sa selectedText()
+
+*/
+
+void QTextView::getSelection( int &paraFrom, int &indexFrom,
+ int &paraTo, int &indexTo, int selNum ) const
+{
+ if ( !doc->hasSelection( selNum ) ) {
+ paraFrom = -1;
+ indexFrom = -1;
+ paraTo = -1;
+ indexTo = -1;
+ return;
+ }
+
+ doc->selectionStart( selNum, paraFrom, indexFrom );
+ doc->selectionEnd( selNum, paraTo, indexTo );
+}
+
+/*! Sets the text format to \a format. The options are:
+
+ <ul>
+
+ <li> \c PlainText - all characters, except newlines, are displayed
+ verbatim, including spaces. Whenever a newline appears in the text the
+ text view inserts a hard line break and begins a new paragraph.
+
+ <li> \c RichText - rich text rendering. The available styles are
+ defined in the default stylesheet QStyleSheet::defaultSheet().
+
+ <li> \c AutoText - this is the default. The text view autodetects
+ which rendering style is best, \c PlainText or \c RichText. This is
+ done by using the QStyleSheet::mightBeRichText() heuristic.
+
+ </ul>
+*/
+
+void QTextView::setTextFormat( TextFormat format )
+{
+ doc->setTextFormat( format );
+}
+
+/*! Returns the current text format.
+
+ \sa setTextFormat()
+ */
+
+Qt::TextFormat QTextView::textFormat() const
+{
+ return doc->textFormat();
+}
+
+/*! Returns the number of paragraphs in the text.
+ */
+
+int QTextView::paragraphs() const
+{
+ return doc->lastParag()->paragId() + 1;
+}
+
+/*! Returns the number of lines in paragraph \a para.
+ */
+
+int QTextView::linesOfParagraph( int para ) const
+{
+ QTextParag *p = doc->paragAt( para );
+ if ( !p )
+ return -1;
+ return p->lines();
+}
+
+/*! Returns the number of lines in the text view.
+
+ WARNING: This function may be slow. Lines change all the time during
+ word wrapping, so this function has to iterate over all the paragraphs
+ and get the number of lines from each one individually.
+*/
+
+int QTextView::lines() const
+{
+ QTextParag *p = doc->firstParag();
+ int l = 0;
+ while ( p ) {
+ l += p->lines();
+ p = p->next();
+ }
+
+ return l;
+}
+
+/*!
+ Returns the line number in paragraph \a para that contains the
+ character with index \a index. If there is no such paragraph or no
+ such character (e.g. the index is out of range) -1 is returned.
+*/
+
+int QTextView::lineOfChar( int para, int index )
+{
+ QTextParag *p = doc->paragAt( para );
+ if ( !p )
+ return -1;
+
+ int idx, line;
+ QTextStringChar *c = p->lineStartOfChar( index, &idx, &line );
+ if ( !c )
+ return -1;
+
+ return line;
+}
+
+void QTextView::setModified( bool m )
+{
+ if ( modified != m )
+ emitModificationChanged( m );
+ modified = m;
+ if ( modified ) {
+ disconnect( this, SIGNAL( textChanged() ),
+ this, SLOT( setModified() ) );
+ } else {
+ connect( this, SIGNAL( textChanged() ),
+ this, SLOT( setModified() ) );
+ }
+}
+
+bool QTextView::isModified() const
+{
+ return modified;
+}
+
+void QTextView::setModified()
+{
+ setModified( TRUE );
+}
+
+bool QTextView::italic() const
+{
+ return currentFormat->font().italic();
+}
+
+bool QTextView::bold() const
+{
+ return currentFormat->font().bold();
+}
+
+bool QTextView::underline() const
+{
+ return currentFormat->font().underline();
+}
+
+QString QTextView::family() const
+{
+ return currentFormat->font().family();
+}
+
+int QTextView::pointSize() const
+{
+ return currentFormat->font().pointSize();
+}
+
+QColor QTextView::color() const
+{
+ return currentFormat->color();
+}
+
+QFont QTextView::font() const
+{
+ return currentFormat->font();
+}
+
+int QTextView::alignment() const
+{
+ return currentAlignment;
+}
+
+void QTextView::startDrag()
+{
+#ifndef QT_NO_DRAGANDDROP
+ mousePressed = FALSE;
+ inDoubleClick = FALSE;
+ QDragObject *drag = new QTextDrag( doc->selectedText( QTextDocument::Standard ), viewport() );
+ if ( isReadOnly() ) {
+ drag->dragCopy();
+ } else {
+ if ( drag->drag() && QDragObject::target() != this && QDragObject::target() != viewport() ) {
+ doc->removeSelectedText( QTextDocument::Standard, cursor );
+ repaintChanged();
+ }
+ }
+#endif
+}
+
+/*!
+ If \a select is TRUE (the default) all the text is selected.
+ If \a select is FALSE any selected text is deselected (i.e. the
+ selection is cleared).
+*/
+
+void QTextView::selectAll( bool select )
+{
+ if ( !select )
+ doc->removeSelection( QTextDocument::Standard );
+ else
+ doc->selectAll( QTextDocument::Standard );
+ repaintChanged();
+ emit copyAvailable( doc->hasSelection( QTextDocument::Standard ) );
+ emit selectionChanged();
+#ifndef QT_NO_CURSOR
+ viewport()->setCursor( isReadOnly() ? arrowCursor : ibeamCursor );
+#endif
+}
+
+void QTextView::UndoRedoInfo::clear()
+{
+ if ( valid() ) {
+ if ( type == Insert || type == Return )
+ doc->addCommand( new QTextInsertCommand( doc, id, index, d->text.rawData(), oldStyles, oldListStyles, oldAligns ) );
+ else if ( type == Format )
+ doc->addCommand( new QTextFormatCommand( doc, id, index, eid, eindex, d->text.rawData(), format, flags ) );
+ else if ( type == Alignment )
+ doc->addCommand( new QTextAlignmentCommand( doc, id, eid, newAlign, oldAligns ) );
+ else if ( type == ParagType )
+ doc->addCommand( new QTextParagTypeCommand( doc, id, eid, list, listStyle, oldStyles, oldListStyles ) );
+ else if ( type != Invalid )
+ doc->addCommand( new QTextDeleteCommand( doc, id, index, d->text.rawData(), oldStyles, oldListStyles, oldAligns ) );
+ }
+ d->text = QString::null;
+ id = -1;
+ index = -1;
+ oldStyles.clear();
+ oldListStyles.clear();
+ oldAligns.resize( 0 );
+}
+
+
+void QTextView::del()
+{
+ if ( doc->hasSelection( QTextDocument::Standard ) ) {
+ removeSelectedText();
+ return;
+ }
+
+ doKeyboardAction( ActionDelete );
+}
+
+
+QTextView::UndoRedoInfo::UndoRedoInfo( QTextDocument *dc )
+ : type( Invalid ), doc( dc )
+{
+ d = new QUndoRedoInfoPrivate;
+ d->text = QString::null;
+ id = -1;
+ index = -1;
+}
+
+QTextView::UndoRedoInfo::~UndoRedoInfo()
+{
+ delete d;
+}
+
+bool QTextView::UndoRedoInfo::valid() const
+{
+ return d->text.length() > 0 && id >= 0 && index >= 0;
+}
+
+void QTextView::resetFormat()
+{
+ setAlignment( Qt3::AlignAuto );
+ setParagType( QStyleSheetItem::DisplayBlock, QStyleSheetItem::ListDisc );
+ setFormat( doc->formatCollection()->defaultFormat(), QTextFormat::Format );
+}
+
+/*! Returns the QStyleSheet which is currently used in this text view.
+ */
+
+QStyleSheet* QTextView::styleSheet() const
+{
+ return doc->styleSheet();
+}
+
+/*! Sets the stylesheet to use with this text view.
+ */
+
+void QTextView::setStyleSheet( QStyleSheet* styleSheet )
+{
+ doc->setStyleSheet( styleSheet );
+}
+
+/*!
+ Sets the background (paper) to be drawn with brush \a pap.
+ */
+
+void QTextView::setPaper( const QBrush& pap )
+{
+ doc->setPaper( new QBrush( pap ) );
+ viewport()->setBackgroundColor( pap.color() );
+ viewport()->update();
+}
+
+/*! Returns the brush which is used for the background, or an empty
+ brush if setPaper() has never been called.
+*/
+
+QBrush QTextView::paper() const
+{
+ if ( doc->paper() )
+ return *doc->paper();
+ return QBrush();
+}
+
+/*!
+ If \b is TRUE links will be displayed underlined. If \b is FALSE
+ links will not be displayed underlined.
+
+*/
+
+void QTextView::setLinkUnderline( bool b )
+{
+ doc->setUnderlineLinks( b );
+}
+
+/*! Returns TRUE if links will be displayed underlined, otherwise
+ returns FALSE.
+ */
+
+bool QTextView::linkUnderline() const
+{
+ return doc->underlineLinks();
+}
+
+/*! Sets the text view's mimesource factory to \a factory. See
+ QMimeSourceFactory for further details.
+ */
+
+void QTextView::setMimeSourceFactory( QMimeSourceFactory* factory )
+{
+ doc->setMimeSourceFactory( factory );
+}
+
+/*! Returns the QMimeSourceFactory which is currently used by this
+ text view.
+*/
+
+QMimeSourceFactory* QTextView::mimeSourceFactory() const
+{
+ return doc->mimeSourceFactory();
+}
+
+/*!
+ Returns how many pixels high the text view needs to be to display
+ the text if the text view is \a w pixels wide.
+*/
+
+int QTextView::heightForWidth( int w ) const
+{
+ int oldw = doc->width();
+ doc->doLayout( 0, w );
+ int h = doc->height();
+ doc->setWidth( oldw );
+ doc->invalidate();
+ ( (QTextView*)this )->formatMore();
+ return h;
+}
+
+/*! Appends the text \a text at the end of the text view.
+ */
+
+void QTextView::append( const QString &text )
+{
+ doc->removeSelection( QTextDocument::Standard );
+ TextFormat f = doc->textFormat();
+ if ( f == AutoText ) {
+ if ( QStyleSheet::mightBeRichText( text ) )
+ f = RichText;
+ else
+ f = PlainText;
+ }
+ if ( f == PlainText ) {
+ QTextCursor oldc( *cursor );
+ cursor->gotoEnd();
+ insert( text, FALSE, TRUE );
+ *cursor = oldc;
+ } else if ( f == RichText ) {
+ doc->setRichTextInternal( text );
+ repaintChanged();
+ }
+}
+
+/*! Returns TRUE if some text is selected, otherwise returns FALSE.
+ */
+
+bool QTextView::hasSelectedText() const
+{
+ return doc->hasSelection( QTextDocument::Standard );
+}
+
+/*!
+ Returns the selected text or an empty string if there is no currently
+ selected text.
+
+ The text is always returned as \c PlainText regardless of the text
+ format. In a future release of Qt an HTML subset may be returned
+ depending on the text format.
+ */
+
+QString QTextView::selectedText() const
+{
+ return doc->selectedText( QTextDocument::Standard );
+}
+
+void QTextView::handleReadOnlyKeyEvent( QKeyEvent *e )
+{
+ switch( e->key() ) {
+ case Key_Down:
+ setContentsPos( contentsX(), contentsY() + 10 );
+ break;
+ case Key_Up:
+ setContentsPos( contentsX(), contentsY() - 10 );
+ break;
+ case Key_Left:
+ setContentsPos( contentsX() - 10, contentsY() );
+ break;
+ case Key_Right:
+ setContentsPos( contentsX() + 10, contentsY() );
+ break;
+ case Key_PageUp:
+ setContentsPos( contentsX(), contentsY() - visibleHeight() );
+ break;
+ case Key_PageDown:
+ setContentsPos( contentsX(), contentsY() + visibleHeight() );
+ break;
+ case Key_Home:
+ setContentsPos( contentsX(), 0 );
+ break;
+ case Key_End:
+ setContentsPos( contentsX(), contentsHeight() - visibleHeight() );
+ break;
+#ifndef QT_NO_NETWORKPROTOCOL
+ case Key_Return:
+ case Key_Enter:
+ case Key_Space: {
+ if ( !doc->focusIndicator.href.isEmpty() ) {
+ QUrl u( doc->context(), doc->focusIndicator.href, TRUE );
+ emitLinkClicked( u.toString( FALSE, FALSE ) );
+ }
+ } break;
+#endif
+ default:
+ break;
+ }
+}
+
+/*! Returns the context of the view.
+
+ The context is a path which the text view's QMimeSourceFactory
+ uses to resolve the locations of files and images.
+
+ \sa text(), setText()
+*/
+
+QString QTextView::context() const
+{
+ return doc->context();
+}
+
+/*! Returns the document title parsed from the text.
+
+ For \c PlainText the title will be an empty string. For \c RichText
+ the title will be the text between the \c{<title>} tags, if present,
+ otherwise an empty string.
+
+*/
+
+QString QTextView::documentTitle() const
+{
+ return doc->attributes()[ "title" ];
+}
+
+void QTextView::makeParagVisible( QTextParag *p )
+{
+ setContentsPos( contentsX(), QMIN( p->rect().y(), contentsHeight() - visibleHeight() ) );
+}
+
+/*! Scrolls the text view to make the anchor called \a name visible, if
+ it can be found in the document. An anchor is defined using the HTML
+ anchor tag, e.g. \c{<a name="target">}.
+*/
+
+void QTextView::scrollToAnchor( const QString& name )
+{
+ if ( name.isEmpty() )
+ return;
+
+ QTextParag *p = doc->firstParag();
+
+ if ( !doc->lastParag()->isValid() ) {
+ while ( p ) {
+ if ( !p->isValid() )
+ p->format();
+ p = p->next();
+ }
+ resizeContents( contentsWidth(), doc->height() );
+ }
+
+ p = doc->firstParag();
+ while ( p ) {
+ for ( int i = 0; i < p->length(); ++i ) {
+ if ( p->at( i )->format()->isAnchor() &&
+ p->at( i )->format()->anchorName() == name ) {
+ makeParagVisible( p );
+ return;
+ }
+ }
+ p = p->next();
+ }
+}
+
+/*! If there is an anchor at position \a pos (in contents
+ coordinates), its name is returned, otherwise an empty string is
+ returned.
+*/
+
+QString QTextView::anchorAt( const QPoint& pos )
+{
+ QTextCursor c( doc );
+ placeCursor( pos, &c );
+ return c.parag()->at( c.index() )->format()->anchorHref();
+}
+
+void QTextView::setRealWidth( int w )
+{
+ w = QMAX( w, visibleWidth() - verticalScrollBar()->width() );
+ resizeContents( w, contentsHeight() );
+ QScrollView::setHScrollBarMode( setMode );
+}
+
+/*!
+ Updates all the rendering styles used to display the text. Call this
+ function after you change the styleSheet().
+*/
+
+void QTextView::updateStyles()
+{
+ doc->updateStyles();
+}
+
+void QTextView::setDocument( QTextDocument *dc )
+{
+ if ( dc == doc )
+ return;
+ doc = dc;
+ cursor->setDocument( doc );
+ clearUndoRedo();
+ lastFormatted = 0;
+}
+
+#ifndef QT_NO_CLIPBOARD
+
+/*!
+ Copies text in MIME subtype \a subtype from the clipboard (if there is
+ any) into the text view at the current text cursor position.
+ Any selected (marked) text is first deleted.
+*/
+void QTextView::pasteSubType( const QCString& subtype )
+{
+ QCString st = subtype;
+ QString t = QApplication::clipboard()->text(st);
+ if ( !t.isEmpty() ) {
+#if defined(Q_OS_WIN32)
+ // Need to convert CRLF to NL
+ QRegExp crlf( QString::fromLatin1("\r\n") );
+ t.replace( crlf, QChar('\n') );
+#endif
+ for ( int i=0; (uint) i<t.length(); i++ ) {
+ if ( t[ i ] < ' ' && t[ i ] != '\n' && t[ i ] != '\t' )
+ t[ i ] = ' ';
+ }
+ if ( !t.isEmpty() )
+ insert( t, FALSE, TRUE );
+ }
+}
+
+#ifndef QT_NO_MIMECLIPBOARD
+/*!
+ Prompts the user to choose a type from a list of text types available,
+ then copies text from the clipboard (if there is any) into the text
+ view at the current text cursor position. Any selected (marked) text
+ is first deleted.
+*/
+void QTextView::pasteSpecial( const QPoint& pt )
+{
+ QCString st = pickSpecial( QApplication::clipboard()->data(), TRUE, pt );
+ if ( !st.isEmpty() )
+ pasteSubType( st );
+}
+#endif
+#ifndef QT_NO_MIME
+QCString QTextView::pickSpecial( QMimeSource* ms, bool always_ask, const QPoint& pt )
+{
+ if ( ms ) {
+ QPopupMenu popup( this );
+ QString fmt;
+ int n = 0;
+ QDict<void> done;
+ for (int i = 0; !( fmt = ms->format( i ) ).isNull(); i++) {
+ int semi = fmt.find( ";" );
+ if ( semi >= 0 )
+ fmt = fmt.left( semi );
+ if ( fmt.left( 5 ) == "text/" ) {
+ fmt = fmt.mid( 5 );
+ if ( !done.find( fmt ) ) {
+ done.insert( fmt,(void*)1 );
+ popup.insertItem( fmt, i );
+ n++;
+ }
+ }
+ }
+ if ( n ) {
+ int i = n ==1 && !always_ask ? popup.idAt( 0 ) : popup.exec( pt );
+ if ( i >= 0 )
+ return popup.text(i).latin1();
+ }
+ }
+ return QCString();
+}
+#endif // QT_NO_MIME
+#endif // QT_NO_CLIPBOARD
+
+/*! \enum QTextView::WordWrap
+
+ This enum describes the QTextView's word wrap modes. The following
+ values are valid:
+
+ \value NoWrap Do not wrap the text.
+
+ \value WidgetWidth Wrap the text at the current width of the
+ widget (this is the default). Wrapping is at whitespace by default;
+ this can be changed with setWrapPolicy().
+
+ \value FixedPixelWidth Wrap at a fixed number of pixels from the
+ widget's left side. The number of pixels is set with
+ wrapColumnOrWidth().
+
+ \value FixedColumnWidth Wrap at a fixed number of character columns
+ from the widget's left side. The number of characters is set with
+ wrapColumnOrWidth().
+ This is useful whenever you need formatted text that can also be
+ displayed gracefully on devices with monospaced fonts, for example a
+ standard VT100 terminal, where you might set wrapColumnOrWidth() to
+ 80.
+
+ \sa setWordWrap()
+*/
+
+/*! Sets the word wrap mode.
+
+ The default mode is \c WidgetWidth which causes words to be wrapped
+ at the right edge of the widget. Wrapping occurs at spaces, keeping
+ whole words intact. If you want wrapping to occur within words use
+ setWrapPolicy(). If you set a wrap mode of \c FixedPixelWidth or \c
+ FixedColumnWidth you should also call setWrapColumnOrWidth() to set
+ the width you want.
+
+ \sa wordWrap(), setWrapColumnOrWidth(), setWrapPolicy()
+*/
+
+void QTextView::setWordWrap( WordWrap mode )
+{
+ wrapMode = mode;
+ switch ( mode ) {
+ case NoWrap:
+ document()->formatter()->setWrapEnabled( FALSE );
+ document()->formatter()->setWrapAtColumn( -1 );
+ break;
+ case WidgetWidth:
+ document()->formatter()->setWrapEnabled( TRUE );
+ document()->formatter()->setWrapAtColumn( -1 );
+ doResize();
+ break;
+ case FixedPixelWidth:
+ document()->formatter()->setWrapEnabled( TRUE );
+ document()->formatter()->setWrapAtColumn( -1 );
+ setWrapColumnOrWidth( wrapWidth );
+ break;
+ case FixedColumnWidth:
+ document()->formatter()->setWrapEnabled( TRUE );
+ document()->formatter()->setWrapAtColumn( wrapWidth );
+ setWrapColumnOrWidth( wrapWidth );
+ break;
+ }
+}
+
+/*! Returns the current word wrap mode.
+
+ \sa setWordWrap()
+ */
+QTextView::WordWrap QTextView::wordWrap() const
+{
+ return wrapMode;
+}
+
+/*!
+ If the wrap mode is \c FixedPixelWidth, the \a value is the number
+ of pixels from the left edge of the widget at which text should be
+ wrapped. If the wrap mode is \c FixedColumnWidth, the \a value is
+ the column number (in character columns) from the left edge of the
+ widget at which text should be wrapped.
+
+ \sa setWordWrap()
+ */
+
+void QTextView::setWrapColumnOrWidth( int value )
+{
+ wrapWidth = value;
+ if ( wrapMode == FixedColumnWidth ) {
+ document()->formatter()->setWrapAtColumn( wrapWidth );
+ } else {
+ document()->formatter()->setWrapAtColumn( -1 );
+ resizeContents( wrapWidth, contentsHeight() );
+ doc->setWidth( wrapWidth );
+ doc->invalidate();
+ viewport()->repaint( FALSE );
+ lastFormatted = doc->firstParag();
+ interval = 0;
+ formatMore();
+ }
+}
+
+/*!
+ If the wrap mode is \c FixedPixelWidth, returns the number of pixels
+ from the left edge of the widget at which text is wrapped. If the
+ wrap mode is \c FixedColumnWidth, returns the column number (in
+ character columns) from the left edge of the widget at which text is
+ wrapped.
+
+ \sa setWordWrap(), setWrapColumnOrWidth()
+ */
+int QTextView::wrapColumnOrWidth() const
+{
+ return wrapWidth;
+}
+
+
+/*! \enum QTextView::WrapPolicy
+
+ Defines where text can be wrapped in word wrap mode.
+
+ The following values are valid:
+ \value AtWhiteSpace Break lines at whitespace, e.g. spaces or
+ newlines.
+ \value Anywhere Break anywhere, including within words.
+
+ \sa setWrapPolicy()
+*/
+
+/*! Defines where text can be wrapped when word wrap mode is not \a
+ NoWrap. The choices are \c AtWhiteSpace (the default) and \c
+ Anywhere.
+
+ \sa setWordWrap(), wrapPolicy()
+ */
+
+void QTextView::setWrapPolicy( WrapPolicy policy )
+{
+ if ( wPolicy == policy )
+ return;
+ QTextFormatter *formatter;
+ if ( policy == AtWhiteSpace )
+ formatter = new QTextFormatterBreakWords;
+ else
+ formatter = new QTextFormatterBreakInWords;
+ formatter->setWrapAtColumn( document()->formatter()->wrapAtColumn() );
+ formatter->setWrapEnabled( document()->formatter()->isWrapEnabled() );
+ document()->setFormatter( formatter );
+ doc->invalidate();
+ viewport()->repaint( FALSE );
+ lastFormatted = doc->firstParag();
+ interval = 0;
+ formatMore();
+}
+
+/*!
+
+ Returns the current word wrap policy.
+
+ \sa setWrapPolicy()
+ */
+QTextView::WrapPolicy QTextView::wrapPolicy() const
+{
+ return wPolicy;
+}
+
+/*! Deletes the contents of the text view.
+ */
+
+void QTextView::clear()
+{
+ cursor->restoreState();
+ doc->clear( TRUE );
+ cursor->setDocument( doc );
+ cursor->setParag( doc->firstParag() );
+ cursor->setIndex( 0 );
+ viewport()->repaint( FALSE );
+}
+
+int QTextView::undoDepth() const
+{
+ return document()->undoDepth();
+}
+
+/*! Returns the number of characters of the text.
+ */
+
+int QTextView::length() const
+{
+ return document()->length();
+}
+
+/*! Returns the tab width used by the text view.
+ */
+
+int QTextView::tabStopWidth() const
+{
+ return document()->tabStopWidth();
+}
+
+void QTextView::setUndoDepth( int d )
+{
+ document()->setUndoDepth( d );
+}
+
+/*! Sets the tab width used by the text view to \a ts.
+ */
+
+void QTextView::setTabStops( int ts )
+{
+ document()->setTabStops( ts );
+}
+
+/*! \reimp */
+
+void QTextView::setHScrollBarMode( ScrollBarMode sm )
+{
+ setMode = sm;
+}
+
+/*! \reimp */
+
+QSize QTextView::sizeHint() const
+{
+ // ### calculate a reasonable one
+ return QSize( 100, 100 );
+}
+
+void QTextView::clearUndoRedo()
+{
+ undoRedoInfo.clear();
+ emitUndoAvailable( doc->commands()->isUndoAvailable() );
+ emitRedoAvailable( doc->commands()->isRedoAvailable() );
+}
+
+bool QTextView::getFormat( int parag, int index, QFont &font, QColor &color )
+{
+ QTextParag *p = doc->paragAt( parag );
+ if ( !p )
+ return FALSE;
+ if ( index < 0 || index >= p->length() )
+ return FALSE;
+ font = p->at( index )->format()->font();
+ color = p->at( index )->format()->color();
+ return TRUE;
+}
+
+/*! This function is called to create the popup menu which is shown
+ when the user clicks on the text view with the right mouse button. If
+ you want to create a custom popup menu, reimplement this function
+ and return the created popup menu. Ownership is transferred to
+ the caller.
+*/
+
+QPopupMenu *QTextView::createPopupMenu()
+{
+ QPopupMenu *popup = new QPopupMenu( this );
+ d->id[ IdUndo ] = popup->insertItem( tr( "Undo" ) );
+ d->id[ IdRedo ] = popup->insertItem( tr( "Redo" ) );
+ popup->insertSeparator();
+#ifndef QT_NO_CLIPBOARD
+ d->id[ IdCut ] = popup->insertItem( tr( "Cut" ) );
+ d->id[ IdCopy ] = popup->insertItem( tr( "Copy" ) );
+ d->id[ IdPaste ] = popup->insertItem( tr( "Paste" ) );
+#endif
+ d->id[ IdClear ] = popup->insertItem( tr( "Clear" ) );
+ popup->insertSeparator();
+ d->id[ IdSelectAll ] = popup->insertItem( tr( "Select All" ) );
+ popup->setItemEnabled( d->id[ IdUndo ], !isReadOnly() && doc->commands()->isUndoAvailable() );
+ popup->setItemEnabled( d->id[ IdRedo ], !isReadOnly() && doc->commands()->isRedoAvailable() );
+#ifndef QT_NO_CLIPBOARD
+ popup->setItemEnabled( d->id[ IdCut ], !isReadOnly() && doc->hasSelection( QTextDocument::Standard ) );
+ popup->setItemEnabled( d->id[ IdCopy ], doc->hasSelection( QTextDocument::Standard ) );
+ popup->setItemEnabled( d->id[ IdPaste ], !isReadOnly() && !QApplication::clipboard()->text().isEmpty() );
+#endif
+ popup->setItemEnabled( d->id[ IdClear ], !isReadOnly() && !text().isEmpty() );
+ popup->setItemEnabled( d->id[ IdSelectAll ], (bool)text().length() );
+ return popup;
+}
+
+/*! \reimp */
+
+void QTextView::setFont( const QFont &f )
+{
+ QScrollView::setFont( f );
+ doc->setMinimumWidth( -1, 0 );
+
+ // ### that is a bit hacky
+ static short diff = 1;
+ diff *= -1;
+ doc->setWidth( visibleWidth() + diff );
+
+ doc->updateFontSizes( f.pointSize() );
+ lastFormatted = doc->firstParag();
+ formatMore();
+ repaintChanged();
+}
+
+/*! \fn zoomIn()
+
+ Zooms in on the text by by making the standard font size one
+ point larger and recalculating all font sizes. This does not change
+ the size of images.
+
+*/
+
+/*! \fn zoomOut()
+
+ Zooms out on the text by by making the standard font size one
+ point smaller and recalculating all font sizes. This does not change
+ the size of images.
+
+*/
+
+
+/*!
+ Zooms in on the text by by making the standard font size \a range
+ points larger and recalculating all font sizes. This does not change
+ the size of images.
+*/
+
+void QTextView::zoomIn( int range )
+{
+ QFont f( QScrollView::font() );
+ f.setPointSize( f.pointSize() + range );
+ setFont( f );
+}
+
+/*! Zooms out on the text by making the standard font size \a range
+ points smaller and recalculating all font sizes. This does not
+ change the size of images.
+*/
+
+void QTextView::zoomOut( int range )
+{
+ QFont f( QScrollView::font() );
+ f.setPointSize( QMAX( 1, f.pointSize() - range ) );
+ setFont( f );
+}
+
+/* As the engine of QTextView is optimized for large amounts text, it
+ is not sure that after e.g. calling setText() the whole document is
+ formatted, as only the visible part is formatted immediately, and
+ the rest delayed or on demand if needed.
+
+ If you need some information (like contentsHeight() to get the
+ height of the document) to be correct after e.g. calling setText(),
+ call this function to ensure that the whole document has been
+ formatted properly.
+*/
+
+void QTextView::sync()
+{
+ if ( !lastFormatted )
+ return;
+ QTextParag *p = lastFormatted;
+ while ( p ) {
+ p->format();
+ p = p->next();
+ }
+ resizeContents( contentsWidth(), doc->height() );
+}
+
+/*! \reimp */
+
+void QTextView::setEnabled( bool b )
+{
+ QScrollView::setEnabled( b );
+ if ( textFormat() == PlainText ) {
+ QTextFormat *f = doc->formatCollection()->defaultFormat();
+ f->setColor( colorGroup().text() );
+ viewport()->repaint( FALSE );
+ }
+}
+
+void QTextView::setSelectionAttributes( int selNum, const QColor &back, bool invertText )
+{
+ if ( selNum < 1 )
+ return;
+ if ( selNum > doc->numSelections() )
+ doc->addSelection( selNum );
+ doc->setSelectionColor( selNum, back );
+ doc->setInvertSelectionText( selNum, invertText );
+}
diff --git a/bibletime/frontend/thirdparty/qt3stuff/qtextview.h b/bibletime/frontend/thirdparty/qt3stuff/qtextview.h
new file mode 100644
index 0000000..b4d4c03
--- /dev/null
+++ b/bibletime/frontend/thirdparty/qt3stuff/qtextview.h
@@ -0,0 +1,377 @@
+/****************************************************************************
+** $Id: qtextview.h,v 1.6 2002/03/19 01:15:56 joachim Exp $
+**
+** Definition of the QTextView class
+**
+** Created : 990101
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the widgets module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QT3_QTEXTVIEW_H
+#define QT3_QTEXTVIEW_H
+
+#ifndef QT_H
+#include "qscrollview.h"
+#include "qstylesheet.h"
+#include "qpainter.h"
+#include "qvector.h"
+#include "qvaluelist.h"
+#endif // QT_H
+
+class QPainter;
+class QKeyEvent;
+class QResizeEvent;
+class QMouseEvent;
+class QTimer;
+class QFont;
+class QColor;
+class QPopupMenu;
+
+namespace Qt3 {
+ class QTextEdit;
+
+ class QTextString;
+ class QTextCommand;
+ class QTextParag;
+ class QTextFormat;
+ class QTextDocument;
+ class QTextCursor;
+ class QTextViewPrivate;
+ class QTextBrowser;
+ struct QUndoRedoInfoPrivate;
+
+class Q_EXPORT QTextView : public QScrollView
+{
+ friend class QTextEdit;
+ friend class QTextBrowser;
+
+ Q_OBJECT
+ Q_ENUMS( WordWrap WrapPolicy )
+ Q_PROPERTY( TextFormat textFormat READ textFormat WRITE setTextFormat )
+ Q_PROPERTY( QString text READ text WRITE setText )
+ Q_PROPERTY( QBrush paper READ paper WRITE setPaper )
+ Q_PROPERTY( bool linkUnderline READ linkUnderline WRITE setLinkUnderline )
+ Q_PROPERTY( QString documentTitle READ documentTitle )
+ Q_PROPERTY( int length READ length )
+ Q_PROPERTY( WordWrap wordWrap READ wordWrap WRITE setWordWrap )
+ Q_PROPERTY( int wrapColumnOrWidth READ wrapColumnOrWidth WRITE setWrapColumnOrWidth )
+ Q_PROPERTY( WrapPolicy wrapPolicy READ wrapPolicy WRITE setWrapPolicy )
+
+public:
+ enum WordWrap {
+ NoWrap,
+ WidgetWidth,
+ FixedPixelWidth,
+ FixedColumnWidth
+ };
+
+ enum WrapPolicy {
+ AtWhiteSpace,
+ Anywhere
+ };
+
+ QTextView( const QString& text, const QString& context = QString::null,
+ QWidget *parent=0, const char *name=0);
+ QTextView( QWidget *parent = 0, const char *name = 0 );
+ virtual ~QTextView();
+ void setPalette( const QPalette & );
+ void setFont( const QFont &f );
+
+ QString text() const;
+ QString text( int para ) const;
+ TextFormat textFormat() const;
+ QString context() const;
+ QString documentTitle() const;
+
+ void getSelection( int &paraFrom, int &indexFrom,
+ int &paraTo, int &indexTo, int selNum = 0 ) const;
+ virtual bool find( const QString &expr, bool cs, bool wo, bool forward = TRUE,
+ int *para = 0, int *index = 0 );
+
+ void append( const QString& text );
+
+ int paragraphs() const;
+ int lines() const;
+ int linesOfParagraph( int para ) const;
+ int lineOfChar( int para, int chr );
+ int length() const;
+
+ Qt3::QStyleSheet* styleSheet() const;
+ QMimeSourceFactory* mimeSourceFactory() const;
+
+ QBrush paper() const;
+ bool linkUnderline() const;
+
+ int heightForWidth( int w ) const;
+
+ bool hasSelectedText() const;
+ QString selectedText() const;
+
+ WordWrap wordWrap() const;
+ int wrapColumnOrWidth() const;
+ WrapPolicy wrapPolicy() const;
+
+ int tabStopWidth() const;
+ void setHScrollBarMode( ScrollBarMode );
+
+ QString anchorAt( const QPoint& pos );
+
+ QSize sizeHint() const;
+
+public slots:
+ void setEnabled( bool );
+ virtual void setMimeSourceFactory( QMimeSourceFactory* factory );
+ virtual void setStyleSheet( Qt3::QStyleSheet* styleSheet );
+ virtual void scrollToAnchor( const QString& name );
+ virtual void setPaper( const QBrush& pap );
+ virtual void setLinkUnderline( bool );
+
+ virtual void setWordWrap( WordWrap mode );
+ virtual void setWrapColumnOrWidth( int );
+ virtual void setWrapPolicy( WrapPolicy policy );
+
+ virtual void copy();
+
+ void setText( const QString &txt ) { setText( txt, QString::null ); }
+ virtual void setTextFormat( TextFormat f );
+ virtual void setText( const QString &txt, const QString &context );
+
+ virtual void selectAll( bool select = TRUE );
+ virtual void setTabStops( int ts );
+ virtual void zoomIn( int range );
+ virtual void zoomOut( int range );
+ virtual void zoomIn() { zoomIn( 1 ); }
+ virtual void zoomOut() { zoomOut( 1 ); }
+
+ virtual void sync();
+
+signals:
+ void textChanged();
+ void selectionChanged();
+ void copyAvailable( bool );
+
+protected:
+ void repaintChanged();
+ void updateStyles();
+ void drawContents( QPainter *p, int cx, int cy, int cw, int ch );
+ bool event( QEvent *e );
+ void keyPressEvent( QKeyEvent *e );
+ void resizeEvent( QResizeEvent *e );
+ void contentsMousePressEvent( QMouseEvent *e );
+ void contentsMouseMoveEvent( QMouseEvent *e );
+ void contentsMouseReleaseEvent( QMouseEvent *e );
+ void contentsMouseDoubleClickEvent( QMouseEvent *e );
+ void contentsWheelEvent( QWheelEvent *e );
+#ifndef QT_NO_DRAGANDDROP
+ void contentsDragEnterEvent( QDragEnterEvent *e );
+ void contentsDragMoveEvent( QDragMoveEvent *e );
+ void contentsDragLeaveEvent( QDragLeaveEvent *e );
+ void contentsDropEvent( QDropEvent *e );
+#endif
+ // void contentsContextMenuEvent( QContextMenuEvent *e ); QT2HACK
+ bool eventFilter( QObject *o, QEvent *e );
+ bool focusNextPrevChild( bool next );
+ QTextDocument *document() const;
+ void setDocument( QTextDocument *doc );
+ virtual QPopupMenu *createPopupMenu();
+
+protected slots:
+ virtual void doChangeInterval();
+
+private slots:
+ void formatMore();
+ void doResize();
+ void doAutoScroll();
+ void blinkCursor();
+ void setModified();
+ void startDrag();
+ void setRealWidth( int w );
+
+private:
+ struct Q_EXPORT UndoRedoInfo {
+ enum Type { Invalid, Insert, Delete, Backspace, Return, RemoveSelected, Format, Alignment, ParagType };
+
+ UndoRedoInfo( QTextDocument *dc );
+ ~UndoRedoInfo();
+ void clear();
+ bool valid() const;
+
+ QUndoRedoInfoPrivate *d;
+ int id;
+ int index;
+ int eid;
+ int eindex;
+ QTextFormat *format;
+ int flags;
+ Type type;
+ QTextDocument *doc;
+ QArray<int> oldAligns;
+ int newAlign;
+ bool list;
+ Qt3::QStyleSheetItem::ListStyle listStyle;
+ QValueList< QVector<Qt3::QStyleSheetItem> > oldStyles;
+ QValueList<Qt3::QStyleSheetItem::ListStyle> oldListStyles;
+ };
+
+ enum KeyboardActionPrivate { // keep in sync with QTextEdit
+ ActionBackspace,
+ ActionDelete,
+ ActionReturn,
+ ActionKill
+ };
+
+ enum MoveDirectionPrivate { // keep in sync with QTextEdit
+ MoveLeft,
+ MoveRight,
+ MoveUp,
+ MoveDown,
+ MoveHome,
+ MoveEnd,
+ MovePgUp,
+ MovePgDown
+ };
+
+private:
+ virtual bool isReadOnly() const { return TRUE; }
+ virtual bool linksEnabled() const { return FALSE; }
+ void init();
+ void drawCursor( bool visible );
+ void checkUndoRedoInfo( UndoRedoInfo::Type t );
+ void updateCurrentFormat();
+ void handleReadOnlyKeyEvent( QKeyEvent *e );
+ void makeParagVisible( QTextParag *p );
+#ifndef QT_NO_MIME
+ QCString pickSpecial(QMimeSource* ms, bool always_ask, const QPoint&);
+#endif
+#ifndef QT_NO_MIMECLIPBOARD
+ void pasteSpecial(const QPoint&);
+#endif
+
+private: // these are functions which actually do editing stuff, but
+ // are implemented here as it is easier to implement viewing and
+ // editing in the same class. In QTextEdit these functions are made
+ // public
+ virtual void emitUndoAvailable( bool ) {}
+ virtual void emitRedoAvailable( bool ) {}
+ virtual void emitCurrentFontChanged( const QFont & ) {}
+ virtual void emitCurrentColorChanged( const QColor & ) {}
+ virtual void emitCurrentAlignmentChanged( int ) {}
+ virtual void emitCursorPositionChanged( QTextCursor * ) {}
+ virtual void emitReturnPressed() {}
+ virtual void emitHighlighted( const QString & ) {}
+ virtual void emitLinkClicked( const QString & ) {}
+ virtual void emitModificationChanged( bool ) {}
+
+ void getCursorPosition( int &parag, int &index ) const;
+ bool isModified() const;
+ bool italic() const;
+ bool bold() const;
+ bool underline() const;
+ QString family() const;
+ int pointSize() const;
+ QColor color() const;
+ QFont font() const;
+ int alignment() const;
+ void setOverwriteMode( bool b ) { overWrite = b; }
+ bool isOverwriteMode() const { return overWrite; }
+ int undoDepth() const;
+ void undo();
+ void redo();
+ void cut();
+ void paste();
+ void del();
+ void clear();
+ void pasteSubType( const QCString &subtype );
+ void indent();
+ void setItalic( bool b );
+ void setBold( bool b );
+ void setUnderline( bool b );
+ void setFamily( const QString &f );
+ void setPointSize( int s );
+ void setColor( const QColor &c );
+ void setFontInternal( const QFont &f );
+ void setAlignment( int );
+ void setParagType( QStyleSheetItem::DisplayMode, QStyleSheetItem::ListStyle listStyle );
+ void setCursorPosition( int parag, int index );
+ void setSelection( int parag_from, int index_from,
+ int parag_to, int index_to, int selNum = 0 );
+ void setSelectionAttributes( int selNum, const QColor &back, bool invertText );
+ void setModified( bool m );
+ void resetFormat();
+ void setUndoDepth( int d );
+ void setFormat( QTextFormat *f, int flags );
+ void ensureCursorVisible();
+ void placeCursor( const QPoint &pos, QTextCursor *c = 0 );
+ void moveCursor( MoveDirectionPrivate direction, bool shift, bool control );
+ void moveCursor( MoveDirectionPrivate direction, bool control );
+ void removeSelectedText();
+ void doKeyboardAction( KeyboardActionPrivate action );
+ void insert( const QString &text, bool indent = FALSE, bool checkNewLine = TRUE, bool removeSelected = TRUE );
+ void readFormats( QTextCursor &c1, QTextCursor &c2, int oldLen, QTextString &text, bool fillStyles = FALSE );
+ void clearUndoRedo();
+ bool getFormat( int parag, int index, QFont &font, QColor &color );
+ void paintDocument( bool drawAll, QPainter *p, int cx = -1, int cy = -1, int cw = -1, int ch = -1 );
+
+private:
+ QTextDocument *doc;
+ QTextCursor *cursor;
+ bool mousePressed;
+ QTimer *formatTimer, *scrollTimer, *changeIntervalTimer, *blinkTimer, *dragStartTimer, *resizeTimer;
+ QTextParag *lastFormatted;
+ int interval;
+ UndoRedoInfo undoRedoInfo;
+ QTextFormat *currentFormat;
+ int currentAlignment;
+ bool inDoubleClick;
+ QPoint oldMousePos, mousePos;
+ bool cursorVisible, blinkCursorVisible;
+ bool readOnly, modified, mightStartDrag;
+ QPoint dragStartPos;
+ QString onLink;
+ bool overWrite;
+ WordWrap wrapMode;
+ WrapPolicy wPolicy;
+ int wrapWidth;
+ QScrollView::ScrollBarMode setMode;
+ QString pressedLink;
+ QTextViewPrivate *d;
+ bool inDnD;
+
+};
+
+inline QTextDocument *QTextView::document() const
+{
+ return doc;
+}
+
+}; // namespace
+
+#endif
diff --git a/bibletime/main.cpp b/bibletime/main.cpp
new file mode 100644
index 0000000..2fa844b
--- /dev/null
+++ b/bibletime/main.cpp
@@ -0,0 +1,220 @@
+/***************************************************************************
+ main.cpp - The file containing main ;-)
+ -------------------
+ begin : Mit Jan 19 12:57:15 CET 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+***************************************************************************/
+
+
+/* $Header: /cvsroot/bibletime/bibletime/bibletime/main.cpp,v 1.61 2002/03/31 23:01:01 joachim Exp $ */
+/* $Revision: 1.61 $ */
+
+//standard includes
+#include <stdlib.h>
+#include <stdio.h>
+#include <signal.h>
+
+//own includes
+#include "resource.h"
+#include "bibletime.h"
+#include "config.h"
+
+//frontend includes
+#include "frontend/kstartuplogo.h"
+#include "frontend/chtmldialog.h"
+#include "frontend/cbtconfig.h"
+
+//KDE includes
+#include <kcmdlineargs.h>
+#include <kcrash.h>
+#include <kglobal.h>
+#include <kapp.h>
+#include <kstddirs.h>
+#include <kinstance.h>
+#include <kaboutdata.h>
+#include <klocale.h>
+
+#include <kmessagebox.h>
+
+bool showDebugMessages = false;
+BibleTime* bibletime = 0;
+
+void myMessageOutput( QtMsgType type, const char *msg ) {
+ //we use this messagehandler to switch debugging off in final releases
+ switch ( type ) {
+ case QtDebugMsg:
+ if (showDebugMessages) //only show messages if they are enabled!
+ fprintf( stderr,"(BibleTime %s) Debug: %s\n",VERSION, msg );
+ break;
+ case QtWarningMsg:
+ fprintf( stderr,"(BibleTime %s) WARNING: %s\n",VERSION, msg );
+ break;
+ case QtFatalMsg:
+ fprintf( stderr,"(BibleTime %s) _FATAL_: %s\nPlease contact info@bibletime.de and report this bug!",VERSION, msg );
+ abort(); // dump core on purpose
+ }
+}
+
+extern "C" {
+ static void setSignalHandler(void (*handler)(int));
+
+ // Crash recovery signal handler
+ static void signalHandler(int sigId) {
+ setSignalHandler(SIG_DFL);
+ fprintf(stderr, "*** BibleTime got signal %d (Exiting)\n", sigId);
+ // try to cleanup all windows
+ if (bibletime) {
+ bibletime->saveSettings();
+ fprintf(stderr, "*** Saving seemed to be succesful. If restoring does not work on next startup \
+please use the option --ignore-startprofile\n");
+ }
+ ::exit(-1); //exit BibleTime
+ }
+
+ // Crash recovery signal handler
+ static void crashHandler(int sigId) {
+ setSignalHandler(SIG_DFL);
+ fprintf(stderr, "*** BibleTime got signal %d (Crashing). Trying to save settings.\n", sigId);
+ if (bibletime) {
+ bibletime->saveSettings();
+ fprintf(stderr, "*** Saving seemed to be succesful. If restoring does not work on next startup \
+please use the option --ignore-startprofile\n");
+ }
+ // Return to DrKonqi.
+ }
+
+ static void setSignalHandler(void (*handler)(int)) {
+ signal(SIGKILL, handler);
+ signal(SIGTERM, handler);
+ signal(SIGHUP, handler);
+ KCrash::setEmergencySaveFunction(crashHandler);
+ }
+}
+
+int main(int argc, char* argv[]) {
+ qInstallMsgHandler( myMessageOutput );
+
+ //create about data for this application
+ static KCmdLineOptions options[] =
+ {
+ {"debug", I18N_NOOP("Enable debug messages"),0},
+ {"ignore-startprofile", I18N_NOOP("Ignore the startup profile saved after the last BibleTime execution."),0},
+ {0,0,0}
+ };
+
+ KAboutData aboutData(
+ PACKAGE,
+ "BibleTime",
+ VERSION,
+ I18N_NOOP("Bible study tool for KDE 2"),
+ KAboutData::License_GPL_V2,
+ I18N_NOOP("(c)1999-2002, The BibleTime Team"),
+ I18N_NOOP("BibleTime is an easy to use but powerful Bible study tool for KDE 2.\n\nWe are looking for translators and handbook authors.\nIf you'd like to join use send an eMail to info@bibletime.de."),
+ "http://www.bibletime.de/",
+ "info@bibletime.de"
+ );
+
+ //we could so change this to a file reading function (including commented out people
+ //coders
+ // active developers (sorted by name)
+ aboutData.addAuthor("Joachim Ansorg", I18N_NOOP("Project coordinator"), "jansorg@gmx.de", "");
+ aboutData.addAuthor("Martin Gruner", I18N_NOOP("Frontend, backend"), "mg.pub@gmx.net", "");
+ aboutData.addAuthor("Mark Lybarger", I18N_NOOP("Searchdialog"), "mlybarge@insight.rr.com","");
+// aboutData.addAuthor("Chris Kujawa", I18N_NOOP("Frontend"),"christopher.kujawa@verizon.net", "");
+// aboutData.addAuthor("Luke Mauldin", I18N_NOOP("Frontend"),"lukeskyfly@txk.net", "");
+// aboutData.addAuthor("Tim Brodie", I18N_NOOP("Installation manager"),"tbrodie@displayworksinc.com", "");
+
+ //artwork (sorted by name)
+ aboutData.addAuthor("Timothy R. Butler", I18N_NOOP("Icons, startlogo, banners"), "tbutler@uninetsolutions.com", "www.uninetsolutions.com");
+
+ //documentation (sorted by name)
+ aboutData.addAuthor("Fred Saalbach", I18N_NOOP("Handbook"), "saalbach@sybercom.net", "");
+
+ //translators (sorted by language)
+ aboutData.addAuthor("Michal Rovnaník", I18N_NOOP("Translation into Czech"), "Michal.Rovnanik@seznam.cz", "");
+ aboutData.addAuthor("Birger Langkjer", I18N_NOOP("Translation into Danish"), "birger.langkjer@image.dk", "");
+ aboutData.addAuthor("Kees van Veen", I18N_NOOP("Translation into Dutch"), "cvn@interchain.nl", "");
+// aboutData.addAuthor("Mario Bertrand", I18N_NOOP("Translation into French"), "mbert@tbrq.org", "");
+ aboutData.addAuthor("Mathias Bavay", I18N_NOOP("Translation into French"), "mathias.bavay@free.fr", "");
+ aboutData.addAuthor("Balint Sandor", I18N_NOOP("Translation into Hungarian"), "balintsa@freemail.hu", "");
+ aboutData.addAuthor("Beda Szukics", I18N_NOOP("Translation into Italian"), "bszukics@bluewin.ch", "");
+ aboutData.addAuthor("Silvio Bacchetta", I18N_NOOP("Translation into Italian"), "sorgilazzaro@tiscalinet.it", "");
+ aboutData.addAuthor("Espen Trydal", I18N_NOOP("Translation into Norwegian"), "etrydal@postkassa.no", "");
+ aboutData.addAuthor("Benedykt P. Barszcz",I18N_NOOP("Translation into Polish"), "kb2qzv@box43.gnet.pl", "");
+ aboutData.addAuthor("Nuno Bareto", I18N_NOOP("Translation into Portoguese"), "nbarr@oninet.pt", "");
+ aboutData.addAuthor("Yuriy Salimovskyy", I18N_NOOP("Translation into Russian"), "y2000@pisem.net", "");
+ aboutData.addAuthor("Zdeno Podobny", I18N_NOOP("Translation into Slovak"), "zdpo@post.sk", "");
+ aboutData.addAuthor("Eduardo Sanchez", I18N_NOOP("Translation into Spanish"), "csanche2@calvin.edu", "");
+
+ //credits (sorted by name)
+ aboutData.addCredit("Bob Harman", I18N_NOOP("Bible study HowTo"), "N_Cov_Church@compuserve.com", "");
+
+ KCmdLineArgs::init(argc, argv, &aboutData);
+ KCmdLineArgs::addCmdLineOptions ( options );
+
+
+ KApplication app;
+ KGlobal::dirs()->addResourceType("BT_pic", "share/apps/bibletime/pics/");
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ // A binary option (on / off)
+ if (args->isSet("debug"))
+ showDebugMessages = true;
+
+ if (kapp->isRestored()){
+ for(int n = 1; KMainWindow::canBeRestored(n); n++)
+ (new BibleTime)->restore(n);
+ }
+ else {
+ const bool showIt = CBTConfig::get(CBTConfig::logo);
+
+ if(showIt) {
+ KStartupLogo::createSplash();
+ KStartupLogo::showSplash();
+ KStartupLogo::setStatusMessage( i18n("Starting BibleTime") + QString::fromLatin1("...") );
+ }
+
+ bibletime = new BibleTime();
+
+ if (showIt) {
+ KStartupLogo::hideSplash();
+ KStartupLogo::deleteSplash();
+ }
+
+ // a new BibleTime version was installed (maybe a completely new installation)
+ if (CBTConfig::get(CBTConfig::bibletimeVersion) != VERSION) {
+ CBTConfig::set(CBTConfig::bibletimeVersion, VERSION);
+ CHTMLDialog dlg(HELPDIALOG_FIRST_START);
+ dlg.exec();
+ bibletime->slotSettingsOptions();
+ }
+
+ //The tip of the day
+ if (CBTConfig::get(CBTConfig::tips))
+ bibletime->slotHelpTipOfDay();
+
+ bibletime->show();
+
+ // restore the workspace
+ if (CBTConfig::get(CBTConfig::restoreWorkspace) && !args->isSet("ignore-startprofile"))
+ bibletime->restoreWorkspace();
+
+ setSignalHandler(signalHandler);
+
+ const int ret = app.exec();
+ CPointers::deleteBackend();
+ return ret;
+ }
+}
+
diff --git a/bibletime/pics/Makefile.am b/bibletime/pics/Makefile.am
new file mode 100644
index 0000000..055a752
--- /dev/null
+++ b/bibletime/pics/Makefile.am
@@ -0,0 +1,29 @@
+SUBDIRS = \
+lowcolor \
+highcolor \
+.
+
+BIBLETIME_PICS = \
+startuplogo.png
+
+
+EXTRA_DIST = $(BIBLETIME_PICS)
+
+install-data-local:
+ $(mkinstalldirs) $(DESTDIR)$(kde_datadir)/bibletime/pics/
+ chmod 755 $(DESTDIR)$(kde_datadir)/bibletime/pics/;
+ @for file in $(BIBLETIME_PICS); do \
+ echo Installing $$file; \
+ $(INSTALL_DATA) $$file $(DESTDIR)$(kde_datadir)/bibletime/pics/$$file; \
+ chmod 644 $(DESTDIR)$(kde_datadir)/bibletime/pics/$$file; \
+ done
+
+uninstall-local:
+ @for file in $(BIBLETIME_PICS); \
+ do \
+ echo Removing $(DESTDIR)$(kde_datadir)/bibletime/pics/$$file; \
+ rm -f $(DESTDIR)$(kde_datadir)/bibletime/pics/$$file; \
+ done
+
+KDE_ICON = AUTO
+
diff --git a/bibletime/pics/Makefile.in b/bibletime/pics/Makefile.in
new file mode 100644
index 0000000..60a434a
--- /dev/null
+++ b/bibletime/pics/Makefile.in
@@ -0,0 +1,494 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+SUBDIRS = lowcolor highcolor .
+
+
+BIBLETIME_PICS = startuplogo.png
+
+
+EXTRA_DIST = $(BIBLETIME_PICS)
+
+KDE_ICON = AUTO
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES =
+DIST_COMMON = Makefile.am Makefile.in
+
+
+#>- DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+#>+ 4
+KDE_DIST=gen_am.sh startuplogo.png startuplogo.xcf
+
+DISTFILES= $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
+
+
+TAR = tar
+GZIP_ENV = --best
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+@SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+ rev="$$subdir $$rev"; \
+ test "$$subdir" = "." && dot_seen=yes; \
+ done; \
+ test "$$dot_seen" = "no" && rev=". $$rev"; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/pics
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/pics/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+ for subdir in $(SUBDIRS); do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ chmod 777 $(distdir)/$$subdir; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
+ || exit 1; \
+ fi; \
+ done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am: install-data-local
+install-data: install-data-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am: uninstall-local
+uninstall: uninstall-recursive
+all-am: Makefile
+all-redirect: all-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am: clean-tags clean-generic mostlyclean-am
+
+#>- clean: clean-recursive
+#>+ 1
+clean: kde-rpo-clean clean-recursive
+
+distclean-am: distclean-tags distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-recursive
+
+maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \
+ distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+
+.PHONY: install-data-recursive uninstall-data-recursive \
+install-exec-recursive uninstall-exec-recursive installdirs-recursive \
+uninstalldirs-recursive all-recursive check-recursive \
+installcheck-recursive info-recursive dvi-recursive \
+mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-local install-data-am install-data install-am \
+install uninstall-local uninstall-am uninstall all-redirect all-am all \
+installdirs-am installdirs mostlyclean-generic distclean-generic \
+clean-generic maintainer-clean-generic clean mostlyclean distclean \
+maintainer-clean
+
+
+install-data-local:
+ $(mkinstalldirs) $(DESTDIR)$(kde_datadir)/bibletime/pics/
+ chmod 755 $(DESTDIR)$(kde_datadir)/bibletime/pics/;
+ @for file in $(BIBLETIME_PICS); do \
+ echo Installing $$file; \
+ $(INSTALL_DATA) $$file $(DESTDIR)$(kde_datadir)/bibletime/pics/$$file; \
+ chmod 644 $(DESTDIR)$(kde_datadir)/bibletime/pics/$$file; \
+ done
+
+uninstall-local:
+ @for file in $(BIBLETIME_PICS); \
+ do \
+ echo Removing $(DESTDIR)$(kde_datadir)/bibletime/pics/$$file; \
+ rm -f $(DESTDIR)$(kde_datadir)/bibletime/pics/$$file; \
+ done
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 2
+docs-am:
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/Makefile.in
+
+
+#>+ 2
+final:
+ $(MAKE) all-am
+#>+ 2
+no-final:
+ $(MAKE) all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/pics/gen_am.sh b/bibletime/pics/gen_am.sh
new file mode 100755
index 0000000..7a2540b
--- /dev/null
+++ b/bibletime/pics/gen_am.sh
@@ -0,0 +1,54 @@
+#!/bin/bash
+#
+# gen_am.sh script
+#
+# (C) 2001 The BibleTime team
+# released under the GPL
+#
+# This script creates the Makefile.am files in the
+# bibletime/pics/*color/ and bibletime/pics/*color/*x* directories.
+#
+# It will not change the bibletime/pics/Makefile.am!
+
+# change to the dir the script is located in
+cd `dirname $0`
+
+export HEADER="\n"\
+"# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh\n"\
+"# please do not edit this file but rather run the script to update\n"
+
+# create Makefile.am's in /bibletime/pics/*color/ directories
+#
+for I1 in `ls -d *color`; do
+
+ echo creating $I1/Makefile.am
+ ( # output to Makefile.am
+ echo -e $HEADER
+
+ echo -n "SUBDIRS = "
+ for I2 in `ls -d $I1/*x*`; do
+ echo -n `basename $I2`" "
+ done
+ echo
+ ) > $I1/Makefile.am
+
+done
+
+
+# create Makefile.am's in /bibletime/pics/*color/*x* directories
+#
+for I1 in `ls -d *color/*x*`; do
+
+ echo creating $I1/Makefile.am
+ ( # output to Makefile.am
+ echo -e $HEADER
+
+ echo "KDE_ICON = AUTO"
+ echo "EXTRA_DIST=\\"
+ for I2 in `ls -d $I1/*.png`; do
+ echo -n `basename $I2`" "
+ done
+ echo
+ ) > $I1/Makefile.am
+
+done
diff --git a/bibletime/pics/highcolor/16x16/Makefile.am b/bibletime/pics/highcolor/16x16/Makefile.am
new file mode 100644
index 0000000..46127d5
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/Makefile.am
@@ -0,0 +1,7 @@
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+KDE_ICON = AUTO
+EXTRA_DIST=\
+hi16-action-bt_bible.png hi16-action-bt_bible_add.png hi16-action-bt_bible_locked.png hi16-action-bt_book.png hi16-action-bt_book_add.png hi16-action-bt_book_locked.png hi16-action-bt_cascade.png hi16-action-bt_cascade_auto.png hi16-action-bt_commentary.png hi16-action-bt_commentary_add.png hi16-action-bt_commentary_locked.png hi16-action-bt_displayconfig.png hi16-action-bt_lexicon.png hi16-action-bt_lexicon_add.png hi16-action-bt_lexicon_locked.png hi16-action-bt_startconfig.png hi16-action-bt_swordconfig.png hi16-action-bt_tile.png hi16-action-bt_tile_auto.png hi16-app-bibletime.png
diff --git a/bibletime/pics/highcolor/16x16/Makefile.in b/bibletime/pics/highcolor/16x16/Makefile.in
new file mode 100644
index 0000000..5d7b1a5
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/Makefile.in
@@ -0,0 +1,416 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../../../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+KDE_ICON = AUTO
+EXTRA_DIST = hi16-action-bt_bible.png hi16-action-bt_bible_add.png hi16-action-bt_bible_locked.png hi16-action-bt_book.png hi16-action-bt_book_add.png hi16-action-bt_book_locked.png hi16-action-bt_cascade.png hi16-action-bt_cascade_auto.png hi16-action-bt_commentary.png hi16-action-bt_commentary_add.png hi16-action-bt_commentary_locked.png hi16-action-bt_displayconfig.png hi16-action-bt_lexicon.png hi16-action-bt_lexicon_add.png hi16-action-bt_lexicon_locked.png hi16-action-bt_startconfig.png hi16-action-bt_swordconfig.png hi16-action-bt_tile.png hi16-action-bt_tile_auto.png hi16-app-bibletime.png
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../../../config.h
+CONFIG_CLEAN_FILES =
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/highcolor/16x16/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/highcolor/16x16/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/highcolor/16x16/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/pics/highcolor/16x16
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/pics/highcolor/16x16/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+#>- install-data-am:
+#>+ 1
+install-data-am: install-kde-icons
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+#>- uninstall-am:
+#>+ 1
+uninstall-am: uninstall-kde-icons
+uninstall: uninstall-am
+all-am: Makefile
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-generic mostlyclean-am
+
+#>- clean: clean-am
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+distclean-am: distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 2
+docs-am:
+
+#>+ 46
+install-kde-icons:
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_bible.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_bible.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_bible_add.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_bible_add.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_bible_locked.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_bible_locked.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_book.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_book.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_book_add.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_book_add.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_book_locked.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_book_locked.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_cascade.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_cascade.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_cascade_auto.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_cascade_auto.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_commentary.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_commentary.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_commentary_add.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_commentary_add.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_commentary_locked.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_commentary_locked.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_displayconfig.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_displayconfig.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_lexicon.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_lexicon.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_lexicon_add.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_lexicon_add.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_lexicon_locked.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_lexicon_locked.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_startconfig.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_startconfig.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_swordconfig.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_swordconfig.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_tile.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_tile.png
+ $(INSTALL_DATA) $(srcdir)/hi16-action-bt_tile_auto.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_tile_auto.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps
+ $(INSTALL_DATA) $(srcdir)/hi16-app-bibletime.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/bibletime.png
+
+uninstall-kde-icons:
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_bible.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_bible_add.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_bible_locked.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_book.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_book_add.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_book_locked.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_cascade.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_cascade_auto.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_commentary.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_commentary_add.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_commentary_locked.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_displayconfig.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_lexicon.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_lexicon_add.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_lexicon_locked.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_startconfig.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_swordconfig.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_tile.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/bt_tile_auto.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/bibletime.png
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/highcolor/16x16/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/highcolor/16x16/Makefile.in
+
+
+#>+ 2
+final:
+ $(MAKE) all-am
+#>+ 2
+no-final:
+ $(MAKE) all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_bible.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_bible.png
new file mode 100644
index 0000000..d9dbe6f
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_bible.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_bible_add.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_bible_add.png
new file mode 100644
index 0000000..6fbd5cc
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_bible_add.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_bible_locked.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_bible_locked.png
new file mode 100644
index 0000000..6721084
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_bible_locked.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_book.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_book.png
new file mode 100644
index 0000000..fa419cc
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_book.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_book_add.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_book_add.png
new file mode 100644
index 0000000..0ea0d91
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_book_add.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_book_locked.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_book_locked.png
new file mode 100644
index 0000000..076f998
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_book_locked.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_cascade.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_cascade.png
new file mode 100644
index 0000000..98e81c9
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_cascade.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_cascade_auto.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_cascade_auto.png
new file mode 100644
index 0000000..fcb3ebc
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_cascade_auto.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_commentary.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_commentary.png
new file mode 100644
index 0000000..1b1846b
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_commentary.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_commentary_add.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_commentary_add.png
new file mode 100644
index 0000000..3c8d9b3
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_commentary_add.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_commentary_locked.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_commentary_locked.png
new file mode 100644
index 0000000..6c93b61
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_commentary_locked.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_displayconfig.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_displayconfig.png
new file mode 100644
index 0000000..ac25642
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_displayconfig.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_lexicon.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_lexicon.png
new file mode 100644
index 0000000..45a402f
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_lexicon.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_lexicon_add.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_lexicon_add.png
new file mode 100644
index 0000000..949c28f
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_lexicon_add.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_lexicon_locked.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_lexicon_locked.png
new file mode 100644
index 0000000..34928bb
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_lexicon_locked.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_startconfig.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_startconfig.png
new file mode 100644
index 0000000..3f66b6e
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_startconfig.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_swordconfig.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_swordconfig.png
new file mode 100644
index 0000000..4783af8
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_swordconfig.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_tile.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_tile.png
new file mode 100644
index 0000000..b466f5b
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_tile.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-action-bt_tile_auto.png b/bibletime/pics/highcolor/16x16/hi16-action-bt_tile_auto.png
new file mode 100644
index 0000000..80eafdd
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-action-bt_tile_auto.png
Binary files differ
diff --git a/bibletime/pics/highcolor/16x16/hi16-app-bibletime.png b/bibletime/pics/highcolor/16x16/hi16-app-bibletime.png
new file mode 100644
index 0000000..99ca1a1
--- /dev/null
+++ b/bibletime/pics/highcolor/16x16/hi16-app-bibletime.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/Makefile.am b/bibletime/pics/highcolor/22x22/Makefile.am
new file mode 100644
index 0000000..3874b15
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/Makefile.am
@@ -0,0 +1,7 @@
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+KDE_ICON = AUTO
+EXTRA_DIST=\
+hi22-action-bt_bible.png hi22-action-bt_bible_add.png hi22-action-bt_book.png hi22-action-bt_book_add.png hi22-action-bt_book_locked.png hi22-action-bt_cascade.png hi22-action-bt_cascade_auto.png hi22-action-bt_commentary.png hi22-action-bt_commentary_add.png hi22-action-bt_commentary_locked.png hi22-action-bt_displayconfig.png hi22-action-bt_lexicon.png hi22-action-bt_lexicon_add.png hi22-action-bt_lexicon_locked.png hi22-action-bt_parallel.png hi22-action-bt_startconfig.png hi22-action-bt_swordconfig.png hi22-action-bt_sync.png hi22-action-bt_tile.png hi22-action-bt_tile_auto.png hi22-app-bibletime.png
diff --git a/bibletime/pics/highcolor/22x22/Makefile.in b/bibletime/pics/highcolor/22x22/Makefile.in
new file mode 100644
index 0000000..128e280
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/Makefile.in
@@ -0,0 +1,423 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../../../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+KDE_ICON = AUTO
+EXTRA_DIST = hi22-action-bt_bible.png hi22-action-bt_bible_add.png hi22-action-bt_book.png hi22-action-bt_book_add.png hi22-action-bt_book_locked.png hi22-action-bt_cascade.png hi22-action-bt_cascade_auto.png hi22-action-bt_commentary.png hi22-action-bt_commentary_add.png hi22-action-bt_commentary_locked.png hi22-action-bt_displayconfig.png hi22-action-bt_lexicon.png hi22-action-bt_lexicon_add.png hi22-action-bt_lexicon_locked.png hi22-action-bt_parallel.png hi22-action-bt_startconfig.png hi22-action-bt_swordconfig.png hi22-action-bt_sync.png hi22-action-bt_tile.png hi22-action-bt_tile_auto.png hi22-app-bibletime.png
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../../../config.h
+CONFIG_CLEAN_FILES =
+DIST_COMMON = Makefile.am Makefile.in
+
+
+#>- DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+#>+ 4
+KDE_DIST=hi22-action-bt_bible_locked.html
+
+DISTFILES= $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
+
+
+TAR = tar
+GZIP_ENV = --best
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/highcolor/22x22/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/highcolor/22x22/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/highcolor/22x22/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/pics/highcolor/22x22
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/pics/highcolor/22x22/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+#>- install-data-am:
+#>+ 1
+install-data-am: install-kde-icons
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+#>- uninstall-am:
+#>+ 1
+uninstall-am: uninstall-kde-icons
+uninstall: uninstall-am
+all-am: Makefile
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-generic mostlyclean-am
+
+#>- clean: clean-am
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+distclean-am: distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 2
+docs-am:
+
+#>+ 48
+install-kde-icons:
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_bible.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_bible.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_bible_add.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_bible_add.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_book.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_book.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_book_add.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_book_add.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_book_locked.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_book_locked.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_cascade.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_cascade.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_cascade_auto.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_cascade_auto.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_commentary.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_commentary.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_commentary_add.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_commentary_add.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_commentary_locked.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_commentary_locked.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_displayconfig.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_displayconfig.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_lexicon.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_lexicon.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_lexicon_add.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_lexicon_add.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_lexicon_locked.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_lexicon_locked.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_parallel.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_parallel.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_startconfig.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_startconfig.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_swordconfig.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_swordconfig.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_sync.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_sync.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_tile.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_tile.png
+ $(INSTALL_DATA) $(srcdir)/hi22-action-bt_tile_auto.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_tile_auto.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/22x22/apps
+ $(INSTALL_DATA) $(srcdir)/hi22-app-bibletime.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/apps/bibletime.png
+
+uninstall-kde-icons:
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_bible.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_bible_add.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_book.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_book_add.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_book_locked.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_cascade.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_cascade_auto.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_commentary.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_commentary_add.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_commentary_locked.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_displayconfig.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_lexicon.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_lexicon_add.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_lexicon_locked.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_parallel.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_startconfig.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_swordconfig.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_sync.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_tile.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/bt_tile_auto.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/apps/bibletime.png
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/highcolor/22x22/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/highcolor/22x22/Makefile.in
+
+
+#>+ 2
+final:
+ $(MAKE) all-am
+#>+ 2
+no-final:
+ $(MAKE) all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_bible.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_bible.png
new file mode 100644
index 0000000..f3b8e18
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_bible.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_bible_add.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_bible_add.png
new file mode 100644
index 0000000..b865b2b
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_bible_add.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_bible_locked.html b/bibletime/pics/highcolor/22x22/hi22-action-bt_bible_locked.html
new file mode 100644
index 0000000..de76d8b
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_bible_locked.html
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_book.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_book.png
new file mode 100644
index 0000000..59051ce
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_book.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_book_add.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_book_add.png
new file mode 100644
index 0000000..75aec6d
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_book_add.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_book_locked.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_book_locked.png
new file mode 100644
index 0000000..80ccc5f
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_book_locked.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_cascade.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_cascade.png
new file mode 100644
index 0000000..b837d36
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_cascade.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_cascade_auto.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_cascade_auto.png
new file mode 100644
index 0000000..db66d54
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_cascade_auto.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_commentary.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_commentary.png
new file mode 100644
index 0000000..810ccc9
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_commentary.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_commentary_add.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_commentary_add.png
new file mode 100644
index 0000000..c3f05e2
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_commentary_add.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_commentary_locked.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_commentary_locked.png
new file mode 100644
index 0000000..8e2603a
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_commentary_locked.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_displayconfig.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_displayconfig.png
new file mode 100644
index 0000000..56982b2
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_displayconfig.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_lexicon.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_lexicon.png
new file mode 100644
index 0000000..cd7935f
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_lexicon.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_lexicon_add.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_lexicon_add.png
new file mode 100644
index 0000000..06fb28d
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_lexicon_add.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_lexicon_locked.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_lexicon_locked.png
new file mode 100644
index 0000000..6ce5fa8
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_lexicon_locked.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_parallel.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_parallel.png
new file mode 100644
index 0000000..b1d3ea1
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_parallel.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_startconfig.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_startconfig.png
new file mode 100644
index 0000000..494cbb8
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_startconfig.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_swordconfig.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_swordconfig.png
new file mode 100644
index 0000000..ebec174
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_swordconfig.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_sync.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_sync.png
new file mode 100644
index 0000000..3c0a52d
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_sync.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_tile.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_tile.png
new file mode 100644
index 0000000..344d4a9
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_tile.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-action-bt_tile_auto.png b/bibletime/pics/highcolor/22x22/hi22-action-bt_tile_auto.png
new file mode 100644
index 0000000..807b018
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-action-bt_tile_auto.png
Binary files differ
diff --git a/bibletime/pics/highcolor/22x22/hi22-app-bibletime.png b/bibletime/pics/highcolor/22x22/hi22-app-bibletime.png
new file mode 100644
index 0000000..7c32279
--- /dev/null
+++ b/bibletime/pics/highcolor/22x22/hi22-app-bibletime.png
Binary files differ
diff --git a/bibletime/pics/highcolor/32x32/Makefile.am b/bibletime/pics/highcolor/32x32/Makefile.am
new file mode 100644
index 0000000..243eddc
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/Makefile.am
@@ -0,0 +1,7 @@
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+KDE_ICON = AUTO
+EXTRA_DIST=\
+hi32-action-bt_bible.png hi32-action-bt_bible_add.png hi32-action-bt_book.png hi32-action-bt_book_add.png hi32-action-bt_cascade.png hi32-action-bt_cascade_auto.png hi32-action-bt_commentary.png hi32-action-bt_commentary_add.png hi32-action-bt_displayconfig.png hi32-action-bt_lexicon.png hi32-action-bt_lexicon_add.png hi32-action-bt_startconfig.png hi32-action-bt_swordconfig.png hi32-action-bt_tile.png hi32-action-bt_tile_auto.png hi32-app-bibletime.png
diff --git a/bibletime/pics/highcolor/32x32/Makefile.in b/bibletime/pics/highcolor/32x32/Makefile.in
new file mode 100644
index 0000000..c3c9611
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/Makefile.in
@@ -0,0 +1,408 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../../../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+KDE_ICON = AUTO
+EXTRA_DIST = hi32-action-bt_bible.png hi32-action-bt_bible_add.png hi32-action-bt_book.png hi32-action-bt_book_add.png hi32-action-bt_cascade.png hi32-action-bt_cascade_auto.png hi32-action-bt_commentary.png hi32-action-bt_commentary_add.png hi32-action-bt_displayconfig.png hi32-action-bt_lexicon.png hi32-action-bt_lexicon_add.png hi32-action-bt_startconfig.png hi32-action-bt_swordconfig.png hi32-action-bt_tile.png hi32-action-bt_tile_auto.png hi32-app-bibletime.png
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../../../config.h
+CONFIG_CLEAN_FILES =
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/highcolor/32x32/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/highcolor/32x32/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/highcolor/32x32/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/pics/highcolor/32x32
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/pics/highcolor/32x32/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+#>- install-data-am:
+#>+ 1
+install-data-am: install-kde-icons
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+#>- uninstall-am:
+#>+ 1
+uninstall-am: uninstall-kde-icons
+uninstall: uninstall-am
+all-am: Makefile
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-generic mostlyclean-am
+
+#>- clean: clean-am
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+distclean-am: distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 2
+docs-am:
+
+#>+ 38
+install-kde-icons:
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions
+ $(INSTALL_DATA) $(srcdir)/hi32-action-bt_bible.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_bible.png
+ $(INSTALL_DATA) $(srcdir)/hi32-action-bt_bible_add.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_bible_add.png
+ $(INSTALL_DATA) $(srcdir)/hi32-action-bt_book.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_book.png
+ $(INSTALL_DATA) $(srcdir)/hi32-action-bt_book_add.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_book_add.png
+ $(INSTALL_DATA) $(srcdir)/hi32-action-bt_cascade.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_cascade.png
+ $(INSTALL_DATA) $(srcdir)/hi32-action-bt_cascade_auto.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_cascade_auto.png
+ $(INSTALL_DATA) $(srcdir)/hi32-action-bt_commentary.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_commentary.png
+ $(INSTALL_DATA) $(srcdir)/hi32-action-bt_commentary_add.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_commentary_add.png
+ $(INSTALL_DATA) $(srcdir)/hi32-action-bt_displayconfig.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_displayconfig.png
+ $(INSTALL_DATA) $(srcdir)/hi32-action-bt_lexicon.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_lexicon.png
+ $(INSTALL_DATA) $(srcdir)/hi32-action-bt_lexicon_add.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_lexicon_add.png
+ $(INSTALL_DATA) $(srcdir)/hi32-action-bt_startconfig.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_startconfig.png
+ $(INSTALL_DATA) $(srcdir)/hi32-action-bt_swordconfig.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_swordconfig.png
+ $(INSTALL_DATA) $(srcdir)/hi32-action-bt_tile.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_tile.png
+ $(INSTALL_DATA) $(srcdir)/hi32-action-bt_tile_auto.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_tile_auto.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/32x32/apps
+ $(INSTALL_DATA) $(srcdir)/hi32-app-bibletime.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/apps/bibletime.png
+
+uninstall-kde-icons:
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_bible.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_bible_add.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_book.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_book_add.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_cascade.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_cascade_auto.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_commentary.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_commentary_add.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_displayconfig.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_lexicon.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_lexicon_add.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_startconfig.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_swordconfig.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_tile.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/bt_tile_auto.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/apps/bibletime.png
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/highcolor/32x32/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/highcolor/32x32/Makefile.in
+
+
+#>+ 2
+final:
+ $(MAKE) all-am
+#>+ 2
+no-final:
+ $(MAKE) all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/pics/highcolor/32x32/hi32-action-bt_bible.png b/bibletime/pics/highcolor/32x32/hi32-action-bt_bible.png
new file mode 100644
index 0000000..7422069
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/hi32-action-bt_bible.png
Binary files differ
diff --git a/bibletime/pics/highcolor/32x32/hi32-action-bt_bible_add.png b/bibletime/pics/highcolor/32x32/hi32-action-bt_bible_add.png
new file mode 100644
index 0000000..27f13ef
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/hi32-action-bt_bible_add.png
Binary files differ
diff --git a/bibletime/pics/highcolor/32x32/hi32-action-bt_book.png b/bibletime/pics/highcolor/32x32/hi32-action-bt_book.png
new file mode 100644
index 0000000..29af6eb
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/hi32-action-bt_book.png
Binary files differ
diff --git a/bibletime/pics/highcolor/32x32/hi32-action-bt_book_add.png b/bibletime/pics/highcolor/32x32/hi32-action-bt_book_add.png
new file mode 100644
index 0000000..29348a8
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/hi32-action-bt_book_add.png
Binary files differ
diff --git a/bibletime/pics/highcolor/32x32/hi32-action-bt_cascade.png b/bibletime/pics/highcolor/32x32/hi32-action-bt_cascade.png
new file mode 100644
index 0000000..263ad5f
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/hi32-action-bt_cascade.png
Binary files differ
diff --git a/bibletime/pics/highcolor/32x32/hi32-action-bt_cascade_auto.png b/bibletime/pics/highcolor/32x32/hi32-action-bt_cascade_auto.png
new file mode 100644
index 0000000..d0a8461
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/hi32-action-bt_cascade_auto.png
Binary files differ
diff --git a/bibletime/pics/highcolor/32x32/hi32-action-bt_commentary.png b/bibletime/pics/highcolor/32x32/hi32-action-bt_commentary.png
new file mode 100644
index 0000000..748f65b
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/hi32-action-bt_commentary.png
Binary files differ
diff --git a/bibletime/pics/highcolor/32x32/hi32-action-bt_commentary_add.png b/bibletime/pics/highcolor/32x32/hi32-action-bt_commentary_add.png
new file mode 100644
index 0000000..1f4b728
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/hi32-action-bt_commentary_add.png
Binary files differ
diff --git a/bibletime/pics/highcolor/32x32/hi32-action-bt_displayconfig.png b/bibletime/pics/highcolor/32x32/hi32-action-bt_displayconfig.png
new file mode 100644
index 0000000..9a130b1
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/hi32-action-bt_displayconfig.png
Binary files differ
diff --git a/bibletime/pics/highcolor/32x32/hi32-action-bt_lexicon.png b/bibletime/pics/highcolor/32x32/hi32-action-bt_lexicon.png
new file mode 100644
index 0000000..2133cc3
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/hi32-action-bt_lexicon.png
Binary files differ
diff --git a/bibletime/pics/highcolor/32x32/hi32-action-bt_lexicon_add.png b/bibletime/pics/highcolor/32x32/hi32-action-bt_lexicon_add.png
new file mode 100644
index 0000000..08a1456
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/hi32-action-bt_lexicon_add.png
Binary files differ
diff --git a/bibletime/pics/highcolor/32x32/hi32-action-bt_startconfig.png b/bibletime/pics/highcolor/32x32/hi32-action-bt_startconfig.png
new file mode 100644
index 0000000..28f0aa6
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/hi32-action-bt_startconfig.png
Binary files differ
diff --git a/bibletime/pics/highcolor/32x32/hi32-action-bt_swordconfig.png b/bibletime/pics/highcolor/32x32/hi32-action-bt_swordconfig.png
new file mode 100644
index 0000000..23fb4c5
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/hi32-action-bt_swordconfig.png
Binary files differ
diff --git a/bibletime/pics/highcolor/32x32/hi32-action-bt_tile.png b/bibletime/pics/highcolor/32x32/hi32-action-bt_tile.png
new file mode 100644
index 0000000..5dfd05f
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/hi32-action-bt_tile.png
Binary files differ
diff --git a/bibletime/pics/highcolor/32x32/hi32-action-bt_tile_auto.png b/bibletime/pics/highcolor/32x32/hi32-action-bt_tile_auto.png
new file mode 100644
index 0000000..842d9ee
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/hi32-action-bt_tile_auto.png
Binary files differ
diff --git a/bibletime/pics/highcolor/32x32/hi32-app-bibletime.png b/bibletime/pics/highcolor/32x32/hi32-app-bibletime.png
new file mode 100644
index 0000000..91d58f5
--- /dev/null
+++ b/bibletime/pics/highcolor/32x32/hi32-app-bibletime.png
Binary files differ
diff --git a/bibletime/pics/highcolor/48x48/Makefile.am b/bibletime/pics/highcolor/48x48/Makefile.am
new file mode 100644
index 0000000..b301e25
--- /dev/null
+++ b/bibletime/pics/highcolor/48x48/Makefile.am
@@ -0,0 +1,7 @@
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+KDE_ICON = AUTO
+EXTRA_DIST=\
+hi48-action-bt_bible.png hi48-action-bt_bible_add.png hi48-action-bt_book.png hi48-action-bt_book_add.png hi48-action-bt_commentary.png hi48-action-bt_commentary_add.png hi48-action-bt_displayconfig.png hi48-action-bt_lexicon.png hi48-action-bt_lexicon_add.png hi48-action-bt_startconfig.png hi48-action-bt_swordconfig.png hi48-app-bibletime.png
diff --git a/bibletime/pics/highcolor/48x48/Makefile.in b/bibletime/pics/highcolor/48x48/Makefile.in
new file mode 100644
index 0000000..62248ea
--- /dev/null
+++ b/bibletime/pics/highcolor/48x48/Makefile.in
@@ -0,0 +1,400 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../../../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+KDE_ICON = AUTO
+EXTRA_DIST = hi48-action-bt_bible.png hi48-action-bt_bible_add.png hi48-action-bt_book.png hi48-action-bt_book_add.png hi48-action-bt_commentary.png hi48-action-bt_commentary_add.png hi48-action-bt_displayconfig.png hi48-action-bt_lexicon.png hi48-action-bt_lexicon_add.png hi48-action-bt_startconfig.png hi48-action-bt_swordconfig.png hi48-app-bibletime.png
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../../../config.h
+CONFIG_CLEAN_FILES =
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/highcolor/48x48/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/highcolor/48x48/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/highcolor/48x48/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/pics/highcolor/48x48
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/pics/highcolor/48x48/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+#>- install-data-am:
+#>+ 1
+install-data-am: install-kde-icons
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+#>- uninstall-am:
+#>+ 1
+uninstall-am: uninstall-kde-icons
+uninstall: uninstall-am
+all-am: Makefile
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-generic mostlyclean-am
+
+#>- clean: clean-am
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+distclean-am: distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 2
+docs-am:
+
+#>+ 30
+install-kde-icons:
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions
+ $(INSTALL_DATA) $(srcdir)/hi48-action-bt_bible.png $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_bible.png
+ $(INSTALL_DATA) $(srcdir)/hi48-action-bt_bible_add.png $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_bible_add.png
+ $(INSTALL_DATA) $(srcdir)/hi48-action-bt_book.png $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_book.png
+ $(INSTALL_DATA) $(srcdir)/hi48-action-bt_book_add.png $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_book_add.png
+ $(INSTALL_DATA) $(srcdir)/hi48-action-bt_commentary.png $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_commentary.png
+ $(INSTALL_DATA) $(srcdir)/hi48-action-bt_commentary_add.png $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_commentary_add.png
+ $(INSTALL_DATA) $(srcdir)/hi48-action-bt_displayconfig.png $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_displayconfig.png
+ $(INSTALL_DATA) $(srcdir)/hi48-action-bt_lexicon.png $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_lexicon.png
+ $(INSTALL_DATA) $(srcdir)/hi48-action-bt_lexicon_add.png $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_lexicon_add.png
+ $(INSTALL_DATA) $(srcdir)/hi48-action-bt_startconfig.png $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_startconfig.png
+ $(INSTALL_DATA) $(srcdir)/hi48-action-bt_swordconfig.png $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_swordconfig.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/48x48/apps
+ $(INSTALL_DATA) $(srcdir)/hi48-app-bibletime.png $(DESTDIR)$(kde_icondir)/hicolor/48x48/apps/bibletime.png
+
+uninstall-kde-icons:
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_bible.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_bible_add.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_book.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_book_add.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_commentary.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_commentary_add.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_displayconfig.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_lexicon.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_lexicon_add.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_startconfig.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/48x48/actions/bt_swordconfig.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/48x48/apps/bibletime.png
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/highcolor/48x48/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/highcolor/48x48/Makefile.in
+
+
+#>+ 2
+final:
+ $(MAKE) all-am
+#>+ 2
+no-final:
+ $(MAKE) all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/pics/highcolor/48x48/hi48-action-bt_bible.png b/bibletime/pics/highcolor/48x48/hi48-action-bt_bible.png
new file mode 100644
index 0000000..406d2ed
--- /dev/null
+++ b/bibletime/pics/highcolor/48x48/hi48-action-bt_bible.png
Binary files differ
diff --git a/bibletime/pics/highcolor/48x48/hi48-action-bt_bible_add.png b/bibletime/pics/highcolor/48x48/hi48-action-bt_bible_add.png
new file mode 100644
index 0000000..61c1a88
--- /dev/null
+++ b/bibletime/pics/highcolor/48x48/hi48-action-bt_bible_add.png
Binary files differ
diff --git a/bibletime/pics/highcolor/48x48/hi48-action-bt_book.png b/bibletime/pics/highcolor/48x48/hi48-action-bt_book.png
new file mode 100644
index 0000000..061d43e
--- /dev/null
+++ b/bibletime/pics/highcolor/48x48/hi48-action-bt_book.png
Binary files differ
diff --git a/bibletime/pics/highcolor/48x48/hi48-action-bt_book_add.png b/bibletime/pics/highcolor/48x48/hi48-action-bt_book_add.png
new file mode 100644
index 0000000..ec0d339
--- /dev/null
+++ b/bibletime/pics/highcolor/48x48/hi48-action-bt_book_add.png
Binary files differ
diff --git a/bibletime/pics/highcolor/48x48/hi48-action-bt_commentary.png b/bibletime/pics/highcolor/48x48/hi48-action-bt_commentary.png
new file mode 100644
index 0000000..f9ba3bb
--- /dev/null
+++ b/bibletime/pics/highcolor/48x48/hi48-action-bt_commentary.png
Binary files differ
diff --git a/bibletime/pics/highcolor/48x48/hi48-action-bt_commentary_add.png b/bibletime/pics/highcolor/48x48/hi48-action-bt_commentary_add.png
new file mode 100644
index 0000000..ca4b80d
--- /dev/null
+++ b/bibletime/pics/highcolor/48x48/hi48-action-bt_commentary_add.png
Binary files differ
diff --git a/bibletime/pics/highcolor/48x48/hi48-action-bt_displayconfig.png b/bibletime/pics/highcolor/48x48/hi48-action-bt_displayconfig.png
new file mode 100644
index 0000000..0851db7
--- /dev/null
+++ b/bibletime/pics/highcolor/48x48/hi48-action-bt_displayconfig.png
Binary files differ
diff --git a/bibletime/pics/highcolor/48x48/hi48-action-bt_lexicon.png b/bibletime/pics/highcolor/48x48/hi48-action-bt_lexicon.png
new file mode 100644
index 0000000..69de751
--- /dev/null
+++ b/bibletime/pics/highcolor/48x48/hi48-action-bt_lexicon.png
Binary files differ
diff --git a/bibletime/pics/highcolor/48x48/hi48-action-bt_lexicon_add.png b/bibletime/pics/highcolor/48x48/hi48-action-bt_lexicon_add.png
new file mode 100644
index 0000000..4d5e504
--- /dev/null
+++ b/bibletime/pics/highcolor/48x48/hi48-action-bt_lexicon_add.png
Binary files differ
diff --git a/bibletime/pics/highcolor/48x48/hi48-action-bt_startconfig.png b/bibletime/pics/highcolor/48x48/hi48-action-bt_startconfig.png
new file mode 100644
index 0000000..1dcc07c
--- /dev/null
+++ b/bibletime/pics/highcolor/48x48/hi48-action-bt_startconfig.png
Binary files differ
diff --git a/bibletime/pics/highcolor/48x48/hi48-action-bt_swordconfig.png b/bibletime/pics/highcolor/48x48/hi48-action-bt_swordconfig.png
new file mode 100644
index 0000000..d79084d
--- /dev/null
+++ b/bibletime/pics/highcolor/48x48/hi48-action-bt_swordconfig.png
Binary files differ
diff --git a/bibletime/pics/highcolor/48x48/hi48-app-bibletime.png b/bibletime/pics/highcolor/48x48/hi48-app-bibletime.png
new file mode 100644
index 0000000..ff90bb5
--- /dev/null
+++ b/bibletime/pics/highcolor/48x48/hi48-app-bibletime.png
Binary files differ
diff --git a/bibletime/pics/highcolor/Makefile.am b/bibletime/pics/highcolor/Makefile.am
new file mode 100644
index 0000000..c36147d
--- /dev/null
+++ b/bibletime/pics/highcolor/Makefile.am
@@ -0,0 +1,5 @@
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+SUBDIRS = 16x16 22x22 32x32 48x48
diff --git a/bibletime/pics/highcolor/Makefile.in b/bibletime/pics/highcolor/Makefile.in
new file mode 100644
index 0000000..343843c
--- /dev/null
+++ b/bibletime/pics/highcolor/Makefile.in
@@ -0,0 +1,467 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+SUBDIRS = 16x16 22x22 32x32 48x48
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../../config.h
+CONFIG_CLEAN_FILES =
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/highcolor/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/highcolor/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/highcolor/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+@SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+ rev="$$subdir $$rev"; \
+ test "$$subdir" = "." && dot_seen=yes; \
+ done; \
+ test "$$dot_seen" = "no" && rev=". $$rev"; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/pics/highcolor
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/pics/highcolor/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+ for subdir in $(SUBDIRS); do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ chmod 777 $(distdir)/$$subdir; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
+ || exit 1; \
+ fi; \
+ done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am:
+uninstall: uninstall-recursive
+all-am: Makefile
+all-redirect: all-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am: clean-tags clean-generic mostlyclean-am
+
+#>- clean: clean-recursive
+#>+ 1
+clean: kde-rpo-clean clean-recursive
+
+distclean-am: distclean-tags distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-recursive
+
+maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \
+ distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+
+.PHONY: install-data-recursive uninstall-data-recursive \
+install-exec-recursive uninstall-exec-recursive installdirs-recursive \
+uninstalldirs-recursive all-recursive check-recursive \
+installcheck-recursive info-recursive dvi-recursive \
+mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs-am \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 2
+docs-am:
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/highcolor/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/highcolor/Makefile.in
+
+
+#>+ 2
+final:
+ $(MAKE) all-am
+#>+ 2
+no-final:
+ $(MAKE) all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/pics/lowcolor/16x16/Makefile.am b/bibletime/pics/lowcolor/16x16/Makefile.am
new file mode 100644
index 0000000..0e7bf8f
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/Makefile.am
@@ -0,0 +1,7 @@
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+KDE_ICON = AUTO
+EXTRA_DIST=\
+lo16-action-bt_bible.png lo16-action-bt_bible_locked.png lo16-action-bt_bookmark.png lo16-action-bt_bookmark_change.png lo16-action-bt_bookmark_export.png lo16-action-bt_bookmark_import.png lo16-action-bt_bookmark_new.png lo16-action-bt_cascade.png lo16-action-bt_cascade_auto.png lo16-action-bt_commentary.png lo16-action-bt_commentary_locked.png lo16-action-bt_folder.png lo16-action-bt_folder_change.png lo16-action-bt_folder_new.png lo16-action-bt_folder_open.png lo16-action-bt_lexicon.png lo16-action-bt_lexicon_locked.png lo16-action-bt_search.png lo16-action-bt_tile.png lo16-action-bt_tile_auto.png lo16-action-bt_verseref.png lo16-app-bibletime.png
diff --git a/bibletime/pics/lowcolor/16x16/Makefile.in b/bibletime/pics/lowcolor/16x16/Makefile.in
new file mode 100644
index 0000000..86d21ff
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/Makefile.in
@@ -0,0 +1,420 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../../../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+KDE_ICON = AUTO
+EXTRA_DIST = lo16-action-bt_bible.png lo16-action-bt_bible_locked.png lo16-action-bt_bookmark.png lo16-action-bt_bookmark_change.png lo16-action-bt_bookmark_export.png lo16-action-bt_bookmark_import.png lo16-action-bt_bookmark_new.png lo16-action-bt_cascade.png lo16-action-bt_cascade_auto.png lo16-action-bt_commentary.png lo16-action-bt_commentary_locked.png lo16-action-bt_folder.png lo16-action-bt_folder_change.png lo16-action-bt_folder_new.png lo16-action-bt_folder_open.png lo16-action-bt_lexicon.png lo16-action-bt_lexicon_locked.png lo16-action-bt_search.png lo16-action-bt_tile.png lo16-action-bt_tile_auto.png lo16-action-bt_verseref.png lo16-app-bibletime.png
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../../../config.h
+CONFIG_CLEAN_FILES =
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/lowcolor/16x16/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/lowcolor/16x16/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/lowcolor/16x16/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/pics/lowcolor/16x16
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/pics/lowcolor/16x16/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+#>- install-data-am:
+#>+ 1
+install-data-am: install-kde-icons
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+#>- uninstall-am:
+#>+ 1
+uninstall-am: uninstall-kde-icons
+uninstall: uninstall-am
+all-am: Makefile
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-generic mostlyclean-am
+
+#>- clean: clean-am
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+distclean-am: distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 2
+docs-am:
+
+#>+ 50
+install-kde-icons:
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/locolor/16x16/actions
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_bible.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_bible.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_bible_locked.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_bible_locked.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_bookmark.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_bookmark.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_bookmark_change.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_bookmark_change.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_bookmark_export.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_bookmark_export.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_bookmark_import.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_bookmark_import.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_bookmark_new.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_bookmark_new.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_cascade.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_cascade.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_cascade_auto.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_cascade_auto.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_commentary.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_commentary.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_commentary_locked.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_commentary_locked.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_folder.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_folder.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_folder_change.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_folder_change.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_folder_new.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_folder_new.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_folder_open.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_folder_open.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_lexicon.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_lexicon.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_lexicon_locked.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_lexicon_locked.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_search.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_search.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_tile.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_tile.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_tile_auto.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_tile_auto.png
+ $(INSTALL_DATA) $(srcdir)/lo16-action-bt_verseref.png $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_verseref.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/locolor/16x16/apps
+ $(INSTALL_DATA) $(srcdir)/lo16-app-bibletime.png $(DESTDIR)$(kde_icondir)/locolor/16x16/apps/bibletime.png
+
+uninstall-kde-icons:
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_bible.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_bible_locked.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_bookmark.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_bookmark_change.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_bookmark_export.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_bookmark_import.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_bookmark_new.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_cascade.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_cascade_auto.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_commentary.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_commentary_locked.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_folder.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_folder_change.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_folder_new.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_folder_open.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_lexicon.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_lexicon_locked.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_search.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_tile.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_tile_auto.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/actions/bt_verseref.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/16x16/apps/bibletime.png
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/lowcolor/16x16/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/lowcolor/16x16/Makefile.in
+
+
+#>+ 2
+final:
+ $(MAKE) all-am
+#>+ 2
+no-final:
+ $(MAKE) all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_bible.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_bible.png
new file mode 100644
index 0000000..14b16bf
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_bible.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_bible_locked.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_bible_locked.png
new file mode 100644
index 0000000..785b5f6
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_bible_locked.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark.png
new file mode 100644
index 0000000..35488c7
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark_change.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark_change.png
new file mode 100644
index 0000000..7677f2c
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark_change.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark_export.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark_export.png
new file mode 100644
index 0000000..17edfd4
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark_export.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark_import.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark_import.png
new file mode 100644
index 0000000..7065829
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark_import.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark_new.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark_new.png
new file mode 100644
index 0000000..c286cfc
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_bookmark_new.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_cascade.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_cascade.png
new file mode 100644
index 0000000..98e81c9
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_cascade.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_cascade_auto.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_cascade_auto.png
new file mode 100644
index 0000000..fcb3ebc
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_cascade_auto.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_commentary.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_commentary.png
new file mode 100644
index 0000000..54348d4
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_commentary.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_commentary_locked.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_commentary_locked.png
new file mode 100644
index 0000000..0369182
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_commentary_locked.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_folder.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_folder.png
new file mode 100644
index 0000000..c7aea04
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_folder.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_folder_change.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_folder_change.png
new file mode 100644
index 0000000..c7aea04
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_folder_change.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_folder_new.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_folder_new.png
new file mode 100644
index 0000000..ba7b6c9
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_folder_new.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_folder_open.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_folder_open.png
new file mode 100644
index 0000000..d838b76
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_folder_open.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_lexicon.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_lexicon.png
new file mode 100644
index 0000000..1a5c363
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_lexicon.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_lexicon_locked.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_lexicon_locked.png
new file mode 100644
index 0000000..00626db
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_lexicon_locked.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_search.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_search.png
new file mode 100644
index 0000000..fb43c80
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_search.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_tile.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_tile.png
new file mode 100644
index 0000000..b466f5b
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_tile.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_tile_auto.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_tile_auto.png
new file mode 100644
index 0000000..80eafdd
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_tile_auto.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-action-bt_verseref.png b/bibletime/pics/lowcolor/16x16/lo16-action-bt_verseref.png
new file mode 100644
index 0000000..8e05bd8
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-action-bt_verseref.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/16x16/lo16-app-bibletime.png b/bibletime/pics/lowcolor/16x16/lo16-app-bibletime.png
new file mode 100644
index 0000000..08f046e
--- /dev/null
+++ b/bibletime/pics/lowcolor/16x16/lo16-app-bibletime.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/22x22/Makefile.am b/bibletime/pics/lowcolor/22x22/Makefile.am
new file mode 100644
index 0000000..a24a189
--- /dev/null
+++ b/bibletime/pics/lowcolor/22x22/Makefile.am
@@ -0,0 +1,7 @@
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+KDE_ICON = AUTO
+EXTRA_DIST=\
+lo22-action-bt_cascade.png lo22-action-bt_cascade_auto.png lo22-action-bt_tile.png lo22-action-bt_tile_auto.png
diff --git a/bibletime/pics/lowcolor/22x22/Makefile.in b/bibletime/pics/lowcolor/22x22/Makefile.in
new file mode 100644
index 0000000..adac6eb
--- /dev/null
+++ b/bibletime/pics/lowcolor/22x22/Makefile.in
@@ -0,0 +1,383 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../../../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+KDE_ICON = AUTO
+EXTRA_DIST = lo22-action-bt_cascade.png lo22-action-bt_cascade_auto.png lo22-action-bt_tile.png lo22-action-bt_tile_auto.png
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../../../config.h
+CONFIG_CLEAN_FILES =
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/lowcolor/22x22/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/lowcolor/22x22/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/lowcolor/22x22/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/pics/lowcolor/22x22
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/pics/lowcolor/22x22/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+#>- install-data-am:
+#>+ 1
+install-data-am: install-kde-icons
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+#>- uninstall-am:
+#>+ 1
+uninstall-am: uninstall-kde-icons
+uninstall: uninstall-am
+all-am: Makefile
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-generic mostlyclean-am
+
+#>- clean: clean-am
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+distclean-am: distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 2
+docs-am:
+
+#>+ 13
+install-kde-icons:
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/locolor/22x22/actions
+ $(INSTALL_DATA) $(srcdir)/lo22-action-bt_cascade.png $(DESTDIR)$(kde_icondir)/locolor/22x22/actions/bt_cascade.png
+ $(INSTALL_DATA) $(srcdir)/lo22-action-bt_cascade_auto.png $(DESTDIR)$(kde_icondir)/locolor/22x22/actions/bt_cascade_auto.png
+ $(INSTALL_DATA) $(srcdir)/lo22-action-bt_tile.png $(DESTDIR)$(kde_icondir)/locolor/22x22/actions/bt_tile.png
+ $(INSTALL_DATA) $(srcdir)/lo22-action-bt_tile_auto.png $(DESTDIR)$(kde_icondir)/locolor/22x22/actions/bt_tile_auto.png
+
+uninstall-kde-icons:
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/22x22/actions/bt_cascade.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/22x22/actions/bt_cascade_auto.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/22x22/actions/bt_tile.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/22x22/actions/bt_tile_auto.png
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/lowcolor/22x22/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/lowcolor/22x22/Makefile.in
+
+
+#>+ 2
+final:
+ $(MAKE) all-am
+#>+ 2
+no-final:
+ $(MAKE) all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/pics/lowcolor/22x22/lo22-action-bt_cascade.png b/bibletime/pics/lowcolor/22x22/lo22-action-bt_cascade.png
new file mode 100644
index 0000000..b837d36
--- /dev/null
+++ b/bibletime/pics/lowcolor/22x22/lo22-action-bt_cascade.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/22x22/lo22-action-bt_cascade_auto.png b/bibletime/pics/lowcolor/22x22/lo22-action-bt_cascade_auto.png
new file mode 100644
index 0000000..db66d54
--- /dev/null
+++ b/bibletime/pics/lowcolor/22x22/lo22-action-bt_cascade_auto.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/22x22/lo22-action-bt_tile.png b/bibletime/pics/lowcolor/22x22/lo22-action-bt_tile.png
new file mode 100644
index 0000000..344d4a9
--- /dev/null
+++ b/bibletime/pics/lowcolor/22x22/lo22-action-bt_tile.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/22x22/lo22-action-bt_tile_auto.png b/bibletime/pics/lowcolor/22x22/lo22-action-bt_tile_auto.png
new file mode 100644
index 0000000..807b018
--- /dev/null
+++ b/bibletime/pics/lowcolor/22x22/lo22-action-bt_tile_auto.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/32x32/Makefile.am b/bibletime/pics/lowcolor/32x32/Makefile.am
new file mode 100644
index 0000000..ce312f0
--- /dev/null
+++ b/bibletime/pics/lowcolor/32x32/Makefile.am
@@ -0,0 +1,7 @@
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+KDE_ICON = AUTO
+EXTRA_DIST=\
+lo32-action-bt_tile.png lo32-action-bt_tile_auto.png lo32-app-bibletime.png
diff --git a/bibletime/pics/lowcolor/32x32/Makefile.in b/bibletime/pics/lowcolor/32x32/Makefile.in
new file mode 100644
index 0000000..263a372
--- /dev/null
+++ b/bibletime/pics/lowcolor/32x32/Makefile.in
@@ -0,0 +1,382 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../../../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+KDE_ICON = AUTO
+EXTRA_DIST = lo32-action-bt_tile.png lo32-action-bt_tile_auto.png lo32-app-bibletime.png
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../../../config.h
+CONFIG_CLEAN_FILES =
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/lowcolor/32x32/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/lowcolor/32x32/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/lowcolor/32x32/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/pics/lowcolor/32x32
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/pics/lowcolor/32x32/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+#>- install-data-am:
+#>+ 1
+install-data-am: install-kde-icons
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+#>- uninstall-am:
+#>+ 1
+uninstall-am: uninstall-kde-icons
+uninstall: uninstall-am
+all-am: Makefile
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-generic mostlyclean-am
+
+#>- clean: clean-am
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+distclean-am: distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 2
+docs-am:
+
+#>+ 12
+install-kde-icons:
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/locolor/32x32/actions
+ $(INSTALL_DATA) $(srcdir)/lo32-action-bt_tile.png $(DESTDIR)$(kde_icondir)/locolor/32x32/actions/bt_tile.png
+ $(INSTALL_DATA) $(srcdir)/lo32-action-bt_tile_auto.png $(DESTDIR)$(kde_icondir)/locolor/32x32/actions/bt_tile_auto.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/locolor/32x32/apps
+ $(INSTALL_DATA) $(srcdir)/lo32-app-bibletime.png $(DESTDIR)$(kde_icondir)/locolor/32x32/apps/bibletime.png
+
+uninstall-kde-icons:
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/32x32/actions/bt_tile.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/32x32/actions/bt_tile_auto.png
+ -rm -f $(DESTDIR)$(kde_icondir)/locolor/32x32/apps/bibletime.png
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/lowcolor/32x32/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/lowcolor/32x32/Makefile.in
+
+
+#>+ 2
+final:
+ $(MAKE) all-am
+#>+ 2
+no-final:
+ $(MAKE) all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/pics/lowcolor/32x32/lo32-action-bt_tile.png b/bibletime/pics/lowcolor/32x32/lo32-action-bt_tile.png
new file mode 100644
index 0000000..f45a245
--- /dev/null
+++ b/bibletime/pics/lowcolor/32x32/lo32-action-bt_tile.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/32x32/lo32-action-bt_tile_auto.png b/bibletime/pics/lowcolor/32x32/lo32-action-bt_tile_auto.png
new file mode 100644
index 0000000..767f284
--- /dev/null
+++ b/bibletime/pics/lowcolor/32x32/lo32-action-bt_tile_auto.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/32x32/lo32-app-bibletime.png b/bibletime/pics/lowcolor/32x32/lo32-app-bibletime.png
new file mode 100644
index 0000000..9c9347f
--- /dev/null
+++ b/bibletime/pics/lowcolor/32x32/lo32-app-bibletime.png
Binary files differ
diff --git a/bibletime/pics/lowcolor/Makefile.am b/bibletime/pics/lowcolor/Makefile.am
new file mode 100644
index 0000000..31bfd6f
--- /dev/null
+++ b/bibletime/pics/lowcolor/Makefile.am
@@ -0,0 +1,5 @@
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+SUBDIRS = 16x16 22x22 32x32
diff --git a/bibletime/pics/lowcolor/Makefile.in b/bibletime/pics/lowcolor/Makefile.in
new file mode 100644
index 0000000..500b888
--- /dev/null
+++ b/bibletime/pics/lowcolor/Makefile.in
@@ -0,0 +1,467 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# this Makefile.am was automatically generated by bibletime/pics/gen_am.sh
+# please do not edit this file but rather run the script to update
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+SUBDIRS = 16x16 22x22 32x32
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../../config.h
+CONFIG_CLEAN_FILES =
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/lowcolor/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/lowcolor/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/lowcolor/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+@SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+ rev="$$subdir $$rev"; \
+ test "$$subdir" = "." && dot_seen=yes; \
+ done; \
+ test "$$dot_seen" = "no" && rev=". $$rev"; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/pics/lowcolor
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/pics/lowcolor/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+ for subdir in $(SUBDIRS); do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ chmod 777 $(distdir)/$$subdir; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
+ || exit 1; \
+ fi; \
+ done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am:
+uninstall: uninstall-recursive
+all-am: Makefile
+all-redirect: all-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am: clean-tags clean-generic mostlyclean-am
+
+#>- clean: clean-recursive
+#>+ 1
+clean: kde-rpo-clean clean-recursive
+
+distclean-am: distclean-tags distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-recursive
+
+maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \
+ distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+
+.PHONY: install-data-recursive uninstall-data-recursive \
+install-exec-recursive uninstall-exec-recursive installdirs-recursive \
+uninstalldirs-recursive all-recursive check-recursive \
+installcheck-recursive info-recursive dvi-recursive \
+mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs-am \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 2
+docs-am:
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/pics/lowcolor/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/pics/lowcolor/Makefile.in
+
+
+#>+ 2
+final:
+ $(MAKE) all-am
+#>+ 2
+no-final:
+ $(MAKE) all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/pics/startuplogo.png b/bibletime/pics/startuplogo.png
new file mode 100644
index 0000000..54f1697
--- /dev/null
+++ b/bibletime/pics/startuplogo.png
Binary files differ
diff --git a/bibletime/pics/startuplogo.xcf b/bibletime/pics/startuplogo.xcf
new file mode 100644
index 0000000..0a4ce34
--- /dev/null
+++ b/bibletime/pics/startuplogo.xcf
Binary files differ
diff --git a/bibletime/printing/Makefile.am b/bibletime/printing/Makefile.am
new file mode 100644
index 0000000..719cbea
--- /dev/null
+++ b/bibletime/printing/Makefile.am
@@ -0,0 +1,29 @@
+SUBDIRS = style-data
+
+INCLUDES = $(all_includes)
+
+libprinting_a_METASOURCES = AUTO
+
+noinst_LIBRARIES = libprinting.a
+
+libprinting_a_SOURCES = \
+cstylelist.cpp \
+cprintitemlist.cpp \
+cprintitem.cpp \
+cstyle.cpp \
+cstyleeditordialog.cpp \
+cprinter.cpp \
+cprintdialogpages.cpp
+
+
+all_headers = \
+cstylelist.h \
+cprintitemlist.h \
+cprintitem.h \
+cstyle.h \
+cstyleeditordialog.h \
+cprinter.h \
+cprintdialogpages.h
+
+
+EXTRA_DIST = $(libprinting_a_SOURCES) $(all_headers)
diff --git a/bibletime/printing/Makefile.in b/bibletime/printing/Makefile.in
new file mode 100644
index 0000000..be29687
--- /dev/null
+++ b/bibletime/printing/Makefile.in
@@ -0,0 +1,711 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+SUBDIRS = style-data
+
+INCLUDES = $(all_includes)
+
+#>- libprinting_a_METASOURCES = AUTO
+
+noinst_LIBRARIES = libprinting.a
+
+libprinting_a_SOURCES = cstylelist.cpp cprintitemlist.cpp cprintitem.cpp cstyle.cpp cstyleeditordialog.cpp cprinter.cpp cprintdialogpages.cpp
+
+
+all_headers = cstylelist.h cprintitemlist.h cprintitem.h cstyle.h cstyleeditordialog.h cprinter.h cprintdialogpages.h
+
+
+EXTRA_DIST = $(libprinting_a_SOURCES) $(all_headers)
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I../..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libprinting_a_LIBADD =
+#>- libprinting_a_OBJECTS = cstylelist.$(OBJEXT) cprintitemlist.$(OBJEXT) \
+#>- cprintitem.$(OBJEXT) cstyle.$(OBJEXT) cstyleeditordialog.$(OBJEXT) \
+#>- cprinter.$(OBJEXT) cprintdialogpages.$(OBJEXT)
+#>+ 8
+libprinting_a_final_OBJECTS = libprinting_a.all_cpp.o
+libprinting_a_nofinal_OBJECTS = cstylelist.$(OBJEXT) cprintitemlist.$(OBJEXT) \
+cprintitem.$(OBJEXT) cstyle.$(OBJEXT) cstyleeditordialog.$(OBJEXT) \
+cprinter.$(OBJEXT) cprintdialogpages.$(OBJEXT)\
+cstylelist.moc.o cstyleeditordialog.moc.o cprinter.moc.o cprintitemlist.moc.o cprintdialogpages.moc.o \
+libprinting_a_meta_unload.o
+@KDE_USE_FINAL_FALSE@libprinting_a_OBJECTS = $(libprinting_a_nofinal_OBJECTS)
+@KDE_USE_FINAL_TRUE@libprinting_a_OBJECTS = $(libprinting_a_final_OBJECTS)
+AR = ar
+CXXFLAGS = @CXXFLAGS@
+#>- CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+#>- LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+#>+ 1
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS)
+CXXLD = $(CXX)
+#>- CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
+#>+ 1
+CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+#>- DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+#>+ 4
+KDE_DIST=cstyle.h cprinter.h cstylelist.h cprintdialogpages.h cstyleeditordialog.h cprintitem.h cprintitemlist.h
+
+DISTFILES= $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
+
+
+TAR = tar
+GZIP_ENV = --best
+#>- DEP_FILES = .deps/cprintdialogpages.P .deps/cprinter.P \
+#>- .deps/cprintitem.P .deps/cprintitemlist.P .deps/cstyle.P \
+#>- .deps/cstyleeditordialog.P .deps/cstylelist.P
+#>+ 8
+@KDE_USE_FINAL_TRUE@DEP_FILES = $(DEPDIR)/cstylelist.moc.P $(DEPDIR)/cstyleeditordialog.moc.P $(DEPDIR)/cprinter.moc.P $(DEPDIR)/cprintitemlist.moc.P $(DEPDIR)/cprintdialogpages.moc.P $(DEPDIR)/libprinting_a_meta_unload.P $(DEPDIR)/libprinting_a.all_cpp.P \
+ .deps/cprintdialogpages.P .deps/cprinter.P \
+.deps/cprintitem.P .deps/cprintitemlist.P .deps/cstyle.P \
+.deps/cstyleeditordialog.P .deps/cstylelist.P
+@KDE_USE_FINAL_FALSE@DEP_FILES = $(DEPDIR)/cstylelist.moc.P $(DEPDIR)/cstyleeditordialog.moc.P $(DEPDIR)/cprinter.moc.P $(DEPDIR)/cprintitemlist.moc.P $(DEPDIR)/cprintdialogpages.moc.P $(DEPDIR)/libprinting_a_meta_unload.P .deps/cprintdialogpages.P .deps/cprinter.P \
+.deps/cprintitem.P .deps/cprintitemlist.P .deps/cstyle.P \
+.deps/cstyleeditordialog.P .deps/cstylelist.P
+
+SOURCES = $(libprinting_a_SOURCES)
+OBJECTS = $(libprinting_a_OBJECTS)
+
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .cpp .lo .o .obj .s
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/printing/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/printing/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/printing/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.s.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libprinting.a: $(libprinting_a_OBJECTS) $(libprinting_a_DEPENDENCIES)
+ -rm -f libprinting.a
+ $(AR) cru libprinting.a $(libprinting_a_OBJECTS) $(libprinting_a_LIBADD)
+ $(RANLIB) libprinting.a
+.cpp.o:
+ $(CXXCOMPILE) -c $<
+.cpp.obj:
+ $(CXXCOMPILE) -c `cygpath -w $<`
+.cpp.lo:
+ $(LTCXXCOMPILE) -c $<
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+@SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+ rev="$$subdir $$rev"; \
+ test "$$subdir" = "." && dot_seen=yes; \
+ done; \
+ test "$$dot_seen" = "no" && rev=". $$rev"; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/printing
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/printing/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+ for subdir in $(SUBDIRS); do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ chmod 777 $(distdir)/$$subdir; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
+ || exit 1; \
+ fi; \
+ done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+ -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+ @echo '$(COMPILE) -c $<'; \
+ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.c
+ @echo '$(LTCOMPILE) -c $<'; \
+ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+
+%.o: %.cpp
+ @echo '$(CXXCOMPILE) -c $<'; \
+ $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.cpp
+ @echo '$(LTCXXCOMPILE) -c $<'; \
+ $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am:
+uninstall: uninstall-recursive
+all-am: Makefile $(LIBRARIES)
+all-redirect: all-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
+ mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+#>- clean-am: clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+#>- clean-depend clean-generic mostlyclean-am
+#>+ 2
+clean-am: clean-metasources clean-moc-classes clean-final clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+ clean-depend clean-generic mostlyclean-am
+
+#>- clean: clean-recursive
+#>+ 1
+clean: kde-rpo-clean clean-recursive
+
+distclean-am: distclean-noinstLIBRARIES distclean-compile \
+ distclean-libtool distclean-tags distclean-depend \
+ distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-recursive
+
+maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-tags maintainer-clean-depend \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool install-data-recursive \
+uninstall-data-recursive install-exec-recursive \
+uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
+all-recursive check-recursive installcheck-recursive info-recursive \
+dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs-am installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 3
+cstylelist.moc.cpp: $(srcdir)/cstylelist.h
+ $(MOC) $(srcdir)/cstylelist.h -o cstylelist.moc.cpp
+
+#>+ 3
+cstyleeditordialog.moc.cpp: $(srcdir)/cstyleeditordialog.h
+ $(MOC) $(srcdir)/cstyleeditordialog.h -o cstyleeditordialog.moc.cpp
+
+#>+ 3
+cprinter.moc.cpp: $(srcdir)/cprinter.h
+ $(MOC) $(srcdir)/cprinter.h -o cprinter.moc.cpp
+
+#>+ 3
+cprintitemlist.moc.cpp: $(srcdir)/cprintitemlist.h
+ $(MOC) $(srcdir)/cprintitemlist.h -o cprintitemlist.moc.cpp
+
+#>+ 3
+cprintdialogpages.moc.cpp: $(srcdir)/cprintdialogpages.h
+ $(MOC) $(srcdir)/cprintdialogpages.h -o cprintdialogpages.moc.cpp
+
+#>+ 3
+clean-metasources:
+ -rm -f cstylelist.moc.cpp cstyleeditordialog.moc.cpp cprinter.moc.cpp cprintitemlist.moc.cpp cprintdialogpages.moc.cpp
+
+#>+ 2
+docs-am:
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/printing/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/printing/Makefile.in
+
+
+#>+ 10
+libprinting_a_meta_unload.cpp: cstylelist.moc.cpp cstyleeditordialog.moc.cpp cprintitemlist.moc.cpp cprinter.moc.cpp cprintdialogpages.moc.cpp
+ @echo 'creating libprinting_a_meta_unload.cpp'
+ @-rm -f libprinting_a_meta_unload.cpp
+ @echo 'static const char * _metalist_libprinting_a[] = {' > libprinting_a_meta_unload.cpp
+ @cat cstylelist.moc.cpp cstyleeditordialog.moc.cpp cprintitemlist.moc.cpp cprinter.moc.cpp cprintdialogpages.moc.cpp | grep 'char.*className' | sed -e 's/.*[^A-Za-z0-9_:]\([A-Za-z0-9_:]*\)::className.*$$/\"\1\",/' | sort | uniq >> libprinting_a_meta_unload.cpp
+ @echo '0};' >> libprinting_a_meta_unload.cpp
+ @echo '#include <kunload.h>' >> libprinting_a_meta_unload.cpp
+ @echo '_UNLOAD(libprinting_a)' >> libprinting_a_meta_unload.cpp
+
+
+#>+ 3
+clean-moc-classes:
+ -rm -f libprinting_a_meta_unload.cpp
+
+#>+ 11
+libprinting_a.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/cstylelist.cpp $(srcdir)/cprintitemlist.cpp $(srcdir)/cprintitem.cpp $(srcdir)/cstyle.cpp $(srcdir)/cstyleeditordialog.cpp $(srcdir)/cprinter.cpp $(srcdir)/cprintdialogpages.cpp libprinting_a_meta_unload.cpp cstylelist.moc.cpp cstyleeditordialog.moc.cpp cprinter.moc.cpp cprintitemlist.moc.cpp cprintdialogpages.moc.cpp
+ @echo 'creating libprinting_a.all_cpp.cpp ...'; \
+ rm -f libprinting_a.all_cpp.files libprinting_a.all_cpp.final; \
+ echo "#define KDE_USE_FINAL 1" >> libprinting_a.all_cpp.final; \
+ for file in cstylelist.cpp cprintitemlist.cpp cprintitem.cpp cstyle.cpp cstyleeditordialog.cpp cprinter.cpp cprintdialogpages.cpp libprinting_a_meta_unload.cpp cstylelist.moc.cpp cstyleeditordialog.moc.cpp cprinter.moc.cpp cprintitemlist.moc.cpp cprintdialogpages.moc.cpp; do \
+ echo "#include \"$$file\"" >> libprinting_a.all_cpp.files; \
+ test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libprinting_a.all_cpp.final; \
+ done; \
+ cat libprinting_a.all_cpp.final libprinting_a.all_cpp.files > libprinting_a.all_cpp.cpp; \
+ rm -f libprinting_a.all_cpp.final libprinting_a.all_cpp.files
+
+#>+ 3
+clean-final:
+ -rm -f libprinting_a.all_cpp.cpp
+
+#>+ 2
+final:
+ $(MAKE) libprinting_a_OBJECTS="$(libprinting_a_final_OBJECTS)" all-am
+#>+ 2
+no-final:
+ $(MAKE) libprinting_a_OBJECTS="$(libprinting_a_nofinal_OBJECTS)" all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/printing/cprintdialogpages.cpp b/bibletime/printing/cprintdialogpages.cpp
new file mode 100644
index 0000000..625f604
--- /dev/null
+++ b/bibletime/printing/cprintdialogpages.cpp
@@ -0,0 +1,289 @@
+/***************************************************************************
+ cstylelistpage.cpp - description
+ -------------------
+ begin : Fri Feb 8 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+#include "cprinter.h"
+#include "cprintdialogpages.h"
+#include "cprintitemlist.h"
+#include "cprintitem.h"
+#include "tooltipdef.h"
+#include "resource.h"
+#include "whatsthisdef.h"
+
+//QT includes
+#include <qbuttongroup.h>
+#include <qcombobox.h>
+#include <qtoolbutton.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qwhatsthis.h>
+#include <qtooltip.h>
+#include <qspinbox.h>
+#include <qlistview.h>
+
+//KDE includes
+#include <klocale.h>
+
+CStyleListPage::CStyleListPage(CPrinter* printer, QWidget *parent, const char *name )
+ : KPrintDialogPage(parent,name), m_printer(printer) {
+ setTitle(i18n("Styles"));
+
+// QFrame *page = addPage( i18n("Layout"), i18n("Layout specific settings") );
+ QVBoxLayout *topLayout = new QVBoxLayout( this, 5, 5 );
+
+ QButtonGroup *group = new QButtonGroup( i18n("Margins (in millimeter)"), this );
+ QWhatsThis::add(group, WT_PD_LAYOUT_BORDER);
+ topLayout->addWidget( group, 0 );
+
+ QGridLayout *gbox = new QGridLayout( group, 4, 2, 5, 5 );
+ gbox->addRowSpacing( 0, group->fontMetrics().height()-5 );
+
+ const QString name[4] = {i18n("&Top"),i18n("&Bottom"),i18n("&Left"), i18n("&Right") };
+ for( int i=0; i<4; i++ ) {
+ m_marginSpin[i] = new QSpinBox( group );
+ m_marginSpin[i]->setFixedHeight( m_marginSpin[i]->sizeHint().height() );
+ m_marginSpin[i]->setMinimumWidth( m_marginSpin[i]->fontMetrics().width("M")*10 );
+ m_marginSpin[i]->setSuffix(" mm");
+
+ QLabel *label = new QLabel( m_marginSpin[i], name[i], group );
+ label->setFixedHeight( m_marginSpin[i]->sizeHint().height() );
+ label->setFixedWidth( label->sizeHint().width() );
+
+ if( i < 2 )
+ {
+ gbox->addWidget( label, i+1, 0, AlignLeft );
+ gbox->addWidget( m_marginSpin[i], i+1, 1, AlignLeft );
+ }
+ else
+ {
+ gbox->addWidget( label, i-1, 3, AlignLeft );
+ gbox->addWidget( m_marginSpin[i], i-1, 4, AlignLeft );
+ }
+ }
+ QWhatsThis::add(m_marginSpin[0], WT_PD_LAYOUT_BORDER_TOP);
+ QWhatsThis::add(m_marginSpin[1], WT_PD_LAYOUT_BORDER_BOTTOM);
+ QWhatsThis::add(m_marginSpin[2], WT_PD_LAYOUT_BORDER_LEFT);
+ QWhatsThis::add(m_marginSpin[3], WT_PD_LAYOUT_BORDER_RIGHT);
+
+ QToolTip::add(m_marginSpin[0], TT_PD_LAYOUT_BORDER_TOP);
+ QToolTip::add(m_marginSpin[1], TT_PD_LAYOUT_BORDER_BOTTOM);
+ QToolTip::add(m_marginSpin[2], TT_PD_LAYOUT_BORDER_LEFT);
+ QToolTip::add(m_marginSpin[3], TT_PD_LAYOUT_BORDER_RIGHT);
+
+ gbox->activate();
+ group->setFixedHeight( group->sizeHint().height() );
+ //set minimum borders
+ m_marginSpin[0]->setRange(0, 100); //upper margin
+ m_marginSpin[1]->setRange(0, 100); //lower margin
+ m_marginSpin[2]->setRange(0, 100); //left margin
+ m_marginSpin[3]->setRange(0, 100); //right margin
+
+ QHBoxLayout *entryLayout = new QHBoxLayout( 0, 5, 5 );
+ QVBoxLayout *styleLayout = new QVBoxLayout( 0, 5, 5 );
+ QVBoxLayout *buttonLayout = new QVBoxLayout( 0, 5, 5 );
+
+ m_styleList = new CStyleList( &(m_printer->styleList()), this, "CStyleList1");
+ connect(m_styleList, SIGNAL(currentChanged(QListViewItem*)), SLOT(currentStyleChanged(QListViewItem*)));
+ QToolTip::add(m_styleList, TT_PD_LAYOUT_STYLE_LIST);
+ QWhatsThis::add(m_styleList, WT_PD_LAYOUT_STYLE_LIST);
+
+ QLabel* label = new QLabel(m_styleList, i18n("List of style items:"), this);
+ styleLayout->addWidget(label,0);
+ styleLayout->addWidget( m_styleList, 3);
+
+ m_newStyleButton = new QToolButton( this, "newStyle Button");
+ m_newStyleButton->setOnIconSet( SmallIcon(ICON_FILE_NEW));
+ m_newStyleButton->setOffIconSet( SmallIcon(ICON_FILE_NEW));
+ QToolTip::add(m_newStyleButton, TT_PD_LAYOUT_STYLE_NEW);
+ QWhatsThis::add(m_newStyleButton, WT_PD_LAYOUT_STYLE_NEW);
+ connect( m_newStyleButton, SIGNAL(clicked()), m_styleList, SLOT(createNewStyle()));
+
+ m_deleteStyleButton = new QToolButton( this, "deleteStyle Button");
+ m_deleteStyleButton->setOnIconSet( SmallIcon(ICON_FILE_DELETE));
+ m_deleteStyleButton->setOffIconSet( SmallIcon(ICON_FILE_DELETE));
+ QToolTip::add(m_deleteStyleButton, TT_PD_LAYOUT_STYLE_DELETE);
+ QWhatsThis::add(m_deleteStyleButton, WT_PD_LAYOUT_STYLE_DELETE);
+ connect( m_deleteStyleButton, SIGNAL(clicked()), m_styleList, SLOT(deleteCurrentStyle()));
+
+ m_editStyleButton = new QToolButton( this, "editStyle");
+ m_editStyleButton->setOnIconSet( SmallIcon(ICON_EDIT));
+ m_editStyleButton->setOffIconSet( SmallIcon(ICON_EDIT));
+ QToolTip::add(m_editStyleButton, TT_PD_LAYOUT_STYLE_EDIT);
+ QWhatsThis::add(m_editStyleButton, WT_PD_LAYOUT_STYLE_EDIT);
+ connect( m_editStyleButton, SIGNAL(clicked()), m_styleList, SLOT(editCurrentStyle()));
+
+ buttonLayout->addWidget( m_newStyleButton );
+ buttonLayout->addWidget( m_editStyleButton );
+ buttonLayout->addWidget( m_deleteStyleButton );
+ buttonLayout->addStretch(3);
+
+ entryLayout->addLayout( styleLayout );
+ entryLayout->addLayout( buttonLayout );
+
+ topLayout->addLayout(entryLayout);
+}
+
+CStyleListPage::~CStyleListPage() {
+
+}
+
+void CStyleListPage::getOptions (QMap<QString, QString>& opts, bool incldef) {
+ qWarning("CStyleListPage::getOptions (const QMap<QString,QString>& opts, bool)");
+
+ const QString leading = "kde-bibletime-";
+ opts[ leading+"upper_margin" ] = QString::number(m_marginSpin[0]->value());
+ qWarning(opts[leading+"upper_margin"].latin1());
+ opts[ leading+"lower_margin" ] = QString::number(m_marginSpin[1]->value());
+ opts[ leading+"left_margin" ] = QString::number(m_marginSpin[2]->value());
+ opts[ leading+"right_margin" ] = QString::number(m_marginSpin[3]->value());
+}
+
+void CStyleListPage::setOptions (const QMap<QString,QString>& opts) {
+ qWarning("CStyleListPage::setOptions (const QMap<QString,QString>& opts)");
+
+ const QString leading = "kde-bibletime-";
+ QString option = opts[ leading+"upper_margin" ];
+ m_marginSpin[0]->setValue( option.toInt() );
+ option = opts[ leading+"lower_margin" ];
+ m_marginSpin[1]->setValue( option.toInt() );
+ option = opts[ leading+"left_margin" ];
+ m_marginSpin[2]->setValue( option.toInt() );
+ option = opts[ leading+"right_margin" ];
+ m_marginSpin[3]->setValue( option.toInt() );
+}
+
+bool CStyleListPage::isValid (QString& errorMessage) {
+ return true;
+}
+
+/** No descriptions */
+void CStyleListPage::currentStyleChanged( QListViewItem* item ){
+ if (item) {
+ m_deleteStyleButton->setEnabled( item->text(0) != i18n("Standard") );
+ m_editStyleButton->setEnabled( true );
+ }
+ else {
+ m_deleteStyleButton->setEnabled( false );
+ m_editStyleButton->setEnabled( false );
+ }
+}
+
+
+
+// ------------------
+
+CPrintItemListPage::CPrintItemListPage(CPrinter* printer, QWidget *parent, const char *name )
+ : KPrintDialogPage(parent,name), m_printer( printer )
+{
+ setTitle(i18n("Print queue"));
+
+ QVBoxLayout *topLayout = new QVBoxLayout( this, 5, 5 );
+ QVBoxLayout *entryLayout = new QVBoxLayout( 0, 5, 5 );
+ QLabel* label = 0;
+
+ m_styleComboBox = new QComboBox( this, "styleComboBox" );
+ QToolTip::add(m_styleComboBox, TT_PD_ENTRIES_STYLE_COMBO);
+ QWhatsThis::add(m_styleComboBox, WT_PD_ENTRIES_STYLE_COMBO);
+ connect(m_styleComboBox, SIGNAL(activated(const QString&)), SLOT(slotListApplyStyle(const QString&)));
+
+ label = new QLabel( m_styleComboBox, i18n("Choose a style"), this);
+ QHBoxLayout* hboxLayout = new QHBoxLayout( 0, 5, 5 );
+ hboxLayout->addWidget( label );
+ hboxLayout->addWidget( m_styleComboBox );
+ topLayout->addLayout( hboxLayout );
+
+ hboxLayout = new QHBoxLayout( 0, 5, 5 );
+
+ m_printItemList = new CPrintItemList( &(m_printer->printQueue()), this, "CPrintItemList1");
+ QToolTip::add(m_printItemList, TT_PD_ENTRIES_PI_LIST);
+ QWhatsThis::add(m_printItemList, WT_PD_ENTRIES_PI_LIST);
+
+ label = new QLabel(m_printItemList, i18n("Entries which should be printed:"), this);
+ entryLayout->addWidget(label);
+ entryLayout->addWidget( m_printItemList );
+ hboxLayout->addLayout(entryLayout);
+
+ QVBoxLayout *buttonLayout = new QVBoxLayout( 0, 5, 5 );
+ m_moveUpButton = new QToolButton(this);
+ m_moveUpButton->setOnIconSet( SmallIcon("up"));
+ m_moveUpButton->setOffIconSet( SmallIcon("up"));
+ QToolTip::add(m_moveUpButton, TT_PD_ENTRIES_PI_MOVE_UP);
+ QWhatsThis::add(m_moveUpButton, WT_PD_ENTRIES_PI_MOVE_UP);
+ connect(m_moveUpButton, SIGNAL(clicked()),m_printItemList, SLOT(moveUp()));
+
+ m_moveDownButton = new QToolButton(this);
+ m_moveDownButton->setOnIconSet( SmallIcon("down"));
+ m_moveDownButton->setOffIconSet( SmallIcon("down"));
+ QToolTip::add(m_moveDownButton, TT_PD_ENTRIES_PI_MOVE_DOWN);
+ QWhatsThis::add(m_moveDownButton, WT_PD_ENTRIES_PI_MOVE_DOWN);
+ connect( m_moveDownButton, SIGNAL(clicked()),m_printItemList, SLOT(moveDown()));
+
+ m_deleteButton = new QToolButton(this);
+ m_deleteButton->setOnIconSet( SmallIcon("edittrash"));
+ m_deleteButton->setOffIconSet( SmallIcon("edittrash"));
+ QToolTip::add(m_deleteButton, TT_PD_ENTRIES_PI_DELETE);
+ QWhatsThis::add(m_deleteButton, WT_PD_ENTRIES_PI_DELETE);
+ connect( m_deleteButton, SIGNAL(clicked()),m_printItemList, SLOT(deleteSelectedItems()));
+
+ buttonLayout->addWidget(m_moveUpButton);
+ buttonLayout->addWidget(m_moveDownButton);
+ buttonLayout->addWidget(m_deleteButton);
+ buttonLayout->addStretch(3);
+
+ hboxLayout->addLayout( buttonLayout );
+ topLayout->addLayout( hboxLayout );
+
+ connect(m_printer, SIGNAL(sigStylesChanged()), this, SLOT(stylesChanged()));
+ stylesChanged(); //fill the box for the first time
+}
+
+CPrintItemListPage::~CPrintItemListPage() {
+
+}
+
+void CPrintItemListPage::getOptions (QMap<QString, QString>& opts, bool incldef) {
+
+}
+
+void CPrintItemListPage::setOptions (const QMap<QString,QString>& opts) {
+
+}
+
+bool CPrintItemListPage::isValid(QString& errorMessage) {
+ return true;
+}
+
+/** Applies the given styles to the print item list. */
+void CPrintItemListPage::slotListApplyStyle(const QString& styleName ){
+ StyleItemList& styleList = m_printer->styleList();
+ for(styleList.first(); styleList.current(); styleList.next()) {
+ if (styleList.current()->styleName() == styleName) {
+ m_printItemList->applyStyleToSelected( styleList.current() );
+ break;
+ }
+ }
+}
+
+/** Is called when the CPrinter object sends a signal that the styles have changed. */
+void CPrintItemListPage::stylesChanged(){
+ m_styleComboBox->clear();
+ //refill the combobox
+ StyleItemList& styleList = m_printer->styleList();
+ for(styleList.first(); styleList.current(); styleList.next()) {
+ m_styleComboBox->insertItem(styleList.current()->styleName());
+ }
+}
diff --git a/bibletime/printing/cprintdialogpages.h b/bibletime/printing/cprintdialogpages.h
new file mode 100644
index 0000000..bf5e483
--- /dev/null
+++ b/bibletime/printing/cprintdialogpages.h
@@ -0,0 +1,101 @@
+/***************************************************************************
+ cstylelistpage.h - description
+ -------------------
+ begin : Fri Feb 8 2002
+ copyright : (C) 2002 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSTYLELISTPAGE_H
+#define CSTYLELISTPAGE_H
+
+//Qt includes
+#include <qwidget.h>
+
+//KDE includes
+#include <kdeprint/kprintdialogpage.h>
+
+
+class QComboBox;
+class QSpinBox;
+class QListViewItem;
+
+class CPrintItemList;
+class CStyleList;
+class CPrinter;
+
+/**
+ *@author The BibleTime team
+ */
+
+class CStyleListPage : public KPrintDialogPage {
+ Q_OBJECT
+public:
+ CStyleListPage(CPrinter* printer, QWidget *parent=0, const char *name=0);
+ ~CStyleListPage();
+ virtual void getOptions (QMap<QString,QString>& opts, bool incldef = false);
+ virtual void setOptions (const QMap<QString,QString>& opts);
+ virtual bool isValid (QString&);
+
+private:
+ CPrinter* m_printer;
+ QSpinBox *m_marginSpin[4];
+ CStyleList* m_styleList;
+ QToolButton* m_deleteStyleButton;
+ QToolButton* m_newStyleButton;
+ QToolButton* m_editStyleButton;
+ /**
+ * Is called when the style selection changed in the syle list box.
+ */
+
+private slots:
+ void currentStyleChanged(QListViewItem*);
+};
+
+// --------------------------
+
+/**
+ *@author The BibleTime team
+ */
+
+class CPrintItemListPage : public KPrintDialogPage {
+ Q_OBJECT
+public:
+ CPrintItemListPage(CPrinter* printer, QWidget *parent=0, const char *name=0);
+ ~CPrintItemListPage();
+ virtual void getOptions (QMap<QString,QString>& opts, bool incldef = false);
+ virtual void setOptions (const QMap<QString,QString>& opts);
+ virtual bool isValid (QString&);
+
+private:
+ CPrinter* m_printer;
+ CPrintItemList* m_printItemList;
+ QComboBox* m_styleComboBox;
+ QToolButton* m_moveUpButton;
+ QToolButton* m_moveDownButton;
+ QToolButton* m_deleteButton;
+
+private slots:
+ /**
+ * Applies the given styles to the print item list.
+ */
+ void slotListApplyStyle(const QString&);
+protected slots: // Protected slots
+ /**
+ * Is called when the CPrinter object sends a signal
+ * that the styles have changed.
+ */
+ void stylesChanged();
+};
+
+
+#endif
diff --git a/bibletime/printing/cprinter.cpp b/bibletime/printing/cprinter.cpp
new file mode 100644
index 0000000..ce465f6
--- /dev/null
+++ b/bibletime/printing/cprinter.cpp
@@ -0,0 +1,339 @@
+/***************************************************************************
+ cprinter.cpp - description
+ -------------------
+ begin : Sat Aug 5 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cprinter.h"
+#include "cprintitem.h"
+#include "cprintdialogpages.h"
+
+#include "backend/cswordbackend.h"
+#include "backend/cswordversekey.h"
+#include "backend/cswordldkey.h"
+
+//KDE includes
+#include <kconfig.h>
+#include <kprocess.h>
+#include <kconfigbase.h>
+#include <kstddirs.h>
+#include <klocale.h>
+#include <kapp.h>
+
+//Qt includes
+#include <qfile.h>
+#include <qdir.h>
+#include <qstringlist.h>
+#include <qpainter.h>
+#include <qpaintdevice.h>
+#include <qpaintdevicemetrics.h>
+
+CPrinter::CPrinter( QObject* parent ) : QObject(parent) {
+ m_config = new KConfig("bt-printing", false, true );
+
+ m_queue.setAutoDelete(true);
+ m_styleList.setAutoDelete(true);
+ m_cachedPage.initialized = false;
+ m_cachedPage.refresh = false;
+ m_addedItem = false;
+
+ {
+ KConfigGroupSaver gs(m_config, "Options");
+ QMap<QString, QString> map = m_config->entryMap("Options");
+ setOptions(map);
+ }
+
+ m_styleDir = "printing/";
+ KStandardDirs stdDirs;
+ m_styleSaveLocation = stdDirs.saveLocation("data", "bibletime/"+m_styleDir);
+
+ readSettings();
+ setupStyles();
+ setupStandardStyle();
+}
+
+CPrinter::~CPrinter(){
+ saveSettings();
+ saveStyles();
+ m_config->sync();
+
+ delete m_config;
+}
+
+/** Appends a new page where the next things will be painted. */
+const bool CPrinter::newPage(){
+ if (aborted()) {
+ qWarning("CPrinter::newPage: Printing was aborted!");
+ return false;
+ }
+ const bool result = KPrinter::newPage();
+ if (result) {
+ m_pagePosition.curPage++;
+ m_pagePosition.rect = contentSize();
+ setVerticalPos(pageMargins().top);
+ }
+ return result;
+}
+
+/** Sets all the margins at one time. */
+void CPrinter::setAllMargins( const CPageMargin margins ) {
+ m_cachedPage.refresh = true;
+ m_pageMargin = margins;
+}
+
+/** Returns the margins of the pages. */
+const CPrinter::CPageMargin& CPrinter::pageMargins() const {
+ return m_pageMargin;
+}
+
+/** Setups the printer using CPrinterDialog. */
+void CPrinter::setup( QWidget* parent ){
+ KPrinter::addDialogPage( new CPrintItemListPage(this) );
+ KPrinter::addDialogPage( new CStyleListPage(this) );
+
+ if ( KPrinter::setup(parent) ) {
+ saveSettings();
+ readSettings();
+ print();
+ }
+}
+
+/** Starts printing the items. */
+void CPrinter::print(){
+ emit printingStarted();
+ QPainter p;
+ if (!p.begin(this)) {
+ p.end();
+ return;
+ }
+ int lastPercent = 0;
+ int pos = 1;
+ const int count = m_queue.count();
+ const int copies = numCopies();
+ float copyFrac;
+ emit percentCompleted(0);
+
+ for (int copy = 0; copy < copies && !aborted(); copy++) { //make numCopies() copies of the pages
+ copyFrac = (float(copies))/ (float)(copy+1);
+ for (m_queue.first(), pos = 1; m_queue.current(); m_queue.next(), ++pos) {
+ KApplication::kApplication()->processEvents(5); //do not lock the GUI!
+ if (!aborted()) {
+ m_queue.current()->draw(&p,this);
+ if ((int)((float)pos / (float)count *(float)100 * copyFrac) > lastPercent)
+ emit percentCompleted(++lastPercent);
+ }
+ };
+ if (!aborted() && (copy+1 < copies) )
+ newPage(); //new pages seperate copies
+ }
+ emit printingFinished();
+ clearQueue();//delete all items
+}
+
+/** Appends items to the printing queue. */
+void CPrinter::appendItems( ListCPrintItem& items ){
+ for(items.first(); items.current(); items.next()) {
+ items.current()->setStyle(m_standardStyle);
+ m_queue.append(items.current());
+ }
+ if (items.count() && !m_addedItem) {
+ m_addedItem = true;
+ emit addedFirstQueueItem();
+ }
+}
+
+/** */
+void CPrinter::clearQueue(){
+ m_queue.clear();
+ m_addedItem = false;//queue is empty
+ emit queueCleared();
+}
+
+/** Returns the print queue object. */
+ListCPrintItem& CPrinter::printQueue() {
+ return m_queue;
+}
+
+/** Sets the printing queue to queue. */
+void CPrinter::setPrintQueue( ListCPrintItem& queue ){
+ clearQueue();
+ m_queue = queue; //copy items
+}
+
+/** Appends the item o the queue. */
+void CPrinter::appendItem(CPrintItem* newItem){
+ if (!newItem)
+ return;
+ newItem->setStyle(m_standardStyle);
+ m_queue.append(newItem);
+
+ if (!m_addedItem) {
+ m_addedItem = true;
+ emit addedFirstQueueItem();
+ }
+}
+
+/** Reads the style from config. */
+void CPrinter::setupStyles(){
+//load local styles
+ QDir d( m_styleSaveLocation );
+ QStringList files = d.entryList("*.xml");
+ for ( QStringList::Iterator it = files.begin(); it != files.end(); ++it ) {
+ m_styleList.append( new CStyle(m_styleSaveLocation + *it) ); //automatically load from file
+ }
+
+//load systemwide styles, probably standard styles installed by BibleTime
+ KStandardDirs stdDirs;
+ QStringList globalPaths = stdDirs.findDirs("data", "bibletime/"+m_styleDir);
+ if (globalPaths.count()) { //try to find some new global styles
+ for (QStringList::Iterator path = globalPaths.begin(); path!=globalPaths.end(); ++path) {
+ d = QDir( *path );
+ QStringList files = d.entryList("*.xml");
+ for ( QStringList::Iterator it = files.begin(); it != files.end(); ++it ) {
+ CStyle* newStyle = new CStyle(*path + *it);
+
+ bool found = false;
+ for(m_styleList.first(); m_styleList.current() && !found; m_styleList.next()) {
+ if (newStyle->styleName() == m_styleList.current()->styleName()) {
+ found = true;
+ }
+ }
+
+ if (!found) {
+ m_styleList.append( newStyle );
+ }
+ }
+ }
+ }
+}
+
+/** Saves the styles to config file. */
+void CPrinter::saveStyles(){
+ QDir d(m_styleSaveLocation);
+ QStringList files = d.entryList("*.xml");
+ for ( QStringList::Iterator it = files.begin(); it != files.end(); ++it ) {
+ d.remove(*it);
+ }
+
+ for (m_styleList.first(); m_styleList.current(); m_styleList.next()) {
+ m_styleList.current()->save( m_styleSaveLocation + QString::fromLatin1("printing-style-%1").arg(m_styleList.at()) + ".xml" );
+ }
+}
+
+/** */
+void CPrinter::readSettings(){
+ KConfigGroupSaver gs(m_config, "Settings");
+ const QString leading = "kde-bibletime-";
+
+ setFullPage(true);
+ m_pagePosition.curPage = 1;
+ m_pagePosition.rect = contentSize();
+
+ QPaintDeviceMetrics m(this);
+ const float r = static_cast<float>(m.width()) / m.widthMM();
+ m_pageMargin.left = (int)(r * m_config->readNumEntry("Left margin", 15));
+ setOption(leading+"left_margin", QString::number(m_config->readNumEntry("Left margin", 15)));
+
+ m_pageMargin.right = (int)(r * m_config->readNumEntry("Right margin", 15));
+ setOption(leading+"right_margin", QString::number(m_config->readNumEntry("Right margin", 15)));
+
+ m_pageMargin.top = (int)(r * m_config->readNumEntry("Top margin", 15));
+ setOption(leading+"upper_margin", QString::number(m_config->readNumEntry("Top margin", 15)));
+
+ m_pageMargin.bottom = (int)(r * m_config->readNumEntry("Bottom margin", 15));
+ setOption(leading+"lower_margin", QString::number(m_config->readNumEntry("Bottom margin", 15)));
+
+ m_cachedPage.refresh = true;
+}
+
+/** */
+void CPrinter::saveSettings(){
+ const QString leading = "kde-bibletime-";
+ KConfigGroupSaver gs(m_config, "Settings");
+ m_config->writeEntry("Left margin", option(leading+"left_margin").toInt());
+ m_config->writeEntry("Right margin", option(leading+"right_margin").toInt());
+ m_config->writeEntry("Top margin", option(leading+"upper_margin").toInt());
+ m_config->writeEntry("Bottom margin", option(leading+"lower_margin").toInt());
+}
+
+/** Returns the list of styles. */
+StyleItemList& CPrinter::styleList() {
+ return m_styleList;
+}
+
+/** Sets the application wide style list to list. */
+void CPrinter::setStyleList( StyleItemList& list){
+ m_styleList = list; //copy items
+}
+
+/** Returns the page size without headers. */
+const QRect CPrinter::contentSize() {
+ if ( m_cachedPage.refresh || !m_cachedPage.initialized || (m_cachedPage.initialized && (m_cachedPage.cachedPaper != pageSize())) )
+ { //refresh page size info
+ m_cachedPage.initialized = true;
+ m_cachedPage.refresh = false;
+ m_cachedPage.cachedPaper = pageSize();
+
+ QPaintDeviceMetrics metric( this ); //note that metric's width and height span the whole page
+ m_cachedPage.size.setLeft( m_pageMargin.left );
+ m_cachedPage.size.setTop( m_pageMargin.top );
+ m_cachedPage.size.setRight( metric.width() - m_pageMargin.right );
+ m_cachedPage.size.setBottom( metric.height() /*- m_pageMargin.top*/ - m_pageMargin.bottom );
+ }
+ return m_cachedPage.size;
+}
+
+/** Returns the config used for this printer object. */
+KConfig* const CPrinter::config() const {
+ return m_config;
+}
+
+/** Creates the standard style. */
+void CPrinter::setupStandardStyle(){
+ //see if m_items contains standard style
+ bool found = false;
+ for (m_styleList.first(); m_styleList.current(); m_styleList.next()) {
+ if (m_styleList.current()->styleName() == i18n("Standard")) { //found the style
+ found = true;
+ m_standardStyle = m_styleList.current();
+ break;
+ }
+ }
+
+ if (!found) {
+ m_standardStyle = new CStyle();
+ m_standardStyle->setStyleName(i18n("Standard"));
+ m_styleList.append( m_standardStyle );
+ }
+}
+
+/** returns the vertical position of the printer's painter. */
+const int CPrinter::verticalPos() const {
+ return m_pagePosition.rect.y();
+}
+
+/** Sets the vertical position of the printer's painter. */
+void CPrinter::setVerticalPos( const int yPos ){
+ m_pagePosition.rect.setY(yPos);
+}
+
+/** Emits the signal that the styles changed. */
+void CPrinter::emitStylesChanged(){
+ emit sigStylesChanged();
+}
+
+/** Emits the signal that the styles changed. */
+CStyle* const CPrinter::standardStyle() const {
+ return m_standardStyle;
+}
diff --git a/bibletime/printing/cprinter.h b/bibletime/printing/cprinter.h
new file mode 100644
index 0000000..1b8301a
--- /dev/null
+++ b/bibletime/printing/cprinter.h
@@ -0,0 +1,219 @@
+/***************************************************************************
+ cprinter.h - description
+ -------------------
+ begin : Sat Aug 5 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CPRINTER_H
+#define CPRINTER_H
+
+//BibleTime includes
+#include "frontend/cpointers.h"
+#include "cprintitemlist.h"
+#include "cprintitem.h"
+#include "cstylelist.h"
+#include "cstyle.h"
+
+//KDE includes
+#include <kprinter.h>
+
+//Qt includes
+#include <qobject.h>
+#include <qpainter.h>
+
+
+/**
+ * This is the class which prints the items (low-level).
+ * It uses a QPainter to do it.
+ * @author The BibleTime team
+ */
+
+class CPrinterDialog;
+class CPrintItem;
+class CSwordBackend;
+
+class KConfig;
+class KProcess;
+
+class CPrinter : public QObject, public KPrinter, public CPointers {
+ Q_OBJECT
+public:
+ struct CPageSize {
+ unsigned int width;
+ unsigned int height;
+ };
+ struct CPagePosition {
+ unsigned int curPage;
+ QRect rect;
+ };
+ struct CPageMargin {
+ unsigned int top;
+ unsigned int right;
+ unsigned int bottom;
+ unsigned int left;
+ };
+
+ CPrinter( QObject* parent );
+ virtual ~CPrinter();
+ /**
+ * Sets the vertical position of the printer's painter.
+ */
+ void setVerticalPos( const int yPos );
+ /**
+ * returns the vertical position of the printer's painter.
+ */
+ const int verticalPos() const;
+ /**
+ * Creates a new page and positions the painter at the beginning of it.
+ */
+ const bool newPage();
+ /**
+ * Returns the margins of the pages.
+ */
+ const CPrinter::CPageMargin& pageMargins() const;
+ /**
+ * Sets all the margins at one time.
+ */
+ void setAllMargins( const CPageMargin margins );
+ /**
+ * Setups the printer using CPrinterDialog.
+ */
+ void setup( QWidget* parent );
+ /**
+ * Starts printing the items.
+ */
+ void print();
+ /**
+ * Sets the printing queue to queue.
+ */
+ void setPrintQueue(ListCPrintItem& queue);
+ /**
+ * Returns the print queue object.
+ */
+ ListCPrintItem& printQueue();
+ /**
+ * Appends items to the printing queue.
+ */
+ void appendItems( ListCPrintItem& items );
+ /**
+ * Appends the item o the queue.
+ */
+ void appendItem( CPrintItem* newItem );
+ /**
+ * Sets the application wide style list to list.
+ */
+ void setStyleList( StyleItemList& list);
+ /**
+ * Returns the list of styles.
+ */
+ StyleItemList& styleList();
+ /**
+ * Reimplementation. cReates a new page.
+ */
+ const QRect contentSize();
+ /**
+ * Returns the config used for this printer object.
+ */
+ KConfig* const config() const;
+ /**
+ * Returns the standard stlye of the printer
+ */
+ CStyle* const standardStyle() const;
+
+public slots: // Public slots
+ /**
+ * Clears the printing queue.
+ */
+ void clearQueue();
+ /**
+ * Emits the signal that the styles changed.
+ */
+ void emitStylesChanged();
+
+protected:
+ /**
+ * Saves the styles to config file.
+ */
+ void saveStyles();
+ /**
+ * Reads the style from config.
+ */
+ void setupStyles();
+ /**
+ *
+ */
+ void saveSettings();
+ /**
+ *
+ */
+ void readSettings();
+ /**
+ * Creates the standard style.
+ */
+ void setupStandardStyle();
+
+private:
+ CPageMargin m_pageMargin;
+ CPagePosition m_pagePosition;
+ ListCPrintItem m_queue;
+ StyleItemList m_styleList;
+ CStyle* m_standardStyle;
+ KConfig* m_config;
+
+ struct PaperSizeCache {
+ bool initialized;
+ bool refresh;
+ KPrinter::PageSize cachedPaper;
+ QRect size;
+ } m_cachedPage;
+
+ bool m_addedItem;
+
+ QString m_styleSaveLocation;
+ QString m_styleDir;
+
+signals: // Signals
+ /**
+ * Is emitted if percent percent of the printing process are completed.
+ */
+ void percentCompleted(const int percent);
+ /**
+ * Is emitted after all items were printed.
+ */
+ void printingFinished();
+ /**
+ * Is emitted when printing was interrupted by the user.
+ */
+ void printingInterrupted();
+ /**
+ * Is emmitted when the printing has started.
+ */
+ void printingStarted();
+ /**
+ * Is emmitted when the first item was added to the queue
+ * This signal is useful to enable the "Clear printer queue"
+ * icon if the queue contains items
+ */
+ void addedFirstQueueItem();
+ /**
+ * Is emmitted when the printing queue was cleared.
+ */
+ void queueCleared();
+ /**
+ * The styles changed.
+ */
+ void sigStylesChanged();
+};
+
+#endif
diff --git a/bibletime/printing/cprintitem.cpp b/bibletime/printing/cprintitem.cpp
new file mode 100644
index 0000000..c189c83
--- /dev/null
+++ b/bibletime/printing/cprintitem.cpp
@@ -0,0 +1,412 @@
+/***************************************************************************
+ cprintitem.cpp - description
+ -------------------
+ begin : Sun Aug 20 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+
+#include "cprintitem.h"
+#include "cprintitemlist.h"
+#include "cstyle.h"
+#include "backend/cswordmoduleinfo.h"
+#include "backend/cswordversekey.h"
+#include "backend/cswordldkey.h"
+#include "backend/chtmlentrydisplay.h"
+#include "frontend/cbtconfig.h"
+#include "util/scoped_resource.h"
+
+
+//Qt includes
+#include <qsimplerichtext.h>
+#include <qlistview.h>
+#include <qregexp.h>
+#include <qstylesheet.h>
+
+//Sword includes
+#include <swmodule.h>
+#include <swkey.h>
+#include <versekey.h>
+
+
+#define PARAGRAPH_SPACE 10 // Space between different paragraphs
+#define STYLE_PART_SPACE 1 //Space between the different parts (header, moduletext ...)
+#define BORDER_SPACE 3 //border between text and rectangle
+
+
+CPrintItem::ListViewItem::ListViewItem( QListView* parent, CPrintItem* printItem )
+ : QListViewItem(parent), m_printItem(printItem) {
+
+};
+
+CPrintItem* const CPrintItem::ListViewItem::printItem() const {
+ return m_printItem;
+};
+
+CStyle* const CPrintItem::ListViewItem::style() const {
+ return (m_printItem) ? m_printItem->style() : 0;
+};
+
+
+CPrintItem::CPrintItem(CSwordModuleInfo* module, const QString& startKey, const QString& stopKey, const QString& description,const CSwordBackend::DisplayOptionsBool displayOptions, const CSwordBackend::FilterOptionsBool filterOptions) :
+ m_style(0), m_headerText(QString::null), m_description(description), m_moduleText(QString::null),
+ m_startKey(startKey), m_module(module), m_listViewItem(0),
+ m_displayOptions(displayOptions), m_filterOptions(filterOptions)
+{
+ m_startEmpty = startKey.isEmpty();
+ m_stopKey = (!m_startEmpty && (startKey != stopKey) ) ? stopKey : QString::null;
+ m_stopEmpty = m_stopKey.isEmpty();
+
+ headerText();
+ moduleText(); //cache the module text, makes printing faster (at least the user thinks this :)
+}
+
+/** Returns the moduletext used by this item. */
+const QString& CPrintItem::moduleText() {
+ /**
+ * If a special text is set use the text.
+ * If the moduleText variable is empty use the CModuleInfo
+ * object to retrieve the text,
+ */
+ if (!m_moduleText.isEmpty()) //cached text
+ return m_moduleText;
+
+ if (m_startEmpty || !m_module)
+ return QString::null;
+
+ CPointers::backend()->setDisplayOptions(m_displayOptions);
+ CPointers::backend()->setFilterOptions(m_filterOptions);
+
+ if (m_stopEmpty) {//only start key
+ util::scoped_ptr<CSwordKey> key(CSwordKey::createInstance(m_module));
+ key->key(m_startKey);
+ m_moduleText = key->renderedText();
+ }
+ else if (m_module->type() == CSwordModuleInfo::Bible || m_module->type() == CSwordModuleInfo::Commentary ) {
+ util::scoped_ptr<CSwordVerseKey> startKey(dynamic_cast<CSwordVerseKey*>(CSwordKey::createInstance(m_module)));
+ util::scoped_ptr<CSwordVerseKey> stopKey(dynamic_cast<CSwordVerseKey*>(CSwordKey::createInstance(m_module)));
+
+ startKey->key(m_startKey);
+ stopKey->key(m_stopKey);
+
+ const QString format = QString::fromLatin1(" <FONT SIZE=\"-2\"><NOBR>%1</NOBR></FONT>");
+ while ( (*startKey) < (*stopKey) || (*startKey) == (*stopKey) ) {
+ m_moduleText += (m_displayOptions.verseNumbers ? format.arg(startKey->Verse()) : QString::null)
++ startKey->renderedText() + (m_displayOptions.lineBreaks ? "<BR>\n" : QString::null);
+ startKey->next(CSwordVerseKey::UseVerse);
+ }
+ }
+
+ m_moduleText.replace(QRegExp("$\n\n+"), "");
+ m_moduleText.replace(QRegExp("$<BR><BR>+"), "");
+ return m_moduleText;
+}
+
+/** Sets the style for this item. */
+void CPrintItem::setStyle( CStyle* newStyle ) {
+ m_style = newStyle;
+}
+
+CStyle*const CPrintItem::style() const {
+ return m_style;
+}
+
+/** Returns the listview item for this printitem. */
+QListViewItem* CPrintItem::listViewItem( CPrintItemList* list ) {
+ deleteListViewItem();
+ m_listViewItem = new ListViewItem( list, this );
+ updateListViewItem();
+ return m_listViewItem;
+}
+
+/** Updates the item. */
+void CPrintItem::updateListViewItem(){
+ if (m_module)
+ m_listViewItem->setText(0, m_module->name() );
+
+ if (!m_startEmpty)
+ m_listViewItem->setText(1,m_startKey);
+
+ if (!m_stopEmpty)
+ m_listViewItem->setText(2,m_stopKey);
+ else if (!m_startEmpty)
+ m_listViewItem->setText(2,m_startKey);
+
+ if (m_style)
+ m_listViewItem->setText(3, m_style->styleName() );
+}
+
+/** */
+QListViewItem* const CPrintItem::listViewItem() const {
+ return m_listViewItem;
+}
+
+/** Deletes the list view item. */
+void CPrintItem::deleteListViewItem(){
+ delete m_listViewItem;
+ m_listViewItem = 0;
+}
+
+/** Draws the content of this item on the page. */
+void CPrintItem::draw(QPainter* p, CPrinter* printer){
+ /**
+ * Print this item
+ * Steps to do for the printing:
+ *
+ * 1. Get the settings (font, colors, alignment etc.) and generate the correct richtext for this (correct alignment)
+ * 2. Apply the settings to the printer's painter object
+ */
+ QFont font;
+ QColor fgColor;
+ QColor bgColor;
+ CStyle::Format* format;
+ CStyle::Format::Frame* frame = 0;
+ int frameThickness = 0;
+ CStyle::Format::Alignment alignment;
+ CStyle::StyleType type = CStyle::Unknown;
+ QString text;
+
+ QColorGroup cg;
+ QPen pen;
+ QBrush brush;
+
+ const bool isUnicode = (m_module && m_module->isUnicode());
+ const int leftMargin = printer->pageMargins().left;
+ const int upperMargin = printer->pageMargins().top;
+ const QRect pageSize = printer->contentSize();
+ const int pageHeight = pageSize.height();
+ const int pageWidth = pageSize.width();
+
+//moved out of the loop for optimization
+ int verticalPos = printer->verticalPos();
+ int arguments = 0;
+ QRect boundingRect; //rectangle for the content
+ QRect br;
+ QRect view;
+ QPen framePen;
+ int movePixs;
+
+ for (int i = 0; i < 3; ++i) {
+ type = static_cast<CStyle::StyleType>(i);
+
+ if (!m_style->hasFormatTypeEnabled(type)) //jump to next part if this is not enabled
+ continue;
+
+ format = m_style->formatForType( type );
+ fgColor = format->color( CStyle::Format::Foreground );
+ bgColor = format->color( CStyle::Format::Background );
+ pen.setColor(fgColor);
+ font = format->font();
+ if (isUnicode) { //enable unicode
+ font.setCharSet( QFont::Unicode );
+ }
+
+ frame = format->frame();
+ frameThickness = frame ? frame->thickness() : 0;
+ alignment = format->alignment();
+ if (type == CStyle::Header)
+ text = headerText();
+ else if (type == CStyle::Description)
+ text = m_description;
+ else
+ text = moduleText();
+
+ p->setFont(font);
+ p->setPen(pen);
+ cg.setColor(QColorGroup::Text, fgColor);
+
+ arguments = Qt::WordBreak;
+ if (alignment == CStyle::Format::Left)
+ arguments |= Qt::AlignLeft;
+ else if (alignment == CStyle::Format::Center)
+ arguments |= Qt::AlignHCenter;
+ else if (alignment == CStyle::Format::Right)
+ arguments |= Qt::AlignRight;
+
+ if ((type == CStyle::Header || type == CStyle::Description) && !text.isEmpty()) {
+ boundingRect = p->boundingRect (
+ leftMargin, //x of upper left corner
+ verticalPos, //y of upper left corner
+ pageWidth - 2*BORDER_SPACE - 2*frameThickness, //pixels to the right from the upper left corner
+ pageHeight - 2*BORDER_SPACE - 2*frameThickness - verticalPos + upperMargin, //pixels down from upper left corner
+ arguments, text
+ );
+
+ //check if the new text fits into the current page page
+ //WARNING: use 2* or 1* frameThickness here??
+ if ( ( boundingRect.height() + 2*BORDER_SPACE + 2*frameThickness + STYLE_PART_SPACE )
+ > ( pageHeight - verticalPos + upperMargin ) )
+ {
+ //this part doesn't fit on the current page
+ printer->newPage();
+ verticalPos = printer->verticalPos();
+ boundingRect = p->boundingRect(
+ leftMargin,
+ verticalPos,
+ pageWidth - 2*BORDER_SPACE - 2*frameThickness,
+ pageHeight- 2*BORDER_SPACE - 2*frameThickness - verticalPos + upperMargin,
+ arguments, text
+ );
+ }
+ br = boundingRect; //rectangle for the background fill
+ br.setLeft(leftMargin);
+ br.setWidth(pageWidth-frameThickness); //because we move in the next lines
+ br.setHeight(br.height()+BORDER_SPACE); //because we move in the next lines
+ br.moveBy(frameThickness, frameThickness);
+ p->fillRect(br, bgColor);
+
+ br = boundingRect; // the rect for the border
+ /**
+ * we have to substract frameThickness/2,
+ * because QPainter paints one half outline and the other part inside the rectangle.
+ */
+ const int halfWidth = (int)((float)frameThickness/2);
+
+// br.setHeight( br.height() + 2*halfWidth + BORDER_SPACE );
+ br.setLeft( leftMargin + halfWidth );
+ br.setTop( br.top() + halfWidth ); //boundingRect is moved by 2*halfWidth down -> use +halfWidth !!
+ br.setWidth( pageWidth - 2*halfWidth);
+ br.setHeight( br.height() + 2*halfWidth + BORDER_SPACE );
+
+// boundingRect.setWidth(boundingRect.width()+5);//HACK to avoid cut letters
+ boundingRect.moveBy(BORDER_SPACE + frameThickness, frameThickness);
+// arguments |= Qt::AlignVCenter; //WARNING: Right here? Will it change the boundingrect??
+
+ p->setClipRect(
+ upperMargin,
+ leftMargin,
+ pageWidth,
+ pageHeight
+ );
+
+ p->drawText(boundingRect, arguments, text);
+
+ p->setClipping(false);
+
+ printer->setVerticalPos(boundingRect.top() + boundingRect.height() + 2*frameThickness + STYLE_PART_SPACE);
+ verticalPos = printer->verticalPos();
+
+ if (frame) {
+ framePen = pen;
+ framePen.setWidth( frameThickness );
+ framePen.setColor( frame->color() );
+ framePen.setStyle( frame->lineStyle() );
+ p->setPen( framePen );
+
+ p->drawRect( br );
+ }
+ }
+ else if (type == CStyle::ModuleText) {
+ p->save();
+
+ if (isUnicode)
+ font = CBTConfig::get( CBTConfig::unicode );
+
+ if (alignment == CStyle::Format::Center)
+ text = QString::fromLatin1("<CENTER>%1</CENTER>").arg(text);
+ else if (alignment == CStyle::Format::Right)
+ text = QString::fromLatin1("<P ALIGN=\"RIGHT\">%1</P>").arg(text);
+ QSimpleRichText richText(
+ text,
+ font,
+ QString::null,
+ QStyleSheet::defaultSheet(),
+ QMimeSourceFactory::defaultFactory(),
+ pageHeight + upperMargin - verticalPos - 2*frameThickness - 2*BORDER_SPACE
+ );
+
+ richText.setWidth( p, pageWidth-2*frameThickness-2*BORDER_SPACE );
+ view = QRect( //the content area of the whole page
+ leftMargin + frameThickness + BORDER_SPACE,
+ upperMargin + frameThickness + BORDER_SPACE,
+ pageWidth - 2*frameThickness - 2*BORDER_SPACE,
+ pageHeight - 2*frameThickness - 2*BORDER_SPACE
+ );
+
+ int translated = 0;
+ do {
+ if ((int)(verticalPos - upperMargin + richText.height() - translated) <= (int)(pageHeight) ) {
+ //text fits on current page
+ br = QRect (
+ leftMargin + frameThickness,
+ verticalPos + frameThickness,
+ pageWidth - frameThickness,
+ richText.height() - translated + frameThickness + BORDER_SPACE
+ );
+ }
+ else { //doesn't fit completely on current page, fill to bottom of the page
+ br = QRect(
+ leftMargin + frameThickness,
+ verticalPos + frameThickness,
+ pageWidth - frameThickness,
+ pageHeight - verticalPos + upperMargin - frameThickness
+ );
+ }
+ br.moveBy(0,translated); //we have to move down as far as the painter moved
+ p->setClipRect(
+ upperMargin,
+ leftMargin,
+ pageWidth,
+ pageHeight
+ );
+ p->fillRect(br,QBrush(bgColor)); //fill rect with background color
+ if (frame) {
+ br.moveBy( (int)(-(float)frameThickness/2), (int)(-(float)frameThickness/2) );
+
+ framePen = pen;
+ framePen.setWidth( frameThickness );
+ framePen.setColor( frame->color() );
+ framePen.setStyle( frame->lineStyle() );
+ p->setPen( framePen );
+
+ p->drawRect(br);
+ }
+ p->setClipping(false);
+
+ richText.draw(p, leftMargin+frameThickness+BORDER_SPACE, verticalPos+frameThickness+BORDER_SPACE, view, cg);
+ movePixs = //move down the painted area height
+ (((int)richText.height()-translated) > (int)(pageHeight - verticalPos + upperMargin ))
+ ? (pageHeight - verticalPos + upperMargin) //move to bottom of page
+ : richText.height() - translated + 2*frameThickness + 2*BORDER_SPACE; //only move the painted area
+
+ printer->setVerticalPos(verticalPos + movePixs);
+
+ view.moveBy( 0,movePixs);
+ p->translate( 0,-movePixs);
+ translated += movePixs;
+ if ( view.top() >= richText.height() ) //bottom or top(default)
+ break;
+
+ printer->newPage();
+ verticalPos = printer->verticalPos();
+ } while (true);
+ p->restore();
+ }
+ }
+ printer->setVerticalPos(printer->verticalPos() + PARAGRAPH_SPACE);
+}
+
+/** Updates and returns the header text. */
+const QString& CPrintItem::headerText() {
+ if (!m_headerText.isEmpty()) // cached?
+ return m_headerText;
+
+ if (m_startEmpty)
+ return QString::null;
+ if (m_stopEmpty)
+ m_headerText = m_startKey;
+ else {//start and stop key do exist and are different
+ m_headerText = QString::fromLatin1("%1 - %2").arg(m_startKey).arg(m_stopKey);
+ }
+ return m_headerText;
+}
diff --git a/bibletime/printing/cprintitem.h b/bibletime/printing/cprintitem.h
new file mode 100644
index 0000000..f60572e
--- /dev/null
+++ b/bibletime/printing/cprintitem.h
@@ -0,0 +1,103 @@
+/***************************************************************************
+ cprintitem.h - description
+ -------------------
+ begin : Sun Aug 20 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CPRINTITEM_H
+#define CPRINTITEM_H
+
+//BibleTime includes
+#include "frontend/cbtconfig.h"
+
+//Qt includes
+#include <qobject.h>
+#include <qguardedptr.h>
+#include <qlist.h>
+#include <qlistview.h>
+
+class CSwordKey;
+class CSwordModuleInfo;
+class CStyle;
+class CPrinter;
+class CPrintItem;
+class CPrintItemList;
+
+typedef QList<CPrintItem> ListCPrintItem;
+
+/**
+ * The class which implements the printable items.
+ * @author The BibleTime team
+ */
+class CPrintItem {
+public:
+ class ListViewItem : public QListViewItem {
+ public:
+ ListViewItem( QListView* parent, CPrintItem* printItem );
+ CPrintItem* const printItem() const;
+ CStyle* const style() const;
+ private:
+ CPrintItem* m_printItem;
+ };
+
+ CPrintItem(CSwordModuleInfo* module, const QString& startKey, const QString& stopKey, const QString& description = QString::null, const CSwordBackend::DisplayOptionsBool displayOptions = CBTConfig::getDisplayOptionDefaults(),const CSwordBackend::FilterOptionsBool filterOptions = CBTConfig::getFilterOptionDefaults() );
+ /**
+ * Sets the style for this item.
+ */
+ void setStyle( CStyle* );
+ /**
+ * Sets the style for this item.
+ */
+ CStyle* const style() const;
+ /**
+ * Returns the listview item for this printitem.
+ */
+ QListViewItem* listViewItem( CPrintItemList* );
+ /**
+ * Updates the item.
+ */
+ void updateListViewItem();
+ /**
+ * Returns the used ListView item.
+ */
+ QListViewItem* const listViewItem() const;
+ /**
+ * Deletes the list view item.
+ */
+ void deleteListViewItem();
+ /**
+ * Draws the content of this item on the page.
+ */
+ void draw(QPainter* p, CPrinter* printer);
+
+private: // Protected attributes
+ const QString& headerText();
+ const QString& moduleText();
+
+ CStyle* m_style;
+ QString m_headerText;
+ QString m_description;
+ QString m_moduleText;
+ QString m_startKey;
+ QString m_stopKey;
+ bool m_startEmpty;
+ bool m_stopEmpty;
+ CSwordModuleInfo* m_module;
+ QListViewItem* m_listViewItem;
+
+ CSwordBackend::DisplayOptionsBool m_displayOptions;
+ CSwordBackend::FilterOptionsBool m_filterOptions;
+};
+
+#endif
diff --git a/bibletime/printing/cprintitemlist.cpp b/bibletime/printing/cprintitemlist.cpp
new file mode 100644
index 0000000..665777f
--- /dev/null
+++ b/bibletime/printing/cprintitemlist.cpp
@@ -0,0 +1,126 @@
+/***************************************************************************
+ cprintitemlist.cpp - description
+ -------------------
+ begin : Sun Aug 20 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//Own includes
+#include "cprintitemlist.h"
+
+//Qt includes
+#include <qstring.h>
+
+//KDE includes
+#include <klocale.h>
+
+CPrintItemList::CPrintItemList( ListCPrintItem* items, QWidget *parent, const char *name ) : KListView(parent,name) {
+ m_items = items;
+ initView();
+
+ insertItems(m_items);
+}
+
+CPrintItemList::~CPrintItemList(){
+ for (m_items->first(); m_items->current(); m_items->next()) {
+ if (m_items->current())
+ m_items->current()->deleteListViewItem();
+ }
+}
+
+/** Initializes the view. */
+void CPrintItemList::initView(){
+ setAllColumnsShowFocus(true);
+ addColumn(i18n("Module"),-1);
+ addColumn(i18n("From"), -1);
+ addColumn(i18n("To"), -1);
+ addColumn(i18n("Style"), -1);
+
+ setSelectionMode( QListView::Extended );
+}
+
+/** Inserts the items of the list into the tree. */
+void CPrintItemList::insertItems( ListCPrintItem* itemList ) {
+ const bool sameList = (itemList == m_items);
+ for(itemList->last(); itemList->current(); itemList->prev() ) {
+ if (!sameList)
+ m_items->append(itemList->current());
+ itemList->current()->listViewItem(this); //insert the QListViewItem into the list
+ }
+}
+
+/** Sets the tree to contain the items of the list. Other items will be removed. */
+void CPrintItemList::setItems( ListCPrintItem* itemList ){
+ for (m_items->first(); m_items->current(); m_items->next()) {
+ if (m_items->current())
+ m_items->current()->deleteListViewItem();
+ }
+ insertItems( itemList );
+}
+
+/** Deletes the current item. */
+void CPrintItemList::deleteSelectedItems(){
+ QList<QListViewItem> items = selectedItems();
+ if (!items.count())
+ return;
+ const bool autoDelete = items.autoDelete();
+
+ CPrintItem* p = 0;
+ for (items.first(); items.current(); items.next()) {
+ if ( CPrintItem::ListViewItem* item = dynamic_cast<CPrintItem::ListViewItem*>(items.current()) ) {
+ if (!(p = item->printItem()))
+ continue;
+ m_items->removeRef(p);
+ p->deleteListViewItem();
+ if (!autoDelete)
+ delete p;
+ }
+ }
+}
+
+/** Moves the item one item up. */
+void CPrintItemList::moveUp(){
+ QList<QListViewItem> items = selectedItems();
+ for (items.first(); items.current(); items.next()) {
+ QListViewItem* current = items.current();
+ if (current && current->itemAbove() && current->itemAbove()->itemAbove()) {
+ current->moveItem( current->itemAbove()->itemAbove() );
+ }
+ }
+}
+
+/** Moves the selected entry one entry down. */
+void CPrintItemList::moveDown(){
+ QList<QListViewItem> items = selectedItems();
+ for (items.last(); items.current(); items.prev()) {
+ QListViewItem* current = items.current();
+ if (current && current->itemBelow()) {
+ current->moveItem( current->itemBelow() );
+ }
+ }
+}
+
+/** Applies the style to the selected items. */
+void CPrintItemList::applyStyleToSelected( CStyle* style){
+ CPrintItem* printItem;
+ CPrintItem::ListViewItem* item;
+ QList<QListViewItem> list = selectedItems();
+ for ( QListViewItem* i = list.first(); i; i = list.next()) {
+ if ((item = dynamic_cast<CPrintItem::ListViewItem*>(i))) {
+ printItem = item->printItem();
+ printItem->setStyle(style);
+ printItem->updateListViewItem();
+ }
+ }
+}
+
diff --git a/bibletime/printing/cprintitemlist.h b/bibletime/printing/cprintitemlist.h
new file mode 100644
index 0000000..a0d7060
--- /dev/null
+++ b/bibletime/printing/cprintitemlist.h
@@ -0,0 +1,69 @@
+/***************************************************************************
+ cListCPrintItem.h - description
+ -------------------
+ begin : Sun Aug 20 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CPRINTITEMLIST_H
+#define CPRINTITEMLIST_H
+
+#include <qwidget.h>
+#include <qlist.h>
+#include <klistview.h>
+
+#include "cprintitem.h"
+
+/**A KListView derived class which handles CPrintItem classes
+ *@author The BibleTime team
+ */
+class CPrintItemList : public KListView {
+ Q_OBJECT
+public:
+ CPrintItemList(ListCPrintItem* items, QWidget *parent=0, const char *name=0);
+ ~CPrintItemList();
+ /**
+ * Sets the tree to contain the items of the list. Other items will be removed.
+ */
+ virtual void setItems( ListCPrintItem* itemList);
+ /**
+ * Inserts the items of the list into the tree.
+ */
+ virtual void insertItems( ListCPrintItem* itemList );
+ /**
+ * Initializes the view.
+ */
+ virtual void initView();
+ /**
+ * Applies the style to the selected items.
+ */
+ void applyStyleToSelected( CStyle* );
+
+public slots: // Public slots
+ /**
+ * Moves the selected entry one entry down.
+ */
+ void moveDown();
+ /**
+ * Moves the item one item up.
+ */
+ void moveUp();
+ /**
+ * Deletes the current item.
+ */
+ void deleteSelectedItems();
+
+private:
+ ListCPrintItem* m_items;
+};
+#endif
diff --git a/bibletime/printing/cstyle.cpp b/bibletime/printing/cstyle.cpp
new file mode 100644
index 0000000..ac01aa6
--- /dev/null
+++ b/bibletime/printing/cstyle.cpp
@@ -0,0 +1,495 @@
+/***************************************************************************
+ cstyle.cpp - description
+ -------------------
+ begin : Sun Aug 20 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cstyle.h"
+#include "cstylelist.h"
+
+
+//Qt includes
+#include <qapp.h>
+#include <qdom.h>
+#include <qfile.h>
+#include <qlistview.h>
+#include <qstring.h>
+#include <qtextstream.h>
+
+//KDE includes
+#include <klocale.h>
+
+#define CURRENT_SYNTAX_VERSION 1
+
+CStyle::Format::Format(const CStyle::StyleType type) : m_frame(0), m_type(type) {
+ clearData();
+}
+
+CStyle::Format::Format(const Format& f) {
+ m_BGColor = f.m_BGColor;
+ m_FGColor = f.m_FGColor;
+ m_alignment = f.m_alignment;
+ m_font = f.m_font;
+ m_hasFrame = f.m_hasFrame;
+ m_frame = 0;
+ if (m_hasFrame) {
+ Frame* newFrame = frame();//create
+ *newFrame = *f.m_frame; //copy content
+ }
+ m_type = f.m_type;
+};
+
+CStyle::Format::~Format(){
+ delete m_frame;
+}
+
+/** Returns the font of this style. */
+const QFont& CStyle::Format::font() const {
+ return m_font;
+}
+
+/** sets the font of this format. */
+void CStyle::Format::setFont( QFont newFont ) {
+ m_font = newFont;
+}
+
+/** Returns the background color of this format. */
+const QColor& CStyle::Format::color( const Color type ) const {
+ switch (type) {
+ case Foreground:
+ return m_FGColor;
+ case Background:
+ return m_BGColor;
+ };
+ return Qt::white; //shouldn't be executed
+}
+
+/** Sets the foreground color of this format. */
+void CStyle::Format::setColor( const Color type, const QColor& newColor ) {
+ switch (type) {
+ case Foreground:
+ m_FGColor = newColor;
+ break;
+ case Background:
+ m_BGColor = newColor;
+ break;
+ };
+}
+
+/** Returns the frame if we have one. Otherwise we return 0. */
+CStyle::Format::Frame* const CStyle::Format::frame() {
+ if (m_hasFrame)
+ return !m_frame ? (m_frame = new CStyle::Format::Frame) : m_frame;
+ return 0;
+}
+
+/** Sets the frame of this style. */
+void CStyle::Format::setFrameEnabled( const bool hasFrame ) {
+ m_hasFrame = hasFrame;
+ if (!m_hasFrame) {
+ delete m_frame;
+ m_frame = 0;
+ };
+}
+
+/** Returns the alignement of this style format. */
+const CStyle::Format::Alignment& CStyle::Format::alignment() const {
+ return m_alignment;
+}
+
+/** Sets the alignement flags of this style format. */
+void CStyle::Format::setAlignment( const Alignment newAlignment) {
+ m_alignment = newAlignment;
+}
+
+/** Resets the data variables. */
+void CStyle::Format::clearData(){
+ m_BGColor = Qt::white;
+ m_FGColor = Qt::black;
+ delete m_frame;
+ m_frame = 0;
+ m_hasFrame = false;
+ m_font = QApplication::font();
+ m_alignment = Format::Left;
+}
+
+const CStyle::StyleType CStyle::Format::type() const {
+ return m_type;
+}
+
+CStyle::Format::Frame::Frame() {
+ m_thickness = 1;
+ m_color = Qt::black;
+ m_lineStyle = Qt::SolidLine;
+}
+
+CStyle::Format::Frame::Frame(const Frame& f) {
+ m_thickness = f.m_thickness;
+ m_color = f.m_color;
+ m_lineStyle = f.m_lineStyle;
+}
+
+/** Returns the thickness of this frame. */
+const int& CStyle::Format::Frame::thickness() const {
+ return m_thickness;
+}
+
+/** Sets te thickness of this frame. */
+void CStyle::Format::Frame::setThickness( const int newThickness ) {
+ m_thickness = newThickness;
+}
+
+/** Returns the style how to paint the lines of this frame. */
+const Qt::PenStyle& CStyle::Format::Frame::lineStyle() const {
+ return m_lineStyle;
+}
+
+/** Sets the style how to paint the lines. */
+void CStyle::Format::Frame::setLineStyle( const Qt::PenStyle newLineStyle ){
+ m_lineStyle = newLineStyle;
+}
+
+/** Returns the color of this frame. */
+const QColor& CStyle::Format::Frame::color() const {
+ return m_color;
+}
+
+/** Sets the color of this frame. */
+void CStyle::Format::Frame::setColor( const QColor& newColor ) {
+ m_color = newColor;
+}
+
+CStyle::CStyle() :
+ m_headerFormat(new Format(CStyle::Header)),
+ m_descriptionFormat(new Format(CStyle::Description)),
+ m_moduleTextFormat(new Format(CStyle::ModuleText))
+{
+
+ //dummy command to translate names of standard styles
+ i18n("Standard");
+ i18n("Colored style for larger test portions");
+ i18n("Black&White for larger test portions");
+
+ m_listViewItem = 0;
+ m_isHeaderFormatEnabled = m_isDescriptionFormatEnabled = m_isModuleTextFormatEnabled = true;
+
+ setStyleName( i18n("unknown name") );
+};
+
+CStyle::CStyle( const QString filename ) :
+ m_headerFormat(new Format(CStyle::Header)),
+ m_descriptionFormat(new Format(CStyle::Description)),
+ m_moduleTextFormat(new Format(CStyle::ModuleText))
+{
+ m_listViewItem = 0;
+ m_isHeaderFormatEnabled = m_isDescriptionFormatEnabled = m_isModuleTextFormatEnabled = true;
+
+ load(filename);
+}
+
+CStyle::~CStyle(){
+}
+
+/** Returns the proper CStyleFormat for the given type. */
+CStyle::Format* const CStyle::formatForType( const CStyle::StyleType type) {
+ switch (type) {
+ case Header:
+ return m_headerFormat;
+ case Description:
+ return m_descriptionFormat;
+ case ModuleText:
+ return m_moduleTextFormat;
+ default:
+ return 0;
+ }
+}
+
+/** Set the printing of the header (true enables it). */
+const bool CStyle::hasFormatTypeEnabled( const CStyle::StyleType type) const {
+ switch (type) {
+ case Header:
+ return m_isHeaderFormatEnabled;
+ case Description:
+ return m_isDescriptionFormatEnabled;
+ case ModuleText:
+ return m_isModuleTextFormatEnabled;
+ default:
+ return false;
+ }
+}
+
+/** Set the printing of the header (true enables it). */
+void CStyle::setFormatTypeEnabled( const CStyle::StyleType type, const bool setEnabled) {
+ switch (type) {
+ case Header:
+ m_isHeaderFormatEnabled = setEnabled;
+ break;
+
+ case Description:
+ m_isDescriptionFormatEnabled = setEnabled;
+ break;
+
+ case ModuleText:
+ m_isModuleTextFormatEnabled = setEnabled;
+ break;
+
+ default:
+ break;
+ }
+}
+
+/** Returns a QListViewItem for inserted in list. */
+QListViewItem* const CStyle::listViewItem( CStyleList* const list ){
+ if (!list) {
+ if (!m_listViewItem)
+ return 0;
+ else
+ return m_listViewItem;
+ }
+ deleteListViewItem();
+ m_listViewItem = new QListViewItem( list );
+ updateListViewItem();
+ return m_listViewItem;
+}
+
+/** Returns the style name */
+const QString& CStyle::styleName() const{
+ return m_name;
+}
+
+/** Sets the name of the style. */
+void CStyle::setStyleName( const QString name ){
+ m_name = name;
+}
+
+/** Clears all variables and sets them back */
+void CStyle::clearData(){
+// qDebug("CStyle::clearData()");
+ deleteListViewItem();
+ m_name = QString::null;
+ m_isDescriptionFormatEnabled = m_isHeaderFormatEnabled = m_isModuleTextFormatEnabled = true;
+}
+
+/** Updates the Listview items */
+void CStyle::updateListViewItem(){
+// qWarning("CStyle::updateListViewItem() for %s", m_name.latin1());
+ m_listViewItem->setText(0, styleName() );
+}
+
+/** Deletes the list view item. */
+void CStyle::deleteListViewItem(){
+ delete m_listViewItem;
+ m_listViewItem = 0;
+}
+
+/** Loads the profile from a XML file. */
+const bool CStyle::load(const QString& filename){
+/**
+* The XML file should look like this:
+*
+ <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE DOC >
+ <BibleTimePrintingStyle syntaxVersion="1" name="Standard" translate="1">
+ <HEADER enabled="1" alignment="center">
+ <COLORS bgcolor="black" fgcolor="white">
+ <FONT family="Arial" charset="2" pointsize="10" weight="1" italic="0">
+ <FRAME enabled="1" color="blue" style="1" thickness="2">
+ </HEADER>
+ </BibleTimePrintingStyle>
+*/
+ QFile file(filename);
+ if (!file.exists()) {
+ qWarning("file doesn't exist");
+ return false;
+ }
+
+ QDomDocument doc;
+ if (file.open(IO_ReadOnly)) {
+ QTextStream t(&file);
+ t.setEncoding(QTextStream::UnicodeUTF8);
+ doc.setContent( t.read() );
+ file.close();
+ }
+ else {
+ qWarning("CStyle::load: unable to open file %s", filename.latin1());
+ return false;
+ };
+
+ QDomElement document = doc.documentElement();
+ if(document.tagName() != "BibleTimePrintingStyle") {
+ qWarning("CProfile::load: Missing BibleTime doc");
+ return false;
+ }
+ if (document.hasAttribute("name")) { //name of the printing style
+ m_name = document.attribute("name");
+ if (document.hasAttribute("translate") && document.attribute("translate").toInt()) {
+ m_name = i18n(m_name.local8Bit()); //standard styles should be translated
+ }
+ }
+
+ QDomElement elem = document.firstChild().toElement();
+ while (!elem.isNull()) {
+ StyleType type = Unknown;
+ if (elem.tagName() == "HEADER") {
+ type = Header;
+ }
+ else if (elem.tagName() == "DESCRIPTION") {
+ type = Description;
+ }
+ else if (elem.tagName() == "MODULETEXT") {
+ type = ModuleText;
+ }
+ Format* p = formatForType(type);
+
+ if (!p || type == Unknown)
+ continue;
+
+ if (elem.hasAttribute("enabled")) {
+ setFormatTypeEnabled(type, elem.attribute("enabled").toInt());
+ }
+ if (elem.hasAttribute("alignment")) {
+ const int align = elem.attribute("alignment").toInt();
+ p->setAlignment( static_cast<Format::Alignment>(align) );
+ }
+
+ QDomElement object = elem.namedItem("COLORS").toElement();
+ if (!object.isNull()) {
+ if (object.hasAttribute("bgcolor"))
+ p->setColor(Format::Background, QColor(object.attribute("bgcolor")));
+ if (object.hasAttribute("fgcolor"))
+ p->setColor(Format::Foreground, QColor(object.attribute("fgcolor")));
+ }
+
+ object = elem.namedItem("FONT").toElement();
+ if (!object.isNull()) {
+ QString family = object.hasAttribute("family") ? object.attribute("family") : QApplication::font().family();
+ unsigned int size = object.hasAttribute("pointsize") ? object.attribute("pointsize").toInt() : QApplication::font().pointSize();
+ const int weight = object.hasAttribute("weight") ? object.attribute("weight").toInt() : QFont::Normal;
+ const bool italic = object.hasAttribute("italic") ? static_cast<bool>(object.attribute("italic").toInt()) : false;
+ const QFont::CharSet charset = object.hasAttribute("charset") ? static_cast<QFont::CharSet>(object.attribute("charset").toInt()) : QApplication::font().charSet();
+
+ if (family.isEmpty())
+ family = QApplication::font().family();
+ if (!size)
+ size = QApplication::font().pointSize();
+
+ p->setFont( QFont(family, size, weight, italic, charset) );
+ }
+
+ object = elem.namedItem("FRAME").toElement();
+ if (!object.isNull()) { //frame-section exists
+ const bool enabled = object.hasAttribute("enabled") ? object.attribute("enabled").toInt() : false;
+ p->setFrameEnabled(enabled);
+ if (Format::Frame* frame = p->frame()) {
+ const QColor color = object.hasAttribute("color") ? QColor(object.attribute("color")) : Qt::white;
+ Qt::PenStyle style = object.hasAttribute("style") ? static_cast<Qt::PenStyle>(object.attribute("style").toInt()) : Qt::SolidLine;
+ const int thickness = object.hasAttribute("thickness") ? object.attribute("thickness").toInt() : 1;
+
+ frame->setColor(color);
+ frame->setLineStyle(style);
+ frame->setThickness(thickness);
+ }
+ }
+ elem = elem.nextSibling().toElement();
+ }
+ return true;
+}
+
+const bool CStyle::save( const QString& filename ){
+/* Saved file should look like this:
+
+ <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE DOC >
+ <BibleTimePrintingStyle syntaxVersion="1" name="Standard" translate="1">
+ <HEADER enabled="1" alignment="center">
+ <COLORS bgcolor="black" fgcolor="white">
+ <FONT family="Arial" charset="2" pointsize="10" weight="1" italic="0">
+ <FRAME enabled="1" color="blue" style="1" thickness="2">
+ </HEADER>
+ // same for DESCRIPTION and MODULETEXT
+
+ </BibleTimePrintingStyle>
+*/
+ bool ret = false;
+
+ QDomDocument doc("DOC");
+ doc.appendChild( doc.createProcessingInstruction( "xml", "version=\"1.0\" encoding=\"UTF-8\"" ) );
+
+ QDomElement content = doc.createElement("BibleTimePrintingStyle");
+ content.setAttribute("syntaxVersion", CURRENT_SYNTAX_VERSION);
+ content.setAttribute("name", m_name);
+ content.setAttribute("translate", 0); //don't trabslate styles except of prinstalled ones
+ doc.appendChild(content);
+
+ for (unsigned int i = Header; i <= ModuleText; ++i) {
+ QDomElement elem;
+
+ const StyleType type = static_cast<StyleType>(i);
+ switch (type) {
+ case Header:
+ elem = doc.createElement("HEADER");
+ break;
+ case Description:
+ elem = doc.createElement("DESCRIPTION");
+ break;
+ case ModuleText:
+ elem = doc.createElement("MODULETEXT");
+ break;
+ default:
+ break;
+ };
+ if (elem.isNull()) //shouldn't happen
+ continue;
+ content.appendChild(elem);
+
+ Format* format = formatForType(type);
+
+ elem.setAttribute("enabled", hasFormatTypeEnabled(type));
+ elem.setAttribute("alignment", static_cast<int>(format->alignment()));
+
+ QDomElement object = doc.createElement("COLORS");
+ object.setAttribute("bgcolor", format->color(Format::Background).name());
+ object.setAttribute("fgcolor", format->color(Format::Foreground).name());
+ elem.appendChild(object);
+
+ QFont font = format->font();
+ object = doc.createElement("FONT");
+ object.setAttribute("family", font.family());
+ object.setAttribute("pointsize", font.pointSize());
+ object.setAttribute("weight", font.weight());
+ object.setAttribute("italic", font.italic());
+ object.setAttribute("charset", static_cast<int>(font.charSet()));
+ elem.appendChild(object);
+
+ object = doc.createElement("FRAME");
+ Format::Frame* frame = format->frame();
+ object.setAttribute("enabled", static_cast<bool>(frame) );
+ if (frame) {
+ object.setAttribute("color", frame->color().name());
+ object.setAttribute("thickness", frame->thickness());
+ object.setAttribute("style", static_cast<int>(frame->lineStyle()) );
+ }
+ elem.appendChild(object);
+ };
+ ret = false;
+
+
+ QFile file(filename);
+ if (file.open(IO_WriteOnly)) {
+ ret = true;
+ QTextStream t( &file ); // use a text stream
+ t.setEncoding(QTextStream::UnicodeUTF8);
+ t << doc.toString();
+ file.close();
+ }
+ return ret;
+}
diff --git a/bibletime/printing/cstyle.h b/bibletime/printing/cstyle.h
new file mode 100644
index 0000000..a642e90
--- /dev/null
+++ b/bibletime/printing/cstyle.h
@@ -0,0 +1,211 @@
+/***************************************************************************
+ cstyle.h - description
+ -------------------
+ begin : Sun Aug 20 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//BibleTime includes
+#include "cprinter.h"
+
+//Qt includes
+#include <qlistview.h>
+#include <qlist.h>
+
+
+#ifndef CSTYLE_H
+#define CSTYLE_H
+
+//forward class decalarations
+class CStyleList;
+class CStyle;
+
+class QListViewItem;
+class QListView;
+
+typedef QList<CStyle> StyleItemList;
+
+/** The class containing the properties requiredfor prinitng styles.
+ * @author The BibleTime team
+ */
+class CStyle {
+public:
+
+ enum StyleType {
+ Header = 0, /** The header displayed over each printed item */
+ Description = 1 /** The description, used in bookmarks for example */,
+ ModuleText = 2 /** The real text of the entry or the range of verses */,
+ Unknown /** Unknown for us, should not be used */
+ };
+
+ /**
+ * A class which contains methods to support a format for the CStyle class.
+ * @author The BibleTime team
+ * @version $Id: cstyle.h,v 1.12 2002/04/07 13:44:11 joachim Exp $
+ */
+ class Format {
+ public:
+ class Frame {
+ public:
+ Frame();
+ Frame(const Frame& f);
+ /**
+ * Sets the color of this frame.
+ */
+ void setColor( const QColor& );
+ /**
+ * Returns the color of this frame.
+ */
+ const QColor& color() const;
+ /**
+ * Sets the style how to paint the lines.
+ */
+ void setLineStyle( const Qt::PenStyle );
+ /**
+ * Returns the style how to paint the lines of this frame.
+ */
+ const Qt::PenStyle& lineStyle() const;
+ /**
+ * Sets te thickness of this frame.
+ */
+ void setThickness( const int );
+ /**
+ * Returns the thickness of this frame.
+ */
+ const int& thickness() const;
+
+ private:
+ QColor m_color;
+ Qt::PenStyle m_lineStyle;
+ int m_thickness;
+ };
+
+ enum Alignment { Left, Center, Right, Justification};
+ enum Color { Background, Foreground };
+
+ Format(const CStyle::StyleType type = CStyle::Unknown);
+ Format(const Format& f);
+ ~Format();
+ const CStyle::StyleType type() const;
+ /**
+ * Returns the foreground color of this format.
+ */
+ const QColor& color( const Color type ) const;
+ /**
+ * Sets the background color of this format.
+ */
+ void setColor( const Color type, const QColor& );
+ /**
+ * sets the font of this format.
+ */
+ void setFont( QFont );
+ /**
+ * Returns the font of this style.
+ */
+ const QFont& font() const;
+ /**
+ * Sets the alignement flags of this style format.
+ */
+ void setAlignment( const CStyle::Format::Alignment );
+ /**
+ * Returns the alignement of this style format.
+ */
+ const CStyle::Format::Alignment& alignment() const;
+ /**
+ * Sets the frame of this style.
+ */
+ void setFrameEnabled( const bool hasFrame );
+ /**
+ * Returns the frame if we have one. Otherwise we return 0.
+ */
+ Frame* const frame();
+
+ private:
+ void clearData();
+
+ QFont m_font;
+ QColor m_FGColor;
+ QColor m_BGColor;
+ bool m_hasFrame;
+ Frame* m_frame;
+ Alignment m_alignment;
+ CStyle::StyleType m_type;
+ };
+
+ CStyle(); //standard constructor, doesn't load from file
+ virtual ~CStyle();
+ /**
+ * Returns the proper CStyleFormat for the given type.
+ */
+ CStyle::Format* const formatForType( const CStyle::StyleType );
+ /**
+ * Set the printing of the header (true enables it).
+ */
+ void setFormatTypeEnabled( const CStyle::StyleType, const bool );
+ /**
+ * Returns true if we have the given type enabled.
+ */
+ const bool hasFormatTypeEnabled( const CStyle::StyleType ) const;
+ /**
+ * Returns a QListViewItem for inserted in list.
+ */
+ QListViewItem* const listViewItem( CStyleList* const list = 0 );
+ /**
+ * Sets the name of the style.
+ */
+ void setStyleName( const QString name );
+ /**
+ * Returns the style name
+ */
+ const QString& styleName() const;
+ /**
+ * Updates the Listview items
+ */
+ void updateListViewItem();
+ /**
+ * Deletes the list view item.
+ */
+ void deleteListViewItem();
+ /**
+ * Loads the profile from a XML file.
+ */
+ const bool load(const QString& file);
+ /**
+ * Saves the style to the XML file.
+ */
+ const bool save( const QString& file );
+
+protected:
+ friend class CPrinter;
+ CStyle( const QString filename );
+
+private:
+ /**
+ * Clears all variables and sets them back
+ */
+ void clearData();
+
+ QString m_name;
+
+ Format* m_headerFormat;
+ Format* m_descriptionFormat;
+ Format* m_moduleTextFormat;
+
+ bool m_isHeaderFormatEnabled;
+ bool m_isModuleTextFormatEnabled;
+ bool m_isDescriptionFormatEnabled;
+
+ QListViewItem* m_listViewItem;
+};
+
+#endif
diff --git a/bibletime/printing/cstyleeditordialog.cpp b/bibletime/printing/cstyleeditordialog.cpp
new file mode 100644
index 0000000..be19ccd
--- /dev/null
+++ b/bibletime/printing/cstyleeditordialog.cpp
@@ -0,0 +1,344 @@
+/***************************************************************************
+ cstyleeditordialog.cpp - description
+ -------------------
+ begin : Sun Aug 20 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cstyleeditordialog.h"
+
+//KDE includes
+#include <kcombobox.h>
+#include <klocale.h>
+#include <kcolorbutton.h>
+#include <kfontdialog.h>
+
+//Qt includes
+#include <qlineedit.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qgroupbox.h>
+#include <qcheckbox.h>
+#include <qwidget.h>
+#include <qbuttongroup.h>
+#include <qvbuttongroup.h>
+#include <qhbuttongroup.h>
+#include <qradiobutton.h>
+#include <qspinbox.h>
+
+CStyleEditorDialog::CStyleEditorDialog(CStyle* style, QWidget *parent, const char *name )
+ : KDialogBase(parent,name, true, i18n("style editor")) {
+ m_style = style;
+ m_formatEnabled = false;
+
+ initView();
+ readSettings();
+ styleTypeChanged("Header");
+}
+
+CStyleEditorDialog::~CStyleEditorDialog(){
+ saveSettings();
+}
+
+/** Initializes te view. */
+void CStyleEditorDialog::initView(){
+ enableButtonSeparator( true );
+ QFrame *mainWidget = makeMainWidget();
+ QLabel* label = 0;
+
+ QVBoxLayout *topLayout = new QVBoxLayout( mainWidget, 5, 5 );
+
+ QHBoxLayout *hboxLayout = new QHBoxLayout(0, 5, 5);
+ m_styleNameEdit = new QLineEdit( mainWidget );
+ label = new QLabel(m_styleNameEdit, i18n("Name of style:"), this);
+ hboxLayout->addWidget(label);
+ hboxLayout->addWidget(m_styleNameEdit);
+
+ topLayout->addLayout(hboxLayout);
+
+ hboxLayout = new QHBoxLayout(0, 5, 5);
+ m_styleTypeChooser = new KComboBox( mainWidget, "styleTypeChooser" );
+ label = new QLabel( m_styleTypeChooser, i18n("Choose the part of the style:"), mainWidget );
+ hboxLayout->addWidget(label);
+ m_styleTypeChooser->insertItem( i18n("Header") );
+ m_styleTypeChooser->insertItem( i18n("Description") );
+ m_styleTypeChooser->insertItem( i18n("Module text") );
+ connect(m_styleTypeChooser, SIGNAL(activated(const QString&)), SLOT(styleTypeChanged(const QString&)));
+ m_currentFormat = m_style->formatForType( CStyle::Header );
+ hboxLayout->addWidget( m_styleTypeChooser );
+
+ m_setEnabledBox = new QCheckBox( mainWidget );
+ m_setEnabledBox->setText( i18n("Enable this part"));
+ connect( m_setEnabledBox, SIGNAL(clicked()), SLOT(enableBoxClicked()));
+ hboxLayout->addWidget( m_setEnabledBox );
+
+ topLayout->addLayout( hboxLayout );
+
+
+ hboxLayout = new QHBoxLayout(0, 5, 5);
+ topLayout->addLayout(hboxLayout);
+
+ m_alignRadios.buttongroup = new QVButtonGroup( mainWidget );
+ m_alignRadios.leftRB = new QRadioButton( i18n("Left"), m_alignRadios.buttongroup);
+ m_alignRadios.centerRB = new QRadioButton( i18n("Center"), m_alignRadios.buttongroup);
+ m_alignRadios.rightRB = new QRadioButton(i18n("Right"),m_alignRadios.buttongroup);
+ m_alignRadios.buttongroup->setFixedHeight( m_alignRadios.buttongroup->sizeHint().height());
+ hboxLayout->addWidget( m_alignRadios.buttongroup );
+
+ QButtonGroup* box = new QButtonGroup( mainWidget );
+ QVBoxLayout* boxLayout = new QVBoxLayout( box, 5, 5 );
+
+ QHBoxLayout* layout1 = new QHBoxLayout(0, 1, 1);
+ m_colors.foregroundChooser = new KColorButton( box );
+ label = new QLabel(m_colors.foregroundChooser, "label", box);
+ label->setText(i18n("Foreground:"));
+ layout1->addWidget(label);
+ layout1->addStretch(2);
+ layout1->addWidget(m_colors.foregroundChooser);
+
+ boxLayout->addLayout(layout1);
+ boxLayout->addStretch(3);
+
+ layout1 = new QHBoxLayout(0, 1, 1);
+ m_colors.backgroundChooser = new KColorButton(box);
+ label = new QLabel(m_colors.backgroundChooser, "label", box);
+ label->setText(i18n("Background:"));
+ layout1->addWidget(label);
+ layout1->addStretch(2);
+ layout1->addWidget(m_colors.backgroundChooser);
+
+ boxLayout->addLayout(layout1);
+ boxLayout->addStretch(3);
+ hboxLayout->addWidget(box);
+
+ hboxLayout = new QHBoxLayout();
+ m_font.fontButton = new QPushButton(mainWidget);
+ m_font.fontButton->setText(i18n("Choose font"));
+ connect(m_font.fontButton, SIGNAL(clicked()), SLOT(showFontChooser()));
+ m_font.fontDisplay = new QLabel(m_font.fontButton, "", mainWidget);
+ m_font.fontDisplay->setText(i18n("Font preview"));
+ hboxLayout->addWidget(m_font.fontDisplay);
+ hboxLayout->addWidget(m_font.fontButton);
+
+// m_font.identation = new QSpinBox(mainWidget);
+// label = new QLabel(m_font.identation, "identation", mainWidget);
+// label->setText(i18n("Identation (in mm):"));
+// hboxLayout->addStretch(2);
+// hboxLayout->addWidget(label);
+// hboxLayout->addWidget(m_font.identation);
+
+ topLayout->addLayout(hboxLayout);
+
+ m_frame.useFrame = new QCheckBox(mainWidget);
+ m_frame.useFrame->setText( i18n("Use frame") );
+ topLayout->addWidget(m_frame.useFrame);
+ connect(m_frame.useFrame, SIGNAL(clicked()), SLOT(useFrameClicked()));
+
+ m_frame.groupbox = new QGroupBox(mainWidget);
+ boxLayout = new QVBoxLayout(m_frame.groupbox);
+
+ hboxLayout = new QHBoxLayout();
+ m_frame.lineThicknessChooser = new QSpinBox( m_frame.groupbox );
+ m_frame.lineThicknessChooser->setMinValue(1);
+ label = new QLabel(m_frame.lineThicknessChooser, "label", m_frame.groupbox);
+ label->setText( i18n("Line thickness (in point):") );
+ hboxLayout->addWidget(label);
+ hboxLayout->addWidget(m_frame.lineThicknessChooser);
+ boxLayout->addLayout(hboxLayout);
+
+ hboxLayout = new QHBoxLayout();
+ m_frame.colorChooser = new KColorButton(m_frame.groupbox);
+ label = new QLabel(m_frame.colorChooser, "", m_frame.groupbox);
+ label->setText(i18n("Frame color:"));
+ hboxLayout->addWidget(label);
+ hboxLayout->addWidget(m_frame.colorChooser);
+ boxLayout->addLayout(hboxLayout);
+
+ hboxLayout = new QHBoxLayout();
+ m_frame.lineStyleChooser = new QComboBox(m_frame.groupbox);
+ label = new QLabel(m_frame.lineStyleChooser, "", m_frame.groupbox);
+ label->setText(i18n("Line style:"));
+ hboxLayout->addWidget(label);
+ hboxLayout->addWidget(m_frame.lineStyleChooser);
+ boxLayout->addLayout(hboxLayout);
+
+ topLayout->addWidget(m_frame.groupbox);
+ topLayout->addStretch(3);
+
+ QPainter p;
+ QPen pen(Qt::black, 2, Qt::SolidLine);
+ QBrush brush(Qt::white);
+ for (int i=1; i <= 5; i++) { // from Qt::SolidLine to Qt::DashDotDotLine
+ QPixmap* pix = new QPixmap(/*m_frame.lineStyleChooser->width()*/150,15);
+ pen.setStyle((Qt::PenStyle)i);
+ p.begin(pix);
+ p.setPen(pen);
+ p.fillRect(0,0, pix->width(), pix->height(), brush);
+ p.drawLine(0,(int)((float)pix->height()/2),pix->width(),(int)((float)pix->height()/2));
+ p.end();
+ m_frame.lineStyleChooser->insertItem(*pix);
+ }
+
+ m_currentFormat = m_style->formatForType( CStyle::Header );
+ setupWithFormat( m_currentFormat );
+ enableBoxClicked();
+}
+
+/** Reads settings from config file */
+void CStyleEditorDialog::readSettings(){
+ m_styleNameEdit->setText( m_style->styleName() );
+ if (m_styleNameEdit->text() == i18n("Standard"))
+ m_styleNameEdit->setEnabled(false); //you can't change the name of the standard style
+}
+
+/** Saves settings to config file. */
+void CStyleEditorDialog::saveSettings(){
+ applySettingsToFormat( m_currentFormat );
+// m_style->setFormatForType(m_currentFormat.type(), m_currentFormat );
+ m_style->setStyleName( m_styleNameEdit->text() );
+}
+
+/** Opens the font chooser dialog. */
+void CStyleEditorDialog::showFontChooser(){
+ int result = KFontDialog::getFont( m_font.font );
+ if ( result == KFontDialog::Accepted ) {
+ setupFontWidgets( m_font.font );
+ }
+}
+
+/** */
+void CStyleEditorDialog::useFrameClicked(){
+ m_frame.groupbox->setEnabled( m_frame.useFrame->isChecked() );
+}
+
+/** Sets up the states of the child widgets using the styl format given as parameter. */
+void CStyleEditorDialog::setupWithFormat( CStyle::Format* const format ){
+ const CStyle::StyleType type = format->type();
+ if (type == CStyle::Unknown)
+ return;
+ m_formatEnabled = m_style->hasFormatTypeEnabled(type);
+
+ m_styleNameEdit->setText( m_style->styleName());
+ //setup alignement
+ switch(format->alignment()) {
+ case CStyle::Format::Left:
+ m_alignRadios.leftRB->setChecked(true);
+ break;
+ case CStyle::Format::Center:
+ m_alignRadios.centerRB->setChecked(true);
+ break;
+ case CStyle::Format::Right:
+ m_alignRadios.rightRB->setChecked(true);
+ break;
+ default:
+ m_alignRadios.leftRB->setChecked(true);
+ break;
+ }
+ m_alignRadios.buttongroup->setEnabled(m_formatEnabled);
+ m_setEnabledBox->setChecked(m_formatEnabled);
+
+ //setup colors
+ m_colors.backgroundChooser->setColor( format->color( CStyle::Format::Background ) );
+ m_colors.backgroundChooser->setEnabled(m_formatEnabled);
+
+ m_colors.foregroundChooser->setColor( format->color( CStyle::Format::Foreground ) );
+ m_colors.foregroundChooser->setEnabled(m_formatEnabled);
+
+ //setup fonts
+ m_font.font = format->font();
+ setupFontWidgets( m_font.font );
+
+ //setup frame part
+ CStyle::Format::Frame* frame = format->frame();
+ m_frame.useFrame->setChecked(frame);
+ m_frame.useFrame->setEnabled(m_formatEnabled);
+ useFrameClicked();
+
+ if (frame) {
+ m_frame.colorChooser->setColor( frame->color() );
+ m_frame.lineThicknessChooser->setValue( frame->thickness() );
+ m_frame.lineStyleChooser->setCurrentItem((int)(frame->lineStyle())-1);
+ }
+
+ m_frame.groupbox->setEnabled(m_formatEnabled);
+}
+
+/** Setups the font widgets using the parameter. */
+void CStyleEditorDialog::setupFontWidgets( QFont& font ){
+ QFont dummy(font);
+ dummy.setPointSize(12);
+ m_font.fontDisplay->setFont( dummy );
+ m_font.fontDisplay->setText( QString::fromLatin1("%1 - %2").arg(m_font.font.family()).arg(m_font.font.pointSize()) );
+ m_font.fontDisplay->setEnabled(m_formatEnabled);
+ m_font.fontButton->setEnabled(m_formatEnabled);
+}
+
+/** Called when the type was changed in the combobox. */
+void CStyleEditorDialog::styleTypeChanged( const QString& name ){
+ applySettingsToFormat( m_currentFormat );
+ if (name == i18n("Header")) {
+ m_currentFormat = m_style->formatForType(CStyle::Header );
+ m_formatEnabled = m_style->hasFormatTypeEnabled( CStyle::Header );
+ }
+ else if (name == i18n("Description")) {
+ m_currentFormat = m_style->formatForType( CStyle::Description );
+ m_formatEnabled = m_style->hasFormatTypeEnabled( CStyle::Description );
+ }
+ else if (name == i18n("Module text")) {
+ m_currentFormat = m_style->formatForType(CStyle::ModuleText );
+ m_formatEnabled = m_style->hasFormatTypeEnabled( CStyle::ModuleText );
+ }
+ setupWithFormat( m_currentFormat );
+}
+
+/** Sets the properties of the cuzrrent format which are changed in the editor. */
+void CStyleEditorDialog::applySettingsToFormat( CStyle::Format* const format ){
+ m_style->setStyleName(m_styleNameEdit->text());
+
+ //apply alignement settings
+ if (m_alignRadios.buttongroup->selected() == m_alignRadios.leftRB ) {
+ format->setAlignment( CStyle::Format::Left);
+ }
+ else if (m_alignRadios.buttongroup->selected() == m_alignRadios.centerRB) {
+ format->setAlignment( CStyle::Format::Center );
+ }
+ else if (m_alignRadios.buttongroup->selected() == m_alignRadios.rightRB ) {
+ format->setAlignment( CStyle::Format::Right );
+ }
+
+ //apply color settings
+ format->setColor( CStyle::Format::Background, m_colors.backgroundChooser->color() );
+ format->setColor( CStyle::Format::Foreground, m_colors.foregroundChooser->color() );
+
+ //apply font settings
+ format->setFont( m_font.font );
+
+ //apply frame settings
+ format->setFrameEnabled( m_frame.useFrame->isChecked() );
+ if (CStyle::Format::Frame* frame = format->frame()){
+ frame->setColor( m_frame.colorChooser->color() );
+ frame->setThickness( m_frame.lineThicknessChooser->value() );
+
+ //the position in the list equal to the position in Qt::PenStyle+1
+ frame->setLineStyle(static_cast<Qt::PenStyle>(m_frame.lineStyleChooser->currentItem()+1));
+ }
+}
+
+/** Is called when the enablePart box was clicked. */
+void CStyleEditorDialog::enableBoxClicked() {
+ const CStyle::StyleType styleType = m_currentFormat->type();
+ m_style->setFormatTypeEnabled(styleType, m_setEnabledBox->isChecked());
+
+ applySettingsToFormat(m_style->formatForType(styleType));
+ setupWithFormat( m_currentFormat );
+}
diff --git a/bibletime/printing/cstyleeditordialog.h b/bibletime/printing/cstyleeditordialog.h
new file mode 100644
index 0000000..1bc124d
--- /dev/null
+++ b/bibletime/printing/cstyleeditordialog.h
@@ -0,0 +1,135 @@
+/***************************************************************************
+ cstyleeditordialog.h - description
+ -------------------
+ begin : Sun Aug 20 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSTYLEEDITORDIALOG_H
+#define CSTYLEEDITORDIALOG_H
+
+//BibleTime includes
+#include "cstyle.h"
+
+//QT includes
+#include <qwidget.h>
+
+//KDE inludes
+#include <kdialogbase.h>
+#include "cstyle.h"
+
+
+/**The editor for the printing styles.
+ *@author The BibleTime team
+ */
+class QLineEdit;
+class KComboBox;
+class QRadioButton;
+class QSpinBox;
+class KFontDialog;
+class KColorButton;
+class QVButtonGroup;
+class QHButtonGroup;
+class QCheckBox;
+class QComboBox;
+class QGroupBox;
+
+class CStyleEditorDialog : public KDialogBase {
+ Q_OBJECT
+public:
+ CStyleEditorDialog(CStyle* style, QWidget *parent=0, const char *name=0);
+ ~CStyleEditorDialog();
+
+protected: // Protected methods
+ /**
+ * Saves settings to config file.
+ */
+ void saveSettings();
+ /**
+ * Reads settings from config file
+ */
+ void readSettings();
+ /**
+ * Initializes te view.
+ */
+ void initView();
+
+protected slots:
+ /**
+ * Opens the font chooser dialog.
+ */
+ void showFontChooser();
+ /**
+ *
+ */
+ void useFrameClicked();
+ /**
+ * Setups the font widgets using the parameter.
+ */
+ void setupFontWidgets( QFont& font );
+ /**
+ * Sets up the states of the child widgets using the styl format given as parameter.
+ */
+ void applySettingsToFormat( CStyle::Format* const format );
+ /**
+ * Sets the properties of the cuzrrent format which are changed in the editor.
+ */
+ void setupWithFormat( CStyle::Format* const format );
+ /**
+ * Is called when the enablePart box was clicked.
+ */
+ void enableBoxClicked();
+ /**
+ * Called when the type was changed in the combobox.
+ */
+ void styleTypeChanged( const QString& );
+
+private:
+ struct alignementRadios {
+ QRadioButton* leftRB;
+ QRadioButton* centerRB;
+ QRadioButton* rightRB;
+ QVButtonGroup* buttongroup;
+ } m_alignRadios;
+
+ struct colorButtons {
+ KColorButton* foregroundChooser;
+ KColorButton* backgroundChooser;
+ } m_colors;
+
+ struct frameWidgets {
+ QCheckBox* useFrame;
+ KColorButton* colorChooser;
+ QSpinBox* lineThicknessChooser;
+ QComboBox* lineStyleChooser;
+ QGroupBox* groupbox;
+ } m_frame;
+
+ struct fontWidgets {
+ QFont font;
+ QPushButton* fontButton;
+ QLabel* fontDisplay;
+ } m_font;
+
+
+ QLineEdit* m_styleNameEdit;
+ KComboBox* m_styleTypeChooser;
+ CStyle* m_style;
+ CStyle::Format* m_currentFormat;
+ QCheckBox* m_setEnabledBox;
+
+
+ bool m_formatEnabled;
+};
+
+#endif
diff --git a/bibletime/printing/cstylelist.cpp b/bibletime/printing/cstylelist.cpp
new file mode 100644
index 0000000..70951a1
--- /dev/null
+++ b/bibletime/printing/cstylelist.cpp
@@ -0,0 +1,156 @@
+/***************************************************************************
+ cstylelist.cpp - description
+ -------------------
+ begin : Sun Aug 20 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "cstylelist.h"
+#include "cstyleeditordialog.h"
+
+#include <qheader.h>
+#include <qlistview.h>
+#include <qcombobox.h>
+
+#include <klocale.h>
+#include <kaction.h>
+#include <kiconloader.h>
+
+CStyleList::CStyleList(StyleItemList* items, QWidget *parent, const char *name )
+ : KListView(parent,name), m_items(items)
+{
+ initView();
+ setItems(m_items);
+}
+
+CStyleList::~CStyleList(){
+ for (m_items->first(); m_items->current(); m_items->next()) {
+ m_items->current()->deleteListViewItem();
+ }
+}
+
+/** Initilizes the view. */
+void CStyleList::initView(){
+ addColumn(i18n("Name:"));
+ header()->hide();
+}
+
+/** Sets the content to itemList */
+void CStyleList::insertItems( StyleItemList* itemList ){
+ for(itemList->first(); itemList->current(); itemList->next() ) {
+ if (itemList != m_items) //check if we do not insert our own m_items list
+ m_items->append( itemList->current() );
+ itemList->current()->listViewItem(this);
+ }
+ printer()->emitStylesChanged();
+}
+
+/** Appends the items of itemList */
+void CStyleList::setItems( StyleItemList* itemList ){
+ for (m_items->first(); m_items->current(); m_items->next()) {
+ if (m_items->current())
+ m_items->current()->deleteListViewItem();
+ }
+
+ if (m_items != itemList)
+ m_items->clear();
+ insertItems(m_items);
+
+ QListViewItemIterator it( this );
+ if (it.current())
+ setCurrentItem(it.current());
+ emit currentChanged(it.current());
+}
+
+/** Appends the item to the list and m_items. */
+void CStyleList::insertItem( CStyle* item ){
+ m_items->append( item );
+ item->listViewItem(this);
+}
+
+/** Opens the style editor dialog for he selected style. */
+void CStyleList::editCurrentStyle(){
+ QListViewItem* item = currentItem();
+ if (!item)
+ return;
+
+ //go through style items and find the right one
+ CStyle* currentStyle = 0;
+ for (m_items->first(); m_items->current();m_items->next()) {
+ if (m_items->current()->listViewItem() == item) {
+ currentStyle = m_items->current();
+ break;
+ }
+ }
+ if (currentStyle) {
+ openStyleEditor( currentStyle );
+ currentStyle->updateListViewItem();
+ }
+}
+
+/** Creates a new style item. */
+void CStyleList::createNewStyle(){
+ CStyle* style = new CStyle();
+ insertItem( style );
+
+ openStyleEditor( style );
+
+ style->updateListViewItem();
+}
+
+/** */
+void CStyleList::openStyleEditor( CStyle* const style ){
+ CStyleEditorDialog dlg(style, this);
+ dlg.exec();
+ printer()->emitStylesChanged();
+}
+
+/** Deletes the current style item. */
+void CStyleList::deleteCurrentStyle(){
+ QListViewItem* item = currentItem();
+ if (!item)
+ return;
+ if (item == printer()->standardStyle()->listViewItem()) {
+ qWarning("Deleting the standardstyle is not possible");
+ return;
+ }
+
+ //go through style items and find the right one
+ CStyle* currentStyle = 0;
+ for (m_items->first(); m_items->current();m_items->next()) {
+ if (m_items->current()->listViewItem() == item) {
+ currentStyle = m_items->current();
+ m_items->remove(currentStyle);
+ currentStyle->deleteListViewItem();
+ if (!m_items->autoDelete() && currentStyle) {
+ delete currentStyle;
+ currentStyle = 0;
+ }
+ if (printer())
+ printer()->emitStylesChanged();
+ return;
+ }
+ }
+}
+
+///** Updates the style combo box. */
+//void CStyleList::updateStyleCombo(){
+// if (m_printer)
+// m_printer->emitStylesChanged();
+//}
+
+/** Returns a pointer to our list */
+StyleItemList* const CStyleList::styleList() const {
+ return m_items;
+}
+
diff --git a/bibletime/printing/cstylelist.h b/bibletime/printing/cstylelist.h
new file mode 100644
index 0000000..7d7e5be
--- /dev/null
+++ b/bibletime/printing/cstylelist.h
@@ -0,0 +1,92 @@
+/***************************************************************************
+ cstylelist.h - description
+ -------------------
+ begin : Sun Aug 20 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CSTYLELIST_H
+#define CSTYLELIST_H
+
+//BibleTime includes
+#include "frontend/cpointers.h"
+#include "cstyle.h"
+
+
+//Qt includes
+#include <qwidget.h>
+#include <qlist.h>
+
+//KDE includes
+#include <klistview.h>
+#include <kpopupmenu.h>
+
+class KAction;
+class QComboBox;
+
+typedef QList<CStyle> styleList;
+
+ /** A KListView derived class which handles CStyle items.
+ * @author The BibleTime team
+ */
+class CStyleList : public KListView, public CPointers {
+ Q_OBJECT
+public:
+ CStyleList(StyleItemList* items, QWidget *parent=0, const char *name=0);
+ ~CStyleList();
+ /**
+ * Initilizes the view.
+ */
+ void initView();
+ /**
+ * Appends the items of itemList
+ */
+ void insertItems( StyleItemList* itemList );
+ /**
+ * Sets the content to itemList
+ */
+ void setItems( StyleItemList* itemList );
+ /**
+ *
+ */
+ void openStyleEditor( CStyle* const style );
+ /**
+ * Appends the item to the list and m_items.
+ */
+ void insertItem( CStyle* item);
+ /**
+ *
+ */
+ StyleItemList* const styleList() const;
+
+public slots: // Public slots
+ /**
+ * Deletes the current style item.
+ */
+ void deleteCurrentStyle();
+ /**
+ * Creates a new style item.
+ */
+ void createNewStyle();
+ /**
+ * Opens the style editor dialog for he selected style.
+ */
+ void editCurrentStyle();
+
+private:
+ StyleItemList* m_items;
+ QGuardedPtr<KAction> editStyle_action;
+ QGuardedPtr<KAction> deleteStyle_action;
+};
+
+#endif
diff --git a/bibletime/printing/style-data/Makefile.am b/bibletime/printing/style-data/Makefile.am
new file mode 100644
index 0000000..31faba2
--- /dev/null
+++ b/bibletime/printing/style-data/Makefile.am
@@ -0,0 +1,4 @@
+EXTRA_DIST = bw_muchtext.xml color_muchtext.xml standard.xml
+rcdir = $(kde_datadir)/bibletime/printing/
+rc_DATA = bw_muchtext.xml color_muchtext.xml standard.xml
+
diff --git a/bibletime/printing/style-data/Makefile.in b/bibletime/printing/style-data/Makefile.in
new file mode 100644
index 0000000..f7968ee
--- /dev/null
+++ b/bibletime/printing/style-data/Makefile.in
@@ -0,0 +1,384 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+EXTRA_DIST = bw_muchtext.xml color_muchtext.xml standard.xml
+rcdir = $(kde_datadir)/bibletime/printing/
+rc_DATA = bw_muchtext.xml color_muchtext.xml standard.xml
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../../config.h
+CONFIG_CLEAN_FILES =
+DATA = $(rc_DATA)
+
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/printing/style-data/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/printing/style-data/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/printing/style-data/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+install-rcDATA: $(rc_DATA)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(rcdir)
+ @list='$(rc_DATA)'; for p in $$list; do \
+ if test -f $(srcdir)/$$p; then \
+ echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(rcdir)/$$p"; \
+ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(rcdir)/$$p; \
+ else if test -f $$p; then \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(rcdir)/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(rcdir)/$$p; \
+ fi; fi; \
+ done
+
+uninstall-rcDATA:
+ @$(NORMAL_UNINSTALL)
+ list='$(rc_DATA)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(rcdir)/$$p; \
+ done
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/printing/style-data
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/printing/style-data/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-rcDATA
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-rcDATA
+uninstall: uninstall-am
+all-am: Makefile $(DATA)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(rcdir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-generic mostlyclean-am
+
+#>- clean: clean-am
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+distclean-am: distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: uninstall-rcDATA install-rcDATA tags distdir info-am info dvi-am \
+dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 2
+docs-am:
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/printing/style-data/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/printing/style-data/Makefile.in
+
+
+#>+ 2
+final:
+ $(MAKE) all-am
+#>+ 2
+no-final:
+ $(MAKE) all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/printing/style-data/bw_muchtext.xml b/bibletime/printing/style-data/bw_muchtext.xml
new file mode 100644
index 0000000..12b7783
--- /dev/null
+++ b/bibletime/printing/style-data/bw_muchtext.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE DOC ><BibleTimePrintingStyle syntaxVersion="1" name="Black&amp;White for larger test portions" translate="1" >
+ <HEADER alignment="1" enabled="1" >
+ <COLORS bgcolor="#ffffff" fgcolor="#000000" />
+ <FONT family="" weight="75" charset="15" pointsize="12" italic="0" />
+ <FRAME thickness="1" style="1" color="#000000" enabled="1" />
+ </HEADER>
+ <DESCRIPTION alignment="1" enabled="1" >
+ <COLORS bgcolor="#ffffff" fgcolor="#000000" />
+ <FONT family="" weight="50" charset="15" pointsize="10" italic="1" />
+ <FRAME enabled="0" />
+ </DESCRIPTION>
+ <MODULETEXT alignment="0" enabled="1" >
+ <COLORS bgcolor="#ffffff" fgcolor="#000000" />
+ <FONT family="" weight="50" charset="15" pointsize="10" italic="0" />
+ <FRAME thickness="1" style="1" color="#000000" enabled="1" />
+ </MODULETEXT>
+</BibleTimePrintingStyle>
diff --git a/bibletime/printing/style-data/color_muchtext.xml b/bibletime/printing/style-data/color_muchtext.xml
new file mode 100644
index 0000000..9c8d502
--- /dev/null
+++ b/bibletime/printing/style-data/color_muchtext.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE DOC ><BibleTimePrintingStyle syntaxVersion="1" name="Colored style for larger test portions" translate="1" >
+ <HEADER alignment="1" enabled="1" >
+ <COLORS bgcolor="#ffffff" fgcolor="#000000" />
+ <FONT family="" weight="75" charset="15" pointsize="12" italic="0" />
+ <FRAME thickness="1" style="1" color="#000000" enabled="1" />
+ </HEADER>
+ <DESCRIPTION alignment="1" enabled="1" >
+ <COLORS bgcolor="#ffffff" fgcolor="#000000" />
+ <FONT family="" weight="50" charset="15" pointsize="10" italic="1" />
+ <FRAME enabled="0" />
+ </DESCRIPTION>
+ <MODULETEXT alignment="0" enabled="1" >
+ <COLORS bgcolor="#ffffff" fgcolor="#000000" />
+ <FONT family="" weight="50" charset="15" pointsize="10" italic="0" />
+ <FRAME thickness="1" style="1" color="#000000" enabled="1" />
+ </MODULETEXT>
+</BibleTimePrintingStyle>
diff --git a/bibletime/printing/style-data/standard.xml b/bibletime/printing/style-data/standard.xml
new file mode 100644
index 0000000..183f030
--- /dev/null
+++ b/bibletime/printing/style-data/standard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE DOC ><BibleTimePrintingStyle syntaxVersion="1" name="Standard" translate="1" >
+ <HEADER alignment="0" enabled="1" >
+ <COLORS bgcolor="#ffffff" fgcolor="#000000" />
+ <FONT family="" weight="75" charset="15" pointsize="12" italic="0" />
+ <FRAME enabled="0" />
+ </HEADER>
+ <DESCRIPTION alignment="0" enabled="1" >
+ <COLORS bgcolor="#ffffff" fgcolor="#000000" />
+ <FONT family="" weight="50" charset="15" pointsize="10" italic="0" />
+ <FRAME enabled="0" />
+ </DESCRIPTION>
+ <MODULETEXT alignment="0" enabled="1" >
+ <COLORS bgcolor="#ffffff" fgcolor="#000000" />
+ <FONT family="" weight="50" charset="15" pointsize="10" italic="0" />
+ <FRAME enabled="0" />
+ </MODULETEXT>
+</BibleTimePrintingStyle>
diff --git a/bibletime/resource.h b/bibletime/resource.h
new file mode 100644
index 0000000..d3e5a6a
--- /dev/null
+++ b/bibletime/resource.h
@@ -0,0 +1,219 @@
+/***************************************************************************
+ resource.h - description
+ -------------------
+ begin : Wed Jan 19 2000
+ copyright : (C) 2000 by The BibleTime Team
+ email : Info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <kglobal.h>
+#include <kiconloader.h>
+
+//Groupmanager
+#define ID_GM_PRESENTER_CREATE 1001
+#define ID_GM_BOOKMARK_CREATE 1002
+#define ID_GM_GROUP_CREATE 1003
+#define ID_GM_ITEMS_DELETE 1004
+#define ID_GM_BOOKMARK_CHANGE 1005
+#define ID_GM_MODULES_SEARCH 1006
+#define ID_GM_MODULE_UNLOCK 1007
+#define ID_GM_MODULE_ABOUT 1008
+#define ID_GM_BOOKMARKS_EXPORT 1009
+#define ID_GM_BOOKMARKS_IMPORT 1010
+#define ID_GM_GROUP_CHANGE 1011
+#define ID_GM_RESET 1012
+#define ID_GM_BOOKMARK_PRINT 1013
+
+#define ID_PRESENTER_SELECT_ALL 1016
+#define ID_PRESENTER_LOOKUP 1018
+
+#define ID_PRESENTER_COPY_ONLY_KEY 1019
+#define ID_PRESENTER_COPY_KEY_TEXT 1020
+#define ID_PRESENTER_COPY_KEY 1021
+#define ID_PRESENTER_COPY_CHAPTER 1022
+#define ID_PRESENTER_COPY_SELECTED 1023
+
+#define ID_PRESENTER_PRINT_KEY 1030
+#define ID_PRESENTER_PRINT_CHAPTER 1031
+
+#define ID_PRESENTER_SAVE_ONLY_KEY 1032
+#define ID_PRESENTER_SAVE_KEY_TEXT 1033
+#define ID_PRESENTER_SAVE_KEY 1034
+#define ID_PRESENTER_SAVE_CHAPTER 1035
+#define ID_PRESENTER_SAVE_CHAPTER_HTML 1036
+
+#define ID_PRESENTER_COPY_POPUP 1050
+#define ID_PRESENTER_PRINT_POPUP 1051
+#define ID_PRESENTER_SAVE_POPUP 1052
+
+//Key bindings of BibleTime
+#define IDK_GM_RESET CTRL+ALT+Key_R
+#define IDK_GM_ITEMS_DELETE CTRL+ALT+Key_D
+#define IDK_GM_MODULES_SEARCH CTRL+ALT+Key_M
+
+#define IDK_VIEW_FOOTNOTES CTRL+ALT+Key_F
+#define IDK_VIEW_STRONGS CTRL+ALT+Key_S
+#define IDK_VIEW_HEADINGS 0
+#define IDK_VIEW_MORPH_TAGS 0
+#define IDK_VIEW_TOOLBAR CTRL+Key_T
+#define IDK_VIEW_GROUPMANAGER 0
+
+#define IDK_PRESENTER_NEXT_VERSE CTRL+Key_V
+#define IDK_PRESENTER_PREVIOUS_VERSE CTRL+SHIFT+Key_R
+#define IDK_PRESENTER_NEXT_CHAPTER CTRL+Key_H
+#define IDK_PRESENTER_PREVIOUS_CHAPTER CTRL+SHIFT+Key_H
+#define IDK_PRESENTER_EDIT CTRL+SHIFT+Key_E
+#define IDK_PRESENTER_EDIT_DELETE CTRL+Key_D
+#define IDK_PRESENTER_EDIT_BOLD CTRL+Key_B
+#define IDK_PRESENTER_EDIT_ITALIC CTRL+Key_I
+#define IDK_PRESENTER_EDIT_UNDERLINE CTRL+Key_U
+
+#define IDK_PRESENTER_TOGGLE_TREE CTRL+Key_T
+
+#define IDK_WINDOW_CASCADE CTRL+Key_A
+#define IDK_WINDOW_TILE CTRL+Key_T
+#define IDK_WINDOW_AUTO_CASCADE CTRL+ALT+Key_A
+#define IDK_WINDOW_AUTO_TILE CTRL+ALT+Key_T
+#define IDK_WINDOW_CLOSE_ALL CTRL+Key_K
+#define IDK_WINDOW_LOAD_PROFILE 0
+#define IDK_WINDOW_SAVE_PROFILE 0
+#define IDK_WINDOW_EDIT_PROFILES 0
+#define IDK_WINDOW_FULLSCREEN 0
+
+#define IDK_HELP_DAILY_TIP 0
+
+/* The Bibletime Sub-Mimetypes */
+/* e.g. bible/reference is expanded to text/bible/reference,
+ like text/plain or text/html */
+
+#define REFERENCE "bt_reference" // text/bt_reference
+#define STRONGNUMBER "bt_strongnumber" // text/bt_strongnumber
+#define BOOKMARK "bt_bookmark" // text/bt_bookmark (fake)
+#define MODULE "bt_module" // text/bt_module
+#define GROUP "bt_group" // text/bt_group
+#define TEXT "plain" // text/plain
+
+
+#define LOAD_SMALL_ICON(name) SmallIcon(name, 16)
+#define LOAD_MC_ICON(name) BarIcon(name, 22) //MC == module chooser
+#define LOAD_OD_ICON(name) KGlobal::instance()->iconLoader()->loadIcon(name, KIcon::NoGroup, KIcon::SizeMedium)
+
+//ICONS
+#define ICON_FILE_CLEAR_QUEUE "queue"
+#define ICON_FILE_NEW "filenew"
+#define ICON_FILE_PRINT "fileprint"
+#define ICON_FILE_SAVE "filesave"
+#define ICON_FILE_DELETE "editdelete"
+
+#define ICON_EDIT "pencil"
+#define ICON_EDIT_COPY "editcopy"
+#define ICON_EDIT_BOLD "text_bold"
+#define ICON_EDIT_ITALIC "text_italic"
+#define ICON_EDIT_UNDER "text_under"
+#define ICON_EDIT_LEFT "text_left"
+#define ICON_EDIT_CENTER "text_center"
+#define ICON_EDIT_RIGHT "text_right"
+#define ICON_EDIT_JUST "text_block"
+
+#define ICON_VIEW_BOOKTREE "view_sidetree"
+
+#define ICON_MAININDEX_RESET "start"
+#define ICON_MAININDEX_SEARCH "find"
+#define ICON_MAININDEX_DELETE_ITEMS ICON_FILE_DELETE
+
+//#define ICON_VIEW_MAININDEX "bt_mainindex"
+#define ICON_VIEW_MAININDEX "view_sidetree"
+
+#define ICON_WINDOW_TILE "bt_tile"
+#define ICON_WINDOW_CASCADE "bt_cascade"
+#define ICON_WINDOW_TILE_AUTO "bt_tile_auto"
+#define ICON_WINDOW_CASCADE_AUTO "bt_cascade_auto"
+
+#define ICON_WINDOW_CLOSE_ALL "fileclose"
+#define ICON_WINDOW_SAVE_PROFILE "view_sidetree"
+#define ICON_WINDOW_LOAD_PROFILE "view_sidetree"
+#define ICON_WINDOW_EDIT_PROFILES "view_sidetree"
+#define ICON_WINDOW_FULLSCREEN "window_fullscreen"
+
+#define ICON_HELP_DAILY_TIP "idea"
+#define ICON_HELP_CONTENTS "contents"
+#define ICON_BUG_REPORT "configure"
+
+#define ICON_SYNC "bt_sync"
+
+//CGroupManager icons
+#define GROUP_ICON_SMALL LOAD_SMALL_ICON("folder")
+#define GROUP_OPEN_ICON_SMALL LOAD_SMALL_ICON("folder_open")
+#define GROUP_NEW_ICON_SMALL LOAD_SMALL_ICON("folder_new")
+#define GROUP_CHANGE_ICON_SMALL LOAD_SMALL_ICON("folder") // maybe find a better one
+
+#define BIBLE_ICON_SMALL LOAD_SMALL_ICON("bt_bible")
+#define BIBLE_LOCKED_ICON_SMALL LOAD_SMALL_ICON("bt_bible_locked")
+#define BIBLE_ICON_MC "bt_bible"
+#define BIBLE_ADD_ICON_MC "bt_bible_add"
+
+#define BOOK_ICON_SMALL LOAD_SMALL_ICON("bt_book")
+#define BOOK_LOCKED_ICON_SMALL LOAD_SMALL_ICON("bt_book_locked")
+#define BOOK_ICON_MC "bt_book"
+#define BOOK_ADD_ICON_MC "bt_book_add"
+
+#define COMMENTARY_ICON_SMALL LOAD_SMALL_ICON("bt_commentary")
+#define COMMENTARY_LOCKED_ICON_SMALL LOAD_SMALL_ICON("bt_commentary_locked")
+#define COMMENTARY_ICON_MC "bt_commentary"
+#define COMMENTARY_ADD_ICON_MC "bt_commentary_add"
+
+#define LEXICON_ICON_SMALL LOAD_SMALL_ICON("bt_lexicon")
+#define LEXICON_LOCKED_ICON_SMALL LOAD_SMALL_ICON("bt_lexicon_locked")
+#define LEXICON_ICON_MC "bt_lexicon"
+#define LEXICON_ADD_ICON_MC "bt_lexicon_add"
+
+#define DSB_ICON "bt_displayconfig"
+
+//UNUSED
+#define PARALLEL_ICON_MC LOAD_SMALL_ICON("bt_parallel")
+
+#define SYNC_ICON_SMALL LOAD_SMALL_ICON(ICON_SYNC)
+#define ITEMS_DELETE_ICON_SMALL LOAD_SMALL_ICON(ICON_MAININDEX_DELETE_ITEMS)
+
+#define BOOKMARK_ICON_SMALL LOAD_SMALL_ICON("bookmark")
+#define BOOKMARK_CHANGE_ICON_SMALL LOAD_SMALL_ICON("bookmark")
+#define BOOKMARK_NEW_ICON_SMALL LOAD_SMALL_ICON("bookmark_new")
+#define BOOKMARK_IMPORT_ICON_SMALL LOAD_SMALL_ICON("bookmark")
+#define BOOKMARK_EXPORT_ICON_SMALL LOAD_SMALL_ICON("bookmark")
+#define BOOKMARK_PRINT_ICON_SMALL LOAD_SMALL_ICON(ICON_FILE_PRINT)
+
+#define SHOW_GM_ICON_SMALL LOAD_SMALL_ICON( ICON_MAININDEX )
+#define RESET_GM_ICON_SMALL LOAD_SMALL_ICON( ICON_MAININDEX_RESET )
+
+#define MODULE_SEARCH_ICON_SMALL LOAD_SMALL_ICON( ICON_MAININDEX_SEARCH )
+#define MODULE_UNLOCK_ICON_SMALL LOAD_SMALL_ICON("unlock")
+#define MODULE_ABOUT_ICON_SMALL LOAD_SMALL_ICON("info")
+
+//used for Drag&Drop
+#define REFERENCE_ICON_SMALL LOAD_SMALL_ICON("bookmark")
+
+//Icons for the optionsdialog; OD == OptionsDialog
+#define OD_ICON_GENERAL LOAD_OD_ICON("bt_startconfig")
+#define OD_ICON_KEY_BINDINGS LOAD_OD_ICON("key_bindings")
+#define OD_ICON_FONTS LOAD_OD_ICON("fonts")
+#define OD_ICON_COLORS LOAD_OD_ICON("bt_displayconfig")
+#define OD_ICON_PROFILES LOAD_OD_ICON("view_sidetree")
+#define OD_ICON_SWORD LOAD_OD_ICON("bt_swordconfig")
+
+//define HelpDialog aliases for defines
+#define HELPDIALOG_MODULE_LOCKED "bibletime/helpdialog/help-module-encrypted.html"
+#define HELPDIALOG_FIRST_START "bibletime/helpdialog/help-first-startup.html"
+#define HELPDIALOG_NO_SWORD_MODULES "bibletime/helpdialog/help-no-modules.html"
+#define HELPDIALOG_NO_SWORD_MODULE_CONFIG_DIR "bibletime/helpdialog/help-no-mods-d.html"
+#define HELPDIALOG_INITBACKEND_FAILED "bibletime/helpdialog/help-initbackend-failed.html"
+#define HELPDIALOG_FIRSTTIME_SEARCH "bibletime/helpdialog/help-first-time-search.html"
+
diff --git a/bibletime/tooltipdef.h b/bibletime/tooltipdef.h
new file mode 100644
index 0000000..0d77cb3
--- /dev/null
+++ b/bibletime/tooltipdef.h
@@ -0,0 +1,181 @@
+/***************************************************************************
+ tooltipdef.h - description
+ -------------------
+ begin : Sat Jul 29 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+//ToolTip entries for Mainwindow actions
+#define TT_FILE_CLEAR_QUEUE i18n("Clear the printing queue")
+#define TT_FILE_PRINT i18n("Open the printerdialog")
+#define TT_FILE_QUIT i18n("Close BibleTime")
+
+#define TT_GM_SEARCH_MODULES i18n("Search in modules")
+#define TT_GM_DELETE_ITEMS i18n("Remove selected items")
+#define TT_GM_RESET i18n("Reset main index")
+
+#define TT_VIEW_GROUPMANAGER i18n("Show main index")
+#define TT_VIEW_TOOLBAR i18n("Show tooolbar")
+#define TT_VIEW_FOOTNOTES i18n("Show footnotes")
+#define TT_VIEW_STRONGS i18n("Show Strong's numbers")
+
+#define TT_WINDOW_TILE i18n("Tile windows")
+#define TT_WINDOW_AUTO_TILE i18n("Automatically tile windows")
+#define TT_WINDOW_CASCADE i18n("Cascade windows")
+#define TT_WINDOW_AUTO_CASCADE i18n("Automatically cascade windows")
+#define TT_WINDOW_CLOSE_ALL i18n("Close all windows")
+#define TT_WINDOW_SAVE_PROFILE i18n("Save current profile")
+#define TT_WINDOW_EDIT_PROFILES i18n("Edit profiles")
+#define TT_WINDOW_LOAD_PROFILE i18n("Load a new profile")
+#define TT_WINDOW_FULLSCREEN i18n("Toggle fullscreen mode")
+
+#define TT_SETTINGS_EDIT_TOOLBAR i18n("Edit toolbar")
+#define TT_SETTINGS_OPTIONS i18n("Options")
+
+#define TT_HELP_HANDBOOK i18n("BibleTime's handbook")
+#define TT_HELP_INSTALLATION i18n("BibleTime's installation documentation")
+#define TT_HELP_BIBLESTUDY i18n("BibleTime's Bible study HowTo")
+#define TT_HELP_WHATSTHIS i18n("Enter \"What's this?\" mode")
+#define TT_HELP_BUGREPORT i18n("Send bugreport")
+#define TT_HELP_DAILY_TIP i18n("Show daily tips at startup")
+#define TT_HELP_ABOUT i18n("About BibleTime")
+#define TT_HELP_ABOUT_KDE i18n("About KDE")
+
+
+//QWhatsThis defines for the groupmanager
+#define TT_GM_WIDGET i18n("The main index")
+#define TT_GM_NEW_GROUP i18n("Create a new folder")
+#define TT_GM_CHANGE_GROUP i18n("Change this folder")
+#define TT_GM_CHANGE_BOOKMARK i18n("Change this bookmark")
+#define TT_GM_IMPORT_BOOKMARKS i18n("Import bookmarks")
+#define TT_GM_EXPORT_BOOKMARKS i18n("Export bookmarks")
+#define TT_GM_PRINT_BOOKMARK i18n("Add bookmark to printing queue")
+#define TT_GM_UNLOCK_MODULE i18n("Unlock this module")
+#define TT_GM_ABOUT_MODULE i18n("About this module")
+
+//QWhatsThis defines for the presenters
+#define TT_MDI_AREA_WIDGET i18n("The working area")
+
+#define TT_PRESENTER_NEXT_ENTRY i18n("Show the next entry")
+#define TT_PRESENTER_PREVIOUS_ENTRY i18n("Show the previous entry")
+#define TT_PRESENTER_NEXT_VERSE i18n("Jump to the next verse")
+#define TT_PRESENTER_PREVIOUS_VERSE i18n("Jump to the previous verse")
+#define TT_PRESENTER_NEXT_CHAPTER i18n("Show the next chapter")
+#define TT_PRESENTER_PREVIOUS_CHAPTER i18n("Show the previous chapter")
+#define TT_PRESENTER_NEXT_BOOK i18n("Show the next book")
+#define TT_PRESENTER_PREVIOUS_BOOK i18n("Show the previous book")
+#define TT_PRESENTER_BOOK_COMBO i18n("List of books")
+#define TT_PRESENTER_CHAPTER_COMBO i18n("List of chapters")
+#define TT_PRESENTER_VERSE_COMBO i18n("List of verses")
+#define TT_PRESENTER_ENTRY_COMBO i18n("List of entries")
+#define TT_PRESENTER_SCROLL_BUTTON i18n("Scroll through the list")
+#define TT_PRESENTER_EDIT i18n("Edit this entry")
+#define TT_PRESENTER_EDIT_SAVE i18n("Save this comment")
+#define TT_PRESENTER_EDIT_DELETE i18n("Delete this comment")
+#define TT_PRESENTER_EDIT_COMMENT_UP_TO i18n("Comment up to")
+#define TT_PRESENTER_EDIT_SET_BOLD i18n("Set bold")
+#define TT_PRESENTER_EDIT_SET_ITALIC i18n("Set italic")
+#define TT_PRESENTER_EDIT_SET_UNDERLINED i18n("Set underlined")
+#define TT_PRESENTER_EDIT_SET_FONT i18n("Set font")
+#define TT_PRESENTER_EDIT_COLOR_CHOOSER i18n("Set the color")
+#define TT_PRESENTER_EDIT_FONTSIZE_CHOOSER i18n("Set the fontsize")
+
+#define TT_PRESENTER_SYNC i18n("Synchronize with Bible windows")
+
+//HTML widget related #defines
+#define TT_HTML_SAVE_AS i18n("Save as HTML")
+#define TT_HTML_SELECT_ALL i18n("Select all")
+#define TT_HTML_COPY i18n("Copy to clipboard")
+
+//searchdialog related #defines, SD means searchdialog; mc==Module chooser
+#define TT_SD_MODULECHOOSER i18n("Choose the modules to search in")
+#define TT_SD_MC_ADD_MODULE i18n("Add the selected module to the list")
+#define TT_SD_MC_REMOVE_MODULE i18n("Remove the selected module from the list")
+#define TT_SD_MC_MODULELIST i18n("List of modules used for the search")
+
+#define TT_SD_SEARCH_TEXT_EDIT i18n("Search for this text")
+#define TT_SD_SEARCH_MULTIPLE_WORDS i18n("Search multiple words")
+#define TT_SD_SEARCH_EXACT_MATCH i18n("Exact match")
+#define TT_SD_SEARCH_REGEXP i18n("Search with GNU regular expressions")
+#define TT_SD_SEARCH_CASE_SENSITIVE i18n("Search case sensitive")
+
+#define TT_SD_SCOPE_NO_SCOPE i18n("No scope")
+#define TT_SD_SCOPE_LAST_RESULT i18n("Last search result")
+#define TT_SD_SCOPE_OWN_SCOPE i18n("Use custom scope")
+#define TT_SD_SCOPE_NEW_SCOPE i18n("Add a new scope")
+#define TT_SD_SCOPE_DELETE_SCOPE i18n("Delete this search scope")
+#define TT_SD_SCOPE_EDIT_SCOPE_BUTTON i18n("Edit and define your search scopes")
+#define TT_SD_SCOPE_CHOOSER i18n("Choose a search scope from the list")
+#define TT_SD_SCOPE_EDIT_LINE i18n("Enter your own search scope")
+#define TT_SD_SCOPE_PARSED_LIST i18n("Parsed result")
+#define TT_SD_SCOPE_CLOSE i18n("Close this dialog")
+
+#define TT_SD_RESULT_MODULE_VIEW i18n("Used modules")
+#define TT_SD_RESULT_RESULT_VIEW i18n("Items found")
+#define TT_SD_RESULT_PREVIEW i18n("Preview")
+
+#define TT_SD_ANALYSIS_VIEW i18n("Graphical Search Analysis")
+
+
+//#defines for the settings dialog, OD means Optionsdialog
+#define TT_OD_GENERAL_DAILY_TIP i18n("Show daily tip")
+#define TT_OD_GENERAL_INTERNATIONAL_BOOKNAMES i18n("List of languages")
+#define TT_OD_GENERAL_SHOW_STARTUPLOGO i18n("Show start-up logo")
+#define TT_OD_GENERAL_SCROLL_PREVIOUS i18n("Use down arrow to scroll to next verse")
+#define TT_OD_GENERAL_RESTORE_WORKSPACE i18n("Restore the windows in the workspace on startup")
+
+#define TT_OD_SWORD_USE_LEXICON_CACHE i18n("Use cache files for the lexicon entries")
+#define TT_OD_SWORD_STANDARD_BIBLE i18n("The default bible used in the workspace area")
+#define TT_OD_SWORD_STANDARD_COMMENTARY i18n("The default commentary used in the workspace area")
+#define TT_OD_SWORD_STANDARD_LEXICON i18n("The default lexicon used in the workspace area")
+#define TT_OD_SWORD_STANDARD_HEBREW_STRONG i18n("The default Hebrew lexicon used in the workspace are")
+#define TT_OD_SWORD_STANDARD_GREEK_STRONG i18n("The default Greek lexicon used in the workspace area")
+#define TT_OD_SWORD_STANDARD_HEBREW_MORPH i18n("The default Morphological lexicon for Hebrew texts used in the workspace area")
+#define TT_OD_SWORD_STANDARD_GREEK_MORPH i18n("The default Morphological lexicon for Greek texts used in the workspace area")
+
+
+#define TT_OD_KEYS_CHOOSER i18n("Set keyboard accelerators")
+
+#define TT_OD_FONTS_TYPE_CHOOSER i18n("Choose the area of application")
+#define TT_OD_FONTS_CHOOSER i18n("Choose a font")
+
+#define TT_OD_COLORS_BACKGROUND i18n("Color of the background")
+#define TT_OD_COLORS_CURRENT_VERSE i18n("Color of the highlighted verse")
+
+#define TT_OD_DISPLAY_WINDOW_KEYS_GENERAL i18n("Keyboard accelerators used by all display windows")
+#define TT_OD_DISPLAY_WINDOW_KEYS_BIBLE i18n("Keyboard accelerators used by Bible windows")
+#define TT_OD_DISPLAY_WINDOW_KEYS_COMMENTARY i18n("Keyboard accelerators used by commentary windows")
+#define TT_OD_DISPLAY_WINDOW_KEYS_LEXICON i18n("Keyboard accelerators used by lexicon windows")
+
+//defines for the printing dialog; PI == Print Item; PD=Printer Dialog
+#define TT_PD_PRINT i18n("Start printing")
+#define TT_PD_PREVIEW i18n("Preview print job")
+#define TT_PD_CANCEL i18n("Cancel")
+#define TT_PD_HELP i18n("Open help")
+
+#define TT_PD_ENTRIES_STYLE_COMBO i18n("Styles")
+#define TT_PD_ENTRIES_PI_LIST i18n("List of print items")
+#define TT_PD_ENTRIES_PI_MOVE_UP i18n("Move item up")
+#define TT_PD_ENTRIES_PI_MOVE_DOWN i18n("Move item down")
+#define TT_PD_ENTRIES_PI_DELETE i18n("Delete items")
+#define TT_PD_ENTRIES_PI_PAGE_BREAK i18n("Insert a page break")
+
+#define TT_PD_LAYOUT_BORDER i18n("Page borders")
+#define TT_PD_LAYOUT_BORDER_LEFT i18n("Left border")
+#define TT_PD_LAYOUT_BORDER_RIGHT i18n("Right border")
+#define TT_PD_LAYOUT_BORDER_TOP i18n("Upper border")
+#define TT_PD_LAYOUT_BORDER_BOTTOM i18n("Lower border")
+#define TT_PD_LAYOUT_STYLE_LIST i18n("List of print styles")
+#define TT_PD_LAYOUT_STYLE_DELETE i18n("Delete the selected style")
+#define TT_PD_LAYOUT_STYLE_EDIT i18n("Edit the selected style")
+#define TT_PD_LAYOUT_STYLE_NEW i18n("Create a new printing style")
diff --git a/bibletime/util/Makefile.am b/bibletime/util/Makefile.am
new file mode 100644
index 0000000..5de8a1d
--- /dev/null
+++ b/bibletime/util/Makefile.am
@@ -0,0 +1,6 @@
+INCLUDES = $(all_includes)
+all_headers = scoped_resource.h
+EXTRA_DIST = $(all_headers)
+
+
+
diff --git a/bibletime/util/Makefile.in b/bibletime/util/Makefile.in
new file mode 100644
index 0000000..b6ad92a
--- /dev/null
+++ b/bibletime/util/Makefile.in
@@ -0,0 +1,367 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+INCLUDES = $(all_includes)
+all_headers = scoped_resource.h
+EXTRA_DIST = $(all_headers)
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES =
+DIST_COMMON = Makefile.am Makefile.in
+
+
+#>- DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+#>+ 4
+KDE_DIST=scoped_resource.h
+
+DISTFILES= $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
+
+
+TAR = tar
+GZIP_ENV = --best
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/util/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/util/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/util/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/util
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/util/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-generic mostlyclean-am
+
+#>- clean: clean-am
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+distclean-am: distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 2
+docs-am:
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/util/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/util/Makefile.in
+
+
+#>+ 2
+final:
+ $(MAKE) all-am
+#>+ 2
+no-final:
+ $(MAKE) all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/util/scoped_resource.h b/bibletime/util/scoped_resource.h
new file mode 100644
index 0000000..351667c
--- /dev/null
+++ b/bibletime/util/scoped_resource.h
@@ -0,0 +1,160 @@
+#ifndef SCOPED_RESOURCE_H_INCLUDED
+#define SCOPED_RESOURCE_H_INCLUDED
+
+/**
+* The util namespace should take all classes which are of a generic type,
+* used to perform common tasks which are not BibleTime-specific. See
+* @ref scoped_resource for an example.
+*/
+namespace util
+{
+/**
+* A class template, scoped_resource, designed to
+* implement the Resource Acquisition Is Initialization (RAII) approach
+* to resource management. scoped_resource is designed to be used when
+* a resource is initialized at the beginning or middle of a scope,
+* and released at the end of the scope. The template argument
+* ReleasePolicy is a functor which takes an argument of the
+* type of the resource, and releases it.
+*
+* Usage example, for working with files:
+*
+* @code
+* struct close_file { void operator(int fd) const {close(fd);} };
+* ...
+* {
+* const scoped_resource<int,close_file> file(open("file.txt",O_RDONLY));
+* read(file, buf, 1000);
+* } // file is automatically closed here
+* @endcode
+*
+* Note that scoped_resource has an explicit constructor, and prohibits
+* copy-construction, and thus the initialization syntax, rather than
+* the assignment syntax must be used when initializing.
+*
+* i.e. using scoped_resource<int,close_file> file = open("file.txt",O_RDONLY);
+* in the above example is illegal.
+*
+*/
+template<typename T,typename ReleasePolicy>
+class scoped_resource
+{
+ T resource;
+ ReleasePolicy release;
+
+ //prohibited operations
+ scoped_resource(const scoped_resource&);
+ scoped_resource& operator=(const scoped_resource&);
+public:
+ typedef T resource_type;
+ typedef ReleasePolicy release_type;
+
+ /**
+ * Constructor
+ *
+ * @ param res This is the resource to be managed
+ * @ param rel This is the functor to release the object
+ */
+ explicit scoped_resource(resource_type res,release_type rel=release_type())
+ : resource(res), release(rel) {}
+
+ /**
+ * The destructor is the main point in this class. It takes care of proper
+ * deletion of the resource, using the provided release policy.
+ */
+ ~scoped_resource()
+ {
+ release(resource);
+ }
+
+ /**
+ * This operator makes sure you can access and use the scoped_resource
+ * just like you were using the resource itself.
+ *
+ * @ret the underlying resource
+ */
+ operator resource_type() const { return resource; }
+
+ /**
+ * This function provides explicit access to the resource. Its behaviour
+ * is identical to operator resource_type()
+ *
+ * @ret the underlying resource
+ */
+ resource_type get() const { return resource; }
+
+ /**
+ * This function provides convenient direct access to the -> operator
+ * if the underlying resource is a pointer. Only call this function
+ * if resource_type is a pointer type.
+ */
+ resource_type operator->() const { return resource; }
+
+};
+
+/**
+* A helper policy for scoped_ptr.
+* It will call the delete operator on a pointer, and assign the pointer to 0
+*/
+struct delete_item {
+ template<typename T>
+ void operator()(T*& p) const { delete p; p = 0; }
+};
+/**
+* A helper policy for scoped_array.
+* It will call the delete[] operator on a pointer, and assign the pointer to 0
+*/
+struct delete_array {
+ template<typename T>
+ void operator()(T*& p) const { delete [] p; p = 0; }
+};
+
+/**
+* A class which implements an approximation of
+* template<typename T>
+* typedef scoped_resource<T*,delete_item> scoped_ptr<T>;
+*
+* It is a convenient synonym for a common usage of @ref scoped_resource.
+* See scoped_resource for more details on how this class behaves.
+*
+* Usage example:
+* @code
+* {
+* const scoped_ptr<Object> ptr(new Object);
+* ...use ptr as you would a normal Object*...
+* } // ptr is automatically deleted here
+* @endcode
+*
+* NOTE: use this class only to manage a single object, *never* an array.
+* Use scoped_array to manage arrays. This distinction is because you
+* may call delete only on objects allocated with new, delete[] only
+* on objects allocated with new[].
+*/
+template<typename T>
+struct scoped_ptr : public scoped_resource<T*,delete_item>
+{
+ explicit scoped_ptr(T* p) : scoped_resource<T*,delete_item>(p) {}
+};
+
+/**
+* This class has identical behaviour to @ref scoped_ptr, except it manages
+* heap-allocated arrays instead of heap-allocated single objects
+*
+* Usage example:
+* @code
+* {
+* const scoped_array<char> ptr(new char[n]);
+* ...use ptr as you would a normal char*...
+* } // ptr is automatically deleted here
+* @endcode
+*
+*/
+template<typename T>
+struct scoped_array : public scoped_resource<T*,delete_array>
+{
+ explicit scoped_array(T* p) : scoped_resource<T*,delete_array>(p) {}
+};
+
+}
+
+#endif
diff --git a/bibletime/whatsthisdef.h b/bibletime/whatsthisdef.h
new file mode 100644
index 0000000..9839e14
--- /dev/null
+++ b/bibletime/whatsthisdef.h
@@ -0,0 +1,191 @@
+/***************************************************************************
+ whatsthisdef.h - Contains QWhatThis descriptions
+ of widget
+ -------------------
+ begin : Sat Jul 29 2000
+ copyright : (C) 2000 by The BibleTime team
+ email : info@bibletime.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "tooltipdef.h"
+
+#ifndef WHATSTHISDEF_H
+#define WHATSTHISDEF_H
+
+//the general format of QWhatsThis help texts
+#define WT(title, description) QString::fromLatin1("<center><B>%1</B></center><HR>%2").arg(title).arg(description)
+
+//QWhatsThis entries for Mainwindow actions
+#define WT_FILE_CLEAR_QUEUE WT( TT_FILE_CLEAR_QUEUE, i18n("Clear the print queue of BibleTime. All items will be removed from the list and the print button will be disabled."))
+#define WT_FILE_PRINT WT( TT_FILE_PRINT, i18n("Open the printer dialog of BibleTime. Here you can edit the print queue and assign styles to the items."))
+#define WT_FILE_QUIT WT( TT_FILE_QUIT, i18n("Close BibleTime and save the settings."))
+
+#define WT_GM_SEARCH_MODULES WT(TT_GM_SEARCH_MODULES, i18n("Open the search dialog to search for text in one or more modules."))
+#define WT_GM_DELETE_ITEMS WT(TT_GM_DELETE_ITEMS, i18n("Remove the selected items from the main index.<BR>If you remove a folder, the subitems of it will be removed too."))
+#define WT_GM_RESET WT(TT_GM_RESET, i18n("Reset the main index.<BR>All bookmarks and folders will be deleted and the default folders will be restored."))
+
+#define WT_VIEW_GROUPMANAGER WT(TT_VIEW_GROUPMANAGER, i18n("Toggle the main index view."))
+#define WT_VIEW_TOOLBAR WT(TT_VIEW_TOOLBAR, i18n("Toggle the main toolbar view."))
+#define WT_VIEW_FOOTNOTES WT(TT_VIEW_FOOTNOTES, i18n("Toggle footnotes in the modules."))
+#define WT_VIEW_STRONGS WT(TT_VIEW_STRONGS, i18n("Toggle Strong's numbers in the modules."))
+
+#define WT_WINDOW_TILE WT(TT_WINDOW_TILE, i18n("Tile the open display windows."))
+#define WT_WINDOW_AUTO_TILE WT( TT_WINDOW_AUTO_TILE, i18n("Automatically tile the display windows."))
+#define WT_WINDOW_CASCADE WT( TT_WINDOW_CASCADE, i18n("Cascade the open display windows."))
+#define WT_WINDOW_AUTO_CASCADE WT( TT_WINDOW_AUTO_CASCADE, i18n("Automatically cascade the opened display windows."))
+#define WT_WINDOW_CLOSE_ALL WT( TT_WINDOW_CLOSE_ALL, i18n("Close all open display windows."))
+#define WT_WINDOW_SAVE_PROFILE WT(TT_WINDOW_SAVE_PROFILE, i18n("Save current profile"))
+#define WT_WINDOW_EDIT_PROFILES WT(TT_WINDOW_EDIT_PROFILES, i18n("Edit profiles..."))
+#define WT_WINDOW_LOAD_PROFILE WT(TT_WINDOW_LOAD_PROFILE, i18n("Load a new profile"))
+#define WT_WINDOW_FULLSCREEN WT(TT_WINDOW_FULLSCREEN, i18n("Toggle fullscreen mode"))
+
+
+#define WT_SETTINGS_EDIT_TOOLBAR WT(TT_SETTINGS_EDIT_TOOLBAR, i18n("Open the BibleTime tool bar editor."))
+#define WT_SETTINGS_OPTIONS WT(TT_SETTINGS_OPTIONS, i18n("Open BibleTime's optionsdialog where you can set most of the preferences."))
+
+#define WT_HELP_HANDBOOK WT(TT_HELP_HANDBOOK, i18n("Open KDE's helpbrowser with BibleTime's handbook.<BR>The handbook explains how to use BibleTime in the best way."))
+#define WT_HELP_INSTALLATION WT(TT_HELP_INSTALLATION, i18n("Open KDE's helpbrowser with BibleTime's installation instructions.<BR>The installation instructions explain how to set up BibleTime and the text modules."))
+#define WT_HELP_BIBLESTUDY WT(TT_HELP_BIBLESTUDY, i18n("Open KDE's helpbrowser with the Bible study HowTo included with BibleTime.<BR>This HowTo is an introduction how to study the Bible in an efficient way."))
+#define WT_HELP_WHATSTHIS WT(TT_HELP_WHATSTHIS, i18n("Switch into the <B>\"What's this?\"</B> mode.<BR>All important elements of BibleTime's GUI offer a \"What's this?\" help message."))
+#define WT_HELP_BUGREPORT WT(TT_HELP_BUGREPORT, i18n("Send a bugreport to the developers of BibleTime!"))
+#define WT_HELP_DAILY_TIP WT(TT_HELP_DAILY_TIP, i18n("Show a daily tip.<BR>The tips contain important Bible quotations and helpful usage tips for BibleTime."))
+#define WT_HELP_ABOUT WT(TT_HELP_ABOUT, i18n("Show detailed information about BibleTime."))
+#define WT_HELP_ABOUT_KDE WT(TT_HELP_ABOUT_KDE, i18n("Show the \"about\" dialog of KDE 2."))
+
+
+//QWhatsThis defines for the groupmanager
+#define WT_GM_WIDGET WT(TT_GM_WIDGET, i18n("This is the main index of BibleTime.<BR>Use it to manage the installed modules, to work with bookmarks, to open display windows etc.."))
+#define WT_GM_NEW_GROUP WT(TT_GM_NEW_GROUP, i18n("Create a new folder in the main index.<BR>If you press the right mouse button on a folder, the new folder will become a sub-folder of it.<BR>Otherwise you will create a toplevel folder."))
+#define WT_GM_CHANGE_GROUP WT(TT_GM_CHANGE_GROUP, i18n("Change the properties of the selected folder."))
+#define WT_GM_CHANGE_BOOKMARK WT(TT_GM_CHANGE_BOOKMARK, i18n("Change the properties of the selected bookmark."))
+#define WT_GM_IMPORT_BOOKMARKS WT(TT_GM_IMPORT_BOOKMARKS, i18n("Import bookmarks from a file."))
+#define WT_GM_EXPORT_BOOKMARKS WT(TT_GM_EXPORT_BOOKMARKS, i18n("Export bookmarks to a file so you or other<BR>users can import them later."))
+#define WT_GM_PRINT_BOOKMARK WT(TT_GM_PRINT_BOOKMARK, i18n("Use this to add this bookmark to BibleTime's print queue. The key, the description, and the text of the key will be used for printing."))
+#define WT_GM_UNLOCK_MODULE WT(TT_GM_UNLOCK_MODULE, i18n("Open a small dialog where you can unlock the selected module."))
+#define WT_GM_ABOUT_MODULE WT(TT_GM_ABOUT_MODULE, i18n("Open a dialog to show information about the selected module."))
+
+//QWhatsThis defines for the presenters
+#define WT_MDI_AREA_WIDGET WT(TT_MDI_AREA_WIDGET, i18n("This area is the main workspace of Bibletime.<BR>All display windows are opened in this window."))
+
+#define WT_PRESENTER_NEXT_ENTRY WT(TT_PRESENTER_NEXT_ENTRY, i18n("The next entry of the module will be shown."))
+#define WT_PRESENTER_PREVIOUS_ENTRY WT(TT_PRESENTER_PREVIOUS_ENTRY, i18n("The previous entry of the module will be shown."))
+#define WT_PRESENTER_NEXT_VERSE WT(TT_PRESENTER_NEXT_VERSE, i18n("For Bible texts, the next verse will be highlighted.<BR>In commentaries, the next entry will be shown."))
+#define WT_PRESENTER_PREVIOUS_VERSE WT(TT_PRESENTER_PREVIOUS_VERSE, i18n("For Bible texts, the previous verse will be highlighted. In commentaries, the previous entry will be shown."))
+#define WT_PRESENTER_NEXT_CHAPTER WT(TT_PRESENTER_NEXT_CHAPTER, i18n("Show the next chapter of the module. The verse will be set to \"1\"."))
+#define WT_PRESENTER_PREVIOUS_CHAPTER WT(TT_PRESENTER_PREVIOUS_CHAPTER, i18n("Show the previous chapter of the module. The verse will be set to \"1\""))
+#define WT_PRESENTER_NEXT_BOOK WT(TT_PRESENTER_NEXT_BOOK, i18n("Show the next book of this module. The chapter and the verse will be set to \"1\"."))
+#define WT_PRESENTER_PREVIOUS_BOOK WT(TT_PRESENTER_PREVIOUS_BOOK, i18n("Show the previous book of this module. The chapter and the verse will be set to \"1\"."))
+#define WT_PRESENTER_BOOK_COMBO WT(TT_PRESENTER_BOOK_COMBO, i18n("This list contains the books which are available in this module."))
+#define WT_PRESENTER_CHAPTER_COMBO WT(TT_PRESENTER_CHAPTER_COMBO, i18n("This list contains the chapters which are available in the current book."))
+#define WT_PRESENTER_VERSE_COMBO WT(TT_PRESENTER_VERSE_COMBO, i18n("This list contains the verses which are available in the current chapter."))
+#define WT_PRESENTER_ENTRY_COMBO WT(TT_PRESENTER_ENTRY_COMBO, i18n("This list contains the entries of the current module."))
+#define WT_PRESENTER_SCROLL_BUTTON WT(TT_PRESENTER_SCROLL_BUTTON, i18n("This button is useful to scroll through the entries of the list. Press the button and move the mouse to increase or decrease the item."))
+#define WT_PRESENTER_EDIT WT(TT_PRESENTER_EDIT, i18n("Toggle between read-write and read-only mode of writeable modules."))
+#define WT_PRESENTER_EDIT_SAVE WT(TT_PRESENTER_EDIT_SAVE, i18n("Save new personal comments."))
+#define WT_PRESENTER_EDIT_DELETE WT(TT_PRESENTER_EDIT_DELETE, i18n("Clear the text and delete the entry from the module."))
+#define WT_PRESENTER_EDIT_SET_BOLD WT(TT_PRESENTER_EDIT_SET_BOLD, i18n("Toggle bold formatting of the selected text."))
+#define WT_PRESENTER_EDIT_SET_ITALIC WT(TT_PRESENTER_EDIT_SET_ITALIC, i18n("Toggle italic formatting of the selected text."))
+#define WT_PRESENTER_EDIT_SET_UNDERLINED WT(TT_PRESENTER_EDIT_SET_UNDERLINED, i18n("Toggle underlined formatting of the selected text."))
+#define WT_PRESENTER_EDIT_SET_FONT WT(TT_PRESENTER_EDIT_SET_FONT, i18n("Choose a new font for the selected text."))
+#define WT_PRESENTER_EDIT_COLOR_CHOOSER WT(TT_PRESENTER_EDIT_COLOR_CHOOSER, i18n("Choose a new color for the selected text."))
+#define WT_PRESENTER_EDIT_FONTSIZE_CHOOSER WT(TT_PRESENTER_EDIT_FONTSIZE_CHOOSER, i18n("Choose a new fontsize for the selected text."))
+
+#define WT_PRESENTER_SYNC WT(TT_PRESENTER_SYNC, i18n("Synchronize the displayed verse of this module with the active Bible window."))
+
+//HTML widget related #defines
+#define WT_HTML_SAVE_AS WT(TT_HTML_SAVE_AS, i18n("Save the displayed chapter as an HTML file."))
+#define WT_HTML_SELECT_ALL WT(TT_HTML_SELECT_ALL, i18n("Select all text."))
+#define WT_HTML_COPY WT(TT_HTML_COPY, i18n("Copy the displayed text to the clipboard."))
+
+//searchdialog related #defines, SD means searchdialog
+#define WT_SD_MODULECHOOSER WT(TT_SD_MODULECHOOSER, i18n("Choose the modules which will be used for the search.<BR>Use the two buttons on the right side to add or delete the modules to/from the list of used ones."))
+#define WT_SD_MC_ADD_MODULE WT(TT_SD_MC_ADD_MODULE, i18n("Add the selected module to the list on the right."))
+#define WT_SD_MC_REMOVE_MODULE WT(TT_SD_MC_REMOVE_MODULE, i18n("Remove the selected module from the list on the right side."))
+#define WT_SD_MC_MODULELIST WT(TT_SD_MC_MODULELIST, i18n("The list of modules used for the search."))
+
+#define WT_SD_SEARCH_TEXT_EDIT WT(TT_SD_SEARCH_TEXT_EDIT, i18n("The text entered in this edit box will be searched for in all selected modules."))
+#define WT_SD_SEARCH_MULTIPLE_WORDS WT(TT_SD_SEARCH_MULTIPLE_WORDS, i18n("Select this to search for multiple words.<BR>Each word in the edit box above is searched as a single word."))
+#define WT_SD_SEARCH_EXACT_MATCH WT(TT_SD_SEARCH_EXACT_MATCH, i18n("Select this to search for exactly the same text you entered in the edit box."))
+#define WT_SD_SEARCH_REGEXP WT(TT_SD_SEARCH_REGEXP, i18n("Select this to search using standard GNU regular expressions.<BR>Read the handbook for a explanation how to use them."))
+#define WT_SD_SEARCH_CASE_SENSITIVE WT(TT_SD_SEARCH_CASE_SENSITIVE, i18n("Activate this to use a case sensitive search."))
+
+#define WT_SD_SCOPE_NO_SCOPE WT(TT_SD_SCOPE_NO_SCOPE, i18n("Select this if you want to search through all parts of the module(s)."))
+#define WT_SD_SCOPE_LAST_RESULT WT(TT_SD_SCOPE_LAST_RESULT, i18n("Select this if you want to use the last search result as the search scope."))
+#define WT_SD_SCOPE_NEW_SCOPE WT(TT_SD_SCOPE_NEW_SCOPE, i18n("Create a new search scope."))
+#define WT_SD_SCOPE_OWN_SCOPE WT(TT_SD_SCOPE_OWN_SCOPE, i18n("Use a custom scope for the search.<BR>A standard set of search scopes exists."))
+#define WT_SD_SCOPE_DELETE_SCOPE WT(TT_SD_SCOPE_DELETE_SCOPE, i18n("Use this button to delete the chosen search scope."))
+#define WT_SD_SCOPE_EDIT_SCOPE_BUTTON WT(TT_SD_SCOPE_EDIT_SCOPE_BUTTON, i18n("Edit and define your search scopes"))
+#define WT_SD_SCOPE_CHOOSER WT(TT_SD_SCOPE_CHOOSER,i18n("Choose a search scope from the combo box"))
+#define WT_SD_SCOPE_EDIT_LINE WT(TT_SD_SCOPE_EDIT_LINE, i18n("Enter your own search scope.<BR>To define a range use \"-\" (e.g. Genesis-Exodus),<BR>to seperate different ranges or keys use the semicolon (e.g. Genesis;Matthew)."))
+#define WT_SD_SCOPE_PARSED_LIST WT(TT_SD_SCOPE_PARSED_LIST, i18n("This list contains the parsed result of your entered scope. This result will be used for the search."))
+#define WT_SD_SCOPE_CLOSE WT(TT_SD_SCOPE_CLOSE, i18n("Close this dialog and save the changes."))
+
+#define WT_SD_RESULT_MODULE_VIEW WT(TT_SD_RESULT_MODULE_VIEW, i18n("List of modules used for the search.<BR>Click on a module to see the search result on the right side."))
+#define WT_SD_RESULT_RESULT_VIEW WT(TT_SD_RESULT_RESULT_VIEW, i18n("This contains the items found in the selected module."))
+#define WT_SD_RESULT_PREVIEW WT(TT_SD_RESULT_PREVIEW, i18n("This text box shows a preview of the chosen item."))
+
+#define WT_SD_ANALYSIS_VIEW WT(TT_SD_ANALYSIS_VIEW, i18n("Graphical analysis of your search result.<BR>The bars show the number of items found in each book of the Bible or commentary."))
+
+//#defines for the settings dialog, OD means Optionsdialog
+#define WT_OD_GENERAL_DAILY_TIP WT(TT_OD_GENERAL_DAILY_TIP, i18n("Activate this box to see a daily tip on startup."))
+#define WT_OD_GENERAL_INTERNATIONAL_BOOKNAMES WT(TT_OD_GENERAL_INTERNATIONAL_BOOKNAMES, i18n("Contains the languages which can be used for the international booknames."))
+#define WT_OD_GENERAL_SHOW_STARTUPLOGO WT(TT_OD_GENERAL_SHOW_STARTUPLOGO, i18n("Activate this to see the BibleTime logo on startup."))
+#define WT_OD_GENERAL_SCROLL_PREVIOUS WT(TT_OD_GENERAL_SCROLL_PREVIOUS, i18n("Check this to use the down arrow to scroll to the next verse."))
+#define WT_OD_GENERAL_RESTORE_WORKSPACE WT(TT_OD_GENERAL_RESTORE_WORKSPACE, i18n("Save the windows in the workspace if BibleTime is closed<BR>and restore them on the next startup. "))
+
+#define WT_OD_SWORD_USE_LEXICON_CACHE WT(TT_OD_SWORD_USE_LEXICON_CACHE, i18n("Activate this to let BibleTime create index files for the lexicon entries. This will speed up opening the lexicons a lot, but consume some disk space. Recommended."))
+#define WT_OD_SWORD_STANDARD_BIBLE WT(TT_OD_SWORD_STANDARD_BIBLE, i18n("The default Bible is used when a hyperlink into a Bible was clicked"))
+#define WT_OD_SWORD_STANDARD_COMMENTARY WT(TT_OD_SWORD_STANDARD_BIBLE, i18n("The default commentary is used when a hyperlink into a commentary was clicked"))
+#define WT_OD_SWORD_STANDARD_LEXICON WT(TT_OD_SWORD_STANDARD_LEXICON, i18n("The default lexicon is used when a hyperlink into a lexicon was clicked"))
+#define WT_OD_SWORD_STANDARD_HEBREW_STRONG WT(TT_OD_SWORD_STANDARD_HEBREW_STRONG, i18n("The default Hebrew lexicon is used when a hyperlink into a Hebrew lexicon was clicked"))
+#define WT_OD_SWORD_STANDARD_GREEK_STRONG WT(TT_OD_SWORD_STANDARD_GREEK_STRONG, i18n("The default Greek lexicon is used when a hyperlink into a Greek lexicon was clicked"))
+#define WT_OD_SWORD_STANDARD_HEBREW_MORPH WT(TT_OD_SWORD_STANDARD_HEBREW_MORPH, i18n("The standard morphological lexicon for Hebrew texts is used when a hyperlink of a morphological tag in a Hebrew text was clicked."))
+#define WT_OD_SWORD_STANDARD_GREEK_MORPH WT(TT_OD_SWORD_STANDARD_HEBREW_MORPH, i18n("The standard morphological lexicon for Greek texts is used when a hyperlink of a morphological tag in a Greek text was clicked."))
+
+#define WT_OD_KEYS_CHOOSER WT(TT_OD_KEYS_CHOOSER, i18n("Select an action and change the key binding for the action."))
+#define WT_OD_FONTS_TYPE_CHOOSER WT(TT_OD_FONTS_TYPE_CHOOSER, i18n("Use this box to select how the font is used and change the font in the font chooser."))
+#define WT_OD_FONTS_CHOOSER WT(TT_OD_FONTS_CHOOSER, i18n("Choose a font"))
+
+#define WT_OD_COLORS_BACKGROUND WT(TT_OD_COLORS_BACKGROUND, i18n("This is the background color used in display windows."))
+#define WT_OD_COLORS_CURRENT_VERSE WT(TT_OD_COLORS_CURRENT_VERSE, i18n("This is the color of the highlighted verse used in display windows."))
+
+#define WT_OD_DISPLAY_WINDOW_KEYS_GENERAL WT(TT_OD_DISPLAY_WINDOW_KEYS_GENERAL, i18n("Set the keyboard accelerators used in all display windows"))
+#define WT_OD_DISPLAY_WINDOW_KEYS_BIBLE WT(TT_OD_DISPLAY_WINDOW_KEYS_BIBLE, i18n("Set keyboard accelerators used in Bible windows"))
+#define WT_OD_DISPLAY_WINDOW_KEYS_COMMENTARY WT(TT_OD_DISPLAY_WINDOW_KEYS_COMMENTARY, i18n("Set the keyboard accelerators used in commentary windows"))
+#define WT_OD_DISPLAY_WINDOW_KEYS_LEXICON WT(TT_OD_DISPLAY_WINDOW_KEYS_LEXICON, i18n("Set the keyboard accelerators used in lexicon windows"))
+
+
+//defines for the printing dialog; PI == Print Item; PD=Printer Dialog
+#define WT_PD_PRINT WT(TT_PD_PRINT, i18n("Start the printing process.<BR>The items of the list will be printed using the assigned styles."))
+#define WT_PD_PREVIEW WT(TT_PD_PREVIEW, i18n("Print into a temporary file and open a postscript viewer to preview the printing result."))
+#define WT_PD_CANCEL WT(TT_PD_CANCEL, i18n("Closes this dialog without doing anything else."))
+#define WT_PD_HELP WT(TT_PD_HELP, i18n("Open the online help of BibleTime."))
+
+#define WT_PD_ENTRIES_STYLE_COMBO WT(TT_PD_ENTRIES_STYLE_COMBO, i18n("This combo box contains the available print styles."))
+#define WT_PD_ENTRIES_PI_LIST WT(TT_PD_ENTRIES_PI_LIST, i18n("This is the list which contains the available print items."))
+#define WT_PD_ENTRIES_PI_MOVE_UP WT(TT_PD_ENTRIES_PI_MOVE_UP, i18n("Move the selected item up one item."))
+#define WT_PD_ENTRIES_PI_MOVE_DOWN WT(TT_PD_ENTRIES_PI_MOVE_DOWN, i18n("Move the selected item down one item."))
+#define WT_PD_ENTRIES_PI_DELETE WT(TT_PD_ENTRIES_PI_DELETE, i18n("Delete the selected items."))
+#define WT_PD_ENTRIES_PI_PAGE_BREAK WT(TT_PD_ENTRIES_PI_PAGE_BREAK, i18n("Inserts a page break into the list.<BR>The printer will start a new page."))
+
+#define WT_PD_LAYOUT_BORDER WT(TT_PD_LAYOUT_BORDER, i18n("This group contains the page borders of the page measured in millimeters."))
+#define WT_PD_LAYOUT_BORDER_LEFT WT(TT_PD_LAYOUT_BORDER_LEFT, i18n("The size of the border on the left side of the paper."))
+#define WT_PD_LAYOUT_BORDER_RIGHT WT(TT_PD_LAYOUT_BORDER_RIGHT, i18n("The size of the border on the right side of the paper."))
+#define WT_PD_LAYOUT_BORDER_TOP WT(TT_PD_LAYOUT_BORDER_TOP, i18n("The size of the border on the top of the paper."))
+#define WT_PD_LAYOUT_BORDER_BOTTOM WT(TT_PD_LAYOUT_BORDER_BOTTOM, i18n("The size of the border on the bottom of the paper."))
+#define WT_PD_LAYOUT_STYLE_LIST WT(TT_PD_LAYOUT_STYLE_LIST, i18n("This list contains the available printing styles.<BR>Create your own one using the \"New style\" button."))
+#define WT_PD_LAYOUT_STYLE_DELETE WT(TT_PD_LAYOUT_STYLE_DELETE, i18n("Remove the selected printing style from the list."))
+#define WT_PD_LAYOUT_STYLE_EDIT WT(TT_PD_LAYOUT_STYLE_EDIT, i18n("Change the properties of the selected printing style."))
+#define WT_PD_LAYOUT_STYLE_NEW WT(TT_PD_LAYOUT_STYLE_NEW, i18n("Create a new printing style.<BR>The new style will be added to the list."))
+
+#endif
+
diff --git a/bibletime/xml/Makefile.am b/bibletime/xml/Makefile.am
new file mode 100644
index 0000000..acb432e
--- /dev/null
+++ b/bibletime/xml/Makefile.am
@@ -0,0 +1,3 @@
+EXTRA_DIST = bibletimeui.rc
+rcdir = $(kde_datadir)/bibletime
+rc_DATA = bibletimeui.rc
diff --git a/bibletime/xml/Makefile.in b/bibletime/xml/Makefile.in
new file mode 100644
index 0000000..2058c35
--- /dev/null
+++ b/bibletime/xml/Makefile.in
@@ -0,0 +1,384 @@
+# KDE tags expanded automatically by am_edit - $Revision: 1.7 $
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+#>-
+bindir = @bindir@
+#>+ 3
+DEPDIR = .deps
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+ARTSCCONFIG = @ARTSCCONFIG@
+AS = @AS@
+AUTODIRS = @AUTODIRS@
+BT_LDFLAGS = @BT_LDFLAGS@
+CC = @CC@
+CONF_FILES = @CONF_FILES@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+DCOPIDL = @DCOPIDL@
+DCOPIDL2CPP = @DCOPIDL2CPP@
+DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
+DISTRIBUTION = @DISTRIBUTION@
+DISTRIBUTION_VERSION = @DISTRIBUTION_VERSION@
+DLLTOOL = @DLLTOOL@
+DPMSINC = @DPMSINC@
+DPMSLIB = @DPMSLIB@
+EXEEXT = @EXEEXT@
+GCJ = @GCJ@
+GCJFLAGS = @GCJFLAGS@
+GLINC = @GLINC@
+GLLIB = @GLLIB@
+GMSGFMT = @GMSGFMT@
+IDL = @IDL@
+IDL_DEPENDENCIES = @IDL_DEPENDENCIES@
+JAR = @JAR@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JVMLIBS = @JVMLIBS@
+KDECONFIG = @KDECONFIG@
+KDE_CXXFLAGS = @KDE_CXXFLAGS@
+KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
+KDE_INCLUDES = @KDE_INCLUDES@
+KDE_LDFLAGS = @KDE_LDFLAGS@
+KDE_PLUGIN = @KDE_PLUGIN@
+KDE_RPATH = @KDE_RPATH@
+KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
+KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
+KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
+KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
+KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
+LIBCOMPAT = @LIBCOMPAT@
+LIBCRYPT = @LIBCRYPT@
+LIBDL = @LIBDL@
+LIBGEN = @LIBGEN@
+LIBJPEG = @LIBJPEG@
+LIBMICO = @LIBMICO@
+LIBOBJS = @LIBOBJS@
+LIBPNG = @LIBPNG@
+LIBPTHREAD = @LIBPTHREAD@
+LIBPYTHON = @LIBPYTHON@
+LIBQIMGIO = @LIBQIMGIO@
+LIBRESOLV = @LIBRESOLV@
+LIBSHADOW = @LIBSHADOW@
+LIBSM = @LIBSM@
+LIBSOCKET = @LIBSOCKET@
+LIBTIFF = @LIBTIFF@
+LIBTOOL = @LIBTOOL@
+LIBUCB = @LIBUCB@
+LIBUTIL = @LIBUTIL@
+LIBXINERAMA = @LIBXINERAMA@
+LIBZ = @LIBZ@
+LIB_KAB = @LIB_KAB@
+LIB_KDECORE = @LIB_KDECORE@
+LIB_KDEUI = @LIB_KDEUI@
+LIB_KFILE = @LIB_KFILE@
+LIB_KFM = @LIB_KFM@
+LIB_KFORMULA = @LIB_KFORMULA@
+LIB_KHTML = @LIB_KHTML@
+LIB_KIMGIO = @LIB_KIMGIO@
+LIB_KIO = @LIB_KIO@
+LIB_KPARTS = @LIB_KPARTS@
+LIB_KSPELL = @LIB_KSPELL@
+LIB_KSYCOCA = @LIB_KSYCOCA@
+LIB_KWRITE = @LIB_KWRITE@
+LIB_QT = @LIB_QT@
+LIB_SMB = @LIB_SMB@
+LIB_SWORD = @LIB_SWORD@
+LIB_X11 = @LIB_X11@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MCOPIDL = @MCOPIDL@
+MEINPROC = @MEINPROC@
+MICO_INCLUDES = @MICO_INCLUDES@
+MICO_LDFLAGS = @MICO_LDFLAGS@
+MOC = @MOC@
+MSGFMT = @MSGFMT@
+NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
+NOREPO = @NOREPO@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PAMLIBS = @PAMLIBS@
+PASSWDLIBS = @PASSWDLIBS@
+PYTHONINC = @PYTHONINC@
+PYTHONLIB = @PYTHONLIB@
+PYTHONMODDIR = @PYTHONMODDIR@
+QT_INCLUDES = @QT_INCLUDES@
+QT_LDFLAGS = @QT_LDFLAGS@
+RANLIB = @RANLIB@
+REPO = @REPO@
+RPM_GROUP = @RPM_GROUP@
+RPM_PREFIX = @RPM_PREFIX@
+SETUIDFLAGS = @SETUIDFLAGS@
+STRIP = @STRIP@
+SWORD_INCLUDES = @SWORD_INCLUDES@
+SWORD_LIBRARY_PATH = @SWORD_LIBRARY_PATH@
+TOPSUBDIRS = @TOPSUBDIRS@
+UIC = @UIC@
+USER_INCLUDES = @USER_INCLUDES@
+USER_LDFLAGS = @USER_LDFLAGS@
+USE_EXCEPTIONS = @USE_EXCEPTIONS@
+USE_RTTI = @USE_RTTI@
+USE_THREADS = @USE_THREADS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XPMINC = @XPMINC@
+XPMLIB = @XPMLIB@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_INCLUDES = @X_INCLUDES@
+X_LDFLAGS = @X_LDFLAGS@
+X_PRE_LIBS = @X_PRE_LIBS@
+all_includes = @all_includes@
+all_libraries = @all_libraries@
+idldir = @idldir@
+jni_includes = @jni_includes@
+kde_appsdir = @kde_appsdir@
+kde_bindir = @kde_bindir@
+kde_confdir = @kde_confdir@
+kde_datadir = @kde_datadir@
+kde_htmldir = @kde_htmldir@
+kde_icondir = @kde_icondir@
+kde_includes = @kde_includes@
+kde_libraries = @kde_libraries@
+kde_libs_htmldir = @kde_libs_htmldir@
+kde_libs_prefix = @kde_libs_prefix@
+kde_locale = @kde_locale@
+kde_mimedir = @kde_mimedir@
+kde_moduledir = @kde_moduledir@
+kde_servicesdir = @kde_servicesdir@
+kde_servicetypesdir = @kde_servicetypesdir@
+kde_sounddir = @kde_sounddir@
+kde_templatesdir = @kde_templatesdir@
+kde_wallpaperdir = @kde_wallpaperdir@
+micodir = @micodir@
+qt_includes = @qt_includes@
+qt_libraries = @qt_libraries@
+x_includes = @x_includes@
+x_libraries = @x_libraries@
+
+EXTRA_DIST = bibletimeui.rc
+rcdir = $(kde_datadir)/bibletime
+rc_DATA = bibletimeui.rc
+mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES =
+DATA = $(rc_DATA)
+
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+#>- all: all-redirect
+#>+ 1
+all: docs-am all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#>- cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/xml/Makefile
+#>+ 2
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/xml/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/xml/Makefile.in
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+install-rcDATA: $(rc_DATA)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(rcdir)
+ @list='$(rc_DATA)'; for p in $$list; do \
+ if test -f $(srcdir)/$$p; then \
+ echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(rcdir)/$$p"; \
+ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(rcdir)/$$p; \
+ else if test -f $$p; then \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(rcdir)/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(rcdir)/$$p; \
+ fi; fi; \
+ done
+
+uninstall-rcDATA:
+ @$(NORMAL_UNINSTALL)
+ list='$(rc_DATA)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(rcdir)/$$p; \
+ done
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = bibletime/xml
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu bibletime/xml/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-rcDATA
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-rcDATA
+uninstall: uninstall-am
+all-am: Makefile $(DATA)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(rcdir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-generic mostlyclean-am
+
+#>- clean: clean-am
+#>+ 1
+clean: kde-rpo-clean clean-am
+
+distclean-am: distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: uninstall-rcDATA install-rcDATA tags distdir info-am info dvi-am \
+dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+#>+ 2
+docs-am:
+
+#>+ 5
+force-reedit:
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu bibletime/xml/Makefile
+ cd $(top_srcdir) && perl admin/am_edit bibletime/xml/Makefile.in
+
+
+#>+ 2
+final:
+ $(MAKE) all-am
+#>+ 2
+no-final:
+ $(MAKE) all-am
+#>+ 3
+cvs-clean:
+ $(MAKE) -f $(top_srcdir)/admin/Makefile.common cvs-clean
+
+#>+ 3
+kde-rpo-clean:
+ -rm -f *.rpo
diff --git a/bibletime/xml/bibletimeui.rc b/bibletime/xml/bibletimeui.rc
new file mode 100644
index 0000000..d896cf0
--- /dev/null
+++ b/bibletime/xml/bibletimeui.rc
@@ -0,0 +1,69 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd"><kpartgui name="BibleTime" version="13">
+<MenuBar>
+ <Menu name="file" noMerge="1"><text>&amp;File</text>
+ <Action name="fileClearQueue_action"/>
+ <Action name="file_print"/>
+ <Separator/>
+ <Action name="file_quit"/>
+ </Menu>
+ <Menu name="main index"><text>&amp;Main index</text>
+ <Action name="GMsearch_action"/>
+ <Separator/>
+ <Action name="GMreset_action"/>
+ <Action name="GMdelete_action"/>
+ </Menu>
+ <Menu name="view" noMerge="1"><Text>&amp;View</Text>
+ <Action name="options_show_toolbar"/>
+ <Separator/>
+ <Action name="viewGroupManager_action"/>
+ </Menu>
+ <Menu name="settings" noMerge="1"><Text>&amp;Settings</Text>
+ <Action name="options_configure_toolbars"/>
+ <Action name="options_configure"/>
+ </Menu>
+ <Menu name="window"><Text>&amp;Window</Text>
+ <Action name="windowSaveProfile_action"/>
+ <Action name="windowLoadProfile_action"/>
+ <Action name="windowEditProfiles_action"/>
+ <Separator/>
+ <Action name="windowFullscreen_action"/>
+ <Separator/>
+ <Action name="windowTile_action"/>
+ <Action name="windowCascade_action"/>
+ <Action name="windowAutoTile_action"/>
+ <Action name="windowAutoCascade_action"/>
+ <Separator/>
+ <Action name="windowCloseAll_action"/>
+ <Separator/>
+ </Menu>
+ <Menu name="help" noMerge="1"><Text>&amp;Help</Text>
+ <Action name="help_handbook"/>
+ <Action name="help_install"/>
+ <Action name="help_howto"/>
+ <Separator/>
+ <Action name="help_whats_this"/>
+ <Action name="help_report_bug"/>
+ <Action name="helpDailyTip_action"/>
+ <Separator/>
+ <Action name="help_about_app"/>
+ <Action name="help_about_kde"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="mainToolBar" fullWidth="true" noMerge="1" newLine="1">
+ <Action name="file_quit"/>
+ <Action name="file_print"/>
+ <Action name="file_clearQueue"/>
+ <Separator/>
+ <Action name="viewStrongs_action"/>
+ <Action name="viewFootnotes_action"/>
+ <Action name="viewGroupmanager_action"/>
+ <Separator/>
+ <Action name="GMsearch_action"/>
+ <Separator/>
+ <Separator/>
+ <Action name="windowLoadProfile_action"/>
+ <Action name="windowFullscreen_action"/>
+ <Separator/>
+ <Action name="help_whats_this"/>
+</ToolBar>
+</kpartgui>