← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~raoul-snyman/openlp/song-wizard into lp:openlp

 

Raoul Snyman has proposed merging lp:~raoul-snyman/openlp/song-wizard into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)


The long-awaited Song Import Wizard.
-- 
https://code.launchpad.net/~raoul-snyman/openlp/song-wizard/+merge/33430
Your team OpenLP Core is requested to review the proposed merge of lp:~raoul-snyman/openlp/song-wizard into lp:openlp.
=== modified file 'openlp.pyw'
--- openlp.pyw	2010-07-30 22:48:09 +0000
+++ openlp.pyw	2010-08-23 18:07:46 +0000
@@ -47,7 +47,6 @@
 
 QDockWidget::title
 {
-  /*background: palette(dark);*/
   border: 1px solid palette(dark);
   padding-left: 5px;
   padding-top: 2px;

=== modified file 'openlp/plugins/bibles/lib/mediaitem.py'
--- openlp/plugins/bibles/lib/mediaitem.py	2010-08-10 16:49:52 +0000
+++ openlp/plugins/bibles/lib/mediaitem.py	2010-08-23 18:07:46 +0000
@@ -401,9 +401,10 @@
             self.AdvancedBookComboBox.itemData(item).toInt()[0])
 
     def onImportClick(self):
-        self.bibleimportform = ImportWizardForm(self,
-            self.parent.manager, self.parent)
-        self.bibleimportform.exec_()
+        if not hasattr(self, u'import_wizard'):
+            self.import_wizard = ImportWizardForm(self, self.parent.manager,
+                self.parent)
+        self.import_wizard.exec_()
         self.reloadBibles()
 
     def onAdvancedFromVerse(self):

=== modified file 'openlp/plugins/songs/forms/songimportform.py'
--- openlp/plugins/songs/forms/songimportform.py	2010-07-31 02:06:44 +0000
+++ openlp/plugins/songs/forms/songimportform.py	2010-08-23 18:07:46 +0000
@@ -25,24 +25,25 @@
 ###############################################################################
 
 import logging
+import os
 
 from PyQt4 import QtCore, QtGui
 
 from songimportwizard import Ui_SongImportWizard
 from openlp.core.lib import Receiver, SettingsManager, translate
 #from openlp.core.utils import AppLocation
-from openlp.plugins.songs.lib import SongFormat
+from openlp.plugins.songs.lib.importer import SongFormat
 
 log = logging.getLogger(__name__)
 
 class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
     """
-    This is the Bible Import Wizard, which allows easy importing of Bibles
-    into OpenLP from other formats like OSIS, CSV and OpenSong.
+    This is the Song Import Wizard, which allows easy importing of Songs
+    into OpenLP from other formats like OpenLyrics, OpenSong and CCLI.
     """
-    log.info(u'BibleImportForm loaded')
+    log.info(u'SongImportForm loaded')
 
-    def __init__(self, parent, manager, songsplugin):
+    def __init__(self, parent, manager, plugin):
         """
         Instantiate the wizard, and run any extra setup we need to.
 
@@ -53,10 +54,10 @@
             The configuration object for storing and retrieving settings.
 
         ``manager``
-            The Bible manager.
+            The songs manager.
 
-        ``bibleplugin``
-            The Bible plugin.
+        ``plugin``
+            The songs plugin.
         """
         QtGui.QWizard.__init__(self, parent)
         self.setupUi(self)
@@ -64,20 +65,41 @@
         self.finishButton = self.button(QtGui.QWizard.FinishButton)
         self.cancelButton = self.button(QtGui.QWizard.CancelButton)
         self.manager = manager
-        self.songsplugin = songsplugin
+        self.plugin = plugin
         #self.manager.set_process_dialog(self)
-#        QtCore.QObject.connect(self.OsisFileButton,
-#            QtCore.SIGNAL(u'clicked()'),
-#            self.onOsisFileButtonClicked)
-#        QtCore.QObject.connect(self.BooksFileButton,
-#            QtCore.SIGNAL(u'clicked()'),
-#            self.onBooksFileButtonClicked)
-#        QtCore.QObject.connect(self.CsvVersesFileButton,
-#            QtCore.SIGNAL(u'clicked()'),
-#            self.onCsvVersesFileButtonClicked)
-#        QtCore.QObject.connect(self.OpenSongBrowseButton,
-#            QtCore.SIGNAL(u'clicked()'),
-#            self.onOpenSongBrowseButtonClicked)
+        QtCore.QObject.connect(self.openLP2BrowseButton,
+            QtCore.SIGNAL(u'clicked()'),
+            self.onOpenLP2BrowseButtonClicked)
+        QtCore.QObject.connect(self.openLP1BrowseButton,
+            QtCore.SIGNAL(u'clicked()'),
+            self.onOpenLP1BrowseButtonClicked)
+        QtCore.QObject.connect(self.openLyricsAddButton,
+            QtCore.SIGNAL(u'clicked()'),
+            self.onOpenLyricsAddButtonClicked)
+        QtCore.QObject.connect(self.openLyricsRemoveButton,
+            QtCore.SIGNAL(u'clicked()'),
+            self.onOpenLyricsRemoveButtonClicked)
+        QtCore.QObject.connect(self.openSongAddButton,
+            QtCore.SIGNAL(u'clicked()'),
+            self.onOpenSongAddButtonClicked)
+        QtCore.QObject.connect(self.openSongRemoveButton,
+            QtCore.SIGNAL(u'clicked()'),
+            self.onOpenSongRemoveButtonClicked)
+        QtCore.QObject.connect(self.wordsOfWorshipAddButton,
+            QtCore.SIGNAL(u'clicked()'),
+            self.onWordsOfWorshipAddButtonClicked)
+        QtCore.QObject.connect(self.wordsOfWorshipRemoveButton,
+            QtCore.SIGNAL(u'clicked()'),
+            self.onWordsOfWorshipRemoveButtonClicked)
+        QtCore.QObject.connect(self.songsOfFellowshipAddButton,
+            QtCore.SIGNAL(u'clicked()'),
+            self.onSongsOfFellowshipAddButtonClicked)
+        QtCore.QObject.connect(self.songsOfFellowshipRemoveButton,
+            QtCore.SIGNAL(u'clicked()'),
+            self.onSongsOfFellowshipRemoveButtonClicked)
+        QtCore.QObject.connect(self.genericBrowseButton,
+            QtCore.SIGNAL(u'clicked()'),
+            self.onGenericBrowseButtonClicked)
         QtCore.QObject.connect(self.cancelButton,
             QtCore.SIGNAL(u'clicked(bool)'),
             self.onCancelButtonClicked)
@@ -101,51 +123,182 @@
             return True
         elif self.currentId() == 1:
             # Select page
-            source_format = self.field(u'source_format').toInt()[0]
-            if source_format == SongFormat.OpenLyrics:
-                if self.OpenLyricsFileListWidget.count() == 0:
+            source_format = self.formatComboBox.currentIndex()
+            if source_format == SongFormat.OpenLP2:
+                if self.openLP2FilenameEdit.text().isEmpty():
+                    QtGui.QMessageBox.critical(self,
+                        translate('SongsPlugin.ImportWizardForm',
+                            'No OpenLP 2.0 Song Database Selected'),
+                        translate('SongsPlugin.ImportWizardForm',
+                            'You need to select an OpenLP 2.0 song database '
+                            'file to import from.'))
+                    self.openLP2BrowseButton.setFocus()
+                    return False
+            elif source_format == SongFormat.OpenLP1:
+                if self.openSongFilenameEdit.text().isEmpty():
+                    QtGui.QMessageBox.critical(self,
+                        translate('SongsPlugin.ImportWizardForm',
+                            'No openlp.org 1.x Song Database Selected'),
+                        translate('SongsPlugin.ImportWizardForm',
+                            'You need to select an openlp.org 1.x song '
+                            'database file to import from.'))
+                    self.openLP1BrowseButton.setFocus()
+                    return False
+            elif source_format == SongFormat.OpenLyrics:
+                if self.openLyricsFileListWidget.count() == 0:
                     QtGui.QMessageBox.critical(self,
                         translate('SongsPlugin.ImportWizardForm',
                             'No OpenLyrics Files Selected'),
                         translate('SongsPlugin.ImportWizardForm',
                             'You need to add at least one OpenLyrics '
                             'song file to import from.'))
-                    self.OpenLyricsAddButton.setFocus()
+                    self.openLyricsAddButton.setFocus()
                     return False
             elif source_format == SongFormat.OpenSong:
-                if self.OpenSongFileListWidget.count() == 0:
+                if self.openSongFileListWidget.count() == 0:
                     QtGui.QMessageBox.critical(self,
                         translate('SongsPlugin.ImportWizardForm',
                             'No OpenSong Files Selected'),
                         translate('SongsPlugin.ImportWizardForm',
                             'You need to add at least one OpenSong '
                             'song file to import from.'))
-                    self.OpenSongAddButton.setFocus()
-                    return False
-            elif source_format == SongFormat.CCLI:
-                if self.CCLIFileListWidget.count() == 0:
+                    self.openSongAddButton.setFocus()
+                    return False
+            elif source_format == SongFormat.WordsOfWorship:
+                if self.wordsOfWorshipListWidget.count() == 0:
+                    QtGui.QMessageBox.critical(self,
+                        translate('SongsPlugin.ImportWizardForm',
+                            'No Words of Worship Files Selected'),
+                        translate('SongsPlugin.ImportWizardForm',
+                            'You need to add at least one Words of Worship '
+                            'file to import from.'))
+                    self.wordsOfWorshipAddButton.setFocus()
+                    return False
+            elif source_format == SongFormat.ccli:
+                if self.ccliFileListWidget.count() == 0:
                     QtGui.QMessageBox.critical(self,
                         translate('SongsPlugin.ImportWizardForm',
                             'No CCLI Files Selected'),
                         translate('SongsPlugin.ImportWizardForm',
                             'You need to add at least one CCLI file '
                             'to import from.'))
-                    self.CCLIAddButton.setFocus()
-                    return False
-            elif source_format == SongFormat.CSV:
-                if self.CSVFilenameEdit.text().isEmpty():
-                    QtGui.QMessageBox.critical(self,
-                        translate('SongsPlugin.ImportWizardForm',
-                            'No CSV File Selected'),
-                        translate('SongsPlugin.ImportWizardForm',
-                            'You need to specify a CSV file to import from.'))
-                    self.CSVFilenameEdit.setFocus()
+                    self.ccliAddButton.setFocus()
+                    return False
+            elif source_format == SongFormat.SongsOfFellowship:
+                if self.songsOfFellowshipFilenameEdit.text().isEmpty():
+                    QtGui.QMessageBox.critical(self,
+                        translate('SongsPlugin.ImportWizardForm',
+                            'No Songs of Fellowship File Selected'),
+                        translate('SongsPlugin.ImportWizardForm',
+                            'You need to select a Songs of Fellowship file to '
+                            'import from.'))
+                    self.songsOfFellowshipBrowseButton.setFocus()
+                    return False
+            elif source_format == SongFormat.Generic:
+                if self.genericFilenameEdit.text().isEmpty():
+                    QtGui.QMessageBox.critical(self,
+                        translate('SongsPlugin.ImportWizardForm',
+                            'No Document/Presentation Selected'),
+                        translate('SongsPlugin.ImportWizardForm',
+                            'You need to select a document/presentation file '
+                            'to import from.'))
+                    self.genericBrowseButton.setFocus()
                     return False
             return True
         elif self.currentId() == 2:
             # Progress page
             return True
 
+    def getFileName(self, title, editbox):
+        filename = QtGui.QFileDialog.getOpenFileName(self, title,
+            SettingsManager.get_last_dir(self.plugin.settingsSection, 1))
+        if filename:
+            editbox.setText(filename)
+            SettingsManager.set_last_dir(
+                self.plugin.settingsSection,
+                os.path.split(unicode(filename))[0], 1)
+
+    def getFiles(self, title, listbox):
+        filenames = QtGui.QFileDialog.getOpenFileNames(self, title,
+            SettingsManager.get_last_dir(self.plugin.settingsSection, 1))
+        if filenames:
+            listbox.addItems(filenames)
+            SettingsManager.set_last_dir(
+                self.plugin.settingsSection,
+                os.path.split(unicode(filenames[0]))[0], 1)
+
+    def getListOfFiles(self, listbox):
+        files = []
+        for row in range(0, listbox.count()):
+            files.append(unicode(listbox.item(row)))
+        return files
+
+    def removeSelectedItems(self, listbox):
+        for item in listbox.selectedItems():
+            item = listbox.takeItem(listbox.row(item))
+            del item
+
+    def onOpenLP2BrowseButtonClicked(self):
+        self.getFileName(
+            translate('SongsPlugin.ImportWizardForm',
+            'Select OpenLP 2.0 Database File'),
+            self.openLP2FilenameEdit
+        )
+
+    def onOpenLP1BrowseButtonClicked(self):
+        self.getFileName(
+            translate('SongsPlugin.ImportWizardForm',
+            'Select openlp.org 1.x Database File'),
+            self.openLP1FilenameEdit
+        )
+
+    def onOpenLyricsAddButtonClicked(self):
+        self.getFiles(
+            translate('SongsPlugin.ImportWizardForm',
+            'Select OpenLyrics Files'),
+            self.openLyricsFileListWidget
+        )
+
+    def onOpenLyricsRemoveButtonClicked(self):
+        self.removeSelectedItems(self.openLyricsFileListWidget)
+
+    def onOpenSongAddButtonClicked(self):
+        self.getFiles(
+            translate('SongsPlugin.ImportWizardForm',
+            'Select Open Song Files'),
+            self.openSongFileListWidget
+        )
+
+    def onOpenSongRemoveButtonClicked(self):
+        self.removeSelectedItems(self.openSongFileListWidget)
+
+    def onWordsOfWorshipAddButtonClicked(self):
+        self.getFiles(
+            translate('SongsPlugin.ImportWizardForm',
+            'Select Words of Worship Files'),
+            self.wordsOfWorshipFileListWidget
+        )
+
+    def onWordsOfWorshipRemoveButtonClicked(self):
+        self.removeSelectedItems(self.wordsOfWorshipFileListWidget)
+
+    def onSongsOfFellowshipAddButtonClicked(self):
+        self.getFiles(
+            translate('SongsPlugin.ImportWizardForm',
+            'Select Songs of Fellowship Files'),
+            self.songsOfFellowshipFileListWidget
+        )
+
+    def onSongsOfFellowshipRemoveButtonClicked(self):
+        self.removeSelectedItems(self.songsOfFellowshipFileListWidget)
+
+    def onGenericBrowseButtonClicked(self):
+        self.getFileName(
+            translate('SongsPlugin.ImportWizardForm',
+            'Select Document/Presentation File'),
+            self.genericFilenameEdit
+        )
+
     def onCancelButtonClicked(self, checked):
         """
         Stop the import on pressing the cancel button.
@@ -155,100 +308,96 @@
             Receiver.send_message(u'openlp_stop_song_import')
 
     def onCurrentIdChanged(self, id):
-        if id == 3:
+        if id == 2:
             self.preImport()
             self.performImport()
             self.postImport()
 
     def registerFields(self):
-        self.SourcePage.registerField(u'source_format', self.FormatComboBox)
+        pass
 
     def setDefaults(self):
-        self.setField(u'source_format', QtCore.QVariant(0))
-        self.OpenLyricsFileListWidget.clear()
-        self.OpenSongFileListWidget.clear()
-        self.CCLIFileListWidget.clear()
-        self.CSVFilenameEdit.setText(u'')
-
-    def getFileName(self, title, editbox):
-        filename = QtGui.QFileDialog.getOpenFileName(self, title,
-            SettingsManager.get_last_dir(self.songsplugin.settingsSection, 1))
-        if filename:
-            editbox.setText(filename)
-            SettingsManager.set_last_dir(self.songsplugin.settingsSection,
-                filename, 1)
+        self.formatComboBox.setCurrentIndex(0)
+        self.openLP2FilenameEdit.setText(u'')
+        self.openLP1FilenameEdit.setText(u'')
+        self.openLyricsFileListWidget.clear()
+        self.openSongFileListWidget.clear()
+        self.wordsOfWorshipFileListWidget.clear()
+        self.ccliFileListWidget.clear()
+        self.songsOfFellowshipFileListWidget.clear()
+        self.genericFilenameEdit.setText(u'')
+        #self.csvFilenameEdit.setText(u'')
 
     def incrementProgressBar(self, status_text):
         log.debug(u'IncrementBar %s', status_text)
-        self.ImportProgressLabel.setText(status_text)
-        self.ImportProgressBar.setValue(self.ImportProgressBar.value() + 1)
+        self.importProgressLabel.setText(status_text)
+        self.importProgressBar.setValue(self.importProgressBar.value() + 1)
         Receiver.send_message(u'process_events')
 
     def preImport(self):
         self.finishButton.setVisible(False)
-        self.ImportProgressBar.setMinimum(0)
-        self.ImportProgressBar.setMaximum(1188)
-        self.ImportProgressBar.setValue(0)
-        self.ImportProgressLabel.setText(
+        self.importProgressBar.setMinimum(0)
+        self.importProgressBar.setMaximum(1188)
+        self.importProgressBar.setValue(0)
+        self.importProgressLabel.setText(
             translate('SongsPlugin.ImportWizardForm', 'Starting import...'))
         Receiver.send_message(u'process_events')
 
     def performImport(self):
-        pass
-#        source_format = self.field(u'source_format').toInt()[0]
-#        importer = None
-#        if bible_type == BibleFormat.OSIS:
-#            # Import an OSIS bible
-#            importer = self.manager.import_bible(BibleFormat.OSIS,
-#                name=license_version,
-#                filename=unicode(self.field(u'osis_location').toString())
-#            )
-#        elif bible_type == BibleFormat.CSV:
-#            # Import a CSV bible
-#            importer = self.manager.import_bible(BibleFormat.CSV,
-#                name=license_version,
-#                booksfile=unicode(self.field(u'csv_booksfile').toString()),
-#                versefile=unicode(self.field(u'csv_versefile').toString())
-#            )
-#        elif bible_type == BibleFormat.OpenSong:
-#            # Import an OpenSong bible
-#            importer = self.manager.import_bible(BibleFormat.OpenSong,
-#                name=license_version,
-#                filename=unicode(self.field(u'opensong_file').toString())
-#            )
-#        elif bible_type == BibleFormat.WebDownload:
-#            # Import a bible from the web
-#            self.ImportProgressBar.setMaximum(1)
-#            download_location = self.field(u'web_location').toInt()[0]
-#            bible_version = self.BibleComboBox.currentText()
-#            if not isinstance(bible_version, unicode):
-#                bible_version = unicode(bible_version, u'utf8')
-#            if download_location == WebDownload.Crosswalk:
-#                bible = self.web_bible_list[WebDownload.Crosswalk][bible_version]
-#            elif download_location == WebDownload.BibleGateway:
-#                bible = self.web_bible_list[WebDownload.BibleGateway][bible_version]
-#            importer = self.manager.import_bible(
-#                BibleFormat.WebDownload,
-#                name=license_version,
-#                download_source=WebDownload.get_name(download_location),
-#                download_name=bible,
-#                proxy_server=unicode(self.field(u'proxy_server').toString()),
-#                proxy_username=unicode(self.field(u'proxy_username').toString()),
-#                proxy_password=unicode(self.field(u'proxy_password').toString())
-#            )
-#        success = importer.do_import()
-#        if success:
-#            self.manager.save_meta_data(license_version, license_version,
-#                license_copyright, license_permission)
-#            self.manager.reload_bibles()
-#            self.ImportProgressLabel.setText(translate('SongsPlugin.SongImportForm', 'Finished import.'))
-#        else:
-#            self.ImportProgressLabel.setText(
-#                translate('SongsPlugin.SongImportForm', 'Your Bible import failed.'))
-#            importer.delete()
+        """
+        Perform the actual import. This method pulls in the correct importer
+        class, and then runs the ``do_import`` method of the importer to do
+        the actual importing.
+        """
+        source_format = self.formatComboBox.currentIndex()
+        importer = None
+        if source_format == SongFormat.OpenLP2:
+            # Import an OpenLP 2.0 database
+            importer = self.plugin.importSongs(SongFormat.OpenLP2,
+                filename=unicode(self.openLP2FilenameEdit.text())
+            )
+        #elif source_format == SongFormat.OpenLP1:
+        #    # Import an openlp.org database
+        #    importer = self.plugin.importSongs(SongFormat.OpenLP1,
+        #        filename=unicode(self.field(u'openlp1_filename').toString())
+        #    )
+        elif source_format == SongFormat.OpenLyrics:
+            # Import OpenLyrics songs
+            importer = self.plugin.importSongs(SongFormat.OpenLyrics,
+                filenames=self.getListOfFiles(self.openLyricsFileListWidget)
+            )
+        elif source_format == SongFormat.OpenSong:
+            # Import OpenSong songs
+            importer = self.plugin.importSongs(SongFormat.OpenSong,
+                filenames=self.getListOfFiles(self.openSongFileListWidget)
+            )
+        elif source_format == SongFormat.WordsOfWorship:
+            # Import Words Of Worship songs
+            importer = self.plugin.importSongs(SongFormat.WordsOfWorship,
+                filenames=self.getListOfFiles(self.wordsOfWorshipFileListWidget)
+            )
+        elif source_format == SongFormat.CCLI:
+            # Import Words Of Worship songs
+            importer = self.plugin.importSongs(SongFormat.CCLI,
+                filenames=self.getListOfFiles(self.ccliFileListWidget)
+            )
+        elif source_format == SongFormat.SongsOfFellowship:
+            # Import a Songs of Fellowship RTF file
+            importer = self.plugin.importSongs(SongFormat.SongsOfFellowship,
+                filenames=self.getListOfFiles(self.songsOfFellowshipFileListWidget)
+            )
+        success = importer.do_import()
+        if success:
+            # reload songs
+            self.ImportProgressLabel.setText(
+                translate('SongsPlugin.SongImportForm', 'Finished import.'))
+        else:
+            self.ImportProgressLabel.setText(
+                translate('SongsPlugin.SongImportForm',
+                'Your song import failed.'))
 
     def postImport(self):
-        self.ImportProgressBar.setValue(self.ImportProgressBar.maximum())
+        self.importProgressBar.setValue(self.importProgressBar.maximum())
         self.finishButton.setVisible(True)
         self.cancelButton.setVisible(False)
         Receiver.send_message(u'process_events')

=== modified file 'openlp/plugins/songs/forms/songimportwizard.py'
--- openlp/plugins/songs/forms/songimportwizard.py	2010-07-27 09:32:52 +0000
+++ openlp/plugins/songs/forms/songimportwizard.py	2010-08-23 18:07:46 +0000
@@ -29,247 +29,437 @@
 from openlp.core.lib import build_icon, translate
 
 class Ui_SongImportWizard(object):
-    def setupUi(self, SongImportWizard):
-        SongImportWizard.setObjectName(u'SongImportWizard')
-        SongImportWizard.resize(550, 386)
-        SongImportWizard.setModal(True)
-        SongImportWizard.setWizardStyle(QtGui.QWizard.ModernStyle)
-        SongImportWizard.setOptions(
+    def setupUi(self, songImportWizard):
+        openIcon = build_icon(u':/general/general_open.png')
+        deleteIcon = build_icon(u':/general/general_delete.png')
+        songImportWizard.setObjectName(u'songImportWizard')
+        songImportWizard.resize(550, 386)
+        songImportWizard.setModal(True)
+        songImportWizard.setWizardStyle(QtGui.QWizard.ModernStyle)
+        songImportWizard.setOptions(
             QtGui.QWizard.IndependentPages |
             QtGui.QWizard.NoBackButtonOnStartPage |
             QtGui.QWizard.NoBackButtonOnLastPage)
-        self.WelcomePage = QtGui.QWizardPage()
-        self.WelcomePage.setObjectName(u'WelcomePage')
-        self.WelcomePage.setPixmap(QtGui.QWizard.WatermarkPixmap,
+        self.welcomePage = QtGui.QWizardPage()
+        self.welcomePage.setObjectName(u'welcomePage')
+        self.welcomePage.setPixmap(QtGui.QWizard.WatermarkPixmap,
             QtGui.QPixmap(u':/wizards/wizard_importsong.bmp'))
-        self.WelcomeLayout = QtGui.QHBoxLayout(self.WelcomePage)
-        self.WelcomeLayout.setSpacing(8)
-        self.WelcomeLayout.setMargin(0)
-        self.WelcomeLayout.setObjectName(u'WelcomeLayout')
-        self.WelcomeTextLayout = QtGui.QVBoxLayout()
-        self.WelcomeTextLayout.setSpacing(8)
-        self.WelcomeTextLayout.setObjectName(u'WelcomeTextLayout')
-        self.TitleLabel = QtGui.QLabel(self.WelcomePage)
-        self.TitleLabel.setObjectName(u'TitleLabel')
-        self.WelcomeTextLayout.addWidget(self.TitleLabel)
-        self.WelcomeTopSpacer = QtGui.QSpacerItem(20, 40,
+        self.welcomeLayout = QtGui.QHBoxLayout(self.welcomePage)
+        self.welcomeLayout.setSpacing(8)
+        self.welcomeLayout.setMargin(0)
+        self.welcomeLayout.setObjectName(u'welcomeLayout')
+        self.welcomeTextLayout = QtGui.QVBoxLayout()
+        self.welcomeTextLayout.setSpacing(8)
+        self.welcomeTextLayout.setObjectName(u'welcomeTextLayout')
+        self.titleLabel = QtGui.QLabel(self.welcomePage)
+        self.titleLabel.setObjectName(u'TitleLabel')
+        self.welcomeTextLayout.addWidget(self.titleLabel)
+        self.welcomeTopSpacer = QtGui.QSpacerItem(20, 40,
             QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
-        self.WelcomeTextLayout.addItem(self.WelcomeTopSpacer)
-        self.InformationLabel = QtGui.QLabel(self.WelcomePage)
-        self.InformationLabel.setWordWrap(True)
-        self.InformationLabel.setMargin(10)
-        self.InformationLabel.setObjectName(u'InformationLabel')
-        self.WelcomeTextLayout.addWidget(self.InformationLabel)
-        self.WelcomeBottomSpacer = QtGui.QSpacerItem(20, 40,
+        self.welcomeTextLayout.addItem(self.welcomeTopSpacer)
+        self.informationLabel = QtGui.QLabel(self.welcomePage)
+        self.informationLabel.setWordWrap(True)
+        self.informationLabel.setMargin(10)
+        self.informationLabel.setObjectName(u'InformationLabel')
+        self.welcomeTextLayout.addWidget(self.informationLabel)
+        self.welcomeBottomSpacer = QtGui.QSpacerItem(20, 40,
             QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
-        self.WelcomeTextLayout.addItem(self.WelcomeBottomSpacer)
-        self.WelcomeLayout.addLayout(self.WelcomeTextLayout)
-        SongImportWizard.addPage(self.WelcomePage)
-        self.SourcePage = QtGui.QWizardPage()
-        self.SourcePage.setObjectName(u'SourcePage')
-        self.SourceLayout = QtGui.QVBoxLayout(self.SourcePage)
-        self.SourceLayout.setSpacing(8)
-        self.SourceLayout.setMargin(20)
-        self.SourceLayout.setObjectName(u'SourceLayout')
-        self.FormatLayout = QtGui.QHBoxLayout()
-        self.FormatLayout.setSpacing(8)
-        self.FormatLayout.setObjectName(u'FormatLayout')
-        self.FormatLabel = QtGui.QLabel(self.SourcePage)
-        self.FormatLabel.setObjectName(u'FormatLabel')
-        self.FormatLayout.addWidget(self.FormatLabel)
-        self.FormatComboBox = QtGui.QComboBox(self.SourcePage)
+        self.welcomeTextLayout.addItem(self.welcomeBottomSpacer)
+        self.welcomeLayout.addLayout(self.welcomeTextLayout)
+        songImportWizard.addPage(self.welcomePage)
+        self.sourcePage = QtGui.QWizardPage()
+        self.sourcePage.setObjectName(u'SourcePage')
+        self.sourceLayout = QtGui.QVBoxLayout(self.sourcePage)
+        self.sourceLayout.setSpacing(8)
+        self.sourceLayout.setMargin(20)
+        self.sourceLayout.setObjectName(u'SourceLayout')
+        self.formatLayout = QtGui.QHBoxLayout()
+        self.formatLayout.setSpacing(8)
+        self.formatLayout.setObjectName(u'FormatLayout')
+        self.formatLabel = QtGui.QLabel(self.sourcePage)
+        self.formatLabel.setObjectName(u'FormatLabel')
+        self.formatLayout.addWidget(self.formatLabel)
+        self.formatComboBox = QtGui.QComboBox(self.sourcePage)
         sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding,
             QtGui.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(
-            self.FormatComboBox.sizePolicy().hasHeightForWidth())
-        self.FormatComboBox.setSizePolicy(sizePolicy)
-        self.FormatComboBox.setObjectName(u'FormatComboBox')
-        self.FormatComboBox.addItem(u'')
-        self.FormatComboBox.addItem(u'')
-        self.FormatComboBox.addItem(u'')
-        self.FormatComboBox.addItem(u'')
-        self.FormatLayout.addWidget(self.FormatComboBox)
-        self.FormatSpacer = QtGui.QSpacerItem(40, 20,
-            QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
-        self.FormatLayout.addItem(self.FormatSpacer)
-        self.SourceLayout.addLayout(self.FormatLayout)
-        self.FormatStackedWidget = QtGui.QStackedWidget(self.SourcePage)
-        self.FormatStackedWidget.setObjectName(u'FormatStackedWidget')
-        self.OpenLyricsPage = QtGui.QWidget()
-        self.OpenLyricsPage.setObjectName(u'OpenLyricsPage')
-        self.OpenLyricsLayout = QtGui.QVBoxLayout(self.OpenLyricsPage)
-        self.OpenLyricsLayout.setSpacing(8)
-        self.OpenLyricsLayout.setMargin(0)
-        self.OpenLyricsLayout.setObjectName(u'OpenLyricsLayout')
-        self.OpenLyricsFileListWidget = QtGui.QListWidget(self.OpenLyricsPage)
-        self.OpenLyricsFileListWidget.setObjectName(u'OpenLyricsFileListWidget')
-        self.OpenLyricsLayout.addWidget(self.OpenLyricsFileListWidget)
-        self.OpenLyricsButtonLayout = QtGui.QHBoxLayout()
-        self.OpenLyricsButtonLayout.setSpacing(8)
-        self.OpenLyricsButtonLayout.setObjectName(u'OpenLyricsButtonLayout')
-        self.OpenLyricsAddButton = QtGui.QPushButton(self.OpenLyricsPage)
-        openIcon = build_icon(u':/general/general_open.png')
-        self.OpenLyricsAddButton.setIcon(openIcon)
-        self.OpenLyricsAddButton.setObjectName(u'OpenLyricsAddButton')
-        self.OpenLyricsButtonLayout.addWidget(self.OpenLyricsAddButton)
-        self.OpenLyricsButtonSpacer = QtGui.QSpacerItem(40, 20,
-            QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
-        self.OpenLyricsButtonLayout.addItem(self.OpenLyricsButtonSpacer)
-        self.OpenLyricsRemoveButton = QtGui.QPushButton(self.OpenLyricsPage)
-        deleteIcon = build_icon(u':/general/general_delete.png')
-        self.OpenLyricsRemoveButton.setIcon(deleteIcon)
-        self.OpenLyricsRemoveButton.setObjectName(u'OpenLyricsRemoveButton')
-        self.OpenLyricsButtonLayout.addWidget(self.OpenLyricsRemoveButton)
-        self.OpenLyricsLayout.addLayout(self.OpenLyricsButtonLayout)
-        self.FormatStackedWidget.addWidget(self.OpenLyricsPage)
-        self.OpenSongPage = QtGui.QWidget()
-        self.OpenSongPage.setObjectName(u'OpenSongPage')
-        self.OpenSongLayout = QtGui.QVBoxLayout(self.OpenSongPage)
-        self.OpenSongLayout.setSpacing(8)
-        self.OpenSongLayout.setMargin(0)
-        self.OpenSongLayout.setObjectName(u'OpenSongLayout')
-        self.OpenSongFileListWidget = QtGui.QListWidget(self.OpenSongPage)
-        self.OpenSongFileListWidget.setObjectName(u'OpenSongFileListWidget')
-        self.OpenSongLayout.addWidget(self.OpenSongFileListWidget)
-        self.OpenSongButtonLayout = QtGui.QHBoxLayout()
-        self.OpenSongButtonLayout.setSpacing(8)
-        self.OpenSongButtonLayout.setObjectName(u'OpenSongButtonLayout')
-        self.OpenSongAddButton = QtGui.QPushButton(self.OpenSongPage)
-        self.OpenSongAddButton.setIcon(openIcon)
-        self.OpenSongAddButton.setObjectName(u'OpenSongAddButton')
-        self.OpenSongButtonLayout.addWidget(self.OpenSongAddButton)
-        self.OpenSongButtonSpacer = QtGui.QSpacerItem(40, 20,
-            QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
-        self.OpenSongButtonLayout.addItem(self.OpenSongButtonSpacer)
-        self.OpenSongRemoveButton = QtGui.QPushButton(self.OpenSongPage)
-        self.OpenSongRemoveButton.setIcon(deleteIcon)
-        self.OpenSongRemoveButton.setObjectName(u'OpenSongRemoveButton')
-        self.OpenSongButtonLayout.addWidget(self.OpenSongRemoveButton)
-        self.OpenSongLayout.addLayout(self.OpenSongButtonLayout)
-        self.FormatStackedWidget.addWidget(self.OpenSongPage)
-        self.CCLIPage = QtGui.QWidget()
-        self.CCLIPage.setObjectName(u'CCLIPage')
-        self.CCLILayout = QtGui.QVBoxLayout(self.CCLIPage)
-        self.CCLILayout.setSpacing(8)
-        self.CCLILayout.setMargin(0)
-        self.CCLILayout.setObjectName(u'CCLILayout')
-        self.CCLIFileListWidget = QtGui.QListWidget(self.CCLIPage)
-        self.CCLIFileListWidget.setObjectName(u'CCLIFileListWidget')
-        self.CCLILayout.addWidget(self.CCLIFileListWidget)
-        self.CCLIButtonLayout = QtGui.QHBoxLayout()
-        self.CCLIButtonLayout.setSpacing(8)
-        self.CCLIButtonLayout.setObjectName(u'CCLIButtonLayout')
-        self.CCLIAddButton = QtGui.QPushButton(self.CCLIPage)
-        self.CCLIAddButton.setIcon(openIcon)
-        self.CCLIAddButton.setObjectName(u'CCLIAddButton')
-        self.CCLIButtonLayout.addWidget(self.CCLIAddButton)
-        self.CCLIButtonSpacer = QtGui.QSpacerItem(40, 20,
-            QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
-        self.CCLIButtonLayout.addItem(self.CCLIButtonSpacer)
-        self.CCLIRemoveButton = QtGui.QPushButton(self.CCLIPage)
-        self.CCLIRemoveButton.setIcon(deleteIcon)
-        self.CCLIRemoveButton.setObjectName(u'CCLIRemoveButton')
-        self.CCLIButtonLayout.addWidget(self.CCLIRemoveButton)
-        self.CCLILayout.addLayout(self.CCLIButtonLayout)
-        self.FormatStackedWidget.addWidget(self.CCLIPage)
-        self.CSVPage = QtGui.QWidget()
-        self.CSVPage.setObjectName(u'CSVPage')
-        self.CSVLayout = QtGui.QFormLayout(self.CSVPage)
-        self.CSVLayout.setMargin(0)
-        self.CSVLayout.setSpacing(8)
-        self.CSVLayout.setObjectName(u'CSVLayout')
-        self.CSVFilenameLabel = QtGui.QLabel(self.CSVPage)
-        self.CSVFilenameLabel.setObjectName(u'CSVFilenameLabel')
-        self.CSVLayout.setWidget(0, QtGui.QFormLayout.LabelRole,
-            self.CSVFilenameLabel)
-        self.CSVFileLayout = QtGui.QHBoxLayout()
-        self.CSVFileLayout.setSpacing(8)
-        self.CSVFileLayout.setObjectName(u'CSVFileLayout')
-        self.CSVFilenameEdit = QtGui.QLineEdit(self.CSVPage)
-        self.CSVFilenameEdit.setObjectName(u'CSVFilenameEdit')
-        self.CSVFileLayout.addWidget(self.CSVFilenameEdit)
-        self.CSVBrowseButton = QtGui.QToolButton(self.CSVPage)
-        self.CSVBrowseButton.setIcon(openIcon)
-        self.CSVBrowseButton.setObjectName(u'CSVBrowseButton')
-        self.CSVFileLayout.addWidget(self.CSVBrowseButton)
-        self.CSVLayout.setLayout(0, QtGui.QFormLayout.FieldRole,
-            self.CSVFileLayout)
-        self.FormatStackedWidget.addWidget(self.CSVPage)
-        self.SourceLayout.addWidget(self.FormatStackedWidget)
-        SongImportWizard.addPage(self.SourcePage)
-        self.ImportPage = QtGui.QWizardPage()
-        self.ImportPage.setObjectName(u'ImportPage')
-        self.ImportLayout = QtGui.QVBoxLayout(self.ImportPage)
-        self.ImportLayout.setSpacing(8)
-        self.ImportLayout.setMargin(50)
-        self.ImportLayout.setObjectName(u'ImportLayout')
-        self.ImportProgressLabel = QtGui.QLabel(self.ImportPage)
-        self.ImportProgressLabel.setObjectName(u'ImportProgressLabel')
-        self.ImportLayout.addWidget(self.ImportProgressLabel)
-        self.ImportProgressBar = QtGui.QProgressBar(self.ImportPage)
-        self.ImportProgressBar.setProperty(u'value', 0)
-        self.ImportProgressBar.setInvertedAppearance(False)
-        self.ImportProgressBar.setObjectName(u'ImportProgressBar')
-        self.ImportLayout.addWidget(self.ImportProgressBar)
-        SongImportWizard.addPage(self.ImportPage)
-        self.retranslateUi(SongImportWizard)
-        self.FormatStackedWidget.setCurrentIndex(0)
-        QtCore.QObject.connect(self.FormatComboBox,
+            self.formatComboBox.sizePolicy().hasHeightForWidth())
+        self.formatComboBox.setSizePolicy(sizePolicy)
+        self.formatComboBox.setObjectName(u'formatComboBox')
+        self.formatComboBox.addItem(u'')
+        self.formatComboBox.addItem(u'')
+        self.formatComboBox.addItem(u'')
+        self.formatComboBox.addItem(u'')
+        self.formatComboBox.addItem(u'')
+        self.formatComboBox.addItem(u'')
+        self.formatComboBox.addItem(u'')
+        self.formatComboBox.addItem(u'')
+#        self.formatComboBox.addItem(u'')
+        self.formatLayout.addWidget(self.formatComboBox)
+        self.formatSpacer = QtGui.QSpacerItem(40, 20,
+            QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        self.formatLayout.addItem(self.formatSpacer)
+        self.sourceLayout.addLayout(self.formatLayout)
+        self.formatStackedWidget = QtGui.QStackedWidget(self.sourcePage)
+        self.formatStackedWidget.setObjectName(u'FormatStackedWidget')
+        # OpenLP 2.0
+        self.openLP2Page = QtGui.QWidget()
+        self.openLP2Page.setObjectName(u'openLP2Page')
+        self.openLP2Layout = QtGui.QFormLayout(self.openLP2Page)
+        self.openLP2Layout.setMargin(0)
+        self.openLP2Layout.setSpacing(8)
+        self.openLP2Layout.setObjectName(u'openLP2Layout')
+        self.openLP2FilenameLabel = QtGui.QLabel(self.openLP2Page)
+        self.openLP2FilenameLabel.setObjectName(u'openLP2FilenameLabel')
+        self.openLP2Layout.setWidget(0, QtGui.QFormLayout.LabelRole,
+            self.openLP2FilenameLabel)
+        self.openLP2FileLayout = QtGui.QHBoxLayout()
+        self.openLP2FileLayout.setSpacing(8)
+        self.openLP2FileLayout.setObjectName(u'openLP2FileLayout')
+        self.openLP2FilenameEdit = QtGui.QLineEdit(self.openLP2Page)
+        self.openLP2FilenameEdit.setObjectName(u'openLP2FilenameEdit')
+        self.openLP2FileLayout.addWidget(self.openLP2FilenameEdit)
+        self.openLP2BrowseButton = QtGui.QToolButton(self.openLP2Page)
+        self.openLP2BrowseButton.setIcon(openIcon)
+        self.openLP2BrowseButton.setObjectName(u'openLP2BrowseButton')
+        self.openLP2FileLayout.addWidget(self.openLP2BrowseButton)
+        self.openLP2Layout.setLayout(0, QtGui.QFormLayout.FieldRole,
+            self.openLP2FileLayout)
+        self.formatStackedWidget.addWidget(self.openLP2Page)
+        # openlp.org 1.x
+        self.openLP1Page = QtGui.QWidget()
+        self.openLP1Page.setObjectName(u'openLP1Page')
+        self.openLP1Layout = QtGui.QFormLayout(self.openLP1Page)
+        self.openLP1Layout.setMargin(0)
+        self.openLP1Layout.setSpacing(8)
+        self.openLP1Layout.setObjectName(u'openLP1Layout')
+        self.openLP1FilenameLabel = QtGui.QLabel(self.openLP1Page)
+        self.openLP1FilenameLabel.setObjectName(u'openLP1FilenameLabel')
+        self.openLP1Layout.setWidget(0, QtGui.QFormLayout.LabelRole,
+            self.openLP1FilenameLabel)
+        self.openLP1FileLayout = QtGui.QHBoxLayout()
+        self.openLP1FileLayout.setSpacing(8)
+        self.openLP1FileLayout.setObjectName(u'openLP1FileLayout')
+        self.openLP1FilenameEdit = QtGui.QLineEdit(self.openLP1Page)
+        self.openLP1FilenameEdit.setObjectName(u'openLP1FilenameEdit')
+        self.openLP1FileLayout.addWidget(self.openLP1FilenameEdit)
+        self.openLP1BrowseButton = QtGui.QToolButton(self.openLP1Page)
+        self.openLP1BrowseButton.setIcon(openIcon)
+        self.openLP1BrowseButton.setObjectName(u'openLP1BrowseButton')
+        self.openLP1FileLayout.addWidget(self.openLP1BrowseButton)
+        self.openLP1Layout.setLayout(0, QtGui.QFormLayout.FieldRole,
+            self.openLP1FileLayout)
+        self.formatStackedWidget.addWidget(self.openLP1Page)
+        # OpenLyrics
+        self.openLyricsPage = QtGui.QWidget()
+        self.openLyricsPage.setObjectName(u'OpenLyricsPage')
+        self.openLyricsLayout = QtGui.QVBoxLayout(self.openLyricsPage)
+        self.openLyricsLayout.setSpacing(8)
+        self.openLyricsLayout.setMargin(0)
+        self.openLyricsLayout.setObjectName(u'OpenLyricsLayout')
+        self.openLyricsFileListWidget = QtGui.QListWidget(self.openLyricsPage)
+        self.openLyricsFileListWidget.setSelectionMode(
+            QtGui.QAbstractItemView.ExtendedSelection)
+        self.openLyricsFileListWidget.setObjectName(u'OpenLyricsFileListWidget')
+        self.openLyricsLayout.addWidget(self.openLyricsFileListWidget)
+        self.openLyricsButtonLayout = QtGui.QHBoxLayout()
+        self.openLyricsButtonLayout.setSpacing(8)
+        self.openLyricsButtonLayout.setObjectName(u'OpenLyricsButtonLayout')
+        self.openLyricsAddButton = QtGui.QPushButton(self.openLyricsPage)
+        self.openLyricsAddButton.setIcon(openIcon)
+        self.openLyricsAddButton.setObjectName(u'OpenLyricsAddButton')
+        self.openLyricsButtonLayout.addWidget(self.openLyricsAddButton)
+        self.openLyricsButtonSpacer = QtGui.QSpacerItem(40, 20,
+            QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        self.openLyricsButtonLayout.addItem(self.openLyricsButtonSpacer)
+        self.openLyricsRemoveButton = QtGui.QPushButton(self.openLyricsPage)
+        self.openLyricsRemoveButton.setIcon(deleteIcon)
+        self.openLyricsRemoveButton.setObjectName(u'OpenLyricsRemoveButton')
+        self.openLyricsButtonLayout.addWidget(self.openLyricsRemoveButton)
+        self.openLyricsLayout.addLayout(self.openLyricsButtonLayout)
+        self.formatStackedWidget.addWidget(self.openLyricsPage)
+        # Open Song
+        self.openSongPage = QtGui.QWidget()
+        self.openSongPage.setObjectName(u'OpenSongPage')
+        self.openSongLayout = QtGui.QVBoxLayout(self.openSongPage)
+        self.openSongLayout.setSpacing(8)
+        self.openSongLayout.setMargin(0)
+        self.openSongLayout.setObjectName(u'OpenSongLayout')
+        self.openSongFileListWidget = QtGui.QListWidget(self.openSongPage)
+        self.openSongFileListWidget.setSelectionMode(
+            QtGui.QAbstractItemView.ExtendedSelection)
+        self.openSongFileListWidget.setObjectName(u'OpenSongFileListWidget')
+        self.openSongLayout.addWidget(self.openSongFileListWidget)
+        self.openSongButtonLayout = QtGui.QHBoxLayout()
+        self.openSongButtonLayout.setSpacing(8)
+        self.openSongButtonLayout.setObjectName(u'OpenSongButtonLayout')
+        self.openSongAddButton = QtGui.QPushButton(self.openSongPage)
+        self.openSongAddButton.setIcon(openIcon)
+        self.openSongAddButton.setObjectName(u'OpenSongAddButton')
+        self.openSongButtonLayout.addWidget(self.openSongAddButton)
+        self.openSongButtonSpacer = QtGui.QSpacerItem(40, 20,
+            QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        self.openSongButtonLayout.addItem(self.openSongButtonSpacer)
+        self.openSongRemoveButton = QtGui.QPushButton(self.openSongPage)
+        self.openSongRemoveButton.setIcon(deleteIcon)
+        self.openSongRemoveButton.setObjectName(u'OpenSongRemoveButton')
+        self.openSongButtonLayout.addWidget(self.openSongRemoveButton)
+        self.openSongLayout.addLayout(self.openSongButtonLayout)
+        self.formatStackedWidget.addWidget(self.openSongPage)
+        # Words of Worship
+        self.wordsOfWorshipPage = QtGui.QWidget()
+        self.wordsOfWorshipPage.setObjectName(u'wordsOfWorshipPage')
+        self.wordsOfWorshipLayout = QtGui.QVBoxLayout(self.wordsOfWorshipPage)
+        self.wordsOfWorshipLayout.setSpacing(8)
+        self.wordsOfWorshipLayout.setMargin(0)
+        self.wordsOfWorshipLayout.setObjectName(u'wordsOfWorshipLayout')
+        self.wordsOfWorshipFileListWidget = QtGui.QListWidget(self.wordsOfWorshipPage)
+        self.wordsOfWorshipFileListWidget.setSelectionMode(
+            QtGui.QAbstractItemView.ExtendedSelection)
+        self.wordsOfWorshipFileListWidget.setObjectName(u'wordsOfWorshipFileListWidget')
+        self.wordsOfWorshipLayout.addWidget(self.wordsOfWorshipFileListWidget)
+        self.wordsOfWorshipButtonLayout = QtGui.QHBoxLayout()
+        self.wordsOfWorshipButtonLayout.setSpacing(8)
+        self.wordsOfWorshipButtonLayout.setObjectName(u'wordsOfWorshipButtonLayout')
+        self.wordsOfWorshipAddButton = QtGui.QPushButton(self.wordsOfWorshipPage)
+        self.wordsOfWorshipAddButton.setIcon(openIcon)
+        self.wordsOfWorshipAddButton.setObjectName(u'wordsOfWorshipAddButton')
+        self.wordsOfWorshipButtonLayout.addWidget(self.wordsOfWorshipAddButton)
+        self.wordsOfWorshipButtonSpacer = QtGui.QSpacerItem(40, 20,
+            QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        self.wordsOfWorshipButtonLayout.addItem(self.wordsOfWorshipButtonSpacer)
+        self.wordsOfWorshipRemoveButton = QtGui.QPushButton(self.wordsOfWorshipPage)
+        self.wordsOfWorshipRemoveButton.setIcon(deleteIcon)
+        self.wordsOfWorshipRemoveButton.setObjectName(u'wordsOfWorshipRemoveButton')
+        self.wordsOfWorshipButtonLayout.addWidget(self.wordsOfWorshipRemoveButton)
+        self.wordsOfWorshipLayout.addLayout(self.wordsOfWorshipButtonLayout)
+        self.formatStackedWidget.addWidget(self.wordsOfWorshipPage)
+        # CCLI File import
+        self.ccliPage = QtGui.QWidget()
+        self.ccliPage.setObjectName(u'ccliPage')
+        self.ccliLayout = QtGui.QVBoxLayout(self.ccliPage)
+        self.ccliLayout.setSpacing(8)
+        self.ccliLayout.setMargin(0)
+        self.ccliLayout.setObjectName(u'ccliLayout')
+        self.ccliFileListWidget = QtGui.QListWidget(self.ccliPage)
+        self.ccliFileListWidget.setSelectionMode(
+            QtGui.QAbstractItemView.ExtendedSelection)
+        self.ccliFileListWidget.setObjectName(u'ccliFileListWidget')
+        self.ccliLayout.addWidget(self.ccliFileListWidget)
+        self.ccliButtonLayout = QtGui.QHBoxLayout()
+        self.ccliButtonLayout.setSpacing(8)
+        self.ccliButtonLayout.setObjectName(u'ccliButtonLayout')
+        self.ccliAddButton = QtGui.QPushButton(self.ccliPage)
+        self.ccliAddButton.setIcon(openIcon)
+        self.ccliAddButton.setObjectName(u'ccliAddButton')
+        self.ccliButtonLayout.addWidget(self.ccliAddButton)
+        self.ccliButtonSpacer = QtGui.QSpacerItem(40, 20,
+            QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        self.ccliButtonLayout.addItem(self.ccliButtonSpacer)
+        self.ccliRemoveButton = QtGui.QPushButton(self.ccliPage)
+        self.ccliRemoveButton.setIcon(deleteIcon)
+        self.ccliRemoveButton.setObjectName(u'ccliRemoveButton')
+        self.ccliButtonLayout.addWidget(self.ccliRemoveButton)
+        self.ccliLayout.addLayout(self.ccliButtonLayout)
+        self.formatStackedWidget.addWidget(self.ccliPage)
+        # Songs of Fellowship
+        self.songsOfFellowshipPage = QtGui.QWidget()
+        self.songsOfFellowshipPage.setObjectName(u'songsOfFellowshipPage')
+        self.songsOfFellowshipLayout = QtGui.QVBoxLayout(self.songsOfFellowshipPage)
+        self.songsOfFellowshipLayout.setMargin(0)
+        self.songsOfFellowshipLayout.setSpacing(8)
+        self.songsOfFellowshipLayout.setObjectName(u'songsOfFellowshipLayout')
+        self.songsOfFellowshipFileListWidget = QtGui.QListWidget(self.songsOfFellowshipPage)
+        self.songsOfFellowshipFileListWidget.setSelectionMode(
+            QtGui.QAbstractItemView.ExtendedSelection)
+        self.songsOfFellowshipFileListWidget.setObjectName(u'songsOfFellowshipFileListWidget')
+        self.songsOfFellowshipLayout.addWidget(self.songsOfFellowshipFileListWidget)
+        self.songsOfFellowshipButtonLayout = QtGui.QHBoxLayout()
+        self.songsOfFellowshipButtonLayout.setSpacing(8)
+        self.songsOfFellowshipButtonLayout.setObjectName(u'songsOfFellowshipButtonLayout')
+        self.songsOfFellowshipAddButton = QtGui.QPushButton(self.songsOfFellowshipPage)
+        self.songsOfFellowshipAddButton.setIcon(openIcon)
+        self.songsOfFellowshipAddButton.setObjectName(u'songsOfFellowshipAddButton')
+        self.songsOfFellowshipButtonLayout.addWidget(self.songsOfFellowshipAddButton)
+        self.songsOfFellowshipButtonSpacer = QtGui.QSpacerItem(40, 20,
+            QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        self.songsOfFellowshipButtonLayout.addItem(self.songsOfFellowshipButtonSpacer)
+        self.songsOfFellowshipRemoveButton = QtGui.QPushButton(self.songsOfFellowshipPage)
+        self.songsOfFellowshipRemoveButton.setIcon(deleteIcon)
+        self.songsOfFellowshipRemoveButton.setObjectName(u'songsOfFellowshipRemoveButton')
+        self.songsOfFellowshipButtonLayout.addWidget(self.songsOfFellowshipRemoveButton)
+        self.songsOfFellowshipLayout.addLayout(self.songsOfFellowshipButtonLayout)
+#        self.songsOfFellowshipFilenameLabel = QtGui.QLabel(self.songsOfFellowshipPage)
+#        self.songsOfFellowshipFilenameLabel.setObjectName(u'songsOfFellowshipFilenameLabel')
+#        self.songsOfFellowshipLayout.setWidget(0, QtGui.QFormLayout.LabelRole,
+#            self.songsOfFellowshipFilenameLabel)
+#        self.songsOfFellowshipFileLayout = QtGui.QHBoxLayout()
+#        self.songsOfFellowshipFileLayout.setSpacing(8)
+#        self.songsOfFellowshipFileLayout.setObjectName(u'songsOfFellowshipFileLayout')
+#        self.songsOfFellowshipFilenameEdit = QtGui.QLineEdit(self.songsOfFellowshipPage)
+#        self.songsOfFellowshipFilenameEdit.setObjectName(u'songsOfFellowshipFilenameEdit')
+#        self.songsOfFellowshipFileLayout.addWidget(self.songsOfFellowshipFilenameEdit)
+#        self.songsOfFellowshipBrowseButton = QtGui.QToolButton(self.songsOfFellowshipPage)
+#        self.songsOfFellowshipBrowseButton.setIcon(openIcon)
+#        self.songsOfFellowshipBrowseButton.setObjectName(u'songsOfFellowshipBrowseButton')
+#        self.songsOfFellowshipFileLayout.addWidget(self.songsOfFellowshipBrowseButton)
+#        self.songsOfFellowshipLayout.setLayout(0, QtGui.QFormLayout.FieldRole,
+#            self.songsOfFellowshipFileLayout)
+        self.formatStackedWidget.addWidget(self.songsOfFellowshipPage)
+        # Generic Document/Presentation import
+        self.genericPage = QtGui.QWidget()
+        self.genericPage.setObjectName(u'genericPage')
+        self.genericLayout = QtGui.QFormLayout(self.genericPage)
+        self.genericLayout.setMargin(0)
+        self.genericLayout.setSpacing(8)
+        self.genericLayout.setObjectName(u'genericLayout')
+        self.genericFilenameLabel = QtGui.QLabel(self.genericPage)
+        self.genericFilenameLabel.setObjectName(u'genericFilenameLabel')
+        self.genericLayout.setWidget(0, QtGui.QFormLayout.LabelRole,
+            self.genericFilenameLabel)
+        self.genericFileLayout = QtGui.QHBoxLayout()
+        self.genericFileLayout.setSpacing(8)
+        self.genericFileLayout.setObjectName(u'genericFileLayout')
+        self.genericFilenameEdit = QtGui.QLineEdit(self.genericPage)
+        self.genericFilenameEdit.setObjectName(u'genericFilenameEdit')
+        self.genericFileLayout.addWidget(self.genericFilenameEdit)
+        self.genericBrowseButton = QtGui.QToolButton(self.genericPage)
+        self.genericBrowseButton.setIcon(openIcon)
+        self.genericBrowseButton.setObjectName(u'genericBrowseButton')
+        self.genericFileLayout.addWidget(self.genericBrowseButton)
+        self.genericLayout.setLayout(0, QtGui.QFormLayout.FieldRole,
+            self.genericFileLayout)
+        self.formatStackedWidget.addWidget(self.genericPage)
+#        Commented out for future use.
+#        self.csvPage = QtGui.QWidget()
+#        self.csvPage.setObjectName(u'CSVPage')
+#        self.csvLayout = QtGui.QFormLayout(self.csvPage)
+#        self.csvLayout.setMargin(0)
+#        self.csvLayout.setSpacing(8)
+#        self.csvLayout.setObjectName(u'CSVLayout')
+#        self.csvFilenameLabel = QtGui.QLabel(self.csvPage)
+#        self.csvFilenameLabel.setObjectName(u'CSVFilenameLabel')
+#        self.csvLayout.setWidget(0, QtGui.QFormLayout.LabelRole,
+#            self.csvFilenameLabel)
+#        self.csvFileLayout = QtGui.QHBoxLayout()
+#        self.csvFileLayout.setSpacing(8)
+#        self.csvFileLayout.setObjectName(u'CSVFileLayout')
+#        self.csvFilenameEdit = QtGui.QLineEdit(self.csvPage)
+#        self.csvFilenameEdit.setObjectName(u'CSVFilenameEdit')
+#        self.csvFileLayout.addWidget(self.csvFilenameEdit)
+#        self.csvBrowseButton = QtGui.QToolButton(self.csvPage)
+#        self.csvBrowseButton.setIcon(openIcon)
+#        self.csvBrowseButton.setObjectName(u'CSVBrowseButton')
+#        self.csvFileLayout.addWidget(self.csvBrowseButton)
+#        self.csvLayout.setLayout(0, QtGui.QFormLayout.FieldRole,
+#            self.csvFileLayout)
+#        self.formatStackedWidget.addWidget(self.csvPage)
+        self.sourceLayout.addWidget(self.formatStackedWidget)
+        songImportWizard.addPage(self.sourcePage)
+        self.importPage = QtGui.QWizardPage()
+        self.importPage.setObjectName(u'importPage')
+        self.importLayout = QtGui.QVBoxLayout(self.importPage)
+        self.importLayout.setSpacing(8)
+        self.importLayout.setMargin(50)
+        self.importLayout.setObjectName(u'importLayout')
+        self.importProgressLabel = QtGui.QLabel(self.importPage)
+        self.importProgressLabel.setObjectName(u'importProgressLabel')
+        self.importLayout.addWidget(self.importProgressLabel)
+        self.importProgressBar = QtGui.QProgressBar(self.importPage)
+        self.importProgressBar.setProperty(u'value', 0)
+        self.importProgressBar.setInvertedAppearance(False)
+        self.importProgressBar.setObjectName(u'importProgressBar')
+        self.importLayout.addWidget(self.importProgressBar)
+        songImportWizard.addPage(self.importPage)
+        self.retranslateUi(songImportWizard)
+        self.formatStackedWidget.setCurrentIndex(0)
+        QtCore.QObject.connect(self.formatComboBox,
             QtCore.SIGNAL(u'currentIndexChanged(int)'),
-            self.FormatStackedWidget.setCurrentIndex)
-        QtCore.QMetaObject.connectSlotsByName(SongImportWizard)
+            self.formatStackedWidget.setCurrentIndex)
+        QtCore.QMetaObject.connectSlotsByName(songImportWizard)
 
-    def retranslateUi(self, SongImportWizard):
-        SongImportWizard.setWindowTitle(
-            translate('SongsPlugin.ImportWizardForm', 'Song Import Wizard'))
-        self.TitleLabel.setText(
+    def retranslateUi(self, songImportWizard):
+        songImportWizard.setWindowTitle(
+            translate('SongsPlugin.ImportWizardForm', 'Song import Wizard'))
+        self.titleLabel.setText(
             u'<span style="font-size:14pt; font-weight:600;">%s</span>' % \
             translate('SongsPlugin.ImportWizardForm',
-                'Welcome to the Song Import Wizard'))
-        self.InformationLabel.setText(
+                'Welcome to the Song import Wizard'))
+        self.informationLabel.setText(
             translate('SongsPlugin.ImportWizardForm',
                 'This wizard will help you to import songs from a variety of '
                 'formats. Click the next button below to start the process by '
                 'selecting a format to import from.'))
-        self.SourcePage.setTitle(
-            translate('SongsPlugin.ImportWizardForm', 'Select Import Source'))
-        self.SourcePage.setSubTitle(
+        self.sourcePage.setTitle(
+            translate('SongsPlugin.ImportWizardForm', 'Select import Source'))
+        self.sourcePage.setSubTitle(
             translate('SongsPlugin.ImportWizardForm',
             'Select the import format, and where to import from.'))
-        self.FormatLabel.setText(
+        self.formatLabel.setText(
             translate('SongsPlugin.ImportWizardForm', 'Format:'))
-        self.FormatComboBox.setItemText(0,
+        self.formatComboBox.setItemText(0,
+            translate('SongsPlugin.ImportWizardForm', 'OpenLP 2.0'))
+        self.formatComboBox.setItemText(1,
+            translate('SongsPlugin.ImportWizardForm', 'openlp.org 1.x'))
+        self.formatComboBox.setItemText(2,
             translate('SongsPlugin.ImportWizardForm', 'OpenLyrics'))
-        self.FormatComboBox.setItemText(1,
+        self.formatComboBox.setItemText(3,
             translate('SongsPlugin.ImportWizardForm', 'OpenSong'))
-        self.FormatComboBox.setItemText(2,
+        self.formatComboBox.setItemText(4,
+            translate('SongsPlugin.ImportWizardForm', 'Words of Worship'))
+        self.formatComboBox.setItemText(5,
             translate('SongsPlugin.ImportWizardForm', 'CCLI'))
-        self.FormatComboBox.setItemText(3,
-            translate('SongsPlugin.ImportWizardForm', 'CSV'))
-        self.OpenLyricsAddButton.setText(
-            translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
-        self.OpenLyricsRemoveButton.setText(
-            translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
-        self.OpenSongAddButton.setText(
-            translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
-        self.OpenSongRemoveButton.setText(
-            translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
-        self.CCLIAddButton.setText(
-            translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
-        self.CCLIRemoveButton.setText(
-            translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
-        self.CSVFilenameLabel.setText(
-            translate('SongsPlugin.ImportWizardForm', 'Filename:'))
-        self.CSVBrowseButton.setText(
-            translate('SongsPlugin.ImportWizardForm', 'Browse...'))
-        self.ImportPage.setTitle(
-            translate('SongsPlugin.ImportWizardForm', 'Importing'))
-        self.ImportPage.setSubTitle(
+        self.formatComboBox.setItemText(6,
+            translate('SongsPlugin.ImportWizardForm', 'Songs of Fellowship'))
+        self.formatComboBox.setItemText(7,
+            translate('SongsPlugin.ImportWizardForm',
+            'Generic Document/Presentation'))
+#        self.formatComboBox.setItemText(8,
+#            translate('SongsPlugin.ImportWizardForm', 'CSV'))
+        self.openLP2FilenameLabel.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Filename:'))
+        self.openLP2BrowseButton.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Browse...'))
+        self.openLP1FilenameLabel.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Filename:'))
+        self.openLP1BrowseButton.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Browse...'))
+        self.openLyricsAddButton.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
+        self.openLyricsRemoveButton.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
+        self.openSongAddButton.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
+        self.openSongRemoveButton.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
+        self.wordsOfWorshipAddButton.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
+        self.wordsOfWorshipRemoveButton.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
+        self.ccliAddButton.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
+        self.ccliRemoveButton.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
+        self.songsOfFellowshipAddButton.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
+        self.songsOfFellowshipRemoveButton.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
+        self.genericFilenameLabel.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Filename:'))
+        self.genericBrowseButton.setText(
+            translate('SongsPlugin.ImportWizardForm', 'Browse...'))
+#        self.csvFilenameLabel.setText(
+#            translate('SongsPlugin.ImportWizardForm', 'Filename:'))
+#        self.csvBrowseButton.setText(
+#            translate('SongsPlugin.ImportWizardForm', 'Browse...'))
+        self.importPage.setTitle(
+            translate('SongsPlugin.ImportWizardForm', 'importing'))
+        self.importPage.setSubTitle(
             translate('SongsPlugin.ImportWizardForm',
                 'Please wait while your songs are imported.'))
-        self.ImportProgressLabel.setText(
+        self.importProgressLabel.setText(
             translate('SongsPlugin.ImportWizardForm', 'Ready.'))
-        self.ImportProgressBar.setFormat(
+        self.importProgressBar.setFormat(
             translate('SongsPlugin.ImportWizardForm', '%p%'))

=== modified file 'openlp/plugins/songs/lib/__init__.py'
--- openlp/plugins/songs/lib/__init__.py	2010-07-28 13:32:12 +0000
+++ openlp/plugins/songs/lib/__init__.py	2010-08-23 18:07:46 +0000
@@ -26,52 +26,6 @@
 
 from openlp.core.lib import translate
 
-#from openlp.plugins.songs.lib import OpenLyricsSong, OpenSongSong, CCLISong, \
-#    CSVSong
-
-class SongFormat(object):
-    """
-    This is a special enumeration class that holds the various types of songs,
-    plus a few helper functions to facilitate generic handling of song types
-    for importing.
-    """
-    Unknown = -1
-    OpenLyrics = 0
-    OpenSong = 1
-    CCLI = 2
-    CSV = 3
-
-    @staticmethod
-    def get_class(format):
-        """
-        Return the appropriate imeplementation class.
-
-        ``format``
-            The song format.
-        """
-#        if format == SongFormat.OpenLyrics:
-#            return OpenLyricsSong
-#        elif format == SongFormat.OpenSong:
-#            return OpenSongSong
-#        elif format == SongFormat.CCLI:
-#            return CCLISong
-#        elif format == SongFormat.CSV:
-#            return CSVSong
-#        else:
-        return None
-
-    @staticmethod
-    def list():
-        """
-        Return a list of the supported song formats.
-        """
-        return [
-            SongFormat.OpenLyrics,
-            SongFormat.OpenSong,
-            SongFormat.CCLI,
-            SongFormat.CSV
-        ]
-
 class VerseType(object):
     """
     VerseType provides an enumeration for the tags that may be associated
@@ -138,14 +92,7 @@
             unicode(VerseType.to_string(VerseType.Other)).lower():
             return VerseType.Other
 
+
 from xml import LyricsXML, SongXMLBuilder, SongXMLParser
 from songstab import SongsTab
 from mediaitem import SongMediaItem
-from songimport import SongImport
-from opensongimport import OpenSongImport
-from olpimport import OpenLPSongImport
-try:
-    from sofimport import SofImport
-    from oooimport import OooImport
-except ImportError:
-    pass

=== added file 'openlp/plugins/songs/lib/importer.py'
--- openlp/plugins/songs/lib/importer.py	1970-01-01 00:00:00 +0000
+++ openlp/plugins/songs/lib/importer.py	2010-08-23 18:07:46 +0000
@@ -0,0 +1,87 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2010 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael      #
+# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian      #
+# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble,    #
+# Carsten Tinggaard, Frode Woldsund                                           #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+from opensongimport import OpenSongImport
+from olpimport import OpenLPSongImport
+try:
+    from sofimport import SofImport
+    from oooimport import OooImport
+except ImportError:
+    pass
+
+class SongFormat(object):
+    """
+    This is a special enumeration class that holds the various types of songs,
+    plus a few helper functions to facilitate generic handling of song types
+    for importing.
+    """
+    Unknown = -1
+    OpenLP2 = 0
+    OpenLP1 = 1
+    OpenLyrics = 2
+    OpenSong = 3
+    WordsOfWorship = 4
+    CCLI = 5
+    SongsOfFellowship = 6
+    Generic = 7
+    CSV = 8
+
+    @staticmethod
+    def get_class(format):
+        """
+        Return the appropriate imeplementation class.
+
+        ``format``
+            The song format.
+        """
+        if format == SongFormat.OpenLP2:
+            return OpenLPSongImport
+        elif format == SongFormat.OpenSong:
+            return OpenSongImport
+        elif format == SongFormat.SongsOfFellowship:
+            return SofImport
+        elif format == SongFormat.Generic:
+            return OooImport
+#        else:
+        return None
+
+    @staticmethod
+    def list():
+        """
+        Return a list of the supported song formats.
+        """
+        return [
+            SongFormat.OpenLP2,
+            SongFormat.OpenLP1,
+            SongFormat.OpenLyrics,
+            SongFormat.OpenSong,
+            SongFormat.WordsOfWorship,
+            SongFormat.CCLI,
+            SongFormat.SongsOfFellowship,
+            SongFormat.Generic
+        ]
+
+__all__ = [u'SongFormat']

=== modified file 'openlp/plugins/songs/lib/mediaitem.py'
--- openlp/plugins/songs/lib/mediaitem.py	2010-08-02 19:23:39 +0000
+++ openlp/plugins/songs/lib/mediaitem.py	2010-08-23 18:07:46 +0000
@@ -236,9 +236,10 @@
                 self.onSearchTextButtonClick()
 
     def onImportClick(self):
-        songimportform = ImportWizardForm(self, self.parent.manager,
-            self.parent)
-        songimportform.exec_()
+        if not hasattr(self, u'import_wizard'):
+            self.import_wizard = ImportWizardForm(self, self.parent.manager,
+                self.parent)
+        self.import_wizard.exec_()
 
     def onNewClick(self):
         self.edit_song_form.newSong()

=== modified file 'openlp/plugins/songs/lib/olpimport.py'
--- openlp/plugins/songs/lib/olpimport.py	2010-07-27 09:32:52 +0000
+++ openlp/plugins/songs/lib/olpimport.py	2010-08-23 18:07:46 +0000
@@ -36,6 +36,7 @@
 
 from openlp.core.lib.db import BaseModel
 from openlp.plugins.songs.lib.db import Author, Book, Song, Topic #, MediaFile
+from songimport import SongImport
 
 log = logging.getLogger(__name__)
 
@@ -69,12 +70,12 @@
     """
     pass
 
-class OpenLPSongImport(object):
+class OpenLPSongImport(SongImport):
     """
     The :class:`OpenLPSongImport` class provides OpenLP with the ability to
     import song databases from other installations of OpenLP.
     """
-    def __init__(self, master_manager, source_db):
+    def __init__(self, master_manager, **kwargs):
         """
         Initialise the import.
 
@@ -85,10 +86,11 @@
             The database providing the data to import.
         """
         self.master_manager = master_manager
-        self.import_source = source_db
+        self.import_source = u'sqlite:///%s' % kwargs[u'filename']
+        log.debug(self.import_source)
         self.source_session = None
 
-    def import_source_v2_db(self):
+    def do_import(self):
         """
         Run the import for an OpenLP version 2 song database.
         """

=== modified file 'openlp/plugins/songs/lib/songimport.py'
--- openlp/plugins/songs/lib/songimport.py	2010-07-27 09:32:52 +0000
+++ openlp/plugins/songs/lib/songimport.py	2010-08-23 18:07:46 +0000
@@ -27,8 +27,9 @@
 import re
 
 from openlp.core.lib import translate
-from openlp.plugins.songs.lib import SongXMLBuilder, VerseType
+from openlp.plugins.songs.lib import VerseType
 from openlp.plugins.songs.lib.db import Song, Author, Topic, Book
+from openlp.plugins.songs.lib.xml import SongXMLBuilder
 
 class SongImport(object):
     """
@@ -39,14 +40,14 @@
     as necessary
     """
 
-    def __init__(self, song_manager):
+    def __init__(self, manager):
         """
         Initialise and create defaults for properties
 
         song_manager is an instance of a SongManager, through which all
         database access is performed
         """
-        self.manager = song_manager
+        self.manager = manager
         self.title = u''
         self.song_number = u''
         self.alternate_title = u''
@@ -67,6 +68,9 @@
         self.copyright_symbol = unicode(translate(
             'SongsPlugin.SongImport', '\xa9'))
 
+    def register(self, import_wizard):
+        self.import_wizard = import_wizard
+
     @staticmethod
     def process_songs_text(manager, text):
         songs = []

=== modified file 'openlp/plugins/songs/songsplugin.py'
--- openlp/plugins/songs/songsplugin.py	2010-07-31 02:06:44 +0000
+++ openlp/plugins/songs/songsplugin.py	2010-08-23 18:07:46 +0000
@@ -30,16 +30,16 @@
 
 from openlp.core.lib import Plugin, build_icon, Receiver, translate
 from openlp.core.lib.db import Manager
-from openlp.plugins.songs.lib import OpenLPSongImport, SongMediaItem, SongsTab
+from openlp.plugins.songs.lib import SongMediaItem, SongsTab
 from openlp.plugins.songs.lib.db import init_schema, Song
-
-try:
-    from openlp.plugins.songs.lib import SofImport, OooImport
-    OOo_available = True
-except ImportError:
-    OOo_available = False
-
-from openlp.plugins.songs.lib import OpenSongImport
+from openlp.plugins.songs.lib.importer import SongFormat
+
+#try:
+#    from openlp.plugins.songs.lib import SofImport, OooImport
+#    OOo_available = True
+#except ImportError:
+#    OOo_available = False
+#from openlp.plugins.songs.lib import OpenSongImport
 
 log = logging.getLogger(__name__)
 
@@ -99,76 +99,76 @@
         # Signals and slots
         QtCore.QObject.connect(self.SongImportItem,
             QtCore.SIGNAL(u'triggered()'), self.onSongImportItemClicked)
-        if OOo_available:
-            # Songs of Fellowship import menu item - will be removed and the
-            # functionality will be contained within the import wizard
-            self.ImportSofItem = QtGui.QAction(import_menu)
-            self.ImportSofItem.setObjectName(u'ImportSofItem')
-            self.ImportSofItem.setText(
-                translate('SongsPlugin',
-                    'Songs of Fellowship (temp menu item)'))
-            self.ImportSofItem.setToolTip(
-                translate('SongsPlugin',
-                    'Import songs from the VOLS1_2.RTF, sof3words' \
-                    + '.rtf and sof4words.rtf supplied with the music books'))
-            self.ImportSofItem.setStatusTip(
-                translate('SongsPlugin',
-                    'Import songs from the VOLS1_2.RTF, sof3words' \
-                    + '.rtf and sof4words.rtf supplied with the music books'))
-            import_menu.addAction(self.ImportSofItem)
-            # OpenOffice.org import menu item - will be removed and the
-            # functionality will be contained within the import wizard
-            self.ImportOooItem = QtGui.QAction(import_menu)
-            self.ImportOooItem.setObjectName(u'ImportOooItem')
-            self.ImportOooItem.setText(
-                translate('SongsPlugin',
-                    'Generic Document/Presentation Import '
-                    '(temp menu item)'))
-            self.ImportOooItem.setToolTip(
-                translate('SongsPlugin',
-                    'Import songs from '
-                    'Word/Writer/Powerpoint/Impress'))
-            self.ImportOooItem.setStatusTip(
-                translate('SongsPlugin',
-                    'Import songs from '
-                    'Word/Writer/Powerpoint/Impress'))
-            import_menu.addAction(self.ImportOooItem)
-            # Signals and slots
-            QtCore.QObject.connect(self.ImportSofItem,
-                QtCore.SIGNAL(u'triggered()'), self.onImportSofItemClick)
-            QtCore.QObject.connect(self.ImportOooItem,
-                QtCore.SIGNAL(u'triggered()'), self.onImportOooItemClick)
-        # OpenSong import menu item - will be removed and the
-        # functionality will be contained within the import wizard
-        self.ImportOpenSongItem = QtGui.QAction(import_menu)
-        self.ImportOpenSongItem.setObjectName(u'ImportOpenSongItem')
-        self.ImportOpenSongItem.setText(
-            translate('SongsPlugin',
-                'OpenSong (temp menu item)'))
-        self.ImportOpenSongItem.setToolTip(
-            translate('SongsPlugin',
-                'Import songs from OpenSong files' +
-                '(either raw text or ZIPfiles)'))
-        self.ImportOpenSongItem.setStatusTip(
-            translate('SongsPlugin',
-                'Import songs from OpenSong files' +
-                '(either raw text or ZIPfiles)'))
-        import_menu.addAction(self.ImportOpenSongItem)
-        QtCore.QObject.connect(self.ImportOpenSongItem,
-                QtCore.SIGNAL(u'triggered()'), self.onImportOpenSongItemClick)
-        # OpenLP v2 import menu item - ditto above regarding refactoring into
-        # an import wizard
-        self.ImportOpenLPSongItem = QtGui.QAction(import_menu)
-        self.ImportOpenLPSongItem.setObjectName(u'ImportOpenLPSongItem')
-        self.ImportOpenLPSongItem.setText(translate('SongsPlugin',
-            'OpenLP v2 Songs (temporary)'))
-        self.ImportOpenLPSongItem.setToolTip(translate('SongsPlugin',
-            'Import an OpenLP v2 song database'))
-        self.ImportOpenLPSongItem.setStatusTip(translate('SongsPlugin',
-            'Import an OpenLP v2 song database'))
-        import_menu.addAction(self.ImportOpenLPSongItem)
-        QtCore.QObject.connect(self.ImportOpenLPSongItem,
-            QtCore.SIGNAL(u'triggered()'), self.onImportOpenLPSongItemClick)
+#        if OOo_available:
+#            # Songs of Fellowship import menu item - will be removed and the
+#            # functionality will be contained within the import wizard
+#            self.ImportSofItem = QtGui.QAction(import_menu)
+#            self.ImportSofItem.setObjectName(u'ImportSofItem')
+#            self.ImportSofItem.setText(
+#                translate('SongsPlugin',
+#                    'Songs of Fellowship (temp menu item)'))
+#            self.ImportSofItem.setToolTip(
+#                translate('SongsPlugin',
+#                    'Import songs from the VOLS1_2.RTF, sof3words' \
+#                    + '.rtf and sof4words.rtf supplied with the music books'))
+#            self.ImportSofItem.setStatusTip(
+#                translate('SongsPlugin',
+#                    'Import songs from the VOLS1_2.RTF, sof3words' \
+#                    + '.rtf and sof4words.rtf supplied with the music books'))
+#            import_menu.addAction(self.ImportSofItem)
+#            # OpenOffice.org import menu item - will be removed and the
+#            # functionality will be contained within the import wizard
+#            self.ImportOooItem = QtGui.QAction(import_menu)
+#            self.ImportOooItem.setObjectName(u'ImportOooItem')
+#            self.ImportOooItem.setText(
+#                translate('SongsPlugin',
+#                    'Generic Document/Presentation Import '
+#                    '(temp menu item)'))
+#            self.ImportOooItem.setToolTip(
+#                translate('SongsPlugin',
+#                    'Import songs from '
+#                    'Word/Writer/Powerpoint/Impress'))
+#            self.ImportOooItem.setStatusTip(
+#                translate('SongsPlugin',
+#                    'Import songs from '
+#                    'Word/Writer/Powerpoint/Impress'))
+#            import_menu.addAction(self.ImportOooItem)
+#            # Signals and slots
+#            QtCore.QObject.connect(self.ImportSofItem,
+#                QtCore.SIGNAL(u'triggered()'), self.onImportSofItemClick)
+#            QtCore.QObject.connect(self.ImportOooItem,
+#                QtCore.SIGNAL(u'triggered()'), self.onImportOooItemClick)
+#        # OpenSong import menu item - will be removed and the
+#        # functionality will be contained within the import wizard
+#        self.ImportOpenSongItem = QtGui.QAction(import_menu)
+#        self.ImportOpenSongItem.setObjectName(u'ImportOpenSongItem')
+#        self.ImportOpenSongItem.setText(
+#            translate('SongsPlugin',
+#                'OpenSong (temp menu item)'))
+#        self.ImportOpenSongItem.setToolTip(
+#            translate('SongsPlugin',
+#                'Import songs from OpenSong files' +
+#                '(either raw text or ZIPfiles)'))
+#        self.ImportOpenSongItem.setStatusTip(
+#            translate('SongsPlugin',
+#                'Import songs from OpenSong files' +
+#                '(either raw text or ZIPfiles)'))
+#        import_menu.addAction(self.ImportOpenSongItem)
+#        QtCore.QObject.connect(self.ImportOpenSongItem,
+#                QtCore.SIGNAL(u'triggered()'), self.onImportOpenSongItemClick)
+#        # OpenLP v2 import menu item - ditto above regarding refactoring into
+#        # an import wizard
+#        self.ImportOpenLPSongItem = QtGui.QAction(import_menu)
+#        self.ImportOpenLPSongItem.setObjectName(u'ImportOpenLPSongItem')
+#        self.ImportOpenLPSongItem.setText(translate('SongsPlugin',
+#            'OpenLP v2 Songs (temporary)'))
+#        self.ImportOpenLPSongItem.setToolTip(translate('SongsPlugin',
+#            'Import an OpenLP v2 song database'))
+#        self.ImportOpenLPSongItem.setStatusTip(translate('SongsPlugin',
+#            'Import an OpenLP v2 song database'))
+#        import_menu.addAction(self.ImportOpenLPSongItem)
+#        QtCore.QObject.connect(self.ImportOpenLPSongItem,
+#            QtCore.SIGNAL(u'triggered()'), self.onImportOpenLPSongItemClick)
 
     def addExportMenuItem(self, export_menu):
         """
@@ -186,67 +186,67 @@
         if self.mediaItem:
             self.mediaItem.onImportClick()
 
-    def onImportSofItemClick(self):
-        filenames = QtGui.QFileDialog.getOpenFileNames(
-            None, translate('SongsPlugin',
-                'Open Songs of Fellowship file'),
-            u'', u'Songs of Fellowship file (*.rtf *.RTF)')
-        try:
-            for filename in filenames:
-                sofimport = SofImport(self.manager)
-                sofimport.import_sof(unicode(filename))
-        except:
-            log.exception('Could not import SoF file')
-            QtGui.QMessageBox.critical(None,
-                translate('SongsPlugin', 'Import Error'),
-                translate('SongsPlugin', 'Error importing Songs of '
-                    'Fellowship file.\nOpenOffice.org must be installed'
-                    ' and you must be using an unedited copy of the RTF'
-                    ' included with the Songs of Fellowship Music Editions'))
-        Receiver.send_message(u'songs_load_list')
-
-    def onImportOpenSongItemClick(self):
-        filenames = QtGui.QFileDialog.getOpenFileNames(
-            None, translate('SongsPlugin',
-                'Open OpenSong file'),
-            u'', u'All files (*.*)')
-        try:
-            for filename in filenames:
-                importer = OpenSongImport(self.manager)
-                importer.do_import(unicode(filename))
-        except:
-            log.exception('Could not import OpenSong file')
-            QtGui.QMessageBox.critical(None,
-                translate('SongsPlugin', 'Import Error'),
-                translate('SongsPlugin', 'Error importing OpenSong file'))
-        Receiver.send_message(u'songs_load_list')
-
-    def onImportOpenLPSongItemClick(self):
-        filenames = QtGui.QFileDialog.getOpenFileNames(None,
-            translate('SongsPlugin', 'Select OpenLP database(s) to import...'),
-            u'', u'OpenLP databases (*.sqlite);;All Files (*)')
-        try:
-            for filename in filenames:
-                db_url = u'sqlite:///%s' % filename
-                importer = OpenLPSongImport(self.manager, db_url)
-                importer.import_source_v2_db()
-            QtGui.QMessageBox.information(None, translate('SongsPlugin',
-                'Database(s) imported'), translate('SongsPlugin', 'Your '
-                'OpenLP v2 song databases have been successfully imported'))
-        except:
-            log.exception(u'Failed to import OpenLP v2 database(s)')
-            QtGui.QMessageBox.critical(None, translate('SongsPlugin',
-                'Import Error'), translate('SongsPlugin',
-                'Error importing OpenLP v2 database(s)'))
-        Receiver.send_message(u'songs_load_list')
-
-    def onImportOooItemClick(self):
-        filenames = QtGui.QFileDialog.getOpenFileNames(
-            None, translate('SongsPlugin', 'Open documents or presentations'),
-            '', u'All Files(*.*)')
-        oooimport = OooImport(self.manager)
-        oooimport.import_docs(filenames)
-        Receiver.send_message(u'songs_load_list')
+#    def onImportSofItemClick(self):
+#        filenames = QtGui.QFileDialog.getOpenFileNames(
+#            None, translate('SongsPlugin',
+#                'Open Songs of Fellowship file'),
+#            u'', u'Songs of Fellowship file (*.rtf *.RTF)')
+#        try:
+#            for filename in filenames:
+#                sofimport = SofImport(self.manager)
+#                sofimport.import_sof(unicode(filename))
+#        except:
+#            log.exception('Could not import SoF file')
+#            QtGui.QMessageBox.critical(None,
+#                translate('SongsPlugin', 'Import Error'),
+#                translate('SongsPlugin', 'Error importing Songs of '
+#                    'Fellowship file.\nOpenOffice.org must be installed'
+#                    ' and you must be using an unedited copy of the RTF'
+#                    ' included with the Songs of Fellowship Music Editions'))
+#        Receiver.send_message(u'songs_load_list')
+#
+#    def onImportOpenSongItemClick(self):
+#        filenames = QtGui.QFileDialog.getOpenFileNames(
+#            None, translate('SongsPlugin',
+#                'Open OpenSong file'),
+#            u'', u'All files (*.*)')
+#        try:
+#            for filename in filenames:
+#                importer = OpenSongImport(self.manager)
+#                importer.do_import(unicode(filename))
+#        except:
+#            log.exception('Could not import OpenSong file')
+#            QtGui.QMessageBox.critical(None,
+#                translate('SongsPlugin', 'Import Error'),
+#                translate('SongsPlugin', 'Error importing OpenSong file'))
+#        Receiver.send_message(u'songs_load_list')
+#
+#    def onImportOpenLPSongItemClick(self):
+#        filenames = QtGui.QFileDialog.getOpenFileNames(None,
+#            translate('SongsPlugin', 'Select OpenLP database(s) to import...'),
+#            u'', u'OpenLP databases (*.sqlite);;All Files (*)')
+#        try:
+#            for filename in filenames:
+#                db_url = u'sqlite:///%s' % filename
+#                importer = OpenLPSongImport(self.manager, db_url)
+#                importer.import_source_v2_db()
+#            QtGui.QMessageBox.information(None, translate('SongsPlugin',
+#                'Database(s) imported'), translate('SongsPlugin', 'Your '
+#                'OpenLP v2 song databases have been successfully imported'))
+#        except:
+#            log.exception(u'Failed to import OpenLP v2 database(s)')
+#            QtGui.QMessageBox.critical(None, translate('SongsPlugin',
+#                'Import Error'), translate('SongsPlugin',
+#                'Error importing OpenLP v2 database(s)'))
+#        Receiver.send_message(u'songs_load_list')
+#
+#    def onImportOooItemClick(self):
+#        filenames = QtGui.QFileDialog.getOpenFileNames(
+#            None, translate('SongsPlugin', 'Open documents or presentations'),
+#            '', u'All Files(*.*)')
+#        oooimport = OooImport(self.manager)
+#        oooimport.import_docs(filenames)
+#        Receiver.send_message(u'songs_load_list')
 
     def about(self):
         about_text = translate('SongsPlugin', '<strong>Songs Plugin</strong>'
@@ -280,3 +280,9 @@
         for song in songsUsingTheme:
             song.theme_name = newTheme
             self.custommanager.save_object(song)
+
+    def importSongs(self, format, **kwargs):
+        class_ = SongFormat.get_class(format)
+        importer = class_(self.manager, **kwargs)
+        importer.register(self.mediaItem.import_wizard)
+        return importer


Follow ups