← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~trb143/openlp/servicing into lp:openlp

 

Tim Bentley has proposed merging lp:~trb143/openlp/servicing into lp:openlp.

Requested reviews:
    openlp.org Core (openlp-core)

Added buttons, paging and screen closure
Added more logging to tray and see why the 4 page screen was slow.
Cleanups and fixes.
-- 
https://code.launchpad.net/~trb143/openlp/servicing/+merge/6161
Your team openlp.org Core is subscribed to branch lp:openlp.
=== added file '.bzrignore'
--- .bzrignore	1970-01-01 00:00:00 +0000
+++ .bzrignore	2009-05-04 08:56:46 +0000
@@ -0,0 +1,10 @@
+*.pyc
+*.*~
+*.log
+\#*\#
+*.eric4project
+*.ropeproject
+*.e4*
+.eric4project
+list
+openlp.org 2.0.e4*

=== removed file '.eric4project/openlp.org 2.0.e4q'
--- .eric4project/openlp.org 2.0.e4q	2009-05-03 15:35:34 +0000
+++ .eric4project/openlp.org 2.0.e4q	1970-01-01 00:00:00 +0000
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE UserProject SYSTEM "UserProject-4.0.dtd">
-<!-- eric4 user project file for project openlp.org 2.0 -->
-<!-- Saved: 2009-05-03, 17:33:30 -->
-<!-- Copyright (C) 2009 Raoul Snyman, raoulsnyman@xxxxxxxxxx -->
-<UserProject version="4.0">
-</UserProject>
\ No newline at end of file

=== removed file '.eric4project/openlp.org 2.0.e4s'
--- .eric4project/openlp.org 2.0.e4s	2008-11-21 18:58:03 +0000
+++ .eric4project/openlp.org 2.0.e4s	1970-01-01 00:00:00 +0000
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Session SYSTEM "Session-4.0.dtd">
-<!-- eric4 session file for project openlp.org 2.0 -->
-<!-- This file was generated automatically, do not edit. -->
-<!-- Saved: 2008-11-03, 22:49:15 -->
-<Session version="4.0">
-  <Filenames>
-    <Filename cline="24" cindex="13">/home/raoul/Projects/openlp-2/openlp.pyw</Filename>
-    <Filename cline="30" cindex="0">/home/raoul/Projects/openlp-2/openlp/ui/forms/splashscreen.py</Filename>
-    <Filename cline="31" cindex="30">/home/raoul/Projects/openlp-2/openlp/ui/forms/mainwindow.py</Filename>
-    <Filename cline="22" cindex="53">/home/raoul/Projects/openlp-2/openlp/ui/forms/__init__.py</Filename>
-  </Filenames>
-  <ActiveWindow cline="24" cindex="13">/home/raoul/Projects/openlp-2/openlp.pyw</ActiveWindow>
-  <Breakpoints>
-  </Breakpoints>
-  <Watchpoints>
-  </Watchpoints>
-  <DebugInfo>
-    <CommandLine></CommandLine>
-    <WorkingDirectory></WorkingDirectory>
-    <Environment></Environment>
-    <ReportExceptions value="True" />
-    <Exceptions>
-    </Exceptions>
-    <AutoClearShell value="True" />
-    <TracePython value="False" />
-    <AutoContinue value="True" />
-    <CovexcPattern></CovexcPattern>
-  </DebugInfo>
-  <Bookmarks>
-  </Bookmarks>
-</Session>
\ No newline at end of file

=== removed file '.eric4project/openlp.org 2.0.e4t'
--- .eric4project/openlp.org 2.0.e4t	2009-05-03 15:35:34 +0000
+++ .eric4project/openlp.org 2.0.e4t	1970-01-01 00:00:00 +0000
@@ -1,132 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Tasks SYSTEM "Tasks-4.2.dtd">
-<!-- eric4 tasks file for project openlp.org 2.0 -->
-<!-- Saved: 2009-05-03, 17:33:30 -->
-<Tasks version="4.2">
-  <Task priority="1" completed="False" bugfix="False">
-    <Summary>TODO: what is the tags for bridge, pre-chorus?</Summary>
-    <Description></Description>
-    <Created>2008-11-26, 21:10:45</Created>
-    <Resource>
-      <Filename>openlp/song/song.py</Filename>
-      <Linenumber>138</Linenumber>
-    </Resource>
-  </Task>
-  <Task priority="1" completed="False" bugfix="False">
-    <Summary>TODO: check font formatting</Summary>
-    <Description></Description>
-    <Created>2008-11-26, 21:10:45</Created>
-    <Resource>
-      <Filename>openlp/song/song.py</Filename>
-      <Linenumber>523</Linenumber>
-    </Resource>
-  </Task>
-  <Task priority="1" completed="False" bugfix="False">
-    <Summary>TODO: Song: Logging - not all, but enough</Summary>
-    <Description></Description>
-    <Created>2008-12-07, 10:06:59</Created>
-    <Resource>
-      <Filename>openlp/plugins/songs/songxml.py</Filename>
-      <Linenumber>39</Linenumber>
-    </Resource>
-  </Task>
-  <Task priority="1" completed="False" bugfix="False">
-    <Summary>TODO: Song: Handle OpenLP2 format</Summary>
-    <Description></Description>
-    <Created>2008-12-07, 10:06:59</Created>
-    <Resource>
-      <Filename>openlp/plugins/songs/songxml.py</Filename>
-      <Linenumber>40</Linenumber>
-    </Resource>
-  </Task>
-  <Task priority="1" completed="False" bugfix="False">
-    <Summary>TODO: Song: Import OpenLP1</Summary>
-    <Description></Description>
-    <Created>2008-12-07, 10:06:59</Created>
-    <Resource>
-      <Filename>openlp/plugins/songs/songxml.py</Filename>
-      <Linenumber>41</Linenumber>
-    </Resource>
-  </Task>
-  <Task priority="1" completed="False" bugfix="False">
-    <Summary>TODO: Song: Export OpenLP1</Summary>
-    <Description></Description>
-    <Created>2008-12-07, 10:07:00</Created>
-    <Resource>
-      <Filename>openlp/plugins/songs/songxml.py</Filename>
-      <Linenumber>42</Linenumber>
-    </Resource>
-  </Task>
-  <Task priority="1" completed="False" bugfix="False">
-    <Summary>TODO: Song: Export Song to CCLI</Summary>
-    <Description></Description>
-    <Created>2008-12-07, 10:07:00</Created>
-    <Resource>
-      <Filename>openlp/plugins/songs/songxml.py</Filename>
-      <Linenumber>43</Linenumber>
-    </Resource>
-  </Task>
-  <Task priority="1" completed="False" bugfix="False">
-    <Summary>TODO: Song: Export Song to OpenSong</Summary>
-    <Description></Description>
-    <Created>2008-12-07, 10:07:00</Created>
-    <Resource>
-      <Filename>openlp/plugins/songs/songxml.py</Filename>
-      <Linenumber>44</Linenumber>
-    </Resource>
-  </Task>
-  <Task priority="1" completed="False" bugfix="False">
-    <Summary>TODO: Song: Import ChangingSong</Summary>
-    <Description></Description>
-    <Created>2008-12-07, 10:07:00</Created>
-    <Resource>
-      <Filename>openlp/plugins/songs/songxml.py</Filename>
-      <Linenumber>45</Linenumber>
-    </Resource>
-  </Task>
-  <Task priority="1" completed="False" bugfix="False">
-    <Summary>TODO: Song: Export ChangingSong</Summary>
-    <Description></Description>
-    <Created>2008-12-07, 10:07:00</Created>
-    <Resource>
-      <Filename>openlp/plugins/songs/songxml.py</Filename>
-      <Linenumber>46</Linenumber>
-    </Resource>
-  </Task>
-  <Task priority="1" completed="False" bugfix="False">
-    <Summary>TODO: what is the tags for bridge, pre-chorus?</Summary>
-    <Description></Description>
-    <Created>2008-12-07, 10:07:00</Created>
-    <Resource>
-      <Filename>openlp/plugins/songs/songxml.py</Filename>
-      <Linenumber>149</Linenumber>
-    </Resource>
-  </Task>
-  <Task priority="1" completed="False" bugfix="False">
-    <Summary>TODO: check font formatting</Summary>
-    <Description></Description>
-    <Created>2008-12-07, 10:07:00</Created>
-    <Resource>
-      <Filename>openlp/plugins/songs/songxml.py</Filename>
-      <Linenumber>534</Linenumber>
-    </Resource>
-  </Task>
-  <Task priority="1" completed="False" bugfix="False">
-    <Summary>TODO: need to get rid of this once all plugins are up to date</Summary>
-    <Description></Description>
-    <Created>2009-03-01, 01:10:29</Created>
-    <Resource>
-      <Filename>openlp/core/pluginmanager.py</Filename>
-      <Linenumber>86</Linenumber>
-    </Resource>
-  </Task>
-  <Task priority="1" completed="False" bugfix="False">
-    <Summary>TODO: These shouldn't be called here...</Summary>
-    <Description></Description>
-    <Created>2009-03-01, 01:10:29</Created>
-    <Resource>
-      <Filename>openlp/core/pluginmanager.py</Filename>
-      <Linenumber>108</Linenumber>
-    </Resource>
-  </Task>
-</Tasks>
\ No newline at end of file

=== removed file '.gitignore'
--- .gitignore	2009-02-14 08:33:32 +0000
+++ .gitignore	1970-01-01 00:00:00 +0000
@@ -1,7 +0,0 @@
-*.pyc
-*.*~
-*.log
-\#*\#
-*.eric4project
-*.ropeproject
-*.e4*

=== removed file 'openlp.org 2.0.e4p'
--- openlp.org 2.0.e4p	2009-05-01 22:26:43 +0000
+++ openlp.org 2.0.e4p	1970-01-01 00:00:00 +0000
@@ -1,330 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Project SYSTEM "Project-4.6.dtd">
-<!-- eric4 project file for project openlp.org 2.0 -->
-<!-- Saved: 2009-05-02, 00:15:57 -->
-<!-- Copyright (C) 2009 Raoul Snyman, raoulsnyman@xxxxxxxxxx -->
-<Project version="4.6">
-  <Language>en</Language>
-  <ProgLanguage mixed="0">Python</ProgLanguage>
-  <ProjectType>Qt4</ProjectType>
-  <Description></Description>
-  <Version>1.9.0</Version>
-  <Author>Raoul Snyman</Author>
-  <Email>raoulsnyman@xxxxxxxxxx</Email>
-  <Sources>
-    <Source>openlp.pyw</Source>
-    <Source>openlp/controls/__init__.py</Source>
-    <Source>openlp/core/test/test_render_theme.py</Source>
-    <Source>openlp/core/test/test_render.py</Source>
-    <Source>openlp/core/__init__.py</Source>
-    <Source>openlp/__init__.py</Source>
-    <Source>demo.py</Source>
-    <Source>openlp/core/settingsmanager.py</Source>
-    <Source>openlp/plugins/__init__.py</Source>
-    <Source>openlp/core/ui/__init__.py</Source>
-    <Source>openlp/core/ui/mainwindow.py</Source>
-    <Source>openlp/core/ui/splashscreen.py</Source>
-    <Source>openlp/core/ui/alertform.py</Source>
-    <Source>openlp/core/ui/about.py</Source>
-    <Source>openlp/plugins/songs/songsplugin.py</Source>
-    <Source>openlp/plugins/songs/__init__.py</Source>
-    <Source>openlp/plugins/songs/forms/__init__.py</Source>
-    <Source>openlp/plugins/songs/forms/openlpimportform.py</Source>
-    <Source>openlp/plugins/songs/forms/editsongform.py</Source>
-    <Source>openlp/plugins/songs/forms/opensongexportform.py</Source>
-    <Source>openlp/plugins/songs/forms/openlpexportform.py</Source>
-    <Source>openlp/plugins/songs/forms/opensongimportform.py</Source>
-    <Source>openlp/core/utils/__init__.py</Source>
-    <Source>openlp/core/theme/__init__.py</Source>
-    <Source>openlp/core/theme/theme.py</Source>
-    <Source>openlp/plugins/songs/test/test_song_opensong.py</Source>
-    <Source>openlp/plugins/songs/test/test_song_basic.py</Source>
-    <Source>openlp/plugins/songs/test/test_song_verse.py</Source>
-    <Source>openlp/plugins/songs/test/test_song_text.py</Source>
-    <Source>openlp/core/theme/test/test_theme.py</Source>
-    <Source>openlp/core/resources.py</Source>
-    <Source>openlp/core/lib/__init__.py</Source>
-    <Source>openlp/core/lib/xmlrootclass.py</Source>
-    <Source>openlp/core/lib/plugin.py</Source>
-    <Source>openlp/core/lib/mediamanageritem.py</Source>
-    <Source>openlp/core/lib/event.py</Source>
-    <Source>openlp/core/utils/confighelper.py</Source>
-    <Source>openlp/core/utils/winregistry.py</Source>
-    <Source>openlp/core/utils/registry.py</Source>
-    <Source>openlp/core/utils/linregistry.py</Source>
-    <Source>setup.py</Source>
-    <Source>openlp/core/lib/pluginconfig.py</Source>
-    <Source>openlp/core/test/test_plugin_manager.py</Source>
-    <Source>openlp/core/test/test_mediamanageritem.py</Source>
-    <Source>openlp/core/test/testplugins/testplugin1.py</Source>
-    <Source>openlp/core/test/testplugins/testplugin2/__init__.py</Source>
-    <Source>openlp/core/test/testplugins/testplugin2/testplugin2.py</Source>
-    <Source>openlp/plugins/bibles/bibleplugin.py</Source>
-    <Source>openlp/plugins/bibles/forms/bibleimportdialog.py</Source>
-    <Source>openlp/plugins/bibles/forms/bibleimportform.py</Source>
-    <Source>openlp/plugins/bibles/lib/bibleDBimpl.py</Source>
-    <Source>openlp/plugins/bibles/lib/bibleOSISimpl.py</Source>
-    <Source>openlp/plugins/bibles/lib/bibleHTTPimpl.py</Source>
-    <Source>openlp/plugins/bibles/lib/bibleCSVimpl.py</Source>
-    <Source>openlp/plugins/bibles/__init__.py</Source>
-    <Source>openlp/plugins/bibles/lib/__init__.py</Source>
-    <Source>openlp/plugins/bibles/forms/__init__.py</Source>
-    <Source>openlp/plugins/songs/lib/__init__.py</Source>
-    <Source>openlp/plugins/songs/lib/songxml.py</Source>
-    <Source>openlp/plugins/songs/lib/models.py</Source>
-    <Source>openlp/plugins/bibles/test/__init__.py</Source>
-    <Source>openlp/plugins/bibles/test/test_bibleManagerAPI.py</Source>
-    <Source>openlp/plugins/bibles/test/test_bibleManager.py</Source>
-    <Source>openlp/plugins/bibles/test/test_bibleManagerOSIS.py</Source>
-    <Source>openlp/plugins/bibles/test/test_bibleManagerCSV.py</Source>
-    <Source>openlp/plugins/presentations/lib/pptview.py</Source>
-    <Source>openlp/plugins/presentations/lib/impresscom.py</Source>
-    <Source>openlp/plugins/presentations/lib/powerpoint.py</Source>
-    <Source>openlp/plugins/presentations/lib/pptviewlib/ppttest.py</Source>
-    <Source>openlp/plugins/presentations/__init__.py</Source>
-    <Source>openlp/plugins/presentations/presentationplugin.py</Source>
-    <Source>openlp/plugins/videos/__init__.py</Source>
-    <Source>openlp/plugins/videos/videoplugin.py</Source>
-    <Source>openlp/plugins/images/__init__.py</Source>
-    <Source>openlp/plugins/images/imageplugin.py</Source>
-    <Source>openlp/plugins/songs/forms/editsongdialog.py</Source>
-    <Source>openlpcnv.pyw</Source>
-    <Source>openlp/plugins/songs/forms/songbookdialog.py</Source>
-    <Source>openlp/plugins/songs/forms/topicsdialog.py</Source>
-    <Source>openlp/plugins/songs/forms/authorsdialog.py</Source>
-    <Source>openlp/plugins/songs/forms/topicsform.py</Source>
-    <Source>openlp/plugins/songs/forms/authorsform.py</Source>
-    <Source>openlp/plugins/songs/forms/songbookform.py</Source>
-    <Source>openlp/migration/__init__.py</Source>
-    <Source>openlp/migration/migratefiles.py</Source>
-    <Source>openlp/migration/migratesongs.py</Source>
-    <Source>openlp/migration/display.py</Source>
-    <Source>openlp/migration/migratebibles.py</Source>
-    <Source>openlp/plugins/songs/lib/tables.py</Source>
-    <Source>openlp/plugins/songs/lib/classes.py</Source>
-    <Source>openlp/plugins/songs/lib/manager.py</Source>
-    <Source>openlp/plugins/bibles/lib/classes.py</Source>
-    <Source>openlp/plugins/bibles/lib/tables.py</Source>
-    <Source>openlp/plugins/bibles/lib/manager.py</Source>
-    <Source>openlp/plugins/bibles/lib/common.py</Source>
-    <Source>openlp/plugins/songs/lib/meta.py</Source>
-    <Source>openlp/core/test/testplugins/deeper/__init__.py</Source>
-    <Source>openlp/core/test/testplugins/deeper/toodeep/__init__.py</Source>
-    <Source>openlp/core/test/testplugins/deeper/toodeep/plugin3toodeep.py</Source>
-    <Source>openlp/core/lib/serviceitem.py</Source>
-    <Source>openlp/core/ui/slidecontroller.py</Source>
-    <Source>openlp/core/lib/eventreceiver.py</Source>
-    <Source>openlp/core/ui/servicemanager.py</Source>
-    <Source>openlp/core/lib/toolbar.py</Source>
-    <Source>openlp/core/ui/settingsform.py</Source>
-    <Source>openlp/core/ui/generaltab.py</Source>
-    <Source>openlp/core/ui/themestab.py</Source>
-    <Source>openlp/core/ui/alertstab.py</Source>
-    <Source>openlp/core/ui/settingsdialog.py</Source>
-    <Source>openlp/core/lib/settingstab.py</Source>
-    <Source>openlp/plugins/bibles/lib/biblestab.py</Source>
-    <Source>openlp/plugins/songs/lib/songstab.py</Source>
-    <Source>openlp/plugins/videos/lib/__init__.py</Source>
-    <Source>openlp/plugins/videos/lib/videotab.py</Source>
-    <Source>openlp/core/ui/test/test_service_manager.py</Source>
-    <Source>openlp/plugins/images/lib/__init__.py</Source>
-    <Source>openlp/plugins/images/lib/imageserviceitem.py</Source>
-    <Source>openlp/plugins/images/lib/listwithpreviews.py</Source>
-    <Source>openlp/plugins/songs/forms/editverseform.py</Source>
-    <Source>openlp/plugins/songs/forms/editversedialog.py</Source>
-    <Source>openlp/plugins/custom/__init__.py</Source>
-    <Source>openlp/plugins/custom/customplugin.py</Source>
-    <Source>openlp/plugins/custom/forms/__init__.py</Source>
-    <Source>openlp/plugins/custom/forms/editcustomform.py</Source>
-    <Source>openlp/plugins/custom/forms/editcustomdialog.py</Source>
-    <Source>openlp/plugins/custom/lib/__init__.py</Source>
-    <Source>openlp/plugins/custom/lib/customtab.py</Source>
-    <Source>openlp/plugins/custom/lib/classes.py</Source>
-    <Source>openlp/plugins/custom/lib/tables.py</Source>
-    <Source>openlp/plugins/custom/lib/meta.py</Source>
-    <Source>openlp/plugins/custom/lib/models.py</Source>
-    <Source>openlp/plugins/custom/lib/manager.py</Source>
-    <Source>openlp/plugins/images/lib/mediaitem.py</Source>
-    <Source>openlp/plugins/songs/lib/mediaitem.py</Source>
-    <Source>openlp/core/ui/maindisplay.py</Source>
-    <Source>openlp/core/ui/amendthemedialog.py</Source>
-    <Source>openlp/core/ui/thememanager.py</Source>
-    <Source>openlp/core/ui/amendthemeform.py</Source>
-    <Source>openlp/core/lib/eventmanager.py</Source>
-    <Source>openlp/core/lib/rendermanager.py</Source>
-    <Source>openlp/core/lib/renderer.py</Source>
-    <Source>openlp/core/lib/songxmlhandler.py</Source>
-    <Source>openlp/core/lib/pluginmanager.py</Source>
-    <Source>openlp/core/lib/themexmlhandler.py</Source>
-    <Source>openlp/plugins/bibles/lib/mediaitem.py</Source>
-    <Source>openlp/plugins/bibles/lib/textlistdata.py</Source>
-    <Source>openlp/plugins/presentations/lib/__init__.py</Source>
-    <Source>openlp/plugins/presentations/lib/mediaitem.py</Source>
-    <Source>openlp/plugins/presentations/lib/filelistdata.py</Source>
-    <Source>openlp/plugins/videos/lib/mediaitem.py</Source>
-    <Source>openlp/plugins/videos/lib/filelistdata.py</Source>
-    <Source>openlp/plugins/custom/lib/mediaitem.py</Source>
-    <Source>openlp/plugins/custom/lib/textlistdata.py</Source>
-    <Source>openlp/plugins/custom/lib/customserviceitem.py</Source>
-    <Source>resources/images/openlp-2_rc.py</Source>
-  </Sources>
-  <Forms>
-    <Form>resources/forms/openlpexportform.ui</Form>
-    <Form>resources/forms/opensongexportform.ui</Form>
-    <Form>resources/forms/about.ui</Form>
-    <Form>resources/forms/settings.ui</Form>
-    <Form>resources/forms/themewizard.ui</Form>
-    <Form>resources/forms/opensongimportform.ui</Form>
-    <Form>resources/forms/alertform.ui</Form>
-    <Form>resources/forms/mainwindow.ui</Form>
-    <Form>resources/forms/songexport.ui</Form>
-    <Form>resources/forms/openlpimportform.ui</Form>
-    <Form>resources/forms/splashscreen.ui</Form>
-    <Form>resources/forms/authorsdialog.ui</Form>
-    <Form>resources/forms/bibleimportdialog.ui</Form>
-    <Form>resources/forms/songbookdialog.ui</Form>
-    <Form>resources/forms/topicsdialog.ui</Form>
-    <Form>resources/forms/editsongdialog.ui</Form>
-    <Form>resources/forms/editversedialog.ui</Form>
-    <Form>resources/forms/editcustomdialog.ui</Form>
-    <Form>resources/forms/amendthemedialog.ui</Form>
-  </Forms>
-  <Translations>
-  </Translations>
-  <Resources>
-    <Resource>resources/images/openlp-2.qrc</Resource>
-  </Resources>
-  <Interfaces>
-  </Interfaces>
-  <Others>
-    <Other>copyright.txt</Other>
-    <Other>documentation/SongFormat.txt</Other>
-    <Other>documentation/pyqt-sql-py2exe.txt</Other>
-    <Other>documentation/PluginDevelopersGuide.txt</Other>
-  </Others>
-  <MainScript>openlp.pyw</MainScript>
-  <Vcs>
-    <VcsType>None</VcsType>
-    <VcsOptions>
-      <dict>
-        <key>
-          <string>add</string>
-        </key>
-        <value>
-          <list>
-            <string></string>
-          </list>
-        </value>
-        <key>
-          <string>checkout</string>
-        </key>
-        <value>
-          <list>
-            <string></string>
-          </list>
-        </value>
-        <key>
-          <string>commit</string>
-        </key>
-        <value>
-          <list>
-            <string></string>
-          </list>
-        </value>
-        <key>
-          <string>diff</string>
-        </key>
-        <value>
-          <list>
-            <string></string>
-          </list>
-        </value>
-        <key>
-          <string>export</string>
-        </key>
-        <value>
-          <list>
-            <string></string>
-          </list>
-        </value>
-        <key>
-          <string>global</string>
-        </key>
-        <value>
-          <list>
-            <string></string>
-          </list>
-        </value>
-        <key>
-          <string>history</string>
-        </key>
-        <value>
-          <list>
-            <string></string>
-          </list>
-        </value>
-        <key>
-          <string>log</string>
-        </key>
-        <value>
-          <list>
-            <string></string>
-          </list>
-        </value>
-        <key>
-          <string>remove</string>
-        </key>
-        <value>
-          <list>
-            <string></string>
-          </list>
-        </value>
-        <key>
-          <string>status</string>
-        </key>
-        <value>
-          <list>
-            <string></string>
-          </list>
-        </value>
-        <key>
-          <string>tag</string>
-        </key>
-        <value>
-          <list>
-            <string></string>
-          </list>
-        </value>
-        <key>
-          <string>update</string>
-        </key>
-        <value>
-          <list>
-            <string></string>
-          </list>
-        </value>
-      </dict>
-    </VcsOptions>
-    <VcsOtherData>
-      <dict>
-        <key>
-          <string>standardLayout</string>
-        </key>
-        <value>
-          <bool>True</bool>
-        </value>
-      </dict>
-    </VcsOtherData>
-  </Vcs>
-  <FiletypeAssociations>
-    <FiletypeAssociation pattern="*.ui" type="FORMS" />
-    <FiletypeAssociation pattern="*.idl" type="INTERFACES" />
-    <FiletypeAssociation pattern="*.qm" type="TRANSLATIONS" />
-    <FiletypeAssociation pattern="*.ptl" type="SOURCES" />
-    <FiletypeAssociation pattern="*.pyw" type="SOURCES" />
-    <FiletypeAssociation pattern="*.ui.h" type="FORMS" />
-    <FiletypeAssociation pattern="*.ts" type="TRANSLATIONS" />
-    <FiletypeAssociation pattern="*.py" type="SOURCES" />
-    <FiletypeAssociation pattern="*.qrc" type="RESOURCES" />
-  </FiletypeAssociations>
-</Project>
\ No newline at end of file

=== removed file 'openlp.org 2.0.e4x'
--- openlp.org 2.0.e4x	2008-11-03 19:32:54 +0000
+++ openlp.org 2.0.e4x	1970-01-01 00:00:00 +0000
@@ -1,45 +0,0 @@
-SOURCES = openlp/theme/test/test_theme.py \
-	openlp/theme/__init__.py \
-	openlp/theme/theme.py \
-	openlp/controls/__init__.py \
-	openlp/core/test/test_render_theme.py \
-	openlp/core/test/test_render.py \
-	openlp/core/interpolate.py \
-	openlp/core/__init__.py \
-	openlp/core/render.py \
-	openlp/ui/__init__.py \
-	openlp/ui/forms/__init__.py \
-	openlp/__init__.py \
-	openlp/utils/ConfigHelper.py \
-	openlp/utils/__init__.py \
-	demo.py \
-	openlp/core/settingsmanager.py \
-	openlp/resources/openlp_rc.py \
-	openlp/resources/__init__.py \
-	openlp/ui/forms/about.py \
-	openlp/ui/forms/mainwindow.py \
-	openlp/core/plugin.py \
-	openlp/core/xmlrootclass.py \
-	openlp/song/__init__.py \
-	openlp/song/song.py \
-	openlp/song/test/test_song_opensong.py \
-	openlp/song/test/test_song_basic.py \
-	openlp/song/test/test_song_text.py \
-	openlp/plugins/biblemanager/__init__.py \
-	openlp/plugins/biblemanager/BibleDBImpl.py \
-	openlp/plugins/biblemanager/BibleManager.py \
-	openlp/plugins/biblemanager/BibleHTTPImpl.py \
-	openlp/plugins/biblemanager/test/__init__.py \
-	openlp/plugins/biblemanager/test/test_bibleManager.py 
-
-FORMS = openlp/resources/forms/mainwindow.ui \
-	openlp/resources/forms/settings.ui \
-	openlp/resources/forms/themewizard.ui \
-	openlp/resources/forms/about.ui \
-	openlp/resources/forms/editsongform.ui \
-	openlp/resources/forms/alertform.ui \
-	openlp/resources/forms/openlpimportform.ui \
-	openlp/resources/forms/openlpexportform.ui 
-
-TRANSLATIONS = openlp_en.ts 
-

=== modified file 'openlp.pyw'
--- openlp.pyw	2009-05-01 11:50:09 +0000
+++ openlp.pyw	2009-05-04 13:48:12 +0000
@@ -27,7 +27,7 @@
 
 logging.basicConfig(level=logging.DEBUG,
                 format=u'%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
-                datefmt=u'%m-%d %H:%M',
+                datefmt=u'%m-%d %H:%M:%S',
                 filename=u'openlp.log',
                 filemode=u'w')
 

=== modified file 'openlp/core/lib/renderer.py'
--- openlp/core/lib/renderer.py	2009-05-01 05:02:53 +0000
+++ openlp/core/lib/renderer.py	2009-05-04 13:48:12 +0000
@@ -114,7 +114,6 @@
 
     def render_screen(self, screennum):
         log.debug(u'render screen\n %s %s ', screennum, self.words[screennum])
-        import time
         t=0.0
         words=self.words[screennum]
         retval=self._render_lines(words)
@@ -173,7 +172,6 @@
             else:
                 p.fillRect(self._paint.rect(), QtGui.QColor(u'#000000'))
         p.end()
-        log.debug(u'render background done')
 
     def split_set_of_lines(self, lines, footer):
 
@@ -252,7 +250,7 @@
 
     def render_lines(self, lines, footer_lines=None):
         """render a set of lines according to the theme, return bounding box"""
-        #log.debug(u'_render_lines %s', lines)
+        log.debug(u'_render_lines %s', lines)
 
         bbox=self._render_lines_unaligned(lines, False) # Main font
         if footer_lines is not None:
@@ -264,11 +262,8 @@
         bbox=self._render_lines_unaligned(lines, False,  (x, y))
 
         if footer_lines is not None:
-            #x, y = self._correctAlignment(self._rect_footer, bbox1)
             bbox=self._render_lines_unaligned(footer_lines, True, (self._rect_footer.left(), self._rect_footer.top()) )
 
-        log.debug(u'render lines DONE')
-
         return bbox
 
     def _render_lines_unaligned(self, lines,  footer,  tlcorner=(0,0)):
@@ -279,7 +274,7 @@
         than a screenful (eg. by using split_set_of_lines)
 
         Returns the bounding box of the text as QRect"""
-        log.debug(u'render unaligned %s', lines)
+        log.debug(u'render lines unaligned %s', lines)
         x, y=tlcorner
         brx=x
         bry=y
@@ -298,7 +293,7 @@
             p.setPen(QtGui.QPen(QtGui.QColor(0,0,255)))
             p.drawRect(retval)
             p.end()
-        log.debug(u'render unaligned DONE')
+
 
         return  retval
 
@@ -410,7 +405,7 @@
 
         return width and height of text as a tuple (w,h)"""
         # setup defaults
-        #log.debug(u"_get_extent_and_render %s %s %s ", [line], tlcorner, draw)
+        log.debug(u'_get_extent_and_render %s %s %s ', [line], tlcorner, draw)
         p=QtGui.QPainter()
         p.begin(self._paint)
         # 'twould be more efficient to set this once when theme changes

=== modified file 'openlp/core/lib/rendermanager.py'
--- openlp/core/lib/rendermanager.py	2009-05-02 11:16:08 +0000
+++ openlp/core/lib/rendermanager.py	2009-05-04 13:48:12 +0000
@@ -18,6 +18,7 @@
 Place, Suite 330, Boston, MA 02111-1307 USA
 """
 import logging
+import time
 import os,  os.path
 import sys
 from PyQt4 import QtGui, QtCore, Qt
@@ -41,21 +42,20 @@
         self.current_display = 0
         self.renderer = Renderer(None)
         self.calculate_default(self.screen_list[self.current_display]['size'])
-        self.frame = None
 
     def set_override_theme(self, theme):
-        log.debug("set override theme to %s",  theme)
+        log.debug(u'set override theme to %s',  theme)
         if theme is not None:
             self.theme = theme
         else:
             self.theme = self.default_theme
-        log.debug("theme is now %s",  self.theme)
+        log.debug(u'theme is now %s',  self.theme)
         self.themedata = self.theme_manager.getThemeData(self.theme)
         self.renderer.set_theme(self.themedata)
         self.build_text_rectangle(self.themedata)
 
     def build_text_rectangle(self, theme):
-
+        log.debug(u'build_text_rectangle ')
         main_rect = None
         footer_rect = None
 
@@ -74,6 +74,7 @@
         self.renderer.set_text_rectangle(main_rect,footer_rect)
 
     def generate_preview(self, themedata):
+        log.debug(u'generate preview ')
         self.calculate_default(QtCore.QSize(800,600))
         self.renderer.set_theme(themedata)
         self.build_text_rectangle(themedata)
@@ -94,25 +95,23 @@
         return frame
 
     def format_slide(self, words, footer):
-        self.calculate_default(QtCore.QSize(800,600))
-        frame = QtGui.QPixmap(self.width, self.height)
-        self.renderer.set_paint_dest(frame)
+        log.debug(u'format slide')
+        self.calculate_default(self.screen_list[self.current_display]['size'])
+        self.renderer.set_paint_dest(QtGui.QPixmap(self.width, self.height))
         return self.renderer.format_slide(words, footer)
 
-    def generate_slide(self,main_text, footer_text, preview=True):
-        if preview == True:
-            self.calculate_default(QtCore.QSize(800,600))
+    def generate_slide(self,main_text, footer_text):
+        log.debug(u'generate slide')
+        self.calculate_default(self.screen_list[self.current_display]['size'])
 
         frame = QtGui.QPixmap(self.width, self.height)
         self.renderer.set_paint_dest(frame)
-
         answer=self.renderer.render_lines(main_text, footer_text)
         return frame
 
     def calculate_default(self, screen):
+        log.debug(u'calculate default %s' , screen)
         self.width = screen.width()
         self.height = screen.height()
+        log.debug(u'calculate default %d,%d' , self.width, self.height)
         self.footer_start = int(self.height*0.95) # 95% is start of footer
-        #update the rederer frame
-        self.frame = QtGui.QPixmap(self.width, self.height)
-        self.renderer.set_paint_dest(self.frame)

=== modified file 'openlp/core/lib/serviceitem.py'
--- openlp/core/lib/serviceitem.py	2009-05-02 18:56:27 +0000
+++ openlp/core/lib/serviceitem.py	2009-05-04 13:48:12 +0000
@@ -19,7 +19,8 @@
 """
 import logging
 import types
-from PyQt4 import QtCore, QtGui
+import time
+
 from PyQt4.QtCore import *
 from PyQt4.QtGui import *
 
@@ -51,34 +52,34 @@
 
     def addIcon(self, icon):
         ButtonIcon = None
-        if type(icon) is QtGui.QIcon:
+        if type(icon) is QIcon:
             ButtonIcon = icon
         elif type(icon) is types.StringType or type(icon) is types.UnicodeType:
-            ButtonIcon = QtGui.QIcon()
+            ButtonIcon = QIcon()
             if icon.startswith(u':/'):
-                ButtonIcon.addPixmap(QtGui.QPixmap(icon), QtGui.QIcon.Normal,
-                    QtGui.QIcon.Off)
+                ButtonIcon.addPixmap(QPixmap(icon), QIcon.Normal,
+                    QIcon.Off)
             else:
-                ButtonIcon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)),
-                    QtGui.QIcon.Normal, QtGui.QIcon.Off)
+                ButtonIcon.addPixmap(QPixmap.fromImage(QImage(icon)),
+                    QIcon.Normal, QIcon.Off)
         self.iconic_representation = ButtonIcon
 
     def render(self):
         """
-        The render method is what the plugin uses to render it's meda to the
-        screen.
+        The render method is what renders the frames for the screen.
         """
         log.debug(u'Render called')
         if self.theme == None:
             self.render_manager.set_override_theme(None)
         else:
             self.render_manager.set_override_theme(self.theme)
-
+        log.debug(u'Formatting slides')
         for slide in self.raw_slides:
             self.format_slides.append(self.render_manager.format_slide(slide, False))
+        log.debug(u'Rendering slides')
         for slide in self.format_slides:
+            self.frames.append(self.render_manager.generate_slide(slide, self.raw_footer))
 
-            self.frames.append(self.render_manager.generate_slide(slide, self.raw_footer, False))
 
     def get_parent_node(self):
         """

=== modified file 'openlp/core/ui/maindisplay.py'
--- openlp/core/ui/maindisplay.py	2009-05-03 07:20:15 +0000
+++ openlp/core/ui/maindisplay.py	2009-05-04 13:51:56 +0000
@@ -29,6 +29,9 @@
         self.setWindowTitle(u'OpenLP Display')
         self.screens = screens
         self.display = QtGui.QLabel(self)
+        self.display.setScaledContents(True)
+        self.displayBlank = False
+        self.blankFrame= None
 
     def setup(self, screenNumber):
         """
@@ -51,8 +54,24 @@
         else:
             self.showMinimized()
 
+        painter=QtGui.QPainter()
+        self.blankFrame = QtGui.QPixmap(800, 600)
+        painter.begin(self.blankFrame)
+        painter.fillRect(self.blankFrame.rect(), QtGui.QColor(u'#000000'))
+
     def frameView(self, frame):
-        self.display.setPixmap(frame)
+        if self.displayBlank == False:
+            self.display.setPixmap(frame)
+            self.frame = frame
+
+    def blankDisplay(self):
+        if self.displayBlank == False:
+            self.displayBlank = True
+            self.display.setPixmap(self.blankFrame)
+        else:
+            self.displayBlank = False
+            self.frameView(self.frame)
+
 
     def kill(self):
         pass

=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py	2009-05-03 07:20:15 +0000
+++ openlp/core/ui/mainwindow.py	2009-05-04 08:15:48 +0000
@@ -97,8 +97,6 @@
 
         # Initialise SlideControllers
         log.info(u'Set Up SlideControllers')
-        self.PreviewController.isLive = False
-        self.LiveController.isLive = True
         self.LiveController.mainDisplay = self.main_display
 
     def setupUi(self):
@@ -130,8 +128,8 @@
         self.ControlSplitter.setOrientation(QtCore.Qt.Horizontal)
         self.ControlSplitter.setObjectName(u'ControlSplitter')
         self.MainContentLayout.addWidget(self.ControlSplitter)
-        self.PreviewController = SlideController(self.ControlSplitter)
-        self.LiveController = SlideController(self.ControlSplitter)
+        self.PreviewController = SlideController(self.ControlSplitter, False)
+        self.LiveController = SlideController(self.ControlSplitter, True)
         self.MenuBar = QtGui.QMenuBar(self.main_window)
         self.MenuBar.setGeometry(QtCore.QRect(0, 0, 1087, 27))
         self.MenuBar.setObjectName(u'MenuBar')
@@ -296,10 +294,10 @@
             QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.ToolsAddToolItem.setIcon(AddToolIcon)
         self.ToolsAddToolItem.setObjectName(u'ToolsAddToolItem')
-        self.action_Preview_Pane = QtGui.QAction(self.main_window)
-        self.action_Preview_Pane.setCheckable(True)
-        self.action_Preview_Pane.setChecked(True)
-        self.action_Preview_Pane.setObjectName(u'action_Preview_Pane')
+        self.action_Preview_Panel = QtGui.QAction(self.main_window)
+        self.action_Preview_Panel.setCheckable(True)
+        self.action_Preview_Panel.setChecked(True)
+        self.action_Preview_Panel.setObjectName(u'action_Preview_Panel')
         self.ModeLiveItem = QtGui.QAction(self.main_window)
         self.ModeLiveItem.setObjectName(u'ModeLiveItem')
         self.FileImportMenu.addAction(self.ImportThemeItem)
@@ -322,7 +320,7 @@
         self.OptionsViewMenu.addAction(self.ViewServiceManagerItem)
         self.OptionsViewMenu.addAction(self.ViewThemeManagerItem)
         self.OptionsViewMenu.addSeparator()
-        self.OptionsViewMenu.addAction(self.action_Preview_Pane)
+        self.OptionsViewMenu.addAction(self.action_Preview_Panel)
         self.OptionsLanguageMenu.addAction(self.LanguageEnglishItem)
         self.OptionsLanguageMenu.addSeparator()
         self.OptionsLanguageMenu.addAction(self.LanguageTranslateItem)
@@ -353,8 +351,8 @@
             QtCore.SIGNAL(u'triggered(bool)'), self.ServiceManagerDock.setVisible)
         QtCore.QObject.connect(self.ViewThemeManagerItem,
             QtCore.SIGNAL(u'triggered(bool)'), self.ThemeManagerDock.setVisible)
-        QtCore.QObject.connect(self.action_Preview_Pane,
-            QtCore.SIGNAL(u'toggled(bool)'), self.PreviewController.Pane.setVisible)
+        QtCore.QObject.connect(self.action_Preview_Panel,
+            QtCore.SIGNAL(u'toggled(bool)'), self.PreviewController.Panel.setVisible)
         QtCore.QObject.connect(self.MediaManagerDock,
             QtCore.SIGNAL(u'visibilityChanged(bool)'), self.ViewMediaManagerItem.setChecked)
         QtCore.QObject.connect(self.ServiceManagerDock,
@@ -451,7 +449,7 @@
         self.LanguageEnglishItem.setStatusTip(translate(u'main_window', u'Set the interface language to English'))
         self.ToolsAddToolItem.setText(translate(u'main_window', u'&Add Tool...'))
         self.ToolsAddToolItem.setStatusTip(translate(u'main_window', u'Add an application to the list of tools'))
-        self.action_Preview_Pane.setText(translate(u'main_window', u'&Preview Pane'))
+        self.action_Preview_Panel.setText(translate(u'main_window', u'&Preview Pane'))
         self.ModeLiveItem.setText(translate(u'main_window', u'&Live'))
 
     def show(self):

=== modified file 'openlp/core/ui/servicemanager.py'
--- openlp/core/ui/servicemanager.py	2009-05-02 18:56:27 +0000
+++ openlp/core/ui/servicemanager.py	2009-05-04 08:15:48 +0000
@@ -21,15 +21,16 @@
 
 from time import sleep
 from copy import deepcopy
-from PyQt4 import *
-from PyQt4 import QtCore, QtGui
+
 from PyQt4.QtCore import *
 from PyQt4.QtGui import *
+
 # from openlp.core.resources import *
 # from openlp.core.ui import AboutForm, AlertForm, SettingsForm, SlideController
 from openlp.core.lib import OpenLPToolbar
 from openlp.core.lib import ServiceItem
 from openlp.core.lib import RenderManager
+from openlp.core import translate
 
 # from openlp.core import PluginManager
 import logging
@@ -47,6 +48,9 @@
         self.items=[]
         log.info("Starting")
 
+    def clearItems(self):
+        self.items = []
+
     def columnCount(self, parent):
         return 1; # always only a single column (for now)
 
@@ -122,33 +126,73 @@
     def __init__(self, parent):
         QWidget.__init__(self)
         self.parent=parent
-        self.Layout = QtGui.QVBoxLayout(self)
+        self.Layout = QVBoxLayout(self)
         self.Layout.setSpacing(0)
         self.Layout.setMargin(0)
         self.Toolbar = OpenLPToolbar(self)
-        self.Toolbar.addToolbarButton("Move to top", ":/services/service_top.png")
-        self.Toolbar.addToolbarButton("Move up", ":/services/service_up.png")
-        self.Toolbar.addToolbarButton("Move down", ":/services/service_down.png")
-        self.Toolbar.addToolbarButton("Move to bottom", ":/services/service_bottom.png")
-        self.Toolbar.addSeparator()
-        self.Toolbar.addToolbarButton("New Service", ":/services/service_new.png")
-        self.Toolbar.addToolbarButton("Save Service", ":/services/service_save.png")
-        self.Toolbar.addSeparator()
-        self.ThemeComboBox = QtGui.QComboBox(self.Toolbar)
-        self.ThemeComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
-        self.ThemeWidget = QtGui.QWidgetAction(self.Toolbar)
+        self.Toolbar.addToolbarButton("Move to top", ":/services/service_top.png",
+            translate(u'ServiceManager', u'Move to start'), self.onServiceTop)
+        self.Toolbar.addToolbarButton("Move up", ":/services/service_up.png",
+            translate(u'ServiceManager', u'Move up order'), self.onServiceUp)
+        self.Toolbar.addToolbarButton("Move down", ":/services/service_down.png",
+            translate(u'ServiceManager', u'Move down order'), self.onServiceDown)
+        self.Toolbar.addToolbarButton("Move to bottom", ":/services/service_bottom.png",
+            translate(u'ServiceManager', u'Move to end'), self.onServiceEnd)
+        self.Toolbar.addSeparator()
+        self.Toolbar.addToolbarButton("New Service", ":/services/service_new.png",
+            translate(u'ServiceManager', u'Create a new Service'), self.onNewService)
+        self.Toolbar.addToolbarButton("Delete From Service", ":/services/service_delete.png",
+            translate(u'ServiceManager', u'Delete From Service'), self.onDeleteFromService)
+        self.Toolbar.addSeparator()
+        self.Toolbar.addToolbarButton("Save Service", ":/services/service_save.png",
+            translate(u'ServiceManager', u'Save Service'), self.onSaveService)
+        self.Toolbar.addToolbarButton("Load Service", ":/services/service_open.png",
+            translate(u'ServiceManager', u'Load Existing'), self.onLoadService)
+
+        self.Toolbar.addSeparator()
+        self.ThemeComboBox = QComboBox(self.Toolbar)
+        self.ThemeComboBox.setSizeAdjustPolicy(QComboBox.AdjustToContents)
+        self.ThemeWidget = QWidgetAction(self.Toolbar)
         self.ThemeWidget.setDefaultWidget(self.ThemeComboBox)
         self.Toolbar.addAction(self.ThemeWidget)
 
         self.Layout.addWidget(self.Toolbar)
 
-        self.TreeView = QtGui.QTreeView(self)
+        self.TreeView = QTreeView(self)
         self.service_data=ServiceData()
         self.TreeView.setModel(self.service_data)
+        self.TreeView.setAlternatingRowColors(True)
         self.Layout.addWidget(self.TreeView)
 
-        QtCore.QObject.connect(self.ThemeComboBox,
-            QtCore.SIGNAL("activated(int)"), self.onThemeComboBoxSelected)
+        QObject.connect(self.ThemeComboBox,
+            SIGNAL("activated(int)"), self.onThemeComboBoxSelected)
+
+    def onServiceTop(self):
+        pass
+
+    def onServiceUp(self):
+        pass
+
+    def onServiceDown(self):
+        pass
+
+    def onServiceEnd(self):
+        pass
+
+    def onNewService(self):
+        self.service_data.clearItems()
+
+    def onDeleteFromService(self):
+        pass
+
+    def onSaveService(self):
+        Pass
+
+    def onLoadService(self):
+        Pass
+
+
+
 
     def onThemeComboBoxSelected(self, currentIndex):
         self.renderManager.default_theme = self.ThemeComboBox.currentText()

=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py	2009-05-03 07:20:15 +0000
+++ openlp/core/ui/slidecontroller.py	2009-05-04 13:48:12 +0000
@@ -20,10 +20,12 @@
 import logging
 import os
 
-from PyQt4 import QtCore, QtGui
 from PyQt4.QtCore import *
 from PyQt4.QtGui import *
 
+from openlp.core.lib import OpenLPToolbar
+from openlp.core import translate
+
 class SlideData(QAbstractListModel):
     """
     Tree of items for an order of Theme.
@@ -46,14 +48,14 @@
     def columnCount(self, parent):
         return 1
 
-    def rowCount(self, parent):
+    def rowCount(self, parent=None):
         return len(self.items)
 
     def insertRow(self, row, frame):
         self.beginInsertRows(QModelIndex(),row,row)
         log.info(u'insert row %d' % row)
         # create a preview image
-        frame1 = frame.scaled(QtCore.QSize(350,260))
+        frame1 = frame.scaled(QSize(350,260))
         self.items.insert(row,(frame1))
         log.info(u'Items: %s' % self.items)
         self.endInsertRows()
@@ -99,48 +101,112 @@
         return filelist
 
 
-class SlideController(QtGui.QWidget):
+class SlideController(QWidget):
     global log
     log=logging.getLogger(u'SlideController')
 
-    def __init__(self, control_splitter):
-        QtGui.QWidget.__init__(self)
-        self.Pane = QtGui.QWidget(control_splitter)
-        self.Splitter = QtGui.QSplitter(self.Pane)
-        self.Splitter.setOrientation(QtCore.Qt.Vertical)
-
-        self.PaneLayout = QtGui.QVBoxLayout(self.Pane)
-        self.PaneLayout.addWidget(self.Splitter)
-        self.PaneLayout.setSpacing(50)
-        self.PaneLayout.setMargin(0)
-
-        self.Controller = QtGui.QScrollArea(self.Splitter)
+    def __init__(self, control_splitter, isLive):
+        QWidget.__init__(self)
+        self.isLive = isLive
+        self.Panel = QWidget(control_splitter)
+        self.Splitter = QSplitter(self.Panel)
+        self.Splitter.setOrientation(Qt.Vertical)
+
+        self.PanelLayout = QVBoxLayout(self.Panel)
+        self.PanelLayout.addWidget(self.Splitter)
+        self.PanelLayout.setSpacing(50)
+        self.PanelLayout.setMargin(0)
+
+        self.Controller = QScrollArea(self.Splitter)
         self.Controller.setWidgetResizable(True)
 
-        self.PreviewListView = QtGui.QListView(self.Splitter)
+        self.PreviewListView = QListView(self.Splitter)
         self.PreviewListView.setAlternatingRowColors(True)
         self.PreviewListData = SlideData()
         self.PreviewListView.setModel(self.PreviewListData)
-        self.Controller.setGeometry(QtCore.QRect(0, 0, 828, 536))
 
+        self.Controller.setGeometry(QRect(0, 0, 828, 536))
         self.Controller.setWidget(self.PreviewListView)
 
-        self.SlidePreview = QtGui.QLabel(self.Splitter)
-        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+        self.Toolbar = OpenLPToolbar(self.Splitter)
+        sizeToolbarPolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
+        sizeToolbarPolicy.setHorizontalStretch(0)
+        sizeToolbarPolicy.setVerticalStretch(0)
+        sizeToolbarPolicy.setHeightForWidth(self.Toolbar.sizePolicy().hasHeightForWidth())
+
+        if self.isLive:
+            self.Toolbar.addToolbarButton("First Slide", ":/slides/slide_first.png",
+            translate(u'SlideController', u'Move to first'), self.onSlideSelectedFirst)
+        self.Toolbar.addToolbarButton("Last Slide", ":/slides/slide_previous.png",
+            translate(u'SlideController', u'Move to previous'), self.onSlideSelectedPrevious)
+        self.Toolbar.addToolbarButton("First Slide", ":/slides/slide_next.png",
+            translate(u'SlideController', u'Move to next'), self.onSlideSelectedNext)
+        if self.isLive:
+            self.Toolbar.addToolbarButton("Last Slide", ":/slides/slide_last.png",
+                translate(u'SlideController', u'Move to last'), self.onSlideSelectedLast)
+            self.Toolbar.addSeparator()
+            self.Toolbar.addToolbarButton("Close Sscreen", ":/slides/slide_close.png",
+                translate(u'SlideController', u'Close Screen'), self.onBlankScreen)
+
+        self.Toolbar.setSizePolicy(sizeToolbarPolicy)
+
+        self.SlidePreview = QLabel(self.Splitter)
+        sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(self.SlidePreview.sizePolicy().hasHeightForWidth())
         self.SlidePreview.setSizePolicy(sizePolicy)
-        self.SlidePreview.setMinimumSize(QtCore.QSize(250, 190))
-        self.SlidePreview.setFrameShape(QtGui.QFrame.WinPanel)
-        self.SlidePreview.setFrameShadow(QtGui.QFrame.Sunken)
+        self.SlidePreview.setMinimumSize(QSize(250, 190))
+        self.SlidePreview.setFrameShape(QFrame.WinPanel)
+        self.SlidePreview.setFrameShadow(QFrame.Sunken)
         self.SlidePreview.setLineWidth(1)
         self.SlidePreview.setScaledContents(True)
         self.SlidePreview.setObjectName("SlidePreview")
 
-        QtCore.QObject.connect(self.PreviewListView,
-            QtCore.SIGNAL("clicked(QModelIndex)"), self.onSlideSelected)
-
+        QObject.connect(self.PreviewListView,
+            SIGNAL("clicked(QModelIndex)"), self.onSlideSelected)
+
+    def onSlideSelectedFirst(self):
+        row = self.PreviewListData.createIndex(0, 0)
+        if row.isValid():
+            self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent)
+            self.onSlideSelected(row)
+
+    def onSlideSelectedNext(self):
+        indexes = self.PreviewListView.selectedIndexes()
+        rowNumber = 0
+        for index in indexes:
+            if index.row() == self.PreviewListData.rowCount() - 1:
+                rowNumber = 0
+            else:
+                rowNumber = index.row() + 1
+        row = self.PreviewListData.createIndex(rowNumber , 0)
+        if row.isValid():
+            self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent)
+            self.onSlideSelected(row)
+
+
+    def onSlideSelectedPrevious(self):
+        indexes = self.PreviewListView.selectedIndexes()
+        rowNumber = 0
+        for index in indexes:
+            if index.row() == 0:
+                rowNumber = self.PreviewListData.rowCount() - 1
+            else:
+                rowNumber  = index.row() - 1
+        row = self.PreviewListData.createIndex(rowNumber , 0)
+        if row.isValid():
+            self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent)
+            self.onSlideSelected(row)
+
+    def onSlideSelectedLast(self):
+        row = self.PreviewListData.createIndex(self.PreviewListData.rowCount() - 1 , 0)
+        if row.isValid():
+            self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent)
+            self.onSlideSelected(row)
+
+    def onBlankScreen(self):
+        self.mainDisplay.blankDisplay()
 
     def onSlideSelected(self, index):
         frame = self.PreviewListData.getValue(index)
@@ -152,11 +218,17 @@
             self.mainDisplay.frameView(frame)
 
     def addServiceItem(self, serviceitem):
+        log.debug(u'addServiceItem')
         self.serviceitem = serviceitem
         self.serviceitem.render()
         self.PreviewListData.clearItems()
         for frame in self.serviceitem.frames:
             self.PreviewListData.addRow(frame)
 
+        row = self.PreviewListData.createIndex(0, 0)
+        if row.isValid():
+            self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent)
+            self.onSlideSelected(row)
+
     def render(self):
         pass

=== modified file 'openlp/core/ui/thememanager.py'
--- openlp/core/ui/thememanager.py	2009-05-02 18:56:27 +0000
+++ openlp/core/ui/thememanager.py	2009-05-04 08:15:48 +0000
@@ -164,12 +164,13 @@
             translate(u'ThemeManager', u'Export a theme'), self.onExportTheme)
         self.ThemeWidget = QtGui.QWidgetAction(self.Toolbar)
         self.Layout.addWidget(self.Toolbar)
+
         self.ThemeListView = QtGui.QListView(self)
         self.themeData = ThemeData()
         self.ThemeListView.setModel(self.themeData)
         self.ThemeListView.setAlternatingRowColors(True)
         self.Layout.addWidget(self.ThemeListView)
-        self.ThemeListView.setAlternatingRowColors(True)
+
         self.themelist = []
         self.path = os.path.join(ConfigHelper.get_data_path(), u'themes')
         self.checkThemesExists(self.path)

=== modified file 'openlp/plugins/bibles/lib/mediaitem.py'
--- openlp/plugins/bibles/lib/mediaitem.py	2009-05-02 18:56:27 +0000
+++ openlp/plugins/bibles/lib/mediaitem.py	2009-05-04 08:15:48 +0000
@@ -371,10 +371,10 @@
             if len(raw_footer) <= 1:
                 raw_footer.append(book)
 
-        service_item.theme = None
-
-        service_item.raw_slides = raw_slides
-        service_item.raw_footer = raw_footer
+        if len(raw_slides) > 0:
+            service_item.theme = None
+            service_item.raw_slides = raw_slides
+            service_item.raw_footer = raw_footer
 
     def formatVerse(self, old_chapter, chapter, verse, opening, closing):
         loc = opening

=== modified file 'openlp/plugins/custom/lib/mediaitem.py'
--- openlp/plugins/custom/lib/mediaitem.py	2009-05-02 18:56:27 +0000
+++ openlp/plugins/custom/lib/mediaitem.py	2009-05-04 13:48:12 +0000
@@ -187,6 +187,7 @@
             self.CustomListData.deleteRow(index)
 
     def onCustomPreviewClick(self):
+        log.debug(u'Custom Preview Requested')
         service_item = ServiceItem(self.parent)
         service_item.addIcon( ":/media/media_song.png")
         service_item.render_manager = self.parent.render_manager
@@ -194,6 +195,7 @@
         self.parent.preview_controller.addServiceItem(service_item)
 
     def onCustomLiveClick(self):
+        log.debug(u'Custom Live Requested')
         service_item = ServiceItem(self.parent)
         service_item.addIcon( ":/media/media_song.png")
         service_item.render_manager = self.parent.render_manager
@@ -201,6 +203,7 @@
         self.parent.live_controller.addServiceItem(service_item)
 
     def onCustomAddClick(self):
+        log.debug(u'Custom Add Requested')
         service_item = ServiceItem(self.parent)
         service_item.addIcon( ":/media/media_song.png")
         service_item.render_manager = self.parent.render_manager
@@ -226,6 +229,7 @@
             for verse in verseList:
                 raw_slides.append(verse[1])
             raw_footer.append(title + u' '+ credit)
-        service_item.title = title
-        service_item.raw_slides = raw_slides
-        service_item.raw_footer = raw_footer
+        if theme is not None:
+            service_item.title = title
+            service_item.raw_slides = raw_slides
+            service_item.raw_footer = raw_footer


Follow ups