← Back to team overview

openlp-core team mailing list archive

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

 

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

Requested reviews:
  Raoul Snyman (raoul-snyman)

For more details, see:
https://code.launchpad.net/~trb143/openlp/event_receiver_removal/+merge/146317

Cleanups from Raouls merge
Remove test harness from openlp
Start to remove Receiver events 
-- 
https://code.launchpad.net/~trb143/openlp/event_receiver_removal/+merge/146317
Your team OpenLP Core is subscribed to branch lp:openlp.
=== modified file 'openlp/core/__init__.py'
--- openlp/core/__init__.py	2013-02-03 14:40:48 +0000
+++ openlp/core/__init__.py	2013-02-03 19:24:22 +0000
@@ -97,7 +97,7 @@
         self.shared_memory.detach()
         return result
 
-    def run(self, args, testing=False):
+    def run(self, args):
         """
         Run the OpenLP application.
         """
@@ -110,10 +110,6 @@
         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.set_busy_cursor)
-        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'cursor_normal'), self.set_normal_cursor)
         # Decide how many screens we have and their size
         screens = ScreenList.create(self.desktop())
         # First time checks in settings
@@ -139,7 +135,7 @@
         # make sure Qt really display the splash screen
         self.processEvents()
         # start the main app window
-        self.main_window = MainWindow(self)
+        self.main_window = MainWindow()
         self.main_window.show()
         if show_splash:
             # now kill the splashscreen
@@ -156,9 +152,13 @@
             VersionThread(self.main_window).start()
         Receiver.send_message(u'live_display_blank_check')
         self.main_window.app_startup()
-        # Skip exec_() for gui tests
-        if not testing:
-            return self.exec_()
+        return self.exec_()
+
+    def close_splash_screen(self):
+        """
+        Close the splash screen when requested.
+        """
+        self.splash.close()
 
     def is_already_running(self):
         """
@@ -199,6 +199,12 @@
         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):
         """
         Sets the Busy Cursor for the Application
@@ -211,6 +217,7 @@
         Sets the Normal Cursor for the Application
         """
         self.restoreOverrideCursor()
+        self.processEvents()
 
     def event(self, event):
         """
@@ -255,7 +262,6 @@
     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()
@@ -276,38 +282,37 @@
     # Initialise the resources
     qInitResources()
     # Now create and actually run the application.
-    app = OpenLP(qt_args)
-    app.setOrganizationName(u'OpenLP')
-    app.setOrganizationDomain(u'openlp.org')
+    application = OpenLP(qt_args)
+    application.setOrganizationName(u'OpenLP')
+    application.setOrganizationDomain(u'openlp.org')
     if options.portable:
-        app.setApplicationName(u'OpenLPPortable')
+        application.setApplicationName(u'OpenLPPortable')
         Settings.setDefaultFormat(Settings.IniFormat)
         # Get location OpenLPPortable.ini
-        app_path = AppLocation.get_directory(AppLocation.AppDir)
-        set_up_logging(os.path.abspath(os.path.join(app_path, u'..', u'..', u'Other')))
+        application_path = AppLocation.get_directory(AppLocation.AppDir)
+        set_up_logging(os.path.abspath(os.path.join(application_path, u'..', u'..', u'Other')))
         log.info(u'Running portable')
-        portable_settings_file = os.path.abspath(os.path.join(app_path, u'..', u'..', u'Data', u'OpenLP.ini'))
+        portable_settings_file = os.path.abspath(os.path.join(application_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(app_path, u'..', u'..', u'Data',))
+        data_path = os.path.abspath(os.path.join(application_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:
-        app.setApplicationName(u'OpenLP')
+        application.setApplicationName(u'OpenLP')
         set_up_logging(AppLocation.get_directory(AppLocation.CacheDir))
     Registry.create()
-    app.setApplicationVersion(get_application_version()[u'version'])
+    Registry().register(u'application', application)
+    application.setApplicationVersion(get_application_version()[u'version'])
     # Instance check
-    if not options.testing:
-        # Instance check
-        if app.is_already_running():
-            sys.exit()
+    if application.is_already_running():
+        sys.exit()
     # First time checks in settings
     if not Settings().value(u'general/has run wizard'):
         if not FirstTimeLanguageForm().exec_():
@@ -315,19 +320,14 @@
             sys.exit()
     # i18n Set Language
     language = LanguageManager.get_language()
-    app_translator, default_translator = LanguageManager.get_translator(language)
-    if not app_translator.isEmpty():
-        app.installTranslator(app_translator)
+    application_translator, default_translator = LanguageManager.get_translator(language)
+    if not application_translator.isEmpty():
+        application.installTranslator(application_translator)
     if not default_translator.isEmpty():
-        app.installTranslator(default_translator)
+        application.installTranslator(default_translator)
     else:
         log.debug(u'Could not find default_translator.')
     if not options.no_error_form:
-        sys.excepthook = app.hook_exception
-    # 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))
+        sys.excepthook = application.hook_exception
+    sys.exit(application.run(qt_args))
+

=== modified file 'openlp/core/lib/eventreceiver.py'
--- openlp/core/lib/eventreceiver.py	2013-02-01 19:58:18 +0000
+++ openlp/core/lib/eventreceiver.py	2013-02-03 19:24:22 +0000
@@ -47,24 +47,12 @@
     ``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.
 
@@ -121,29 +109,6 @@
     ``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/mediamanageritem.py'
--- openlp/core/lib/mediamanageritem.py	2013-02-02 21:16:42 +0000
+++ openlp/core/lib/mediamanageritem.py	2013-02-03 19:24:22 +0000
@@ -332,9 +332,9 @@
             Settings().value(self.settingsSection + u'/last directory'), self.onNewFileMasks)
         log.info(u'New files(s) %s', files)
         if files:
-            Receiver.send_message(u'cursor_busy')
+            self.application.set_busy_cursor()
             self.validateAndLoad(files)
-        Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
 
     def loadFile(self, files):
         """
@@ -718,3 +718,13 @@
         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 14:40:48 +0000
+++ openlp/core/lib/plugin.py	2013-02-03 19:24:22 +0000
@@ -409,6 +409,12 @@
         """
         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
@@ -418,3 +424,13 @@
         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)

=== modified file 'openlp/core/lib/pluginmanager.py'
--- openlp/core/lib/pluginmanager.py	2013-02-01 19:58:18 +0000
+++ openlp/core/lib/pluginmanager.py	2013-02-03 19:24:22 +0000
@@ -212,3 +212,13 @@
             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/ui/firsttimeform.py'
--- openlp/core/ui/firsttimeform.py	2013-02-03 14:40:48 +0000
+++ openlp/core/ui/firsttimeform.py	2013-02-03 19:24:22 +0000
@@ -152,13 +152,13 @@
             # Download the theme screenshots.
             self.themeScreenshotThread = ThemeScreenshotThread(self)
             self.themeScreenshotThread.start()
-        Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
 
     def nextId(self):
         """
         Determine the next page in the Wizard to go to.
         """
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
         if self.currentId() == FirstTimePage.Plugins:
             if not self.webAccess:
                 return FirstTimePage.NoInternet
@@ -169,14 +169,13 @@
         elif self.currentId() == FirstTimePage.NoInternet:
             return FirstTimePage.Progress
         elif self.currentId() == FirstTimePage.Themes:
-            Receiver.send_message(u'cursor_busy')
-            Receiver.send_message(u'openlp_process_events')
+            self.application.set_busy_cursor()
             while not self.themeScreenshotThread.isFinished():
                 time.sleep(0.1)
-                Receiver.send_message(u'openlp_process_events')
+                self.application.process_events()
             # Build the screenshot icons, as this can not be done in the thread.
             self._buildThemeScreenshots()
-            Receiver.send_message(u'cursor_normal')
+            self.application.set_normal_cursor()
             return FirstTimePage.Defaults
         else:
             return self.currentId() + 1
@@ -187,7 +186,7 @@
         """
         # Keep track of the page we are at.  Triggering "Cancel" causes pageId
         # to be a -1.
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
         if pageId != -1:
             self.lastId = pageId
         if pageId == FirstTimePage.Plugins:
@@ -219,16 +218,15 @@
             if self.hasRunWizard:
                 self.cancelButton.setVisible(False)
         elif pageId == FirstTimePage.Progress:
-            Receiver.send_message(u'cursor_busy')
+            self.application.set_busy_cursor()
             self.repaint()
-            Receiver.send_message(u'openlp_process_events')
+            self.application.process_events()
             # Try to give the wizard a chance to redraw itself
             time.sleep(0.2)
             self._preWizard()
             self._performWizard()
             self._postWizard()
-            Receiver.send_message(u'cursor_normal')
-            Receiver.send_message(u'openlp_process_events')
+            self.application.set_normal_cursor()
 
     def updateScreenListCombo(self):
         """
@@ -250,16 +248,15 @@
         self.was_download_cancelled = True
         while self.themeScreenshotThread.isRunning():
             time.sleep(0.1)
-        Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
 
     def onNoInternetFinishButtonClicked(self):
         """
         Process the triggering of the "Finish" button on the No Internet page.
         """
-        Receiver.send_message(u'cursor_busy')
+        self.application.set_busy_cursor()
         self._performWizard()
-        Receiver.send_message(u'cursor_normal')
-        Receiver.send_message(u'openlp_process_events')
+        self.application.set_normal_cursor()
         Settings().setValue(u'general/has run wizard', True)
         self.close()
 
@@ -335,7 +332,7 @@
             self.progressLabel.setText(status_text)
         if increment > 0:
             self.progressBar.setValue(self.progressBar.value() + increment)
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
 
     def _preWizard(self):
         """
@@ -343,10 +340,10 @@
         """
         self.max_progress = 0
         self.finishButton.setVisible(False)
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
         # Loop through the songs list and increase for each selected item
         for i in xrange(self.songsListWidget.count()):
-            Receiver.send_message(u'openlp_process_events')
+            self.application.process_events()
             item = self.songsListWidget.item(i)
             if item.checkState() == QtCore.Qt.Checked:
                 filename = item.data(QtCore.Qt.UserRole)
@@ -355,7 +352,7 @@
         # Loop through the Bibles list and increase for each selected item
         iterator = QtGui.QTreeWidgetItemIterator(self.biblesTreeWidget)
         while iterator.value():
-            Receiver.send_message(u'openlp_process_events')
+            self.application.process_events()
             item = iterator.value()
             if item.parent() and item.checkState(0) == QtCore.Qt.Checked:
                 filename = item.data(0, QtCore.Qt.UserRole)
@@ -364,7 +361,7 @@
             iterator += 1
         # Loop through the themes list and increase for each selected item
         for i in xrange(self.themesListWidget.count()):
-            Receiver.send_message(u'openlp_process_events')
+            self.application.process_events()
             item = self.themesListWidget.item(i)
             if item.checkState() == QtCore.Qt.Checked:
                 filename = item.data(QtCore.Qt.UserRole)
@@ -384,7 +381,7 @@
             self.progressPage.setTitle(translate('OpenLP.FirstTimeWizard', 'Setting Up'))
             self.progressPage.setSubTitle(u'Setup complete.')
         self.repaint()
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
         # Try to give the wizard a chance to repaint itself
         time.sleep(0.1)
 
@@ -411,7 +408,7 @@
         self.finishButton.setEnabled(True)
         self.cancelButton.setVisible(False)
         self.nextButton.setVisible(False)
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
 
     def _performWizard(self):
         """
@@ -489,3 +486,13 @@
         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/maindisplay.py'
--- openlp/core/ui/maindisplay.py	2013-02-02 20:54:34 +0000
+++ openlp/core/ui/maindisplay.py	2013-02-03 19:24:22 +0000
@@ -243,7 +243,7 @@
         log.debug(u'text to display')
         # Wait for the webview to update before displaying text.
         while not self.webLoaded:
-            Receiver.send_message(u'openlp_process_events')
+            self.application.process_events()
         self.setGeometry(self.screen[u'size'])
         if animate:
             self.frame.evaluateJavaScript(u'show_text("%s")' % slide.replace(u'\\', u'\\\\').replace(u'\"', u'\\\"'))
@@ -347,18 +347,18 @@
         Generates a preview of the image displayed.
         """
         log.debug(u'preview for %s', self.isLive)
-        Receiver.send_message(u'openlp_process_events')
+        self.application.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':
-                    Receiver.send_message(u'openlp_process_events')
+                    self.application.process_events()
         # Wait for the webview to update before getting the preview.
         # Important otherwise first preview will miss the background !
         while not self.webLoaded:
-            Receiver.send_message(u'openlp_process_events')
+            self.application.process_events()
         # if was hidden keep it hidden
         if self.isLive:
             if self.hideMode:
@@ -503,6 +503,16 @@
 
     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):
     """

=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py	2013-02-03 14:40:48 +0000
+++ openlp/core/ui/mainwindow.py	2013-02-03 19:24:22 +0000
@@ -455,14 +455,13 @@
     """
     log.info(u'MainWindow loaded')
 
-    def __init__(self, application):
+    def __init__(self):
         """
         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).
@@ -487,7 +486,7 @@
         self.recentFiles = []
         # Set up the path with plugins
         plugin_path = AppLocation.get_directory(AppLocation.PluginsDir)
-        self.pluginManager = PluginManager(plugin_path)
+        self.plugin_manager = PluginManager(plugin_path)
         self.imageManager = ImageManager()
         # Set up the interface
         self.setupUi(self)
@@ -538,10 +537,9 @@
         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)
-        Receiver.send_message(u'cursor_busy')
+        self.application.set_busy_cursor()
         # 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)
@@ -553,25 +551,25 @@
         # Define the media Dock Manager
         self.mediaDockManager = MediaDockManager(self.mediaToolBox)
         log.info(u'Load Plugins')
-        self.pluginManager.find_plugins(plugin_path)
+        self.plugin_manager.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.pluginManager.hook_settings_tabs(self.settingsForm)
+        self.plugin_manager.hook_settings_tabs(self.settingsForm)
         # Find and insert media manager items
         log.info(u'hook media')
-        self.pluginManager.hook_media_manager()
+        self.plugin_manager.hook_media_manager()
         # Call the hook method to pull in import menus.
         log.info(u'hook menus')
-        self.pluginManager.hook_import_menu(self.fileImportMenu)
+        self.plugin_manager.hook_import_menu(self.fileImportMenu)
         # Call the hook method to pull in export menus.
-        self.pluginManager.hook_export_menu(self.fileExportMenu)
+        self.plugin_manager.hook_export_menu(self.fileExportMenu)
         # Call the hook method to pull in tools menus.
-        self.pluginManager.hook_tools_menu(self.toolsMenu)
+        self.plugin_manager.hook_tools_menu(self.toolsMenu)
         # Call the initialise method to setup plugins.
         log.info(u'initialise plugins')
-        self.pluginManager.initialise_plugins()
+        self.plugin_manager.initialise_plugins()
         # Create the displays as all necessary components are loaded.
         self.previewController.screenSizeChanged()
         self.liveController.screenSizeChanged()
@@ -587,7 +585,7 @@
         # Hide/show the theme combobox on the service manager
         self.serviceManagerContents.theme_change()
         # Reset the cursor
-        Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
 
     def setAutoLanguage(self, value):
         """
@@ -648,22 +646,22 @@
         """
         Give all the plugins a chance to perform some tasks at startup
         """
-        Receiver.send_message(u'openlp_process_events')
-        for plugin in self.pluginManager.plugins:
+        self.application.process_events()
+        for plugin in self.plugin_manager.plugins:
             if plugin.isActive():
                 plugin.app_startup()
-                Receiver.send_message(u'openlp_process_events')
+                self.application.process_events()
 
     def first_time(self):
         """
         Import themes if first time
         """
-        Receiver.send_message(u'openlp_process_events')
-        for plugin in self.pluginManager.plugins:
+        self.application.process_events()
+        for plugin in self.plugin_manager.plugins:
             if hasattr(plugin, u'first_time'):
-                Receiver.send_message(u'openlp_process_events')
+                self.application.process_events()
                 plugin.first_time()
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
         temp_dir = os.path.join(unicode(gettempdir()), u'openlp')
         shutil.rmtree(temp_dir, True)
 
@@ -684,14 +682,14 @@
                 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:
             return
+        self.application.set_busy_cursor()
         self.first_time()
-        for plugin in self.pluginManager.plugins:
+        for plugin in self.plugin_manager.plugins:
             self.activePlugin = plugin
             oldStatus = self.activePlugin.status
             self.activePlugin.setStatus()
@@ -707,6 +705,7 @@
         # 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):
         """
@@ -723,21 +722,21 @@
         """
         Display an error message
         """
-        Receiver.send_message(u'close_splash')
+        self.application.close_splash_screen()
         QtGui.QMessageBox.critical(self, data[u'title'], data[u'message'])
 
-    def onWarningMessage(self, data):
+    def warning_message(self, message):
         """
         Display a warning message
         """
-        Receiver.send_message(u'close_splash')
-        QtGui.QMessageBox.warning(self, data[u'title'], data[u'message'])
+        self.application.close_splash_screen()
+        QtGui.QMessageBox.warning(self, message[u'title'], message[u'message'])
 
     def onInformationMessage(self, data):
         """
         Display an informational message
         """
-        Receiver.send_message(u'close_splash')
+        self.application.close_splash_screen()
         QtGui.QMessageBox.information(self, data[u'title'], data[u'message'])
 
     def onHelpWebSiteClicked(self):
@@ -841,7 +840,7 @@
         setting_sections.extend([self.headerSection])
         setting_sections.extend([u'crashreport'])
         # Add plugin sections.
-        for plugin in self.pluginManager.plugins:
+        for plugin in self.plugin_manager.plugins:
             setting_sections.extend([plugin.name])
         settings = Settings()
         import_settings = Settings(import_file_name, Settings.IniFormat)
@@ -918,7 +917,7 @@
         setting_sections.extend([self.themesSettingsSection])
         setting_sections.extend([self.displayTagsSection])
         # Add plugin sections.
-        for plugin in self.pluginManager.plugins:
+        for plugin in self.plugin_manager.plugins:
             setting_sections.extend([plugin.name])
         # Delete old files if found.
         if os.path.exists(temp_file):
@@ -1003,14 +1002,14 @@
         renderer.
         """
         log.debug(u'screenChanged')
-        Receiver.send_message(u'cursor_busy')
+        self.application.set_busy_cursor()
         self.imageManager.update_display()
         self.renderer.update_display()
         self.previewController.screenSizeChanged()
         self.liveController.screenSizeChanged()
         self.setFocus()
         self.activateWindow()
-        Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
 
     def closeEvent(self, event):
         """
@@ -1070,7 +1069,7 @@
                 Settings().setValue(u'advanced/current media plugin', self.mediaToolBox.currentIndex())
         # Call the cleanup method to shutdown plugins.
         log.info(u'cleanup plugins')
-        self.pluginManager.finalise_plugins()
+        self.plugin_manager.finalise_plugins()
         if save_settings:
             # Save settings
             self.saveSettings()
@@ -1309,14 +1308,14 @@
         self.loadProgressBar.show()
         self.loadProgressBar.setMaximum(size)
         self.loadProgressBar.setValue(0)
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
 
     def incrementProgressBar(self):
         """
         Increase the Progress Bar value by 1
         """
         self.loadProgressBar.setValue(self.loadProgressBar.value() + 1)
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
 
     def finishedProgressBar(self):
         """
@@ -1331,7 +1330,7 @@
         if event.timerId() == self.timer_id:
             self.timer_id = 0
             self.loadProgressBar.hide()
-            Receiver.send_message(u'openlp_process_events')
+            self.application.process_events()
 
     def setNewDataPath(self, new_data_path):
         """
@@ -1352,23 +1351,22 @@
         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:
-                Receiver.send_message(u'cursor_normal')
+                self.application.set_normal_cursor()
                 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')
@@ -1378,3 +1376,14 @@
         # 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/mediaplayer.py'
--- openlp/core/ui/media/mediaplayer.py	2013-02-02 06:32:29 +0000
+++ openlp/core/ui/media/mediaplayer.py	2013-02-03 19:24:22 +0000
@@ -29,6 +29,7 @@
 """
 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
 
 
@@ -149,3 +150,13 @@
         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-02 06:32:29 +0000
+++ openlp/core/ui/media/phononplayer.py	2013-02-03 19:24:22 +0000
@@ -36,7 +36,7 @@
 from PyQt4 import QtGui
 from PyQt4.phonon import Phonon
 
-from openlp.core.lib import Receiver, translate, Settings
+from openlp.core.lib import translate, Settings
 
 from openlp.core.ui.media import MediaState
 from openlp.core.ui.media.mediaplayer import MediaPlayer
@@ -168,7 +168,7 @@
             current_state = display.mediaObject.state()
             if current_state == Phonon.ErrorState:
                 return False
-            Receiver.send_message(u'openlp_process_events')
+            self.application.process_events()
             if (datetime.now() - start).seconds > 5:
                 return False
         return True

=== modified file 'openlp/core/ui/media/vlcplayer.py'
--- openlp/core/ui/media/vlcplayer.py	2013-02-02 06:32:29 +0000
+++ openlp/core/ui/media/vlcplayer.py	2013-02-03 19:24:22 +0000
@@ -37,7 +37,7 @@
 
 from PyQt4 import QtGui
 
-from openlp.core.lib import Receiver, translate, Settings
+from openlp.core.lib import translate, Settings
 from openlp.core.ui.media import MediaState
 from openlp.core.ui.media.mediaplayer import MediaPlayer
 
@@ -187,7 +187,7 @@
         while not mediaState == display.vlcMedia.get_state():
             if display.vlcMedia.get_state() == vlc.State.Error:
                 return False
-            Receiver.send_message(u'openlp_process_events')
+            self.application.process_events()
             if (datetime.now() - start).seconds > 60:
                 return False
         return True

=== modified file 'openlp/core/ui/pluginform.py'
--- openlp/core/ui/pluginform.py	2013-02-02 20:54:34 +0000
+++ openlp/core/ui/pluginform.py	2013-02-03 19:24:22 +0000
@@ -33,7 +33,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import PluginStatus, Receiver, translate
+from openlp.core.lib import PluginStatus, Registry, translate
 from plugindialog import Ui_PluginViewDialog
 
 log = logging.getLogger(__name__)
@@ -68,7 +68,7 @@
         self._clearDetails()
         self.programaticChange = True
         pluginListWidth = 0
-        for plugin in self.parent().pluginManager.plugins:
+        for plugin in self.plugin_manager.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.
@@ -121,10 +121,9 @@
         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.parent().pluginManager.plugins:
+        for plugin in self.plugin_manager.plugins:
             if plugin.status != PluginStatus.Disabled:
                 if plugin.nameStrings[u'singular'] == plugin_name_singular:
                     self.activePlugin = plugin
@@ -141,9 +140,9 @@
         if self.programaticChange or status == PluginStatus.Disabled:
             return
         if status == PluginStatus.Inactive:
-            Receiver.send_message(u'cursor_busy')
+            self.application.set_busy_cursor()
             self.activePlugin.toggleStatus(PluginStatus.Active)
-            Receiver.send_message(u'cursor_normal')
+            self.application.set_normal_cursor()
             self.activePlugin.app_startup()
         else:
             self.activePlugin.toggleStatus(PluginStatus.Inactive)
@@ -156,3 +155,23 @@
             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/printserviceform.py'
--- openlp/core/ui/printserviceform.py	2013-02-01 20:52:42 +0000
+++ openlp/core/ui/printserviceform.py	2013-02-03 19:24:22 +0000
@@ -178,7 +178,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.serviceItems):
+        for index, item in enumerate(self.service_manager.service_items):
             self._addPreviewItem(html_data.body, item[u'service_item'], index)
         # Add the custom service notes:
         if self.footerTextEdit.toPlainText():

=== modified file 'openlp/core/ui/servicemanager.py'
--- openlp/core/ui/servicemanager.py	2013-02-03 14:40:48 +0000
+++ openlp/core/ui/servicemanager.py	2013-02-03 19:24:22 +0000
@@ -42,7 +42,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import OpenLPToolbar, ServiceItem, Receiver, build_icon, ItemCapabilities, SettingsManager, \
+from openlp.core.lib import OpenLPToolbar, ServiceItem, Receiver, build_icon, ItemCapabilities, \
     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
@@ -211,18 +211,10 @@
         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'service_item_update'),
-            self.service_item_update)
         # 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')
@@ -458,7 +450,7 @@
         self.service_id += 1
         self.set_modified(False)
         Settings().setValue(u'servicemanager/last file', u'')
-        Receiver.send_message(u'servicemanager_new_service')
+        self.plugin_manager.new_service_created()
 
     def save_file(self):
         """
@@ -486,7 +478,7 @@
         missing_list = []
         audio_files = []
         total_size = 0
-        Receiver.send_message(u'cursor_busy')
+        self.application.set_busy_cursor()
         # 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
@@ -502,7 +494,7 @@
                 else:
                     write_list.append(path_from)
         if missing_list:
-            Receiver.send_message(u'cursor_normal')
+            self.application.set_normal_cursor()
             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'
@@ -512,7 +504,6 @@
             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()
@@ -573,7 +564,7 @@
             if zip_file:
                 zip_file.close()
         self.main_window.finishedProgressBar()
-        Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
         if success:
             try:
                 shutil.copy(temp_file_name, path_file_name)
@@ -602,7 +593,7 @@
         log.debug(u'ServiceManager.save_file - %s', path_file_name)
         Settings().setValue(self.main_window.serviceManagerSettingsSection + u'/last directory', path)
         service = []
-        Receiver.send_message(u'cursor_busy')
+        self.application.set_busy_cursor()
         # Number of items + 1 to zip it
         self.main_window.displayProgressBar(len(self.service_items) + 1)
         for item in self.service_items:
@@ -631,7 +622,7 @@
             if zip_file:
                 zip_file.close()
         self.main_window.finishedProgressBar()
-        Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
         if success:
             try:
                 shutil.copy(temp_file_name, path_file_name)
@@ -708,6 +699,7 @@
             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():
@@ -728,7 +720,6 @@
                 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()
@@ -773,6 +764,7 @@
                 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:
@@ -780,7 +772,7 @@
             if zip_file:
                 zip_file.close()
         self.main_window.finishedProgressBar()
-        Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
         self.repaint_service_list(-1, -1)
 
     def load_Last_file(self):
@@ -952,12 +944,20 @@
             self.add_service_item(self.serviceItemEditForm.get_service_item(),
                 replace=True, expand=self.service_items[item][u'expanded'])
 
-    def preview_live(self, message):
+    def preview_live(self, unique_identifier, row):
         """
         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,9 +983,13 @@
                 lookFor = 1
             serviceIterator += 1
 
-    def previous_item(self, message):
+    def previous_item(self, last_slide=False):
         """
         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
@@ -995,7 +999,7 @@
         serviceIterator = QtGui.QTreeWidgetItemIterator(self.service_manager_list)
         while serviceIterator.value():
             if serviceIterator.value() == selected:
-                if message == u'last slide' and prevItemLastSlide:
+                if 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)
@@ -1254,7 +1258,7 @@
         Rebuild the service list as things have changed and a
         repaint is the easiest way to do this.
         """
-        Receiver.send_message(u'cursor_busy')
+        self.application.set_busy_cursor()
         log.debug(u'regenerate_service_Items')
         # force reset of renderer as theme data has changed
         self.service_has_all_original_files = True
@@ -1286,14 +1290,14 @@
                 self.set_modified()
             # Repaint it once only at the end
             self.repaint_service_list(-1, -1)
-        Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
 
-    def service_item_update(self, message):
+    def service_item_update(self, edit_id, unique_identifier, temporary=False):
         """
         Triggered from plugins to update service items.
         Save the values as they will be used as part of the service load
         """
-        edit_id, self.load_item_unique_identifier, temporary = message.split(u':')
+        self.load_item_unique_identifier = unique_identifier
         self.load_item_edit_id = int(edit_id)
         self.load_item_temporary = str_to_bool(temporary)
 
@@ -1361,7 +1365,7 @@
         """
         Send the current item to the Preview slide controller
         """
-        Receiver.send_message(u'cursor_busy')
+        self.application.set_busy_cursor()
         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)
@@ -1369,7 +1373,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'))
-        Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
 
     def get_service_item(self):
         """
@@ -1402,7 +1406,7 @@
             return
         if row != -1:
             child = row
-        Receiver.send_message(u'cursor_busy')
+        self.application.set_busy_cursor()
         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'):
@@ -1417,7 +1421,7 @@
             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'))
-        Receiver.send_message(u'cursor_normal')
+            self.application.set_normal_cursor()
 
     def remote_edit(self):
         """
@@ -1630,3 +1634,13 @@
         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)

=== modified file 'openlp/core/ui/shortcutlistform.py'
--- openlp/core/ui/shortcutlistform.py	2013-02-01 21:34:23 +0000
+++ openlp/core/ui/shortcutlistform.py	2013-02-03 19:24:22 +0000
@@ -33,7 +33,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, Settings
+from openlp.core.lib import Registry, Settings
 from openlp.core.utils import translate
 from openlp.core.utils.actions import ActionList
 from shortcutlistdialog import Ui_ShortcutListDialog
@@ -438,7 +438,7 @@
                 if changing_action.shortcutContext() in [QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut]:
                     is_valid = False
         if not is_valid:
-            Receiver.send_message(u'openlp_warning_message', {
+            self.main_window.warning_message( {
                 u'title': translate('OpenLP.ShortcutListDialog', 'Duplicate Shortcut'),
                 u'message': translate('OpenLP.ShortcutListDialog',
                     'The shortcut "%s" is already assigned to another action, '
@@ -478,3 +478,13 @@
             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-02 20:54:34 +0000
+++ openlp/core/ui/slidecontroller.py	2013-02-03 19:24:22 +0000
@@ -518,12 +518,12 @@
                 self.keypress_loop = True
                 keypressCommand = self.keypress_queue.popleft()
                 if keypressCommand == ServiceItemAction.Previous:
-                    Receiver.send_message('servicemanager_previous_item')
+                    self.service_manager.previous_item()
                 elif keypressCommand == ServiceItemAction.PreviousLastSlide:
                     # Go to the last slide of the previous item
-                    Receiver.send_message('servicemanager_previous_item', u'last slide')
+                    self.service_manager.previous_item(last_slide=True)
                 else:
-                    Receiver.send_message('servicemanager_next_item')
+                    self.service_manager.next_item()
             self.keypress_loop = False
 
     def screenSizeChanged(self):
@@ -1271,8 +1271,7 @@
         row = self.previewListWidget.currentRow()
         if -1 < row < self.previewListWidget.rowCount():
             if self.serviceItem.from_service:
-                Receiver.send_message('servicemanager_preview_live', u'%s:%s' %
-                    (self.serviceItem.unique_identifier, row))
+                self.service_manager.preview_live(self.serviceItem.unique_identifier, row)
             else:
                 self.live_controller.addServiceManagerItem(self.serviceItem, row)
 

=== modified file 'openlp/core/ui/splashscreen.py'
--- openlp/core/ui/splashscreen.py	2013-02-01 21:34:23 +0000
+++ openlp/core/ui/splashscreen.py	2013-02-03 19:24:22 +0000
@@ -44,7 +44,6 @@
         """
         QtGui.QSplashScreen.__init__(self)
         self.setupUi()
-        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'close_splash'), self.close)
 
     def setupUi(self):
         """

=== modified file 'openlp/core/ui/thememanager.py'
--- openlp/core/ui/thememanager.py	2013-02-02 21:16:42 +0000
+++ openlp/core/ui/thememanager.py	2013-02-03 19:24:22 +0000
@@ -153,13 +153,14 @@
         """
         Import new themes downloaded by the first time wizard
         """
-        Receiver.send_message(u'cursor_busy')
+        self.application.set_busy_cursor()
         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)
-        Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
+
 
     def config_updated(self):
         """
@@ -367,7 +368,7 @@
         path = QtGui.QFileDialog.getExistingDirectory(self,
             translate('OpenLP.ThemeManager', 'Save Theme - (%s)') % theme,
             Settings().value(self.settingsSection + u'/last directory export'))
-        Receiver.send_message(u'cursor_busy')
+        self.application.set_busy_cursor()
         if path:
             Settings().setValue(self.settingsSection + u'/last directory export', path)
             theme_path = os.path.join(path, theme + u'.otz')
@@ -391,7 +392,8 @@
             finally:
                 if theme_zip:
                     theme_zip.close()
-        Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
+
 
     def on_import_theme(self):
         """
@@ -406,12 +408,12 @@
         log.info(u'New Themes %s', unicode(files))
         if not files:
             return
-        Receiver.send_message(u'cursor_busy')
+        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()
-        Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
 
     def load_themes(self, first_time=False):
         """
@@ -848,3 +850,13 @@
         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/wizard.py'
--- openlp/core/ui/wizard.py	2013-02-01 21:34:23 +0000
+++ openlp/core/ui/wizard.py	2013-02-03 19:24:22 +0000
@@ -34,7 +34,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import build_icon, Receiver, Settings, translate, UiStrings
+from openlp.core.lib import build_icon, Receiver, Registry, Settings, translate, UiStrings
 from openlp.core.lib.ui import add_welcome_page
 
 log = logging.getLogger(__name__)
@@ -219,7 +219,7 @@
         self.progressLabel.setText(status_text)
         if increment > 0:
             self.progressBar.setValue(self.progressBar.value() + increment)
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
 
     def preWizard(self):
         """
@@ -237,7 +237,7 @@
         self.progressBar.setValue(self.progressBar.maximum())
         self.finishButton.setVisible(True)
         self.cancelButton.setVisible(False)
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
 
     def getFileName(self, title, editbox, setting_name, filters=u''):
         """
@@ -286,3 +286,13 @@
         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-02 20:18:34 +0000
+++ openlp/core/utils/__init__.py	2013-02-03 19:24:22 +0000
@@ -39,7 +39,7 @@
 import sys
 import urllib2
 
-from openlp.core.lib import Settings
+from openlp.core.lib import Registry, Settings
 
 from PyQt4 import QtGui, QtCore
 
@@ -424,7 +424,7 @@
     if not page:
         return None
     if update_openlp:
-        Receiver.send_message(u'openlp_process_events')
+        Registry().get(u'application').process_events()
     log.debug(page)
     return page
 

=== modified file 'openlp/plugins/bibles/forms/bibleimportform.py'
--- openlp/plugins/bibles/forms/bibleimportform.py	2013-01-18 20:35:30 +0000
+++ openlp/plugins/bibles/forms/bibleimportform.py	2013-02-03 19:24:22 +0000
@@ -34,7 +34,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, translate, Settings, UiStrings
+from openlp.core.lib import 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)
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
 
     def performWizard(self):
         """

=== modified file 'openlp/plugins/bibles/forms/bibleupgradeform.py'
--- openlp/plugins/bibles/forms/bibleupgradeform.py	2013-01-18 20:35:30 +0000
+++ openlp/plugins/bibles/forms/bibleupgradeform.py	2013-02-03 19:24:22 +0000
@@ -335,7 +335,7 @@
         """
         OpenLPWizard.preWizard(self)
         self.progressLabel.setText(translate('BiblesPlugin.UpgradeWizardForm', 'Starting upgrade...'))
-        Receiver.send_message(u'openlp_process_events')
+        self.application.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']))
-                            Receiver.send_message(u'openlp_process_events')
+                            self.application.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']))
-                        Receiver.send_message(u'openlp_process_events')
+                        self.application.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-01-11 00:19:11 +0000
+++ openlp/plugins/bibles/forms/editbibleform.py	2013-02-03 19:24:22 +0000
@@ -32,7 +32,7 @@
 
 from PyQt4 import QtGui
 
-from openlp.core.lib import Receiver, translate, UiStrings
+from openlp.core.lib import Registry, 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,8 +122,7 @@
                     if book.name != custom_names[abbr]:
                         if not self.validateBook(custom_names[abbr], abbr):
                             return
-        Receiver.send_message(u'openlp_process_events')
-        Receiver.send_message(u'cursor_busy')
+        self.application.set_busy_cursor()
         self.manager.save_meta_data(self.bible, version, copyright, permissions, book_name_language)
         if not self.webbible:
             for abbr, book in self.books.iteritems():
@@ -132,7 +131,7 @@
                         book.name = custom_names[abbr]
                         self.manager.update_book(self.bible, book)
         self.bible = None
-        Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
         QtGui.QDialog.accept(self)
 
     def validateMeta(self, name, copyright):
@@ -189,3 +188,13 @@
                             % 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-01-01 16:33:41 +0000
+++ openlp/plugins/bibles/lib/csvbible.py	2013-02-03 19:24:22 +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'])
-            Receiver.send_message(u'openlp_process_events')
+            self.application.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.'))
-            Receiver.send_message(u'openlp_process_events')
+            self.application.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-01-11 00:35:00 +0000
+++ openlp/plugins/bibles/lib/db.py	2013-02-03 19:24:22 +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, translate
+from openlp.core.lib import Receiver, Registry, 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,6 +549,16 @@
         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-01-11 00:35:00 +0000
+++ openlp/plugins/bibles/lib/http.py	2013-02-03 19:24:22 +0000
@@ -38,7 +38,7 @@
 
 from BeautifulSoup import BeautifulSoup, NavigableString, Tag
 
-from openlp.core.lib import Receiver, translate
+from openlp.core.lib import Receiver, Registry,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(raw_verse_num))
+                    log.warn(u'Illegal verse number: %s', unicode(verse))
                 verses.append((verse, text))
         verse_list = {}
         for verse, text in verses[::-1]:
@@ -235,9 +235,10 @@
         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
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
         div = soup.find('div', 'result-text-style-normal')
         self._clean_soup(div)
         span_list = div.findAll('span', 'text')
@@ -281,7 +282,7 @@
         if not soup:
             send_error_message(u'parse')
             return None
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
         content = soup.find(u'table', u'infotable')
         if content:
             content = content.findAll(u'tr')
@@ -329,7 +330,7 @@
         soup = get_soup_for_bible_ref(chapter_url, header)
         if not soup:
             return None
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
         content = soup.find(u'div', u'content')
         if not content:
             log.error(u'No verses found in the Bibleserver response.')
@@ -339,7 +340,7 @@
         verse_number = re.compile(r'v(\d{1,2})(\d{3})(\d{3}) verse.*')
         verses = {}
         for verse in content:
-            Receiver.send_message(u'openlp_process_events')
+            self.application.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)
@@ -402,7 +403,7 @@
         soup = get_soup_for_bible_ref(chapter_url)
         if not soup:
             return None
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
         html_verses = soup.findAll(u'span', u'versetext')
         if not html_verses:
             log.error(u'No verses found in the CrossWalk response.')
@@ -412,27 +413,25 @@
         reduce_spaces = re.compile(r'[ ]{2,}')
         fix_punctuation = re.compile(r'[ ]+([.,;])')
         for verse in html_verses:
-            Receiver.send_message(u'openlp_process_events')
+            self.application.process_events()
             verse_number = int(verse.contents[0].contents[0])
             verse_text = u''
             for part in verse.contents:
-                Receiver.send_message(u'openlp_process_events')
+                self.application.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:
-                        Receiver.send_message(u'openlp_process_events')
+                        self.application.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:
-                                Receiver.send_message(u'openlp_process_events')
+                                self.application.process_events()
                                 if isinstance(subsub, NavigableString):
                                     verse_text = verse_text + subsub
-            Receiver.send_message(u'openlp_process_events')
+            self.application.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 ')
@@ -598,7 +597,7 @@
                 return []
             book = db_book.name
             if BibleDB.get_verse_count(self, book_id, reference[1]) == 0:
-                Receiver.send_message(u'cursor_busy')
+                self.application.set_busy_cursor()
                 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
@@ -606,14 +605,14 @@
                     ## we get a correct book. For example it is possible
                     ## to request ac and get Acts back.
                     book_name = search_results.book
-                    Receiver.send_message(u'openlp_process_events')
+                    self.application.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)
-                    Receiver.send_message(u'openlp_process_events')
-                Receiver.send_message(u'cursor_normal')
-            Receiver.send_message(u'openlp_process_events')
+                    self.application.process_events()
+                self.application.set_normal_cursor()
+            self.application.process_events()
         return BibleDB.get_verses(self, reference_list, show_error)
 
     def get_chapter(self, book, chapter):
@@ -660,6 +659,16 @@
         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):
     """
@@ -701,7 +710,7 @@
     if not soup:
         send_error_message(u'parse')
         return None
-    Receiver.send_message(u'openlp_process_events')
+    Registry().get(u'application').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-02 20:54:34 +0000
+++ openlp/plugins/bibles/lib/mediaitem.py	2013-02-03 19:24:22 +0000
@@ -614,7 +614,7 @@
         """
         log.debug(u'Advanced Search Button clicked')
         self.advancedSearchButton.setEnabled(False)
-        Receiver.send_message(u'openlp_process_events')
+        self.application.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)
-        Receiver.send_message(u'cursor_busy')
+        self.application.set_busy_cursor()
         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,8 +640,7 @@
             self.displayResults(bible, second_bible)
         self.advancedSearchButton.setEnabled(True)
         self.checkSearchResult()
-        Receiver.send_message(u'cursor_normal')
-        Receiver.send_message(u'openlp_process_events')
+        self.application.set_normal_cursor()
 
     def onQuickSearchButton(self):
         """
@@ -650,7 +649,7 @@
         """
         log.debug(u'Quick Search Button clicked')
         self.quickSearchButton.setEnabled(False)
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
         bible = self.quickVersionComboBox.currentText()
         second_bible = self.quickSecondComboBox.currentText()
         text = self.quickSearchEdit.text()
@@ -662,7 +661,7 @@
                     self.search_results[0].book.book_reference_id)
         else:
             # We are doing a 'Text Search'.
-            Receiver.send_message(u'cursor_busy')
+            self.application.set_busy_cursor()
             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:
@@ -697,8 +696,7 @@
             self.displayResults(bible, second_bible)
         self.quickSearchButton.setEnabled(True)
         self.checkSearchResult()
-        Receiver.send_message(u'cursor_normal')
-        Receiver.send_message(u'openlp_process_events')
+        self.application.set_normal_cursor()
 
     def displayResults(self, bible, second_bible=u''):
         """

=== modified file 'openlp/plugins/bibles/lib/openlp1.py'
--- openlp/plugins/bibles/lib/openlp1.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/bibles/lib/openlp1.py	2013-02-03 19:24:22 +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)
-                Receiver.send_message(u'openlp_process_events')
+                self.application.process_events()
             self.session.commit()
         connection.close()
         return True

=== modified file 'openlp/plugins/bibles/lib/opensong.py'
--- openlp/plugins/bibles/lib/opensong.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/bibles/lib/opensong.py	2013-02-03 19:24:22 +0000
@@ -30,7 +30,7 @@
 import logging
 from lxml import etree, objectify
 
-from openlp.core.lib import Receiver, translate
+from openlp.core.lib import 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()
-            Receiver.send_message(u'openlp_process_events')
+            self.application.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-01-01 16:33:41 +0000
+++ openlp/plugins/bibles/lib/osis.py	2013-02-03 19:24:22 +0000
@@ -33,7 +33,7 @@
 import codecs
 import re
 
-from openlp.core.lib import Receiver, translate
+from openlp.core.lib import 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)
-                    Receiver.send_message(u'openlp_process_events')
+                    self.application.process_events()
             self.session.commit()
             if match_count == 0:
                 success = False

=== modified file 'openlp/plugins/custom/lib/mediaitem.py'
--- openlp/plugins/custom/lib/mediaitem.py	2013-01-29 17:19:19 +0000
+++ openlp/plugins/custom/lib/mediaitem.py	2013-02-03 19:24:22 +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:
-            Receiver.send_message(u'service_item_update', u'%s:%s:%s' % (custom.id, item.unique_identifier, False))
+            self.service_manager.service_item_update(custom.id, item.unique_identifier)
         else:
             if self.add_custom_from_service:
                 self.create_from_service_item(item)

=== modified file 'openlp/plugins/images/lib/mediaitem.py'
--- openlp/plugins/images/lib/mediaitem.py	2013-01-25 20:50:18 +0000
+++ openlp/plugins/images/lib/mediaitem.py	2013-02-03 19:24:22 +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)
-            Receiver.send_message(u'cursor_busy')
+            self.application.set_busy_cursor()
             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()
-            Receiver.send_message(u'cursor_normal')
+            self.application.set_normal_cursor()
         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()
-            Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
 
     def generateSlideData(self, service_item, item=None, xmlVersion=False,
         remote=False, context=ServiceItemContext.Service):

=== modified file 'openlp/plugins/presentations/lib/mediaitem.py'
--- openlp/plugins/presentations/lib/mediaitem.py	2013-01-27 07:36:04 +0000
+++ openlp/plugins/presentations/lib/mediaitem.py	2013-02-03 19:24:22 +0000
@@ -150,9 +150,8 @@
         """
         currlist = self.getFileList()
         titles = [os.path.split(file)[1] for file in currlist]
-        Receiver.send_message(u'cursor_busy')
+        self.application.set_busy_cursor()
         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,
@@ -206,10 +205,9 @@
                 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()
-            Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
 
     def onDeleteClick(self):
         """
@@ -219,7 +217,7 @@
             items = self.listView.selectedIndexes()
             row_list = [item.row() for item in items]
             row_list.sort(reverse=True)
-            Receiver.send_message(u'cursor_busy')
+            self.application.set_busy_cursor()
             self.main_window.displayProgressBar(len(row_list))
             for item in items:
                 filepath = unicode(item.data(QtCore.Qt.UserRole))
@@ -229,7 +227,7 @@
                     doc.close_presentation()
                 self.main_window.incrementProgressBar()
             self.main_window.finishedProgressBar()
-            Receiver.send_message(u'cursor_normal')
+            self.application.set_busy_cursor()
             for row in row_list:
                 self.listView.takeItem(row)
             Settings().setValue(self.settingsSection + u'/presentations files', self.getFileList())

=== modified file 'openlp/plugins/songs/forms/songexportform.py'
--- openlp/plugins/songs/forms/songexportform.py	2013-01-18 20:35:30 +0000
+++ openlp/plugins/songs/forms/songexportform.py	2013-02-03 19:24:22 +0000
@@ -226,7 +226,7 @@
         self.directoryLineEdit.clear()
         self.searchLineEdit.clear()
         # Load the list of songs.
-        Receiver.send_message(u'cursor_busy')
+        self.application.set_busy_cursor()
         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)
-        Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
 
     def preWizard(self):
         """
@@ -248,7 +248,7 @@
         """
         OpenLPWizard.preWizard(self)
         self.progressLabel.setText(translate('SongsPlugin.ExportWizardForm', 'Starting export...'))
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
 
     def performWizard(self):
         """

=== modified file 'openlp/plugins/songs/forms/songimportform.py'
--- openlp/plugins/songs/forms/songimportform.py	2013-01-31 22:01:41 +0000
+++ openlp/plugins/songs/forms/songimportform.py	2013-02-03 19:24:22 +0000
@@ -35,7 +35,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, Settings, UiStrings, translate
+from openlp.core.lib import Settings, 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
@@ -339,7 +339,7 @@
         """
         OpenLPWizard.preWizard(self)
         self.progressLabel.setText(WizardStrings.StartingImport)
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
 
     def performWizard(self):
         """

=== modified file 'openlp/plugins/songs/forms/songmaintenanceform.py'
--- openlp/plugins/songs/forms/songmaintenanceform.py	2013-01-31 22:01:41 +0000
+++ openlp/plugins/songs/forms/songmaintenanceform.py	2013-02-03 19:24:22 +0000
@@ -374,12 +374,12 @@
         """
         Utility method to merge two objects to leave one in the database.
         """
-        Receiver.send_message(u'cursor_busy')
+        self.application.set_busy_cursor()
         merge(dbObject)
         reset()
         if not self.fromSongEdit:
             Receiver.send_message(u'songs_load_list')
-        Receiver.send_message(u'cursor_normal')
+        self.application.set_normal_cursor()
 
     def mergeAuthors(self, oldAuthor):
         """
@@ -509,3 +509,12 @@
             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/lib/mediaitem.py'
--- openlp/plugins/songs/lib/mediaitem.py	2013-01-27 20:36:18 +0000
+++ openlp/plugins/songs/lib/mediaitem.py	2013-02-03 19:24:22 +0000
@@ -361,7 +361,7 @@
                 QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No),
                 QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No:
                 return
-            Receiver.send_message(u'cursor_busy')
+            self.application.set_busy_cursor()
             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()
-            Receiver.send_message(u'cursor_normal')
+            self.application.set_normal_cursor()
             self.onSearchTextButtonClicked()
 
     def onCloneClick(self):
@@ -526,7 +526,7 @@
             temporary = True
         # Update service with correct song id.
         if editId:
-            Receiver.send_message(u'service_item_update%s:%s:%s' % (editId, item.unique_identifier, temporary))
+            self.service_manager.service_item_update(editId, item.unique_identifier, temporary)
 
     def search(self, string, showError):
         """

=== modified file 'openlp/plugins/songs/lib/openlyricsexport.py'
--- openlp/plugins/songs/lib/openlyricsexport.py	2013-01-06 17:25:49 +0000
+++ openlp/plugins/songs/lib/openlyricsexport.py	2013-02-03 19:24:22 +0000
@@ -35,7 +35,7 @@
 
 from lxml import etree
 
-from openlp.core.lib import check_directory_exists, Receiver, translate
+from openlp.core.lib import Registry, check_directory_exists, 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:
-            Receiver.send_message(u'openlp_process_events')
+            self.application.process_events()
             if self.parent.stop_export_flag:
                 return False
             self.parent.incrementProgressBar(translate('SongsPlugin.OpenLyricsExport', 'Exporting "%s"...') %
@@ -80,3 +80,13 @@
             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 14:40:48 +0000
+++ openlp/plugins/songs/songsplugin.py	2013-02-03 19:24:22 +0000
@@ -38,7 +38,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Plugin, StringContent, build_icon, translate, Receiver, UiStrings
+from openlp.core.lib import Plugin, StringContent, build_icon, translate, 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,9 +96,6 @@
         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):
         """
@@ -244,9 +241,9 @@
         If the first time wizard has run, this function is run to import all the
         new songs into the database.
         """
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
         self.onToolsReindexItemTriggered()
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
         db_dir = unicode(os.path.join(unicode(gettempdir(), get_filesystem_encoding()), u'openlp'))
         if not os.path.exists(db_dir):
             return
@@ -254,12 +251,12 @@
         song_count = 0
         for sfile in os.listdir(db_dir):
             if sfile.startswith(u'songs_') and sfile.endswith(u'.sqlite'):
-                Receiver.send_message(u'openlp_process_events')
+                self.application.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
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
         progress = QtGui.QProgressDialog(self.main_window)
         progress.setWindowModality(QtCore.Qt.WindowModal)
         progress.setWindowTitle(translate('OpenLP.Ui', 'Importing Songs'))
@@ -268,11 +265,11 @@
         progress.setRange(0, song_count)
         progress.setMinimumDuration(0)
         progress.forceShow()
-        Receiver.send_message(u'openlp_process_events')
+        self.application.process_events()
         for db in song_dbs:
             importer = OpenLPSongImport(self.manager, filename=db)
             importer.doImport(progress)
-            Receiver.send_message(u'openlp_process_events')
+            self.application.process_events()
         progress.setValue(song_count)
         self.mediaItem.onSearchTextButtonClicked()
 
@@ -281,7 +278,7 @@
         Time to tidy up on exit
         """
         log.info(u'Songs Finalising')
-        self.clearTemporarySongs()
+        self.new_service_created()
         # Clean up files and connections
         self.manager.finalise()
         self.songImportItem.setVisible(False)
@@ -293,13 +290,18 @@
         action_list.remove_action(self.toolsReindexItem, UiStrings().Tools)
         Plugin.finalise(self)
 
-    def clearTemporarySongs(self):
-        # Remove temporary songs
+    def new_service_created(self):
+        """
+        Remove temporary songs from the database
+        """
         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	2012-12-29 20:56:56 +0000
+++ setup.py	2013-02-03 19:24:22 +0000
@@ -152,7 +152,7 @@
     url='http://openlp.org/',
     license='GNU General Public License',
     packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
-    scripts=['openlp.pyw'],
+    scripts=['openlp.py'],
     include_package_data=True,
     zip_safe=False,
     install_requires=[


Follow ups