← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~googol/openlp/central-settings-place into lp:openlp

 

Andreas Preikschat has proposed merging lp:~googol/openlp/central-settings-place into lp:openlp.

Requested reviews:
  Tim Bentley (trb143)
  Raoul Snyman (raoul-snyman)
Related bugs:
  Bug #1096559 in OpenLP: "Central place for default settings"
  https://bugs.launchpad.net/openlp/+bug/1096559

For more details, see:
https://code.launchpad.net/~googol/openlp/central-settings-place/+merge/146515

Hello,

- fixed old "songs/ccli number" setting
- do not make changes to the settings file when importing
- move settings file to the tmp dir and clean it up there (so that old config files are "converted" to a state where they look as if they were just exported)
-- 
https://code.launchpad.net/~googol/openlp/central-settings-place/+merge/146515
Your team OpenLP Core is subscribed to branch lp:openlp.
=== modified file '.bzrignore'
--- .bzrignore	2013-02-03 13:35:20 +0000
+++ .bzrignore	2013-02-04 21:03:31 +0000
@@ -25,5 +25,3 @@
 openlp.pro
 .kdev4
 tests.kdev4
-*.nja
-*.orig

=== renamed file 'openlp.py' => 'openlp.pyw'
=== modified file 'openlp/__init__.py'
--- openlp/__init__.py	2013-02-01 19:58:18 +0000
+++ openlp/__init__.py	2013-02-04 21:03:31 +0000
@@ -34,3 +34,4 @@
 import plugins
 
 __all__ = [u'core', u'plugins']
+

=== modified file 'openlp/core/__init__.py'
--- openlp/core/__init__.py	2013-02-03 19:23:12 +0000
+++ openlp/core/__init__.py	2013-02-04 21:03:31 +0000
@@ -43,7 +43,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, Settings, ScreenList, UiStrings, Registry, check_directory_exists
+from openlp.core.lib import Receiver, Settings, check_directory_exists, ScreenList, UiStrings, Registry
 from openlp.core.resources import qInitResources
 from openlp.core.ui.mainwindow import MainWindow
 from openlp.core.ui.firsttimelanguageform import FirstTimeLanguageForm
@@ -92,16 +92,15 @@
         """
         Override exec method to allow the shared memory to be released on exit
         """
-        self.is_event_loop_active = True
-        result = QtGui.QApplication.exec_()
-        self.shared_memory.detach()
-        return result
+        self.eventLoopIsActive = True
+        QtGui.QApplication.exec_()
+        self.sharedMemory.detach()
 
-    def run(self, args):
+    def run(self, args, testing=False):
         """
         Run the OpenLP application.
         """
-        self.is_event_loop_active = False
+        self.eventLoopIsActive = False
         # On Windows, the args passed into the constructor are ignored. Not
         # very handy, so set the ones we want to use. On Linux and FreeBSD, in
         # order to set the WM_CLASS property for X11, we pass "OpenLP" in as a
@@ -110,6 +109,10 @@
         if 'OpenLP' in args:
             args.remove('OpenLP')
         self.args.extend(args)
+        # provide a listener for widgets to reqest a screen update.
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'openlp_process_events'), self.processEvents)
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'cursor_busy'), self.setBusyCursor)
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'cursor_normal'), self.setNormalCursor)
         # Decide how many screens we have and their size
         screens = ScreenList.create(self.desktop())
         # First time checks in settings
@@ -135,89 +138,65 @@
         # make sure Qt really display the splash screen
         self.processEvents()
         # start the main app window
-        self.main_window = MainWindow()
-        self.main_window.show()
+        self.mainWindow = MainWindow(self)
+        self.mainWindow.show()
         if show_splash:
             # now kill the splashscreen
-            self.splash.finish(self.main_window)
+            self.splash.finish(self.mainWindow)
             log.debug(u'Splashscreen closed')
         # make sure Qt really display the splash screen
         self.processEvents()
-        self.main_window.repaint()
+        self.mainWindow.repaint()
         self.processEvents()
         if not has_run_wizard:
-            self.main_window.first_time()
+            self.mainWindow.firstTime()
         update_check = Settings().value(u'general/update check')
         if update_check:
-            VersionThread(self.main_window).start()
+            VersionThread(self.mainWindow).start()
         Receiver.send_message(u'live_display_blank_check')
-        self.main_window.app_startup()
-        return self.exec_()
-
-    def close_splash_screen(self):
-        """
-        Close the splash screen when requested.
-        """
-        self.splash.close()
-
-    def is_already_running(self):
+        self.mainWindow.appStartup()
+        # Skip exec_() for gui tests
+        if not testing:
+            return self.exec_()
+
+    def isAlreadyRunning(self):
         """
         Look to see if OpenLP is already running and ask if a 2nd copy
         is to be started.
         """
-        self.shared_memory = QtCore.QSharedMemory('OpenLP')
-        if self.shared_memory.attach():
+        self.sharedMemory = QtCore.QSharedMemory('OpenLP')
+        if self.sharedMemory.attach():
             status = QtGui.QMessageBox.critical(None, UiStrings().Error, UiStrings().OpenLPStart,
                 QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No))
             if status == QtGui.QMessageBox.No:
                 return True
             return False
         else:
-            self.shared_memory.create(1)
+            self.sharedMemory.create(1)
             return False
 
-    def hook_exception(self, exctype, value, traceback):
-        """
-        Add an exception hook so that any uncaught exceptions are displayed in this window rather than somewhere where
-        users cannot see it and cannot report when we encounter these problems.
-
-        ``exctype``
-            The class of exception.
-
-        ``value``
-            The actual exception object.
-
-        ``traceback``
-            A traceback object with the details of where the exception occurred.
-        """
+    def hookException(self, exctype, value, traceback):
         if not hasattr(self, u'mainWindow'):
             log.exception(''.join(format_exception(exctype, value, traceback)))
             return
         if not hasattr(self, u'exceptionForm'):
-            self.exception_form = ExceptionForm(self.main_window)
-        self.exception_form.exceptionTextEdit.setPlainText(''.join(format_exception(exctype, value, traceback)))
-        self.set_normal_cursor()
-        self.exception_form.exec_()
-
-    def process_events(self):
-        """
-        Wrapper to make ProcessEvents visible and named correctly
-        """
-        self.processEvents()
-
-    def set_busy_cursor(self):
+            self.exceptionForm = ExceptionForm(self.mainWindow)
+        self.exceptionForm.exceptionTextEdit.setPlainText(''.join(format_exception(exctype, value, traceback)))
+        self.setNormalCursor()
+        self.exceptionForm.exec_()
+
+    def setBusyCursor(self):
         """
         Sets the Busy Cursor for the Application
         """
         self.setOverrideCursor(QtCore.Qt.BusyCursor)
         self.processEvents()
 
-    def set_normal_cursor(self):
+    def setNormalCursor(self):
         """
         Sets the Normal Cursor for the Application
         """
         self.restoreOverrideCursor()
-        self.processEvents()
 
     def event(self, event):
         """
@@ -262,6 +241,7 @@
     parser.add_option('-d', '--dev-version', dest='dev_version', action='store_true',
         help='Ignore the version file and pull the version directly from Bazaar')
     parser.add_option('-s', '--style', dest='style', help='Set the Qt4 style (passed directly to Qt4).')
+    parser.add_option('--testing', dest='testing', action='store_true', help='Run by testing framework')
     # Parse command line options and deal with them.
     # Use args supplied programatically if possible.
     (options, args) = parser.parse_args(args) if args else parser.parse_args()
@@ -282,37 +262,38 @@
     # Initialise the resources
     qInitResources()
     # Now create and actually run the application.
-    application = OpenLP(qt_args)
-    application.setOrganizationName(u'OpenLP')
-    application.setOrganizationDomain(u'openlp.org')
+    app = OpenLP(qt_args)
+    app.setOrganizationName(u'OpenLP')
+    app.setOrganizationDomain(u'openlp.org')
     if options.portable:
-        application.setApplicationName(u'OpenLPPortable')
+        app.setApplicationName(u'OpenLPPortable')
         Settings.setDefaultFormat(Settings.IniFormat)
         # Get location OpenLPPortable.ini
-        application_path = AppLocation.get_directory(AppLocation.AppDir)
-        set_up_logging(os.path.abspath(os.path.join(application_path, u'..', u'..', u'Other')))
+        app_path = AppLocation.get_directory(AppLocation.AppDir)
+        set_up_logging(os.path.abspath(os.path.join(app_path, u'..', u'..', u'Other')))
         log.info(u'Running portable')
-        portable_settings_file = os.path.abspath(os.path.join(application_path, u'..', u'..', u'Data', u'OpenLP.ini'))
+        portable_settings_file = os.path.abspath(os.path.join(app_path, u'..', u'..', u'Data', u'OpenLP.ini'))
         # Make this our settings file
         log.info(u'INI file: %s', portable_settings_file)
         Settings.set_filename(portable_settings_file)
         portable_settings = Settings()
         # Set our data path
-        data_path = os.path.abspath(os.path.join(application_path, u'..', u'..', u'Data',))
+        data_path = os.path.abspath(os.path.join(app_path, u'..', u'..', u'Data',))
         log.info(u'Data path: %s', data_path)
         # Point to our data path
         portable_settings.setValue(u'advanced/data path', data_path)
         portable_settings.setValue(u'advanced/is portable', True)
         portable_settings.sync()
     else:
-        application.setApplicationName(u'OpenLP')
+        app.setApplicationName(u'OpenLP')
         set_up_logging(AppLocation.get_directory(AppLocation.CacheDir))
-    Registry.create()
-    Registry().register(u'application', application)
-    application.setApplicationVersion(get_application_version()[u'version'])
+    registry = Registry.create()
+    app.setApplicationVersion(get_application_version()[u'version'])
     # Instance check
-    if application.is_already_running():
-        sys.exit()
+    if not options.testing:
+        # Instance check
+        if app.isAlreadyRunning():
+            sys.exit()
     # First time checks in settings
     if not Settings().value(u'general/has run wizard'):
         if not FirstTimeLanguageForm().exec_():
@@ -320,14 +301,19 @@
             sys.exit()
     # i18n Set Language
     language = LanguageManager.get_language()
-    application_translator, default_translator = LanguageManager.get_translator(language)
-    if not application_translator.isEmpty():
-        application.installTranslator(application_translator)
+    app_translator, default_translator = LanguageManager.get_translator(language)
+    if not app_translator.isEmpty():
+        app.installTranslator(app_translator)
     if not default_translator.isEmpty():
-        application.installTranslator(default_translator)
+        app.installTranslator(default_translator)
     else:
         log.debug(u'Could not find default_translator.')
     if not options.no_error_form:
-        sys.excepthook = application.hook_exception
-    sys.exit(application.run(qt_args))
-
+        sys.excepthook = app.hookException
+    # Do not run method app.exec_() when running gui tests
+    if options.testing:
+        app.run(qt_args, testing=True)
+        # For gui tests we need access to window instances and their components
+        return app
+    else:
+        sys.exit(app.run(qt_args))

=== modified file 'openlp/core/lib/__init__.py'
--- openlp/core/lib/__init__.py	2013-02-02 20:54:34 +0000
+++ openlp/core/lib/__init__.py	2013-02-04 21:03:31 +0000
@@ -90,8 +90,9 @@
     Next = 3
 
 
-def translate(context, text, comment=None, encoding=QtCore.QCoreApplication.CodecForTr, n=-1,
-              translate=QtCore.QCoreApplication.translate):
+def translate(context, text, comment=None,
+    encoding=QtCore.QCoreApplication.CodecForTr, n=-1,
+    translate=QtCore.QCoreApplication.translate):
     """
     A special shortcut method to wrap around the Qt4 translation functions.
     This abstracts the translation procedure so that we can change it if at a

=== modified file 'openlp/core/lib/db.py'
--- openlp/core/lib/db.py	2013-02-02 20:54:34 +0000
+++ openlp/core/lib/db.py	2013-02-04 21:03:31 +0000
@@ -45,7 +45,6 @@
 
 log = logging.getLogger(__name__)
 
-
 def init_db(url, auto_flush=True, auto_commit=False):
     """
     Initialise and return the session and metadata for a database
@@ -110,17 +109,14 @@
         while hasattr(upgrade, u'upgrade_%d' % version):
             log.debug(u'Running upgrade_%d', version)
             try:
-                upgrade_func = getattr(upgrade, u'upgrade_%d' % version)
-                upgrade_func(session, metadata, tables)
-                session.commit()
-                # Update the version number AFTER a commit so that we are sure the previous transaction happened
-                version_meta.value = unicode(version)
-                session.commit()
-                version += 1
+                getattr(upgrade, u'upgrade_%d' % version) (session, metadata, tables)
             except (SQLAlchemyError, DBAPIError):
                 log.exception(u'Could not run database upgrade script '
                     '"upgrade_%s", upgrade process has been halted.', version)
                 break
+            version_meta.value = unicode(version)
+            session.commit()
+            version += 1
     else:
         version_meta = Metadata.populate(key=u'version', value=int(upgrade.__version__))
         session.commit()
@@ -160,7 +156,6 @@
             instance.__setattr__(key, value)
         return instance
 
-
 class Manager(object):
     """
     Provide generic object persistence management
@@ -210,17 +205,19 @@
             if db_ver > up_ver:
                 critical_error_message_box(
                     translate('OpenLP.Manager', 'Database Error'),
-                    translate('OpenLP.Manager', 'The database being loaded was created in a more recent version of '
-                        'OpenLP. The database is version %d, while OpenLP expects version %d. The database will not '
-                        'be loaded.\n\nDatabase: %s') % (db_ver, up_ver, self.db_url)
+                    translate('OpenLP.Manager', 'The database being '
+                        'loaded was created in a more recent version of '
+                        'OpenLP. The database is version %d, while OpenLP '
+                        'expects version %d. The database will not be loaded.'
+                        '\n\nDatabase: %s') % \
+                        (db_ver, up_ver, self.db_url)
                 )
                 return
         try:
             self.session = init_schema(self.db_url)
         except (SQLAlchemyError, DBAPIError):
             log.exception(u'Error loading database: %s', self.db_url)
-            critical_error_message_box(
-                translate('OpenLP.Manager', 'Database Error'),
+            critical_error_message_box(translate('OpenLP.Manager', 'Database Error'),
                 translate('OpenLP.Manager', 'OpenLP cannot load your database.\n\nDatabase: %s') % self.db_url
             )
 

=== modified file 'openlp/core/lib/dockwidget.py'
--- openlp/core/lib/dockwidget.py	2013-02-01 19:58:18 +0000
+++ openlp/core/lib/dockwidget.py	2013-02-04 21:03:31 +0000
@@ -39,7 +39,6 @@
 
 log = logging.getLogger(__name__)
 
-
 class OpenLPDockWidget(QtGui.QDockWidget):
     """
     Custom DockWidget class to handle events

=== modified file 'openlp/core/lib/eventreceiver.py'
--- openlp/core/lib/eventreceiver.py	2013-02-03 17:42:31 +0000
+++ openlp/core/lib/eventreceiver.py	2013-02-04 21:03:31 +0000
@@ -35,7 +35,6 @@
 
 log = logging.getLogger(__name__)
 
-
 class EventReceiver(QtCore.QObject):
     """
     Class to allow events to be passed from different parts of the system. This
@@ -47,12 +46,24 @@
     ``mainwindow_status_text``
         Changes the bottom status bar text on the mainwindow.
 
+    ``openlp_warning_message``
+        Displays a standalone Warning Message.
+
     ``openlp_error_message``
         Displays a standalone Error Message.
 
     ``openlp_information_message``
         Displays a standalone Information Message.
 
+    ``cursor_busy``
+        Makes the cursor got to a busy form.
+
+    ``cursor_normal``
+        Resets the cursor to default.
+
+    ``openlp_process_events``
+        Requests the Application to flush the events queue.
+
     ``openlp_version_check``
         Version has changed so pop up window.
 
@@ -109,6 +120,29 @@
     ``slidecontroller_live_stop_loop``
         Stop the loop on the main display.
 
+
+    **Servicemanager related signals**
+
+    ``servicemanager_new_service``
+        A new service is being loaded or created.
+
+    ``servicemanager_previous_item``
+        Display the previous item in the service.
+
+    ``servicemanager_preview_live``
+        Requests a Preview item from the Service Manager to update live and add
+        a new item to the preview panel.
+
+    ``servicemanager_next_item``
+        Display the next item in the service.
+
+    ``servicemanager_set_item``
+        Go live on a specific item, by index.
+
+    ``service_item_update``
+        Passes back to the service manager the service item after it has been
+        processed by the plugin.
+
     **Display signals**
 
     ``update_display_css``

=== modified file 'openlp/core/lib/formattingtags.py'
--- openlp/core/lib/formattingtags.py	2013-02-01 19:58:18 +0000
+++ openlp/core/lib/formattingtags.py	2013-02-04 21:03:31 +0000
@@ -33,7 +33,6 @@
 
 from openlp.core.lib import translate, Settings
 
-
 class FormattingTags(object):
     """
     Static Class to HTML Tags to be access around the code the list is managed

=== modified file 'openlp/core/lib/htmlbuilder.py'
--- openlp/core/lib/htmlbuilder.py	2013-02-02 20:54:34 +0000
+++ openlp/core/lib/htmlbuilder.py	2013-02-04 21:03:31 +0000
@@ -207,8 +207,8 @@
 </html>
 """
 
-
-def build_html(item, screen, is_live, background, image=None, plugins=None):
+def build_html(item, screen, islive, background, image=None,
+    plugins=None):
     """
     Build the full web paged structure for display
 
@@ -233,7 +233,7 @@
     width = screen[u'size'].width()
     height = screen[u'size'].height()
     theme = item.themedata
-    webkit_ver = webkit_version()
+    webkitvers = webkit_version()
     # Image generated and poked in
     if background:
         bgimage_src = u'src="data:image/png;base64,%s"' % background
@@ -253,32 +253,28 @@
             css_additions += plugin.getDisplayCss()
             js_additions += plugin.getDisplayJavaScript()
             html_additions += plugin.getDisplayHtml()
-    html = HTMLSRC % (
-        build_background_css(item, width, height),
+    html = HTMLSRC % (build_background_css(item, width, height),
         css_additions,
         build_footer_css(item, height),
-        build_lyrics_css(item, webkit_ver),
-        u'true' if theme and theme.display_slide_transition and is_live else u'false',
+        build_lyrics_css(item, webkitvers),
+        u'true' if theme and theme.display_slide_transition and islive else u'false',
         js_additions,
         bgimage_src, image_src,
         html_additions,
-        build_lyrics_html(item, webkit_ver)
-    )
+        build_lyrics_html(item, webkitvers))
     return html
 
-
 def webkit_version():
     """
     Return the Webkit version in use.
     Note method added relatively recently, so return 0 if prior to this
     """
     try:
-        webkit_ver = float(QtWebKit.qWebKitVersion())
-        log.debug(u'Webkit version = %s' % webkit_ver)
+        webkitvers = float(QtWebKit.qWebKitVersion())
+        log.debug(u'Webkit version = %s' % webkitvers)
     except AttributeError:
-        webkit_ver = 0
-    return webkit_ver
-
+        webkitvers = 0
+    return webkitvers
 
 def build_background_css(item, width, height):
     """
@@ -314,8 +310,7 @@
                     % (width, width, width, theme.background_start_color, theme.background_end_color)
     return background
 
-
-def build_lyrics_css(item, webkit_ver):
+def build_lyrics_css(item, webkitvers):
     """
     Build the lyrics display css
 
@@ -372,12 +367,12 @@
         # Up to 534.3 the text-shadow didn't get displayed when
         # webkit-text-stroke was used. So use an offset text layer underneath.
         # https://bugs.webkit.org/show_bug.cgi?id=19728
-        if webkit_ver >= 533.3:
+        if webkitvers >= 533.3:
             lyricsmain += build_lyrics_outline_css(theme)
         else:
             outline = build_lyrics_outline_css(theme)
         if theme.font_main_shadow:
-            if theme.font_main_outline and webkit_ver <= 534.3:
+            if theme.font_main_outline and webkitvers <= 534.3:
                 shadow = u'padding-left: %spx; padding-top: %spx;' % \
                     (int(theme.font_main_shadow_size) + (int(theme.font_main_outline_size) * 2),
                      theme.font_main_shadow_size)
@@ -389,7 +384,6 @@
     lyrics_css = style % (lyricstable, lyrics, lyricsmain, outline, shadow)
     return lyrics_css
 
-
 def build_lyrics_outline_css(theme, is_shadow=False):
     """
     Build the css which controls the theme outline
@@ -413,7 +407,6 @@
     else:
         return u''
 
-
 def build_lyrics_format_css(theme, width, height):
     """
     Build the css which controls the theme format
@@ -458,7 +451,6 @@
         lyrics += u' font-weight:bold; '
     return lyrics
 
-
 def build_lyrics_html(item, webkitvers):
     """
     Build the HTML required to show the lyrics
@@ -488,7 +480,6 @@
         u'class="lyricscell lyricsmain"></div></div>'
     return lyrics
 
-
 def build_footer_css(item, height):
     """
     Build the display of the item footer

=== modified file 'openlp/core/lib/imagemanager.py'
--- openlp/core/lib/imagemanager.py	2013-02-02 20:54:34 +0000
+++ openlp/core/lib/imagemanager.py	2013-02-04 21:03:31 +0000
@@ -43,27 +43,20 @@
 
 log = logging.getLogger(__name__)
 
-
 class ImageThread(QtCore.QThread):
     """
     A special Qt thread class to speed up the display of images. This is
     threaded so it loads the frames and generates byte stream in background.
     """
     def __init__(self, manager):
-        """
-        Constructor for the thread class.
-
-        ``manager``
-            The image manager.
-        """
         QtCore.QThread.__init__(self, None)
-        self.image_manager = manager
+        self.imageManager = manager
 
     def run(self):
         """
         Run the thread.
         """
-        self.image_manager._process()
+        self.imageManager._process()
 
 
 class Priority(object):
@@ -188,75 +181,72 @@
     log.info(u'Image Manager loaded')
 
     def __init__(self):
-        """
-        Constructor for the image manager.
-        """
         QtCore.QObject.__init__(self)
         Registry().register(u'image_manager', self)
-        current_screen = ScreenList().current
-        self.width = current_screen[u'size'].width()
-        self.height = current_screen[u'size'].height()
+        currentScreen = ScreenList().current
+        self.width = currentScreen[u'size'].width()
+        self.height = currentScreen[u'size'].height()
         self._cache = {}
-        self.image_thread = ImageThread(self)
-        self._conversion_queue = PriorityQueue()
-        self.stop_manager = False
-        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.process_updates)
+        self.imageThread = ImageThread(self)
+        self._conversionQueue = PriorityQueue()
+        self.stopManager = False
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.processUpdates)
 
-    def update_display(self):
+    def updateDisplay(self):
         """
         Screen has changed size so rebuild the cache to new size.
         """
-        log.debug(u'update_display')
-        current_screen = ScreenList().current
-        self.width = current_screen[u'size'].width()
-        self.height = current_screen[u'size'].height()
+        log.debug(u'updateDisplay')
+        currentScreen = ScreenList().current
+        self.width = currentScreen[u'size'].width()
+        self.height = currentScreen[u'size'].height()
         # Mark the images as dirty for a rebuild by setting the image and byte
         # stream to None.
         for image in self._cache.values():
-            self._reset_image(image)
+            self._resetImage(image)
 
-    def update_images_border(self, source, background):
+    def updateImagesBorder(self, source, background):
         """
         Border has changed so update all the images affected.
         """
-        log.debug(u'update_images_border')
+        log.debug(u'updateImages')
         # Mark the images as dirty for a rebuild by setting the image and byte
         # stream to None.
         for image in self._cache.values():
             if image.source == source:
                 image.background = background
-                self._reset_image(image)
+                self._resetImage(image)
 
-    def update_image_border(self, path, source, background):
+    def updateImageBorder(self, path, source, background):
         """
         Border has changed so update the image affected.
         """
-        log.debug(u'update_image_border')
+        log.debug(u'updateImage')
         # Mark the image as dirty for a rebuild by setting the image and byte
         # stream to None.
         image = self._cache[(path, source)]
         if image.source == source:
             image.background = background
-            self._reset_image(image)
+            self._resetImage(image)
 
-    def _reset_image(self, image):
+    def _resetImage(self, image):
         """
         Mark the given :class:`Image` instance as dirty by setting its ``image``
         and ``image_bytes`` attributes to None.
         """
         image.image = None
         image.image_bytes = None
-        self._conversion_queue.modify_priority(image, Priority.Normal)
+        self._conversionQueue.modify_priority(image, Priority.Normal)
 
-    def process_updates(self):
+    def processUpdates(self):
         """
         Flush the queue to updated any data to update
         """
         # We want only one thread.
-        if not self.image_thread.isRunning():
-            self.image_thread.start()
+        if not self.imageThread.isRunning():
+            self.imageThread.start()
 
-    def get_image(self, path, source):
+    def getImage(self, path, source):
         """
         Return the ``QImage`` from the cache. If not present wait for the
         background thread to process it.
@@ -264,9 +254,9 @@
         log.debug(u'getImage %s' % path)
         image = self._cache[(path, source)]
         if image.image is None:
-            self._conversion_queue.modify_priority(image, Priority.High)
+            self._conversionQueue.modify_priority(image, Priority.High)
             # make sure we are running and if not give it a kick
-            self.process_updates()
+            self.processUpdates()
             while image.image is None:
                 log.debug(u'getImage - waiting')
                 time.sleep(0.1)
@@ -275,74 +265,74 @@
             # byte stream was not generated yet. However, we only need to do
             # this, when the image was generated before it was requested
             # (otherwise this is already taken care of).
-            self._conversion_queue.modify_priority(image, Priority.Low)
+            self._conversionQueue.modify_priority(image, Priority.Low)
         return image.image
 
-    def get_image_bytes(self, path, source):
+    def getImageBytes(self, path, source):
         """
         Returns the byte string for an image. If not present wait for the
         background thread to process it.
         """
-        log.debug(u'get_image_bytes %s' % path)
+        log.debug(u'getImageBytes %s' % path)
         image = self._cache[(path, source)]
         if image.image_bytes is None:
-            self._conversion_queue.modify_priority(image, Priority.Urgent)
+            self._conversionQueue.modify_priority(image, Priority.Urgent)
             # make sure we are running and if not give it a kick
-            self.process_updates()
+            self.processUpdates()
             while image.image_bytes is None:
                 log.debug(u'getImageBytes - waiting')
                 time.sleep(0.1)
         return image.image_bytes
 
-    def add_image(self, path, source, background):
+    def addImage(self, path, source, background):
         """
         Add image to cache if it is not already there.
         """
-        log.debug(u'add_image %s' % path)
+        log.debug(u'addImage %s' % path)
         if not (path, source) in self._cache:
             image = Image(path, source, background)
             self._cache[(path, source)] = image
-            self._conversion_queue.put((image.priority, image.secondary_priority, image))
+            self._conversionQueue.put((image.priority, image.secondary_priority, image))
         # Check if the there are any images with the same path and check if the
         # timestamp has changed.
         for image in self._cache.values():
             if os.path.exists(path):
                 if image.path == path and image.timestamp != os.stat(path).st_mtime:
                     image.timestamp = os.stat(path).st_mtime
-                    self._reset_image(image)
+                    self._resetImage(image)
         # We want only one thread.
-        if not self.image_thread.isRunning():
-            self.image_thread.start()
+        if not self.imageThread.isRunning():
+            self.imageThread.start()
 
     def _process(self):
         """
         Controls the processing called from a ``QtCore.QThread``.
         """
         log.debug(u'_process - started')
-        while not self._conversion_queue.empty() and not self.stop_manager:
-            self._process_cache()
+        while not self._conversionQueue.empty() and not self.stopManager:
+            self._processCache()
         log.debug(u'_process - ended')
 
-    def _process_cache(self):
+    def _processCache(self):
         """
         Actually does the work.
         """
         log.debug(u'_processCache')
-        image = self._conversion_queue.get()[2]
+        image = self._conversionQueue.get()[2]
         # Generate the QImage for the image.
         if image.image is None:
             image.image = resize_image(image.path, self.width, self.height, image.background)
             # Set the priority to Lowest and stop here as we need to process
             # more important images first.
             if image.priority == Priority.Normal:
-                self._conversion_queue.modify_priority(image, Priority.Lowest)
+                self._conversionQueue.modify_priority(image, Priority.Lowest)
                 return
             # For image with high priority we set the priority to Low, as the
             # byte stream might be needed earlier the byte stream of image with
             # Normal priority. We stop here as we need to process more important
             # images first.
             elif image.priority == Priority.High:
-                self._conversion_queue.modify_priority(image, Priority.Low)
+                self._conversionQueue.modify_priority(image, Priority.Low)
                 return
         # Generate the byte stream for the image.
         if image.image_bytes is None:

=== modified file 'openlp/core/lib/listwidgetwithdnd.py'
--- openlp/core/lib/listwidgetwithdnd.py	2013-02-01 19:58:18 +0000
+++ openlp/core/lib/listwidgetwithdnd.py	2013-02-04 21:03:31 +0000
@@ -35,7 +35,6 @@
 
 from openlp.core.lib import Receiver
 
-
 class ListWidgetWithDnD(QtGui.QListWidget):
     """
     Provide a list widget to store objects and handle drag and drop events
@@ -59,8 +58,9 @@
 
     def mouseMoveEvent(self, event):
         """
-        Drag and drop event does not care what data is selected as the recipient will use events to request the data
-        move just tell it what plugin to call
+        Drag and drop event does not care what data is selected
+        as the recipient will use events to request the data move
+        just tell it what plugin to call
         """
         if event.buttons() != QtCore.Qt.LeftButton:
             event.ignore()
@@ -75,18 +75,12 @@
         drag.start(QtCore.Qt.CopyAction)
 
     def dragEnterEvent(self, event):
-        """
-        When something is dragged into this object, check if you should be able to drop it in here.
-        """
         if event.mimeData().hasUrls():
             event.accept()
         else:
             event.ignore()
 
     def dragMoveEvent(self, event):
-        """
-        Make an object droppable, and set it to copy the contents of the object, not move it.
-        """
         if event.mimeData().hasUrls():
             event.setDropAction(QtCore.Qt.CopyAction)
             event.accept()

=== modified file 'openlp/core/lib/mediamanageritem.py'
--- openlp/core/lib/mediamanageritem.py	2013-02-03 19:23:12 +0000
+++ openlp/core/lib/mediamanageritem.py	2013-02-04 21:03:31 +0000
@@ -35,14 +35,14 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import OpenLPToolbar, ServiceItem, StringContent, Receiver, ListWidgetWithDnD, \
-    ServiceItemContext, Settings, Registry, UiStrings, build_icon, translate
+from openlp.core.lib import OpenLPToolbar, ServiceItem, StringContent, build_icon, translate, Receiver, \
+    ListWidgetWithDnD, ServiceItemContext, Settings, Registry, UiStrings
 from openlp.core.lib.searchedit import SearchEdit
 from openlp.core.lib.ui import create_widget_action, critical_error_message_box
 
+
 log = logging.getLogger(__name__)
 
-
 class MediaManagerItem(QtGui.QWidget):
     """
     MediaManagerItem is a helper widget for plugins.
@@ -332,9 +332,9 @@
             Settings().value(self.settingsSection + u'/last directory'), self.onNewFileMasks)
         log.info(u'New files(s) %s', files)
         if files:
-            self.application.set_busy_cursor()
+            Receiver.send_message(u'cursor_busy')
             self.validateAndLoad(files)
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
 
     def loadFile(self, files):
         """
@@ -345,15 +345,15 @@
         """
         new_files = []
         error_shown = False
-        for file_name in files:
-            file_type = file_name.split(u'.')[-1]
-            if file_type.lower() not in self.onNewFileMasks:
+        for file in files:
+            type = file.split(u'.')[-1]
+            if type.lower() not in self.onNewFileMasks:
                 if not error_shown:
                     critical_error_message_box(translate('OpenLP.MediaManagerItem', 'Invalid File Type'),
-                        translate('OpenLP.MediaManagerItem', 'Invalid File %s.\nSuffix not supported') % file_name)
+                        translate('OpenLP.MediaManagerItem', 'Invalid File %s.\nSuffix not supported') % file)
                     error_shown = True
             else:
-                new_files.append(file_name)
+                new_files.append(file)
         if new_files:
             self.validateAndLoad(new_files)
 
@@ -390,9 +390,6 @@
                 translate('OpenLP.MediaManagerItem', 'Duplicate files were found on import and were ignored.'))
 
     def contextMenu(self, point):
-        """
-        Display a context menu
-        """
         item = self.listView.itemAt(point)
         # Decide if we have to show the context menu or not.
         if item is None:
@@ -415,9 +412,6 @@
         return file_list
 
     def loadList(self, list):
-        """
-        Load a list. Needs to be implemented by the plugin.
-        """
         raise NotImplementedError(u'MediaManagerItem.loadList needs to be defined by the plugin')
 
     def onNewClick(self):
@@ -433,9 +427,6 @@
         pass
 
     def onDeleteClick(self):
-        """
-        Delete an item. Needs to be implemented by the plugin.
-        """
         raise NotImplementedError(u'MediaManagerItem.onDeleteClick needs to be defined by the plugin')
 
     def onFocus(self):
@@ -447,9 +438,6 @@
 
     def generateSlideData(self, serviceItem, item=None, xmlVersion=False, remote=False,
             context=ServiceItemContext.Live):
-        """
-        Generate the slide data. Needs to be implemented by the plugin.
-        """
         raise NotImplementedError(u'MediaManagerItem.generateSlideData needs to be defined by the plugin')
 
     def onDoubleClicked(self):
@@ -498,9 +486,6 @@
             self.goLive()
 
     def goLive(self, item_id=None, remote=False):
-        """
-        Make the currently selected item go live.
-        """
         log.debug(u'%s Live requested', self.plugin.name)
         item = None
         if item_id:
@@ -514,9 +499,6 @@
             self.live_controller.add_service_item(serviceItem)
 
     def createItemFromId(self, item_id):
-        """
-        Create a media item from an item id.
-        """
         item = QtGui.QListWidgetItem()
         item.setData(QtCore.Qt.UserRole, item_id)
         return item
@@ -540,9 +522,6 @@
                     self.addToService(item)
 
     def addToService(self, item=None, replace=None, remote=False):
-        """
-        Add this item to the current service.
-        """
         serviceItem = self.buildServiceItem(item, True, remote=remote, context=ServiceItemContext.Service)
         if serviceItem:
             serviceItem.from_plugin = False
@@ -709,22 +688,3 @@
 
     service_manager = property(_get_service_manager)
 
-    def _get_theme_manager(self):
-        """
-        Adds the theme manager to the class dynamically
-        """
-        if not hasattr(self, u'_theme_manager'):
-            self._theme_manager = Registry().get(u'theme_manager')
-        return self._theme_manager
-
-    theme_manager = property(_get_theme_manager)
-
-    def _get_application(self):
-        """
-        Adds the openlp to the class dynamically
-        """
-        if not hasattr(self, u'_application'):
-            self._application = Registry().get(u'application')
-        return self._application
-
-    application = property(_get_application)

=== modified file 'openlp/core/lib/plugin.py'
--- openlp/core/lib/plugin.py	2013-02-03 19:23:12 +0000
+++ openlp/core/lib/plugin.py	2013-02-04 21:03:31 +0000
@@ -38,7 +38,6 @@
 
 log = logging.getLogger(__name__)
 
-
 class PluginStatus(object):
     """
     Defines the status of the plugin
@@ -295,7 +294,7 @@
         if self.mediaItem:
             self.main_window.mediaDockManager.remove_dock(self.mediaItem)
 
-    def app_startup(self):
+    def appStartup(self):
         """
         Perform tasks on application startup
         """
@@ -321,6 +320,7 @@
                 Settings().setValue(u'%s/%s files' % (self.settingsSection, self.name), loaded_list)
             settings.endGroup()
 
+
     def usesTheme(self, theme):
         """
         Called to find out if a plugin is currently using a theme.
@@ -409,12 +409,6 @@
         """
         pass
 
-    def new_service_created(self):
-        """
-        The plugin's needs to handle a new song creation
-        """
-        pass
-
     def _get_main_window(self):
         """
         Adds the main window to the class dynamically
@@ -425,12 +419,3 @@
 
     main_window = property(_get_main_window)
 
-    def _get_application(self):
-        """
-        Adds the openlp to the class dynamically
-        """
-        if not hasattr(self, u'_application'):
-            self._application = Registry().get(u'application')
-        return self._application
-
-    application = property(_get_application)

=== modified file 'openlp/core/lib/pluginmanager.py'
--- openlp/core/lib/pluginmanager.py	2013-02-03 16:40:39 +0000
+++ openlp/core/lib/pluginmanager.py	2013-02-04 21:03:31 +0000
@@ -37,7 +37,6 @@
 
 log = logging.getLogger(__name__)
 
-
 class PluginManager(object):
     """
     This is the Plugin manager, which loads all the plugins,
@@ -212,13 +211,3 @@
             if plugin.name == name:
                 return plugin
         return None
-
-    def new_service_created(self):
-        """
-        Loop through all the plugins and give them an opportunity to handle a new service
-        """
-        log.info(u'plugins - new service created')
-        for plugin in self.plugins:
-            if plugin.isActive():
-                plugin.new_service_created()
-

=== modified file 'openlp/core/lib/registry.py'
--- openlp/core/lib/registry.py	2013-02-02 21:16:42 +0000
+++ openlp/core/lib/registry.py	2013-02-04 21:03:31 +0000
@@ -34,7 +34,6 @@
 
 log = logging.getLogger(__name__)
 
-
 class Registry(object):
     """
     This is the Component Registry.  It is a singleton object and is used to provide a
@@ -44,9 +43,6 @@
     __instance__ = None
 
     def __new__(cls):
-        """
-        Re-implement the __new__ method to make sure we create a true singleton.
-        """
         if not cls.__instance__:
             cls.__instance__ = object.__new__(cls)
         return cls.__instance__
@@ -65,6 +61,7 @@
             registry.running_under_test = True
         return registry
 
+
     def get(self, key):
         """
         Extracts the registry value from the list based on the key passed in
@@ -90,9 +87,10 @@
         Removes the registry value from the list based on the key passed in
         (Only valid and active for testing framework)
         """
-        if self.running_under_test is False:
+        if self.running_under_test == False:
             log.error(u'Invalid Method call for key %s' % key)
             raise KeyError(u'Invalid Method call for key %s' % key)
             return
         if key in self.service_list:
-            del self.service_list[key]
+             del self.service_list[key]
+

=== modified file 'openlp/core/lib/renderer.py'
--- openlp/core/lib/renderer.py	2013-02-02 21:16:42 +0000
+++ openlp/core/lib/renderer.py	2013-02-04 21:03:31 +0000
@@ -128,7 +128,7 @@
             The theme name.
         """
         if theme_name not in self._theme_dimensions:
-            theme_data = self.theme_manager.get_theme_data(theme_name)
+            theme_data = self.theme_manager.getThemeData(theme_name)
             main_rect = self.get_main_rectangle(theme_data)
             footer_rect = self.get_footer_rectangle(theme_data)
             self._theme_dimensions[theme_name] = [theme_data, main_rect, footer_rect]
@@ -136,7 +136,7 @@
             theme_data, main_rect, footer_rect = self._theme_dimensions[theme_name]
         # if No file do not update cache
         if theme_data.background_filename:
-            self.image_manager.add_image(theme_data.background_filename,
+            self.image_manager.addImage(theme_data.background_filename,
                 ImageSource.Theme, QtGui.QColor(theme_data.background_border_color))
 
     def pre_render(self, override_theme_data=None):
@@ -238,7 +238,7 @@
         serviceItem.raw_footer = FOOTER
         # if No file do not update cache
         if theme_data.background_filename:
-            self.image_manager.add_image(theme_data.background_filename,
+            self.image_manager.addImage(theme_data.background_filename,
                 ImageSource.Theme,
                 QtGui.QColor(theme_data.background_border_color))
         theme_data, main, footer = self.pre_render(theme_data)
@@ -315,7 +315,7 @@
                             if  text_contains_split:
                                 text = slides[-1] + u'\n[---]\n' + text
                             else:
-                                text = slides[-1] + u'\n' + text
+                                text = slides[-1] + u'\n'+ text
                             text = text.replace(u'<br>', u'\n')
                         else:
                             pages.extend(slides)
@@ -543,7 +543,7 @@
         end_tags.reverse()
         # Remove the indexes.
         html_tags = [tag[1] for tag in html_tags]
-        return raw_text + u''.join(end_tags), u''.join(start_tags), u''.join(html_tags)
+        return raw_text + u''.join(end_tags),  u''.join(start_tags), u''.join(html_tags)
 
     def _binary_chop(self, formatted, previous_html, previous_raw, html_list, raw_list, separator, line_end):
         """
@@ -661,5 +661,4 @@
             self._theme_manager = Registry().get(u'theme_manager')
         return self._theme_manager
 
-    theme_manager = property(_get_theme_manager)
-
+    theme_manager = property(_get_theme_manager)
\ No newline at end of file

=== modified file 'openlp/core/lib/screen.py'
--- openlp/core/lib/screen.py	2013-02-01 19:58:18 +0000
+++ openlp/core/lib/screen.py	2013-02-04 21:03:31 +0000
@@ -37,6 +37,7 @@
 
 from openlp.core.lib import Receiver, translate
 
+
 log = logging.getLogger(__name__)
 
 
@@ -50,9 +51,6 @@
     __instance__ = None
 
     def __new__(cls):
-        """
-        Re-implement __new__ to create a true singleton.
-        """
         if not cls.__instance__:
             cls.__instance__ = object.__new__(cls)
         return cls.__instance__

=== modified file 'openlp/core/lib/searchedit.py'
--- openlp/core/lib/searchedit.py	2013-02-01 19:58:18 +0000
+++ openlp/core/lib/searchedit.py	2013-02-04 21:03:31 +0000
@@ -36,7 +36,6 @@
 
 log = logging.getLogger(__name__)
 
-
 class SearchEdit(QtGui.QLineEdit):
     """
     This is a specialised QLineEdit with a "clear" button inside for searches.

=== modified file 'openlp/core/lib/serviceitem.py'
--- openlp/core/lib/serviceitem.py	2013-02-02 20:54:34 +0000
+++ openlp/core/lib/serviceitem.py	2013-02-04 21:03:31 +0000
@@ -43,7 +43,6 @@
 
 log = logging.getLogger(__name__)
 
-
 class ServiceItemType(object):
     """
     Defines the type of service item
@@ -293,7 +292,7 @@
             self.image_border = background
         self.service_item_type = ServiceItemType.Image
         self._raw_frames.append({u'title': title, u'path': path})
-        self.image_manager.add_image(path, ImageSource.ImagePlugin, self.image_border)
+        self.image_manager.addImage(path, ImageSource.ImagePlugin, self.image_border)
         self._new_item()
 
     def add_from_text(self, raw_slide, verse_tag=None):
@@ -608,7 +607,7 @@
         ``theme``
             The new theme to be replaced in the service item
         """
-        self.theme_overwritten = (theme is None)
+        self.theme_overwritten = (theme == None)
         self.theme = theme
         self._new_item()
         self.render()
@@ -663,4 +662,4 @@
             self._image_manager = Registry().get(u'image_manager')
         return self._image_manager
 
-    image_manager = property(_get_image_manager)
+    image_manager = property(_get_image_manager)
\ No newline at end of file

=== modified file 'openlp/core/lib/settings.py'
--- openlp/core/lib/settings.py	2013-02-02 18:43:34 +0000
+++ openlp/core/lib/settings.py	2013-02-04 21:03:31 +0000
@@ -74,7 +74,8 @@
 
         The first entry is the *old key*; it will be removed.
 
-        The second entry is the *new key*; we will add it to the config.
+        The second entry is the *new key*; we will add it to the config. If this is just an empty string, we just remove
+        the old key.
 
         The last entry is a list containing two-pair tuples. If the list is empty, no conversion is made. Otherwise each
         pair describes how to convert the old setting's value::
@@ -86,66 +87,67 @@
         So, if the type of the old value is bool, then there must be two rules.
     """
     __default_settings__ = {
-        u'advanced/x11 bypass wm': X11_BYPASS_DEFAULT,
+        u'advanced/add page break': False,
         u'advanced/alternate rows': not sys.platform.startswith(u'win'),
-        u'advanced/default service enabled': True,
-        u'advanced/enable exit confirmation': True,
-        u'advanced/save current plugin': False,
-        u'advanced/single click preview': False,
-        # 7 stands for now, 0 to 6 is Monday to Sunday.
-        u'advanced/default service day': 7,
-        u'advanced/max recent files': 20,
-        u'advanced/is portable': False,
-        u'advanced/hide mouse': True,
         u'advanced/current media plugin': -1,
-        u'advanced/double click live': False,
         u'advanced/data path': u'',
-        u'advanced/default service hour': 11,
         u'advanced/default color': u'#ffffff',
         u'advanced/default image': u':/graphics/openlp-splash-screen.png',
+        # 7 stands for now, 0 to 6 is Monday to Sunday.
+        u'advanced/default service day': 7,
+        u'advanced/default service enabled': True,
+        u'advanced/default service hour': 11,
+        u'advanced/default service minute': 0,
+        u'advanced/default service name': UiStrings().DefaultServiceName,
+        u'advanced/display size': 0,
+        u'advanced/double click live': False,
+        u'advanced/enable exit confirmation': True,
         u'advanced/expand service item': False,
+        u'advanced/hide mouse': True,
+        u'advanced/is portable': False,
+        u'advanced/max recent files': 20,
+        u'advanced/print file meta data': False,
+        u'advanced/print notes': False,
+        u'advanced/print slide text': False,
         u'advanced/recent file count': 4,
-        u'advanced/default service name': UiStrings().DefaultServiceName,
-        u'advanced/default service minute': 0,
+        u'advanced/save current plugin': False,
         u'advanced/slide limits': SlideLimits.End,
-        u'advanced/print slide text': False,
-        u'advanced/add page break': False,
-        u'advanced/print file meta data': False,
-        u'advanced/print notes': False,
-        u'advanced/display size': 0,
+        u'advanced/single click preview': False,
+        u'advanced/x11 bypass wm': X11_BYPASS_DEFAULT,
         u'crashreport/last directory': u'',
         u'displayTags/html_tags': u'',
+        u'general/audio repeat list': False,
+        u'general/auto open': False,
+        u'general/auto preview': False,
+        u'general/audio start paused': True,
+        u'general/auto unblank': False,
+        u'general/blank warning': False,
         u'general/ccli number': u'',
         u'general/has run wizard': False,
-        u'general/update check': True,
         u'general/language': u'[en]',
-        u'general/songselect password': u'',
+        # This defaults to yesterday in order to force the update check to run when you've never run it before.
+        u'general/last version test': datetime.datetime.now().date() - datetime.timedelta(days=1),
+        u'general/loop delay': 5,
         u'general/recent files': [],
         u'general/save prompt': False,
-        u'general/auto preview': False,
-        u'general/view mode': u'default',
-        u'general/auto open': False,
-        u'general/enable slide loop': True,
+        u'general/screen blank': False,
         u'general/show splash': True,
-        u'general/screen blank': False,
-        # The other display settings (display position and dimensions) are defined in the ScreenList class due to a
-        # circular dependency.
-        u'general/override position': False,
-        u'general/loop delay': 5,
+        u'general/songselect password': u'',
         u'general/songselect username': u'',
-        u'general/audio repeat list': False,
-        u'general/auto unblank': False,
+        u'general/update check': True,
+        u'general/view mode': u'default',
+        # The oder display settings (display position and dimensions) are defined in the ScreenList class due to crycle
+        # dependency.
         u'general/display on monitor': True,
-        u'general/audio start paused': True,
-        # This defaults to yesterday in order to force the update check to run when you've never run it before.
-        u'general/last version test': datetime.datetime.now().date() - datetime.timedelta(days=1),
-        u'general/blank warning': False,
+        u'general/override position': False,
+        u'media/players': u'webkit',
+        u'media/override player': QtCore.Qt.Unchecked,
         u'players/background color': u'#000000',
+        u'servicemanager/last file': u'',
         u'servicemanager/service theme': u'',
-        u'servicemanager/last file': u'',
+        u'SettingsImport/file_date_created': datetime.datetime.now().strftime("%Y-%m-%d %H:%M"),
         u'SettingsImport/Make_Changes': u'At_Own_RISK',
         u'SettingsImport/type': u'OpenLP_settings_export',
-        u'SettingsImport/file_date_created': datetime.datetime.now().strftime("%Y-%m-%d %H:%M"),
         u'SettingsImport/version': u'',
         u'shortcuts/aboutItem': [QtGui.QKeySequence(u'Ctrl+F1')],
         u'shortcuts/audioPauseItem': [],
@@ -213,39 +215,38 @@
         u'shortcuts/viewLivePanel': [QtGui.QKeySequence(u'F12')],
         u'shortcuts/viewServiceManagerItem': [QtGui.QKeySequence(u'F9')],
         u'shortcuts/webSiteItem': [],
-        u'themes/theme level': ThemeLevel.Song,
         u'themes/global theme': u'',
         u'themes/last directory': u'',
         u'themes/last directory export': u'',
         u'themes/last directory import': u'',
-        u'user interface/main window position': QtCore.QPoint(0, 0),
-        u'user interface/preview panel': True,
+        u'themes/theme level': ThemeLevel.Song,
         u'user interface/live panel': True,
+        u'user interface/live splitter geometry': QtCore.QByteArray(),
+        u'user interface/lock panel': False,
         u'user interface/main window geometry': QtCore.QByteArray(),
-        u'user interface/preview splitter geometry': QtCore.QByteArray(),
-        u'user interface/lock panel': False,
-        u'user interface/mainwindow splitter geometry': QtCore.QByteArray(),
-        u'user interface/live splitter geometry': QtCore.QByteArray(),
+        u'user interface/main window position': QtCore.QPoint(0, 0),
+        u'user interface/main window splitter geometry': QtCore.QByteArray(),
         u'user interface/main window state': QtCore.QByteArray(),
-        u'media/players': u'webkit',
-        u'media/override player': QtCore.Qt.Unchecked,
-        # Old settings (not used anymore). Have to be here, so that old setting.config backups can be imported.
-        u'advanced/stylesheet fix': u'',
-        u'servicemanager/last directory': u''
+        u'user interface/preview panel': True,
+        u'user interface/preview splitter geometry': QtCore.QByteArray()
     }
     __file_path__ = u''
     __obsolete_settings__ = [
+        # Changed during 1.9.x development.
         (u'bibles/bookname language', u'bibles/book name language', []),
         (u'general/enable slide loop', u'advanced/slide limits', [(SlideLimits.Wrap, True), (SlideLimits.End, False)]),
+        (u'songs/ccli number', u'general/ccli number', []),
+        # Changed during 2.1.x development.
+        (u'advanced/stylesheet fix', u'', []),
+        (u'bibles/last directory 1', u'bibles/last directory import', []),
+        (u'media/background color', u'players/background color', []),
         (u'themes/last directory', u'themes/last directory import', []),
         (u'themes/last directory 1', u'themes/last directory export', []),
         (u'servicemanager/last directory', u'', []),
         (u'songs/last directory 1', u'songs/last directory import', []),
-        (u'bibles/last directory 1', u'bibles/last directory import', []),
         (u'songusage/last directory 1', u'songusage/last directory export', []),
-        (u'shortcuts/makeLive', u'shortcuts/make_live', []),
-        (u'advanced/stylesheet fix', u'', []),
-        (u'media/background color', u'players/background color', [])
+        (u'user interface/mainwindow splitter geometry', u'user interface/main window splitter geometry', []),
+        (u'shortcuts/makeLive', u'shortcuts/make_live', [])
     ]
 
     @staticmethod
@@ -278,7 +279,10 @@
 
     def __init__(self, *args):
         """
-        Constructor which checks if this should be a native settings object, or an INI file.
+        Constructor
+
+        ``args``
+            Passed to Qt. But not passed in all cases.
         """
         if not args and Settings.__file_path__ and Settings.defaultFormat() == Settings.IniFormat:
             QtCore.QSettings.__init__(self, Settings.__file_path__, Settings.IniFormat)
@@ -296,6 +300,11 @@
                 if new_key:
                     # Get the value of the old_key.
                     old_value = super(Settings, self).value(old_key)
+                    # When we want to convert the value, we have to figure out the default value (because we cannot get
+                    # the default value from the central settings dict.
+                    if rules:
+                        default_value = rules[0][1]
+                        old_value = self._convert_value(old_value, default_value)
                     # Iterate over our rules and check what the old_value should be "converted" to.
                     for new, old in rules:
                         # If the value matches with the condition (rule), then use the provided value. This is used to
@@ -311,8 +320,6 @@
         Returns the value for the given ``key``. The returned ``value`` is of the same type as the default value in the
         *Settings.__default_settings__* dict.
 
-        **Note**, this method only converts a few types and might need to be extended if a certain type is missing!
-
         ``key``
             The key to return the value from.
         """
@@ -322,6 +329,21 @@
         else:
             default_value = Settings.__default_settings__[key]
         setting = super(Settings, self).value(key, default_value)
+        return self._convert_value(setting, default_value)
+
+    def _convert_value(self, setting, default_value):
+        """
+        This converts the given ``setting`` to the type of the given ``default_value``.
+
+        ``setting``
+            The setting to convert. This could be ``true`` for example.Settings()
+
+        ``default_value``
+            Indication the type the setting should be converted to. For example ``True`` (type is boolean), meaning that
+            we convert the string ``true`` to a python boolean.
+
+        **Note**, this method only converts a few types and might need to be extended if a certain type is missing!
+        """
         # On OS X (and probably on other platforms too) empty value from QSettings is represented as type
         # PyQt4.QtCore.QPyNullVariant. This type has to be converted to proper 'None' Python type.
         if isinstance(setting, QtCore.QPyNullVariant) and setting.isNull():

=== modified file 'openlp/core/lib/settingsmanager.py'
--- openlp/core/lib/settingsmanager.py	2013-02-01 19:58:18 +0000
+++ openlp/core/lib/settingsmanager.py	2013-02-04 21:03:31 +0000
@@ -33,6 +33,9 @@
 """
 import os
 
+from PyQt4 import QtCore
+
+from openlp.core.lib import Settings
 from openlp.core.utils import AppLocation
 
 

=== modified file 'openlp/core/lib/settingstab.py'
--- openlp/core/lib/settingstab.py	2013-02-02 21:16:42 +0000
+++ openlp/core/lib/settingstab.py	2013-02-04 21:03:31 +0000
@@ -26,16 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The :mod:`~openlp.core.lib.settingstab` module contains the base SettingsTab class which plugins use for adding their
-own tab to the settings dialog.
-"""
 
 from PyQt4 import QtGui
 
-
-from openlp.core.lib import Registry
-
 class SettingsTab(QtGui.QWidget):
     """
     SettingsTab is a helper widget for plugins to define Tabs for the settings
@@ -138,54 +131,3 @@
         Tab has just been made visible to the user
         """
         pass
-
-    def _get_service_manager(self):
-        """
-        Adds the service manager to the class dynamically
-        """
-        if not hasattr(self, u'_service_manager'):
-            self._service_manager = Registry().get(u'service_manager')
-        return self._service_manager
-
-    service_manager = property(_get_service_manager)
-
-    def _get_main_window(self):
-        """
-        Adds the main window to the class dynamically
-        """
-        if not hasattr(self, u'_main_window'):
-            self._main_window = Registry().get(u'main_window')
-        return self._main_window
-
-    main_window = property(_get_main_window)
-
-    def _get_renderer(self):
-        """
-        Adds the Renderer to the class dynamically
-        """
-        if not hasattr(self, u'_renderer'):
-            self._renderer = Registry().get(u'renderer')
-        return self._renderer
-
-    renderer = property(_get_renderer)
-
-    def _get_theme_manager(self):
-        """
-        Adds the theme manager to the class dynamically
-        """
-        if not hasattr(self, u'_theme_manager'):
-            self._theme_manager = Registry().get(u'theme_manager')
-        return self._theme_manager
-
-    theme_manager = property(_get_theme_manager)
-
-    def _get_media_controller(self):
-        """
-        Adds the media controller to the class dynamically
-        """
-        if not hasattr(self, u'_media_controller'):
-            self._media_controller = Registry().get(u'media_controller')
-        return self._media_controller
-
-    media_controller = property(_get_media_controller)
-

=== modified file 'openlp/core/lib/spelltextedit.py'
--- openlp/core/lib/spelltextedit.py	2013-02-01 19:58:18 +0000
+++ openlp/core/lib/spelltextedit.py	2013-02-04 21:03:31 +0000
@@ -26,10 +26,6 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The :mod:`~openlp.core.lib.spelltextedit` module contains a classes to add spell checking to an edit widget.
-"""
-
 import logging
 import re
 
@@ -51,15 +47,11 @@
 
 log = logging.getLogger(__name__)
 
-
 class SpellTextEdit(QtGui.QPlainTextEdit):
     """
     Spell checking widget based on QPlanTextEdit.
     """
     def __init__(self, parent=None, formattingTagsAllowed=True):
-        """
-        Constructor.
-        """
         global ENCHANT_AVAILABLE
         QtGui.QPlainTextEdit.__init__(self, parent)
         self.formattingTagsAllowed = formattingTagsAllowed
@@ -179,9 +171,6 @@
     WORDS = u'(?iu)[\w\']+'
 
     def __init__(self, *args):
-        """
-        Constructor
-        """
         QtGui.QSyntaxHighlighter.__init__(self, *args)
         self.spellingDictionary = None
 
@@ -208,8 +197,5 @@
     correct = QtCore.pyqtSignal(unicode)
 
     def __init__(self, *args):
-        """
-        Constructor
-        """
         QtGui.QAction.__init__(self, *args)
         self.triggered.connect(lambda x: self.correct.emit(self.text()))

=== modified file 'openlp/core/lib/theme.py'
--- openlp/core/lib/theme.py	2013-02-02 21:16:42 +0000
+++ openlp/core/lib/theme.py	2013-02-04 21:03:31 +0000
@@ -86,7 +86,6 @@
  </theme>
 '''
 
-
 class ThemeLevel(object):
     """
     Provides an enumeration for the level a theme applies to
@@ -214,7 +213,6 @@
     """
     FIRST_CAMEL_REGEX = re.compile(u'(.)([A-Z][a-z]+)')
     SECOND_CAMEL_REGEX = re.compile(u'([a-z0-9])([A-Z])')
-
     def __init__(self):
         """
         Initialise the theme object.
@@ -610,15 +608,13 @@
             self.add_background_gradient(
                 self.background_start_color,
                 self.background_end_color,
-                self.background_direction
-            )
+                self.background_direction)
         elif self.background_type == BackgroundType.to_string(BackgroundType.Image):
             filename = os.path.split(self.background_filename)[1]
             self.add_background_image(filename, self.background_border_color)
         elif self.background_type == BackgroundType.to_string(BackgroundType.Transparent):
             self.add_background_transparent()
-        self.add_font(
-            self.font_main_name,
+        self.add_font(self.font_main_name,
             self.font_main_color,
             self.font_main_size,
             self.font_main_override, u'main',
@@ -634,16 +630,14 @@
             self.font_main_outline_size,
             self.font_main_shadow,
             self.font_main_shadow_color,
-            self.font_main_shadow_size
-        )
-        self.add_font(
-            self.font_footer_name,
+            self.font_main_shadow_size)
+        self.add_font(self.font_footer_name,
             self.font_footer_color,
             self.font_footer_size,
             self.font_footer_override, u'footer',
             self.font_footer_bold,
             self.font_footer_italics,
-            0,  # line adjustment
+            0, # line adjustment
             self.font_footer_x,
             self.font_footer_y,
             self.font_footer_width,
@@ -653,10 +647,7 @@
             self.font_footer_outline_size,
             self.font_footer_shadow,
             self.font_footer_shadow_color,
-            self.font_footer_shadow_size
-        )
-        self.add_display(
-            self.display_horizontal_align,
+            self.font_footer_shadow_size)
+        self.add_display(self.display_horizontal_align,
             self.display_vertical_align,
-            self.display_slide_transition
-        )
+            self.display_slide_transition)

=== modified file 'openlp/core/lib/toolbar.py'
--- openlp/core/lib/toolbar.py	2013-02-01 19:58:18 +0000
+++ openlp/core/lib/toolbar.py	2013-02-04 21:03:31 +0000
@@ -37,7 +37,6 @@
 
 log = logging.getLogger(__name__)
 
-
 class OpenLPToolbar(QtGui.QToolBar):
     """
     Lots of toolbars around the place, so it makes sense to have a common way
@@ -86,3 +85,4 @@
                 self.actions[handle].setVisible(visible)
             else:
                 log.warn(u'No handle "%s" in actions list.', unicode(handle))
+

=== modified file 'openlp/core/lib/uistrings.py'
--- openlp/core/lib/uistrings.py	2013-02-01 19:58:18 +0000
+++ openlp/core/lib/uistrings.py	2013-02-04 21:03:31 +0000
@@ -111,8 +111,8 @@
         self.OLPV2x = translate('OpenLP.Ui', 'OpenLP 2.1')
         self.OpenLPStart = translate('OpenLP.Ui', 'OpenLP is already running. Do you wish to continue?')
         self.OpenService = translate('OpenLP.Ui', 'Open service.')
-        self.PlaySlidesInLoop = translate('OpenLP.Ui', 'Play Slides in Loop')
-        self.PlaySlidesToEnd = translate('OpenLP.Ui', 'Play Slides to End')
+        self.PlaySlidesInLoop = translate('OpenLP.Ui','Play Slides in Loop')
+        self.PlaySlidesToEnd = translate('OpenLP.Ui','Play Slides to End')
         self.Preview = translate('OpenLP.Ui', 'Preview')
         self.PrintService = translate('OpenLP.Ui', 'Print Service')
         self.ReplaceBG = translate('OpenLP.Ui', 'Replace Background')
@@ -144,3 +144,4 @@
         self.Version = translate('OpenLP.Ui', 'Version')
         self.View = translate('OpenLP.Ui', 'View')
         self.ViewMode = translate('OpenLP.Ui', 'View Mode')
+

=== modified file 'openlp/core/theme/__init__.py'
--- openlp/core/theme/__init__.py	2013-02-01 19:58:18 +0000
+++ openlp/core/theme/__init__.py	2013-02-04 21:03:31 +0000
@@ -32,5 +32,3 @@
 """
 
 from openlp.core.theme.theme import Theme
-
-__all__ = ['Theme']

=== modified file 'openlp/core/theme/theme.py'
--- openlp/core/theme/theme.py	2013-02-02 21:16:42 +0000
+++ openlp/core/theme/theme.py	2013-02-04 21:03:31 +0000
@@ -37,21 +37,11 @@
 from PyQt4 import QtGui
 
 DELPHI_COLORS = {
-    u'clAqua': 0x00FFFF,
-    u'clBlack': 0x000000,
-    u'clBlue': 0x0000FF,
-    u'clFuchsia': 0xFF00FF,
-    u'clGray': 0x808080,
-    u'clGreen': 0x008000,
-    u'clLime': 0x00FF00,
-    u'clMaroon': 0x800000,
-    u'clNavy': 0x000080,
-    u'clOlive': 0x808000,
-    u'clPurple': 0x800080,
-    u'clRed': 0xFF0000,
-    u'clSilver': 0xC0C0C0,
-    u'clTeal': 0x008080,
-    u'clWhite': 0xFFFFFF,
+    u'clAqua': 0x00FFFF,    u'clBlack': 0x000000,   u'clBlue': 0x0000FF,
+    u'clFuchsia': 0xFF00FF, u'clGray': 0x808080,    u'clGreen': 0x008000,
+    u'clLime': 0x00FF00,    u'clMaroon': 0x800000,  u'clNavy': 0x000080,
+    u'clOlive': 0x808000,   u'clPurple': 0x800080,  u'clRed': 0xFF0000,
+    u'clSilver': 0xC0C0C0,  u'clTeal': 0x008080,    u'clWhite': 0xFFFFFF,
     u'clYellow': 0xFFFF00
 }
 
@@ -76,7 +66,6 @@
 </Theme>
 '''
 
-
 class Theme(object):
     """
     Provide a class wrapper storing data from an XML theme
@@ -175,7 +164,6 @@
             * ``0`` - normal
             * ``1`` - lyrics
     """
-
     def __init__(self, xml):
         """
         Initialise a theme with data from xml
@@ -217,12 +205,10 @@
                     val = element_text
                 # strings need special handling to sort the colours out
                 if isinstance(element_text, basestring):
-                    if element_text[0] == u'$':
-                        # might be a hex number
+                    if element_text[0] == u'$': # might be a hex number
                         try:
                             val = int(element_text[1:], 16)
-                        except ValueError:
-                            # nope
+                        except ValueError: # nope
                             pass
                     elif element_text in DELPHI_COLORS:
                         val = DELPHI_COLORS[element_text]
@@ -236,9 +222,9 @@
                     isinstance(val, int))):
                     # convert to a wx.Colour
                     if not delphi_color_change:
-                        val = QtGui.QColor(val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF)
+                        val = QtGui.QColor(val&0xFF, (val>>8)&0xFF, (val>>16)&0xFF)
                     else:
-                        val = QtGui.QColor((val >> 16) & 0xFF, (val >> 8) & 0xFF, val & 0xFF)
+                        val = QtGui.QColor((val>>16)&0xFF, (val>>8)&0xFF, val&0xFF)
                 setattr(self, element.tag, val)
 
     def __str__(self):

=== modified file 'openlp/core/ui/__init__.py'
--- openlp/core/ui/__init__.py	2013-02-02 21:16:42 +0000
+++ openlp/core/ui/__init__.py	2013-02-04 21:03:31 +0000
@@ -31,6 +31,7 @@
 """
 
 
+
 class HideMode(object):
     """
     This is an enumeration class which specifies the different modes of hiding the display.
@@ -100,8 +101,6 @@
 from servicemanager import ServiceManager
 from thememanager import ThemeManager
 
-__all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'MainDisplay', 'SlideController', 'ServiceManager',
-    'ThemeManager', 'MediaDockManager', 'ServiceItemEditForm', 'FirstTimeForm', 'FirstTimeLanguageForm', 'ThemeForm',
-    'ThemeLayoutForm', 'FileRenameForm', 'StartTimeForm', 'MainDisplay', 'Display', 'ServiceNoteForm',
-    'SlideController', 'DisplayController', 'GeneralTab', 'ThemesTab', 'AdvancedTab', 'PluginForm',
-    'FormattingTagForm', 'ShortcutListForm']
+__all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'MainDisplay',
+    'SlideController', 'ServiceManager', 'ThemeManager', 'MediaDockManager',
+    'ServiceItemEditForm', 'FirstTimeForm']

=== modified file 'openlp/core/ui/aboutdialog.py'
--- openlp/core/ui/aboutdialog.py	2013-02-01 19:58:18 +0000
+++ openlp/core/ui/aboutdialog.py	2013-02-04 21:03:31 +0000
@@ -34,14 +34,7 @@
 
 
 class Ui_AboutDialog(object):
-    """
-    The actual GUI widgets for the About form.
-    """
-
     def setupUi(self, aboutDialog):
-        """
-        Set up the UI for the dialog.
-        """
         aboutDialog.setObjectName(u'aboutDialog')
         aboutDialog.setWindowIcon(build_icon(u':/icon/openlp-logo-16x16.png'))
         self.aboutDialogLayout = QtGui.QVBoxLayout(aboutDialog)
@@ -87,9 +80,6 @@
         self.aboutNotebook.setCurrentIndex(0)
 
     def retranslateUi(self, aboutDialog):
-        """
-        Dynamically translate the UI.
-        """
         aboutDialog.setWindowTitle(u'%s OpenLP' % UiStrings().About)
         self.aboutTextEdit.setPlainText(translate('OpenLP.AboutForm',
             'OpenLP <version><revision> - Open Source Lyrics '
@@ -144,17 +134,17 @@
             u'en_ZA': [u'Raoul "superfly" Snyman',
                        u'Johan "nuvolari" Mynhardt'],
             u'el': [u'Alexander Siozos'],
-            u'es': [u'Josu\xe9 Z\xfa\xf1iga', u'Christian Gonzalez'],
+            u'es': [u'Josu\xe9 Z\xfa\xf1iga',u'Christian Gonzalez'],
             u'et': [u'Mattias "mahfiaz" P\xf5ldaru'],
             u'fi': [u'Jori "joribu" Brander', u'Tobbe "tobbeb" Bildo'],
             u'fr': [u'Stephan\xe9 "stbrunner" Brunner', u'Jeremie "jnau05"',
                     u'Carl "carl.fischer" Fischer'],
             u'hu': [u'Gyuris Gell\xe9rt'],
-            u'id': [u'Mico "bangmico" Siahaan', u' ign_christian'],
+            u'id': [u'Mico "bangmico" Siahaan' ,u' ign_christian'],
             u'ja': [u'Kunio "Kunio" Nakamaru', u'Chris Haris'],
             u'nb': [u'Atle "pendlaren" Weibell', u'Frode "frodus" Woldsund'],
             u'nl': [u'Arjen "typovar" van Voorst'],
-            u'pt_BR': [u'David Mederiros', u'Rafael "rafaellerm" Lerm',
+            u'pt_BR': [u'David Mederiros',u'Rafael "rafaellerm" Lerm',
                        u'Eduardo Levi Chaves',
                        u'Gustavo Bim', u'Rog\xeanio Bel\xe9m', u'Samuel'
                 u'Simon "samscudder" Scudder', u'Van Der Fran'],
@@ -270,7 +260,7 @@
             u'\n    '.join(documentors)))
         self.aboutNotebook.setTabText(self.aboutNotebook.indexOf(self.creditsTab),
             translate('OpenLP.AboutForm', 'Credits'))
-        copyright_note = translate('OpenLP.AboutForm',
+        copyright = translate('OpenLP.AboutForm',
             'Copyright \xa9 2004-2013 %s\n'
             'Portions copyright \xa9 2004-2013 %s') % (u'Raoul Snyman',
             u'Tim Bentley, Gerald Britton, Jonathan Corwin, Samuel Findlay, '
@@ -662,7 +652,7 @@
             'linking proprietary applications with the library. If this is '
             'what you want to do, use the GNU Lesser General Public License '
             'instead of this License.')
-        self.licenseTextEdit.setPlainText(u'%s\n\n%s\n\n%s\n\n\n%s' % (copyright_note, licence, disclaimer, gpltext))
+        self.licenseTextEdit.setPlainText(u'%s\n\n%s\n\n%s\n\n\n%s' % (copyright, licence, disclaimer, gpltext))
         self.aboutNotebook.setTabText(self.aboutNotebook.indexOf(self.licenseTab),
             translate('OpenLP.AboutForm', 'License'))
         self.volunteerButton.setText(translate('OpenLP.AboutForm', 'Volunteer'))

=== modified file 'openlp/core/ui/aboutform.py'
--- openlp/core/ui/aboutform.py	2013-02-01 19:58:18 +0000
+++ openlp/core/ui/aboutform.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,6 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The About dialog.
-"""
 
 from PyQt4 import QtCore, QtGui
 
@@ -36,7 +33,6 @@
 from openlp.core.lib import translate
 from openlp.core.utils import get_application_version
 
-
 class AboutForm(QtGui.QDialog, Ui_AboutDialog):
     """
     The About dialog

=== modified file 'openlp/core/ui/advancedtab.py'
--- openlp/core/ui/advancedtab.py	2013-02-02 21:16:42 +0000
+++ openlp/core/ui/advancedtab.py	2013-02-04 21:03:31 +0000
@@ -36,7 +36,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import SettingsTab, Receiver, Settings, UiStrings, translate, build_icon
+from openlp.core.lib import SettingsTab, translate, build_icon,  Receiver, Settings, UiStrings
 from openlp.core.utils import get_images_filter, AppLocation, format_time
 from openlp.core.lib import SlideLimits
 
@@ -52,10 +52,10 @@
         """
         Initialise the settings tab
         """
-        self.display_changed = False
-        self.default_image = u':/graphics/openlp-splash-screen.png'
-        self.default_color = u'#ffffff'
-        self.data_exists = False
+        self.displayChanged = False
+        self.defaultImage = u':/graphics/openlp-splash-screen.png'
+        self.defaultColor = u'#ffffff'
+        self.dataExists = False
         self.iconPath = u':/system/system_settings.png'
         advanced_translated = translate('OpenLP.AdvancedTab', 'Advanced')
         SettingsTab.__init__(self, parent, u'Advanced', advanced_translated)
@@ -66,288 +66,278 @@
         """
         self.setObjectName(u'AdvancedTab')
         SettingsTab.setupUi(self)
-        self.ui_group_box = QtGui.QGroupBox(self.leftColumn)
-        self.ui_group_box.setObjectName(u'ui_group_box')
-        self.ui_layout = QtGui.QFormLayout(self.ui_group_box)
-        self.ui_layout.setObjectName(u'ui_layout')
-        self.recent_label = QtGui.QLabel(self.ui_group_box)
-        self.recent_label.setObjectName(u'recent_label')
-        self.recent_spin_box = QtGui.QSpinBox(self.ui_group_box)
-        self.recent_spin_box.setObjectName(u'recent_spin_box')
-        self.recent_spin_box.setMinimum(0)
-        self.ui_layout.addRow(self.recent_label, self.recent_spin_box)
-        self.media_plugin_check_box = QtGui.QCheckBox(self.ui_group_box)
-        self.media_plugin_check_box.setObjectName(u'media_plugin_check_box')
-        self.ui_layout.addRow(self.media_plugin_check_box)
-        self.double_click_live_check_box = QtGui.QCheckBox(self.ui_group_box)
-        self.double_click_live_check_box.setObjectName(u'double_click_live_check_box')
-        self.ui_layout.addRow(self.double_click_live_check_box)
-        self.single_click_preview_check_box = QtGui.QCheckBox(self.ui_group_box)
-        self.single_click_preview_check_box.setObjectName(u'single_click_preview_check_box')
-        self.ui_layout.addRow(self.single_click_preview_check_box)
-        self.expand_service_item_check_box = QtGui.QCheckBox(self.ui_group_box)
-        self.expand_service_item_check_box.setObjectName(u'expand_service_item_check_box')
-        self.ui_layout.addRow(self.expand_service_item_check_box)
-        self.enable_auto_close_check_box = QtGui.QCheckBox(self.ui_group_box)
-        self.enable_auto_close_check_box.setObjectName(u'enable_auto_close_check_box')
-        self.ui_layout.addRow(self.enable_auto_close_check_box)
-        self.leftLayout.addWidget(self.ui_group_box)
+        self.uiGroupBox = QtGui.QGroupBox(self.leftColumn)
+        self.uiGroupBox.setObjectName(u'uiGroupBox')
+        self.uiLayout = QtGui.QFormLayout(self.uiGroupBox)
+        self.uiLayout.setObjectName(u'uiLayout')
+        self.recentLabel = QtGui.QLabel(self.uiGroupBox)
+        self.recentLabel.setObjectName(u'recentLabel')
+        self.recentSpinBox = QtGui.QSpinBox(self.uiGroupBox)
+        self.recentSpinBox.setObjectName(u'recentSpinBox')
+        self.recentSpinBox.setMinimum(0)
+        self.uiLayout.addRow(self.recentLabel, self.recentSpinBox)
+        self.mediaPluginCheckBox = QtGui.QCheckBox(self.uiGroupBox)
+        self.mediaPluginCheckBox.setObjectName(u'mediaPluginCheckBox')
+        self.uiLayout.addRow(self.mediaPluginCheckBox)
+        self.doubleClickLiveCheckBox = QtGui.QCheckBox(self.uiGroupBox)
+        self.doubleClickLiveCheckBox.setObjectName(u'doubleClickLiveCheckBox')
+        self.uiLayout.addRow(self.doubleClickLiveCheckBox)
+        self.singleClickPreviewCheckBox = QtGui.QCheckBox(self.uiGroupBox)
+        self.singleClickPreviewCheckBox.setObjectName(u'singleClickPreviewCheckBox')
+        self.uiLayout.addRow(self.singleClickPreviewCheckBox)
+        self.expandServiceItemCheckBox = QtGui.QCheckBox(self.uiGroupBox)
+        self.expandServiceItemCheckBox.setObjectName(u'expandServiceItemCheckBox')
+        self.uiLayout.addRow(self.expandServiceItemCheckBox)
+        self.enableAutoCloseCheckBox = QtGui.QCheckBox(self.uiGroupBox)
+        self.enableAutoCloseCheckBox.setObjectName(u'enableAutoCloseCheckBox')
+        self.uiLayout.addRow(self.enableAutoCloseCheckBox)
+        self.leftLayout.addWidget(self.uiGroupBox)
         # Default service name
-        self.service_name_group_box = QtGui.QGroupBox(self.leftColumn)
-        self.service_name_group_box.setObjectName(u'service_name_group_box')
-        self.service_name_layout = QtGui.QFormLayout(self.service_name_group_box)
-        self.service_name_check_box = QtGui.QCheckBox(self.service_name_group_box)
-        self.service_name_check_box.setObjectName(u'service_name_check_box')
-        self.service_name_layout.setObjectName(u'service_name_layout')
-        self.service_name_layout.addRow(self.service_name_check_box)
-        self.service_name_time_label = QtGui.QLabel(self.service_name_group_box)
-        self.service_name_time_label.setObjectName(u'service_name_time_label')
-        self.service_name_day = QtGui.QComboBox(self.service_name_group_box)
-        self.service_name_day.addItems([u'', u'', u'', u'', u'', u'', u'', u''])
-        self.service_name_day.setObjectName(u'service_name_day')
-        self.service_name_time = QtGui.QTimeEdit(self.service_name_group_box)
-        self.service_name_time.setObjectName(u'service_name_time')
-        self.service_name_time_layout = QtGui.QHBoxLayout()
-        self.service_name_time_layout.setObjectName(u'service_name_time_layout')
-        self.service_name_time_layout.addWidget(self.service_name_day)
-        self.service_name_time_layout.addWidget(self.service_name_time)
-        self.service_name_layout.addRow(self.service_name_time_label, self.service_name_time_layout)
-        self.service_name_label = QtGui.QLabel(self.service_name_group_box)
-        self.service_name_label.setObjectName(u'service_name_label')
-        self.service_name_edit = QtGui.QLineEdit(self.service_name_group_box)
-        self.service_name_edit.setObjectName(u'service_name_edit')
-        self.service_name_edit.setValidator(QtGui.QRegExpValidator(QtCore.QRegExp(r'[^/\\?*|<>\[\]":+]+'), self))
-        self.service_name_revert_button = QtGui.QToolButton(self.service_name_group_box)
-        self.service_name_revert_button.setObjectName(u'service_name_revert_button')
-        self.service_name_revert_button.setIcon(build_icon(u':/general/general_revert.png'))
-        self.service_name_button_layout = QtGui.QHBoxLayout()
-        self.service_name_button_layout.setObjectName(u'service_name_button_layout')
-        self.service_name_button_layout.addWidget(self.service_name_edit)
-        self.service_name_button_layout.addWidget(self.service_name_revert_button)
-        self.service_name_layout.addRow(self.service_name_label, self.service_name_button_layout)
-        self.service_name_example_label = QtGui.QLabel(self.service_name_group_box)
-        self.service_name_example_label.setObjectName(u'service_name_example_label')
-        self.service_name_example = QtGui.QLabel(self.service_name_group_box)
-        self.service_name_example.setObjectName(u'service_name_example')
-        self.service_name_layout.addRow(self.service_name_example_label, self.service_name_example)
-        self.leftLayout.addWidget(self.service_name_group_box)
+        self.serviceNameGroupBox = QtGui.QGroupBox(self.leftColumn)
+        self.serviceNameGroupBox.setObjectName(u'serviceNameGroupBox')
+        self.serviceNameLayout = QtGui.QFormLayout(self.serviceNameGroupBox)
+        self.serviceNameCheckBox = QtGui.QCheckBox(self.serviceNameGroupBox)
+        self.serviceNameCheckBox.setObjectName(u'serviceNameCheckBox')
+        self.serviceNameLayout.setObjectName(u'serviceNameLayout')
+        self.serviceNameLayout.addRow(self.serviceNameCheckBox)
+        self.serviceNameTimeLabel = QtGui.QLabel(self.serviceNameGroupBox)
+        self.serviceNameTimeLabel.setObjectName(u'serviceNameTimeLabel')
+        self.serviceNameDay = QtGui.QComboBox(self.serviceNameGroupBox)
+        self.serviceNameDay.addItems([u'', u'', u'', u'', u'', u'', u'', u''])
+        self.serviceNameDay.setObjectName(u'serviceNameDay')
+        self.serviceNameTime = QtGui.QTimeEdit(self.serviceNameGroupBox)
+        self.serviceNameTime.setObjectName(u'serviceNameTime')
+        self.serviceNameTimeHBox = QtGui.QHBoxLayout()
+        self.serviceNameTimeHBox.setObjectName(u'serviceNameTimeHBox')
+        self.serviceNameTimeHBox.addWidget(self.serviceNameDay)
+        self.serviceNameTimeHBox.addWidget(self.serviceNameTime)
+        self.serviceNameLayout.addRow(self.serviceNameTimeLabel, self.serviceNameTimeHBox)
+        self.serviceNameLabel = QtGui.QLabel(self.serviceNameGroupBox)
+        self.serviceNameLabel.setObjectName(u'serviceNameLabel')
+        self.serviceNameEdit = QtGui.QLineEdit(self.serviceNameGroupBox)
+        self.serviceNameEdit.setObjectName(u'serviceNameEdit')
+        self.serviceNameEdit.setValidator(QtGui.QRegExpValidator(QtCore.QRegExp(r'[^/\\?*|<>\[\]":+]+'), self))
+        self.serviceNameRevertButton = QtGui.QToolButton(self.serviceNameGroupBox)
+        self.serviceNameRevertButton.setObjectName(u'serviceNameRevertButton')
+        self.serviceNameRevertButton.setIcon(build_icon(u':/general/general_revert.png'))
+        self.serviceNameHBox = QtGui.QHBoxLayout()
+        self.serviceNameHBox.setObjectName(u'serviceNameHBox')
+        self.serviceNameHBox.addWidget(self.serviceNameEdit)
+        self.serviceNameHBox.addWidget(self.serviceNameRevertButton)
+        self.serviceNameLayout.addRow(self.serviceNameLabel, self.serviceNameHBox)
+        self.serviceNameExampleLabel = QtGui.QLabel(self.serviceNameGroupBox)
+        self.serviceNameExampleLabel.setObjectName(u'serviceNameExampleLabel')
+        self.serviceNameExample = QtGui.QLabel(self.serviceNameGroupBox)
+        self.serviceNameExample.setObjectName(u'serviceNameExample')
+        self.serviceNameLayout.addRow(self.serviceNameExampleLabel, self.serviceNameExample)
+        self.leftLayout.addWidget(self.serviceNameGroupBox)
         # Data Directory
-        self.data_directory_group_box = QtGui.QGroupBox(self.leftColumn)
-        self.data_directory_group_box.setObjectName(u'data_directory_group_box')
-        self.data_directory_layout = QtGui.QFormLayout(self.data_directory_group_box)
-        self.data_directory_layout.setObjectName(u'data_directory_layout')
-        self.data_directory_current_label = QtGui.QLabel(self.data_directory_group_box)
-        self.data_directory_current_label.setObjectName(u'data_directory_current_label')
-        self.data_directory_label = QtGui.QLabel(self.data_directory_group_box)
-        self.data_directory_label.setObjectName(u'data_directory_label')
-        self.data_directory_new_label = QtGui.QLabel(self.data_directory_group_box)
-        self.data_directory_new_label.setObjectName(u'data_directory_current_label')
-        self.new_data_directory_edit = QtGui.QLineEdit(self.data_directory_group_box)
-        self.new_data_directory_edit.setObjectName(u'new_data_directory_edit')
-        self.new_data_directory_edit.setReadOnly(True)
-        self.new_data_directory_has_files_label = QtGui.QLabel(self.data_directory_group_box)
-        self.new_data_directory_has_files_label.setObjectName(u'new_data_directory_has_files_label')
-        self.new_data_directory_has_files_label.setWordWrap(True)
-        self.data_directory_browse_button = QtGui.QToolButton(self.data_directory_group_box)
-        self.data_directory_browse_button.setObjectName(u'data_directory_browse_button')
-        self.data_directory_browse_button.setIcon(build_icon(u':/general/general_open.png'))
-        self.data_directory_default_button = QtGui.QToolButton(self.data_directory_group_box)
-        self.data_directory_default_button.setObjectName(u'data_directory_default_button')
-        self.data_directory_default_button.setIcon(build_icon(u':/general/general_revert.png'))
-        self.data_directory_cancel_button = QtGui.QToolButton(self.data_directory_group_box)
-        self.data_directory_cancel_button.setObjectName(u'data_directory_cancel_button')
-        self.data_directory_cancel_button.setIcon(build_icon(u':/general/general_delete.png'))
-        self.new_data_directory_label_layout = QtGui.QHBoxLayout()
-        self.new_data_directory_label_layout.setObjectName(u'new_data_directory_label_layout')
-        self.new_data_directory_label_layout.addWidget(self.new_data_directory_edit)
-        self.new_data_directory_label_layout.addWidget(self.data_directory_browse_button)
-        self.new_data_directory_label_layout.addWidget(self.data_directory_default_button)
-        self.data_directory_copy_check_layout = QtGui.QHBoxLayout()
-        self.data_directory_copy_check_layout.setObjectName(u'data_directory_copy_check_layout')
-        self.data_directory_copy_check_box = QtGui.QCheckBox(self.data_directory_group_box)
-        self.data_directory_copy_check_box.setObjectName(u'data_directory_copy_check_box')
-        self.data_directory_copy_check_layout.addWidget(self.data_directory_copy_check_box)
-        self.data_directory_copy_check_layout.addStretch()
-        self.data_directory_copy_check_layout.addWidget(self.data_directory_cancel_button)
-        self.data_directory_layout.addRow(self.data_directory_current_label, self.data_directory_label)
-        self.data_directory_layout.addRow(self.data_directory_new_label, self.new_data_directory_label_layout)
-        self.data_directory_layout.addRow(self.data_directory_copy_check_layout)
-        self.data_directory_layout.addRow(self.new_data_directory_has_files_label)
-        self.leftLayout.addWidget(self.data_directory_group_box)
+        self.dataDirectoryGroupBox = QtGui.QGroupBox(self.leftColumn)
+        self.dataDirectoryGroupBox.setObjectName(u'dataDirectoryGroupBox')
+        self.dataDirectoryLayout = QtGui.QFormLayout(self.dataDirectoryGroupBox)
+        self.dataDirectoryLayout.setObjectName(u'dataDirectoryLayout')
+        self.dataDirectoryCurrentLabel = QtGui.QLabel(self.dataDirectoryGroupBox)
+        self.dataDirectoryCurrentLabel.setObjectName(            u'dataDirectoryCurrentLabel')
+        self.dataDirectoryLabel = QtGui.QLabel(self.dataDirectoryGroupBox)
+        self.dataDirectoryLabel.setObjectName(u'dataDirectoryLabel')
+        self.dataDirectoryNewLabel = QtGui.QLabel(self.dataDirectoryGroupBox)
+        self.dataDirectoryNewLabel.setObjectName(u'dataDirectoryCurrentLabel')
+        self.newDataDirectoryEdit = QtGui.QLineEdit(self.dataDirectoryGroupBox)
+        self.newDataDirectoryEdit.setObjectName(u'newDataDirectoryEdit')
+        self.newDataDirectoryEdit.setReadOnly(True)
+        self.newDataDirectoryHasFilesLabel = QtGui.QLabel(self.dataDirectoryGroupBox)
+        self.newDataDirectoryHasFilesLabel.setObjectName(u'newDataDirectoryHasFilesLabel')
+        self.newDataDirectoryHasFilesLabel.setWordWrap(True)
+        self.dataDirectoryBrowseButton = QtGui.QToolButton(self.dataDirectoryGroupBox)
+        self.dataDirectoryBrowseButton.setObjectName(u'dataDirectoryBrowseButton')
+        self.dataDirectoryBrowseButton.setIcon(build_icon(u':/general/general_open.png'))
+        self.dataDirectoryDefaultButton = QtGui.QToolButton(self.dataDirectoryGroupBox)
+        self.dataDirectoryDefaultButton.setObjectName(u'dataDirectoryDefaultButton')
+        self.dataDirectoryDefaultButton.setIcon(build_icon(u':/general/general_revert.png'))
+        self.dataDirectoryCancelButton = QtGui.QToolButton(self.dataDirectoryGroupBox)
+        self.dataDirectoryCancelButton.setObjectName(u'dataDirectoryCancelButton')
+        self.dataDirectoryCancelButton.setIcon(build_icon(u':/general/general_delete.png'))
+        self.newDataDirectoryLabelHBox = QtGui.QHBoxLayout()
+        self.newDataDirectoryLabelHBox.setObjectName(u'newDataDirectoryLabelHBox')
+        self.newDataDirectoryLabelHBox.addWidget(self.newDataDirectoryEdit)
+        self.newDataDirectoryLabelHBox.addWidget(self.dataDirectoryBrowseButton)
+        self.newDataDirectoryLabelHBox.addWidget(self.dataDirectoryDefaultButton)
+        self.dataDirectoryCopyCheckHBox = QtGui.QHBoxLayout()
+        self.dataDirectoryCopyCheckHBox.setObjectName(u'dataDirectoryCopyCheckHBox')
+        self.dataDirectoryCopyCheckBox = QtGui.QCheckBox(self.dataDirectoryGroupBox)
+        self.dataDirectoryCopyCheckBox.setObjectName(u'dataDirectoryCopyCheckBox')
+        self.dataDirectoryCopyCheckHBox.addWidget(self.dataDirectoryCopyCheckBox)
+        self.dataDirectoryCopyCheckHBox.addStretch()
+        self.dataDirectoryCopyCheckHBox.addWidget(self.dataDirectoryCancelButton)
+        self.dataDirectoryLayout.addRow(self.dataDirectoryCurrentLabel, self.dataDirectoryLabel)
+        self.dataDirectoryLayout.addRow(self.dataDirectoryNewLabel, self.newDataDirectoryLabelHBox)
+        self.dataDirectoryLayout.addRow(self.dataDirectoryCopyCheckHBox)
+        self.dataDirectoryLayout.addRow(self.newDataDirectoryHasFilesLabel)
+        self.leftLayout.addWidget(self.dataDirectoryGroupBox)
         self.leftLayout.addStretch()
         # Default Image
-        self.default_image_group_box = QtGui.QGroupBox(self.rightColumn)
-        self.default_image_group_box.setObjectName(u'default_image_group_box')
-        self.default_image_layout = QtGui.QFormLayout(self.default_image_group_box)
-        self.default_image_layout.setObjectName(u'default_image_layout')
-        self.default_color_label = QtGui.QLabel(self.default_image_group_box)
-        self.default_color_label.setObjectName(u'default_color_label')
-        self.default_color_button = QtGui.QPushButton(self.default_image_group_box)
-        self.default_color_button.setObjectName(u'default_color_button')
-        self.default_image_layout.addRow(self.default_color_label, self.default_color_button)
-        self.default_file_label = QtGui.QLabel(self.default_image_group_box)
-        self.default_file_label.setObjectName(u'default_file_label')
-        self.default_file_edit = QtGui.QLineEdit(self.default_image_group_box)
-        self.default_file_edit.setObjectName(u'default_file_edit')
-        self.default_browse_button = QtGui.QToolButton(self.default_image_group_box)
-        self.default_browse_button.setObjectName(u'default_browse_button')
-        self.default_browse_button.setIcon(build_icon(u':/general/general_open.png'))
-        self.default_revert_button = QtGui.QToolButton(self.default_image_group_box)
-        self.default_revert_button.setObjectName(u'default_revert_button')
-        self.default_revert_button.setIcon(build_icon(u':/general/general_revert.png'))
-        self.default_file_layout = QtGui.QHBoxLayout()
-        self.default_file_layout.setObjectName(u'default_file_layout')
-        self.default_file_layout.addWidget(self.default_file_edit)
-        self.default_file_layout.addWidget(self.default_browse_button)
-        self.default_file_layout.addWidget(self.default_revert_button)
-        self.default_image_layout.addRow(self.default_file_label, self.default_file_layout)
-        self.rightLayout.addWidget(self.default_image_group_box)
+        self.defaultImageGroupBox = QtGui.QGroupBox(self.rightColumn)
+        self.defaultImageGroupBox.setObjectName(u'defaultImageGroupBox')
+        self.defaultImageLayout = QtGui.QFormLayout(self.defaultImageGroupBox)
+        self.defaultImageLayout.setObjectName(u'defaultImageLayout')
+        self.defaultColorLabel = QtGui.QLabel(self.defaultImageGroupBox)
+        self.defaultColorLabel.setObjectName(u'defaultColorLabel')
+        self.defaultColorButton = QtGui.QPushButton(self.defaultImageGroupBox)
+        self.defaultColorButton.setObjectName(u'defaultColorButton')
+        self.defaultImageLayout.addRow(self.defaultColorLabel, self.defaultColorButton)
+        self.defaultFileLabel = QtGui.QLabel(self.defaultImageGroupBox)
+        self.defaultFileLabel.setObjectName(u'defaultFileLabel')
+        self.defaultFileEdit = QtGui.QLineEdit(self.defaultImageGroupBox)
+        self.defaultFileEdit.setObjectName(u'defaultFileEdit')
+        self.defaultBrowseButton = QtGui.QToolButton(self.defaultImageGroupBox)
+        self.defaultBrowseButton.setObjectName(u'defaultBrowseButton')
+        self.defaultBrowseButton.setIcon(build_icon(u':/general/general_open.png'))
+        self.defaultRevertButton = QtGui.QToolButton(self.defaultImageGroupBox)
+        self.defaultRevertButton.setObjectName(u'defaultRevertButton')
+        self.defaultRevertButton.setIcon(build_icon(u':/general/general_revert.png'))
+        self.defaultFileLayout = QtGui.QHBoxLayout()
+        self.defaultFileLayout.setObjectName(u'defaultFileLayout')
+        self.defaultFileLayout.addWidget(self.defaultFileEdit)
+        self.defaultFileLayout.addWidget(self.defaultBrowseButton)
+        self.defaultFileLayout.addWidget(self.defaultRevertButton)
+        self.defaultImageLayout.addRow(self.defaultFileLabel, self.defaultFileLayout)
+        self.rightLayout.addWidget(self.defaultImageGroupBox)
         # Hide mouse
-        self.hide_mouse_group_box = QtGui.QGroupBox(self.rightColumn)
-        self.hide_mouse_group_box.setObjectName(u'hide_mouse_group_box')
-        self.hide_mouse_layout = QtGui.QVBoxLayout(self.hide_mouse_group_box)
-        self.hide_mouse_layout.setObjectName(u'hide_mouse_layout')
-        self.hide_mouse_check_box = QtGui.QCheckBox(self.hide_mouse_group_box)
-        self.hide_mouse_check_box.setObjectName(u'hide_mouse_check_box')
-        self.hide_mouse_layout.addWidget(self.hide_mouse_check_box)
-        self.rightLayout.addWidget(self.hide_mouse_group_box)
+        self.hideMouseGroupBox = QtGui.QGroupBox(self.rightColumn)
+        self.hideMouseGroupBox.setObjectName(u'hideMouseGroupBox')
+        self.hideMouseLayout = QtGui.QVBoxLayout(self.hideMouseGroupBox)
+        self.hideMouseLayout.setObjectName(u'hideMouseLayout')
+        self.hideMouseCheckBox = QtGui.QCheckBox(self.hideMouseGroupBox)
+        self.hideMouseCheckBox.setObjectName(u'hideMouseCheckBox')
+        self.hideMouseLayout.addWidget(self.hideMouseCheckBox)
+        self.rightLayout.addWidget(self.hideMouseGroupBox)
         # Service Item Slide Limits
-        self.slide_group_box = QtGui.QGroupBox(self.rightColumn)
-        self.slide_group_box.setObjectName(u'slide_group_box')
-        self.slide_layout = QtGui.QVBoxLayout(self.slide_group_box)
-        self.slide_layout.setObjectName(u'slide_layout')
-        self.slide_label = QtGui.QLabel(self.slide_group_box)
-        self.slide_label.setWordWrap(True)
-        self.slide_layout.addWidget(self.slide_label)
-        self.end_slide_radio_button = QtGui.QRadioButton(self.slide_group_box)
-        self.end_slide_radio_button.setObjectName(u'end_slide_radio_button')
-        self.slide_layout.addWidget(self.end_slide_radio_button)
-        self.wrap_slide_radio_button = QtGui.QRadioButton(self.slide_group_box)
-        self.wrap_slide_radio_button.setObjectName(u'wrap_slide_radio_button')
-        self.slide_layout.addWidget(self.wrap_slide_radio_button)
-        self.next_item_radio_button = QtGui.QRadioButton(self.slide_group_box)
-        self.next_item_radio_button.setObjectName(u'next_item_radio_button')
-        self.slide_layout.addWidget(self.next_item_radio_button)
-        self.rightLayout.addWidget(self.slide_group_box)
+        self.slideGroupBox = QtGui.QGroupBox(self.rightColumn)
+        self.slideGroupBox.setObjectName(u'slideGroupBox')
+        self.slideLayout = QtGui.QVBoxLayout(self.slideGroupBox)
+        self.slideLayout.setObjectName(u'slideLayout')
+        self.slideLabel = QtGui.QLabel(self.slideGroupBox)
+        self.slideLabel.setWordWrap(True)
+        self.slideLayout.addWidget(self.slideLabel)
+        self.endSlideRadioButton = QtGui.QRadioButton(self.slideGroupBox)
+        self.endSlideRadioButton.setObjectName(u'endSlideRadioButton')
+        self.slideLayout.addWidget(self.endSlideRadioButton)
+        self.wrapSlideRadioButton = QtGui.QRadioButton(self.slideGroupBox)
+        self.wrapSlideRadioButton.setObjectName(u'wrapSlideRadioButton')
+        self.slideLayout.addWidget(self.wrapSlideRadioButton)
+        self.nextItemRadioButton = QtGui.QRadioButton(self.slideGroupBox)
+        self.nextItemRadioButton.setObjectName(u'nextItemRadioButton')
+        self.slideLayout.addWidget(self.nextItemRadioButton)
+        self.rightLayout.addWidget(self.slideGroupBox)
         # Display Workarounds
-        self.display_workaround_group_box = QtGui.QGroupBox(self.leftColumn)
-        self.display_workaround_group_box.setObjectName(u'display_workaround_group_box')
-        self.display_workaround_layout = QtGui.QVBoxLayout(self.display_workaround_group_box)
-        self.display_workaround_layout.setObjectName(u'display_workaround_layout')
-        self.x11_bypass_check_box = QtGui.QCheckBox(self.display_workaround_group_box)
-        self.x11_bypass_check_box.setObjectName(u'x11_bypass_check_box')
-        self.display_workaround_layout.addWidget(self.x11_bypass_check_box)
-        self.alternate_rows_check_box = QtGui.QCheckBox(self.display_workaround_group_box)
-        self.alternate_rows_check_box.setObjectName(u'alternate_rows_check_box')
-        self.display_workaround_layout.addWidget(self.alternate_rows_check_box)
-        self.rightLayout.addWidget(self.display_workaround_group_box)
+        self.displayWorkaroundGroupBox = QtGui.QGroupBox(self.leftColumn)
+        self.displayWorkaroundGroupBox.setObjectName(u'displayWorkaroundGroupBox')
+        self.displayWorkaroundLayout = QtGui.QVBoxLayout(self.displayWorkaroundGroupBox)
+        self.displayWorkaroundLayout.setObjectName(u'displayWorkaroundLayout')
+        self.x11BypassCheckBox = QtGui.QCheckBox(self.displayWorkaroundGroupBox)
+        self.x11BypassCheckBox.setObjectName(u'x11BypassCheckBox')
+        self.displayWorkaroundLayout.addWidget(self.x11BypassCheckBox)
+        self.alternateRowsCheckBox = QtGui.QCheckBox(self.displayWorkaroundGroupBox)
+        self.alternateRowsCheckBox.setObjectName(u'alternateRowsCheckBox')
+        self.displayWorkaroundLayout.addWidget(self.alternateRowsCheckBox)
+        self.rightLayout.addWidget(self.displayWorkaroundGroupBox)
         self.rightLayout.addStretch()
-        self.should_update_service_name_example = False
-        QtCore.QObject.connect(self.service_name_check_box, QtCore.SIGNAL(u'toggled(bool)'),
-            self.service_name_check_box_toggled)
-        QtCore.QObject.connect(self.service_name_day, QtCore.SIGNAL(u'currentIndexChanged(int)'),
-            self.on_service_name_day_changed)
-        QtCore.QObject.connect(self.service_name_time, QtCore.SIGNAL(u'timeChanged(QTime)'),
-            self.update_service_name_example)
-        QtCore.QObject.connect(self.service_name_edit, QtCore.SIGNAL(u'textChanged(QString)'),
-            self.update_service_name_example)
-        QtCore.QObject.connect(self.service_name_revert_button, QtCore.SIGNAL(u'clicked()'),
-            self.on_service_name_revert_button_clicked)
-        QtCore.QObject.connect(self.default_color_button, QtCore.SIGNAL(u'clicked()'),
-            self.on_default_color_button_clicked)
-        QtCore.QObject.connect(self.default_browse_button, QtCore.SIGNAL(u'clicked()'),
-            self.on_default_browse_button_clicked)
-        QtCore.QObject.connect(self.default_revert_button, QtCore.SIGNAL(u'clicked()'),
-            self.on_default_revert_button_clicked)
-        QtCore.QObject.connect(self.x11_bypass_check_box, QtCore.SIGNAL(u'toggled(bool)'),
-            self.on_X11_bypass_check_box_toggled)
-        QtCore.QObject.connect(self.alternate_rows_check_box,QtCore.SIGNAL(u'toggled(bool)'),
-            self.on_alternate_rows_check_box_toggled)
-        QtCore.QObject.connect(self.data_directory_browse_button, QtCore.SIGNAL(u'clicked()'),
-            self.on_data_directory_browse_button_clicked)
-        QtCore.QObject.connect(self.data_directory_default_button, QtCore.SIGNAL(u'clicked()'),
-            self.on_data_directory_default_button_clicked)
-        QtCore.QObject.connect(self.data_directory_cancel_button, QtCore.SIGNAL(u'clicked()'),
-            self.on_data_directory_cancel_button_clicked)
-        QtCore.QObject.connect(self.data_directory_copy_check_box, QtCore.SIGNAL(u'toggled(bool)'),
-            self.on_data_directory_copy_check_box_toggled)
-        QtCore.QObject.connect(self.end_slide_radio_button, QtCore.SIGNAL(u'clicked()'),
-            self.on_end_slide_button_clicked)
-        QtCore.QObject.connect(self.wrap_slide_radio_button, QtCore.SIGNAL(u'clicked()'),
-            self.on_wrap_slide_button_clicked)
-        QtCore.QObject.connect(self.next_item_radio_button, QtCore.SIGNAL(u'clicked()'),
-            self.on_next_item_button_clicked)
-
+        self.shouldUpdateServiceNameExample = False
+        QtCore.QObject.connect(self.serviceNameCheckBox, QtCore.SIGNAL(u'toggled(bool)'),
+            self.serviceNameCheckBoxToggled)
+        QtCore.QObject.connect(self.serviceNameDay, QtCore.SIGNAL(u'currentIndexChanged(int)'),
+            self.onServiceNameDayChanged)
+        QtCore.QObject.connect(self.serviceNameTime, QtCore.SIGNAL(u'timeChanged(QTime)'),
+            self.updateServiceNameExample)
+        QtCore.QObject.connect(self.serviceNameEdit, QtCore.SIGNAL(u'textChanged(QString)'),
+            self.updateServiceNameExample)
+        QtCore.QObject.connect(self.serviceNameRevertButton, QtCore.SIGNAL(u'clicked()'),
+            self.onServiceNameRevertButtonClicked)
+        QtCore.QObject.connect(self.defaultColorButton, QtCore.SIGNAL(u'clicked()'), self.onDefaultColorButtonClicked)
+        QtCore.QObject.connect(self.defaultBrowseButton, QtCore.SIGNAL(u'clicked()'), self.onDefaultBrowseButtonClicked)
+        QtCore.QObject.connect(self.defaultRevertButton, QtCore.SIGNAL(u'clicked()'), self.onDefaultRevertButtonClicked)
+        QtCore.QObject.connect(self.x11BypassCheckBox, QtCore.SIGNAL(u'toggled(bool)'), self.onX11BypassCheckBoxToggled)
+        QtCore.QObject.connect(self.alternateRowsCheckBox,
+            QtCore.SIGNAL(u'toggled(bool)'), self.onAlternateRowsCheckBoxToggled)
+        QtCore.QObject.connect(self.dataDirectoryBrowseButton, QtCore.SIGNAL(u'clicked()'),
+            self.onDataDirectoryBrowseButtonClicked)
+        QtCore.QObject.connect(self.dataDirectoryDefaultButton, QtCore.SIGNAL(u'clicked()'),
+            self.onDataDirectoryDefaultButtonClicked)
+        QtCore.QObject.connect(self.dataDirectoryCancelButton, QtCore.SIGNAL(u'clicked()'),
+            self.onDataDirectoryCancelButtonClicked)
+        QtCore.QObject.connect(self.dataDirectoryCopyCheckBox, QtCore.SIGNAL(u'toggled(bool)'),
+            self.onDataDirectoryCopyCheckBoxToggled)
+        QtCore.QObject.connect(self.endSlideRadioButton, QtCore.SIGNAL(u'clicked()'), self.onEndSlideButtonClicked)
+        QtCore.QObject.connect(self.wrapSlideRadioButton, QtCore.SIGNAL(u'clicked()'), self.onWrapSlideButtonClicked)
+        QtCore.QObject.connect(self.nextItemRadioButton, QtCore.SIGNAL(u'clicked()'), self.onnextItemButtonClicked)
 
     def retranslateUi(self):
         """
         Setup the interface translation strings.
         """
         self.tabTitleVisible = UiStrings().Advanced
-        self.ui_group_box.setTitle(translate('OpenLP.AdvancedTab', 'UI Settings'))
-        self.data_directory_group_box.setTitle(translate('OpenLP.AdvancedTab', 'Data Location'))
-        self.recent_label.setText(translate('OpenLP.AdvancedTab', 'Number of recent files to display:'))
-        self.media_plugin_check_box.setText(translate('OpenLP.AdvancedTab',
+        self.uiGroupBox.setTitle(translate('OpenLP.AdvancedTab', 'UI Settings'))
+        self.dataDirectoryGroupBox.setTitle(translate('OpenLP.AdvancedTab', 'Data Location'))
+        self.recentLabel.setText(translate('OpenLP.AdvancedTab', 'Number of recent files to display:'))
+        self.mediaPluginCheckBox.setText(translate('OpenLP.AdvancedTab',
             'Remember active media manager tab on startup'))
-        self.double_click_live_check_box.setText(translate('OpenLP.AdvancedTab',
+        self.doubleClickLiveCheckBox.setText(translate('OpenLP.AdvancedTab',
             'Double-click to send items straight to live'))
-        self.single_click_preview_check_box.setText(translate('OpenLP.AdvancedTab',
+        self.singleClickPreviewCheckBox.setText(translate('OpenLP.AdvancedTab',
             'Preview items when clicked in Media Manager'))
-        self.expand_service_item_check_box.setText(translate('OpenLP.AdvancedTab',
+        self.expandServiceItemCheckBox.setText(translate('OpenLP.AdvancedTab',
             'Expand new service items on creation'))
-        self.enable_auto_close_check_box.setText(translate('OpenLP.AdvancedTab',
+        self.enableAutoCloseCheckBox.setText(translate('OpenLP.AdvancedTab',
             'Enable application exit confirmation'))
-        self.service_name_group_box.setTitle(translate('OpenLP.AdvancedTab', 'Default Service Name'))
-        self.service_name_check_box.setText(translate('OpenLP.AdvancedTab', 'Enable default service name'))
-        self.service_name_time_label.setText(translate('OpenLP.AdvancedTab', 'Date and Time:'))
-        self.service_name_day.setItemText(0, translate('OpenLP.AdvancedTab', 'Monday'))
-        self.service_name_day.setItemText(1, translate('OpenLP.AdvancedTab', 'Tuesday'))
-        self.service_name_day.setItemText(2, translate('OpenLP.AdvancedTab', 'Wednesday'))
-        self.service_name_day.setItemText(3, translate('OpenLP.AdvancedTab', 'Thurdsday'))
-        self.service_name_day.setItemText(4, translate('OpenLP.AdvancedTab', 'Friday'))
-        self.service_name_day.setItemText(5, translate('OpenLP.AdvancedTab', 'Saturday'))
-        self.service_name_day.setItemText(6, translate('OpenLP.AdvancedTab', 'Sunday'))
-        self.service_name_day.setItemText(7, translate('OpenLP.AdvancedTab', 'Now'))
-        self.service_name_time.setToolTip(translate('OpenLP.AdvancedTab',
+        self.serviceNameGroupBox.setTitle(translate('OpenLP.AdvancedTab', 'Default Service Name'))
+        self.serviceNameCheckBox.setText(translate('OpenLP.AdvancedTab', 'Enable default service name'))
+        self.serviceNameTimeLabel.setText(translate('OpenLP.AdvancedTab', 'Date and Time:'))
+        self.serviceNameDay.setItemText(0, translate('OpenLP.AdvancedTab', 'Monday'))
+        self.serviceNameDay.setItemText(1, translate('OpenLP.AdvancedTab', 'Tuesday'))
+        self.serviceNameDay.setItemText(2, translate('OpenLP.AdvancedTab', 'Wednesday'))
+        self.serviceNameDay.setItemText(3, translate('OpenLP.AdvancedTab', 'Thurdsday'))
+        self.serviceNameDay.setItemText(4, translate('OpenLP.AdvancedTab', 'Friday'))
+        self.serviceNameDay.setItemText(5, translate('OpenLP.AdvancedTab', 'Saturday'))
+        self.serviceNameDay.setItemText(6, translate('OpenLP.AdvancedTab', 'Sunday'))
+        self.serviceNameDay.setItemText(7, translate('OpenLP.AdvancedTab', 'Now'))
+        self.serviceNameTime.setToolTip(translate('OpenLP.AdvancedTab',
             'Time when usual service starts.'))
-        self.service_name_label.setText(translate('OpenLP.AdvancedTab', 'Name:'))
-        self.service_name_edit.setToolTip(translate('OpenLP.AdvancedTab', 'Consult the OpenLP manual for usage.'))
-        self.service_name_revert_button.setToolTip(
-            translate('OpenLP.AdvancedTab', 'Revert to the default service name "%s".') %
-                UiStrings().DefaultServiceName)
-        self.service_name_example_label.setText(translate('OpenLP.AdvancedTab', 'Example:'))
-        self.hide_mouse_group_box.setTitle(translate('OpenLP.AdvancedTab', 'Mouse Cursor'))
-        self.hide_mouse_check_box.setText(translate('OpenLP.AdvancedTab', 'Hide mouse cursor when over display window'))
-        self.default_image_group_box.setTitle(translate('OpenLP.AdvancedTab', 'Default Image'))
-        self.default_color_label.setText(translate('OpenLP.AdvancedTab', 'Background color:'))
-        self.default_color_button.setToolTip(translate('OpenLP.AdvancedTab', 'Click to select a color.'))
-        self.default_file_label.setText(translate('OpenLP.AdvancedTab', 'Image file:'))
-        self.default_browse_button.setToolTip(translate('OpenLP.AdvancedTab', 'Browse for an image file to display.'))
-        self.default_revert_button.setToolTip(translate('OpenLP.AdvancedTab', 'Revert to the default OpenLP logo.'))
-        self.data_directory_current_label.setText(translate('OpenLP.AdvancedTab', 'Current path:'))
-        self.data_directory_new_label.setText(translate('OpenLP.AdvancedTab', 'Custom path:'))
-        self.data_directory_browse_button.setToolTip(translate('OpenLP.AdvancedTab',
-            'Browse for new data file location.'))
-        self.data_directory_default_button.setToolTip(
+        self.serviceNameLabel.setText(translate('OpenLP.AdvancedTab', 'Name:'))
+        self.serviceNameEdit.setToolTip(translate('OpenLP.AdvancedTab', 'Consult the OpenLP manual for usage.'))
+        self.serviceNameRevertButton.setToolTip(
+            translate('OpenLP.AdvancedTab', 'Revert to the default service name "%s".') % UiStrings().DefaultServiceName)
+        self.serviceNameExampleLabel.setText(translate('OpenLP.AdvancedTab', 'Example:'))
+        self.hideMouseGroupBox.setTitle(translate('OpenLP.AdvancedTab', 'Mouse Cursor'))
+        self.hideMouseCheckBox.setText(translate('OpenLP.AdvancedTab', 'Hide mouse cursor when over display window'))
+        self.defaultImageGroupBox.setTitle(translate('OpenLP.AdvancedTab', 'Default Image'))
+        self.defaultColorLabel.setText(translate('OpenLP.AdvancedTab', 'Background color:'))
+        self.defaultColorButton.setToolTip(translate('OpenLP.AdvancedTab', 'Click to select a color.'))
+        self.defaultFileLabel.setText(translate('OpenLP.AdvancedTab', 'Image file:'))
+        self.defaultBrowseButton.setToolTip(translate('OpenLP.AdvancedTab', 'Browse for an image file to display.'))
+        self.defaultRevertButton.setToolTip(translate('OpenLP.AdvancedTab', 'Revert to the default OpenLP logo.'))
+        self.dataDirectoryCurrentLabel.setText(translate('OpenLP.AdvancedTab', 'Current path:'))
+        self.dataDirectoryNewLabel.setText(translate('OpenLP.AdvancedTab', 'Custom path:'))
+        self.dataDirectoryBrowseButton.setToolTip(translate('OpenLP.AdvancedTab', 'Browse for new data file location.'))
+        self.dataDirectoryDefaultButton.setToolTip(
             translate('OpenLP.AdvancedTab', 'Set the data location to the default.'))
-        self.data_directory_cancel_button.setText(translate('OpenLP.AdvancedTab', 'Cancel'))
-        self.data_directory_cancel_button.setToolTip(
+        self.dataDirectoryCancelButton.setText(translate('OpenLP.AdvancedTab', 'Cancel'))
+        self.dataDirectoryCancelButton.setToolTip(
             translate('OpenLP.AdvancedTab', 'Cancel OpenLP data directory location change.'))
-        self.data_directory_copy_check_box.setText(translate('OpenLP.AdvancedTab', 'Copy data to new location.'))
-        self.data_directory_copy_check_box.setToolTip(translate(
+        self.dataDirectoryCopyCheckBox.setText(translate('OpenLP.AdvancedTab', 'Copy data to new location.'))
+        self.dataDirectoryCopyCheckBox.setToolTip(translate(
             'OpenLP.AdvancedTab', 'Copy the OpenLP data files to the new location.'))
-        self.new_data_directory_has_files_label.setText(
+        self.newDataDirectoryHasFilesLabel.setText(
             translate('OpenLP.AdvancedTab', '<strong>WARNING:</strong> New data directory location contains '
                 'OpenLP data files.  These files WILL be replaced during a copy.'))
-        self.display_workaround_group_box.setTitle(translate('OpenLP.AdvancedTab', 'Display Workarounds'))
-        self.x11_bypass_check_box.setText(translate('OpenLP.AdvancedTab','Bypass X11 Window Manager'))
-        self.alternate_rows_check_box.setText(translate('OpenLP.AdvancedTab', 'Use alternating row colours in lists'))
+        self.displayWorkaroundGroupBox.setTitle(translate('OpenLP.AdvancedTab', 'Display Workarounds'))
+        self.x11BypassCheckBox.setText(translate('OpenLP.AdvancedTab','Bypass X11 Window Manager'))
+        self.alternateRowsCheckBox.setText(translate('OpenLP.AdvancedTab', 'Use alternating row colours in lists'))
         # Slide Limits
-        self.slide_group_box.setTitle(translate('OpenLP.GeneralTab', 'Service Item Slide Limits'))
-        self.slide_label.setText(translate('OpenLP.GeneralTab', 'Behavior of next/previous on the last/first slide:'))
-        self.end_slide_radio_button.setText(translate('OpenLP.GeneralTab', '&Remain on Slide'))
-        self.wrap_slide_radio_button.setText(translate('OpenLP.GeneralTab', '&Wrap around'))
-        self.next_item_radio_button.setText(translate('OpenLP.GeneralTab', '&Move to next/previous service item'))
+        self.slideGroupBox.setTitle(translate('OpenLP.GeneralTab', 'Service Item Slide Limits'))
+        self.slideLabel.setText(translate('OpenLP.GeneralTab', 'Behavior of next/previous on the last/first slide:'))
+        self.endSlideRadioButton.setText(translate('OpenLP.GeneralTab', '&Remain on Slide'))
+        self.wrapSlideRadioButton.setText(translate('OpenLP.GeneralTab', '&Wrap around'))
+        self.nextItemRadioButton.setText(translate('OpenLP.GeneralTab', '&Move to next/previous service item'))
 
     def load(self):
         """
@@ -358,44 +348,44 @@
         # The max recent files value does not have an interface and so never
         # gets actually stored in the settings therefore the default value of
         # 20 will always be used.
-        self.recent_spin_box.setMaximum(settings.value(u'max recent files'))
-        self.recent_spin_box.setValue(settings.value(u'recent file count'))
-        self.media_plugin_check_box.setChecked(settings.value(u'save current plugin'))
-        self.double_click_live_check_box.setChecked(settings.value(u'double click live'))
-        self.single_click_preview_check_box.setChecked(settings.value(u'single click preview'))
-        self.expand_service_item_check_box.setChecked(settings.value(u'expand service item'))
-        self.enable_auto_close_check_box.setChecked(settings.value(u'enable exit confirmation'))
-        self.hide_mouse_check_box.setChecked(settings.value(u'hide mouse'))
-        self.service_name_day.setCurrentIndex(settings.value(u'default service day'))
-        self.service_name_time.setTime(QtCore.QTime(settings.value(u'default service hour'),
+        self.recentSpinBox.setMaximum(settings.value(u'max recent files'))
+        self.recentSpinBox.setValue(settings.value(u'recent file count'))
+        self.mediaPluginCheckBox.setChecked(settings.value(u'save current plugin'))
+        self.doubleClickLiveCheckBox.setChecked(settings.value(u'double click live'))
+        self.singleClickPreviewCheckBox.setChecked(settings.value(u'single click preview'))
+        self.expandServiceItemCheckBox.setChecked(settings.value(u'expand service item'))
+        self.enableAutoCloseCheckBox.setChecked(settings.value(u'enable exit confirmation'))
+        self.hideMouseCheckBox.setChecked(settings.value(u'hide mouse'))
+        self.serviceNameDay.setCurrentIndex(settings.value(u'default service day'))
+        self.serviceNameTime.setTime(QtCore.QTime(settings.value(u'default service hour'),
             settings.value(u'default service minute')))
-        self.should_update_service_name_example = True
-        self.service_name_edit.setText(settings.value(u'default service name'))
+        self.shouldUpdateServiceNameExample = True
+        self.serviceNameEdit.setText(settings.value(u'default service name'))
         default_service_enabled = settings.value(u'default service enabled')
-        self.service_name_check_box.setChecked(default_service_enabled)
-        self.service_name_check_box_toggled(default_service_enabled)
-        self.x11_bypass_check_box.setChecked(settings.value(u'x11 bypass wm'))
-        self.default_color = settings.value(u'default color')
-        self.default_file_edit.setText(settings.value(u'default image'))
+        self.serviceNameCheckBox.setChecked(default_service_enabled)
+        self.serviceNameCheckBoxToggled(default_service_enabled)
+        self.x11BypassCheckBox.setChecked(settings.value(u'x11 bypass wm'))
+        self.defaultColor = settings.value(u'default color')
+        self.defaultFileEdit.setText(settings.value(u'default image'))
         self.slide_limits = settings.value(u'slide limits')
-        # Prevent the dialog displayed by the alternate_rows_check_box to display.
-        self.alternate_rows_check_box.blockSignals(True)
-        self.alternate_rows_check_box.setChecked(settings.value(u'alternate rows'))
-        self.alternate_rows_check_box.blockSignals(False)
+        # Prevent the dialog displayed by the alternateRowsCheckBox to display.
+        self.alternateRowsCheckBox.blockSignals(True)
+        self.alternateRowsCheckBox.setChecked(settings.value(u'alternate rows'))
+        self.alternateRowsCheckBox.blockSignals(False)
         if self.slide_limits == SlideLimits.End:
-            self.end_slide_radio_button.setChecked(True)
+            self.endSlideRadioButton.setChecked(True)
         elif self.slide_limits == SlideLimits.Wrap:
-            self.wrap_slide_radio_button.setChecked(True)
+            self.wrapSlideRadioButton.setChecked(True)
         else:
-            self.next_item_radio_button.setChecked(True)
+            self.nextItemRadioButton.setChecked(True)
         settings.endGroup()
-        self.data_directory_copy_check_box.hide()
-        self.new_data_directory_has_files_label.hide()
-        self.data_directory_cancel_button.hide()
+        self.dataDirectoryCopyCheckBox.hide()
+        self.newDataDirectoryHasFilesLabel.hide()
+        self.dataDirectoryCancelButton.hide()
         # Since data location can be changed, make sure the path is present.
-        self.current_data_path = AppLocation.get_data_path()
-        if not os.path.exists(self.current_data_path):
-            log.error(u'Data path not found %s' % self.current_data_path)
+        self.currentDataPath = AppLocation.get_data_path()
+        if not os.path.exists(self.currentDataPath):
+            log.error(u'Data path not found %s' % self.currentDataPath)
             answer = QtGui.QMessageBox.critical(self,
                 translate('OpenLP.AdvancedTab',
                 'Data Directory Error'),
@@ -407,8 +397,10 @@
                 'Click "No" to stop loading OpenLP. allowing you to fix '
                 'the the problem.\n\n'
                 'Click "Yes" to reset the data directory to the default '
-                'location.').replace('%s', self.current_data_path),
-                QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No),
+                'location.').replace('%s', self.currentDataPath),
+                QtGui.QMessageBox.StandardButtons(
+                QtGui.QMessageBox.Yes |
+                QtGui.QMessageBox.No),
                 QtGui.QMessageBox.No)
             if answer == QtGui.QMessageBox.No:
                 log.info(u'User requested termination')
@@ -416,13 +408,13 @@
                 sys.exit()
             # Set data location to default.
             settings.remove(u'advanced/data path')
-            self.current_data_path = AppLocation.get_data_path()
-            log.warning(u'User requested data path set to default %s' % self.current_data_path)
-        self.data_directory_label.setText(os.path.abspath(self.current_data_path))
-        self.default_color_button.setStyleSheet(u'background-color: %s' % self.default_color)
+            self.currentDataPath = AppLocation.get_data_path()
+            log.warning(u'User requested data path set to default %s' % self.currentDataPath)
+        self.dataDirectoryLabel.setText(os.path.abspath(self.currentDataPath))
+        self.defaultColorButton.setStyleSheet(u'background-color: %s' % self.defaultColor)
         # Don't allow data directory move if running portable.
         if settings.value(u'advanced/is portable'):
-            self.data_directory_group_box.hide()
+            self.dataDirectoryGroupBox.hide()
 
     def save(self):
         """
@@ -430,134 +422,110 @@
         """
         settings = Settings()
         settings.beginGroup(self.settingsSection)
-        settings.setValue(u'default service enabled', self.service_name_check_box.isChecked())
-        service_name = self.service_name_edit.text()
-        preset_is_valid = self.generate_service_name_example()[0]
+        settings.setValue(u'default service enabled', self.serviceNameCheckBox.isChecked())
+        service_name = self.serviceNameEdit.text()
+        preset_is_valid = self.generateServiceNameExample()[0]
         if service_name == UiStrings().DefaultServiceName or not preset_is_valid:
             settings.remove(u'default service name')
-            self.service_name_edit.setText(service_name)
+            self.serviceNameEdit.setText(service_name)
         else:
             settings.setValue(u'default service name', service_name)
-        settings.setValue(u'default service day', self.service_name_day.currentIndex())
-        settings.setValue(u'default service hour', self.service_name_time.time().hour())
-        settings.setValue(u'default service minute', self.service_name_time.time().minute())
-        settings.setValue(u'recent file count', self.recent_spin_box.value())
-        settings.setValue(u'save current plugin', self.media_plugin_check_box.isChecked())
-        settings.setValue(u'double click live', self.double_click_live_check_box.isChecked())
-        settings.setValue(u'single click preview', self.single_click_preview_check_box.isChecked())
-        settings.setValue(u'expand service item', self.expand_service_item_check_box.isChecked())
-        settings.setValue(u'enable exit confirmation', self.enable_auto_close_check_box.isChecked())
-        settings.setValue(u'hide mouse', self.hide_mouse_check_box.isChecked())
-        settings.setValue(u'x11 bypass wm', self.x11_bypass_check_box.isChecked())
-        settings.setValue(u'alternate rows', self.alternate_rows_check_box.isChecked())        
-        settings.setValue(u'default color', self.default_color)
-        settings.setValue(u'default image', self.default_file_edit.text())
+        settings.setValue(u'default service day', self.serviceNameDay.currentIndex())
+        settings.setValue(u'default service hour', self.serviceNameTime.time().hour())
+        settings.setValue(u'default service minute', self.serviceNameTime.time().minute())
+        settings.setValue(u'recent file count', self.recentSpinBox.value())
+        settings.setValue(u'save current plugin', self.mediaPluginCheckBox.isChecked())
+        settings.setValue(u'double click live', self.doubleClickLiveCheckBox.isChecked())
+        settings.setValue(u'single click preview', self.singleClickPreviewCheckBox.isChecked())
+        settings.setValue(u'expand service item', self.expandServiceItemCheckBox.isChecked())
+        settings.setValue(u'enable exit confirmation', self.enableAutoCloseCheckBox.isChecked())
+        settings.setValue(u'hide mouse', self.hideMouseCheckBox.isChecked())
+        settings.setValue(u'x11 bypass wm', self.x11BypassCheckBox.isChecked())
+        settings.setValue(u'alternate rows', self.alternateRowsCheckBox.isChecked())
+        settings.setValue(u'default color', self.defaultColor)
+        settings.setValue(u'default image', self.defaultFileEdit.text())
         settings.setValue(u'slide limits', self.slide_limits)
         settings.endGroup()
-        if self.display_changed:
+        if self.displayChanged:
             Receiver.send_message(u'config_screen_changed')
-            self.display_changed = False
+            self.displayChanged = False
         Receiver.send_message(u'slidecontroller_update_slide_limits')
 
     def cancel(self):
-        """
-        Dialogue was cancelled, remove any pending data path change.
-        """
-        self.on_data_directory_cancel_button_clicked()
+        # Dialogue was cancelled, remove any pending data path change.
+        self.onDataDirectoryCancelButtonClicked()
         SettingsTab.cancel(self)
 
-    def service_name_check_box_toggled(self, default_service_enabled):
-        """
-        Service Name options changed
-        """
-        self.service_name_day.setEnabled(default_service_enabled)
-        time_enabled = default_service_enabled and self.service_name_day.currentIndex() is not 7
-        self.service_name_time.setEnabled(time_enabled)
-        self.service_name_edit.setEnabled(default_service_enabled)
-        self.service_name_revert_button.setEnabled(default_service_enabled)
+    def serviceNameCheckBoxToggled(self, default_service_enabled):
+        self.serviceNameDay.setEnabled(default_service_enabled)
+        time_enabled = default_service_enabled and self.serviceNameDay.currentIndex() is not 7
+        self.serviceNameTime.setEnabled(time_enabled)
+        self.serviceNameEdit.setEnabled(default_service_enabled)
+        self.serviceNameRevertButton.setEnabled(default_service_enabled)
 
-    def generate_service_name_example(self):
-        """
-        Display an example of the template used
-        """
+    def generateServiceNameExample(self):
         preset_is_valid = True
-        if self.service_name_day.currentIndex() == 7:
+        if self.serviceNameDay.currentIndex() == 7:
             local_time = datetime.now()
         else:
             now = datetime.now()
-            day_delta = self.service_name_day.currentIndex() - now.weekday()
+            day_delta = self.serviceNameDay.currentIndex() - now.weekday()
             if day_delta < 0:
                 day_delta += 7
             time = now + timedelta(days=day_delta)
-            local_time = time.replace(
-                hour=self.service_name_time.time().hour(),
-                minute=self.service_name_time.time().minute()
-            )
+            local_time = time.replace(hour = self.serviceNameTime.time().hour(),
+                minute = self.serviceNameTime.time().minute())
         try:
-            service_name_example = format_time(unicode(self.service_name_edit.text()), local_time)
+            service_name_example = format_time(unicode(self.serviceNameEdit.text()), local_time)
         except ValueError:
             preset_is_valid = False
             service_name_example = translate('OpenLP.AdvancedTab', 'Syntax error.')
         return preset_is_valid, service_name_example
 
-    def update_service_name_example(self, returned_value):
-        """
-        Update the example service name.
-        """
-        if not self.should_update_service_name_example:
+    def updateServiceNameExample(self, returned_value):
+        if not self.shouldUpdateServiceNameExample:
             return
-        name_example = self.generate_service_name_example()[1]
-        self.service_name_example.setText(name_example)
-
-    def on_service_name_day_changed(self, service_day):
-        """
-        React to the day of the service name changing.
-        """
-        self.service_name_time.setEnabled(service_day is not 7)
-        self.update_service_name_example(None)
-
-    def on_service_name_revert_button_clicked(self):
-        """
-        Revert to the default service name.
-        """
-        self.service_name_edit.setText(UiStrings().DefaultServiceName)
-        self.service_name_edit.setFocus()
-
-    def on_default_color_button_clicked(self):
-        """
-        Select the background colour of the default display screen.
-        """
+        name_example = self.generateServiceNameExample()[1]
+        self.serviceNameExample.setText(name_example)
+
+    def onServiceNameDayChanged(self, service_day):
+        self.serviceNameTime.setEnabled(service_day is not 7)
+        self.updateServiceNameExample(None)
+
+    def onServiceNameRevertButtonClicked(self):
+        self.serviceNameEdit.setText(UiStrings().DefaultServiceName)
+        self.serviceNameEdit.setFocus()
+
+    def onDefaultColorButtonClicked(self):
         new_color = QtGui.QColorDialog.getColor(
-            QtGui.QColor(self.default_color), self)
+            QtGui.QColor(self.defaultColor), self)
         if new_color.isValid():
-            self.default_color = new_color.name()
-            self.default_color_button.setStyleSheet(u'background-color: %s' % self.default_color)
+            self.defaultColor = new_color.name()
+            self.defaultColorButton.setStyleSheet(u'background-color: %s' % self.defaultColor)
 
-    def on_default_browse_button_clicked(self):
-        """
-        Select an image for the default display screen.
-        """
-        file_filters = u'%s;;%s (*.*) (*)' % (get_images_filter(), UiStrings().AllFiles)
+    def onDefaultBrowseButtonClicked(self):
+        file_filters = u'%s;;%s (*.*) (*)' % (get_images_filter(),
+            UiStrings().AllFiles)
         filename = QtGui.QFileDialog.getOpenFileName(self,
             translate('OpenLP.AdvancedTab', 'Open File'), '', file_filters)
         if filename:
-            self.default_file_edit.setText(filename)
-        self.default_file_edit.setFocus()
+            self.defaultFileEdit.setText(filename)
+        self.defaultFileEdit.setFocus()
 
-    def on_data_directory_browse_button_clicked(self):
+    def onDataDirectoryBrowseButtonClicked(self):
         """
         Browse for a new data directory location.
         """
-        old_root_path = unicode(self.data_directory_label.text())
+        old_root_path = unicode(self.dataDirectoryLabel.text())
         # Get the new directory location.
-        new_data_path = QtGui.QFileDialog.getExistingDirectory(
-            self, translate('OpenLP.AdvancedTab', 'Select Data Directory Location'), old_root_path,
-            options=QtGui.QFileDialog.ShowDirsOnly)
+        new_data_path = QtGui.QFileDialog.getExistingDirectory(self,
+            translate('OpenLP.AdvancedTab', 'Select Data Directory Location'), old_root_path,
+            options = QtGui.QFileDialog.ShowDirsOnly)
         # Set the new data path.
         if new_data_path:
             new_data_path = os.path.normpath(new_data_path)
-            if self.current_data_path.lower() == new_data_path.lower():
-                self.on_data_directory_cancel_button_clicked()
+            if self.currentDataPath.lower() == new_data_path.lower():
+                self.onDataDirectoryCancelButtonClicked()
                 return
         else:
             return
@@ -571,18 +539,18 @@
         if answer != QtGui.QMessageBox.Yes:
             return
         # Check if data already exists here.
-        self.check_data_overwrite(new_data_path)
+        self.checkDataOverwrite(new_data_path)
         # Save the new location.
         Receiver.send_message(u'set_new_data_path', new_data_path)
-        self.new_data_directory_edit.setText(new_data_path)
-        self.data_directory_cancel_button.show()
+        self.newDataDirectoryEdit.setText(new_data_path)
+        self.dataDirectoryCancelButton.show()
 
-    def on_data_directory_default_button_clicked(self):
+    def onDataDirectoryDefaultButtonClicked(self):
         """
         Re-set the data directory location to the 'default' location.
         """
         new_data_path = AppLocation.get_directory(AppLocation.DataDir)
-        if self.current_data_path.lower() != new_data_path.lower():
+        if self.currentDataPath.lower() != new_data_path.lower():
             # Make sure they want to change the data location back to the
             # default.
             answer = QtGui.QMessageBox.question(self,
@@ -592,35 +560,29 @@
                 QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No), QtGui.QMessageBox.No)
             if answer != QtGui.QMessageBox.Yes:
                 return
-            self.check_data_overwrite(new_data_path)
+            self.checkDataOverwrite(new_data_path)
             # Save the new location.
             Receiver.send_message(u'set_new_data_path', new_data_path)
-            self.new_data_directory_edit.setText(os.path.abspath(new_data_path))
-            self.data_directory_cancel_button.show()
+            self.newDataDirectoryEdit.setText(os.path.abspath(new_data_path))
+            self.dataDirectoryCancelButton.show()
         else:
             # We cancel the change in case user changed their mind.
-            self.on_data_directory_cancel_button_clicked()
+            self.onDataDirectoryCancelButtonClicked()
 
-    def on_data_directory_copy_check_box_toggled(self):
-        """
-        Copy existing data when you change your data directory.
-        """
+    def onDataDirectoryCopyCheckBoxToggled(self):
         Receiver.send_message(u'set_copy_data',
-            self.data_directory_copy_check_box.isChecked())
-        if self.data_exists:
-            if self.data_directory_copy_check_box.isChecked():
-                self.new_data_directory_has_files_label.show()
+            self.dataDirectoryCopyCheckBox.isChecked())
+        if self.dataExists:
+            if self.dataDirectoryCopyCheckBox.isChecked():
+                self.newDataDirectoryHasFilesLabel.show()
             else:
-                self.new_data_directory_has_files_label.hide()
+                self.newDataDirectoryHasFilesLabel.hide()
 
-    def check_data_overwrite(self, data_path ):
-        """
-        Check if there's already data in the target directory.
-        """
+    def checkDataOverwrite(self, data_path ):
         test_path = os.path.join(data_path, u'songs')
-        self.data_directory_copy_check_box.show()
+        self.dataDirectoryCopyCheckBox.show()
         if os.path.exists(test_path):
-            self.data_exists = True
+            self.dataExists = True
             # Check is they want to replace existing data.
             answer = QtGui.QMessageBox.warning(self,
                 translate('OpenLP.AdvancedTab', 'Overwrite Existing Data'),
@@ -629,45 +591,42 @@
                 ).replace('%s', os.path.abspath(data_path,)),
                 QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No), QtGui.QMessageBox.No)
             if answer == QtGui.QMessageBox.Yes:
-                self.data_directory_copy_check_box.setChecked(True)
-                self.new_data_directory_has_files_label.show()
+                self.dataDirectoryCopyCheckBox.setChecked(True)
+                self.newDataDirectoryHasFilesLabel.show()
             else:
-                self.data_directory_copy_check_box.setChecked(False)
-                self.new_data_directory_has_files_label.hide()
+                self.dataDirectoryCopyCheckBox.setChecked(False)
+                self.newDataDirectoryHasFilesLabel.hide()
         else:
-            self.data_exists = False
-            self.data_directory_copy_check_box.setChecked(True)
-            self.new_data_directory_has_files_label.hide()
+            self.dataExists = False
+            self.dataDirectoryCopyCheckBox.setChecked(True)
+            self.newDataDirectoryHasFilesLabel.hide()
 
-    def on_data_directory_cancel_button_clicked(self):
+    def onDataDirectoryCancelButtonClicked(self):
         """
         Cancel the data directory location change
         """
-        self.new_data_directory_edit.clear()
-        self.data_directory_copy_check_box.setChecked(False)
+        self.newDataDirectoryEdit.clear()
+        self.dataDirectoryCopyCheckBox.setChecked(False)
         Receiver.send_message(u'set_new_data_path', u'')
         Receiver.send_message(u'set_copy_data', False)
-        self.data_directory_copy_check_box.hide()
-        self.data_directory_cancel_button.hide()
-        self.new_data_directory_has_files_label.hide()
-
-    def on_default_revert_button_clicked(self):
-        """
-        Revert the default screen back to the default settings.
-        """
-        self.default_file_edit.setText(u':/graphics/openlp-splash-screen.png')
-        self.default_file_edit.setFocus()
-
-    def on_X11_bypass_check_box_toggled(self, checked):
+        self.dataDirectoryCopyCheckBox.hide()
+        self.dataDirectoryCancelButton.hide()
+        self.newDataDirectoryHasFilesLabel.hide()
+
+    def onDefaultRevertButtonClicked(self):
+        self.defaultFileEdit.setText(u':/graphics/openlp-splash-screen.png')
+        self.defaultFileEdit.setFocus()
+
+    def onX11BypassCheckBoxToggled(self, checked):
         """
         Toggle X11 bypass flag on maindisplay depending on check box state.
 
         ``checked``
             The state of the check box (boolean).
         """
-        self.display_changed = True
+        self.displayChanged = True
         
-    def on_alternate_rows_check_box_toggled(self, checked):
+    def onAlternateRowsCheckBoxToggled(self, checked):
         """
         Notify user about required restart.
 
@@ -678,20 +637,11 @@
             translate('OpenLP.AdvancedTab', 'Restart Required'),
             translate('OpenLP.AdvancedTab', 'This change will only take effect once OpenLP has been restarted.'))
 
-    def on_end_slide_button_clicked(self):
-        """
-        Stop at the end either top ot bottom
-        """        
+    def onEndSlideButtonClicked(self):
         self.slide_limits = SlideLimits.End
 
-    def on_wrap_slide_button_clicked(self):
-        """
-        Wrap round the service item 
-        """        
+    def onWrapSlideButtonClicked(self):
         self.slide_limits = SlideLimits.Wrap
 
-    def on_next_item_button_clicked(self):
-        """
-        Advance to the next service item
-        """        
+    def onnextItemButtonClicked(self):
         self.slide_limits = SlideLimits.Next

=== modified file 'openlp/core/ui/exceptiondialog.py'
--- openlp/core/ui/exceptiondialog.py	2013-02-01 19:58:18 +0000
+++ openlp/core/ui/exceptiondialog.py	2013-02-04 21:03:31 +0000
@@ -26,24 +26,14 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The GUI widgets of the exception dialog.
-"""
 
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import translate
 from openlp.core.lib.ui import create_button, create_button_box
 
-
 class Ui_ExceptionDialog(object):
-    """
-    The GUI widgets of the exception dialog.
-    """
     def setupUi(self, exceptionDialog):
-        """
-        Set up the UI.
-        """
         exceptionDialog.setObjectName(u'exceptionDialog')
         self.exceptionLayout = QtGui.QVBoxLayout(exceptionDialog)
         self.exceptionLayout.setObjectName(u'exceptionLayout')
@@ -76,7 +66,7 @@
         self.exceptionLayout.addWidget(self.exceptionTextEdit)
         self.sendReportButton = create_button(exceptionDialog, u'sendReportButton',
             icon=u':/general/general_email.png', click=self.onSendReportButtonClicked)
-        self.saveReportButton = create_button(exceptionDialog, u'saveReportButton',
+        self.saveReportButton = create_button(exceptionDialog,u'saveReportButton',
             icon=u':/general/general_save.png', click=self.onSaveReportButtonClicked)
         self.attachFileButton = create_button(exceptionDialog, u'attachFileButton',
             icon=u':/general/general_open.png', click=self.onAttachFileButtonClicked)
@@ -89,9 +79,6 @@
             QtCore.SIGNAL(u'textChanged()'), self.onDescriptionUpdated)
 
     def retranslateUi(self, exceptionDialog):
-        """
-        Translate the widgets on the fly.
-        """
         exceptionDialog.setWindowTitle(translate('OpenLP.ExceptionDialog', 'Error Occurred'))
         self.descriptionExplanation.setText(translate('OpenLP.ExceptionDialog',
             'Please enter a description of what you were doing to cause this '

=== modified file 'openlp/core/ui/exceptionform.py'
--- openlp/core/ui/exceptionform.py	2013-02-01 19:58:18 +0000
+++ openlp/core/ui/exceptionform.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,6 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The actual exception dialog form.
-"""
 import logging
 import re
 import os
@@ -95,32 +92,22 @@
 
 log = logging.getLogger(__name__)
 
-
 class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog):
     """
     The exception dialog
     """
     def __init__(self, parent):
-        """
-        Constructor.
-        """
         QtGui.QDialog.__init__(self, parent)
         self.setupUi(self)
         self.settingsSection = u'crashreport'
 
     def exec_(self):
-        """
-        Show the dialog.
-        """
         self.descriptionTextEdit.setPlainText(u'')
         self.onDescriptionUpdated()
         self.fileAttachment = None
         return QtGui.QDialog.exec_(self)
 
     def _createReport(self):
-        """
-        Create an exception report.
-        """
         openlp_version = get_application_version()
         description = self.descriptionTextEdit.toPlainText()
         traceback = self.exceptionTextEdit.toPlainText()
@@ -212,9 +199,6 @@
         QtGui.QDesktopServices.openUrl(mailto_url)
 
     def onDescriptionUpdated(self):
-        """
-        Update the minimum number of characters needed in the description.
-        """
         count = int(20 - len(self.descriptionTextEdit.toPlainText()))
         if count < 0:
             count = 0
@@ -225,9 +209,6 @@
             translate('OpenLP.ExceptionDialog', 'Description characters to enter : %s') % count)
 
     def onAttachFileButtonClicked(self):
-        """
-        Attache files to the bug report e-mail.
-        """
         files = QtGui.QFileDialog.getOpenFileName(
             self, translate('ImagePlugin.ExceptionDialog', 'Select Attachment'),
                 Settings().value(self.settingsSection + u'/last directory'), u'%s (*.*) (*)' % UiStrings().AllFiles)
@@ -236,8 +217,6 @@
             self.fileAttachment = unicode(files)
 
     def __buttonState(self, state):
-        """
-        Toggle the button state.
-        """
         self.saveReportButton.setEnabled(state)
         self.sendReportButton.setEnabled(state)
+

=== modified file 'openlp/core/ui/filerenamedialog.py'
--- openlp/core/ui/filerenamedialog.py	2013-02-01 19:58:18 +0000
+++ openlp/core/ui/filerenamedialog.py	2013-02-04 21:03:31 +0000
@@ -26,23 +26,14 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The UI widgets for the rename dialog
-"""
+
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import translate
 from openlp.core.lib.ui import create_button_box
 
-
 class Ui_FileRenameDialog(object):
-    """
-    The UI widgets for the rename dialog
-    """
     def setupUi(self, fileRenameDialog):
-        """
-        Set up the UI
-        """
         fileRenameDialog.setObjectName(u'fileRenameDialog')
         fileRenameDialog.resize(300, 10)
         self.dialogLayout = QtGui.QGridLayout(fileRenameDialog)
@@ -60,7 +51,4 @@
         self.setMaximumHeight(self.sizeHint().height())
 
     def retranslateUi(self, fileRenameDialog):
-        """
-        Translate the UI on the fly.
-        """
         self.fileNameLabel.setText(translate('OpenLP.FileRenameForm', 'New File Name:'))

=== modified file 'openlp/core/ui/filerenameform.py'
--- openlp/core/ui/filerenameform.py	2013-02-01 20:36:27 +0000
+++ openlp/core/ui/filerenameform.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,6 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The file rename dialog.
-"""
 
 from PyQt4 import QtGui
 
@@ -36,15 +33,11 @@
 
 from openlp.core.lib import translate
 
-
 class FileRenameForm(QtGui.QDialog, Ui_FileRenameDialog):
     """
-    The file rename dialog
+    The exception dialog
     """
     def __init__(self, parent):
-        """
-        Constructor
-        """
         QtGui.QDialog.__init__(self, parent)
         self.setupUi(self)
 

=== modified file 'openlp/core/ui/firsttimeform.py'
--- openlp/core/ui/firsttimeform.py	2013-02-03 19:23:12 +0000
+++ openlp/core/ui/firsttimeform.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-This module contains the first time wizard.
-"""
+
 import io
 import logging
 import os
@@ -41,21 +39,20 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import translate, PluginStatus, Receiver, build_icon, check_directory_exists, Settings, Registry
+from openlp.core.lib import translate, PluginStatus, Receiver, build_icon, check_directory_exists, Settings
 from openlp.core.utils import get_web_page, AppLocation, get_filesystem_encoding
 from firsttimewizard import Ui_FirstTimeWizard, FirstTimePage
 
 log = logging.getLogger(__name__)
 
-
 class ThemeScreenshotThread(QtCore.QThread):
     """
     This thread downloads the theme screenshots.
     """
+    def __init__(self, parent):
+        QtCore.QThread.__init__(self, parent)
+
     def run(self):
-        """
-        Overridden method to run the thread.
-        """
         themes = self.parent().config.get(u'themes', u'files')
         themes = themes.split(u',')
         config = self.parent().config
@@ -82,10 +79,7 @@
     log.info(u'ThemeWizardForm loaded')
 
     def __init__(self, screens, parent=None):
-        """
-        Create and set up the first time wizard.
-        """
-        super(FirstTimeForm, self).__init__(parent)
+        QtGui.QWizard.__init__(self, parent)
         self.setupUi(self)
         self.screens = screens
         # check to see if we have web access
@@ -96,7 +90,7 @@
             files = self.webAccess.read()
             self.config.readfp(io.BytesIO(files))
         self.updateScreenListCombo()
-        self.was_download_cancelled = False
+        self.downloadCancelled = False
         self.downloading = translate('OpenLP.FirstTimeWizard', 'Downloading %s...')
         QtCore.QObject.connect(self.cancelButton, QtCore.SIGNAL('clicked()'),
             self.onCancelButtonClicked)
@@ -152,13 +146,13 @@
             # Download the theme screenshots.
             self.themeScreenshotThread = ThemeScreenshotThread(self)
             self.themeScreenshotThread.start()
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
 
     def nextId(self):
         """
         Determine the next page in the Wizard to go to.
         """
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
         if self.currentId() == FirstTimePage.Plugins:
             if not self.webAccess:
                 return FirstTimePage.NoInternet
@@ -169,13 +163,14 @@
         elif self.currentId() == FirstTimePage.NoInternet:
             return FirstTimePage.Progress
         elif self.currentId() == FirstTimePage.Themes:
-            self.application.set_busy_cursor()
+            Receiver.send_message(u'cursor_busy')
+            Receiver.send_message(u'openlp_process_events')
             while not self.themeScreenshotThread.isFinished():
                 time.sleep(0.1)
-                self.application.process_events()
+                Receiver.send_message(u'openlp_process_events')
             # Build the screenshot icons, as this can not be done in the thread.
             self._buildThemeScreenshots()
-            self.application.set_normal_cursor()
+            Receiver.send_message(u'cursor_normal')
             return FirstTimePage.Defaults
         else:
             return self.currentId() + 1
@@ -186,7 +181,7 @@
         """
         # Keep track of the page we are at.  Triggering "Cancel" causes pageId
         # to be a -1.
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
         if pageId != -1:
             self.lastId = pageId
         if pageId == FirstTimePage.Plugins:
@@ -203,7 +198,7 @@
                     self.themeComboBox.addItem(item.text())
             if self.hasRunWizard:
                 # Add any existing themes to list.
-                for theme in self.theme_manager.get_themes():
+                for theme in self.parent().themeManagerContents.getThemes():
                     index = self.themeComboBox.findText(theme)
                     if index == -1:
                         self.themeComboBox.addItem(theme)
@@ -218,15 +213,16 @@
             if self.hasRunWizard:
                 self.cancelButton.setVisible(False)
         elif pageId == FirstTimePage.Progress:
-            self.application.set_busy_cursor()
+            Receiver.send_message(u'cursor_busy')
             self.repaint()
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
             # Try to give the wizard a chance to redraw itself
             time.sleep(0.2)
             self._preWizard()
             self._performWizard()
             self._postWizard()
-            self.application.set_normal_cursor()
+            Receiver.send_message(u'cursor_normal')
+            Receiver.send_message(u'openlp_process_events')
 
     def updateScreenListCombo(self):
         """
@@ -245,18 +241,19 @@
                 (self.lastId <= FirstTimePage.Plugins and not self.hasRunWizard):
             QtCore.QCoreApplication.exit()
             sys.exit()
-        self.was_download_cancelled = True
+        self.downloadCancelled = True
         while self.themeScreenshotThread.isRunning():
             time.sleep(0.1)
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
 
     def onNoInternetFinishButtonClicked(self):
         """
         Process the triggering of the "Finish" button on the No Internet page.
         """
-        self.application.set_busy_cursor()
+        Receiver.send_message(u'cursor_busy')
         self._performWizard()
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
+        Receiver.send_message(u'openlp_process_events')
         Settings().setValue(u'general/has run wizard', True)
         self.close()
 
@@ -270,7 +267,7 @@
         urlfile = urllib2.urlopen(url)
         filename = open(fpath, "wb")
         # Download until finished or canceled.
-        while not self.was_download_cancelled:
+        while not self.downloadCancelled:
             data = urlfile.read(block_size)
             if not data:
                 break
@@ -279,7 +276,7 @@
             self._downloadProgress(block_count, block_size)
         filename.close()
         # Delete file if cancelled, it may be a partial file.
-        if self.was_download_cancelled:
+        if self.downloadCancelled:
             os.remove(fpath)
 
     def _buildThemeScreenshots(self):
@@ -300,20 +297,11 @@
                 screenshot)))
 
     def _getFileSize(self, url):
-        """
-        Get the size of a file.
-
-        ``url``
-            The URL of the file we want to download.
-        """
         site = urllib.urlopen(url)
         meta = site.info()
         return int(meta.getheaders("Content-Length")[0])
 
     def _downloadProgress(self, count, block_size):
-        """
-        Calculate and display the download progress.
-        """
         increment = (count * block_size) - self.previous_size
         self._incrementProgressBar(None, increment)
         self.previous_size = count * block_size
@@ -332,7 +320,7 @@
             self.progressLabel.setText(status_text)
         if increment > 0:
             self.progressBar.setValue(self.progressBar.value() + increment)
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
 
     def _preWizard(self):
         """
@@ -340,10 +328,10 @@
         """
         self.max_progress = 0
         self.finishButton.setVisible(False)
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
         # Loop through the songs list and increase for each selected item
         for i in xrange(self.songsListWidget.count()):
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
             item = self.songsListWidget.item(i)
             if item.checkState() == QtCore.Qt.Checked:
                 filename = item.data(QtCore.Qt.UserRole)
@@ -352,7 +340,7 @@
         # Loop through the Bibles list and increase for each selected item
         iterator = QtGui.QTreeWidgetItemIterator(self.biblesTreeWidget)
         while iterator.value():
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
             item = iterator.value()
             if item.parent() and item.checkState(0) == QtCore.Qt.Checked:
                 filename = item.data(0, QtCore.Qt.UserRole)
@@ -361,7 +349,7 @@
             iterator += 1
         # Loop through the themes list and increase for each selected item
         for i in xrange(self.themesListWidget.count()):
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
             item = self.themesListWidget.item(i)
             if item.checkState() == QtCore.Qt.Checked:
                 filename = item.data(QtCore.Qt.UserRole)
@@ -381,7 +369,7 @@
             self.progressPage.setTitle(translate('OpenLP.FirstTimeWizard', 'Setting Up'))
             self.progressPage.setSubTitle(u'Setup complete.')
         self.repaint()
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
         # Try to give the wizard a chance to repaint itself
         time.sleep(0.1)
 
@@ -408,7 +396,7 @@
         self.finishButton.setEnabled(True)
         self.cancelButton.setVisible(False)
         self.nextButton.setVisible(False)
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
 
     def _performWizard(self):
         """
@@ -471,28 +459,5 @@
             Settings().setValue(u'themes/global theme', self.themeComboBox.currentText())
 
     def _setPluginStatus(self, field, tag):
-        """
-        Set the status of a plugin.
-        """
         status = PluginStatus.Active if field.checkState() == QtCore.Qt.Checked else PluginStatus.Inactive
         Settings().setValue(tag, status)
-
-    def _get_theme_manager(self):
-        """
-        Adds the theme manager to the class dynamically
-        """
-        if not hasattr(self, u'_theme_manager'):
-            self._theme_manager = Registry().get(u'theme_manager')
-        return self._theme_manager
-
-    theme_manager = property(_get_theme_manager)
-
-    def _get_application(self):
-        """
-        Adds the openlp to the class dynamically
-        """
-        if not hasattr(self, u'_application'):
-            self._application = Registry().get(u'application')
-        return self._application
-
-    application = property(_get_application)

=== modified file 'openlp/core/ui/firsttimelanguagedialog.py'
--- openlp/core/ui/firsttimelanguagedialog.py	2013-02-01 20:36:27 +0000
+++ openlp/core/ui/firsttimelanguagedialog.py	2013-02-04 21:03:31 +0000
@@ -26,23 +26,14 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The UI widgets of the language selection dialog.
-"""
+
 from PyQt4 import QtGui
 
 from openlp.core.lib import translate
 from openlp.core.lib.ui import create_button_box
 
-
 class Ui_FirstTimeLanguageDialog(object):
-    """
-    The UI widgets of the language selection dialog.
-    """
     def setupUi(self, languageDialog):
-        """
-        Set up the UI.
-        """
         languageDialog.setObjectName(u'languageDialog')
         languageDialog.resize(300, 50)
         self.dialogLayout = QtGui.QVBoxLayout(languageDialog)
@@ -68,9 +59,6 @@
         self.setMaximumHeight(self.sizeHint().height())
 
     def retranslateUi(self, languageDialog):
-        """
-        Translate the UI on the fly.
-        """
         self.setWindowTitle(translate('OpenLP.FirstTimeLanguageForm', 'Select Translation'))
         self.infoLabel.setText(
             translate('OpenLP.FirstTimeLanguageForm', 'Choose the translation you\'d like to use in OpenLP.'))

=== modified file 'openlp/core/ui/firsttimelanguageform.py'
--- openlp/core/ui/firsttimelanguageform.py	2013-02-01 20:36:27 +0000
+++ openlp/core/ui/firsttimelanguageform.py	2013-02-04 21:03:31 +0000
@@ -26,24 +26,18 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The language selection dialog.
-"""
+
 from PyQt4 import QtGui
 
 from openlp.core.lib.ui import create_action
 from openlp.core.utils import LanguageManager
 from firsttimelanguagedialog import Ui_FirstTimeLanguageDialog
 
-
 class FirstTimeLanguageForm(QtGui.QDialog, Ui_FirstTimeLanguageDialog):
     """
-    The language selection dialog.
+    The exception dialog
     """
     def __init__(self, parent=None):
-        """
-        Constructor
-        """
         QtGui.QDialog.__init__(self, parent)
         self.setupUi(self)
         self.qmList = LanguageManager.get_qm_list()
@@ -58,9 +52,6 @@
         return QtGui.QDialog.exec_(self)
 
     def accept(self):
-        """
-        Run when the dialog is OKed.
-        """
         # It's the first row so must be Automatic
         if self.languageComboBox.currentIndex() == 0:
             LanguageManager.auto_language = True
@@ -72,9 +63,6 @@
         return QtGui.QDialog.accept(self)
 
     def reject(self):
-        """
-        Run when the dialog is canceled.
-        """
         LanguageManager.auto_language = True
         LanguageManager.set_language(False, False)
         return QtGui.QDialog.reject(self)

=== modified file 'openlp/core/ui/firsttimewizard.py'
--- openlp/core/ui/firsttimewizard.py	2013-02-01 20:36:27 +0000
+++ openlp/core/ui/firsttimewizard.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The UI widgets for the first time wizard.
-"""
+
 from PyQt4 import QtCore, QtGui
 
 import sys
@@ -36,11 +34,7 @@
 from openlp.core.lib import translate
 from openlp.core.lib.ui import add_welcome_page
 
-
 class FirstTimePage(object):
-    """
-    An enumeration class with each of the pages of the wizard.
-    """
     Welcome = 0
     Plugins = 1
     NoInternet = 2
@@ -52,19 +46,13 @@
 
 
 class Ui_FirstTimeWizard(object):
-    """
-    The UI widgets for the first time wizard.
-    """
     def setupUi(self, FirstTimeWizard):
-        """
-        Set up the UI.
-        """
         FirstTimeWizard.setObjectName(u'FirstTimeWizard')
         FirstTimeWizard.resize(550, 386)
         FirstTimeWizard.setModal(True)
         FirstTimeWizard.setWizardStyle(QtGui.QWizard.ModernStyle)
         FirstTimeWizard.setOptions(QtGui.QWizard.IndependentPages | QtGui.QWizard.NoBackButtonOnStartPage |
-            QtGui.QWizard.NoBackButtonOnLastPage | QtGui.QWizard.HaveCustomButton1)
+            QtGui.QWizard.NoBackButtonOnLastPage |QtGui.QWizard.HaveCustomButton1)
         self.finishButton = self.button(QtGui.QWizard.FinishButton)
         self.noInternetFinishButton = self.button(QtGui.QWizard.CustomButton1)
         self.cancelButton = self.button(QtGui.QWizard.CancelButton)
@@ -205,20 +193,17 @@
         self.retranslateUi(FirstTimeWizard)
 
     def retranslateUi(self, FirstTimeWizard):
-        """
-        Translate the UI on the fly
-        """
         FirstTimeWizard.setWindowTitle(translate(
             'OpenLP.FirstTimeWizard', 'First Time Wizard'))
-        self.titleLabel.setText(u'<span style="font-size:14pt; font-weight:600;">%s</span>' %
+        self.titleLabel.setText(u'<span style="font-size:14pt; font-weight:600;">%s</span>' % \
             translate('OpenLP.FirstTimeWizard', 'Welcome to the First Time Wizard'))
         self.informationLabel.setText(translate('OpenLP.FirstTimeWizard',
             'This wizard will help you to configure OpenLP for initial use.'
             ' Click the next button below to start.'))
         self.pluginPage.setTitle(translate('OpenLP.FirstTimeWizard', 'Activate required Plugins'))
-        self.pluginPage.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Select the Plugins you wish to use. '))
+        self.pluginPage.setSubTitle(translate('OpenLP.FirstTimeWizard','Select the Plugins you wish to use. '))
         self.songsCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Songs'))
-        self.customCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Custom Slides'))
+        self.customCheckBox.setText(translate('OpenLP.FirstTimeWizard','Custom Slides'))
         self.bibleCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Bible'))
         self.imageCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Images'))
         # TODO Presentation plugin is not yet working on Mac OS X.

=== modified file 'openlp/core/ui/formattingtagdialog.py'
--- openlp/core/ui/formattingtagdialog.py	2013-02-01 20:36:27 +0000
+++ openlp/core/ui/formattingtagdialog.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The UI widgets for the formatting tags window.
-"""
+
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import translate, UiStrings
@@ -36,13 +34,8 @@
 
 
 class Ui_FormattingTagDialog(object):
-    """
-    The UI widgets for the formatting tags window.
-    """
+
     def setupUi(self, formattingTagDialog):
-        """
-        Set up the UI
-        """
         formattingTagDialog.setObjectName(u'formattingTagDialog')
         formattingTagDialog.resize(725, 548)
         self.listdataGridLayout = QtGui.QGridLayout(formattingTagDialog)
@@ -123,9 +116,6 @@
         self.retranslateUi(formattingTagDialog)
 
     def retranslateUi(self, formattingTagDialog):
-        """
-        Translate the UI on the fly
-        """
         formattingTagDialog.setWindowTitle(translate('OpenLP.FormattingTagDialog', 'Configure Formatting Tags'))
         self.editGroupBox.setTitle(translate('OpenLP.FormattingTagDialog', 'Edit Selection'))
         self.savePushButton.setText(translate('OpenLP.FormattingTagDialog', 'Save'))

=== modified file 'openlp/core/ui/formattingtagform.py'
--- openlp/core/ui/formattingtagform.py	2013-02-01 20:36:27 +0000
+++ openlp/core/ui/formattingtagform.py	2013-02-04 21:03:31 +0000
@@ -27,9 +27,10 @@
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
 """
-The :mod:`formattingtagform` provides an Tag Edit facility. The Base set are protected and included each time loaded.
-Custom tags can be defined and saved. The Custom Tag arrays are saved in a pickle so QSettings works on them. Base Tags
-cannot be changed.
+The :mod:`formattingtagform` provides an Tag Edit facility. The Base set are
+protected and included each time loaded. Custom tags can be defined and saved.
+The Custom Tag arrays are saved in a pickle so QSettings works on them. Base
+Tags cannot be changed.
 """
 from PyQt4 import QtCore, QtGui
 
@@ -48,7 +49,7 @@
         """
         QtGui.QDialog.__init__(self, parent)
         self.setupUi(self)
-        QtCore.QObject.connect(self.tagTableWidget, QtCore.SIGNAL(u'itemSelectionChanged()'), self.onRowSelected)
+        QtCore.QObject.connect(self.tagTableWidget, QtCore.SIGNAL(u'itemSelectionChanged()'),self.onRowSelected)
         QtCore.QObject.connect(self.newPushButton, QtCore.SIGNAL(u'clicked()'), self.onNewClicked)
         QtCore.QObject.connect(self.savePushButton, QtCore.SIGNAL(u'clicked()'), self.onSavedClicked)
         QtCore.QObject.connect(self.deletePushButton, QtCore.SIGNAL(u'clicked()'), self.onDeleteClicked)

=== modified file 'openlp/core/ui/generaltab.py'
--- openlp/core/ui/generaltab.py	2013-02-01 20:36:27 +0000
+++ openlp/core/ui/generaltab.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,6 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The general tab of the configuration dialog.
-"""
 import logging
 
 from PyQt4 import QtCore, QtGui
@@ -37,7 +34,6 @@
 
 log = logging.getLogger(__name__)
 
-
 class GeneralTab(SettingsTab):
     """
     GeneralTab is the general settings tab in the settings dialog.

=== modified file 'openlp/core/ui/maindisplay.py'
--- openlp/core/ui/maindisplay.py	2013-02-03 19:23:12 +0000
+++ openlp/core/ui/maindisplay.py	2013-02-04 21:03:31 +0000
@@ -27,16 +27,12 @@
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
 """
-The :mod:`maindisplay` module provides the functionality to display screens and play multimedia within OpenLP.
-
-Some of the code for this form is based on the examples at:
-
-* `http://www.steveheffernan.com/html5-video-player/demo-video-player.html`_
-* `http://html5demos.com/two-videos`_
-
+The :mod:`maindisplay` module provides the functionality to display screens
+and play multimedia within OpenLP.
 """
 import cgi
 import logging
+import os
 import sys
 
 from PyQt4 import QtCore, QtGui, QtWebKit, QtOpenGL
@@ -51,6 +47,8 @@
 
 log = logging.getLogger(__name__)
 
+#http://www.steveheffernan.com/html5-video-player/demo-video-player.html
+#http://html5demos.com/two-videos
 
 class Display(QtGui.QGraphicsView):
     """
@@ -59,9 +57,6 @@
     Preview display.
     """
     def __init__(self, parent, live, controller):
-        """
-        Constructor
-        """
         if live:
             QtGui.QGraphicsView.__init__(self)
             # Overwrite the parent() method.
@@ -106,9 +101,6 @@
             QtCore.Qt.ScrollBarAlwaysOff)
 
     def resizeEvent(self, event):
-        """
-        React to resizing of this display
-        """
         self.webView.setGeometry(0, 0, self.width(), self.height())
 
     def isWebLoaded(self):
@@ -124,9 +116,6 @@
     This is the display screen as a specialized class from the Display class
     """
     def __init__(self, parent, live, controller):
-        """
-        Constructor
-        """
         Display.__init__(self, parent, live, controller)
         self.screens = ScreenList()
         self.rebuildCSS = False
@@ -164,9 +153,6 @@
             QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.configChanged)
 
     def setTransparency(self, enabled):
-        """
-        Set the transparency of the window
-        """
         if enabled:
             self.setAutoFillBackground(False)
         else:
@@ -243,7 +229,7 @@
         log.debug(u'text to display')
         # Wait for the webview to update before displaying text.
         while not self.webLoaded:
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
         self.setGeometry(self.screen[u'size'])
         if animate:
             self.frame.evaluateJavaScript(u'show_text("%s")' % slide.replace(u'\\', u'\\\\').replace(u'\"', u'\\\"'))
@@ -292,7 +278,7 @@
         """
         API for replacement backgrounds so Images are added directly to cache.
         """
-        self.image_manager.add_image(path, ImageSource.ImagePlugin, background)
+        self.image_manager.addImage(path, ImageSource.ImagePlugin, background)
         if not hasattr(self, u'serviceItem'):
             return False
         self.override[u'image'] = path
@@ -314,7 +300,7 @@
             re-added to the image manager.
         """
         log.debug(u'image to display')
-        image = self.image_manager.get_image_bytes(path, ImageSource.ImagePlugin)
+        image = self.image_manager.getImageBytes(path, ImageSource.ImagePlugin)
         self.controller.media_controller.media_reset(self.controller)
         self.displayImage(image)
 
@@ -347,18 +333,18 @@
         Generates a preview of the image displayed.
         """
         log.debug(u'preview for %s', self.isLive)
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
         # We must have a service item to preview.
         if self.isLive and hasattr(self, u'serviceItem'):
             # Wait for the fade to finish before geting the preview.
             # Important otherwise preview will have incorrect text if at all!
             if self.serviceItem.themedata and self.serviceItem.themedata.display_slide_transition:
                 while self.frame.evaluateJavaScript(u'show_text_complete()') == u'false':
-                    self.application.process_events()
+                    Receiver.send_message(u'openlp_process_events')
         # Wait for the webview to update before getting the preview.
         # Important otherwise first preview will miss the background !
         while not self.webLoaded:
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
         # if was hidden keep it hidden
         if self.isLive:
             if self.hideMode:
@@ -395,16 +381,14 @@
                 self.override = {}
             else:
                 # replace the background
-                background = self.image_manager.get_image_bytes(self.override[u'image'], ImageSource.ImagePlugin)
+                background = self.image_manager.getImageBytes(self.override[u'image'], ImageSource.ImagePlugin)
         self.setTransparency(self.serviceItem.themedata.background_type ==
             BackgroundType.to_string(BackgroundType.Transparent))
         if self.serviceItem.themedata.background_filename:
-            self.serviceItem.bg_image_bytes = self.image_manager.get_image_bytes(
-                self.serviceItem.themedata.background_filename,
-                ImageSource.Theme
-            )
+            self.serviceItem.bg_image_bytes = self.image_manager.getImageBytes(
+                self.serviceItem.themedata.background_filename,ImageSource.Theme)
         if image_path:
-            image_bytes = self.image_manager.get_image_bytes(image_path, ImageSource.ImagePlugin)
+            image_bytes = self.image_manager.getImageBytes(image_path, ImageSource.ImagePlugin)
         else:
             image_bytes = None
         html = build_html(self.serviceItem, self.screen, self.isLive, background, image_bytes,
@@ -503,16 +487,6 @@
 
     image_manager = property(_get_image_manager)
 
-    def _get_application(self):
-        """
-        Adds the openlp to the class dynamically
-        """
-        if not hasattr(self, u'_application'):
-            self._application = Registry().get(u'application')
-        return self._application
-
-    application = property(_get_application)
-
 
 class AudioPlayer(QtCore.QObject):
     """
@@ -558,9 +532,6 @@
             self.mediaObject.enqueue(self.playlist[self.currentIndex])
 
     def onFinished(self):
-        """
-        When the audio track finishes.
-        """
         if self.repeat:
             log.debug(u'Repeat is enabled... here we go again!')
             self.mediaObject.clearQueue()
@@ -569,9 +540,6 @@
             self.play()
 
     def connectVolumeSlider(self, slider):
-        """
-        Connect the volume slider to the output channel.
-        """
         slider.setAudioOutput(self.audioObject)
 
     def reset(self):
@@ -618,9 +586,6 @@
         self.playlist.extend(map(Phonon.MediaSource, filenames))
 
     def next(self):
-        """
-        Skip forward to the next track in the list
-        """
         if not self.repeat and self.currentIndex + 1 >= len(self.playlist):
             return
         isPlaying = self.mediaObject.state() == Phonon.PlayingState
@@ -634,9 +599,6 @@
             self.mediaObject.play()
 
     def goTo(self, index):
-        """
-        Go to a particular track in the list
-        """
         isPlaying = self.mediaObject.state() == Phonon.PlayingState
         self.mediaObject.clearQueue()
         self.mediaObject.clear()
@@ -647,7 +609,5 @@
 
     #@todo is this used?
     def connectSlot(self, signal, slot):
-        """
-        Connect a slot to a signal on the media object
-        """
         QtCore.QObject.connect(self.mediaObject, signal, slot)
+

=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py	2013-02-03 19:23:12 +0000
+++ openlp/core/ui/mainwindow.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-This is the main window, where all the action happens.
-"""
+
 import logging
 import os
 import sys
@@ -42,7 +40,7 @@
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import Renderer, build_icon, OpenLPDockWidget, PluginManager, Receiver, translate, ImageManager, \
-    PluginStatus, Registry, Settings, ScreenList
+    PluginStatus, Registry, Settings, ScreenList, check_directory_exists
 from openlp.core.lib.ui import UiStrings, create_action
 from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, ThemeManager, SlideController, PluginForm, \
     MediaDockManager, ShortcutListForm, FormattingTagForm
@@ -82,24 +80,21 @@
 
 
 class Ui_MainWindow(object):
-    """
-    This is the UI part of the main window.
-    """
-    def setupUi(self, main_window):
+    def setupUi(self, mainWindow):
         """
         Set up the user interface
         """
-        main_window.setObjectName(u'MainWindow')
-        main_window.setWindowIcon(build_icon(u':/icon/openlp-logo-64x64.png'))
-        main_window.setDockNestingEnabled(True)
+        mainWindow.setObjectName(u'MainWindow')
+        mainWindow.setWindowIcon(build_icon(u':/icon/openlp-logo-64x64.png'))
+        mainWindow.setDockNestingEnabled(True)
         # Set up the main container, which contains all the other form widgets.
-        self.mainContent = QtGui.QWidget(main_window)
+        self.mainContent = QtGui.QWidget(mainWindow)
         self.mainContent.setObjectName(u'mainContent')
         self.mainContentLayout = QtGui.QHBoxLayout(self.mainContent)
         self.mainContentLayout.setSpacing(0)
         self.mainContentLayout.setMargin(0)
         self.mainContentLayout.setObjectName(u'mainContentLayout')
-        main_window.setCentralWidget(self.mainContent)
+        mainWindow.setCentralWidget(self.mainContent)
         self.controlSplitter = QtGui.QSplitter(self.mainContent)
         self.controlSplitter.setOrientation(QtCore.Qt.Horizontal)
         self.controlSplitter.setObjectName(u'controlSplitter')
@@ -113,7 +108,7 @@
         panelLocked = Settings().value(u'user interface/lock panel')
         self.liveController.panel.setVisible(liveVisible)
         # Create menu
-        self.menuBar = QtGui.QMenuBar(main_window)
+        self.menuBar = QtGui.QMenuBar(mainWindow)
         self.menuBar.setObjectName(u'menuBar')
         self.fileMenu = QtGui.QMenu(self.menuBar)
         self.fileMenu.setObjectName(u'fileMenu')
@@ -139,10 +134,10 @@
         # Help Menu
         self.helpMenu = QtGui.QMenu(self.menuBar)
         self.helpMenu.setObjectName(u'helpMenu')
-        main_window.setMenuBar(self.menuBar)
-        self.statusBar = QtGui.QStatusBar(main_window)
+        mainWindow.setMenuBar(self.menuBar)
+        self.statusBar = QtGui.QStatusBar(mainWindow)
         self.statusBar.setObjectName(u'statusBar')
-        main_window.setStatusBar(self.statusBar)
+        mainWindow.setStatusBar(self.statusBar)
         self.loadProgressBar = QtGui.QProgressBar(self.statusBar)
         self.loadProgressBar.setObjectName(u'loadProgressBar')
         self.statusBar.addPermanentWidget(self.loadProgressBar)
@@ -153,142 +148,142 @@
         self.defaultThemeLabel.setObjectName(u'defaultThemeLabel')
         self.statusBar.addPermanentWidget(self.defaultThemeLabel)
         # Create the MediaManager
-        self.mediaManagerDock = OpenLPDockWidget(main_window, u'mediaManagerDock', u':/system/system_mediamanager.png')
+        self.mediaManagerDock = OpenLPDockWidget(mainWindow,u'mediaManagerDock', u':/system/system_mediamanager.png')
         self.mediaManagerDock.setStyleSheet(MEDIA_MANAGER_STYLE)
         # Create the media toolbox
         self.mediaToolBox = QtGui.QToolBox(self.mediaManagerDock)
         self.mediaToolBox.setObjectName(u'mediaToolBox')
         self.mediaManagerDock.setWidget(self.mediaToolBox)
-        main_window.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.mediaManagerDock)
+        mainWindow.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.mediaManagerDock)
         # Create the service manager
-        self.serviceManagerDock = OpenLPDockWidget(main_window, u'serviceManagerDock',
+        self.serviceManagerDock = OpenLPDockWidget(mainWindow, u'serviceManagerDock',
             u':/system/system_servicemanager.png')
         self.serviceManagerContents = ServiceManager(self.serviceManagerDock)
         self.serviceManagerDock.setWidget(self.serviceManagerContents)
-        main_window.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.serviceManagerDock)
+        mainWindow.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.serviceManagerDock)
         # Create the theme manager
-        self.themeManagerDock = OpenLPDockWidget(main_window, u'themeManagerDock', u':/system/system_thememanager.png')
+        self.themeManagerDock = OpenLPDockWidget(mainWindow, u'themeManagerDock', u':/system/system_thememanager.png')
         self.themeManagerContents = ThemeManager(self.themeManagerDock)
         self.themeManagerContents.setObjectName(u'themeManagerContents')
         self.themeManagerDock.setWidget(self.themeManagerContents)
-        main_window.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.themeManagerDock)
+        mainWindow.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.themeManagerDock)
         # Create the menu items
         action_list = ActionList.get_instance()
         action_list.add_category(UiStrings().File, CategoryOrder.standardMenu)
-        self.fileNewItem = create_action(main_window, u'fileNewItem',
+        self.fileNewItem = create_action(mainWindow, u'fileNewItem',
             icon=u':/general/general_new.png',
             shortcuts=[QtGui.QKeySequence(u'Ctrl+N')],
             category=UiStrings().File,
             triggers=self.serviceManagerContents.on_new_service_clicked)
-        self.fileOpenItem = create_action(main_window, u'fileOpenItem',
+        self.fileOpenItem = create_action(mainWindow, u'fileOpenItem',
             icon=u':/general/general_open.png',
             shortcuts=[QtGui.QKeySequence(u'Ctrl+O')],
             category=UiStrings().File,
             triggers=self.serviceManagerContents.on_load_service_clicked)
-        self.fileSaveItem = create_action(main_window, u'fileSaveItem',
+        self.fileSaveItem = create_action(mainWindow, u'fileSaveItem',
             icon=u':/general/general_save.png',
             shortcuts=[QtGui.QKeySequence(u'Ctrl+S')],
             category=UiStrings().File,
             triggers=self.serviceManagerContents.save_file)
-        self.fileSaveAsItem = create_action(main_window, u'fileSaveAsItem',
+        self.fileSaveAsItem = create_action(mainWindow, u'fileSaveAsItem',
             shortcuts=[QtGui.QKeySequence(u'Ctrl+Shift+S')],
             category=UiStrings().File,
             triggers=self.serviceManagerContents.save_file_as)
-        self.printServiceOrderItem = create_action(main_window,
+        self.printServiceOrderItem = create_action(mainWindow,
             u'printServiceItem', shortcuts=[QtGui.QKeySequence(u'Ctrl+P')],
             category=UiStrings().File,
             triggers=self.serviceManagerContents.print_service_order)
-        self.fileExitItem = create_action(main_window, u'fileExitItem',
+        self.fileExitItem = create_action(mainWindow, u'fileExitItem',
             icon=u':/system/system_exit.png',
             shortcuts=[QtGui.QKeySequence(u'Alt+F4')],
-            category=UiStrings().File, triggers=main_window.close)
+            category=UiStrings().File, triggers=mainWindow.close)
         # Give QT Extra Hint that this is the Exit Menu Item
         self.fileExitItem.setMenuRole(QtGui.QAction.QuitRole)
         action_list.add_category(UiStrings().Import, CategoryOrder.standardMenu)
-        self.importThemeItem = create_action(main_window, u'importThemeItem', category=UiStrings().Import)
-        self.importLanguageItem = create_action(main_window, u'importLanguageItem')
+        self.importThemeItem = create_action(mainWindow, u'importThemeItem', category=UiStrings().Import)
+        self.importLanguageItem = create_action(mainWindow, u'importLanguageItem')
         action_list.add_category(UiStrings().Export, CategoryOrder.standardMenu)
-        self.exportThemeItem = create_action(main_window, u'exportThemeItem', category=UiStrings().Export)
-        self.exportLanguageItem = create_action(main_window, u'exportLanguageItem')
+        self.exportThemeItem = create_action(mainWindow, u'exportThemeItem', category=UiStrings().Export)
+        self.exportLanguageItem = create_action(mainWindow, u'exportLanguageItem')
         action_list.add_category(UiStrings().View, CategoryOrder.standardMenu)
-        self.viewMediaManagerItem = create_action(main_window,
+        self.viewMediaManagerItem = create_action(mainWindow,
             u'viewMediaManagerItem', shortcuts=[QtGui.QKeySequence(u'F8')],
             icon=u':/system/system_mediamanager.png',
             checked=self.mediaManagerDock.isVisible(),
             category=UiStrings().View, triggers=self.toggleMediaManager)
-        self.viewThemeManagerItem = create_action(main_window,
+        self.viewThemeManagerItem = create_action(mainWindow,
             u'viewThemeManagerItem', shortcuts=[QtGui.QKeySequence(u'F10')],
             icon=u':/system/system_thememanager.png',
             checked=self.themeManagerDock.isVisible(),
             category=UiStrings().View, triggers=self.toggleThemeManager)
-        self.viewServiceManagerItem = create_action(main_window,
+        self.viewServiceManagerItem = create_action(mainWindow,
             u'viewServiceManagerItem', shortcuts=[QtGui.QKeySequence(u'F9')],
             icon=u':/system/system_servicemanager.png',
             checked=self.serviceManagerDock.isVisible(),
             category=UiStrings().View, triggers=self.toggleServiceManager)
-        self.viewPreviewPanel = create_action(main_window, u'viewPreviewPanel',
+        self.viewPreviewPanel = create_action(mainWindow, u'viewPreviewPanel',
             shortcuts=[QtGui.QKeySequence(u'F11')], checked=previewVisible,
             category=UiStrings().View, triggers=self.setPreviewPanelVisibility)
-        self.viewLivePanel = create_action(main_window, u'viewLivePanel',
+        self.viewLivePanel = create_action(mainWindow, u'viewLivePanel',
             shortcuts=[QtGui.QKeySequence(u'F12')], checked=liveVisible,
             category=UiStrings().View, triggers=self.setLivePanelVisibility)
-        self.lockPanel = create_action(main_window, u'lockPanel',
+        self.lockPanel = create_action(mainWindow, u'lockPanel',
             checked=panelLocked, triggers=self.setLockPanel)
         action_list.add_category(UiStrings().ViewMode,
             CategoryOrder.standardMenu)
-        self.modeDefaultItem = create_action(main_window, u'modeDefaultItem', checked=False,
+        self.modeDefaultItem = create_action(mainWindow, u'modeDefaultItem', checked=False,
             category=UiStrings().ViewMode)
-        self.modeSetupItem = create_action(main_window, u'modeSetupItem', checked=False, category=UiStrings().ViewMode)
-        self.modeLiveItem = create_action(main_window, u'modeLiveItem', checked=True, category=UiStrings().ViewMode)
-        self.modeGroup = QtGui.QActionGroup(main_window)
+        self.modeSetupItem = create_action(mainWindow, u'modeSetupItem', checked=False, category=UiStrings().ViewMode)
+        self.modeLiveItem = create_action(mainWindow, u'modeLiveItem', checked=True, category=UiStrings().ViewMode)
+        self.modeGroup = QtGui.QActionGroup(mainWindow)
         self.modeGroup.addAction(self.modeDefaultItem)
         self.modeGroup.addAction(self.modeSetupItem)
         self.modeGroup.addAction(self.modeLiveItem)
         self.modeDefaultItem.setChecked(True)
         action_list.add_category(UiStrings().Tools, CategoryOrder.standardMenu)
-        self.toolsAddToolItem = create_action(main_window,
+        self.toolsAddToolItem = create_action(mainWindow,
             u'toolsAddToolItem', icon=u':/tools/tools_add.png',
             category=UiStrings().Tools)
-        self.toolsOpenDataFolder = create_action(main_window,
+        self.toolsOpenDataFolder = create_action(mainWindow,
             u'toolsOpenDataFolder', icon=u':/general/general_open.png',
             category=UiStrings().Tools)
-        self.toolsFirstTimeWizard = create_action(main_window,
+        self.toolsFirstTimeWizard = create_action(mainWindow,
             u'toolsFirstTimeWizard', icon=u':/general/general_revert.png',
             category=UiStrings().Tools)
-        self.updateThemeImages = create_action(main_window,
+        self.updateThemeImages = create_action(mainWindow,
             u'updateThemeImages', category=UiStrings().Tools)
         action_list.add_category(UiStrings().Settings,
             CategoryOrder.standardMenu)
-        self.settingsPluginListItem = create_action(main_window,
+        self.settingsPluginListItem = create_action(mainWindow,
             u'settingsPluginListItem',
             icon=u':/system/settings_plugin_list.png',
             shortcuts=[QtGui.QKeySequence(u'Alt+F7')],
             category=UiStrings().Settings, triggers=self.onPluginItemClicked)
         # i18n Language Items
-        self.autoLanguageItem = create_action(main_window, u'autoLanguageItem',
+        self.autoLanguageItem = create_action(mainWindow, u'autoLanguageItem',
             checked=LanguageManager.auto_language)
-        self.languageGroup = QtGui.QActionGroup(main_window)
+        self.languageGroup = QtGui.QActionGroup(mainWindow)
         self.languageGroup.setExclusive(True)
         self.languageGroup.setObjectName(u'languageGroup')
         add_actions(self.languageGroup, [self.autoLanguageItem])
         qmList = LanguageManager.get_qm_list()
         savedLanguage = LanguageManager.get_language()
         for key in sorted(qmList.keys()):
-            languageItem = create_action(main_window, key, checked=qmList[key] == savedLanguage)
+            languageItem = create_action(mainWindow, key, checked=qmList[key] == savedLanguage)
             add_actions(self.languageGroup, [languageItem])
-        self.settingsShortcutsItem = create_action(main_window, u'settingsShortcutsItem',
+        self.settingsShortcutsItem = create_action(mainWindow, u'settingsShortcutsItem',
             icon=u':/system/system_configure_shortcuts.png', category=UiStrings().Settings)
         # Formatting Tags were also known as display tags.
-        self.formattingTagItem = create_action(main_window, u'displayTagItem',
+        self.formattingTagItem = create_action(mainWindow, u'displayTagItem',
             icon=u':/system/tag_editor.png', category=UiStrings().Settings)
-        self.settingsConfigureItem = create_action(main_window, u'settingsConfigureItem',
+        self.settingsConfigureItem = create_action(mainWindow, u'settingsConfigureItem',
             icon=u':/system/system_settings.png', category=UiStrings().Settings)
         # Give QT Extra Hint that this is the Preferences Menu Item
         self.settingsConfigureItem.setMenuRole(QtGui.QAction.PreferencesRole)
-        self.settingsImportItem = create_action(main_window, u'settingsImportItem', category=UiStrings().Settings)
-        self.settingsExportItem = create_action(main_window, u'settingsExportItem', category=UiStrings().Settings)
+        self.settingsImportItem = create_action(mainWindow, u'settingsImportItem', category=UiStrings().Settings)
+        self.settingsExportItem = create_action(mainWindow, u'settingsExportItem', category=UiStrings().Settings)
         action_list.add_category(UiStrings().Help, CategoryOrder.standardMenu)
-        self.aboutItem = create_action(main_window, u'aboutItem', icon=u':/system/system_about.png',
+        self.aboutItem = create_action(mainWindow, u'aboutItem', icon=u':/system/system_about.png',
             shortcuts=[QtGui.QKeySequence(u'Ctrl+F1')],
             category=UiStrings().Help, triggers=self.onAboutItemClicked)
         # Give QT Extra Hint that this is an About Menu Item
@@ -296,15 +291,15 @@
         if os.name == u'nt':
             self.localHelpFile = os.path.join(
                 AppLocation.get_directory(AppLocation.AppDir), 'OpenLP.chm')
-            self.offlineHelpItem = create_action(main_window, u'offlineHelpItem',
+            self.offlineHelpItem = create_action(mainWindow, u'offlineHelpItem',
                 icon=u':/system/system_help_contents.png',
                 shortcuts=[QtGui.QKeySequence(u'F1')],
                 category=UiStrings().Help, triggers=self.onOfflineHelpClicked)
-        self.onlineHelpItem = create_action(main_window, u'onlineHelpItem',
+        self.onlineHelpItem = create_action(mainWindow, u'onlineHelpItem',
             icon=u':/system/system_online_help.png',
             shortcuts=[QtGui.QKeySequence(u'Alt+F1')],
             category=UiStrings().Help, triggers=self.onOnlineHelpClicked)
-        self.webSiteItem = create_action(main_window, u'webSiteItem', category=UiStrings().Help)
+        self.webSiteItem = create_action(mainWindow, u'webSiteItem', category=UiStrings().Help)
         add_actions(self.fileImportMenu, (self.settingsImportItem, None, self.importThemeItem, self.importLanguageItem))
         add_actions(self.fileExportMenu, (self.settingsExportItem, None, self.exportThemeItem, self.exportLanguageItem))
         add_actions(self.fileMenu, (self.fileNewItem, self.fileOpenItem,
@@ -338,7 +333,7 @@
         add_actions(self.menuBar, (self.fileMenu.menuAction(), self.viewMenu.menuAction(), self.toolsMenu.menuAction(),
             self.settingsMenu.menuAction(), self.helpMenu.menuAction()))
         # Initialise the translation
-        self.retranslateUi(main_window)
+        self.retranslateUi(mainWindow)
         self.mediaToolBox.setCurrentIndex(0)
         # Connect up some signals and slots
         QtCore.QObject.connect(self.fileMenu, QtCore.SIGNAL(u'aboutToShow()'), self.updateRecentFilesMenu)
@@ -411,8 +406,7 @@
             'Toggle the visibility of the service manager.'))
         self.viewPreviewPanel.setText(translate('OpenLP.MainWindow', '&Preview Panel'))
         self.viewPreviewPanel.setToolTip(translate('OpenLP.MainWindow', 'Toggle Preview Panel'))
-        self.viewPreviewPanel.setStatusTip(
-            translate('OpenLP.MainWindow', 'Toggle the visibility of the preview panel.'))
+        self.viewPreviewPanel.setStatusTip(translate('OpenLP.MainWindow', 'Toggle the visibility of the preview panel.'))
         self.viewLivePanel.setText(translate('OpenLP.MainWindow', '&Live Panel'))
         self.viewLivePanel.setToolTip(translate('OpenLP.MainWindow', 'Toggle Live Panel'))
         self.lockPanel.setText(translate('OpenLP.MainWindow', 'L&ock Panels'))
@@ -455,13 +449,14 @@
     """
     log.info(u'MainWindow loaded')
 
-    def __init__(self):
+    def __init__(self, application):
         """
         This constructor sets up the interface, the various managers, and the
         plugins.
         """
         QtGui.QMainWindow.__init__(self)
         Registry().register(u'main_window', self)
+        self.application = application
         self.clipboard = self.application.clipboard()
         self.arguments = self.application.args
         # Set up settings sections for the main application (not for use by plugins).
@@ -486,7 +481,7 @@
         self.recentFiles = []
         # Set up the path with plugins
         plugin_path = AppLocation.get_directory(AppLocation.PluginsDir)
-        self.plugin_manager = PluginManager(plugin_path)
+        self.pluginManager = PluginManager(plugin_path)
         self.imageManager = ImageManager()
         # Set up the interface
         self.setupUi(self)
@@ -501,9 +496,9 @@
         self.copyData = False
         # Set up signals and slots
         QtCore.QObject.connect(self.importThemeItem, QtCore.SIGNAL(u'triggered()'),
-            self.themeManagerContents.on_import_theme)
+            self.themeManagerContents.onImportTheme)
         QtCore.QObject.connect(self.exportThemeItem, QtCore.SIGNAL(u'triggered()'),
-            self.themeManagerContents.on_export_theme)
+            self.themeManagerContents.onExportTheme)
         QtCore.QObject.connect(self.mediaManagerDock, QtCore.SIGNAL(u'visibilityChanged(bool)'),
             self.viewMediaManagerItem.setChecked)
         QtCore.QObject.connect(self.serviceManagerDock, QtCore.SIGNAL(u'visibilityChanged(bool)'),
@@ -522,7 +517,7 @@
             self.onSettingsShortcutsItemClicked)
         QtCore.QObject.connect(self.settingsImportItem, QtCore.SIGNAL(u'triggered()'),
             self.onSettingsImportItemClicked)
-        QtCore.QObject.connect(self.settingsExportItem, QtCore.SIGNAL(u'triggered()'), self.onSettingsExportItemClicked)
+        QtCore.QObject.connect(self.settingsExportItem,QtCore.SIGNAL(u'triggered()'), self.onSettingsExportItemClicked)
         # i18n set signals for languages
         self.languageGroup.triggered.connect(LanguageManager.set_language)
         QtCore.QObject.connect(self.modeDefaultItem, QtCore.SIGNAL(u'triggered()'), self.onModeDefaultItemClicked)
@@ -532,14 +527,14 @@
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'openlp_version_check'), self.versionNotice)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'live_display_blank_check'), self.blankCheck)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_screen_changed'), self.screenChanged)
-        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'mainwindow_status_text'),
-            self.showStatusMessage)
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'mainwindow_status_text'), self.showStatusMessage)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'cleanup'), self.clean_up)
         # Media Manager
         QtCore.QObject.connect(self.mediaToolBox, QtCore.SIGNAL(u'currentChanged(int)'), self.onMediaToolBoxChanged)
-        self.application.set_busy_cursor()
+        Receiver.send_message(u'cursor_busy')
         # Simple message boxes
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'openlp_error_message'), self.onErrorMessage)
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'openlp_warning_message'), self.onWarningMessage)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'openlp_information_message'),
             self.onInformationMessage)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'set_new_data_path'), self.setNewDataPath)
@@ -551,25 +546,25 @@
         # Define the media Dock Manager
         self.mediaDockManager = MediaDockManager(self.mediaToolBox)
         log.info(u'Load Plugins')
-        self.plugin_manager.find_plugins(plugin_path)
+        self.pluginManager.find_plugins(plugin_path)
         # hook methods have to happen after find_plugins. Find plugins needs
         # the controllers hence the hooks have moved from setupUI() to here
         # Find and insert settings tabs
         log.info(u'hook settings')
-        self.plugin_manager.hook_settings_tabs(self.settingsForm)
+        self.pluginManager.hook_settings_tabs(self.settingsForm)
         # Find and insert media manager items
         log.info(u'hook media')
-        self.plugin_manager.hook_media_manager()
+        self.pluginManager.hook_media_manager()
         # Call the hook method to pull in import menus.
         log.info(u'hook menus')
-        self.plugin_manager.hook_import_menu(self.fileImportMenu)
+        self.pluginManager.hook_import_menu(self.fileImportMenu)
         # Call the hook method to pull in export menus.
-        self.plugin_manager.hook_export_menu(self.fileExportMenu)
+        self.pluginManager.hook_export_menu(self.fileExportMenu)
         # Call the hook method to pull in tools menus.
-        self.plugin_manager.hook_tools_menu(self.toolsMenu)
+        self.pluginManager.hook_tools_menu(self.toolsMenu)
         # Call the initialise method to setup plugins.
         log.info(u'initialise plugins')
-        self.plugin_manager.initialise_plugins()
+        self.pluginManager.initialise_plugins()
         # Create the displays as all necessary components are loaded.
         self.previewController.screenSizeChanged()
         self.liveController.screenSizeChanged()
@@ -581,24 +576,18 @@
         self.settingsForm.postSetUp()
         # Once all components are initialised load the Themes
         log.info(u'Load Themes')
-        self.themeManagerContents.load_themes(True)
+        self.themeManagerContents.loadThemes(True)
         # Hide/show the theme combobox on the service manager
-        self.serviceManagerContents.theme_change()
+        self.serviceManagerContents.themeChange()
         # Reset the cursor
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
 
     def setAutoLanguage(self, value):
-        """
-        Set the language to automatic.
-        """
         self.languageGroup.setDisabled(value)
         LanguageManager.auto_language = value
         LanguageManager.set_language(self.languageGroup.checkedAction())
 
     def onMediaToolBoxChanged(self, index):
-        """
-        Focus a widget when the media toolbox changes.
-        """
         widget = self.mediaToolBox.widget(index)
         if widget:
             widget.onFocus()
@@ -642,26 +631,24 @@
             self.setViewMode(False, True, False, False, True)
             self.modeLiveItem.setChecked(True)
 
-    def app_startup(self):
+    def appStartup(self):
         """
         Give all the plugins a chance to perform some tasks at startup
         """
-        self.application.process_events()
-        for plugin in self.plugin_manager.plugins:
+        Receiver.send_message(u'openlp_process_events')
+        for plugin in self.pluginManager.plugins:
             if plugin.isActive():
-                plugin.app_startup()
-                self.application.process_events()
+                plugin.appStartup()
+                Receiver.send_message(u'openlp_process_events')
 
-    def first_time(self):
-        """
-        Import themes if first time
-        """
-        self.application.process_events()
-        for plugin in self.plugin_manager.plugins:
-            if hasattr(plugin, u'first_time'):
-                self.application.process_events()
-                plugin.first_time()
-        self.application.process_events()
+    def firstTime(self):
+        # Import themes if first time
+        Receiver.send_message(u'openlp_process_events')
+        for plugin in self.pluginManager.plugins:
+            if hasattr(plugin, u'firstTime'):
+                Receiver.send_message(u'openlp_process_events')
+                plugin.firstTime()
+        Receiver.send_message(u'openlp_process_events')
         temp_dir = os.path.join(unicode(gettempdir()), u'openlp')
         shutil.rmtree(temp_dir, True)
 
@@ -682,30 +669,29 @@
                 QtGui.QMessageBox.No)
         if answer == QtGui.QMessageBox.No:
             return
+        Receiver.send_message(u'cursor_busy')
         screens = ScreenList()
-        first_run_wizard = FirstTimeForm(screens, self)
-        first_run_wizard.exec_()
-        if first_run_wizard.was_download_cancelled:
+        firstTime = FirstTimeForm(screens, self)
+        firstTime.exec_()
+        if firstTime.downloadCancelled:
             return
-        self.application.set_busy_cursor()
-        self.first_time()
-        for plugin in self.plugin_manager.plugins:
+        self.firstTime()
+        for plugin in self.pluginManager.plugins:
             self.activePlugin = plugin
             oldStatus = self.activePlugin.status
             self.activePlugin.setStatus()
             if oldStatus != self.activePlugin.status:
                 if self.activePlugin.status == PluginStatus.Active:
                     self.activePlugin.toggleStatus(PluginStatus.Active)
-                    self.activePlugin.app_startup()
+                    self.activePlugin.appStartup()
                 else:
                     self.activePlugin.toggleStatus(PluginStatus.Inactive)
         self.themeManagerContents.configUpdated()
-        self.themeManagerContents.load_themes(True)
+        self.themeManagerContents.loadThemes(True)
         Receiver.send_message(u'theme_update_global', self.themeManagerContents.global_theme)
         # Check if any Bibles downloaded.  If there are, they will be
         # processed.
         Receiver.send_message(u'bibles_load_list', True)
-        self.application.set_normal_cursor()
 
     def blankCheck(self):
         """
@@ -719,24 +705,15 @@
                     translate('OpenLP.MainWindow', 'The Main Display has been blanked out'))
 
     def onErrorMessage(self, data):
-        """
-        Display an error message
-        """
-        self.application.close_splash_screen()
+        Receiver.send_message(u'close_splash')
         QtGui.QMessageBox.critical(self, data[u'title'], data[u'message'])
 
-    def warning_message(self, message):
-        """
-        Display a warning message
-        """
-        self.application.close_splash_screen()
-        QtGui.QMessageBox.warning(self, message[u'title'], message[u'message'])
+    def onWarningMessage(self, data):
+        Receiver.send_message(u'close_splash')
+        QtGui.QMessageBox.warning(self, data[u'title'], data[u'message'])
 
     def onInformationMessage(self, data):
-        """
-        Display an informational message
-        """
-        self.application.close_splash_screen()
+        Receiver.send_message(u'close_splash')
         QtGui.QMessageBox.information(self, data[u'title'], data[u'message'])
 
     def onHelpWebSiteClicked(self):
@@ -783,7 +760,7 @@
         """
         Updates the new theme preview images.
         """
-        self.themeManagerContents.update_preview_images()
+        self.themeManagerContents.updatePreviewImages()
 
     def onFormattingTagItemClicked(self):
         """
@@ -823,8 +800,8 @@
                 QtGui.QMessageBox.No)
         if answer == QtGui.QMessageBox.No:
             return
-        import_file_name = QtGui.QFileDialog.getOpenFileName(self, translate('OpenLP.MainWindow', 'Open File'), '',
-            translate('OpenLP.MainWindow', 'OpenLP Export Settings Files (*.conf)'))
+        import_file_name = QtGui.QFileDialog.getOpenFileName(self,translate('OpenLP.MainWindow', 'Open File'), '',
+                translate('OpenLP.MainWindow', 'OpenLP Export Settings Files (*.conf)'))
         if not import_file_name:
             return
         setting_sections = []
@@ -840,10 +817,17 @@
         setting_sections.extend([self.headerSection])
         setting_sections.extend([u'crashreport'])
         # Add plugin sections.
-        for plugin in self.plugin_manager.plugins:
+        for plugin in self.pluginManager.plugins:
             setting_sections.extend([plugin.name])
+        # Copy the settings file to the tmp dir, because we do not want to change the original one.
+        temp_directory = os.path.join(unicode(gettempdir()), u'openlp')
+        check_directory_exists(temp_directory)
+        temp_config = os.path.join(temp_directory, os.path.basename(import_file_name))
+        shutil.copyfile(import_file_name, temp_config)
         settings = Settings()
-        import_settings = Settings(import_file_name, Settings.IniFormat)
+        import_settings = Settings(temp_config, Settings.IniFormat)
+        # Remove/rename old settings to prepare the import.
+        import_settings.remove_obsolete_settings()
         # Lets do a basic sanity check. If it contains this string we can
         # assume it was created by OpenLP and so we'll load what we can
         # from it, and just silently ignore anything we don't recognise
@@ -917,7 +901,7 @@
         setting_sections.extend([self.themesSettingsSection])
         setting_sections.extend([self.displayTagsSection])
         # Add plugin sections.
-        for plugin in self.plugin_manager.plugins:
+        for plugin in self.pluginManager.plugins:
             setting_sections.extend([plugin.name])
         # Delete old files if found.
         if os.path.exists(temp_file):
@@ -1002,14 +986,14 @@
         renderer.
         """
         log.debug(u'screenChanged')
-        self.application.set_busy_cursor()
-        self.imageManager.update_display()
+        Receiver.send_message(u'cursor_busy')
+        self.imageManager.updateDisplay()
         self.renderer.update_display()
         self.previewController.screenSizeChanged()
         self.liveController.screenSizeChanged()
         self.setFocus()
         self.activateWindow()
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
 
     def closeEvent(self, event):
         """
@@ -1017,7 +1001,7 @@
         """
         # The MainApplication did not even enter the event loop (this happens
         # when OpenLP is not fully loaded). Just ignore the event.
-        if not self.application.is_event_loop_active:
+        if not self.application.eventLoopIsActive:
             event.ignore()
             return
         # If we just did a settings import, close without saving changes.
@@ -1059,17 +1043,17 @@
         ``save_settings``
             Switch to prevent saving settings. Defaults to **True**.
         """
-        self.imageManager.stop_manager = True
-        while self.imageManager.image_thread.isRunning():
+        self.imageManager.stopManager = True
+        while self.imageManager.imageThread.isRunning():
             time.sleep(0.1)
         # Clean temporary files used by services
-        self.serviceManagerContents.clean_up()
+        self.serviceManagerContents.cleanUp()
         if save_settings:
             if Settings().value(u'advanced/save current plugin'):
                 Settings().setValue(u'advanced/current media plugin', self.mediaToolBox.currentIndex())
         # Call the cleanup method to shutdown plugins.
         log.info(u'cleanup plugins')
-        self.plugin_manager.finalise_plugins()
+        self.pluginManager.finalise_plugins()
         if save_settings:
             # Save settings
             self.saveSettings()
@@ -1123,33 +1107,18 @@
         self.setWindowTitle(title)
 
     def showStatusMessage(self, message):
-        """
-        Show a message in the status bar
-        """
         self.statusBar.showMessage(message)
 
     def defaultThemeChanged(self, theme):
-        """
-        Update the default theme indicator in the status bar
-        """
         self.defaultThemeLabel.setText(translate('OpenLP.MainWindow', 'Default Theme: %s') % theme)
 
     def toggleMediaManager(self):
-        """
-        Toggle the visibility of the media manager
-        """
         self.mediaManagerDock.setVisible(not self.mediaManagerDock.isVisible())
 
     def toggleServiceManager(self):
-        """
-        Toggle the visibility of the service manager
-        """
         self.serviceManagerDock.setVisible(not self.serviceManagerDock.isVisible())
 
     def toggleThemeManager(self):
-        """
-        Toggle the visibility of the theme manager
-        """
         self.themeManagerDock.setVisible(not self.themeManagerDock.isVisible())
 
     def setPreviewPanelVisibility(self, visible):
@@ -1222,7 +1191,7 @@
         self.restoreState(settings.value(u'main window state'))
         self.liveController.splitter.restoreState(settings.value(u'live splitter geometry'))
         self.previewController.splitter.restoreState(settings.value(u'preview splitter geometry'))
-        self.controlSplitter.restoreState(settings.value(u'mainwindow splitter geometry'))
+        self.controlSplitter.restoreState(settings.value(u'main window splitter geometry'))
         settings.endGroup()
 
     def saveSettings(self):
@@ -1243,7 +1212,7 @@
         settings.setValue(u'main window geometry', self.saveGeometry())
         settings.setValue(u'live splitter geometry', self.liveController.splitter.saveState())
         settings.setValue(u'preview splitter geometry', self.previewController.splitter.saveState())
-        settings.setValue(u'mainwindow splitter geometry', self.controlSplitter.saveState())
+        settings.setValue(u'main window splitter geometry', self.controlSplitter.saveState())
         settings.endGroup()
 
     def updateRecentFilesMenu(self):
@@ -1308,14 +1277,14 @@
         self.loadProgressBar.show()
         self.loadProgressBar.setMaximum(size)
         self.loadProgressBar.setValue(0)
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
 
     def incrementProgressBar(self):
         """
         Increase the Progress Bar value by 1
         """
         self.loadProgressBar.setValue(self.loadProgressBar.value() + 1)
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
 
     def finishedProgressBar(self):
         """
@@ -1330,43 +1299,35 @@
         if event.timerId() == self.timer_id:
             self.timer_id = 0
             self.loadProgressBar.hide()
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
 
     def setNewDataPath(self, new_data_path):
-        """
-        Set the new data path
-        """
         self.newDataPath = new_data_path
 
     def setCopyData(self, copy_data):
-        """
-        Set the flag to copy the data
-        """
         self.copyData = copy_data
 
     def changeDataDirectory(self):
-        """
-        Change the data directory.
-        """
-        log.info(u'Changing data path to %s' % self.newDataPath)
+        log.info(u'Changing data path to %s' % self.newDataPath )
         old_data_path = unicode(AppLocation.get_data_path())
         # Copy OpenLP data to new location if requested.
-        self.application.set_busy_cursor()
         if self.copyData:
             log.info(u'Copying data to new path')
             try:
+                Receiver.send_message(u'openlp_process_events')
+                Receiver.send_message(u'cursor_busy')
                 self.showStatusMessage(
                     translate('OpenLP.MainWindow', 'Copying OpenLP data to new data directory location - %s '
                     '- Please wait for copy to finish').replace('%s', self.newDataPath))
                 dir_util.copy_tree(old_data_path, self.newDataPath)
                 log.info(u'Copy sucessful')
             except (IOError, os.error, DistutilsFileError), why:
-                self.application.set_normal_cursor()
+                Receiver.send_message(u'cursor_normal')
                 log.exception(u'Data copy failed %s' % unicode(why))
                 QtGui.QMessageBox.critical(self, translate('OpenLP.MainWindow', 'New Data Directory Error'),
                     translate('OpenLP.MainWindow',
                         'OpenLP Data directory copy failed\n\n%s').replace('%s', unicode(why)),
-                    QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
+                QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
                 return False
         else:
             log.info(u'No data copy requested')
@@ -1376,14 +1337,4 @@
         # Check if the new data path is our default.
         if self.newDataPath == AppLocation.get_directory(AppLocation.DataDir):
             settings.remove(u'advanced/data path')
-        self.application.set_normal_cursor()
-
-    def _get_application(self):
-        """
-        Adds the openlp to the class dynamically
-        """
-        if not hasattr(self, u'_application'):
-            self._application = Registry().get(u'application')
-        return self._application
-
-    application = property(_get_application)
+

=== modified file 'openlp/core/ui/media/__init__.py'
--- openlp/core/ui/media/__init__.py	2013-02-02 06:32:29 +0000
+++ openlp/core/ui/media/__init__.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,6 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The :mod:`~openlp.core.ui.media` module contains classes and objects for media player integration.
-"""
 import logging
 
 from openlp.core.lib import Settings
@@ -37,7 +34,6 @@
 
 log = logging.getLogger(__name__)
 
-
 class MediaState(object):
     """
     An enumeration for possible States of the Media Player
@@ -74,7 +70,6 @@
     end_time = 0
     media_type = MediaType()
 
-
 def get_media_players():
     """
     This method extracts the configured media players and overridden player
@@ -90,7 +85,7 @@
             overridden_player = u'auto'
     else:
         overridden_player = u''
-    saved_players_list = saved_players.replace(u'[', u'').replace(u']', u'').split(u',')
+    saved_players_list = saved_players.replace(u'[', u'').replace(u']',u'').split(u',')
     return saved_players_list, overridden_player
 
 
@@ -113,5 +108,3 @@
 
 from mediacontroller import MediaController
 from playertab import PlayerTab
-
-__all__ = [u'MediaController', u'PlayerTab']

=== modified file 'openlp/core/ui/media/mediacontroller.py'
--- openlp/core/ui/media/mediacontroller.py	2013-02-02 06:32:29 +0000
+++ openlp/core/ui/media/mediacontroller.py	2013-02-04 21:03:31 +0000
@@ -26,10 +26,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The :mod:`~openlp.core.ui.media.mediacontroller` module contains a base class for media components and other widgets
-related to playing media, such as sliders.
-"""
+
 import logging
 import os
 import datetime
@@ -44,15 +41,11 @@
 
 log = logging.getLogger(__name__)
 
-
 class MediaSlider(QtGui.QSlider):
     """
     Allows the mouse events of a slider to be overridden and extra functionality added
     """
     def __init__(self, direction, manager, controller, parent=None):
-        """
-        Constructor
-        """
         QtGui.QSlider.__init__(self, direction)
         self.manager = manager
         self.controller = controller
@@ -62,7 +55,7 @@
         Override event to allow hover time to be displayed.
         """
         timevalue = QtGui.QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width())
-        self.setToolTip(u'%s' % datetime.timedelta(seconds=int(timevalue / 1000)))
+        self.setToolTip(u'%s' % datetime.timedelta(seconds=int(timevalue/1000)))
         QtGui.QSlider.mouseMoveEvent(self, event)
 
     def mousePressEvent(self, event):
@@ -94,9 +87,6 @@
 
     """
     def __init__(self, parent):
-        """
-        Constructor
-        """
         self.mainWindow = parent
         Registry().register(u'media_controller', self)
         self.mediaPlayers = {}
@@ -106,7 +96,7 @@
         self.timer = QtCore.QTimer()
         self.timer.setInterval(200)
         # Signals
-        self.timer.timeout.connect(self.media_state)
+        QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"), self.media_state)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'playbackPlay'), self.media_play_msg)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'playbackPause'), self.media_pause_msg)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'playbackStop'), self.media_stop_msg)
@@ -308,6 +298,7 @@
         QtCore.QObject.connect(controller.seekSlider, QtCore.SIGNAL(u'valueChanged(int)'), controller.sendToPlugins)
         QtCore.QObject.connect(controller.volumeSlider, QtCore.SIGNAL(u'valueChanged(int)'), controller.sendToPlugins)
 
+
     def setup_display(self, display, preview):
         """
         After a new display is configured, all media related widget will be
@@ -437,7 +428,7 @@
         ``serviceItem``
             The ServiceItem containing the details to be played.
         """
-        controller = self.displayControllers[DisplayControllerType.Plugin]
+        controller =  self.displayControllers[DisplayControllerType.Plugin]
         log.debug(u'media_length')
         # stop running videos
         self.media_reset(controller)
@@ -509,7 +500,8 @@
             First element is the controller which should be used
         """
         log.debug(u'media_play_msg')
-        self.media_play(msg[0], status)
+        self.media_play(msg[0],status)
+
 
     def media_play(self, controller, status=True):
         """
@@ -559,7 +551,7 @@
             First element is the controller which should be used
         """
         log.debug(u'media_pause_msg')
-        self.media_pause(msg[0])
+        self.media_pause( msg[0])
 
     def media_pause(self, controller):
         """
@@ -724,9 +716,6 @@
                     self.timer.start()
 
     def finalise(self):
-        """
-        Reset all the media controllers when OpenLP shuts down
-        """
         self.timer.stop()
         for controller in self.displayControllers:
             self.media_reset(self.displayControllers[controller])

=== modified file 'openlp/core/ui/media/mediaplayer.py'
--- openlp/core/ui/media/mediaplayer.py	2013-02-03 19:23:12 +0000
+++ openlp/core/ui/media/mediaplayer.py	2013-02-04 21:03:31 +0000
@@ -26,13 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The :mod:`~openlp.core.ui.media.mediaplayer` module contains the MediaPlayer class.
-"""
-from openlp.core.lib import Registry
+
 from openlp.core.ui.media import MediaState
 
-
 class MediaPlayer(object):
     """
     This is the base class media Player class to provide OpenLP with a
@@ -40,9 +36,6 @@
     """
 
     def __init__(self, parent, name=u'media_player'):
-        """
-        Constructor
-        """
         self.parent = parent
         self.name = name
         self.available = self.check_available()
@@ -150,13 +143,3 @@
         Returns Information about the player
         """
         return u''
-
-    def _get_application(self):
-        """
-        Adds the openlp to the class dynamically
-        """
-        if not hasattr(self, u'_application'):
-            self._application = Registry().get(u'application')
-        return self._application
-
-    application = property(_get_application)
\ No newline at end of file

=== modified file 'openlp/core/ui/media/phononplayer.py'
--- openlp/core/ui/media/phononplayer.py	2013-02-03 19:23:12 +0000
+++ openlp/core/ui/media/phononplayer.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The :mod:`~openlp.core.ui.media.phononplayer` contains the Phonon player component.
-"""
+
 import logging
 import mimetypes
 from datetime import datetime
@@ -36,7 +34,7 @@
 from PyQt4 import QtGui
 from PyQt4.phonon import Phonon
 
-from openlp.core.lib import translate, Settings
+from openlp.core.lib import Receiver, translate, Settings
 
 from openlp.core.ui.media import MediaState
 from openlp.core.ui.media.mediaplayer import MediaPlayer
@@ -58,25 +56,24 @@
         u'video/x-matroska': [u'.mpv', u'.mkv'],
         u'video/x-wmv': [u'.wmv'],
         u'video/x-mpg': [u'.mpg'],
-        u'video/mpeg': [u'.mp4', u'.mts', u'.mov'],
+        u'video/mpeg' : [u'.mp4', u'.mts', u'.mov'],
         u'video/x-ms-wmv': [u'.wmv']}
 
 VIDEO_CSS = u"""
 #videobackboard {
     z-index:3;
-    background-color: %(bgcolor)s;
+    background-color: %s;
 }
 #video1 {
-    background-color: %(bgcolor)s;
+    background-color: %s;
     z-index:4;
 }
 #video2 {
-    background-color: %(bgcolor)s;
+    background-color: %s;
     z-index:4;
 }
 """
 
-
 class PhononPlayer(MediaPlayer):
     """
     A specialised version of the MediaPlayer class, which provides a Phonon
@@ -84,9 +81,6 @@
     """
 
     def __init__(self, parent):
-        """
-        Constructor
-        """
         MediaPlayer.__init__(self, parent, u'phonon')
         self.original_name = u'Phonon'
         self.display_name = u'&Phonon'
@@ -100,16 +94,13 @@
             elif mimetype.startswith(u'video/'):
                 self._addToList(self.video_extensions_list, mimetype)
 
-    def _addToList(self, mimetype_list, mimetype):
-        """
-        Add mimetypes to the provided list
-        """
+    def _addToList(self, list, mimetype):
         # Add all extensions which mimetypes provides us for supported types.
         extensions = mimetypes.guess_all_extensions(unicode(mimetype))
         for extension in extensions:
             ext = u'*%s' % extension
-            if ext not in mimetype_list:
-                mimetype_list.append(ext)
+            if ext not in list:
+                list.append(ext)
         log.info(u'MediaPlugin: %s extensions: %s' % (mimetype, u' '.join(extensions)))
         # Add extensions for this mimetype from self.additional_extensions.
         # This hack clears mimetypes' and operating system's shortcomings
@@ -117,15 +108,12 @@
         if mimetype in self.additional_extensions.keys():
             for extension in self.additional_extensions[mimetype]:
                 ext = u'*%s' % extension
-                if ext not in mimetype_list:
-                    mimetype_list.append(ext)
+                if ext not in list:
+                    list.append(ext)
             log.info(u'MediaPlugin: %s additional extensions: %s' %
                 (mimetype, u' '.join(self.additional_extensions[mimetype])))
 
     def setup(self, display):
-        """
-        Set up the player widgets
-        """
         display.phononWidget = Phonon.VideoWidget(display)
         display.phononWidget.resize(display.size())
         display.mediaObject = Phonon.MediaObject(display)
@@ -138,15 +126,9 @@
         self.hasOwnWidget = True
 
     def check_available(self):
-        """
-        Check if the player is available
-        """
         return True
 
     def load(self, display):
-        """
-        Load a video into the display
-        """
         log.debug(u'load vid in Phonon Controller')
         controller = display.controller
         volume = controller.media_info.volume
@@ -168,21 +150,15 @@
             current_state = display.mediaObject.state()
             if current_state == Phonon.ErrorState:
                 return False
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
             if (datetime.now() - start).seconds > 5:
                 return False
         return True
 
     def resize(self, display):
-        """
-        Resize the display
-        """
         display.phononWidget.resize(display.size())
 
     def play(self, display):
-        """
-        Play the current media item
-        """
         controller = display.controller
         start_time = 0
         if display.mediaObject.state() != Phonon.PausedState and \
@@ -201,40 +177,25 @@
         return True
 
     def pause(self, display):
-        """
-        Pause the current media item
-        """
         display.mediaObject.pause()
         if self.media_state_wait(display, Phonon.PausedState):
             self.state = MediaState.Paused
 
     def stop(self, display):
-        """
-        Stop the current media item
-        """
         display.mediaObject.stop()
         self.set_visible(display, False)
         self.state = MediaState.Stopped
 
     def volume(self, display, vol):
-        """
-        Set the volume
-        """
         # 1.0 is the highest value
         if display.hasAudio:
             vol = float(vol) / float(100)
             display.audio.setVolume(vol)
 
     def seek(self, display, seekVal):
-        """
-        Go to a particular point in the current media item
-        """
         display.mediaObject.seek(seekVal)
 
     def reset(self, display):
-        """
-        Reset the media player
-        """
         display.mediaObject.stop()
         display.mediaObject.clearQueue()
         self.set_visible(display, False)
@@ -242,16 +203,10 @@
         self.state = MediaState.Off
 
     def set_visible(self, display, status):
-        """
-        Set the visibility of the widget
-        """
         if self.hasOwnWidget:
             display.phononWidget.setVisible(status)
 
     def update_ui(self, display):
-        """
-        Update the UI
-        """
         if display.mediaObject.state() == Phonon.PausedState and self.state != MediaState.Paused:
             self.stop(display)
         controller = display.controller
@@ -269,12 +224,9 @@
         Add css style sheets to htmlbuilder
         """
         background = QtGui.QColor(Settings().value(u'players/background color')).name()
-        return VIDEO_CSS % {u'bgcolor': background}
+        return VIDEO_CSS % (background,background,background)
 
     def get_info(self):
-        """
-        Return some info about this player
-        """
         return(translate('Media.player', 'Phonon is a media player which '
             'interacts with the operating system to provide media capabilities.') +
             u'<br/> <strong>' + translate('Media.player', 'Audio') +

=== modified file 'openlp/core/ui/media/playertab.py'
--- openlp/core/ui/media/playertab.py	2013-02-02 21:16:42 +0000
+++ openlp/core/ui/media/playertab.py	2013-02-04 21:03:31 +0000
@@ -26,24 +26,18 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The :mod:`~openlp.core.ui.media.playertab` module holds the configuration tab for the media stuff.
-"""
+
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import SettingsTab, translate, Receiver, Settings, UiStrings
 from openlp.core.lib.ui import create_button
 from openlp.core.ui.media import get_media_players, set_media_players
 
-
 class MediaQCheckBox(QtGui.QCheckBox):
     """
     MediaQCheckBox adds an extra property, playerName to the QCheckBox class.
     """
     def setPlayerName(self, name):
-        """
-        Set the player name
-        """
         self.playerName = name
 
 
@@ -51,20 +45,16 @@
     """
     MediaTab is the Media settings tab in the settings dialog.
     """
-    def __init__(self, parent):
-        """
-        Constructor
-        """
-        self.mediaPlayers = self.media_controller.mediaPlayers
+    def __init__(self, parent, mainWindow):
+        self.parent = parent
+        self.mainWindow = mainWindow
+        self.mediaPlayers = mainWindow.mediaController.mediaPlayers
         self.savedUsedPlayers = None
         self.iconPath = u':/media/multimedia-player.png'
         player_translated = translate('OpenLP.PlayerTab', 'Players')
         SettingsTab.__init__(self, parent, u'Players', player_translated)
 
     def setupUi(self):
-        """
-        Set up the UI
-        """
         self.setObjectName(u'MediaTab')
         SettingsTab.setupUi(self)
         self.bgColorGroupBox = QtGui.QGroupBox(self.leftColumn)
@@ -126,9 +116,6 @@
             self.onbackgroundColorButtonClicked)
 
     def retranslateUi(self):
-        """
-        Translate the UI on the fly
-        """
         self.mediaPlayerGroupBox.setTitle(translate('OpenLP.PlayerTab', 'Available Media Players'))
         self.playerOrderGroupBox.setTitle(translate('OpenLP.PlayerTab', 'Player Search Order'))
         self.bgColorGroupBox.setTitle(UiStrings().BackgroundColor)
@@ -138,18 +125,12 @@
         self.retranslatePlayers()
 
     def onbackgroundColorButtonClicked(self):
-        """
-        Set the background color
-        """
         new_color = QtGui.QColorDialog.getColor(QtGui.QColor(self.bg_color), self)
         if new_color.isValid():
             self.bg_color = new_color.name()
             self.backgroundColorButton.setStyleSheet(u'background-color: %s' % self.bg_color)
 
     def onPlayerCheckBoxChanged(self, check_state):
-        """
-        Add or remove players depending on their status
-        """
         player = self.sender().playerName
         if check_state == QtCore.Qt.Checked:
             if player not in self.usedPlayers:
@@ -160,9 +141,6 @@
         self.updatePlayerList()
 
     def updatePlayerList(self):
-        """
-        Update the list of media players
-        """
         self.playerOrderlistWidget.clear()
         for player in self.usedPlayers:
             if player in self.playerCheckBoxes.keys():
@@ -174,9 +152,6 @@
                 self.playerOrderlistWidget.addItem(self.mediaPlayers[unicode(player)].original_name)
 
     def onUpButtonClicked(self):
-        """
-        Move a media player up in the order
-        """
         row = self.playerOrderlistWidget.currentRow()
         if row <= 0:
             return
@@ -186,9 +161,6 @@
         self.usedPlayers.insert(row - 1, self.usedPlayers.pop(row))
 
     def onDownButtonClicked(self):
-        """
-        Move a media player down in the order
-        """
         row = self.playerOrderlistWidget.currentRow()
         if row == -1 or row > self.playerOrderlistWidget.count() - 1:
             return
@@ -198,9 +170,6 @@
         self.usedPlayers.insert(row + 1, self.usedPlayers.pop(row))
 
     def load(self):
-        """
-        Load the settings
-        """
         if self.savedUsedPlayers:
             self.usedPlayers = self.savedUsedPlayers
         self.usedPlayers = get_media_players()[0]
@@ -214,9 +183,6 @@
         self.backgroundColorButton.setStyleSheet(u'background-color: %s' % self.bg_color)
 
     def save(self):
-        """
-        Save the settings
-        """
         player_string_changed = False
         settings = Settings()
         settings.beginGroup(self.settingsSection)
@@ -228,7 +194,7 @@
             set_media_players(self.usedPlayers, override_player)
             player_string_changed = True
         if player_string_changed:
-            self.service_manager.reset_supported_suffixes()
+            self.parent.reset_supported_suffixes()
             Receiver.send_message(u'mediaitem_media_rebuild')
             Receiver.send_message(u'config_screen_changed')
 
@@ -245,7 +211,7 @@
             checkbox.setToolTip(player.get_info())
             checkbox.setPlayerName(player.name)
             self.playerCheckBoxes[player.name] = checkbox
-            QtCore.QObject.connect(checkbox, QtCore.SIGNAL(u'stateChanged(int)'), self.onPlayerCheckBoxChanged)
+            QtCore.QObject.connect(checkbox,QtCore.SIGNAL(u'stateChanged(int)'), self.onPlayerCheckBoxChanged)
             self.mediaPlayerLayout.addWidget(checkbox)
             if player.available and player.name in self.usedPlayers:
                 checkbox.setChecked(True)

=== modified file 'openlp/core/ui/media/vlcplayer.py'
--- openlp/core/ui/media/vlcplayer.py	2013-02-03 19:23:12 +0000
+++ openlp/core/ui/media/vlcplayer.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The :mod:`~openlp.core.ui.media.vlcplayer` module contains our VLC component wrapper
-"""
+
 from datetime import datetime
 from distutils.version import LooseVersion
 import logging
@@ -37,7 +35,7 @@
 
 from PyQt4 import QtGui
 
-from openlp.core.lib import translate, Settings
+from openlp.core.lib import Receiver, translate, Settings
 from openlp.core.ui.media import MediaState
 from openlp.core.ui.media.mediaplayer import MediaPlayer
 
@@ -82,8 +80,8 @@
     u'*.nsc',
     u'*.nsv',
     u'*.nut',
-    u'*.ra', u'*.ram', u'*.rm', u'*.rv', u'*.rmbv',
-    u'*.a52', u'*.dts', u'*.aac', u'*.flac', u'*.dv', u'*.vid',
+    u'*.ra', u'*.ram', u'*.rm', u'*.rv' ,u'*.rmbv',
+    u'*.a52', u'*.dts', u'*.aac', u'*.flac' ,u'*.dv', u'*.vid',
     u'*.tta', u'*.tac',
     u'*.ty',
     u'*.dts',
@@ -101,9 +99,6 @@
     """
 
     def __init__(self, parent):
-        """
-        Constructor
-        """
         MediaPlayer.__init__(self, parent, u'vlc')
         self.original_name = u'VLC'
         self.display_name = u'&VLC'
@@ -113,9 +108,6 @@
         self.video_extensions_list = VIDEO_EXT
 
     def setup(self, display):
-        """
-        Set up the media player
-        """
         display.vlcWidget = QtGui.QFrame(display)
         display.vlcWidget.setFrameStyle(QtGui.QFrame.NoFrame)
         # creating a basic vlc instance
@@ -149,15 +141,9 @@
         self.hasOwnWidget = True
 
     def check_available(self):
-        """
-        Return the availability of VLC
-        """
         return VLC_AVAILABLE
 
     def load(self, display):
-        """
-        Load a video into VLC
-        """
         log.debug(u'load vid in Vlc Controller')
         controller = display.controller
         volume = controller.media_info.volume
@@ -187,21 +173,15 @@
         while not mediaState == display.vlcMedia.get_state():
             if display.vlcMedia.get_state() == vlc.State.Error:
                 return False
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
             if (datetime.now() - start).seconds > 60:
                 return False
         return True
 
     def resize(self, display):
-        """
-        Resize the player
-        """
         display.vlcWidget.resize(display.size())
 
     def play(self, display):
-        """
-        Play the current item
-        """
         controller = display.controller
         start_time = 0
         if self.state != MediaState.Paused and controller.media_info.start_time > 0:
@@ -219,9 +199,6 @@
         return True
 
     def pause(self, display):
-        """
-        Pause the current item
-        """
         if display.vlcMedia.get_state() != vlc.State.Playing:
             return
         display.vlcMediaPlayer.pause()
@@ -229,45 +206,27 @@
             self.state = MediaState.Paused
 
     def stop(self, display):
-        """
-        Stop the current item
-        """
         display.vlcMediaPlayer.stop()
         self.state = MediaState.Stopped
 
     def volume(self, display, vol):
-        """
-        Set the volume
-        """
         if display.hasAudio:
             display.vlcMediaPlayer.audio_set_volume(vol)
 
     def seek(self, display, seekVal):
-        """
-        Go to a particular position
-        """
         if display.vlcMediaPlayer.is_seekable():
             display.vlcMediaPlayer.set_time(seekVal)
 
     def reset(self, display):
-        """
-        Reset the player
-        """
         display.vlcMediaPlayer.stop()
         display.vlcWidget.setVisible(False)
         self.state = MediaState.Off
 
     def set_visible(self, display, status):
-        """
-        Set the visibility
-        """
         if self.hasOwnWidget:
             display.vlcWidget.setVisible(status)
 
     def update_ui(self, display):
-        """
-        Update the UI
-        """
         # Stop video if playback is finished.
         if display.vlcMedia.get_state() == vlc.State.Ended:
             self.stop(display)
@@ -282,9 +241,6 @@
             controller.seekSlider.blockSignals(False)
 
     def get_info(self):
-        """
-        Return some information about this player
-        """
         return(translate('Media.player', 'VLC is an external player which '
             'supports a number of different formats.') +
             u'<br/> <strong>' + translate('Media.player', 'Audio') +

=== modified file 'openlp/core/ui/media/webkitplayer.py'
--- openlp/core/ui/media/webkitplayer.py	2013-02-02 06:32:29 +0000
+++ openlp/core/ui/media/webkitplayer.py	2013-02-04 21:03:31 +0000
@@ -26,10 +26,8 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The :mod:`~openlp.core.ui.media.webkit` module contains our WebKit video player
-"""
-from PyQt4 import QtGui
+
+from PyQt4 import QtCore, QtGui
 
 import logging
 
@@ -42,14 +40,14 @@
 VIDEO_CSS = u"""
 #videobackboard {
     z-index:3;
-    background-color: %(bgcolor)s;
+    background-color: %s;
 }
 #video1 {
-    background-color: %(bgcolor)s;
+    background-color: %s;
     z-index:4;
 }
 #video2 {
-    background-color: %(bgcolor)s;
+    background-color: %s;
     z-index:4;
 }
 """
@@ -236,33 +234,33 @@
 """
 
 VIDEO_EXT = [
-    u'*.3gp',
-    u'*.3gpp',
-    u'*.3g2',
-    u'*.3gpp2',
-    u'*.aac',
-    u'*.flv',
-    u'*.f4a',
-    u'*.f4b',
-    u'*.f4p',
-    u'*.f4v',
-    u'*.mov',
-    u'*.m4a',
-    u'*.m4b',
-    u'*.m4p',
-    u'*.m4v',
-    u'*.mkv',
-    u'*.mp4',
-    u'*.ogv',
-    u'*.webm',
-    u'*.mpg', u'*.wmv', u'*.mpeg', u'*.avi',
-    u'*.swf'
-]
+        u'*.3gp'
+        , u'*.3gpp'
+        , u'*.3g2'
+        , u'*.3gpp2'
+        , u'*.aac'
+        , u'*.flv'
+        , u'*.f4a'
+        , u'*.f4b'
+        , u'*.f4p'
+        , u'*.f4v'
+        , u'*.mov'
+        , u'*.m4a'
+        , u'*.m4b'
+        , u'*.m4p'
+        , u'*.m4v'
+        , u'*.mkv'
+        , u'*.mp4'
+        , u'*.ogv'
+        , u'*.webm'
+        , u'*.mpg', u'*.wmv', u'*.mpeg', u'*.avi'
+        , u'*.swf'
+    ]
 
 AUDIO_EXT = [
-    u'*.mp3',
-    u'*.ogg'
-]
+        u'*.mp3'
+        , u'*.ogg'
+    ]
 
 
 class WebkitPlayer(MediaPlayer):
@@ -272,9 +270,6 @@
     """
 
     def __init__(self, parent):
-        """
-        Constructor
-        """
         MediaPlayer.__init__(self, parent, u'webkit')
         self.original_name = u'WebKit'
         self.display_name = u'&WebKit'
@@ -288,7 +283,7 @@
         Add css style sheets to htmlbuilder
         """
         background = QtGui.QColor(Settings().value(u'players/background color')).name()
-        css = VIDEO_CSS % {u'bgcolor': background}
+        css = VIDEO_CSS % (background,background,background)
         return css + FLASH_CSS
 
     def get_media_display_javascript(self):
@@ -304,23 +299,14 @@
         return VIDEO_HTML + FLASH_HTML
 
     def setup(self, display):
-        """
-        Set up the player
-        """
         display.webView.resize(display.size())
         display.webView.raise_()
         self.hasOwnWidget = False
 
     def check_available(self):
-        """
-        Check the availability of the media player
-        """
         return True
 
     def load(self, display):
-        """
-        Load a video
-        """
         log.debug(u'load vid in Webkit Controller')
         controller = display.controller
         if display.hasAudio and not controller.media_info.is_background:
@@ -343,15 +329,9 @@
         return True
 
     def resize(self, display):
-        """
-        Resize the player
-        """
         display.webView.resize(display.size())
 
     def play(self, display):
-        """
-        Play a video
-        """
         controller = display.controller
         display.webLoaded = True
         length = 0
@@ -372,9 +352,6 @@
         return True
 
     def pause(self, display):
-        """
-        Pause a video
-        """
         controller = display.controller
         if controller.media_info.is_flash:
             display.frame.evaluateJavaScript(u'show_flash("pause");')
@@ -383,9 +360,6 @@
         self.state = MediaState.Paused
 
     def stop(self, display):
-        """
-        Stop a video
-        """
         controller = display.controller
         if controller.media_info.is_flash:
             display.frame.evaluateJavaScript(u'show_flash("stop");')
@@ -394,9 +368,6 @@
         self.state = MediaState.Stopped
 
     def volume(self, display, vol):
-        """
-        Set the volume
-        """
         controller = display.controller
         # 1.0 is the highest value
         if display.hasAudio:
@@ -405,9 +376,6 @@
                 display.frame.evaluateJavaScript(u'show_video(null, null, %s);' % str(vol))
 
     def seek(self, display, seekVal):
-        """
-        Go to a position in the video
-        """
         controller = display.controller
         if controller.media_info.is_flash:
             seek = seekVal
@@ -417,9 +385,6 @@
             display.frame.evaluateJavaScript(u'show_video("seek", null, null, null, "%f");' % (seek))
 
     def reset(self, display):
-        """
-        Reset the player
-        """
         controller = display.controller
         if controller.media_info.is_flash:
             display.frame.evaluateJavaScript(u'show_flash("close");')
@@ -428,9 +393,6 @@
         self.state = MediaState.Off
 
     def set_visible(self, display, status):
-        """
-        Set the visibility
-        """
         controller = display.controller
         if status:
             is_visible = "visible"
@@ -442,9 +404,6 @@
             display.frame.evaluateJavaScript(u'show_video("setVisible", null, null, null, "%s");' % (is_visible))
 
     def update_ui(self, display):
-        """
-        Update the UI
-        """
         controller = display.controller
         if controller.media_info.is_flash:
             currentTime = display.frame.evaluateJavaScript(u'show_flash("currentTime");')
@@ -469,9 +428,6 @@
                 controller.seekSlider.blockSignals(False)
 
     def get_info(self):
-        """
-        Return some information about this player
-        """
         return(translate('Media.player', 'Webkit is a media player which runs '
             'inside a web browser. This player allows text over video to be '
             'rendered.') +

=== modified file 'openlp/core/ui/mediadockmanager.py'
--- openlp/core/ui/mediadockmanager.py	2013-02-01 20:52:42 +0000
+++ openlp/core/ui/mediadockmanager.py	2013-02-04 21:03:31 +0000
@@ -26,16 +26,13 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The media manager dock.
-"""
+
 import logging
 
 from openlp.core.lib import StringContent
 
 log = logging.getLogger(__name__)
 
-
 class MediaDockManager(object):
     """
     Provide a repository for MediaManagerItems

=== modified file 'openlp/core/ui/plugindialog.py'
--- openlp/core/ui/plugindialog.py	2013-02-01 20:52:42 +0000
+++ openlp/core/ui/plugindialog.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The UI widgets of the plugin view dialog
-#"""
+
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import translate, UiStrings
@@ -36,13 +34,7 @@
 
 
 class Ui_PluginViewDialog(object):
-    """
-    The UI of the plugin view dialog
-    """
     def setupUi(self, pluginViewDialog):
-        """
-        Set up the UI
-        """
         pluginViewDialog.setObjectName(u'pluginViewDialog')
         pluginViewDialog.setWindowModality(QtCore.Qt.ApplicationModal)
         self.pluginLayout = QtGui.QVBoxLayout(pluginViewDialog)
@@ -80,9 +72,6 @@
         self.retranslateUi(pluginViewDialog)
 
     def retranslateUi(self, pluginViewDialog):
-        """
-        Translate the UI on the fly
-        """
         pluginViewDialog.setWindowTitle(translate('OpenLP.PluginForm', 'Plugin List'))
         self.pluginInfoGroupBox.setTitle(translate('OpenLP.PluginForm', 'Plugin Details'))
         self.versionLabel.setText(u'%s:' % UiStrings().Version)

=== modified file 'openlp/core/ui/pluginform.py'
--- openlp/core/ui/pluginform.py	2013-02-03 19:23:12 +0000
+++ openlp/core/ui/pluginform.py	2013-02-04 21:03:31 +0000
@@ -26,27 +26,21 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The actual plugin view form
-"""
+
 import logging
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import PluginStatus, Registry, translate
+from openlp.core.lib import PluginStatus, Receiver, translate
 from plugindialog import Ui_PluginViewDialog
 
 log = logging.getLogger(__name__)
 
-
 class PluginForm(QtGui.QDialog, Ui_PluginViewDialog):
     """
     The plugin form provides user control over the plugins OpenLP uses.
     """
     def __init__(self, parent=None):
-        """
-        Constructor
-        """
         QtGui.QDialog.__init__(self, parent)
         self.activePlugin = None
         self.programaticChange = False
@@ -68,7 +62,7 @@
         self._clearDetails()
         self.programaticChange = True
         pluginListWidth = 0
-        for plugin in self.plugin_manager.plugins:
+        for plugin in self.parent().pluginManager.plugins:
             item = QtGui.QListWidgetItem(self.pluginListWidget)
             # We do this just to make 100% sure the status is an integer as
             # sometimes when it's loaded from the config, it isn't cast to int.
@@ -91,18 +85,12 @@
         self.pluginListWidget.setFixedWidth(pluginListWidth + self.pluginListWidget.iconSize().width() + 48)
 
     def _clearDetails(self):
-        """
-        Clear the plugin details widgets
-        """
         self.statusComboBox.setCurrentIndex(-1)
         self.versionNumberLabel.setText(u'')
         self.aboutTextBrowser.setHtml(u'')
         self.statusComboBox.setEnabled(False)
 
     def _setDetails(self):
-        """
-        Set the details of the currently selected plugin
-        """
         log.debug(u'PluginStatus: %s', str(self.activePlugin.status))
         self.versionNumberLabel.setText(self.activePlugin.version)
         self.aboutTextBrowser.setHtml(self.activePlugin.about())
@@ -115,15 +103,13 @@
         self.programaticChange = False
 
     def onPluginListWidgetSelectionChanged(self):
-        """
-        If the selected plugin changes, update the form
-        """
         if self.pluginListWidget.currentItem() is None:
             self._clearDetails()
             return
-        plugin_name_singular = self.pluginListWidget.currentItem().text().split(u'(')[0][:-1]
+        plugin_name_singular = \
+            self.pluginListWidget.currentItem().text().split(u'(')[0][:-1]
         self.activePlugin = None
-        for plugin in self.plugin_manager.plugins:
+        for plugin in self.parent().pluginManager.plugins:
             if plugin.status != PluginStatus.Disabled:
                 if plugin.nameStrings[u'singular'] == plugin_name_singular:
                     self.activePlugin = plugin
@@ -134,16 +120,13 @@
             self._clearDetails()
 
     def onStatusComboBoxChanged(self, status):
-        """
-        If the status of a plugin is altered, apply the change
-        """
         if self.programaticChange or status == PluginStatus.Disabled:
             return
         if status == PluginStatus.Inactive:
-            self.application.set_busy_cursor()
+            Receiver.send_message(u'cursor_busy')
             self.activePlugin.toggleStatus(PluginStatus.Active)
-            self.application.set_normal_cursor()
-            self.activePlugin.app_startup()
+            Receiver.send_message(u'cursor_normal')
+            self.activePlugin.appStartup()
         else:
             self.activePlugin.toggleStatus(PluginStatus.Inactive)
         status_text = translate('OpenLP.PluginForm', '%s (Inactive)')
@@ -155,23 +138,3 @@
             status_text = translate('OpenLP.PluginForm', '%s (Disabled)')
         self.pluginListWidget.currentItem().setText(
             status_text % self.activePlugin.nameStrings[u'singular'])
-
-    def _get_plugin_manager(self):
-        """
-        Adds the plugin manager to the class dynamically
-        """
-        if not hasattr(self, u'_plugin_manager'):
-            self._plugin_manager = Registry().get(u'plugin_manager')
-        return self._plugin_manager
-
-    plugin_manager = property(_get_plugin_manager)
-
-    def _get_application(self):
-        """
-        Adds the openlp to the class dynamically
-        """
-        if not hasattr(self, u'_application'):
-            self._application = Registry().get(u'application')
-        return self._application
-
-    application = property(_get_application)

=== modified file 'openlp/core/ui/printservicedialog.py'
--- openlp/core/ui/printservicedialog.py	2013-02-01 20:52:42 +0000
+++ openlp/core/ui/printservicedialog.py	2013-02-04 21:03:31 +0000
@@ -26,14 +26,11 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The UI widgets of the print service dialog.
-"""
+
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import build_icon, translate, SpellTextEdit, UiStrings
 
-
 class ZoomSize(object):
     """
     Type enumeration for Combo Box sizes
@@ -47,13 +44,7 @@
 
 
 class Ui_PrintServiceDialog(object):
-    """
-    The UI of the print service dialog
-    """
     def setupUi(self, printServiceDialog):
-        """
-        Set up the UI
-        """
         printServiceDialog.setObjectName(u'printServiceDialog')
         printServiceDialog.resize(664, 594)
         self.mainLayout = QtGui.QVBoxLayout(printServiceDialog)
@@ -130,12 +121,9 @@
         self.optionsLayout.addWidget(self.optionsGroupBox)
 
         self.retranslateUi(printServiceDialog)
-        QtCore.QObject.connect(self.optionsButton, QtCore.SIGNAL(u'toggled(bool)'), self.toggleOptions)
+        QtCore.QObject.connect(self.optionsButton,QtCore.SIGNAL(u'toggled(bool)'), self.toggleOptions)
 
     def retranslateUi(self, printServiceDialog):
-        """
-        Translate the UI on the fly
-        """
         printServiceDialog.setWindowTitle(UiStrings().PrintService)
         self.zoomOutButton.setToolTip(translate('OpenLP.PrintServiceForm', 'Zoom Out'))
         self.zoomOriginalButton.setToolTip(translate('OpenLP.PrintServiceForm', 'Zoom Original'))
@@ -143,7 +131,7 @@
         self.optionsButton.setText(translate('OpenLP.PrintServiceForm', 'Options'))
         self.titleLabel.setText(translate('OpenLP.PrintServiceForm', 'Title:'))
         self.footerLabel.setText(translate('OpenLP.PrintServiceForm', 'Custom Footer Text:'))
-        self.optionsGroupBox.setTitle(translate('OpenLP.PrintServiceForm', 'Other Options'))
+        self.optionsGroupBox.setTitle(translate('OpenLP.PrintServiceForm','Other Options'))
         self.slideTextCheckBox.setText(translate('OpenLP.PrintServiceForm', 'Include slide text if available'))
         self.pageBreakAfterText.setText(translate('OpenLP.PrintServiceForm', 'Add page break before each text item'))
         self.notesCheckBox.setText(translate('OpenLP.PrintServiceForm', 'Include service item notes'))
@@ -156,5 +144,6 @@
             u'100%',
             u'75%',
             u'50%',
-            u'25%'
-        ])
+            u'25%']
+        )
+

=== modified file 'openlp/core/ui/printserviceform.py'
--- openlp/core/ui/printserviceform.py	2013-02-03 19:23:12 +0000
+++ openlp/core/ui/printserviceform.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,6 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The actual print service dialog
-"""
 import cgi
 import datetime
 import os
@@ -109,11 +106,8 @@
 }
 """
 
-
 class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
-    """
-    The :class:`~openlp.core.ui.printserviceform.PrintServiceForm` class displays a dialog for printing the service.
-    """
+
     def __init__(self):
         """
         Constructor
@@ -149,9 +143,6 @@
         self.updatePreviewText()
 
     def toggleOptions(self, checked):
-        """
-        Toggle various options
-        """
         self.optionsWidget.setVisible(checked)
         if checked:
             left = self.optionsButton.pos().x()
@@ -178,7 +169,7 @@
         self._addElement(u'body', parent=html_data)
         self._addElement(u'h1', cgi.escape(self.titleLineEdit.text()),
             html_data.body, classId=u'serviceTitle')
-        for index, item in enumerate(self.service_manager.service_items):
+        for index, item in enumerate(self.service_manager.serviceItems):
             self._addPreviewItem(html_data.body, item[u'service_item'], index)
         # Add the custom service notes:
         if self.footerTextEdit.toPlainText():
@@ -190,9 +181,6 @@
         self.previewWidget.updatePreview()
 
     def _addPreviewItem(self, body, item, index):
-        """
-        Add a preview item
-        """
         div = self._addElement(u'div', classId=u'item', parent=body)
         # Add the title of the service item.
         item_title = self._addElement(u'h2', parent=div, classId=u'itemTitle')
@@ -400,9 +388,6 @@
         settings.endGroup()
 
     def update_song_usage(self):
-        """
-        Update the song usage
-        """
         # Only continue when we include the song's text.
         if not self.slideTextCheckBox.isChecked():
             return

=== modified file 'openlp/core/ui/serviceitemeditdialog.py'
--- openlp/core/ui/serviceitemeditdialog.py	2013-02-01 21:34:23 +0000
+++ openlp/core/ui/serviceitemeditdialog.py	2013-02-04 21:03:31 +0000
@@ -26,23 +26,14 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The UI widgets for the service item edit dialog
-"""
+
 from PyQt4 import QtGui
 
 from openlp.core.lib import translate
 from openlp.core.lib.ui import create_button_box, create_button
 
-
 class Ui_ServiceItemEditDialog(object):
-    """
-    The UI widgets for the service item edit dialog
-    """
     def setupUi(self, serviceItemEditDialog):
-        """
-        Set up the UI
-        """
         serviceItemEditDialog.setObjectName(u'serviceItemEditDialog')
         self.dialog_layout = QtGui.QGridLayout(serviceItemEditDialog)
         self.dialog_layout.setContentsMargins(8, 8, 8, 8)
@@ -70,7 +61,4 @@
         self.retranslateUi(serviceItemEditDialog)
 
     def retranslateUi(self, serviceItemEditDialog):
-        """
-        Translate the UI on the fly
-        """
         serviceItemEditDialog.setWindowTitle(translate('OpenLP.ServiceItemEditForm', 'Reorder Service Item'))

=== modified file 'openlp/core/ui/serviceitemeditform.py'
--- openlp/core/ui/serviceitemeditform.py	2013-02-01 21:34:23 +0000
+++ openlp/core/ui/serviceitemeditform.py	2013-02-04 21:03:31 +0000
@@ -26,15 +26,12 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The service item edit dialog
-"""
+
 from PyQt4 import QtCore, QtGui
 from openlp.core.lib import Registry
 
 from serviceitemeditdialog import Ui_ServiceItemEditDialog
 
-
 class ServiceItemEditForm(QtGui.QDialog, Ui_ServiceItemEditDialog):
     """
     This is the form that is used to edit the verses of the song.
@@ -50,9 +47,6 @@
             self.on_current_row_changed)
 
     def set_service_item(self, item):
-        """
-        Set the service item to be edited.
-        """
         self.item = item
         self.item_list = []
         if self.item.is_image():
@@ -63,9 +57,6 @@
         self.list_widget.setCurrentItem(self.list_widget.currentItem())
 
     def get_service_item(self):
-        """
-        Get the modified service item.
-        """
         if self.data:
             self.item._raw_frames = []
             if self.item.is_image():

=== modified file 'openlp/core/ui/servicemanager.py'
--- openlp/core/ui/servicemanager.py	2013-02-03 19:23:12 +0000
+++ openlp/core/ui/servicemanager.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,6 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The service manager sets up, loads, saves and manages services.
-"""
 import cgi
 import cPickle
 import logging
@@ -42,7 +39,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import OpenLPToolbar, ServiceItem, Receiver, build_icon, ItemCapabilities, \
+from openlp.core.lib import OpenLPToolbar, ServiceItem, Receiver, build_icon, ItemCapabilities, SettingsManager, \
     translate, str_to_bool, check_directory_exists, Settings, PluginStatus, Registry, UiStrings
 from openlp.core.lib.theme import ThemeLevel
 from openlp.core.lib.ui import critical_error_message_box, create_widget_action, find_and_set_in_combo_box
@@ -51,15 +48,11 @@
 from openlp.core.utils import AppLocation, delete_file, split_filename, format_time
 from openlp.core.utils.actions import ActionList, CategoryOrder
 
-
 class ServiceManagerList(QtGui.QTreeWidget):
     """
     Set up key bindings and mouse behaviour for the service list
     """
     def __init__(self, serviceManager, parent=None):
-        """
-        Constructor
-        """
         QtGui.QTreeWidget.__init__(self, parent)
         self.serviceManager = serviceManager
 
@@ -100,22 +93,16 @@
         mime_data.setText(u'ServiceManager')
         drag.start(QtCore.Qt.CopyAction)
 
-
 class ServiceManagerDialog(object):
     """
-    UI part of the Service Manager
     """
-    def setup_ui(self, widget):
-        """
-        Define the UI
-        """
+    def setup_ui(self,widget):
         # Create the top toolbar
         self.toolbar = OpenLPToolbar(self)
         self.toolbar.addToolbarAction(u'newService', text=UiStrings().NewService, icon=u':/general/general_new.png',
             tooltip=UiStrings().CreateService, triggers=self.on_new_service_clicked)
         self.toolbar.addToolbarAction(u'openService', text=UiStrings().OpenService, icon=u':/general/general_open.png',
-            tooltip=translate('OpenLP.ServiceManager', 'Load an existing service.'),
-            triggers=self.on_load_service_clicked)
+            tooltip=translate('OpenLP.ServiceManager', 'Load an existing service.'), triggers=self.on_load_service_clicked)
         self.toolbar.addToolbarAction(u'saveService', text=UiStrings().SaveService, icon=u':/general/general_save.png',
             tooltip=translate('OpenLP.ServiceManager', 'Save this service.'), triggers=self.decide_save_method)
         self.toolbar.addSeparator()
@@ -198,8 +185,7 @@
         self.service_manager_list.make_live = self.order_toolbar.addToolbarAction(u'make_live',
             text=translate('OpenLP.ServiceManager', 'Go Live'), icon=u':/general/general_live.png',
             tooltip=translate('OpenLP.ServiceManager', 'Send the selected item to Live.'),
-            shortcuts=[QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return], category=UiStrings().Service,
-            triggers=self.make_live)
+            shortcuts=[QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return], category=UiStrings().Service, triggers=self.make_live)
         self.layout.addWidget(self.order_toolbar)
         # Connect up our signals and slots
         QtCore.QObject.connect(self.theme_combo_box, QtCore.SIGNAL(u'activated(int)'),
@@ -211,10 +197,17 @@
         QtCore.QObject.connect(self.service_manager_list, QtCore.SIGNAL(u'itemExpanded(QTreeWidgetItem*)'),
             self.expanded)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_list'), self.update_theme_list)
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'servicemanager_preview_live'),
+            self.preview_live)
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'servicemanager_next_item'), self.next_item)
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'servicemanager_previous_item'),
+            self.previous_item)
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'servicemanager_set_item'), self.on_set_item)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.config_updated)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_screen_changed'),
             self.regenerate_service_Items)
-        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_global'), self.theme_change)
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_global'), self.themeChange)
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'service_item_update'), self.serviceItemUpdate)
         # Last little bits of setting up
         self.service_theme = Settings().value(self.main_window.serviceManagerSettingsSection + u'/service theme')
         self.servicePath = AppLocation.get_section_data_path(u'servicemanager')
@@ -409,12 +402,10 @@
             elif result == QtGui.QMessageBox.Save:
                 self.decide_save_method()
         if not load_file:
-            file_name = QtGui.QFileDialog.getOpenFileName(
-                self.main_window,
+            file_name = QtGui.QFileDialog.getOpenfile_name(self.main_window,
                 translate('OpenLP.ServiceManager', 'Open File'),
-                Settings().value(self.main_window.serviceManagerSettingsSection + u'/last directory'),
-                translate('OpenLP.ServiceManager', 'OpenLP Service Files (*.osz *.oszl)')
-            )
+                    SettingsManager.get_last_dir(self.main_window.serviceManagerSettingsSection),
+                    translate('OpenLP.ServiceManager', 'OpenLP Service Files (*.osz *.oszl)'))
             if not file_name:
                 return False
         else:
@@ -450,7 +441,7 @@
         self.service_id += 1
         self.set_modified(False)
         Settings().setValue(u'servicemanager/last file', u'')
-        self.plugin_manager.new_service_created()
+        Receiver.send_message(u'servicemanager_new_service')
 
     def save_file(self):
         """
@@ -478,7 +469,7 @@
         missing_list = []
         audio_files = []
         total_size = 0
-        self.application.set_busy_cursor()
+        Receiver.send_message(u'cursor_busy')
         # Number of items + 1 to zip it
         self.main_window.displayProgressBar(len(self.service_items) + 1)
         # Get list of missing files, and list of files to write
@@ -494,7 +485,7 @@
                 else:
                     write_list.append(path_from)
         if missing_list:
-            self.application.set_normal_cursor()
+            Receiver.send_message(u'cursor_normal')
             title = translate('OpenLP.ServiceManager', 'Service File(s) Missing')
             message = translate('OpenLP.ServiceManager',
                 'The following file(s) in the service are missing:\n\t%s\n\n'
@@ -504,6 +495,7 @@
             if answer == QtGui.QMessageBox.Cancel:
                 self.main_window.finishedProgressBar()
                 return False
+            Receiver.send_message(u'cursor_busy')
         # Check if item contains a missing file.
         for item in list(self.service_items):
             self.main_window.incrementProgressBar()
@@ -564,11 +556,11 @@
             if zip_file:
                 zip_file.close()
         self.main_window.finishedProgressBar()
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
         if success:
             try:
                 shutil.copy(temp_file_name, path_file_name)
-            except shutil.Error:
+            except:
                 return self.save_file_as()
             self.main_window.addRecentFile(path_file_name)
             self.set_modified(False)
@@ -593,7 +585,7 @@
         log.debug(u'ServiceManager.save_file - %s', path_file_name)
         Settings().setValue(self.main_window.serviceManagerSettingsSection + u'/last directory', path)
         service = []
-        self.application.set_busy_cursor()
+        Receiver.send_message(u'cursor_busy')
         # Number of items + 1 to zip it
         self.main_window.displayProgressBar(len(self.service_items) + 1)
         for item in self.service_items:
@@ -622,11 +614,11 @@
             if zip_file:
                 zip_file.close()
         self.main_window.finishedProgressBar()
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
         if success:
             try:
                 shutil.copy(temp_file_name, path_file_name)
-            except shutil.Error:
+            except:
                 return self.save_file_as()
             self.main_window.addRecentFile(path_file_name)
             self.set_modified(False)
@@ -699,15 +691,13 @@
             return False
         zip_file = None
         file_to = None
-        self.application.set_busy_cursor()
         try:
             zip_file = zipfile.ZipFile(file_name)
             for zip_info in zip_file.infolist():
                 try:
                     ucsfile = zip_info.filename.decode(u'utf-8')
                 except UnicodeDecodeError:
-                    log.exception(u'file_name "%s" is not valid UTF-8' %
-                        zip_info.file_name.decode(u'utf-8', u'replace'))
+                    log.exception(u'file_name "%s" is not valid UTF-8' % zip_info.file_name.decode(u'utf-8', u'replace'))
                     critical_error_message_box(message=translate('OpenLP.ServiceManager',
                         'File is not a valid service.\n The content encoding is not UTF-8.'))
                     continue
@@ -720,6 +710,7 @@
                 if osfile.endswith(u'osd'):
                     p_file = os.path.join(self.servicePath, osfile)
             if 'p_file' in locals():
+                Receiver.send_message(u'cursor_busy')
                 file_to = open(p_file, u'r')
                 items = cPickle.load(file_to)
                 file_to.close()
@@ -764,7 +755,6 @@
                 QtGui.QMessageBox.information(self, translate('OpenLP.ServiceManager', 'Corrupt File'),
                     translate('OpenLP.ServiceManager',
                         'This file is either corrupt or it is not an OpenLP 2 service file.'))
-            self.application.set_normal_cursor()
             return
         finally:
             if file_to:
@@ -772,7 +762,7 @@
             if zip_file:
                 zip_file.close()
         self.main_window.finishedProgressBar()
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
         self.repaint_service_list(-1, -1)
 
     def load_Last_file(self):
@@ -819,8 +809,7 @@
                 delay_suffix = u' %s s' % unicode(service_item[u'service_item'].timed_slide_interval)
             else:
                 delay_suffix = u' ...'
-            self.timed_slide_interval.setText(
-                translate('OpenLP.ServiceManager', '&Delay between slides') + delay_suffix)
+            self.timed_slide_interval.setText(translate('OpenLP.ServiceManager', '&Delay between slides') + delay_suffix)
             # TODO for future: make group explains itself more visually
         else:
             self.auto_play_slides_group.menuAction().setVisible(False)
@@ -829,7 +818,7 @@
         if service_item[u'service_item'].is_capable(ItemCapabilities.CanAutoStartForLive):
             self.auto_start_action.setVisible(True)
             self.auto_start_action.setIcon(self.inactive)
-            self.auto_start_action.setText(translate('OpenLP.ServiceManager', '&Auto Start - inactive'))
+            self.auto_start_action.setText(translate('OpenLP.ServiceManager','&Auto Start - inactive'))
             if service_item[u'service_item'].will_auto_start:
                 self.auto_start_action.setText(translate('OpenLP.ServiceManager', '&Auto Start - active'))
                 self.auto_start_action.setIcon(self.active)
@@ -887,6 +876,7 @@
                 self.main_window.generalSettingsSection + u'/loop delay')
         self.set_modified()
 
+
     def toggle_auto_play_slides_loop(self):
         """
         Toggle Auto play slide loop.
@@ -902,6 +892,7 @@
                 self.main_window.generalSettingsSection + u'/loop delay')
         self.set_modified()
 
+
     def on_timed_slide_interval(self):
         """
         Shows input dialog for enter interval in seconds for delay
@@ -944,20 +935,12 @@
             self.add_service_item(self.serviceItemEditForm.get_service_item(),
                 replace=True, expand=self.service_items[item][u'expanded'])
 
-    def preview_live(self, unique_identifier, row):
+    def preview_live(self, message):
         """
         Called by the SlideController to request a preview item be made live
         and allows the next preview to be updated if relevant.
-
-
-        ``unique_identifier``
-            Reference to the service_item
-
-
-        ``row``
-            individual row number
-
         """
+        unique_identifier, row = message.split(u':')
         for sitem in self.service_items:
             if sitem[u'service_item'].unique_identifier == unique_identifier:
                 item = self.service_manager_list.topLevelItem(sitem[u'order'] - 1)
@@ -983,13 +966,9 @@
                 lookFor = 1
             serviceIterator += 1
 
-    def previous_item(self, last_slide=False):
+    def previous_item(self, message):
         """
         Called by the SlideController to select the previous service item.
-
-        ``last_slide``
-            Is this the last slide in the service_item
-
         """
         if not self.service_manager_list.selectedItems():
             return
@@ -999,7 +978,7 @@
         serviceIterator = QtGui.QTreeWidgetItemIterator(self.service_manager_list)
         while serviceIterator.value():
             if serviceIterator.value() == selected:
-                if last_slide and prevItemLastSlide:
+                if message == u'last slide' and prevItemLastSlide:
                     pos = prevItem.data(0, QtCore.Qt.UserRole)
                     check_expanded = self.service_items[pos - 1][u'expanded']
                     self.service_manager_list.setCurrentItem(prevItemLastSlide)
@@ -1222,13 +1201,13 @@
                         self.service_manager_list.setCurrentItem(treewidgetitem)
             treewidgetitem.setExpanded(item[u'expanded'])
 
-    def clean_up(self):
+    def cleanUp(self):
         """
         Empties the servicePath of temporary files on system exit.
         """
         log.debug(u'Cleaning up servicePath')
-        for file_name in os.listdir(self.servicePath):
-            file_path = os.path.join(self.servicePath, file_name)
+        for file in os.listdir(self.servicePath):
+            file_path = os.path.join(self.servicePath, file)
             delete_file(file_path)
         if os.path.exists(os.path.join(self.servicePath, u'audio')):
             shutil.rmtree(os.path.join(self.servicePath, u'audio'), True)
@@ -1243,12 +1222,12 @@
         Settings().setValue(self.main_window.serviceManagerSettingsSection + u'/service theme', self.service_theme)
         self.regenerate_service_Items(True)
 
-    def theme_change(self):
+    def themeChange(self):
         """
         The theme may have changed in the settings dialog so make
         sure the theme combo box is in the correct state.
         """
-        log.debug(u'theme_change')
+        log.debug(u'themeChange')
         visible = self.renderer.theme_level == ThemeLevel.Global
         self.theme_label.setVisible(visible)
         self.theme_combo_box.setVisible(visible)
@@ -1258,7 +1237,7 @@
         Rebuild the service list as things have changed and a
         repaint is the easiest way to do this.
         """
-        self.application.set_busy_cursor()
+        Receiver.send_message(u'cursor_busy')
         log.debug(u'regenerate_service_Items')
         # force reset of renderer as theme data has changed
         self.service_has_all_original_files = True
@@ -1290,14 +1269,14 @@
                 self.set_modified()
             # Repaint it once only at the end
             self.repaint_service_list(-1, -1)
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
 
-    def service_item_update(self, edit_id, unique_identifier, temporary=False):
+    def serviceItemUpdate(self, message):
         """
         Triggered from plugins to update service items.
         Save the values as they will be used as part of the service load
         """
-        self.load_item_unique_identifier = unique_identifier
+        edit_id, self.load_item_unique_identifier, temporary = message.split(u':')
         self.load_item_edit_id = int(edit_id)
         self.load_item_temporary = str_to_bool(temporary)
 
@@ -1365,7 +1344,7 @@
         """
         Send the current item to the Preview slide controller
         """
-        self.application.set_busy_cursor()
+        Receiver.send_message(u'cursor_busy')
         item, child = self.find_service_item()
         if self.service_items[item][u'service_item'].is_valid:
             self.preview_controller.addServiceManagerItem(self.service_items[item][u'service_item'], child)
@@ -1373,7 +1352,7 @@
             critical_error_message_box(translate('OpenLP.ServiceManager', 'Missing Display Handler'),
                 translate('OpenLP.ServiceManager',
                     'Your item cannot be displayed as there is no handler to display it'))
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
 
     def get_service_item(self):
         """
@@ -1406,7 +1385,7 @@
             return
         if row != -1:
             child = row
-        self.application.set_busy_cursor()
+        Receiver.send_message(u'cursor_busy')
         if self.service_items[item][u'service_item'].is_valid:
             self.live_controller.addServiceManagerItem(self.service_items[item][u'service_item'], child)
             if Settings().value(self.main_window.generalSettingsSection + u'/auto preview'):
@@ -1421,13 +1400,13 @@
             critical_error_message_box(translate('OpenLP.ServiceManager', 'Missing Display Handler'),
                 translate('OpenLP.ServiceManager',
                     'Your item cannot be displayed as the plugin required to display it is missing or inactive'))
-            self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
 
     def remote_edit(self):
         """
         Triggers a remote edit to a plugin to allow item to be edited.
         """
-        item = self.find_service_item()[0]
+        item, child = self.find_service_item()
         if self.service_items[item][u'service_item'].is_capable(ItemCapabilities.CanEdit):
             new_item = Registry().get(self.service_items[item][u'service_item'].name). \
                 onRemoteEdit(self.service_items[item][u'service_item'].edit_id)
@@ -1633,14 +1612,4 @@
             self._main_window = Registry().get(u'main_window')
         return self._main_window
 
-    main_window = property(_get_main_window)
-
-    def _get_application(self):
-        """
-        Adds the openlp to the class dynamically
-        """
-        if not hasattr(self, u'_application'):
-            self._application = Registry().get(u'application')
-        return self._application
-
-    application = property(_get_application)
+    main_window = property(_get_main_window)
\ No newline at end of file

=== modified file 'openlp/core/ui/servicenoteform.py'
--- openlp/core/ui/servicenoteform.py	2013-02-01 21:34:23 +0000
+++ openlp/core/ui/servicenoteform.py	2013-02-04 21:03:31 +0000
@@ -26,15 +26,12 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The :mod:`~openlp.core.ui.servicenoteform` module contains the `ServiceNoteForm` class.
-"""
+
 from PyQt4 import QtGui
 
 from openlp.core.lib import translate, SpellTextEdit, Registry
 from openlp.core.lib.ui import create_button_box
 
-
 class ServiceNoteForm(QtGui.QDialog):
     """
     This is the form that is used to edit the verses of the song.
@@ -48,16 +45,10 @@
         self.retranslateUi()
 
     def exec_(self):
-        """
-        Execute the form and return the result.
-        """
         self.text_edit.setFocus()
         return QtGui.QDialog.exec_(self)
 
     def setupUi(self):
-        """
-        Set up the UI of the dialog
-        """
         self.setObjectName(u'serviceNoteEdit')
         self.dialog_layout = QtGui.QVBoxLayout(self)
         self.dialog_layout.setContentsMargins(8, 8, 8, 8)
@@ -70,9 +61,6 @@
         self.dialog_layout.addWidget(self.button_box)
 
     def retranslateUi(self):
-        """
-        Translate the UI on the fly
-        """
         self.setWindowTitle(translate('OpenLP.ServiceNoteForm', 'Service Item Notes'))
 
     def _get_main_window(self):

=== modified file 'openlp/core/ui/settingsdialog.py'
--- openlp/core/ui/settingsdialog.py	2013-02-01 21:34:23 +0000
+++ openlp/core/ui/settingsdialog.py	2013-02-04 21:03:31 +0000
@@ -26,23 +26,14 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The UI widgets of the settings dialog.
-"""
+
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import translate, build_icon
 from openlp.core.lib.ui import create_button_box
 
-
 class Ui_SettingsDialog(object):
-    """
-    The UI widgets of the settings dialog.
-    """
     def setupUi(self, settingsDialog):
-        """
-        Set up the UI
-        """
         settingsDialog.setObjectName(u'settingsDialog')
         settingsDialog.resize(800, 500)
         settingsDialog.setWindowIcon(build_icon(u':/system/system_settings.png'))
@@ -64,7 +55,4 @@
         QtCore.QObject.connect(self.settingListWidget, QtCore.SIGNAL(u'currentRowChanged(int)'), self.tabChanged)
 
     def retranslateUi(self, settingsDialog):
-        """
-        Translate the UI on the fly
-        """
         settingsDialog.setWindowTitle(translate('OpenLP.SettingsForm', 'Configure OpenLP'))

=== modified file 'openlp/core/ui/settingsform.py'
--- openlp/core/ui/settingsform.py	2013-02-02 21:16:42 +0000
+++ openlp/core/ui/settingsform.py	2013-02-04 21:03:31 +0000
@@ -40,7 +40,6 @@
 
 log = logging.getLogger(__name__)
 
-
 class SettingsForm(QtGui.QDialog, Ui_SettingsDialog):
     """
     Provide the form to manipulate the settings for OpenLP
@@ -55,16 +54,13 @@
         # General tab
         self.generalTab = GeneralTab(self)
         # Themes tab
-        self.themesTab = ThemesTab(self)
+        self.themesTab = ThemesTab(self, self.main_window)
         # Advanced tab
         self.advancedTab = AdvancedTab(self)
         # Advanced tab
-        self.playerTab = PlayerTab(self)
+        self.playerTab = PlayerTab(self, self.main_window)
 
     def exec_(self):
-        """
-        Execute the form
-        """
         # load all the settings
         self.settingListWidget.clear()
         while self.stackedLayout.count():

=== modified file 'openlp/core/ui/shortcutlistdialog.py'
--- openlp/core/ui/shortcutlistdialog.py	2013-02-01 21:34:23 +0000
+++ openlp/core/ui/shortcutlistdialog.py	2013-02-04 21:03:31 +0000
@@ -26,23 +26,17 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The list of shortcuts within a dialog.
-"""
+
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import translate, build_icon
 from openlp.core.lib.ui import create_button_box
 
-
 class CaptureShortcutButton(QtGui.QPushButton):
     """
     A class to encapsulate a ``QPushButton``.
     """
     def __init__(self, *args):
-        """
-        Constructor
-        """
         QtGui.QPushButton.__init__(self, *args)
         self.setCheckable(True)
 
@@ -57,13 +51,7 @@
 
 
 class Ui_ShortcutListDialog(object):
-    """
-    The UI widgets for the shortcut dialog.
-    """
     def setupUi(self, shortcutListDialog):
-        """
-        Set up the UI
-        """
         shortcutListDialog.setObjectName(u'shortcutListDialog')
         shortcutListDialog.resize(500, 438)
         self.shortcutListLayout = QtGui.QVBoxLayout(shortcutListDialog)
@@ -125,9 +113,6 @@
         self.retranslateUi(shortcutListDialog)
 
     def retranslateUi(self, shortcutListDialog):
-        """
-        Translate the UI on the fly
-        """
         shortcutListDialog.setWindowTitle(translate('OpenLP.ShortcutListDialog', 'Configure Shortcuts'))
         self.descriptionLabel.setText(
             translate('OpenLP.ShortcutListDialog', 'Select an action and click one of the buttons below to start '

=== modified file 'openlp/core/ui/shortcutlistform.py'
--- openlp/core/ui/shortcutlistform.py	2013-02-03 17:42:31 +0000
+++ openlp/core/ui/shortcutlistform.py	2013-02-04 21:03:31 +0000
@@ -26,14 +26,13 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The :mod:`~openlp.core.ui.shortcutlistform` module contains the form class"""
+
 import logging
 import re
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Registry, Settings
+from openlp.core.lib import Receiver, Settings
 from openlp.core.utils import translate
 from openlp.core.utils.actions import ActionList
 from shortcutlistdialog import Ui_ShortcutListDialog
@@ -49,9 +48,6 @@
     """
 
     def __init__(self, parent=None):
-        """
-        Constructor
-        """
         QtGui.QDialog.__init__(self, parent)
         self.setupUi(self)
         self.changedActions = {}
@@ -76,9 +72,6 @@
             self.onCustomRadioButtonClicked)
 
     def keyPressEvent(self, event):
-        """
-        Respond to certain key presses
-        """
         if event.key() == QtCore.Qt.Key_Space:
             self.keyReleaseEvent(event)
         elif self.primaryPushButton.isChecked() or self.alternatePushButton.isChecked():
@@ -88,9 +81,6 @@
             self.close()
 
     def keyReleaseEvent(self, event):
-        """
-        Respond to certain key presses
-        """
         if not self.primaryPushButton.isChecked() and not self.alternatePushButton.isChecked():
             return
         key = event.key()
@@ -116,9 +106,6 @@
                     False, text=key_sequence.toString())
 
     def exec_(self):
-        """
-        Execute the dialog
-        """
         self.changedActions = {}
         self.reloadShortcutList()
         self._adjustButton(self.primaryPushButton, False, False, u'')
@@ -435,10 +422,10 @@
                 if action.shortcutContext() in [QtCore.Qt.WindowShortcut,
                     QtCore.Qt.ApplicationShortcut]:
                     is_valid = False
-                if changing_action.shortcutContext() in [QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut]:
+                if changing_action.shortcutContext() in  [QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut]:
                     is_valid = False
         if not is_valid:
-            self.main_window.warning_message( {
+            Receiver.send_message(u'openlp_warning_message', {
                 u'title': translate('OpenLP.ShortcutListDialog', 'Duplicate Shortcut'),
                 u'message': translate('OpenLP.ShortcutListDialog',
                     'The shortcut "%s" is already assigned to another action, '
@@ -478,13 +465,3 @@
             button.setChecked(checked)
         if enabled is not None:
             button.setEnabled(enabled)
-
-    def _get_main_window(self):
-        """
-        Adds the main window to the class dynamically
-        """
-        if not hasattr(self, u'_main_window'):
-            self._main_window = Registry().get(u'main_window')
-        return self._main_window
-
-    main_window = property(_get_main_window)
\ No newline at end of file

=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py	2013-02-03 16:40:39 +0000
+++ openlp/core/ui/slidecontroller.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The :mod:`slidecontroller` module contains argubly the most important part of OpenLP - the slide controller
-"""
+
 import os
 import logging
 import copy
@@ -230,7 +228,7 @@
             self.playSlidesOnce = create_action(self, u'playSlidesOnce', text=UiStrings().PlaySlidesToEnd,
                 icon=u':/media/media_time.png', checked=False, shortcuts=[],
                 category=self.category, triggers=self.onPlaySlidesOnce)
-            if Settings().value(self.parent().generalSettingsSection + u'/enable slide loop'):
+            if Settings().value(self.parent().advancedSettingsSection + u'/slide limits') == SlideLimits.Wrap:
                 self.playSlidesMenu.setDefaultAction(self.playSlidesLoop)
             else:
                 self.playSlidesMenu.setDefaultAction(self.playSlidesOnce)
@@ -280,7 +278,7 @@
             self.audioMenu.addAction(self.nextTrackItem)
             self.trackMenu = self.audioMenu.addMenu(translate('OpenLP.SlideController', 'Tracks'))
             self.audioTimeLabel = QtGui.QLabel(u' 00:00 ', self.toolbar)
-            self.audioTimeLabel.setAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignHCenter)
+            self.audioTimeLabel.setAlignment(QtCore.Qt.AlignCenter|QtCore.Qt.AlignHCenter)
             self.audioTimeLabel.setStyleSheet(
                 u'background-color: palette(background); '
                 u'border-top-color: palette(shadow); '
@@ -311,7 +309,7 @@
         self.slideLayout.setObjectName(u'SlideLayout')
         self.previewDisplay = Display(self, self.isLive, self)
         self.previewDisplay.setGeometry(QtCore.QRect(0, 0, 300, 300))
-        self.previewDisplay.screen = {u'size': self.previewDisplay.geometry()}
+        self.previewDisplay.screen = {u'size':self.previewDisplay.geometry()}
         self.previewDisplay.setup()
         self.slideLayout.insertWidget(0, self.previewDisplay)
         self.previewDisplay.hide()
@@ -456,9 +454,6 @@
             self.current_shortcut = u''
 
     def setLiveHotkeys(self, parent=None):
-        """
-        Set the live hotkeys
-        """
         self.previousService = create_action(parent, u'previousService',
             text=translate('OpenLP.SlideController', 'Previous Service'),
             shortcuts=[QtCore.Qt.Key_Left], context=QtCore.Qt.WidgetWithChildrenShortcut, category=self.category,
@@ -469,13 +464,10 @@
             triggers=self.serviceNext)
         self.escapeItem = create_action(parent, 'escapeItem',
             text=translate('OpenLP.SlideController', 'Escape Item'),
-            shortcuts=[QtCore.Qt.Key_Escape], context=QtCore.Qt.WidgetWithChildrenShortcut, category=self.category,
+            shortcuts=[QtCore.Qt.Key_Escape],context=QtCore.Qt.WidgetWithChildrenShortcut, category=self.category,
             triggers=self.liveEscape)
 
     def liveEscape(self):
-        """
-        If you press ESC on the live screen it should close the display temporarily.
-        """
         self.display.setVisible(False)
         self.media_controller.media_stop(self)
 
@@ -518,12 +510,12 @@
                 self.keypress_loop = True
                 keypressCommand = self.keypress_queue.popleft()
                 if keypressCommand == ServiceItemAction.Previous:
-                    self.service_manager.previous_item()
+                    Receiver.send_message('servicemanager_previous_item')
                 elif keypressCommand == ServiceItemAction.PreviousLastSlide:
                     # Go to the last slide of the previous item
-                    self.service_manager.previous_item(last_slide=True)
+                    Receiver.send_message('servicemanager_previous_item', u'last slide')
                 else:
-                    self.service_manager.next_item()
+                    Receiver.send_message('servicemanager_next_item')
             self.keypress_loop = False
 
     def screenSizeChanged(self):
@@ -550,14 +542,11 @@
         serviceItem = ServiceItem()
         self.previewDisplay.webView.setHtml(build_html(serviceItem, self.previewDisplay.screen, None, self.isLive,
             plugins=self.plugin_manager.plugins))
-        self.media_controller.setup_display(self.previewDisplay, True)
+        self.media_controller.setup_display(self.previewDisplay,True)
         if self.serviceItem:
             self.refreshServiceItem()
 
     def __addActionsToWidget(self, widget):
-        """
-        Add actions to the widget specified by `widget`
-        """
         widget.addActions([
             self.previousItem, self.nextItem,
             self.previousService, self.nextService,
@@ -610,9 +599,6 @@
                 self.toolbar.setWidgetVisible(self.hideMenuList)
                 
     def onSongBarHandler(self):
-        """
-        Some song handler
-        """
         request = self.sender().text()
         slide_no = self.slideList[request]
         self.__updatePreviewSelection(slide_no)
@@ -739,7 +725,7 @@
                 self.playSlidesLoop.setChecked(item.auto_play_slides_loop)
                 self.delaySpinBox.setValue(int(item.timed_slide_interval))
                 self.onPlaySlidesLoop()
-            elif self.isLive and item.auto_play_slides_once and item.timed_slide_interval > 0:
+            elif self.isLive and  item.auto_play_slides_once and item.timed_slide_interval > 0:
                 self.playSlidesOnce.setChecked(item.auto_play_slides_once)
                 self.delaySpinBox.setValue(int(item.timed_slide_interval))
                 self.onPlaySlidesOnce()
@@ -819,9 +805,9 @@
                 else:
                     # If current slide set background to image
                     if framenumber == slideno:
-                        self.serviceItem.bg_image_bytes = self.image_manager.get_image_bytes(frame[u'path'],
+                        self.serviceItem.bg_image_bytes = self.image_manager.getImageBytes(frame[u'path'],
                             ImageSource.ImagePlugin)
-                    image = self.image_manager.get_image(frame[u'path'], ImageSource.ImagePlugin)
+                    image = self.image_manager.getImage(frame[u'path'], ImageSource.ImagePlugin)
                     label.setPixmap(QtGui.QPixmap.fromImage(image))
                 self.previewListWidget.setCellWidget(framenumber, 0, label)
                 slideHeight = width * (1 / self.ratio)
@@ -1137,9 +1123,6 @@
             self.slideSelected()
 
     def __checkUpdateSelectedSlide(self, row):
-        """
-        Check if this slide has been updated
-        """
         if row + 1 < self.previewListWidget.rowCount():
             self.previewListWidget.scrollToItem(self.previewListWidget.item(row + 1, 0))
         self.previewListWidget.selectRow(row)
@@ -1212,15 +1195,9 @@
         self.onToggleLoop()
 
     def setAudioItemsVisibility(self, visible):
-        """
-        Set the visibility of the audio stuff
-        """
         self.toolbar.setWidgetVisible(self.audioList, visible)
 
     def onAudioPauseClicked(self, checked):
-        """
-        Pause the audio player
-        """
         if not self.audioPauseItem.isVisible():
             return
         if checked:
@@ -1271,7 +1248,8 @@
         row = self.previewListWidget.currentRow()
         if -1 < row < self.previewListWidget.rowCount():
             if self.serviceItem.from_service:
-                self.service_manager.preview_live(self.serviceItem.unique_identifier, row)
+                Receiver.send_message('servicemanager_preview_live', u'%s:%s' %
+                    (self.serviceItem.unique_identifier, row))
             else:
                 self.live_controller.addServiceManagerItem(self.serviceItem, row)
 
@@ -1325,24 +1303,15 @@
             return None
 
     def onNextTrackClicked(self):
-        """
-        Go to the next track when next is clicked
-        """
         self.display.audioPlayer.next()
 
     def onAudioTimeRemaining(self, time):
-        """
-        Update how much time is remaining
-        """
         seconds = self.display.audioPlayer.mediaObject.remainingTime() // 1000
         minutes = seconds // 60
         seconds %= 60
         self.audioTimeLabel.setText(u' %02d:%02d ' % (minutes, seconds))
 
     def onTrackTriggered(self):
-        """
-        Start playing a track
-        """
         action = self.sender()
         self.display.audioPlayer.goTo(action.data())
 
@@ -1394,4 +1363,4 @@
             self._live_controller = Registry().get(u'live_controller')
         return self._live_controller
 
-    live_controller = property(_get_live_controller)
+    live_controller = property(_get_live_controller)
\ No newline at end of file

=== modified file 'openlp/core/ui/splashscreen.py'
--- openlp/core/ui/splashscreen.py	2013-02-03 17:42:31 +0000
+++ openlp/core/ui/splashscreen.py	2013-02-04 21:03:31 +0000
@@ -26,29 +26,17 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The splash screen
-"""
 from openlp.core.lib import Receiver
 
 from PyQt4 import QtCore, QtGui
 
-
 class SplashScreen(QtGui.QSplashScreen):
-    """
-    The splash screen
-    """
     def __init__(self):
-        """
-        Constructor
-        """
         QtGui.QSplashScreen.__init__(self)
         self.setupUi()
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'close_splash'), self.close)
 
     def setupUi(self):
-        """
-        Set up the UI
-        """
         self.setObjectName(u'splashScreen')
         self.setContextMenuPolicy(QtCore.Qt.PreventContextMenu)
         splash_image = QtGui.QPixmap(u':/graphics/openlp-splash-screen.png')

=== modified file 'openlp/core/ui/starttimedialog.py'
--- openlp/core/ui/starttimedialog.py	2013-02-01 21:34:23 +0000
+++ openlp/core/ui/starttimedialog.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The UI widgets for the time dialog
-"""
+
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import translate, UiStrings
@@ -36,13 +34,7 @@
 
 
 class Ui_StartTimeDialog(object):
-    """
-    The UI widgets for the time dialog
-    """
     def setupUi(self, StartTimeDialog):
-        """
-        Set up the UI
-        """
         StartTimeDialog.setObjectName(u'StartTimeDialog')
         StartTimeDialog.resize(350, 10)
         self.dialogLayout = QtGui.QGridLayout(StartTimeDialog)
@@ -116,9 +108,6 @@
         self.setMaximumHeight(self.sizeHint().height())
 
     def retranslateUi(self, StartTimeDialog):
-        """
-        Update the translations on the fly
-        """
         self.setWindowTitle(translate('OpenLP.StartTimeForm', 'Item Start and Finish Time'))
         self.hourSpinBox.setSuffix(UiStrings().Hours)
         self.minuteSpinBox.setSuffix(UiStrings().Minutes)

=== modified file 'openlp/core/ui/starttimeform.py'
--- openlp/core/ui/starttimeform.py	2013-02-01 21:34:23 +0000
+++ openlp/core/ui/starttimeform.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The actual start time form.
-"""
+
 from PyQt4 import QtGui
 
 from starttimedialog import Ui_StartTimeDialog
@@ -36,15 +34,11 @@
 from openlp.core.lib import translate, UiStrings, Registry
 from openlp.core.lib.ui import critical_error_message_box
 
-
 class StartTimeForm(QtGui.QDialog, Ui_StartTimeDialog):
     """
-    The start time dialog
+    The exception dialog
     """
     def __init__(self):
-        """
-        Constructor
-        """
         QtGui.QDialog.__init__(self, self.main_window)
         self.setupUi(self)
 
@@ -66,9 +60,6 @@
         return QtGui.QDialog.exec_(self)
 
     def accept(self):
-        """
-        When the dialog succeeds, this is run
-        """
         start = self.hourSpinBox.value() * 3600 + \
             self.minuteSpinBox.value() * 60 + \
             self.secondSpinBox.value()
@@ -88,9 +79,6 @@
         return QtGui.QDialog.accept(self)
 
     def _time_split(self, seconds):
-        """
-        Split time up into hours minutes and seconds from secongs
-        """
         hours = seconds / 3600
         seconds -= 3600 * hours
         minutes = seconds / 60

=== modified file 'openlp/core/ui/themeform.py'
--- openlp/core/ui/themeform.py	2013-02-02 21:16:42 +0000
+++ openlp/core/ui/themeform.py	2013-02-04 21:03:31 +0000
@@ -26,15 +26,13 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The Theme wizard
-"""
+
 import logging
 import os
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, translate, UiStrings, Registry
+from openlp.core.lib import Receiver, translate, UiStrings
 from openlp.core.lib.theme import BackgroundType, BackgroundGradientType
 from openlp.core.lib.ui import critical_error_message_box
 from openlp.core.ui import ThemeLayoutForm
@@ -43,7 +41,6 @@
 
 log = logging.getLogger(__name__)
 
-
 class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
     """
     This is the Theme Import Wizard, which allows easy creation and editing of
@@ -59,6 +56,7 @@
             The QWidget-derived parent of the wizard.
         """
         QtGui.QWizard.__init__(self, parent)
+        self.thememanager = parent
         self.setupUi(self)
         self.registerFields()
         self.updateThemeAllowed = True
@@ -74,14 +72,14 @@
             self.onGradientStartButtonClicked)
         QtCore.QObject.connect(self.gradientEndButton, QtCore.SIGNAL(u'clicked()'), self.onGradientEndButtonClicked)
         QtCore.QObject.connect(self.imageBrowseButton, QtCore.SIGNAL(u'clicked()'), self.onImageBrowseButtonClicked)
-        QtCore.QObject.connect(self.mainColorButton, QtCore.SIGNAL(u'clicked()'), self.onMainColorButtonClicked)
+        QtCore.QObject.connect(self.mainColorButton,  QtCore.SIGNAL(u'clicked()'), self.onMainColorButtonClicked)
         QtCore.QObject.connect(self.outlineColorButton, QtCore.SIGNAL(u'clicked()'), self.onOutlineColorButtonClicked)
         QtCore.QObject.connect(self.shadowColorButton, QtCore.SIGNAL(u'clicked()'), self.onShadowColorButtonClicked)
         QtCore.QObject.connect(self.outlineCheckBox, QtCore.SIGNAL(u'stateChanged(int)'),
             self.onOutlineCheckCheckBoxStateChanged)
         QtCore.QObject.connect(self.shadowCheckBox, QtCore.SIGNAL(u'stateChanged(int)'),
             self.onShadowCheckCheckBoxStateChanged)
-        QtCore.QObject.connect(self.footerColorButton, QtCore.SIGNAL(u'clicked()'), self.onFooterColorButtonClicked)
+        QtCore.QObject.connect(self.footerColorButton,QtCore.SIGNAL(u'clicked()'), self.onFooterColorButtonClicked)
         QtCore.QObject.connect(self, QtCore.SIGNAL(u'customButtonClicked(int)'), self.onCustom1ButtonClicked)
         QtCore.QObject.connect(self.mainPositionCheckBox, QtCore.SIGNAL(u'stateChanged(int)'),
             self.onMainPositionCheckBoxStateChanged)
@@ -151,7 +149,7 @@
         # Do not trigger on start up
         if self.currentPage != self.welcomePage:
             self.updateTheme()
-            self.theme_manager.generate_image(self.theme, True)
+            self.thememanager.generateImage(self.theme, True)
 
     def updateLinesText(self, lines):
         """
@@ -180,9 +178,6 @@
                 pixmapHeight + 2 * frameWidth)
 
     def validateCurrentPage(self):
-        """
-        Validate the current page
-        """
         background_image = BackgroundType.to_string(BackgroundType.Image)
         if self.page(self.currentId()) == self.backgroundPage and \
                 self.theme.background_type == background_image and not self.imageFileEdit.text():
@@ -201,7 +196,7 @@
         self.setOption(QtGui.QWizard.HaveCustomButton1, enabled)
         if self.page(pageId) == self.previewPage:
             self.updateTheme()
-            frame = self.theme_manager.generate_image(self.theme)
+            frame = self.thememanager.generateImage(self.theme)
             self.previewBoxLabel.setPixmap(frame)
             self.displayAspectRatio = float(frame.width()) / frame.height()
             self.resizeEvent()
@@ -211,15 +206,15 @@
         Generate layout preview and display the form.
         """
         self.updateTheme()
-        width = self.renderer.width
-        height = self.renderer.height
+        width = self.thememanager.mainwindow.renderer.width
+        height = self.thememanager.mainwindow.renderer.height
         pixmap = QtGui.QPixmap(width, height)
         pixmap.fill(QtCore.Qt.white)
         paint = QtGui.QPainter(pixmap)
         paint.setPen(QtGui.QPen(QtCore.Qt.blue, 2))
-        paint.drawRect(self.renderer.get_main_rectangle(self.theme))
+        paint.drawRect(self.thememanager.mainwindow.renderer.get_main_rectangle(self.theme))
         paint.setPen(QtGui.QPen(QtCore.Qt.red, 2))
-        paint.drawRect(self.renderer.get_footer_rectangle(self.theme))
+        paint.drawRect(self.thememanager.mainwindow.renderer.get_footer_rectangle(self.theme))
         paint.end()
         self.themeLayoutForm.exec_(pixmap)
 
@@ -449,30 +444,18 @@
         self.setBackgroundPageValues()
 
     def onMainColorButtonClicked(self):
-        """
-        Set the main colour value
-        """
         self.theme.font_main_color = self._colorButton(self.theme.font_main_color)
         self.setMainAreaPageValues()
 
     def onOutlineColorButtonClicked(self):
-        """
-        Set the outline colour value
-        """
         self.theme.font_main_outline_color = self._colorButton(self.theme.font_main_outline_color)
         self.setMainAreaPageValues()
 
     def onShadowColorButtonClicked(self):
-        """
-        Set the shadow colour value
-        """
         self.theme.font_main_shadow_color = self._colorButton(self.theme.font_main_shadow_color)
         self.setMainAreaPageValues()
 
     def onFooterColorButtonClicked(self):
-        """
-        Set the footer colour value
-        """
         self.theme.font_footer_color = self._colorButton(self.theme.font_footer_color)
         self.setFooterAreaPageValues()
 
@@ -531,9 +514,9 @@
             filename = os.path.split(unicode(self.theme.background_filename))[1]
             saveTo = os.path.join(self.path, self.theme.theme_name, filename)
             saveFrom = self.theme.background_filename
-        if not self.edit_mode and not self.theme_manager.check_if_theme_exists(self.theme.theme_name):
+        if not self.edit_mode and not self.thememanager.checkIfThemeExists(self.theme.theme_name):
             return
-        self.theme_manager.save_theme(self.theme, saveFrom, saveTo)
+        self.thememanager.saveTheme(self.theme, saveFrom, saveTo)
         return QtGui.QDialog.accept(self)
 
     def _colorButton(self, field):
@@ -544,23 +527,3 @@
         if new_color.isValid():
             field = new_color.name()
         return field
-
-    def _get_renderer(self):
-        """
-        Adds the Renderer to the class dynamically
-        """
-        if not hasattr(self, u'_renderer'):
-            self._renderer = Registry().get(u'renderer')
-        return self._renderer
-
-    renderer = property(_get_renderer)
-
-    def _get_theme_manager(self):
-        """
-        Adds the theme manager to the class dynamically
-        """
-        if not hasattr(self, u'_theme_manager'):
-            self._theme_manager = Registry().get(u'theme_manager')
-        return self._theme_manager
-
-    theme_manager = property(_get_theme_manager)

=== modified file 'openlp/core/ui/themelayoutdialog.py'
--- openlp/core/ui/themelayoutdialog.py	2013-02-01 21:34:23 +0000
+++ openlp/core/ui/themelayoutdialog.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The layout of the theme
-"""
+
 from PyQt4 import QtGui
 
 from openlp.core.lib import translate
@@ -36,13 +34,7 @@
 
 
 class Ui_ThemeLayoutDialog(object):
-    """
-    The layout of the theme
-    """
     def setupUi(self, themeLayoutDialog):
-        """
-        Set up the UI
-        """
         themeLayoutDialog.setObjectName(u'themeLayoutDialogDialog')
         #themeLayoutDialog.resize(300, 200)
         self.previewLayout = QtGui.QVBoxLayout(themeLayoutDialog)
@@ -71,9 +63,7 @@
         self.retranslateUi(themeLayoutDialog)
 
     def retranslateUi(self, themeLayoutDialog):
-        """
-        Translate the UI on the fly
-        """
         themeLayoutDialog.setWindowTitle(translate('OpenLP.StartTimeForm', 'Theme Layout'))
         self.mainColourLabel.setText(translate('OpenLP.StartTimeForm', 'The blue box shows the main area.'))
         self.footerColourLabel.setText(translate('OpenLP.StartTimeForm', 'The red box shows the footer.'))
+

=== modified file 'openlp/core/ui/themelayoutform.py'
--- openlp/core/ui/themelayoutform.py	2013-02-01 21:34:23 +0000
+++ openlp/core/ui/themelayoutform.py	2013-02-04 21:03:31 +0000
@@ -26,22 +26,16 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The form layout
-"""
+
 from PyQt4 import QtGui, QtCore
 
 from themelayoutdialog import Ui_ThemeLayoutDialog
 
-
 class ThemeLayoutForm(QtGui.QDialog, Ui_ThemeLayoutDialog):
     """
     The exception dialog
     """
     def __init__(self, parent):
-        """
-        Constructor
-        """
         QtGui.QDialog.__init__(self, parent)
         self.setupUi(self)
 
@@ -50,7 +44,11 @@
         Run the Dialog with correct heading.
         """
         pixmap = image.scaledToHeight(400, QtCore.Qt.SmoothTransformation)
-        self.themeDisplayLabel.setPixmap(pixmap)
+        self.themeDisplayLabel.setPixmap(image)
         displayAspectRatio = float(image.width()) / image.height()
-        self.themeDisplayLabel.setFixedSize(400, 400 / displayAspectRatio)
+        self.themeDisplayLabel.setFixedSize(400, 400 / displayAspectRatio )
         return QtGui.QDialog.exec_(self)
+
+    def accept(self):
+        return QtGui.QDialog.accept(self)
+

=== modified file 'openlp/core/ui/thememanager.py'
--- openlp/core/ui/thememanager.py	2013-02-03 19:23:12 +0000
+++ openlp/core/ui/thememanager.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The Theme Manager manages adding, deleteing and modifying of themes.
-"""
+
 import os
 import zipfile
 import shutil
@@ -49,15 +47,11 @@
 
 log = logging.getLogger(__name__)
 
-
 class ThemeManager(QtGui.QWidget):
     """
     Manages the orders of Theme.
     """
     def __init__(self, parent=None):
-        """
-        Constructor
-        """
         QtGui.QWidget.__init__(self, parent)
         Registry().register(u'theme_manager', self)
         self.settingsSection = u'themes'
@@ -78,67 +72,67 @@
             text=translate('OpenLP.ThemeManager', 'Edit Theme'),
             icon=u':/themes/theme_edit.png',
             tooltip=translate('OpenLP.ThemeManager', 'Edit a theme.'),
-            triggers=self.on_edit_theme)
-        self.deleteToolbarAction = self.toolbar.addToolbarAction(u'delete_theme',
+            triggers=self.onEditTheme)
+        self.deleteToolbarAction = self.toolbar.addToolbarAction(u'deleteTheme',
             text=translate('OpenLP.ThemeManager', 'Delete Theme'),
             icon=u':/general/general_delete.png',
             tooltip=translate('OpenLP.ThemeManager', 'Delete a theme.'),
-            triggers=self.on_delete_theme)
+            triggers=self.onDeleteTheme)
         self.toolbar.addSeparator()
         self.toolbar.addToolbarAction(u'importTheme',
             text=translate('OpenLP.ThemeManager', 'Import Theme'),
             icon=u':/general/general_import.png',
             tooltip=translate('OpenLP.ThemeManager', 'Import a theme.'),
-            triggers=self.on_import_theme)
+            triggers=self.onImportTheme)
         self.toolbar.addToolbarAction(u'exportTheme',
             text=translate('OpenLP.ThemeManager', 'Export Theme'),
             icon=u':/general/general_export.png',
             tooltip=translate('OpenLP.ThemeManager', 'Export a theme.'),
-            triggers=self.on_export_theme)
+            triggers=self.onExportTheme)
         self.layout.addWidget(self.toolbar)
-        self.theme_widget = QtGui.QWidgetAction(self.toolbar)
-        self.theme_widget.setObjectName(u'theme_widget')
+        self.themeWidget = QtGui.QWidgetAction(self.toolbar)
+        self.themeWidget.setObjectName(u'themeWidget')
         # create theme manager list
-        self.theme_list_widget = QtGui.QListWidget(self)
-        self.theme_list_widget.setAlternatingRowColors(True)
-        self.theme_list_widget.setIconSize(QtCore.QSize(88, 50))
-        self.theme_list_widget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
-        self.theme_list_widget.setObjectName(u'theme_list_widget')
-        self.layout.addWidget(self.theme_list_widget)
-        QtCore.QObject.connect(self.theme_list_widget, QtCore.SIGNAL('customContextMenuRequested(QPoint)'),
-            self.context_menu)
+        self.themeListWidget = QtGui.QListWidget(self)
+        self.themeListWidget.setAlternatingRowColors(True)
+        self.themeListWidget.setIconSize(QtCore.QSize(88, 50))
+        self.themeListWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
+        self.themeListWidget.setObjectName(u'themeListWidget')
+        self.layout.addWidget(self.themeListWidget)
+        QtCore.QObject.connect(self.themeListWidget, QtCore.SIGNAL('customContextMenuRequested(QPoint)'),
+            self.contextMenu)
         # build the context menu
         self.menu = QtGui.QMenu()
-        self.edit_action = create_widget_action(self.menu,
+        self.editAction = create_widget_action(self.menu,
             text=translate('OpenLP.ThemeManager', '&Edit Theme'),
-            icon=u':/themes/theme_edit.png', triggers=self.on_edit_theme)
-        self.copy_action = create_widget_action(self.menu,
+            icon=u':/themes/theme_edit.png', triggers=self.onEditTheme)
+        self.copyAction = create_widget_action(self.menu,
             text=translate('OpenLP.ThemeManager', '&Copy Theme'),
-            icon=u':/themes/theme_edit.png', triggers=self.on_copy_theme)
-        self.rename_action = create_widget_action(self.menu,
+            icon=u':/themes/theme_edit.png', triggers=self.onCopyTheme)
+        self.renameAction = create_widget_action(self.menu,
             text=translate('OpenLP.ThemeManager', '&Rename Theme'),
-            icon=u':/themes/theme_edit.png', triggers=self.on_rename_theme)
-        self.delete_action = create_widget_action(self.menu,
+            icon=u':/themes/theme_edit.png', triggers=self.onRenameTheme)
+        self.deleteAction = create_widget_action(self.menu,
             text=translate('OpenLP.ThemeManager', '&Delete Theme'),
-            icon=u':/general/general_delete.png', triggers=self.on_delete_theme)
+            icon=u':/general/general_delete.png', triggers=self.onDeleteTheme)
         self.menu.addSeparator()
-        self.global_action = create_widget_action(self.menu,
+        self.globalAction = create_widget_action(self.menu,
             text=translate('OpenLP.ThemeManager', 'Set As &Global Default'),
             icon=u':/general/general_export.png',
             triggers=self.changeGlobalFromScreen)
         self.exportAction = create_widget_action(self.menu,
             text=translate('OpenLP.ThemeManager', '&Export Theme'),
-            icon=u':/general/general_export.png', triggers=self.on_export_theme)
+            icon=u':/general/general_export.png', triggers=self.onExportTheme)
         # Signals
-        QtCore.QObject.connect(self.theme_list_widget,
+        QtCore.QObject.connect(self.themeListWidget,
             QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.changeGlobalFromScreen)
-        QtCore.QObject.connect(self.theme_list_widget,
-            QtCore.SIGNAL(u'currentItemChanged(QListWidgetItem *, QListWidgetItem *)'), self.check_list_state)
+        QtCore.QObject.connect(self.themeListWidget,
+            QtCore.SIGNAL(u'currentItemChanged(QListWidgetItem *, QListWidgetItem *)'), self.checkListState)
         QtCore.QObject.connect(Receiver.get_receiver(),
-            QtCore.SIGNAL(u'theme_update_global'), self.change_global_from_tab)
-        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.config_updated)
+            QtCore.SIGNAL(u'theme_update_global'), self.changeGlobalFromTab)
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.configUpdated)
         # Variables
-        self.theme_list = []
+        self.themeList = []
         self.path = AppLocation.get_section_data_path(self.settingsSection)
         check_directory_exists(self.path)
         self.thumbPath = os.path.join(self.path, u'thumbnails')
@@ -147,28 +141,27 @@
         self.oldBackgroundImage = None
         self.badV1NameChars = re.compile(r'[%+\[\]]')
         # Last little bits of setting up
-        self.config_updated()
+        self.configUpdated()
 
-    def first_time(self):
+    def firstTime(self):
         """
         Import new themes downloaded by the first time wizard
         """
-        self.application.set_busy_cursor()
+        Receiver.send_message(u'cursor_busy')
         files = SettingsManager.get_files(self.settingsSection, u'.otz')
-        for theme_file in files:
-            theme_file = os.path.join(self.path, theme_file)
-            self.unzipTheme(theme_file, self.path)
-            delete_file(theme_file)
-        self.application.set_normal_cursor()
-
-
-    def config_updated(self):
+        for file in files:
+            file = os.path.join(self.path, file)
+            self.unzipTheme(file, self.path)
+            delete_file(file)
+        Receiver.send_message(u'cursor_normal')
+
+    def configUpdated(self):
         """
         Triggered when Config dialog is updated.
         """
         self.global_theme = Settings().value(self.settingsSection + u'/global theme')
 
-    def check_list_state(self, item):
+    def checkListState(self, item):
         """
         If Default theme selected remove delete button.
         """
@@ -182,41 +175,41 @@
         else:
             self.deleteToolbarAction.setVisible(False)
 
-    def context_menu(self, point):
+    def contextMenu(self, point):
         """
         Build the Right Click Context menu and set state depending on
         the type of theme.
         """
-        item = self.theme_list_widget.itemAt(point)
+        item = self.themeListWidget.itemAt(point)
         if item is None:
             return
         real_theme_name = item.data(QtCore.Qt.UserRole)
         theme_name = unicode(item.text())
         visible = real_theme_name == theme_name
-        self.delete_action.setVisible(visible)
-        self.rename_action.setVisible(visible)
-        self.global_action.setVisible(visible)
-        self.menu.exec_(self.theme_list_widget.mapToGlobal(point))
+        self.deleteAction.setVisible(visible)
+        self.renameAction.setVisible(visible)
+        self.globalAction.setVisible(visible)
+        self.menu.exec_(self.themeListWidget.mapToGlobal(point))
 
-    def change_global_from_tab(self, theme_name):
+    def changeGlobalFromTab(self, theme_name):
         """
         Change the global theme when it is changed through the Themes settings
         tab
         """
-        log.debug(u'change_global_from_tab %s', theme_name)
-        for count in range(0, self.theme_list_widget.count()):
+        log.debug(u'changeGlobalFromTab %s', theme_name)
+        for count in range (0, self.themeListWidget.count()):
             # reset the old name
-            item = self.theme_list_widget.item(count)
+            item = self.themeListWidget.item(count)
             old_name = item.text()
             new_name = item.data(QtCore.Qt.UserRole)
             if old_name != new_name:
-                self.theme_list_widget.item(count).setText(new_name)
+                self.themeListWidget.item(count).setText(new_name)
             # Set the new name
             if theme_name == new_name:
                 name = translate('OpenLP.ThemeManager', '%s (default)') % new_name
-                self.theme_list_widget.item(count).setText(name)
+                self.themeListWidget.item(count).setText(name)
                 self.deleteToolbarAction.setVisible(
-                    item not in self.theme_list_widget.selectedItems())
+                    item not in self.themeListWidget.selectedItems())
 
     def changeGlobalFromScreen(self, index=-1):
         """
@@ -224,21 +217,21 @@
         Theme Manager list
         """
         log.debug(u'changeGlobalFromScreen %s', index)
-        selected_row = self.theme_list_widget.currentRow()
-        for count in range(0, self.theme_list_widget.count()):
-            item = self.theme_list_widget.item(count)
+        selected_row = self.themeListWidget.currentRow()
+        for count in range (0, self.themeListWidget.count()):
+            item = self.themeListWidget.item(count)
             old_name = item.text()
             # reset the old name
             if old_name != item.data(QtCore.Qt.UserRole):
-                self.theme_list_widget.item(count).setText(item.data(QtCore.Qt.UserRole))
+                self.themeListWidget.item(count).setText(item.data(QtCore.Qt.UserRole))
             # Set the new name
             if count == selected_row:
-                self.global_theme = self.theme_list_widget.item(count).text()
+                self.global_theme = self.themeListWidget.item(count).text()
                 name = translate('OpenLP.ThemeManager', '%s (default)') % self.global_theme
-                self.theme_list_widget.item(count).setText(name)
+                self.themeListWidget.item(count).setText(name)
                 Settings().setValue(self.settingsSection + u'/global theme', self.global_theme)
                 Receiver.send_message(u'theme_update_global', self.global_theme)
-                self._push_themes()
+                self._pushThemes()
 
     def onAddTheme(self):
         """
@@ -249,44 +242,44 @@
         theme.set_default_header_footer()
         self.themeForm.theme = theme
         self.themeForm.exec_()
-        self.load_themes()
+        self.loadThemes()
 
-    def on_rename_theme(self):
+    def onRenameTheme(self):
         """
         Renames an existing theme to a new name
         """
         if self._validate_theme_action(translate('OpenLP.ThemeManager', 'You must select a theme to rename.'),
                 translate('OpenLP.ThemeManager', 'Rename Confirmation'),
                 translate('OpenLP.ThemeManager', 'Rename %s theme?'), False, False):
-            item = self.theme_list_widget.currentItem()
+            item = self.themeListWidget.currentItem()
             old_theme_name = item.data(QtCore.Qt.UserRole)
             self.fileRenameForm.fileNameEdit.setText(old_theme_name)
             if self.fileRenameForm.exec_():
                 new_theme_name = self.fileRenameForm.fileNameEdit.text()
                 if old_theme_name == new_theme_name:
                     return
-                if self.check_if_theme_exists(new_theme_name):
-                    old_theme_data = self.get_theme_data(old_theme_name)
+                if self.checkIfThemeExists(new_theme_name):
+                    old_theme_data = self.getThemeData(old_theme_name)
                     self.cloneThemeData(old_theme_data, new_theme_name)
-                    self.delete_theme(old_theme_name)
+                    self.deleteTheme(old_theme_name)
                     for plugin in self.plugin_manager.plugins:
                         if plugin.usesTheme(old_theme_name):
                             plugin.renameTheme(old_theme_name, new_theme_name)
                     self.renderer.update_theme(new_theme_name, old_theme_name)
-                    self.load_themes()
+                    self.loadThemes()
 
-    def on_copy_theme(self):
+    def onCopyTheme(self):
         """
         Copies an existing theme to a new name
         """
-        item = self.theme_list_widget.currentItem()
+        item = self.themeListWidget.currentItem()
         old_theme_name = item.data(QtCore.Qt.UserRole)
         self.fileRenameForm.fileNameEdit.setText(translate('OpenLP.ThemeManager',
             'Copy of %s', 'Copy of <theme name>') % old_theme_name)
         if self.fileRenameForm.exec_(True):
             new_theme_name = self.fileRenameForm.fileNameEdit.text()
-            if self.check_if_theme_exists(new_theme_name):
-                theme_data = self.get_theme_data(old_theme_name)
+            if self.checkIfThemeExists(new_theme_name):
+                theme_data = self.getThemeData(old_theme_name)
                 self.cloneThemeData(theme_data, new_theme_name)
 
     def cloneThemeData(self, theme_data, new_theme_name):
@@ -302,65 +295,65 @@
             save_from = theme_data.background_filename
         theme_data.theme_name = new_theme_name
         theme_data.extend_image_filename(self.path)
-        self.save_theme(theme_data, save_from, save_to)
-        self.load_themes()
+        self.saveTheme(theme_data, save_from, save_to)
+        self.loadThemes()
 
-    def on_edit_theme(self):
+    def onEditTheme(self):
         """
         Loads the settings for the theme that is to be edited and launches the
         theme editing form so the user can make their changes.
         """
-        if check_item_selected(self.theme_list_widget,
+        if check_item_selected(self.themeListWidget,
                 translate('OpenLP.ThemeManager', 'You must select a theme to edit.')):
-            item = self.theme_list_widget.currentItem()
-            theme = self.get_theme_data(item.data(QtCore.Qt.UserRole))
+            item = self.themeListWidget.currentItem()
+            theme = self.getThemeData(item.data(QtCore.Qt.UserRole))
             if theme.background_type == u'image':
                 self.oldBackgroundImage = theme.background_filename
             self.themeForm.theme = theme
             self.themeForm.exec_(True)
             self.oldBackgroundImage = None
             self.renderer.update_theme(theme.theme_name)
-            self.load_themes()
+            self.loadThemes()
 
-    def on_delete_theme(self):
+    def onDeleteTheme(self):
         """
         Delete a theme
         """
         if self._validate_theme_action(translate('OpenLP.ThemeManager', 'You must select a theme to delete.'),
                 translate('OpenLP.ThemeManager', 'Delete Confirmation'),
                 translate('OpenLP.ThemeManager', 'Delete %s theme?')):
-            item = self.theme_list_widget.currentItem()
+            item = self.themeListWidget.currentItem()
             theme = item.text()
-            row = self.theme_list_widget.row(item)
-            self.theme_list_widget.takeItem(row)
-            self.delete_theme(theme)
+            row = self.themeListWidget.row(item)
+            self.themeListWidget.takeItem(row)
+            self.deleteTheme(theme)
             self.renderer.update_theme(theme, only_delete=True)
             # As we do not reload the themes, push out the change. Reload the
             # list as the internal lists and events need to be triggered.
-            self._push_themes()
+            self._pushThemes()
 
-    def delete_theme(self, theme):
+    def deleteTheme(self, theme):
         """
         Delete a theme.
 
         ``theme``
             The theme to delete.
         """
-        self.theme_list.remove(theme)
+        self.themeList.remove(theme)
         thumb = u'%s.png' % theme
         delete_file(os.path.join(self.path, thumb))
         delete_file(os.path.join(self.thumbPath, thumb))
         try:
             encoding = get_filesystem_encoding()
             shutil.rmtree(os.path.join(self.path, theme).encode(encoding))
-        except OSError, shutil.Error:
+        except OSError:
             log.exception(u'Error deleting theme %s', theme)
 
-    def on_export_theme(self):
+    def onExportTheme(self):
         """
         Export the theme in a zip file
         """
-        item = self.theme_list_widget.currentItem()
+        item = self.themeListWidget.currentItem()
         if item is None:
             critical_error_message_box(message=translate('OpenLP.ThemeManager', 'You have not selected a theme.'))
             return
@@ -368,34 +361,34 @@
         path = QtGui.QFileDialog.getExistingDirectory(self,
             translate('OpenLP.ThemeManager', 'Save Theme - (%s)') % theme,
             Settings().value(self.settingsSection + u'/last directory export'))
-        self.application.set_busy_cursor()
+        Receiver.send_message(u'cursor_busy')
         if path:
             Settings().setValue(self.settingsSection + u'/last directory export', path)
             theme_path = os.path.join(path, theme + u'.otz')
-            theme_zip = None
+            # FIXME: Do not overwrite build-in.
+            zip = None
             try:
-                theme_zip = zipfile.ZipFile(theme_path, u'w')
+                zip = zipfile.ZipFile(theme_path, u'w')
                 source = os.path.join(self.path, theme)
                 for files in os.walk(source):
                     for name in files[2]:
-                        theme_zip.write(
+                        zip.write(
                             os.path.join(source, name).encode(u'utf-8'),
-                            os.path.join(theme, name).encode(u'utf-8')
-                        )
+                            os.path.join(theme, name).encode(u'utf-8'))
                 QtGui.QMessageBox.information(self,
                     translate('OpenLP.ThemeManager', 'Theme Exported'),
                     translate('OpenLP.ThemeManager', 'Your theme has been successfully exported.'))
             except (IOError, OSError):
                 log.exception(u'Export Theme Failed')
-                critical_error_message_box(translate('OpenLP.ThemeManager', 'Theme Export Failed'),
+                critical_error_message_box(
+                    translate('OpenLP.ThemeManager', 'Theme Export Failed'),
                     translate('OpenLP.ThemeManager', 'Your theme could not be exported due to an error.'))
             finally:
-                if theme_zip:
-                    theme_zip.close()
-        self.application.set_normal_cursor()
-
-
-    def on_import_theme(self):
+                if zip:
+                    zip.close()
+        Receiver.send_message(u'cursor_normal')
+
+    def onImportTheme(self):
         """
         Opens a file dialog to select the theme file(s) to import before
         attempting to extract OpenLP themes from those files. This process
@@ -408,36 +401,37 @@
         log.info(u'New Themes %s', unicode(files))
         if not files:
             return
-        self.application.set_busy_cursor()
-        for file_name in files:
-            Settings().setValue(self.settingsSection + u'/last directory import', unicode(file_name))
-            self.unzip_theme(file_name, self.path)
-        self.load_themes()
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_busy')
+        for file in files:
+            Settings().setValue(self.settingsSection + u'/last directory import', unicode(file))
+            self.unzipTheme(file, self.path)
+        self.loadThemes()
+        Receiver.send_message(u'cursor_normal')
 
-    def load_themes(self, first_time=False):
+    def loadThemes(self, firstTime=False):
         """
         Loads the theme lists and triggers updates accross the whole system
         using direct calls or core functions and events for the plugins.
         The plugins will call back in to get the real list if they want it.
         """
         log.debug(u'Load themes from dir')
-        self.theme_list = []
-        self.theme_list_widget.clear()
+        self.themeList = []
+        self.themeListWidget.clear()
         files = SettingsManager.get_files(self.settingsSection, u'.png')
-        if first_time:
-            self.first_time()
+        if firstTime:
+            self.firstTime()
             files = SettingsManager.get_files(self.settingsSection, u'.png')
             # No themes have been found so create one
             if not files:
                 theme = ThemeXML()
                 theme.theme_name = UiStrings().Default
-                self._write_theme(theme, None, None)
+                self._writeTheme(theme, None, None)
                 Settings().setValue(self.settingsSection + u'/global theme', theme.theme_name)
-                self.config_updated()
+                self.configUpdated()
                 files = SettingsManager.get_files(self.settingsSection, u'.png')
         # Sort the themes by its name considering language specific
-        files.sort(key=lambda file_name: unicode(file_name), cmp=locale_compare)
+        files.sort(key=lambda file_name: unicode(file_name),
+           cmp=locale_compare)
         # now process the file list of png files
         for name in files:
             # check to see file is in theme root directory
@@ -456,23 +450,23 @@
                     icon = create_thumb(theme, thumb)
                 item_name.setIcon(icon)
                 item_name.setData(QtCore.Qt.UserRole, text_name)
-                self.theme_list_widget.addItem(item_name)
-                self.theme_list.append(text_name)
-        self._push_themes()
+                self.themeListWidget.addItem(item_name)
+                self.themeList.append(text_name)
+        self._pushThemes()
 
-    def _push_themes(self):
+    def _pushThemes(self):
         """
         Notify listeners that the theme list has been updated
         """
-        Receiver.send_message(u'theme_update_list', self.get_themes())
+        Receiver.send_message(u'theme_update_list', self.getThemes())
 
-    def get_themes(self):
+    def getThemes(self):
         """
         Return the list of loaded themes
         """
-        return self.theme_list
+        return self.themeList
 
-    def get_theme_data(self, theme_name):
+    def getThemeData(self, theme_name):
         """
         Returns a theme object from an XML file
 
@@ -486,20 +480,18 @@
             log.debug(u'No theme data - using default theme')
             return ThemeXML()
         else:
-            return self._create_theme_fom_Xml(xml, self.path)
+            return self._createThemeFromXml(xml, self.path)
 
-    def over_write_message_box(self, theme_name):
-        """
-        Display a warning box to the user that a theme already exists
-        """
-        ret = QtGui.QMessageBox.question(self, translate('OpenLP.ThemeManager', 'Theme Already Exists'),
+    def overWriteMessageBox(self, theme_name):
+        ret = QtGui.QMessageBox.question(self,
+            translate('OpenLP.ThemeManager', 'Theme Already Exists'),
             translate('OpenLP.ThemeManager',
                 'Theme %s already exists. Do you want to replace it?').replace('%s', theme_name),
             QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No),
             QtGui.QMessageBox.No)
         return ret == QtGui.QMessageBox.Yes
 
-    def unzip_theme(self, file_name, directory):
+    def unzipTheme(self, file_name, dir):
         """
         Unzip the theme, remove the preview file if stored
         Generate a new preview file. Check the XML theme version and upgrade if
@@ -507,31 +499,32 @@
         """
         log.debug(u'Unzipping theme %s', file_name)
         file_name = unicode(file_name)
-        theme_zip = None
+        zip = None
         out_file = None
         file_xml = None
         abort_import = True
         try:
-            theme_zip = zipfile.ZipFile(file_name)
-            xml_file = filter(lambda name: os.path.splitext(name)[1].lower() == u'.xml', theme_zip.namelist())
+            zip = zipfile.ZipFile(file_name)
+            xml_file = filter(lambda name:
+                os.path.splitext(name)[1].lower() == u'.xml', zip.namelist())
             if len(xml_file) != 1:
                 log.exception(u'Theme contains "%s" XML files' % len(xml_file))
-                raise Exception('validation')
-            xml_tree = ElementTree(element=XML(theme_zip.read(xml_file[0]))).getroot()
+                raise Exception(u'validation')
+            xml_tree = ElementTree(element=XML(zip.read(xml_file[0]))).getroot()
             v1_background = xml_tree.find(u'BackgroundType')
             if v1_background is not None:
-                theme_name, file_xml, out_file, abort_import = self.unzip_version_122(
-                    directory, theme_zip, xml_file[0], xml_tree, v1_background, out_file)
+                theme_name, file_xml, out_file, abort_import = self.unzipVersion122(
+                    dir, zip, xml_file[0], xml_tree, v1_background, out_file)
             else:
                 theme_name = xml_tree.find(u'name').text.strip()
-                theme_folder = os.path.join(directory, theme_name)
+                theme_folder = os.path.join(dir, theme_name)
                 theme_exists = os.path.exists(theme_folder)
-                if theme_exists and not self.over_write_message_box(theme_name):
+                if theme_exists and not self.overWriteMessageBox(theme_name):
                     abort_import = True
                     return
                 else:
                     abort_import = False
-                for name in theme_zip.namelist():
+                for name in zip.namelist():
                     try:
                         uname = unicode(name, u'utf-8')
                     except UnicodeDecodeError:
@@ -543,15 +536,15 @@
                     if split_name[-1] == u'' or len(split_name) == 1:
                         # is directory or preview file
                         continue
-                    full_name = os.path.join(directory, uname)
+                    full_name = os.path.join(dir, uname)
                     check_directory_exists(os.path.dirname(full_name))
                     if os.path.splitext(uname)[1].lower() == u'.xml':
-                        file_xml = unicode(theme_zip.read(name), u'utf-8')
+                        file_xml = unicode(zip.read(name), u'utf-8')
                         out_file = open(full_name, u'w')
                         out_file.write(file_xml.encode(u'utf-8'))
                     else:
                         out_file = open(full_name, u'wb')
-                        out_file.write(theme_zip.read(name))
+                        out_file.write(zip.read(name))
                     out_file.close()
         except (IOError, zipfile.BadZipfile):
             log.exception(u'Importing theme from zip failed %s' % file_name)
@@ -564,38 +557,39 @@
                 raise
         finally:
             # Close the files, to be able to continue creating the theme.
-            if theme_zip:
-                theme_zip.close()
+            if zip:
+                zip.close()
             if out_file:
                 out_file.close()
             if not abort_import:
                 # As all files are closed, we can create the Theme.
                 if file_xml:
-                    theme = self._create_theme_fom_Xml(file_xml, self.path)
-                    self.generate_and_save_image(directory, theme_name, theme)
+                    theme = self._createThemeFromXml(file_xml, self.path)
+                    self.generateAndSaveImage(dir, theme_name, theme)
                 # Only show the error message, when IOError was not raised (in
                 # this case the error message has already been shown).
-                elif theme_zip is not None:
+                elif zip is not None:
                     critical_error_message_box(
                         translate('OpenLP.ThemeManager', 'Validation Error'),
                         translate('OpenLP.ThemeManager', 'File is not a valid theme.'))
                     log.exception(u'Theme file does not contain XML data %s' % file_name)
 
-    def unzip_version_122(self, dir_name, zip_file, xml_file, xml_tree, background, out_file):
+    def unzipVersion122(self, dir, zip, xml_file, xml_tree, background,
+        out_file):
         """
         Unzip openlp.org 1.2x theme file and upgrade the theme xml. When calling
         this method, please keep in mind, that some parameters are redundant.
         """
         theme_name = xml_tree.find(u'Name').text.strip()
         theme_name = self.badV1NameChars.sub(u'', theme_name)
-        theme_folder = os.path.join(dir_name, theme_name)
+        theme_folder = os.path.join(dir, theme_name)
         theme_exists = os.path.exists(theme_folder)
-        if theme_exists and not self.over_write_message_box(theme_name):
+        if theme_exists and not self.overWriteMessageBox(theme_name):
             return '', '', '', True
-        themedir = os.path.join(dir_name, theme_name)
+        themedir = os.path.join(dir, theme_name)
         check_directory_exists(themedir)
-        file_xml = unicode(zip_file.read(xml_file), u'utf-8')
-        file_xml = self._migrate_version_122(file_xml)
+        file_xml = unicode(zip.read(xml_file), u'utf-8')
+        file_xml = self._migrateVersion122(file_xml)
         out_file = open(os.path.join(themedir, theme_name + u'.xml'), u'w')
         out_file.write(file_xml.encode(u'utf-8'))
         out_file.close()
@@ -603,17 +597,18 @@
             image_name = xml_tree.find(u'BackgroundParameter1').text.strip()
             # image file has same extension and is in subfolder
             image_file = filter(lambda name: os.path.splitext(name)[1].lower()
-                == os.path.splitext(image_name)[1].lower() and name.find(r'/'), zip_file.namelist())
+                == os.path.splitext(image_name)[1].lower() and name.find(r'/'),
+                zip.namelist())
             if len(image_file) >= 1:
                 out_file = open(os.path.join(themedir, image_name), u'wb')
-                out_file.write(zip_file.read(image_file[0]))
+                out_file.write(zip.read(image_file[0]))
                 out_file.close()
             else:
                 log.exception(u'Theme file does not contain image file "%s"' % image_name.decode(u'utf-8', u'replace'))
                 raise Exception(u'validation')
         return theme_name, file_xml, out_file, False
 
-    def check_if_theme_exists(self, theme_name):
+    def checkIfThemeExists(self, theme_name):
         """
         Check if theme already exists and displays error message
 
@@ -628,25 +623,25 @@
             return False
         return True
 
-    def save_theme(self, theme, image_from, image_to):
+    def saveTheme(self, theme, image_from, image_to):
         """
         Called by thememaintenance Dialog to save the theme
         and to trigger the reload of the theme list
         """
-        self._write_theme(theme, image_from, image_to)
+        self._writeTheme(theme, image_from, image_to)
         if theme.background_type == BackgroundType.to_string(BackgroundType.Image):
-            self.image_manager.update_image_border(theme.background_filename,
+            self.image_manager.updateImageBorder(theme.background_filename,
                 ImageSource.Theme, QtGui.QColor(theme.background_border_color))
-            self.image_manager.process_updates()
+            self.image_manager.processUpdates()
 
-    def _write_theme(self, theme, image_from, image_to):
+    def _writeTheme(self, theme, image_from, image_to):
         """
         Writes the theme to the disk and handles the background image if
         necessary
         """
         name = theme.theme_name
         theme_pretty_xml = theme.extract_formatted_xml()
-        log.debug(u'save_theme %s %s', name, theme_pretty_xml.decode(u'utf-8'))
+        log.debug(u'saveTheme %s %s', name, theme_pretty_xml.decode(u'utf-8'))
         theme_dir = os.path.join(self.path, name)
         check_directory_exists(theme_dir)
         theme_file = os.path.join(theme_dir, name + u'.xml')
@@ -665,16 +660,13 @@
             try:
                 encoding = get_filesystem_encoding()
                 shutil.copyfile(unicode(image_from).encode(encoding), unicode(image_to).encode(encoding))
-            except IOError, shutil.Error:
+            except IOError:
                 log.exception(u'Failed to save theme image')
-        self.generate_and_save_image(self.path, name, theme)
+        self.generateAndSaveImage(self.path, name, theme)
 
-    def generate_and_save_image(self, directory, name, theme):
-        """
-        Generate and save a preview image
-        """
-        log.debug(u'generate_and_save_image %s %s', directory, name)
-        frame = self.generate_image(theme)
+    def generateAndSaveImage(self, dir, name, theme):
+        log.debug(u'generateAndSaveImage %s %s', dir, name)
+        frame = self.generateImage(theme)
         sample_path_name = os.path.join(self.path, name + u'.png')
         if os.path.exists(sample_path_name):
             os.unlink(sample_path_name)
@@ -683,18 +675,18 @@
         create_thumb(sample_path_name, thumb, False)
         log.debug(u'Theme image written to %s', sample_path_name)
 
-    def update_preview_images(self):
+    def updatePreviewImages(self):
         """
         Called to update the themes' preview images.
         """
-        self.main_window.displayProgressBar(len(self.theme_list))
-        for theme in self.theme_list:
+        self.main_window.displayProgressBar(len(self.themeList))
+        for theme in self.themeList:
             self.main_window.incrementProgressBar()
-            self.generate_and_save_image(self.path, theme, self.get_theme_data(theme))
+            self.generateAndSaveImage(self.path, theme, self.getThemeData(theme))
         self.main_window.finishedProgressBar()
-        self.load_themes()
+        self.loadThemes()
 
-    def generate_image(self, theme_data, forcePage=False):
+    def generateImage(self, theme_data, forcePage=False):
         """
         Call the renderer to build a Sample Image
 
@@ -704,21 +696,21 @@
         ``forcePage``
             Flag to tell message lines per page need to be generated.
         """
-        log.debug(u'generate_image \n%s ', theme_data)
+        log.debug(u'generateImage \n%s ', theme_data)
         return self.renderer.generate_preview(theme_data, forcePage)
 
-    def get_preview_image(self, theme):
+    def getPreviewImage(self, theme):
         """
         Return an image representing the look of the theme
 
         ``theme``
             The theme to return the image for
         """
-        log.debug(u'get_preview_image %s ', theme)
+        log.debug(u'getPreviewImage %s ', theme)
         image = os.path.join(self.path, theme + u'.png')
         return image
 
-    def _create_theme_fom_Xml(self, theme_xml, path):
+    def _createThemeFromXml(self, theme_xml, path):
         """
         Return a theme object using information parsed from XML
 
@@ -730,14 +722,15 @@
         theme.extend_image_filename(path)
         return theme
 
-    def _validate_theme_action(self, select_text, confirm_title, confirm_text, testPlugin=True, confirm=True):
+    def _validate_theme_action(self, select_text, confirm_title, confirm_text,
+        testPlugin=True, confirm=True):
         """
         Check to see if theme has been selected and the destructive action
         is allowed.
         """
         self.global_theme = Settings().value(self.settingsSection + u'/global theme')
-        if check_item_selected(self.theme_list_widget, select_text):
-            item = self.theme_list_widget.currentItem()
+        if check_item_selected(self.themeListWidget, select_text):
+            item = self.themeListWidget.currentItem()
             theme = item.text()
             # confirm deletion
             if confirm:
@@ -762,7 +755,7 @@
             return True
         return False
 
-    def _migrate_version_122(self, xml_data):
+    def _migrateVersion122(self, xml_data):
         """
         Convert the xml data from version 1 format to the current format.
 
@@ -850,13 +843,3 @@
         return self._main_window
 
     main_window = property(_get_main_window)
-
-    def _get_application(self):
-        """
-        Adds the openlp to the class dynamically
-        """
-        if not hasattr(self, u'_application'):
-            self._application = Registry().get(u'application')
-        return self._application
-
-    application = property(_get_application)
\ No newline at end of file

=== modified file 'openlp/core/ui/themestab.py'
--- openlp/core/ui/themestab.py	2013-02-02 21:16:42 +0000
+++ openlp/core/ui/themestab.py	2013-02-04 21:03:31 +0000
@@ -26,9 +26,7 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The Themes configuration tab
-"""
+
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import Receiver, Settings, SettingsTab, translate, UiStrings
@@ -40,18 +38,13 @@
     """
     ThemesTab is the theme settings tab in the settings dialog.
     """
-    def __init__(self, parent):
-        """
-        Constructor
-        """
+    def __init__(self, parent, mainwindow):
+        self.mainwindow = mainwindow
         generalTranslated = translate('OpenLP.ThemesTab', 'Themes')
         SettingsTab.__init__(self, parent, u'Themes', generalTranslated)
         self.iconPath = u':/themes/theme_new.png'
 
     def setupUi(self):
-        """
-        Set up the UI
-        """
         self.setObjectName(u'ThemesTab')
         SettingsTab.setupUi(self)
         self.GlobalGroupBox = QtGui.QGroupBox(self.leftColumn)
@@ -107,9 +100,6 @@
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList)
 
     def retranslateUi(self):
-        """
-        Translate the UI on the fly
-        """
         self.tabTitleVisible = UiStrings().Themes
         self.GlobalGroupBox.setTitle(translate('OpenLP.ThemesTab', 'Global Theme'))
         self.LevelGroupBox.setTitle(translate('OpenLP.ThemesTab', 'Theme Level'))
@@ -127,9 +117,6 @@
             'any themes associated with either the service or the songs.'))
 
     def load(self):
-        """
-        Load the theme settings into the tab
-        """
         settings = Settings()
         settings.beginGroup(self.settingsSection)
         self.theme_level = settings.value(u'theme level')
@@ -143,48 +130,30 @@
             self.SongLevelRadioButton.setChecked(True)
 
     def save(self):
-        """
-        Save the settings
-        """
         settings = Settings()
         settings.beginGroup(self.settingsSection)
         settings.setValue(u'theme level', self.theme_level)
         settings.setValue(u'global theme', self.global_theme)
         settings.endGroup()
-        self.renderer.set_global_theme(self.global_theme)
-        self.renderer.set_theme_level(self.theme_level)
+        self.mainwindow.renderer.set_global_theme(self.global_theme)
+        self.mainwindow.renderer.set_theme_level(self.theme_level)
         Receiver.send_message(u'theme_update_global', self.global_theme)
 
     def postSetUp(self):
-        """
-        After setting things up...
-        """
         Receiver.send_message(u'theme_update_global', self.global_theme)
 
     def onSongLevelButtonClicked(self):
-        """
-        Set the theme level
-        """
         self.theme_level = ThemeLevel.Song
 
     def onServiceLevelButtonClicked(self):
-        """
-        Set the theme level
-        """
         self.theme_level = ThemeLevel.Service
 
     def onGlobalLevelButtonClicked(self):
-        """
-        Set the theme level
-        """
         self.theme_level = ThemeLevel.Global
 
     def onDefaultComboBoxChanged(self, value):
-        """
-        Set the global default theme
-        """
         self.global_theme = self.DefaultComboBox.currentText()
-        self.renderer.set_global_theme(self.global_theme)
+        self.mainwindow.renderer.set_global_theme(self.global_theme)
         self.__previewGlobalTheme()
 
     def updateThemeList(self, theme_list):
@@ -201,8 +170,8 @@
         self.DefaultComboBox.clear()
         self.DefaultComboBox.addItems(theme_list)
         find_and_set_in_combo_box(self.DefaultComboBox, self.global_theme)
-        self.renderer.set_global_theme(self.global_theme)
-        self.renderer.set_theme_level(self.theme_level)
+        self.mainwindow.renderer.set_global_theme(self.global_theme)
+        self.mainwindow.renderer.set_theme_level(self.theme_level)
         if self.global_theme is not u'':
             self.__previewGlobalTheme()
 
@@ -210,7 +179,7 @@
         """
         Utility method to update the global theme preview image.
         """
-        image = self.theme_manager.get_preview_image(self.global_theme)
+        image = self.mainwindow.themeManagerContents.getPreviewImage(self.global_theme)
         preview = QtGui.QPixmap(unicode(image))
         if not preview.isNull():
             preview = preview.scaled(300, 255, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)

=== modified file 'openlp/core/ui/themewizard.py'
--- openlp/core/ui/themewizard.py	2013-02-01 21:34:23 +0000
+++ openlp/core/ui/themewizard.py	2013-02-04 21:03:31 +0000
@@ -26,24 +26,15 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-"""
-The Create/Edit theme wizard
-"""
+
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import translate, build_icon, UiStrings
 from openlp.core.lib.theme import HorizontalType, BackgroundType, BackgroundGradientType
 from openlp.core.lib.ui import add_welcome_page, create_valign_selection_widgets
 
-
 class Ui_ThemeWizard(object):
-    """
-    The Create/Edit theme wizard
-    """
     def setupUi(self, themeWizard):
-        """
-        Set up the UI
-        """
         themeWizard.setObjectName(u'OpenLP.ThemeWizard')
         themeWizard.setModal(True)
         themeWizard.setWizardStyle(QtGui.QWizard.ModernStyle)
@@ -381,7 +372,7 @@
             QtCore.SLOT(u'setDisabled(bool)'))
         QtCore.QObject.connect(self.mainPositionCheckBox, QtCore.SIGNAL(u'toggled(bool)'), self.mainHeightSpinBox,
             QtCore.SLOT(u'setDisabled(bool)'))
-        QtCore.QObject.connect(self.footerPositionCheckBox, QtCore.SIGNAL(u'toggled(bool)'), self.footerXSpinBox,
+        QtCore.QObject.connect(self.footerPositionCheckBox,QtCore.SIGNAL(u'toggled(bool)'), self.footerXSpinBox,
             QtCore.SLOT(u'setDisabled(bool)'))
         QtCore.QObject.connect(self.footerPositionCheckBox, QtCore.SIGNAL(u'toggled(bool)'), self.footerYSpinBox,
             QtCore.SLOT(u'setDisabled(bool)'))
@@ -391,11 +382,8 @@
             QtCore.SLOT(u'setDisabled(bool)'))
 
     def retranslateUi(self, themeWizard):
-        """
-        Translate the UI on the fly
-        """
         themeWizard.setWindowTitle(translate('OpenLP.ThemeWizard', 'Theme Wizard'))
-        self.titleLabel.setText(u'<span style="font-size:14pt; font-weight:600;">%s</span>' %
+        self.titleLabel.setText(u'<span style="font-size:14pt; font-weight:600;">%s</span>' % \
             translate('OpenLP.ThemeWizard', 'Welcome to the Theme Wizard'))
         self.informationLabel.setText(
             translate('OpenLP.ThemeWizard', 'This wizard will help you to '

=== modified file 'openlp/core/ui/wizard.py'
--- openlp/core/ui/wizard.py	2013-02-03 19:23:12 +0000
+++ openlp/core/ui/wizard.py	2013-02-04 21:03:31 +0000
@@ -34,12 +34,11 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import build_icon, Receiver, Registry, Settings, translate, UiStrings
+from openlp.core.lib import build_icon, Receiver, Settings, translate, UiStrings
 from openlp.core.lib.ui import add_welcome_page
 
 log = logging.getLogger(__name__)
 
-
 class WizardStrings(object):
     """
     Provide standard strings for wizards to use.
@@ -81,9 +80,6 @@
     and feel.
     """
     def __init__(self, parent, plugin, name, image):
-        """
-        Constructor
-        """
         QtGui.QWizard.__init__(self, parent)
         self.plugin = plugin
         self.setObjectName(name)
@@ -219,7 +215,7 @@
         self.progressLabel.setText(status_text)
         if increment > 0:
             self.progressBar.setValue(self.progressBar.value() + increment)
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
 
     def preWizard(self):
         """
@@ -237,7 +233,7 @@
         self.progressBar.setValue(self.progressBar.maximum())
         self.finishButton.setVisible(True)
         self.cancelButton.setVisible(False)
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
 
     def getFileName(self, title, editbox, setting_name, filters=u''):
         """
@@ -286,13 +282,3 @@
         if folder:
             editbox.setText(folder)
         Settings().setValue(self.plugin.settingsSection + u'/' + setting_name, folder)
-
-    def _get_application(self):
-        """
-        Adds the openlp to the class dynamically
-        """
-        if not hasattr(self, u'_application'):
-            self._application = Registry().get(u'application')
-        return self._application
-
-    application = property(_get_application)
\ No newline at end of file

=== modified file 'openlp/core/utils/__init__.py'
--- openlp/core/utils/__init__.py	2013-02-03 19:23:12 +0000
+++ openlp/core/utils/__init__.py	2013-02-04 21:03:31 +0000
@@ -29,7 +29,7 @@
 """
 The :mod:`openlp.core.utils` module provides the utility libraries for OpenLP.
 """
-from datetime import datetime
+from datetime import datetime, timedelta
 from distutils.version import LooseVersion
 import logging
 import locale
@@ -39,7 +39,7 @@
 import sys
 import urllib2
 
-from openlp.core.lib import Registry, Settings
+from openlp.core.lib import Settings
 
 from PyQt4 import QtGui, QtCore
 
@@ -61,12 +61,14 @@
 CONTROL_CHARS = re.compile(r'[\x00-\x1F\x7F-\x9F]', re.UNICODE)
 INVALID_FILE_CHARS = re.compile(r'[\\/:\*\?"<>\|\+\[\]%]', re.UNICODE)
 
-
 class VersionThread(QtCore.QThread):
     """
     A special Qt thread class to fetch the version of OpenLP from the website.
     This is threaded so that it doesn't affect the loading time of OpenLP.
     """
+    def __init__(self, parent):
+        QtCore.QThread.__init__(self, parent)
+
     def run(self):
         """
         Run the thread.
@@ -155,8 +157,7 @@
         return os.path.join(unicode(os.getenv(u'APPDATA'), encoding), u'openlp')
     elif sys.platform == u'darwin':
         if dir_type == AppLocation.DataDir:
-            return os.path.join(unicode(os.getenv(u'HOME'), encoding),
-                                u'Library', u'Application Support', u'openlp', u'Data')
+            return os.path.join(unicode(os.getenv(u'HOME'), encoding), u'Library', u'Application Support', u'openlp', u'Data')
         elif dir_type == AppLocation.LanguageDir:
             return os.path.split(openlp.__file__)[0]
         return os.path.join(unicode(os.getenv(u'HOME'), encoding), u'Library', u'Application Support', u'openlp')
@@ -424,7 +425,7 @@
     if not page:
         return None
     if update_openlp:
-        Registry().get(u'application').process_events()
+        Receiver.send_message(u'openlp_process_events')
     log.debug(page)
     return page
 
@@ -471,9 +472,6 @@
         The time to be used to add to the string.  This is a time object
     """
     def match_formatting(match):
-        """
-        Format the match
-        """
         return local_time.strftime(match.group())
     return re.sub('\%[a-zA-Z]', match_formatting, text)
 
@@ -490,14 +488,17 @@
     return locale.strcoll(string1.lower(), string2.lower())
 
 
-# For performance reasons provide direct reference to compare function without wrapping it in another function making
-# the string lowercase. This is needed for sorting songs.
+# For performance reasons provide direct reference to compare function
+# without wrapping it in another function making te string lowercase.
+# This is needed for sorting songs.
 locale_direct_compare = locale.strcoll
 
 
 from languagemanager import LanguageManager
 from actions import ActionList
 
-__all__ = [u'AppLocation', u'ActionList', u'LanguageManager', u'get_application_version', u'check_latest_version',
-    u'add_actions', u'get_filesystem_encoding', u'get_web_page', u'get_uno_command', u'get_uno_instance',
-    u'delete_file', u'clean_filename', u'format_time', u'locale_compare', u'locale_direct_compare']
+__all__ = [u'AppLocation', u'get_application_version', u'check_latest_version',
+    u'add_actions', u'get_filesystem_encoding', u'LanguageManager',
+    u'ActionList', u'get_web_page', u'get_uno_command', u'get_uno_instance',
+    u'delete_file', u'clean_filename', u'format_time', u'locale_compare',
+    u'locale_direct_compare']

=== modified file 'openlp/core/utils/actions.py'
--- openlp/core/utils/actions.py	2013-02-02 20:18:34 +0000
+++ openlp/core/utils/actions.py	2013-02-04 21:03:31 +0000
@@ -41,9 +41,6 @@
     category for the :class:`~openlp.core.utils.CategoryList` class.
     """
     def __init__(self, name, weight=0):
-        """
-        Constructor
-        """
         self.name = name
         self.weight = weight
         self.actions = CategoryActionList()
@@ -55,37 +52,22 @@
     list of actions within a category.
     """
     def __init__(self):
-        """
-        Constructor
-        """
         self.index = 0
         self.actions = []
 
     def __getitem__(self, key):
-        """
-        Implement the __getitem__() method to make this class a dictionary type
-        """
         for weight, action in self.actions:
             if action.text() == key:
                 return action
         raise KeyError(u'Action "%s" does not exist.' % key)
 
     def __contains__(self, item):
-        """
-        Implement the __contains__() method to make this class a dictionary type
-        """
         return self.has_key(item)
 
     def __len__(self):
-        """
-        Implement the __len__() method to make this class a dictionary type
-        """
         return len(self.actions)
 
     def __iter__(self):
-        """
-        Implement the __getitem__() method to make this class iterable
-        """
         return self
 
     def __next__(self):
@@ -106,34 +88,22 @@
         return self.__next__()
 
     def has_key(self, key):
-        """
-        Implement the has_key() method to make this class a dictionary type
-        """
         for weight, action in self.actions:
             if action.text() == key:
                 return True
         return False
 
     def append(self, name):
-        """
-        Append an action
-        """
         weight = 0
         if self.actions:
             weight = self.actions[-1][0] + 1
         self.add(name, weight)
 
     def add(self, action, weight=0):
-        """
-        Add an action.
-        """
         self.actions.append((weight, action))
         self.actions.sort(key=lambda act: act[0])
 
     def remove(self, remove_action):
-        """
-        Remove an action
-        """
         for action in self.actions:
             if action[1] == remove_action:
                 self.actions.remove(action)
@@ -148,37 +118,22 @@
     """
 
     def __init__(self):
-        """
-        Constructor
-        """
         self.index = 0
         self.categories = []
 
     def __getitem__(self, key):
-        """
-        Implement the __getitem__() method to make this class like a dictionary
-        """
         for category in self.categories:
             if category.name == key:
                 return category
         raise KeyError(u'Category "%s" does not exist.' % key)
 
     def __contains__(self, item):
-        """
-        Implement the __contains__() method to make this class like a dictionary
-        """
         return self.has_key(item)
 
     def __len__(self):
-        """
-        Implement the __len__() method to make this class like a dictionary
-        """
         return len(self.categories)
 
     def __iter__(self):
-        """
-        Implement the __iter__() method to make this class like a dictionary
-        """
         return self
 
     def __next__(self):
@@ -199,18 +154,12 @@
         return self.__next__()
 
     def has_key(self, key):
-        """
-        Implement the has_key() method to make this class like a dictionary
-        """
         for category in self.categories:
             if category.name == key:
                 return True
         return False
 
     def append(self, name, actions=None):
-        """
-        Append a category
-        """
         weight = 0
         if self.categories:
             weight = self.categories[-1].weight + 1
@@ -220,9 +169,6 @@
             self.add(name, weight)
 
     def add(self, name, weight=0, actions=None):
-        """
-        Add a category
-        """
         category = ActionCategory(name, weight)
         if actions:
             for action in actions:
@@ -234,9 +180,6 @@
         self.categories.sort(key=lambda cat: cat.weight)
 
     def remove(self, name):
-        """
-        Remove a category
-        """
         for category in self.categories:
             if category.name == name:
                 self.categories.remove(category)
@@ -253,16 +196,10 @@
     shortcut_map = {}
 
     def __init__(self):
-        """
-        Constructor
-        """
         self.categories = CategoryList()
 
     @staticmethod
     def get_instance():
-        """
-        Get the instance of this class.
-        """
         if ActionList.instance is None:
             ActionList.instance = ActionList()
         return ActionList.instance

=== modified file 'openlp/core/utils/languagemanager.py'
--- openlp/core/utils/languagemanager.py	2013-02-02 20:18:34 +0000
+++ openlp/core/utils/languagemanager.py	2013-02-04 21:03:31 +0000
@@ -27,7 +27,8 @@
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
 """
-The :mod:`languagemanager` module provides all the translation settings and language file loading for OpenLP.
+The :mod:`languagemanager` module provides all the translation settings and
+language file loading for OpenLP.
 """
 import logging
 import re
@@ -40,7 +41,6 @@
 
 log = logging.getLogger(__name__)
 
-
 class LanguageManager(object):
     """
     Helper for Language selection

=== modified file 'openlp/plugins/alerts/forms/alertform.py'
--- openlp/plugins/alerts/forms/alertform.py	2013-01-31 22:01:41 +0000
+++ openlp/plugins/alerts/forms/alertform.py	2013-02-04 21:03:31 +0000
@@ -34,7 +34,6 @@
 
 from alertdialog import Ui_AlertDialog
 
-
 class AlertForm(QtGui.QDialog, Ui_AlertDialog):
     """
     Provide UI for the alert system
@@ -46,7 +45,7 @@
         self.manager = plugin.manager
         self.plugin = plugin
         self.item_id = None
-        super(AlertForm, self).__init__(self.plugin.main_window)
+        QtGui.QDialog.__init__(self, self.plugin.main_window)
         self.setupUi(self)
         QtCore.QObject.connect(self.displayButton, QtCore.SIGNAL(u'clicked()'), self.onDisplayClicked)
         QtCore.QObject.connect(self.displayCloseButton, QtCore.SIGNAL(u'clicked()'), self.onDisplayCloseClicked)
@@ -58,9 +57,6 @@
         QtCore.QObject.connect(self.alertListWidget, QtCore.SIGNAL(u'currentRowChanged(int)'), self.onCurrentRowChanged)
 
     def exec_(self):
-        """
-        Execute the dialog and return the exit code.
-        """
         self.displayButton.setEnabled(False)
         self.displayCloseButton.setEnabled(False)
         self.alertTextEdit.setText(u'')
@@ -81,15 +77,9 @@
                 self.alertListWidget.setCurrentRow(self.alertListWidget.row(item_name))
 
     def onDisplayClicked(self):
-        """
-        Display the current alert text.
-        """
         self.triggerAlert(self.alertTextEdit.text())
 
     def onDisplayCloseClicked(self):
-        """
-        Close the alert preview.
-        """
         if self.triggerAlert(self.alertTextEdit.text()):
             self.close()
 
@@ -107,9 +97,6 @@
         self.alertTextEdit.setText(u'')
 
     def onNewClick(self):
-        """
-        Create a new alert.
-        """
         if not self.alertTextEdit.text():
             QtGui.QMessageBox.information(self,
                 translate('AlertsPlugin.AlertForm', 'New Alert'),

=== modified file 'openlp/plugins/bibles/bibleplugin.py'
--- openlp/plugins/bibles/bibleplugin.py	2013-02-03 14:40:48 +0000
+++ openlp/plugins/bibles/bibleplugin.py	2013-02-04 21:03:31 +0000
@@ -102,11 +102,11 @@
         #action_list.remove_action(self.exportBibleItem, UiStrings().Export)
         self.exportBibleItem.setVisible(False)
 
-    def app_startup(self):
+    def appStartup(self):
         """
         Perform tasks on application startup
         """
-        Plugin.app_startup(self)
+        Plugin.appStartup(self)
         if self.manager.old_bible_databases:
             if QtGui.QMessageBox.information(self.main_window,
                 translate('OpenLP', 'Information'),

=== modified file 'openlp/plugins/bibles/forms/bibleimportform.py'
--- openlp/plugins/bibles/forms/bibleimportform.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/bibles/forms/bibleimportform.py	2013-02-04 21:03:31 +0000
@@ -34,7 +34,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import translate, Settings, UiStrings
+from openlp.core.lib import Receiver, translate, Settings, UiStrings
 from openlp.core.lib.db import delete_database
 from openlp.core.lib.ui import critical_error_message_box
 from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
@@ -578,7 +578,7 @@
             self.progressLabel.setText(translate('BiblesPlugin.ImportWizardForm', 'Registering Bible...'))
         else:
             self.progressLabel.setText(WizardStrings.StartingImport)
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
 
     def performWizard(self):
         """

=== modified file 'openlp/plugins/bibles/forms/bibleupgradeform.py'
--- openlp/plugins/bibles/forms/bibleupgradeform.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/bibles/forms/bibleupgradeform.py	2013-02-04 21:03:31 +0000
@@ -335,7 +335,7 @@
         """
         OpenLPWizard.preWizard(self)
         self.progressLabel.setText(translate('BiblesPlugin.UpgradeWizardForm', 'Starting upgrade...'))
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
 
     def performWizard(self):
         """
@@ -465,7 +465,7 @@
                             self.newbibles[number].create_verse(db_book.id,
                                 int(verse[u'chapter']),
                                 int(verse[u'verse']), unicode(verse[u'text']))
-                            self.application.process_events()
+                            Receiver.send_message(u'openlp_process_events')
                         self.newbibles[number].session.commit()
             else:
                 language_id = self.newbibles[number].get_object(BibleMeta, u'language_id')
@@ -511,7 +511,7 @@
                         self.newbibles[number].create_verse(db_book.id,
                             int(verse[u'chapter']),
                             int(verse[u'verse']), unicode(verse[u'text']))
-                        self.application.process_events()
+                        Receiver.send_message(u'openlp_process_events')
                     self.newbibles[number].session.commit()
             if not self.success.get(number, True):
                 self.incrementProgressBar(translate('BiblesPlugin.UpgradeWizardForm',

=== modified file 'openlp/plugins/bibles/forms/editbibleform.py'
--- openlp/plugins/bibles/forms/editbibleform.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/bibles/forms/editbibleform.py	2013-02-04 21:03:31 +0000
@@ -32,7 +32,7 @@
 
 from PyQt4 import QtGui
 
-from openlp.core.lib import Registry, translate, UiStrings
+from openlp.core.lib import Receiver, translate, UiStrings
 from openlp.core.lib.ui import critical_error_message_box
 from editbibledialog import Ui_EditBibleDialog
 from openlp.plugins.bibles.lib import BibleStrings
@@ -122,7 +122,8 @@
                     if book.name != custom_names[abbr]:
                         if not self.validateBook(custom_names[abbr], abbr):
                             return
-        self.application.set_busy_cursor()
+        Receiver.send_message(u'openlp_process_events')
+        Receiver.send_message(u'cursor_busy')
         self.manager.save_meta_data(self.bible, version, copyright, permissions, book_name_language)
         if not self.webbible:
             for abbr, book in self.books.iteritems():
@@ -131,7 +132,7 @@
                         book.name = custom_names[abbr]
                         self.manager.update_book(self.bible, book)
         self.bible = None
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
         QtGui.QDialog.accept(self)
 
     def validateMeta(self, name, copyright):
@@ -188,13 +189,3 @@
                             % new_book_name)
                     return False
         return True
-
-    def _get_application(self):
-        """
-        Adds the openlp to the class dynamically
-        """
-        if not hasattr(self, u'_application'):
-            self._application = Registry().get(u'application')
-        return self._application
-
-    application = property(_get_application)

=== modified file 'openlp/plugins/bibles/lib/csvbible.py'
--- openlp/plugins/bibles/lib/csvbible.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/bibles/lib/csvbible.py	2013-02-04 21:03:31 +0000
@@ -118,7 +118,7 @@
                 book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
                 self.create_book(unicode(line[2], details['encoding']), book_ref_id, book_details[u'testament_id'])
                 book_list[int(line[0])] = unicode(line[2], details['encoding'])
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
         except (IOError, IndexError):
             log.exception(u'Loading books from file failed')
             success = False
@@ -157,7 +157,7 @@
                     verse_text = unicode(line[3], u'cp1252')
                 self.create_verse(book.id, line[1], line[2], verse_text)
             self.wizard.incrementProgressBar(translate('BiblesPlugin.CSVBible', 'Importing verses... done.'))
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
             self.session.commit()
         except IOError:
             log.exception(u'Loading verses from file failed')

=== modified file 'openlp/plugins/bibles/lib/db.py'
--- openlp/plugins/bibles/lib/db.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/bibles/lib/db.py	2013-02-04 21:03:31 +0000
@@ -38,7 +38,7 @@
 from sqlalchemy.orm import class_mapper, mapper, relation
 from sqlalchemy.orm.exc import UnmappedClassError
 
-from openlp.core.lib import Receiver, Registry, translate
+from openlp.core.lib import Receiver, translate
 from openlp.core.lib.db import BaseModel, init_db, Manager
 from openlp.core.lib.ui import critical_error_message_box
 from openlp.core.utils import AppLocation, clean_filename
@@ -549,16 +549,6 @@
         verses = self.session.query(Verse).all()
         log.debug(verses)
 
-    def _get_application(self):
-        """
-        Adds the openlp to the class dynamically
-        """
-        if not hasattr(self, u'_application'):
-            self._application = Registry().get(u'application')
-        return self._application
-
-    application = property(_get_application)
-
 
 class BiblesResourcesDB(QtCore.QObject, Manager):
     """

=== modified file 'openlp/plugins/bibles/lib/http.py'
--- openlp/plugins/bibles/lib/http.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/bibles/lib/http.py	2013-02-04 21:03:31 +0000
@@ -38,7 +38,7 @@
 
 from BeautifulSoup import BeautifulSoup, NavigableString, Tag
 
-from openlp.core.lib import Receiver, Registry,translate
+from openlp.core.lib import Receiver, translate
 from openlp.core.lib.ui import critical_error_message_box
 from openlp.core.utils import get_web_page
 from openlp.plugins.bibles.lib import SearchResults
@@ -164,7 +164,7 @@
                     if len(verse_parts) > 1:
                         verse = int(verse_parts[0])
                 except TypeError:
-                    log.warn(u'Illegal verse number: %s', unicode(verse))
+                    log.warn(u'Illegal verse number: %s', unicode(raw_verse_num))
                 verses.append((verse, text))
         verse_list = {}
         for verse, text in verses[::-1]:
@@ -235,10 +235,9 @@
         soup = get_soup_for_bible_ref(
             u'http://www.biblegateway.com/passage/?%s' % url_params,
             pre_parse_regex=r'<meta name.*?/>', pre_parse_substitute='', cleaner=cleaner)
-        self.application.process_events()
         if not soup:
             return None
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
         div = soup.find('div', 'result-text-style-normal')
         self._clean_soup(div)
         span_list = div.findAll('span', 'text')
@@ -282,7 +281,7 @@
         if not soup:
             send_error_message(u'parse')
             return None
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
         content = soup.find(u'table', u'infotable')
         if content:
             content = content.findAll(u'tr')
@@ -330,7 +329,7 @@
         soup = get_soup_for_bible_ref(chapter_url, header)
         if not soup:
             return None
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
         content = soup.find(u'div', u'content')
         if not content:
             log.error(u'No verses found in the Bibleserver response.')
@@ -340,7 +339,7 @@
         verse_number = re.compile(r'v(\d{1,2})(\d{3})(\d{3}) verse.*')
         verses = {}
         for verse in content:
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
             versenumber = int(verse_number.sub(r'\3', verse[u'class']))
             verses[versenumber] = verse.contents[1].rstrip(u'\n')
         return SearchResults(book_name, chapter, verses)
@@ -403,7 +402,7 @@
         soup = get_soup_for_bible_ref(chapter_url)
         if not soup:
             return None
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
         html_verses = soup.findAll(u'span', u'versetext')
         if not html_verses:
             log.error(u'No verses found in the CrossWalk response.')
@@ -413,25 +412,27 @@
         reduce_spaces = re.compile(r'[ ]{2,}')
         fix_punctuation = re.compile(r'[ ]+([.,;])')
         for verse in html_verses:
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
             verse_number = int(verse.contents[0].contents[0])
             verse_text = u''
             for part in verse.contents:
-                self.application.process_events()
+                Receiver.send_message(u'openlp_process_events')
                 if isinstance(part, NavigableString):
                     verse_text = verse_text + part
                 elif part and part.attrMap and \
-                        (part.attrMap[u'class'] == u'WordsOfChrist' or part.attrMap[u'class'] == u'strongs'):
+                    (part.attrMap[u'class'] == u'WordsOfChrist' or \
+                    part.attrMap[u'class'] == u'strongs'):
                     for subpart in part.contents:
-                        self.application.process_events()
+                        Receiver.send_message(u'openlp_process_events')
                         if isinstance(subpart, NavigableString):
                             verse_text = verse_text + subpart
-                        elif subpart and subpart.attrMap and subpart.attrMap[u'class'] == u'strongs':
+                        elif subpart and subpart.attrMap and \
+                            subpart.attrMap[u'class'] == u'strongs':
                             for subsub in subpart.contents:
-                                self.application.process_events()
+                                Receiver.send_message(u'openlp_process_events')
                                 if isinstance(subsub, NavigableString):
                                     verse_text = verse_text + subsub
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
             # Fix up leading and trailing spaces, multiple spaces, and spaces
             # between text and , and .
             verse_text = verse_text.strip(u'\n\r\t ')
@@ -597,7 +598,7 @@
                 return []
             book = db_book.name
             if BibleDB.get_verse_count(self, book_id, reference[1]) == 0:
-                self.application.set_busy_cursor()
+                Receiver.send_message(u'cursor_busy')
                 search_results = self.get_chapter(book, reference[1])
                 if search_results and search_results.has_verselist():
                     ## We have found a book of the bible lets check to see
@@ -605,14 +606,14 @@
                     ## we get a correct book. For example it is possible
                     ## to request ac and get Acts back.
                     book_name = search_results.book
-                    self.application.process_events()
+                    Receiver.send_message(u'openlp_process_events')
                     # Check to see if book/chapter exists.
                     db_book = self.get_book(book_name)
                     self.create_chapter(db_book.id, search_results.chapter,
                         search_results.verselist)
-                    self.application.process_events()
-                self.application.set_normal_cursor()
-            self.application.process_events()
+                    Receiver.send_message(u'openlp_process_events')
+                Receiver.send_message(u'cursor_normal')
+            Receiver.send_message(u'openlp_process_events')
         return BibleDB.get_verses(self, reference_list, show_error)
 
     def get_chapter(self, book, chapter):
@@ -659,16 +660,6 @@
         log.debug(u'HTTPBible.get_verse_count("%s", %s)', book_id, chapter)
         return BiblesResourcesDB.get_verse_count(book_id, chapter)
 
-    def _get_application(self):
-        """
-        Adds the openlp to the class dynamically
-        """
-        if not hasattr(self, u'_application'):
-            self._application = Registry().get(u'application')
-        return self._application
-
-    application = property(_get_application)
-
 def get_soup_for_bible_ref(reference_url, header=None, pre_parse_regex=None,
     pre_parse_substitute=None, cleaner=None):
     """
@@ -710,7 +701,7 @@
     if not soup:
         send_error_message(u'parse')
         return None
-    Registry().get(u'application').process_events()
+    Receiver.send_message(u'openlp_process_events')
     return soup
 
 def send_error_message(error_type):

=== modified file 'openlp/plugins/bibles/lib/mediaitem.py'
--- openlp/plugins/bibles/lib/mediaitem.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/bibles/lib/mediaitem.py	2013-02-04 21:03:31 +0000
@@ -349,7 +349,7 @@
         self.loadBibles()
         # If called from first time wizard re-run, process any new bibles.
         if process:
-            self.plugin.app_startup()
+            self.plugin.appStartup()
         self.updateAutoCompleter()
 
     def initialiseAdvancedBible(self, bible, last_book_id=None):
@@ -614,7 +614,7 @@
         """
         log.debug(u'Advanced Search Button clicked')
         self.advancedSearchButton.setEnabled(False)
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
         bible = self.advancedVersionComboBox.currentText()
         second_bible = self.advancedSecondComboBox.currentText()
         book = self.advancedBookComboBox.currentText()
@@ -628,7 +628,7 @@
         verse_range = chapter_from + verse_separator + verse_from + range_separator + chapter_to + \
             verse_separator + verse_to
         versetext = u'%s %s' % (book, verse_range)
-        self.application.set_busy_cursor()
+        Receiver.send_message(u'cursor_busy')
         self.search_results = self.plugin.manager.get_verses(bible, versetext, book_ref_id)
         if second_bible:
             self.second_search_results = self.plugin.manager.get_verses(second_bible, versetext, book_ref_id)
@@ -640,7 +640,8 @@
             self.displayResults(bible, second_bible)
         self.advancedSearchButton.setEnabled(True)
         self.checkSearchResult()
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
+        Receiver.send_message(u'openlp_process_events')
 
     def onQuickSearchButton(self):
         """
@@ -649,7 +650,7 @@
         """
         log.debug(u'Quick Search Button clicked')
         self.quickSearchButton.setEnabled(False)
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
         bible = self.quickVersionComboBox.currentText()
         second_bible = self.quickSecondComboBox.currentText()
         text = self.quickSearchEdit.text()
@@ -661,7 +662,7 @@
                     self.search_results[0].book.book_reference_id)
         else:
             # We are doing a 'Text Search'.
-            self.application.set_busy_cursor()
+            Receiver.send_message(u'cursor_busy')
             bibles = self.plugin.manager.get_bibles()
             self.search_results = self.plugin.manager.verse_search(bible, second_bible, text)
             if second_bible and self.search_results:
@@ -696,7 +697,8 @@
             self.displayResults(bible, second_bible)
         self.quickSearchButton.setEnabled(True)
         self.checkSearchResult()
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
+        Receiver.send_message(u'openlp_process_events')
 
     def displayResults(self, bible, second_bible=u''):
         """

=== modified file 'openlp/plugins/bibles/lib/openlp1.py'
--- openlp/plugins/bibles/lib/openlp1.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/bibles/lib/openlp1.py	2013-02-04 21:03:31 +0000
@@ -108,7 +108,7 @@
                 verse_number = int(verse[1])
                 text = unicode(verse[2], u'cp1252')
                 self.create_verse(db_book.id, chapter, verse_number, text)
-                self.application.process_events()
+                Receiver.send_message(u'openlp_process_events')
             self.session.commit()
         connection.close()
         return True

=== modified file 'openlp/plugins/bibles/lib/opensong.py'
--- openlp/plugins/bibles/lib/opensong.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/bibles/lib/opensong.py	2013-02-04 21:03:31 +0000
@@ -30,7 +30,7 @@
 import logging
 from lxml import etree, objectify
 
-from openlp.core.lib import translate
+from openlp.core.lib import Receiver, translate
 from openlp.core.lib.ui import critical_error_message_box
 from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB
 
@@ -129,7 +129,7 @@
                     self.wizard.incrementProgressBar(translate('BiblesPlugin.Opensong', 'Importing %s %s...',
                         'Importing <book name> <chapter>...')) % (db_book.name, chapter_number)
                 self.session.commit()
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
         except etree.XMLSyntaxError as inst:
             critical_error_message_box(message=translate('BiblesPlugin.OpenSongImport',
                 'Incorrect Bible file type supplied. OpenSong Bibles may be '

=== modified file 'openlp/plugins/bibles/lib/osis.py'
--- openlp/plugins/bibles/lib/osis.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/bibles/lib/osis.py	2013-02-04 21:03:31 +0000
@@ -33,7 +33,7 @@
 import codecs
 import re
 
-from openlp.core.lib import translate
+from openlp.core.lib import Receiver, translate
 from openlp.core.utils import AppLocation
 from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB
 
@@ -182,7 +182,7 @@
                         .replace(u'</div>', u'').replace(u'</w>', u'')
                     verse_text = self.spaces_regex.sub(u' ', verse_text)
                     self.create_verse(db_book.id, chapter, verse, verse_text)
-                    self.application.process_events()
+                    Receiver.send_message(u'openlp_process_events')
             self.session.commit()
             if match_count == 0:
                 success = False

=== modified file 'openlp/plugins/custom/forms/editcustomform.py'
--- openlp/plugins/custom/forms/editcustomform.py	2013-01-31 22:01:41 +0000
+++ openlp/plugins/custom/forms/editcustomform.py	2013-02-04 21:03:31 +0000
@@ -41,42 +41,35 @@
 
 log = logging.getLogger(__name__)
 
-
 class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog):
     """
     Class documentation goes here.
     """
     log.info(u'Custom Editor loaded')
-
     def __init__(self, mediaitem, parent, manager):
         """
         Constructor
         """
-        super(EditCustomForm, self).__init__(parent)
+        QtGui.QDialog.__init__(self, parent)
         self.manager = manager
         self.mediaitem = mediaitem
         self.setupUi(self)
         # Create other objects and forms.
         self.editSlideForm = EditCustomSlideForm(self)
         # Connecting signals and slots
-        self.previewButton.clicked.connect(self.on_preview_button_clicked)
-        self.addButton.clicked.connect(self.on_add_button_clicked)
-        self.editButton.clicked.connect(self.on_edit_button_clicked)
-        self.editAllButton.clicked.connect(self.on_edit_all_button_clicked)
-        self.slideListView.currentRowChanged.connect(self.on_current_row_changed)
-        self.slideListView.doubleClicked.connect(self.on_edit_button_clicked)
+        QtCore.QObject.connect(self.previewButton, QtCore.SIGNAL(u'clicked()'), self.onPreviewButtonClicked)
+        QtCore.QObject.connect(self.addButton, QtCore.SIGNAL(u'clicked()'), self.onAddButtonClicked)
+        QtCore.QObject.connect(self.editButton, QtCore.SIGNAL(u'clicked()'), self.onEditButtonClicked)
+        QtCore.QObject.connect(self.editAllButton, QtCore.SIGNAL(u'clicked()'), self.onEditAllButtonClicked)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_list'), self.loadThemes)
-
-    def loadThemes(self, theme_list):
-        """
-        Load a list of themes into the themes combo box.
-
-        ``theme_list``
-            The list of themes to load.
-        """
+        QtCore.QObject.connect(self.slideListView, QtCore.SIGNAL(u'currentRowChanged(int)'), self.onCurrentRowChanged)
+        QtCore.QObject.connect(self.slideListView, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'),
+            self.onEditButtonClicked)
+
+    def loadThemes(self, themelist):
         self.themeComboBox.clear()
         self.themeComboBox.addItem(u'')
-        self.themeComboBox.addItems(theme_list)
+        self.themeComboBox.addItems(themelist)
 
     def loadCustom(self, id, preview=False):
         """
@@ -110,9 +103,6 @@
         self.previewButton.setVisible(preview)
 
     def accept(self):
-        """
-        Override the QDialog method to check if the custom slide has been saved before closing the dialog.
-        """
         log.debug(u'accept')
         if self.saveCustom():
             QtGui.QDialog.accept(self)
@@ -135,9 +125,6 @@
         return success
 
     def onUpButtonClicked(self):
-        """
-        Move a slide up in the list when the "Up" button is clicked.
-        """
         selectedRow = self.slideListView.currentRow()
         if selectedRow != 0:
             qw = self.slideListView.takeItem(selectedRow)
@@ -145,9 +132,6 @@
             self.slideListView.setCurrentRow(selectedRow - 1)
 
     def onDownButtonClicked(self):
-        """
-        Move a slide down in the list when the "Down" button is clicked.
-        """
         selectedRow = self.slideListView.currentRow()
         # zero base arrays
         if selectedRow != self.slideListView.count() - 1:
@@ -155,23 +139,17 @@
             self.slideListView.insertItem(selectedRow + 1, qw)
             self.slideListView.setCurrentRow(selectedRow + 1)
 
-    def on_add_button_clicked(self):
-        """
-        Add a new blank slide.
-        """
+    def onAddButtonClicked(self):
         self.editSlideForm.setText(u'')
         if self.editSlideForm.exec_():
             self.slideListView.addItems(self.editSlideForm.getText())
 
-    def on_edit_button_clicked(self):
-        """
-        Edit the currently selected slide.
-        """
+    def onEditButtonClicked(self):
         self.editSlideForm.setText(self.slideListView.currentItem().text())
         if self.editSlideForm.exec_():
             self.updateSlideList(self.editSlideForm.getText())
 
-    def on_edit_all_button_clicked(self):
+    def onEditAllButtonClicked(self):
         """
         Edits all slides.
         """
@@ -185,7 +163,7 @@
         if self.editSlideForm.exec_():
             self.updateSlideList(self.editSlideForm.getText(), True)
 
-    def on_preview_button_clicked(self):
+    def onPreviewButtonClicked(self):
         """
         Save the custom item and preview it.
         """
@@ -225,9 +203,9 @@
         Removes the current row from the list.
         """
         self.slideListView.takeItem(self.slideListView.currentRow())
-        self.on_current_row_changed(self.slideListView.currentRow())
+        self.onCurrentRowChanged(self.slideListView.currentRow())
 
-    def on_current_row_changed(self, row):
+    def onCurrentRowChanged(self, row):
         """
         Called when the *slideListView*'s current row has been changed. This
         enables or disables buttons which require an slide to act on.

=== modified file 'openlp/plugins/custom/forms/editcustomslideform.py'
--- openlp/plugins/custom/forms/editcustomslideform.py	2013-02-03 14:40:48 +0000
+++ openlp/plugins/custom/forms/editcustomslideform.py	2013-02-04 21:03:31 +0000
@@ -1,4 +1,3 @@
-#lint:disable
 # -*- coding: utf-8 -*-
 # vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
 
@@ -36,18 +35,16 @@
 
 log = logging.getLogger(__name__)
 
-
 class EditCustomSlideForm(QtGui.QDialog, Ui_CustomSlideEditDialog):
     """
     Class documentation goes here.
     """
     log.info(u'Custom Verse Editor loaded')
-
     def __init__(self, parent=None):
         """
         Constructor
         """
-        super(EditCustomSlideForm, self).__init__(parent)
+        QtGui.QDialog.__init__(self, parent)
         self.setupUi(self)
         # Connecting signals and slots
         QtCore.QObject.connect(self.insertButton, QtCore.SIGNAL(u'clicked()'), self.onInsertButtonClicked)
@@ -91,10 +88,9 @@
         """
         full_text = self.slideTextEdit.toPlainText()
         position = self.slideTextEdit.textCursor().position()
-        if position and full_text[position - 1] != u'\n':
-            text = u'\n' + text
-        if position == len(full_text) or full_text[position] != u'\n':
-            text += u'\n'
+        if position and full_text[position-1] != u'\n':
+             text = u'\n' + text
+        if position ==  len(full_text) or full_text[position] != u'\n':
+             text += u'\n'
         self.slideTextEdit.insertPlainText(text)
 
-#lint:enable

=== modified file 'openlp/plugins/custom/lib/mediaitem.py'
--- openlp/plugins/custom/lib/mediaitem.py	2013-02-03 09:07:31 +0000
+++ openlp/plugins/custom/lib/mediaitem.py	2013-02-04 21:03:31 +0000
@@ -250,7 +250,7 @@
             and_(CustomSlide.title == item.title, CustomSlide.theme_name == item.theme,
                 CustomSlide.credits == item.raw_footer[0][len(item.title) + 1:]))
         if custom:
-            self.service_manager.service_item_update(custom.id, item.unique_identifier)
+            Receiver.send_message(u'service_item_update', u'%s:%s:%s' % (custom.id, item.unique_identifier, False))
         else:
             if self.add_custom_from_service:
                 self.create_from_service_item(item)

=== modified file 'openlp/plugins/images/imageplugin.py'
--- openlp/plugins/images/imageplugin.py	2013-02-02 20:54:34 +0000
+++ openlp/plugins/images/imageplugin.py	2013-02-04 21:03:31 +0000
@@ -98,4 +98,4 @@
         last part of saving the config.
         """
         background = QtGui.QColor(Settings().value(self.settingsSection + u'/background color'))
-        self.liveController.imageManager.update_images_border(ImageSource.ImagePlugin, background)
+        self.liveController.imageManager.updateImagesBorder(ImageSource.ImagePlugin, background)

=== modified file 'openlp/plugins/images/lib/mediaitem.py'
--- openlp/plugins/images/lib/mediaitem.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/images/lib/mediaitem.py	2013-02-04 21:03:31 +0000
@@ -99,7 +99,7 @@
         if check_item_selected(self.listView, translate('ImagePlugin.MediaItem','You must select an image to delete.')):
             row_list = [item.row() for item in self.listView.selectedIndexes()]
             row_list.sort(reverse=True)
-            self.application.set_busy_cursor()
+            Receiver.send_message(u'cursor_busy')
             self.main_window.displayProgressBar(len(row_list))
             for row in row_list:
                 text = self.listView.item(row)
@@ -109,12 +109,12 @@
                 self.main_window.incrementProgressBar()
             SettingsManager.setValue(self.settingsSection + u'/images files', self.getFileList())
             self.main_window.finishedProgressBar()
-            self.application.set_normal_cursor()
+            Receiver.send_message(u'cursor_normal')
         self.listView.blockSignals(False)
 
     def loadList(self, images, initialLoad=False):
-        self.application.set_busy_cursor()
         if not initialLoad:
+            Receiver.send_message(u'cursor_busy')
             self.main_window.displayProgressBar(len(images))
         # Sort the images by its filename considering language specific
         # characters.
@@ -138,7 +138,7 @@
                 self.main_window.incrementProgressBar()
         if not initialLoad:
             self.main_window.finishedProgressBar()
-        self.application.set_normal_cursor()
+            Receiver.send_message(u'cursor_normal')
 
     def generateSlideData(self, service_item, item=None, xmlVersion=False,
         remote=False, context=ServiceItemContext.Service):

=== modified file 'openlp/plugins/media/mediaplugin.py'
--- openlp/plugins/media/mediaplugin.py	2013-02-03 14:40:48 +0000
+++ openlp/plugins/media/mediaplugin.py	2013-02-04 21:03:31 +0000
@@ -118,13 +118,13 @@
         """
         return self.media_controller.get_media_display_html()
 
-    def app_startup(self):
+    def appStartup(self):
         """
         Do a couple of things when the app starts up. In this particular case
         we want to check if we have the old "Use Phonon" setting, and convert
         it to "enable Phonon" and "make it the first one in the list".
         """
-        Plugin.app_startup(self)
+        Plugin.appStartup(self)
         settings = Settings()
         settings.beginGroup(self.settingsSection)
         if settings.contains(u'use phonon'):

=== modified file 'openlp/plugins/presentations/lib/mediaitem.py'
--- openlp/plugins/presentations/lib/mediaitem.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/presentations/lib/mediaitem.py	2013-02-04 21:03:31 +0000
@@ -150,8 +150,9 @@
         """
         currlist = self.getFileList()
         titles = [os.path.split(file)[1] for file in currlist]
-        self.application.set_busy_cursor()
+        Receiver.send_message(u'cursor_busy')
         if not initialLoad:
+            Receiver.send_message(u'cursor_busy')
             self.main_window.displayProgressBar(len(files))
         # Sort the presentations by its filename considering language specific characters.
         files.sort(cmp=locale_compare,
@@ -205,9 +206,10 @@
                 item_name.setIcon(icon)
                 item_name.setToolTip(file)
                 self.listView.addItem(item_name)
+        Receiver.send_message(u'cursor_normal')
         if not initialLoad:
             self.main_window.finishedProgressBar()
-        self.application.set_normal_cursor()
+            Receiver.send_message(u'cursor_normal')
 
     def onDeleteClick(self):
         """
@@ -217,7 +219,7 @@
             items = self.listView.selectedIndexes()
             row_list = [item.row() for item in items]
             row_list.sort(reverse=True)
-            self.application.set_busy_cursor()
+            Receiver.send_message(u'cursor_busy')
             self.main_window.displayProgressBar(len(row_list))
             for item in items:
                 filepath = unicode(item.data(QtCore.Qt.UserRole))
@@ -227,7 +229,7 @@
                     doc.close_presentation()
                 self.main_window.incrementProgressBar()
             self.main_window.finishedProgressBar()
-            self.application.set_busy_cursor()
+            Receiver.send_message(u'cursor_normal')
             for row in row_list:
                 self.listView.takeItem(row)
             Settings().setValue(self.settingsSection + u'/presentations files', self.getFileList())

=== modified file 'openlp/plugins/presentations/lib/pptviewcontroller.py'
--- openlp/plugins/presentations/lib/pptviewcontroller.py	2013-02-02 14:09:22 +0000
+++ openlp/plugins/presentations/lib/pptviewcontroller.py	2013-02-04 21:03:31 +0000
@@ -83,7 +83,7 @@
             if self.process:
                 return
             log.debug(u'start PPTView')
-            dllpath = os.path.join(self.plugin_manager.basepath, u'presentations', u'lib', u'pptviewlib',
+            dllpath = os.path.join(self.plugin.pluginManager.basepath, u'presentations', u'lib', u'pptviewlib',
                 u'pptviewlib.dll')
             self.process = cdll.LoadLibrary(dllpath)
             if log.isEnabledFor(logging.DEBUG):

=== modified file 'openlp/plugins/presentations/lib/presentationcontroller.py'
--- openlp/plugins/presentations/lib/presentationcontroller.py	2013-02-02 17:44:07 +0000
+++ openlp/plugins/presentations/lib/presentationcontroller.py	2013-02-04 21:03:31 +0000
@@ -33,7 +33,7 @@
 
 from PyQt4 import QtCore
 
-from openlp.core.lib import Receiver, Registry, check_directory_exists, create_thumb, validate_thumb, Settings
+from openlp.core.lib import Receiver, check_directory_exists, create_thumb, validate_thumb, Settings
 from openlp.core.utils import AppLocation
 
 log = logging.getLogger(__name__)
@@ -438,13 +438,3 @@
 
     def close_presentation(self):
         pass
-
-    def _get_plugin_manager(self):
-        """
-        Adds the plugin manager to the class dynamically
-        """
-        if not hasattr(self, u'_plugin_manager'):
-            self._plugin_manager = Registry().get(u'plugin_manager')
-        return self._plugin_manager
-
-    plugin_manager = property(_get_plugin_manager)

=== modified file 'openlp/plugins/songs/forms/songbookform.py'
--- openlp/plugins/songs/forms/songbookform.py	2013-01-31 22:01:41 +0000
+++ openlp/plugins/songs/forms/songbookform.py	2013-02-04 21:03:31 +0000
@@ -33,7 +33,6 @@
 from openlp.core.lib.ui import critical_error_message_box
 from openlp.plugins.songs.forms.songbookdialog import Ui_SongBookDialog
 
-
 class SongBookForm(QtGui.QDialog, Ui_SongBookDialog):
     """
     Class documentation goes here.
@@ -42,16 +41,10 @@
         """
         Constructor
         """
-        super(SongBookForm, self).__init__(parent)
+        QtGui.QDialog.__init__(self, parent)
         self.setupUi(self)
 
     def exec_(self, clear=True):
-        """
-        Execute the song book form.
-
-        ``clear``
-            Clear the fields on the form before displaying it.
-        """
         if clear:
             self.nameEdit.clear()
             self.publisherEdit.clear()
@@ -59,9 +52,6 @@
         return QtGui.QDialog.exec_(self)
 
     def accept(self):
-        """
-        Override the inherited method to check that the name of the book has been typed in.
-        """
         if not self.nameEdit.text():
             critical_error_message_box(
                 message=translate('SongsPlugin.SongBookForm', 'You need to type in a name for the book.'))

=== modified file 'openlp/plugins/songs/forms/songexportform.py'
--- openlp/plugins/songs/forms/songexportform.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/songs/forms/songexportform.py	2013-02-04 21:03:31 +0000
@@ -226,7 +226,7 @@
         self.directoryLineEdit.clear()
         self.searchLineEdit.clear()
         # Load the list of songs.
-        self.application.set_busy_cursor()
+        Receiver.send_message(u'cursor_busy')
         songs = self.plugin.manager.get_all_objects(Song)
         songs.sort(cmp=natcmp, key=lambda song: song.sort_key)
         for song in songs:
@@ -240,7 +240,7 @@
             item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
             item.setCheckState(QtCore.Qt.Unchecked)
             self.availableListWidget.addItem(item)
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
 
     def preWizard(self):
         """
@@ -248,7 +248,7 @@
         """
         OpenLPWizard.preWizard(self)
         self.progressLabel.setText(translate('SongsPlugin.ExportWizardForm', 'Starting export...'))
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
 
     def performWizard(self):
         """

=== modified file 'openlp/plugins/songs/forms/songimportform.py'
--- openlp/plugins/songs/forms/songimportform.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/songs/forms/songimportform.py	2013-02-04 21:03:31 +0000
@@ -35,14 +35,13 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Settings, translate, UiStrings
+from openlp.core.lib import Receiver, Settings, SettingsManager, translate, UiStrings
 from openlp.core.lib.ui import critical_error_message_box
 from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
 from openlp.plugins.songs.lib.importer import SongFormat, SongFormatSelect
 
 log = logging.getLogger(__name__)
 
-
 class SongImportForm(OpenLPWizard):
     """
     This is the Song Import Wizard, which allows easy importing of Songs
@@ -212,17 +211,17 @@
         if self.currentPage() == self.welcomePage:
             return True
         elif self.currentPage() == self.sourcePage:
-            this_format = self.currentFormat
-            Settings().setValue(u'songs/last import type', this_format)
-            select_mode, class_, error_msg = SongFormat.get(this_format, u'selectMode', u'class', u'invalidSourceMsg')
+            format = self.currentFormat
+            Settings().setValue(u'songs/last import type', format)
+            select_mode, class_, error_msg = SongFormat.get(format, u'selectMode', u'class', u'invalidSourceMsg')
             if select_mode == SongFormatSelect.MultipleFiles:
-                import_source = self.getListOfFiles(self.formatWidgets[this_format][u'fileListWidget'])
+                import_source = self.getListOfFiles(self.formatWidgets[format][u'fileListWidget'])
                 error_title = UiStrings().IFSp
-                focus_button = self.formatWidgets[this_format][u'addButton']
+                focus_button = self.formatWidgets[format][u'addButton']
             else:
-                import_source = self.formatWidgets[this_format][u'filepathEdit'].text()
+                import_source = self.formatWidgets[format][u'filepathEdit'].text()
                 error_title = (UiStrings().IFSs if select_mode == SongFormatSelect.SingleFile else UiStrings().IFdSs)
-                focus_button = self.formatWidgets[this_format][u'browseButton']
+                focus_button = self.formatWidgets[format][u'browseButton']
             if not class_.isValidSource(import_source):
                 critical_error_message_box(error_title, error_msg)
                 focus_button.setFocus()
@@ -272,35 +271,25 @@
             del item
 
     def onBrowseButtonClicked(self):
-        """
-        Browse for files or a directory.
-        """
-        this_format = self.currentFormat
-        select_mode, format_name, ext_filter = SongFormat.get(this_format, u'selectMode',
+        format = self.currentFormat
+        select_mode, format_name, filter = SongFormat.get(format, u'selectMode',
             u'name', u'filter')
-        filepathEdit = self.formatWidgets[this_format][u'filepathEdit']
+        filepathEdit = self.formatWidgets[format][u'filepathEdit']
         if select_mode == SongFormatSelect.SingleFile:
-            self.getFileName(WizardStrings.OpenTypeFile % format_name, filepathEdit,
-                u'last directory import', ext_filter)
+            self.getFileName(WizardStrings.OpenTypeFile % format_name, filepathEdit, u'last directory import', filter)
         elif select_mode == SongFormatSelect.SingleFolder:
             self.getFolder(WizardStrings.OpenTypeFolder % format_name, filepathEdit, u'last directory import')
 
     def onAddButtonClicked(self):
-        """
-        Add a file or directory.
-        """
-        this_format = self.currentFormat
-        select_mode, format_name, ext_filter, custom_title = \
-            SongFormat.get(this_format, u'selectMode', u'name', u'filter', u'getFilesTitle')
+        format = self.currentFormat
+        select_mode, format_name, filter, custom_title = \
+            SongFormat.get(format, u'selectMode', u'name', u'filter', u'getFilesTitle')
         title = custom_title if custom_title else WizardStrings.OpenTypeFile % format_name
         if select_mode == SongFormatSelect.MultipleFiles:
-            self.getFiles(title, self.formatWidgets[this_format][u'fileListWidget'], ext_filter)
+            self.getFiles(title, self.formatWidgets[format][u'fileListWidget'], filter)
             self.sourcePage.emit(QtCore.SIGNAL(u'completeChanged()'))
 
     def onRemoveButtonClicked(self):
-        """
-        Remove a file from the list.
-        """
         self.removeSelectedItems(
             self.formatWidgets[self.currentFormat][u'fileListWidget'])
         self.sourcePage.emit(QtCore.SIGNAL(u'completeChanged()'))
@@ -339,7 +328,7 @@
         """
         OpenLPWizard.preWizard(self)
         self.progressLabel.setText(WizardStrings.StartingImport)
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
 
     def performWizard(self):
         """
@@ -351,10 +340,10 @@
         select_mode = SongFormat.get(source_format, u'selectMode')
         if select_mode == SongFormatSelect.SingleFile:
             importer = self.plugin.importSongs(source_format,
-                filename=self.formatWidgets[source_format][u'filepathEdit'].text())
+                filename = self.formatWidgets[source_format][u'filepathEdit'].text())
         elif select_mode == SongFormatSelect.SingleFolder:
             importer = self.plugin.importSongs(source_format,
-                folder=self.formatWidgets[source_format][u'filepathEdit'].text())
+                folder = self.formatWidgets[source_format][u'filepathEdit'].text())
         else:
             importer = self.plugin.importSongs(source_format,
                 filenames=self.getListOfFiles(self.formatWidgets[source_format][u'fileListWidget']))
@@ -380,12 +369,9 @@
         report_file.close()
 
     def addFileSelectItem(self):
-        """
-        Add a file selection page.
-        """
-        this_format = self.currentFormat
+        format = self.currentFormat
         prefix, can_disable, description_text, select_mode = \
-            SongFormat.get(this_format, u'prefix', u'canDisable', u'descriptionText', u'selectMode')
+            SongFormat.get(format, u'prefix', u'canDisable', u'descriptionText', u'selectMode')
         page = QtGui.QWidget()
         page.setObjectName(prefix + u'Page')
         if can_disable:
@@ -406,8 +392,8 @@
             descriptionLabel.setObjectName(prefix + u'DescriptionLabel')
             descriptionLayout.addWidget(descriptionLabel)
             importLayout.addLayout(descriptionLayout)
-            self.formatWidgets[this_format][u'descriptionLabel'] = descriptionLabel
-            self.formatWidgets[this_format][u'descriptionSpacer'] = descriptionSpacer
+            self.formatWidgets[format][u'descriptionLabel'] = descriptionLabel
+            self.formatWidgets[format][u'descriptionSpacer'] = descriptionSpacer
         if select_mode == SongFormatSelect.SingleFile or select_mode == SongFormatSelect.SingleFolder:
             filepathLayout = QtGui.QHBoxLayout()
             filepathLayout.setObjectName(prefix + u'FilepathLayout')
@@ -426,11 +412,11 @@
             filepathLayout.addWidget(browseButton)
             importLayout.addLayout(filepathLayout)
             importLayout.addSpacerItem(self.stackSpacer)
-            self.formatWidgets[this_format][u'filepathLabel'] = filepathLabel
-            self.formatWidgets[this_format][u'filepathSpacer'] = filepathSpacer
-            self.formatWidgets[this_format][u'filepathLayout'] = filepathLayout
-            self.formatWidgets[this_format][u'filepathEdit'] = filepathEdit
-            self.formatWidgets[this_format][u'browseButton'] = browseButton
+            self.formatWidgets[format][u'filepathLabel'] = filepathLabel
+            self.formatWidgets[format][u'filepathSpacer'] = filepathSpacer
+            self.formatWidgets[format][u'filepathLayout'] = filepathLayout
+            self.formatWidgets[format][u'filepathEdit'] = filepathEdit
+            self.formatWidgets[format][u'browseButton'] = browseButton
         elif select_mode == SongFormatSelect.MultipleFiles:
             fileListWidget = QtGui.QListWidget(importWidget)
             fileListWidget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
@@ -448,21 +434,18 @@
             removeButton.setObjectName(prefix + u'RemoveButton')
             buttonLayout.addWidget(removeButton)
             importLayout.addLayout(buttonLayout)
-            self.formatWidgets[this_format][u'fileListWidget'] = fileListWidget
-            self.formatWidgets[this_format][u'buttonLayout'] = buttonLayout
-            self.formatWidgets[this_format][u'addButton'] = addButton
-            self.formatWidgets[this_format][u'removeButton'] = removeButton
+            self.formatWidgets[format][u'fileListWidget'] = fileListWidget
+            self.formatWidgets[format][u'buttonLayout'] = buttonLayout
+            self.formatWidgets[format][u'addButton'] = addButton
+            self.formatWidgets[format][u'removeButton'] = removeButton
         self.formatStack.addWidget(page)
-        self.formatWidgets[this_format][u'page'] = page
-        self.formatWidgets[this_format][u'importLayout'] = importLayout
+        self.formatWidgets[format][u'page'] = page
+        self.formatWidgets[format][u'importLayout'] = importLayout
         self.formatComboBox.addItem(u'')
 
     def disablableWidget(self, page, prefix):
-        """
-        Disable a widget.
-        """
-        this_format = self.currentFormat
-        self.disablableFormats.append(this_format)
+        format = self.currentFormat
+        self.disablableFormats.append(format)
         layout = QtGui.QVBoxLayout(page)
         layout.setMargin(0)
         layout.setSpacing(0)
@@ -482,11 +465,11 @@
         importWidget = QtGui.QWidget(page)
         importWidget.setObjectName(prefix + u'ImportWidget')
         layout.addWidget(importWidget)
-        self.formatWidgets[this_format][u'layout'] = layout
-        self.formatWidgets[this_format][u'disabledWidget'] = disabledWidget
-        self.formatWidgets[this_format][u'disabledLayout'] = disabledLayout
-        self.formatWidgets[this_format][u'disabledLabel'] = disabledLabel
-        self.formatWidgets[this_format][u'importWidget'] = importWidget
+        self.formatWidgets[format][u'layout'] = layout
+        self.formatWidgets[format][u'disabledWidget'] = disabledWidget
+        self.formatWidgets[format][u'disabledLayout'] = disabledLayout
+        self.formatWidgets[format][u'disabledLabel'] = disabledLabel
+        self.formatWidgets[format][u'importWidget'] = importWidget
         return importWidget
 
 
@@ -506,14 +489,14 @@
         When this method returns True, the wizard's Next button is enabled.
         """
         wizard = self.wizard()
-        this_format = wizard.currentFormat
-        select_mode, format_available = SongFormat.get(this_format, u'selectMode', u'availability')
+        format = wizard.currentFormat
+        select_mode, format_available = SongFormat.get(format, u'selectMode', u'availability')
         if format_available:
             if select_mode == SongFormatSelect.MultipleFiles:
-                if wizard.formatWidgets[this_format][u'fileListWidget'].count() > 0:
+                if wizard.formatWidgets[format][u'fileListWidget'].count() > 0:
                     return True
             else:
-                filepath = unicode(wizard.formatWidgets[this_format][u'filepathEdit'].text())
+                filepath = unicode(wizard.formatWidgets[format][u'filepathEdit'].text())
                 if filepath:
                     if select_mode == SongFormatSelect.SingleFile and os.path.isfile(filepath):
                         return True

=== modified file 'openlp/plugins/songs/forms/songmaintenanceform.py'
--- openlp/plugins/songs/forms/songmaintenanceform.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/songs/forms/songmaintenanceform.py	2013-02-04 21:03:31 +0000
@@ -39,7 +39,6 @@
 
 log = logging.getLogger(__name__)
 
-
 class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog):
     """
     Class documentation goes here.
@@ -48,7 +47,7 @@
         """
         Constructor
         """
-        super(SongMaintenanceForm, self).__init__(parent)
+        QtGui.QDialog.__init__(self, parent)
         self.setupUi(self)
         self.manager = manager
         self.authorform = AuthorsForm(self)
@@ -94,14 +93,8 @@
         self.typeListWidget.setFocus()
         return QtGui.QDialog.exec_(self)
 
-    def _getCurrentItemId(self, list_widget):
-        """
-        Get the ID of the currently selected item.
-
-        ``list_widget``
-            The list widget to examine.
-        """
-        item = list_widget.currentItem()
+    def _getCurrentItemId(self, listWidget):
+        item = listWidget.currentItem()
         if item:
             item_id = (item.data(QtCore.Qt.UserRole))
             return item_id
@@ -109,9 +102,6 @@
             return -1
 
     def _deleteItem(self, itemClass, listWidget, resetFunc, dlgTitle, del_text, err_text):
-        """
-        Delete an item.
-        """
         item_id = self._getCurrentItemId(listWidget)
         if item_id != -1:
             item = self.manager.get_object(itemClass, item_id)
@@ -206,9 +196,6 @@
             return True
 
     def onAuthorAddButtonClicked(self):
-        """
-        Add an author to the list.
-        """
         self.authorform.setAutoDisplayName(True)
         if self.authorform.exec_():
             author = Author.populate(
@@ -226,9 +213,6 @@
                     message=translate('SongsPlugin.SongMaintenanceForm', 'This author already exists.'))
 
     def onTopicAddButtonClicked(self):
-        """
-        Add a topic to the list.
-        """
         if self.topicform.exec_():
             topic = Topic.populate(name=self.topicform.nameEdit.text())
             if self.checkTopic(topic):
@@ -242,9 +226,6 @@
                     message=translate('SongsPlugin.SongMaintenanceForm', 'This topic already exists.'))
 
     def onBookAddButtonClicked(self):
-        """
-        Add a book to the list.
-        """
         if self.bookform.exec_():
             book = Book.populate(name=self.bookform.nameEdit.text(),
                 publisher=self.bookform.publisherEdit.text())
@@ -259,9 +240,6 @@
                     message=translate('SongsPlugin.SongMaintenanceForm', 'This book already exists.'))
 
     def onAuthorEditButtonClicked(self):
-        """
-        Edit an author.
-        """
         author_id = self._getCurrentItemId(self.authorsListWidget)
         if author_id == -1:
             return
@@ -305,9 +283,6 @@
                     'Could not save your modified author, because the author already exists.'))
 
     def onTopicEditButtonClicked(self):
-        """
-        Edit a topic.
-        """
         topic_id = self._getCurrentItemId(self.topicsListWidget)
         if topic_id == -1:
             return
@@ -336,9 +311,6 @@
                     'Could not save your modified topic, because it already exists.'))
 
     def onBookEditButtonClicked(self):
-        """
-        Edit a book.
-        """
         book_id = self._getCurrentItemId(self.booksListWidget)
         if book_id == -1:
             return
@@ -374,12 +346,12 @@
         """
         Utility method to merge two objects to leave one in the database.
         """
-        self.application.set_busy_cursor()
+        Receiver.send_message(u'cursor_busy')
         merge(dbObject)
         reset()
         if not self.fromSongEdit:
             Receiver.send_message(u'songs_load_list')
-        self.application.set_normal_cursor()
+        Receiver.send_message(u'cursor_normal')
 
     def mergeAuthors(self, oldAuthor):
         """
@@ -509,12 +481,3 @@
             deleteButton.setEnabled(True)
             editButton.setEnabled(True)
 
-    def _get_application(self):
-        """
-        Adds the openlp to the class dynamically
-        """
-        if not hasattr(self, u'_application'):
-            self._application = Registry().get(u'application')
-        return self._application
-
-    application = property(_get_application)
\ No newline at end of file

=== modified file 'openlp/plugins/songs/forms/topicsform.py'
--- openlp/plugins/songs/forms/topicsform.py	2013-01-31 22:01:41 +0000
+++ openlp/plugins/songs/forms/topicsform.py	2013-02-04 21:03:31 +0000
@@ -33,7 +33,6 @@
 from openlp.core.lib.ui import critical_error_message_box
 from openlp.plugins.songs.forms.topicsdialog import Ui_TopicsDialog
 
-
 class TopicsForm(QtGui.QDialog, Ui_TopicsDialog):
     """
     Class documentation goes here.
@@ -42,22 +41,16 @@
         """
         Constructor
         """
-        super(TopicsForm, self).__init__(parent)
+        QtGui.QDialog.__init__(self, parent)
         self.setupUi(self)
 
     def exec_(self, clear=True):
-        """
-        Execute the dialog.
-        """
         if clear:
             self.nameEdit.clear()
         self.nameEdit.setFocus()
         return QtGui.QDialog.exec_(self)
 
     def accept(self):
-        """
-        Override the inherited method to check before we close.
-        """
         if not self.nameEdit.text():
             critical_error_message_box(message=translate('SongsPlugin.TopicsForm',
                 'You need to type in a topic name.'))

=== modified file 'openlp/plugins/songs/lib/mediaitem.py'
--- openlp/plugins/songs/lib/mediaitem.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/songs/lib/mediaitem.py	2013-02-04 21:03:31 +0000
@@ -361,7 +361,7 @@
                 QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No),
                 QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No:
                 return
-            self.application.set_busy_cursor()
+            Receiver.send_message(u'cursor_busy')
             self.main_window.displayProgressBar(len(items))
             for item in items:
                 item_id = item.data(QtCore.Qt.UserRole)
@@ -380,7 +380,7 @@
                 self.plugin.manager.delete_object(Song, item_id)
                 self.main_window.incrementProgressBar()
             self.main_window.finishedProgressBar()
-            self.application.set_normal_cursor()
+            Receiver.send_message(u'cursor_normal')
             self.onSearchTextButtonClicked()
 
     def onCloneClick(self):
@@ -526,7 +526,7 @@
             temporary = True
         # Update service with correct song id.
         if editId:
-            self.service_manager.service_item_update(editId, item.unique_identifier, temporary)
+            Receiver.send_message(u'service_item_update%s:%s:%s' % (editId, item.unique_identifier, temporary))
 
     def search(self, string, showError):
         """

=== modified file 'openlp/plugins/songs/lib/olp1import.py'
--- openlp/plugins/songs/lib/olp1import.py	2013-02-02 07:08:28 +0000
+++ openlp/plugins/songs/lib/olp1import.py	2013-02-04 21:03:31 +0000
@@ -61,7 +61,8 @@
             The database providing the data to import.
         """
         SongImport.__init__(self, manager, **kwargs)
-        self.availableThemes = kwargs[u'plugin'].theme_manager.get_themes()
+        self.availableThemes = \
+            kwargs[u'plugin'].formParent.themeManagerContents.getThemes()
 
     def doImport(self):
         """

=== modified file 'openlp/plugins/songs/lib/openlyricsexport.py'
--- openlp/plugins/songs/lib/openlyricsexport.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/songs/lib/openlyricsexport.py	2013-02-04 21:03:31 +0000
@@ -35,7 +35,7 @@
 
 from lxml import etree
 
-from openlp.core.lib import Registry, check_directory_exists, translate
+from openlp.core.lib import check_directory_exists, Receiver, translate
 from openlp.core.utils import clean_filename
 from openlp.plugins.songs.lib import OpenLyrics
 
@@ -64,7 +64,7 @@
         openLyrics = OpenLyrics(self.manager)
         self.parent.progressBar.setMaximum(len(self.songs))
         for song in self.songs:
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
             if self.parent.stop_export_flag:
                 return False
             self.parent.incrementProgressBar(translate('SongsPlugin.OpenLyricsExport', 'Exporting "%s"...') %
@@ -80,13 +80,3 @@
             tree.write(open(os.path.join(self.save_path, filename), u'w'),
                 encoding=u'utf-8', xml_declaration=True, pretty_print=True)
         return True
-
-    def _get_application(self):
-        """
-        Adds the openlp to the class dynamically
-        """
-        if not hasattr(self, u'_application'):
-            self._application = Registry().get(u'application')
-        return self._application
-
-    application = property(_get_application)

=== modified file 'openlp/plugins/songs/songsplugin.py'
--- openlp/plugins/songs/songsplugin.py	2013-02-03 19:23:12 +0000
+++ openlp/plugins/songs/songsplugin.py	2013-02-04 21:03:31 +0000
@@ -38,7 +38,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Plugin, StringContent, build_icon, translate, UiStrings
+from openlp.core.lib import Plugin, StringContent, build_icon, translate, Receiver, UiStrings
 from openlp.core.lib.db import Manager
 from openlp.core.lib.ui import create_action
 from openlp.core.utils import get_filesystem_encoding
@@ -96,6 +96,9 @@
         action_list.add_action(self.songImportItem, UiStrings().Import)
         action_list.add_action(self.songExportItem, UiStrings().Export)
         action_list.add_action(self.toolsReindexItem, UiStrings().Tools)
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'servicemanager_new_service'),
+            self.clearTemporarySongs)
+
 
     def addImportMenuItem(self, import_menu):
         """
@@ -236,14 +239,14 @@
         }
         self.setPluginUiTextStrings(tooltips)
 
-    def first_time(self):
+    def firstTime(self):
         """
         If the first time wizard has run, this function is run to import all the
         new songs into the database.
         """
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
         self.onToolsReindexItemTriggered()
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
         db_dir = unicode(os.path.join(unicode(gettempdir(), get_filesystem_encoding()), u'openlp'))
         if not os.path.exists(db_dir):
             return
@@ -251,12 +254,12 @@
         song_count = 0
         for sfile in os.listdir(db_dir):
             if sfile.startswith(u'songs_') and sfile.endswith(u'.sqlite'):
-                self.application.process_events()
+                Receiver.send_message(u'openlp_process_events')
                 song_dbs.append(os.path.join(db_dir, sfile))
                 song_count += self._countSongs(os.path.join(db_dir, sfile))
         if not song_dbs:
             return
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
         progress = QtGui.QProgressDialog(self.main_window)
         progress.setWindowModality(QtCore.Qt.WindowModal)
         progress.setWindowTitle(translate('OpenLP.Ui', 'Importing Songs'))
@@ -265,11 +268,11 @@
         progress.setRange(0, song_count)
         progress.setMinimumDuration(0)
         progress.forceShow()
-        self.application.process_events()
+        Receiver.send_message(u'openlp_process_events')
         for db in song_dbs:
             importer = OpenLPSongImport(self.manager, filename=db)
             importer.doImport(progress)
-            self.application.process_events()
+            Receiver.send_message(u'openlp_process_events')
         progress.setValue(song_count)
         self.mediaItem.onSearchTextButtonClicked()
 
@@ -278,7 +281,7 @@
         Time to tidy up on exit
         """
         log.info(u'Songs Finalising')
-        self.new_service_created()
+        self.clearTemporarySongs()
         # Clean up files and connections
         self.manager.finalise()
         self.songImportItem.setVisible(False)
@@ -290,18 +293,13 @@
         action_list.remove_action(self.toolsReindexItem, UiStrings().Tools)
         Plugin.finalise(self)
 
-    def new_service_created(self):
-        """
-        Remove temporary songs from the database
-        """
+    def clearTemporarySongs(self):
+        # Remove temporary songs
         songs = self.manager.get_all_objects(Song, Song.temporary == True)
         for song in songs:
             self.manager.delete_object(Song, song.id)
 
     def _countSongs(self, db_file):
-        """
-        Provide a count of the songs in the database
-        """
         connection = sqlite3.connect(db_file)
         cursor = connection.cursor()
         cursor.execute(u'SELECT COUNT(id) AS song_count FROM songs')

=== modified file 'setup.py'
--- setup.py	2013-02-03 16:40:39 +0000
+++ setup.py	2013-02-04 21:03:31 +0000
@@ -152,7 +152,7 @@
     url='http://openlp.org/',
     license='GNU General Public License',
     packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-    scripts=['openlp.py'],
+    scripts=['openlp.pyw'],
     include_package_data=True,
     zip_safe=False,
     install_requires=[


Follow ups