From 6d98d4b1258e084ea16296eabca641ed773097ca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Armin=20K=C3=B6hler?=
Date: Mon, 12 Mar 2012 06:48:14 +0100
Subject: [PATCH 01/19] add possibility to change bible meta data and the
possibility to change the preferred bible language per bible - including
first steps to edit the book names of the bible
---
openlp/plugins/bibles/forms/__init__.py | 3 +-
.../plugins/bibles/forms/editbibledialog.py | 171 ++++++++++++++++++
openlp/plugins/bibles/forms/editbibleform.py | 151 ++++++++++++++++
openlp/plugins/bibles/lib/db.py | 33 ++++
openlp/plugins/bibles/lib/manager.py | 52 +++++-
openlp/plugins/bibles/lib/mediaitem.py | 37 +++-
6 files changed, 435 insertions(+), 12 deletions(-)
create mode 100644 openlp/plugins/bibles/forms/editbibledialog.py
create mode 100644 openlp/plugins/bibles/forms/editbibleform.py
diff --git a/openlp/plugins/bibles/forms/__init__.py b/openlp/plugins/bibles/forms/__init__.py
index 89bfbfff3..86f28592d 100644
--- a/openlp/plugins/bibles/forms/__init__.py
+++ b/openlp/plugins/bibles/forms/__init__.py
@@ -55,6 +55,7 @@ from booknameform import BookNameForm
from languageform import LanguageForm
from bibleimportform import BibleImportForm
from bibleupgradeform import BibleUpgradeForm
+from editbibleform import EditBibleForm
__all__ = [u'BookNameForm', u'LanguageForm', u'BibleImportForm',
- u'BibleUpgradeForm']
+ u'BibleUpgradeForm', u'EditBibleForm']
diff --git a/openlp/plugins/bibles/forms/editbibledialog.py b/openlp/plugins/bibles/forms/editbibledialog.py
new file mode 100644
index 000000000..ce64e90c9
--- /dev/null
+++ b/openlp/plugins/bibles/forms/editbibledialog.py
@@ -0,0 +1,171 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2012 Raoul Snyman #
+# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan #
+# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, #
+# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias #
+# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
+# Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 PyQt4 import QtCore, QtGui
+
+from openlp.core.lib import build_icon, translate
+from openlp.core.lib.ui import UiStrings, create_accept_reject_button_box
+from openlp.plugins.bibles.lib import LanguageSelection, BibleStrings
+from openlp.plugins.bibles.lib.db import BiblesResourcesDB
+
+
+class Ui_EditBibleDialog(object):
+ def setupUi(self, editBibleDialog):
+ editBibleDialog.setObjectName(u'editBibleDialog')
+ editBibleDialog.resize(650, 400)
+ editBibleDialog.setWindowIcon(
+ build_icon(u':/icon/openlp-logo-16x16.png'))
+ editBibleDialog.setModal(True)
+ self.dialogLayout = QtGui.QVBoxLayout(editBibleDialog)
+ self.dialogLayout.setSpacing(8)
+ self.dialogLayout.setContentsMargins(8, 8, 8, 8)
+ self.dialogLayout.setObjectName(u'dialogLayout')
+ self.bibleTabWidget = QtGui.QTabWidget(editBibleDialog)
+ self.bibleTabWidget.setObjectName(u'BibleTabWidget')
+ # Meta tab
+ self.metaTab = QtGui.QWidget()
+ self.metaTab.setObjectName(u'metaTab')
+ self.metaTabLayout = QtGui.QFormLayout(self.metaTab)
+ self.metaTabLayout.setObjectName(u'metaTabLayout')
+ self.versionNameLabel = QtGui.QLabel(self.metaTab)
+ self.versionNameLabel.setObjectName(u'versionNameLabel')
+ self.metaTabLayout.setWidget(0, QtGui.QFormLayout.LabelRole,
+ self.versionNameLabel)
+ self.versionNameEdit = QtGui.QLineEdit(self.metaTab)
+ self.versionNameEdit.setObjectName(u'versionNameEdit')
+ self.versionNameLabel.setBuddy(self.versionNameEdit)
+ self.metaTabLayout.setWidget(0, QtGui.QFormLayout.FieldRole,
+ self.versionNameEdit)
+ self.copyrightLabel = QtGui.QLabel(self.metaTab)
+ self.copyrightLabel.setObjectName(u'copyrightLabel')
+ self.metaTabLayout.setWidget(1, QtGui.QFormLayout.LabelRole,
+ self.copyrightLabel)
+ self.copyrightEdit = QtGui.QLineEdit(self.metaTab)
+ self.copyrightEdit.setObjectName(u'copyrightEdit')
+ self.copyrightLabel.setBuddy(self.copyrightEdit)
+ self.metaTabLayout.setWidget(1, QtGui.QFormLayout.FieldRole,
+ self.copyrightEdit)
+ self.permissionsLabel = QtGui.QLabel(self.metaTab)
+ self.permissionsLabel.setObjectName(u'permissionsLabel')
+ self.metaTabLayout.setWidget(2, QtGui.QFormLayout.LabelRole,
+ self.permissionsLabel)
+ self.permissionsEdit = QtGui.QLineEdit(self.metaTab)
+ self.permissionsEdit.setObjectName(u'permissionsEdit')
+ self.permissionsLabel.setBuddy(self.permissionsEdit)
+ self.metaTabLayout.setWidget(2, QtGui.QFormLayout.FieldRole,
+ self.permissionsEdit)
+ self.languageSelectionLabel = QtGui.QLabel(self.metaTab)
+ self.languageSelectionLabel.setObjectName(u'languageSelectionLabel')
+ self.metaTabLayout.setWidget(3, QtGui.QFormLayout.LabelRole,
+ self.languageSelectionLabel)
+ self.languageSelectionComboBox = QtGui.QComboBox(self.metaTab)
+ self.languageSelectionComboBox.setObjectName(
+ u'languageSelectionComboBox')
+ self.languageSelectionComboBox.addItems([u'', u'', u'', u''])
+ self.metaTabLayout.setWidget(3, QtGui.QFormLayout.FieldRole,
+ self.languageSelectionComboBox)
+ self.bibleTabWidget.addTab(self.metaTab, u'')
+ # Book name tab
+ self.bookNameTab = QtGui.QWidget()
+ self.bookNameTab.setObjectName(u'bookNameTab')
+ self.bookNameTabLayout = QtGui.QHBoxLayout(self.bookNameTab)
+ self.bookNameTabLayout.setObjectName(u'bookNameTabLayout')
+ self.scrollArea = QtGui.QScrollArea(self.bookNameTab)
+ self.scrollArea.setWidgetResizable(True)
+ self.scrollArea.setObjectName(u'scrollArea')
+ self.scrollArea.setHorizontalScrollBarPolicy(
+ QtCore.Qt.ScrollBarAlwaysOff)
+ self.bookNameGroupBox = QtGui.QWidget(self.scrollArea)
+ self.bookNameGroupBox.setObjectName(u'bookNameGroupBox')
+ self.bookNameGroupBoxLayout = QtGui.QFormLayout(self.bookNameGroupBox)
+ self.bookNameGroupBoxLayout.setObjectName(u'bookNameGroupBoxLayout')
+ self.bookNameLabel = {}
+ self.bookNameEdit= {}
+ x = 0
+ for book in BiblesResourcesDB.get_books():
+ self.bookNameLabel[book[u'abbreviation']] = QtGui.QLabel(
+ self.bookNameGroupBox)
+ self.bookNameLabel[book[u'abbreviation']].setObjectName(
+ u'bookNameLabel[%s]' % book[u'abbreviation'])
+ self.bookNameGroupBoxLayout.setWidget(x,
+ QtGui.QFormLayout.LabelRole,
+ self.bookNameLabel[book[u'abbreviation']])
+ self.bookNameEdit[book[u'abbreviation']] = QtGui.QLineEdit(
+ self.bookNameGroupBox)
+ self.bookNameEdit[book[u'abbreviation']].setObjectName(
+ u'bookNameEdit[%s]' % book[u'abbreviation'])
+ self.bookNameGroupBoxLayout.setWidget(x,
+ QtGui.QFormLayout.FieldRole,
+ self.bookNameEdit[book[u'abbreviation']])
+ x = x+1
+ self.scrollArea.setWidget(self.bookNameGroupBox)
+ self.bookNameTabLayout.addWidget(self.scrollArea)
+ self.bibleTabWidget.addTab(self.bookNameTab, u'')
+ # Last few bits
+ self.dialogLayout.addWidget(self.bibleTabWidget)
+ self.buttonBox = create_accept_reject_button_box(editBibleDialog)
+ self.dialogLayout.addWidget(self.buttonBox)
+ self.retranslateUi(editBibleDialog)
+ QtCore.QMetaObject.connectSlotsByName(editBibleDialog)
+
+
+ def retranslateUi(self, editBibleDialog):
+ self.booknames = BibleStrings().Booknames
+ editBibleDialog.setWindowTitle(
+ translate('BiblesPlugin.EditBibleForm', 'Song Editor'))
+ self.bibleTabWidget.setTabText(
+ self.bibleTabWidget.indexOf(self.metaTab),
+ translate('SongsPlugin.EditBibleForm', 'License Details'))
+ self.versionNameLabel.setText(
+ translate('BiblesPlugin.EditBibleForm', 'Version name:'))
+ self.copyrightLabel.setText(
+ translate('BiblesPlugin.EditBibleForm', 'Copyright:'))
+ self.permissionsLabel.setText(
+ translate('BiblesPlugin.EditBibleForm', 'Permissions:'))
+ self.bibleTabWidget.setTabText(
+ self.bibleTabWidget.indexOf(self.bookNameTab),
+ translate('SongsPlugin.EditBibleForm', 'Custom Book Names'))
+ self.languageSelectionLabel.setText(
+ translate('BiblesPlugin.EditBibleForm', 'Bookname language:'))
+ self.languageSelectionComboBox.setItemText(0,
+ translate('BiblesPlugin.EditBibleForm', 'General Settings'))
+ self.languageSelectionComboBox.setItemText(LanguageSelection.Bible+1,
+ translate('BiblesPlugin.EditBibleForm', 'Bible language'))
+ self.languageSelectionComboBox.setItemText(
+ LanguageSelection.Application+1,
+ translate('BiblesPlugin.EditBibleForm', 'Application language'))
+ self.languageSelectionComboBox.setItemText(LanguageSelection.English+1,
+ translate('BiblesPlugin.EditBibleForm', 'English'))
+ self.languageSelectionComboBox.setToolTip(
+ translate('BiblesPlugin.EditBibleForm', 'Multiple options:\n '
+ 'General Settings - the option choosen in settings section\n'
+ 'Bible language - the language in which the bible book names '
+ 'was imported\n Application language - the language you have '
+ 'choosen for Openlp\n English - use always English booknames'))
+ for book in BiblesResourcesDB.get_books():
+ self.bookNameLabel[book[u'abbreviation']].setText(
+ u'%s:' % unicode(self.booknames[book[u'abbreviation']]))
diff --git a/openlp/plugins/bibles/forms/editbibleform.py b/openlp/plugins/bibles/forms/editbibleform.py
new file mode 100644
index 000000000..27ec0e3a6
--- /dev/null
+++ b/openlp/plugins/bibles/forms/editbibleform.py
@@ -0,0 +1,151 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2012 Raoul Snyman #
+# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan #
+# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, #
+# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias #
+# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
+# Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 #
+###############################################################################
+
+import logging
+
+from PyQt4 import QtCore, QtGui
+
+from openlp.core.lib import PluginStatus, Receiver, MediaType, translate, \
+ create_separated_list
+from openlp.core.lib.ui import UiStrings, critical_error_message_box
+from openlp.core.utils import AppLocation
+from editbibledialog import Ui_EditBibleDialog
+from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, BiblesResourcesDB
+
+log = logging.getLogger(__name__)
+
+class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
+ """
+ Class to manage the editing of a bible
+ """
+ log.info(u'%s EditBibleForm loaded', __name__)
+
+ def __init__(self, mediaitem, parent, manager):
+ """
+ Constructor
+ """
+ QtGui.QDialog.__init__(self, parent)
+ self.mediaitem = mediaitem
+
+ # can this be automated?
+ self.width = 400
+ self.setupUi(self)
+ self.manager = manager
+
+ def loadBible(self, bible):
+ """
+ Loads a bible.
+
+ ``bible``
+ The name of the bible.
+ """
+ log.debug(u'Load Bible')
+ self.bible = bible
+ self.versionNameEdit.setText(
+ self.manager.get_meta_data(self.bible, u'Version').value)
+ self.copyrightEdit.setText(
+ self.manager.get_meta_data(self.bible, u'Copyright').value)
+ self.permissionsEdit.setText(
+ self.manager.get_meta_data(self.bible, u'Permissions').value)
+ self.bookname_language = self.manager.get_meta_data(
+ self.bible, u'Bookname language')
+ if self.bookname_language:
+ self.languageSelectionComboBox.setCurrentIndex(
+ int(self.bookname_language.value)+1)
+ self.books = {}
+ for book in BiblesResourcesDB.get_books():
+ self.books[book[u'abbreviation']] = self.manager.get_book_by_id(
+ self.bible, book[u'id'])
+ if self.books[book[u'abbreviation']]:
+ self.bookNameEdit[book[u'abbreviation']].setText(
+ self.books[book[u'abbreviation']].custom_name)
+ else:
+ self.bookNameGroupBoxLayout.removeWidget(
+ self.bookNameLabel[book[u'abbreviation']])
+ self.bookNameLabel[book[u'abbreviation']].setParent(None)
+ self.bookNameGroupBoxLayout.removeWidget(
+ self.bookNameEdit[book[u'abbreviation']])
+ self.bookNameEdit[book[u'abbreviation']].setParent(None)
+
+ def reject(self):
+ """
+ Exit Dialog and do not save
+ """
+ log.debug (u'BibleEditForm.reject')
+ self.bible = None
+ QtGui.QDialog.reject(self)
+
+ def accept(self):
+ """
+ Exit Dialog and save data
+ """
+ log.debug(u'BibleEditForm.accept')
+ self.version = unicode(self.versionNameEdit.text())
+ self.copyright = unicode(self.copyrightEdit.text())
+ self.permissions = unicode(self.permissionsEdit.text())
+ self.bookname_language = \
+ self.languageSelectionComboBox.currentIndex()-1
+ if self.validateInput():
+ self.manager.update_meta_data(self.bible, self.version,
+ self.copyright, self.permissions, self.bookname_language)
+ for abbr, book in self.books.iteritems():
+ if book:
+ custom_name = unicode(self.bookNameEdit[abbr].text())
+ if book.custom_name != custom_name:
+ book.custom_name = custom_name
+ self.manager.update_book(self.bible, book)
+ self.bible = None
+ QtGui.QDialog.accept(self)
+
+ def validateInput(self):
+ """
+ Validate the Input before saving.
+ """
+ if not self.version:
+ critical_error_message_box(UiStrings().EmptyField,
+ translate('BiblesPlugin.BibleEditForm',
+ 'You need to specify a version name for your Bible.'))
+ self.versionNameEdit.setFocus()
+ return False
+ elif not self.copyright:
+ critical_error_message_box(UiStrings().EmptyField,
+ translate('BiblesPlugin.BibleEditForm',
+ 'You need to set a copyright for your Bible. '
+ 'Bibles in the Public Domain need to be marked as such.'))
+ self.copyrightEdit.setFocus()
+ return False
+ elif self.manager.exists(self.version) and \
+ self.manager.get_meta_data(self.bible, u'Version').value != \
+ self.version:
+ critical_error_message_box(
+ translate('BiblesPlugin.BibleEditForm', 'Bible Exists'),
+ translate('BiblesPlugin.BibleEditForm',
+ 'This Bible already exists. Please import '
+ 'a different Bible or first delete the existing one.'))
+ self.versionNameEdit.setFocus()
+ return False
+ return True
diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py
index b419bebc0..e7b30c01a 100644
--- a/openlp/plugins/bibles/lib/db.py
+++ b/openlp/plugins/bibles/lib/db.py
@@ -81,6 +81,7 @@ def init_schema(url):
Column(u'book_reference_id', types.Integer, index=True),
Column(u'testament_reference_id', types.Integer),
Column(u'name', types.Unicode(50), index=True),
+ #Column(u'custom_name', types.Unicode(50), index=True),
)
verse_table = Table(u'verse', metadata,
Column(u'id', types.Integer, primary_key=True, index=True),
@@ -205,6 +206,18 @@ class BibleDB(QtCore.QObject, Manager):
self.save_object(book)
return book
+ def update_book(self, book):
+ """
+ Update a book in the database.
+
+ ``book``
+ The book object
+ """
+ log.debug(u'BibleDB.update_book("%s")', book.name)
+ if self.save_object(book):
+ return True
+ return False
+
def delete_book(self, db_book):
"""
Delete a book from the database.
@@ -286,6 +299,26 @@ class BibleDB(QtCore.QObject, Manager):
log.debug(u'BibleDB.save_meta("%s/%s")', key, value)
self.save_object(BibleMeta.populate(key=key, value=value))
+ def update_meta(self, key, value):
+ """
+ Utility method to update BibleMeta objects in a Bible database.
+
+ ``key``
+ The key for this instance.
+
+ ``value``
+ The value for this instance.
+ """
+ if not isinstance(value, unicode):
+ value = unicode(value)
+ log.debug(u'BibleDB.update_meta("%s/%s")', key, value)
+ meta = self.get_object(BibleMeta, key)
+ if meta:
+ meta.value = value
+ self.save_object(meta)
+ else:
+ self.save_object(BibleMeta.populate(key=key, value=value))
+
def get_book(self, book):
"""
Return a book object from the database.
diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py
index c9f564b2c..46cfae6b8 100644
--- a/openlp/plugins/bibles/lib/manager.py
+++ b/openlp/plugins/bibles/lib/manager.py
@@ -31,7 +31,8 @@ import os
from PyQt4 import QtCore
from openlp.core.lib import Receiver, SettingsManager, translate
-from openlp.core.lib.ui import critical_error_message_box
+from openlp.core.lib.ui import critical_error_message_box, \
+ create_accept_reject_button_box
from openlp.core.utils import AppLocation, delete_file
from openlp.plugins.bibles.lib import parse_reference, \
get_reference_separator, LanguageSelection
@@ -141,13 +142,14 @@ class BibleManager(object):
BibleDB class.
"""
log.debug(u'Reload bibles')
- files = SettingsManager.get_files(self.settingsSection, self.suffix)
- if u'alternative_book_names.sqlite' in files:
- files.remove(u'alternative_book_names.sqlite')
- log.debug(u'Bible Files %s', files)
+ self.files = SettingsManager.get_files(self.settingsSection,
+ self.suffix)
+ if u'alternative_book_names.sqlite' in self.files:
+ self.files.remove(u'alternative_book_names.sqlite')
+ log.debug(u'Bible Files %s', self.files)
self.db_cache = {}
self.old_bible_databases = []
- for filename in files:
+ for filename in self.files:
bible = BibleDB(self.parent, path=self.path, file=filename)
name = bible.get_name()
# Remove corrupted files.
@@ -204,6 +206,22 @@ class BibleManager(object):
self.db_cache[name] = importer
return importer
+ def delete_bible(self, name):
+ """
+ Delete a bible completly.
+
+ ``name``
+ The name of the bible.
+ """
+ for filename in self.files:
+ bible = BibleDB(self.parent, path=self.path, file=filename)
+ # Remove the bible files
+ if name == bible.get_name():
+ bible.session.close()
+ if delete_file(os.path.join(self.path, filename)):
+ return True
+ return False
+
def get_bibles(self):
"""
Returns a dict with all available Bibles.
@@ -400,18 +418,38 @@ class BibleManager(object):
"""
Saves the bibles meta data.
"""
- log.debug(u'save_meta data %s,%s, %s,%s',
+ log.debug(u'save_meta data %s, %s, %s, %s',
bible, version, copyright, permissions)
self.db_cache[bible].create_meta(u'Version', version)
self.db_cache[bible].create_meta(u'Copyright', copyright)
self.db_cache[bible].create_meta(u'Permissions', permissions)
+ def update_meta_data(self, bible, version, copyright, permissions,
+ bookname_language):
+ """
+ Saves the bibles meta data.
+ """
+ log.debug(u'update_meta data %s, %s, %s, %s',
+ bible, version, copyright, permissions)
+ self.db_cache[bible].update_meta(u'Version', version)
+ self.db_cache[bible].update_meta(u'Copyright', copyright)
+ self.db_cache[bible].update_meta(u'Permissions', permissions)
+ self.db_cache[bible].update_meta(u'Bookname language',
+ bookname_language)
+
def get_meta_data(self, bible, key):
"""
Returns the meta data for a given key.
"""
log.debug(u'get_meta %s,%s', bible, key)
return self.db_cache[bible].get_object(BibleMeta, key)
+
+ def update_book(self, bible, book):
+ """
+ Update a book of the bible.
+ """
+ log.debug(u'BibleManager.update_book("%s", "%s")', bible, book.name)
+ self.db_cache[bible].update_book(book)
def exists(self, name):
"""
diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py
index 976ff6106..980d8d94d 100644
--- a/openlp/plugins/bibles/lib/mediaitem.py
+++ b/openlp/plugins/bibles/lib/mediaitem.py
@@ -36,9 +36,10 @@ from openlp.core.lib.searchedit import SearchEdit
from openlp.core.lib.ui import UiStrings, add_widget_completer, \
media_item_combo_box, critical_error_message_box, \
find_and_set_in_combo_box, build_icon
-from openlp.plugins.bibles.forms import BibleImportForm
+from openlp.plugins.bibles.forms import BibleImportForm, EditBibleForm
from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \
- VerseReferenceList, get_reference_separator, LanguageSelection, BibleStrings
+ VerseReferenceList, get_reference_separator, LanguageSelection, \
+ BibleStrings
from openlp.plugins.bibles.lib.db import BiblesResourcesDB
log = logging.getLogger(__name__)
@@ -109,8 +110,8 @@ class BibleMediaItem(MediaManagerItem):
MediaManagerItem.requiredIcons(self)
self.hasImportIcon = True
self.hasNewIcon = False
- self.hasEditIcon = False
- self.hasDeleteIcon = False
+ self.hasEditIcon = True
+ self.hasDeleteIcon = True
self.addToServiceItem = False
def addSearchTab(self, prefix, name):
@@ -532,6 +533,34 @@ class BibleMediaItem(MediaManagerItem):
if self.import_wizard.exec_():
self.reloadBibles()
+ def onEditClick(self):
+ if self.quickTab.isVisible():
+ bible = unicode(self.quickVersionComboBox.currentText())
+ elif self.advancedTab.isVisible():
+ bible = unicode(self.advancedVersionComboBox.currentText())
+ if bible != u'':
+ self.editBibleForm = EditBibleForm(self, self.plugin.formparent,
+ self.plugin.manager)
+ self.editBibleForm.loadBible(bible)
+ if self.editBibleForm.exec_():
+ self.reloadBibles()
+
+ def onDeleteClick(self):
+ if self.quickTab.isVisible():
+ bible = unicode(self.quickVersionComboBox.currentText())
+ elif self.advancedTab.isVisible():
+ bible = unicode(self.advancedVersionComboBox.currentText())
+ if bible != u'':
+ if QtGui.QMessageBox.question(self, UiStrings().ConfirmDelete,
+ unicode(translate('BiblesPlugin.MediaItem',
+ 'Are you sure you want to delete "%s"?')) % bible,
+ QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes |
+ QtGui.QMessageBox.No),
+ QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No:
+ return
+ self.plugin.manager.delete_bible(bible)
+ self.reloadBibles()
+
def onSearchTabBarCurrentChanged(self, index):
if index == 0:
self.advancedTab.setVisible(False)
From 12458c0d31ec3c246d1475e6ba495113fb37a2d9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Armin=20K=C3=B6hler?=
Date: Wed, 21 Mar 2012 21:57:07 +0100
Subject: [PATCH 02/19] add possibility to switch book names for each bible
---
.../plugins/bibles/forms/bibleupgradeform.py | 6 +-
.../plugins/bibles/forms/editbibledialog.py | 15 ++-
openlp/plugins/bibles/forms/editbibleform.py | 113 ++++++++++++++----
openlp/plugins/bibles/lib/db.py | 23 +---
openlp/plugins/bibles/lib/http.py | 12 +-
openlp/plugins/bibles/lib/manager.py | 22 +---
openlp/plugins/bibles/lib/mediaitem.py | 19 +--
openlp/plugins/bibles/lib/osis.py | 2 +-
8 files changed, 132 insertions(+), 80 deletions(-)
diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py
index 7c7f14979..b7ba01711 100644
--- a/openlp/plugins/bibles/forms/bibleupgradeform.py
+++ b/openlp/plugins/bibles/forms/bibleupgradeform.py
@@ -415,7 +415,7 @@ class BibleUpgradeForm(OpenLPWizard):
meta_data[meta[u'key']] = meta[u'value']
if not meta[u'key'] == u'Version' and not meta[u'key'] == \
u'dbversion':
- self.newbibles[number].create_meta(meta[u'key'],
+ self.newbibles[number].save_meta(meta[u'key'],
meta[u'value'])
if meta[u'key'] == u'download source':
webbible = True
@@ -455,7 +455,7 @@ class BibleUpgradeForm(OpenLPWizard):
meta_data[u'download source'].lower())
if bible and bible[u'language_id']:
language_id = bible[u'language_id']
- self.newbibles[number].create_meta(u'language_id',
+ self.newbibles[number].save_meta(u'language_id',
language_id)
else:
language_id = self.newbibles[number].get_language(name)
@@ -574,7 +574,7 @@ class BibleUpgradeForm(OpenLPWizard):
self.progressBar.maximum() - self.progressBar.value())
else:
self.success[number] = True
- self.newbibles[number].create_meta(u'Version', name)
+ self.newbibles[number].save_meta(u'Version', name)
self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\n'
diff --git a/openlp/plugins/bibles/forms/editbibledialog.py b/openlp/plugins/bibles/forms/editbibledialog.py
index ce64e90c9..c2596ddab 100644
--- a/openlp/plugins/bibles/forms/editbibledialog.py
+++ b/openlp/plugins/bibles/forms/editbibledialog.py
@@ -92,8 +92,11 @@ class Ui_EditBibleDialog(object):
# Book name tab
self.bookNameTab = QtGui.QWidget()
self.bookNameTab.setObjectName(u'bookNameTab')
- self.bookNameTabLayout = QtGui.QHBoxLayout(self.bookNameTab)
+ self.bookNameTabLayout = QtGui.QVBoxLayout(self.bookNameTab)
self.bookNameTabLayout.setObjectName(u'bookNameTabLayout')
+ self.bookNameNotice = QtGui.QLabel(self.bookNameTab)
+ self.bookNameNotice.setObjectName(u'bookNameNotice')
+ self.bookNameTabLayout.addWidget(self.bookNameNotice)
self.scrollArea = QtGui.QScrollArea(self.bookNameTab)
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName(u'scrollArea')
@@ -124,6 +127,9 @@ class Ui_EditBibleDialog(object):
x = x+1
self.scrollArea.setWidget(self.bookNameGroupBox)
self.bookNameTabLayout.addWidget(self.scrollArea)
+ self.spacer = QtGui.QSpacerItem(20, 5, QtGui.QSizePolicy.Minimum,
+ QtGui.QSizePolicy.Expanding)
+ self.bookNameTabLayout.addItem(self.spacer)
self.bibleTabWidget.addTab(self.bookNameTab, u'')
# Last few bits
self.dialogLayout.addWidget(self.bibleTabWidget)
@@ -131,7 +137,6 @@ class Ui_EditBibleDialog(object):
self.dialogLayout.addWidget(self.buttonBox)
self.retranslateUi(editBibleDialog)
QtCore.QMetaObject.connectSlotsByName(editBibleDialog)
-
def retranslateUi(self, editBibleDialog):
self.booknames = BibleStrings().Booknames
@@ -163,9 +168,9 @@ class Ui_EditBibleDialog(object):
self.languageSelectionComboBox.setToolTip(
translate('BiblesPlugin.EditBibleForm', 'Multiple options:\n '
'General Settings - the option choosen in settings section\n'
- 'Bible language - the language in which the bible book names '
- 'was imported\n Application language - the language you have '
- 'choosen for Openlp\n English - use always English booknames'))
+ 'Bible language - the language in which the Bible book names '
+ 'were imported\n Application language - the language you have '
+ 'chosen for OpenLP\n English - always use English book names'))
for book in BiblesResourcesDB.get_books():
self.bookNameLabel[book[u'abbreviation']].setText(
u'%s:' % unicode(self.booknames[book[u'abbreviation']]))
diff --git a/openlp/plugins/bibles/forms/editbibleform.py b/openlp/plugins/bibles/forms/editbibleform.py
index 27ec0e3a6..2af4f5726 100644
--- a/openlp/plugins/bibles/forms/editbibleform.py
+++ b/openlp/plugins/bibles/forms/editbibleform.py
@@ -34,6 +34,7 @@ from openlp.core.lib import PluginStatus, Receiver, MediaType, translate, \
from openlp.core.lib.ui import UiStrings, critical_error_message_box
from openlp.core.utils import AppLocation
from editbibledialog import Ui_EditBibleDialog
+from openlp.plugins.bibles.lib import BibleStrings
from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, BiblesResourcesDB
log = logging.getLogger(__name__)
@@ -50,7 +51,8 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
"""
QtGui.QDialog.__init__(self, parent)
self.mediaitem = mediaitem
-
+ self.validate_error = []
+ self.booknames = BibleStrings().Booknames
# can this be automated?
self.width = 400
self.setupUi(self)
@@ -77,19 +79,31 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
self.languageSelectionComboBox.setCurrentIndex(
int(self.bookname_language.value)+1)
self.books = {}
- for book in BiblesResourcesDB.get_books():
- self.books[book[u'abbreviation']] = self.manager.get_book_by_id(
- self.bible, book[u'id'])
- if self.books[book[u'abbreviation']]:
- self.bookNameEdit[book[u'abbreviation']].setText(
- self.books[book[u'abbreviation']].custom_name)
- else:
- self.bookNameGroupBoxLayout.removeWidget(
- self.bookNameLabel[book[u'abbreviation']])
- self.bookNameLabel[book[u'abbreviation']].setParent(None)
- self.bookNameGroupBoxLayout.removeWidget(
- self.bookNameEdit[book[u'abbreviation']])
- self.bookNameEdit[book[u'abbreviation']].setParent(None)
+ self.webbible = self.manager.get_meta_data(self.bible, u'download source')
+ if self.webbible:
+ self.bookNameNotice.setText(translate('BiblesPlugin.EditBibleForm',
+ 'This is a webbible.\nIt is not possible to customize the Book '
+ 'Names.'))
+ self.bookNameTabLayout.removeWidget(self.scrollArea)
+ self.scrollArea.setParent(None)
+ else:
+ self.bookNameNotice.setText(translate('BiblesPlugin.EditBibleForm',
+ 'You could customize the Book Names of this Bible.\nTo use '
+ 'the Book Names below, you have to choose the option "Bible '
+ 'language" in general settings or explicit for this Bible.'))
+ for book in BiblesResourcesDB.get_books():
+ self.books[book[u'abbreviation']] = self.manager.get_book_by_id(
+ self.bible, book[u'id'])
+ if self.books[book[u'abbreviation']] and not self.webbible:
+ self.bookNameEdit[book[u'abbreviation']].setText(
+ self.books[book[u'abbreviation']].name)
+ else:
+ self.bookNameGroupBoxLayout.removeWidget(
+ self.bookNameLabel[book[u'abbreviation']])
+ self.bookNameLabel[book[u'abbreviation']].setParent(None)
+ self.bookNameGroupBoxLayout.removeWidget(
+ self.bookNameEdit[book[u'abbreviation']])
+ self.bookNameEdit[book[u'abbreviation']].setParent(None)
def reject(self):
"""
@@ -104,26 +118,40 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
Exit Dialog and save data
"""
log.debug(u'BibleEditForm.accept')
+ save = True
self.version = unicode(self.versionNameEdit.text())
self.copyright = unicode(self.copyrightEdit.text())
self.permissions = unicode(self.permissionsEdit.text())
self.bookname_language = \
self.languageSelectionComboBox.currentIndex()-1
- if self.validateInput():
- self.manager.update_meta_data(self.bible, self.version,
- self.copyright, self.permissions, self.bookname_language)
+ if not self.validateMeta():
+ save = False
+ if not self.webbible and save:
+ custom_names = {}
+ for error in self.validate_error:
+ self.changeBackgroundColor(error, 'white')
for abbr, book in self.books.iteritems():
if book:
- custom_name = unicode(self.bookNameEdit[abbr].text())
- if book.custom_name != custom_name:
- book.custom_name = custom_name
- self.manager.update_book(self.bible, book)
+ custom_names[abbr] = unicode(self.bookNameEdit[abbr].text())
+ if book.name != custom_names[abbr]:
+ if not self.validateBook(custom_names[abbr], abbr):
+ save = False
+ break
+ if save:
+ self.manager.save_meta_data(self.bible, self.version,
+ self.copyright, self.permissions, self.bookname_language)
+ if not self.webbible:
+ for abbr, book in self.books.iteritems():
+ if book:
+ if book.name != custom_names[abbr]:
+ book.name = custom_names[abbr]
+ self.manager.update_book(self.bible, book)
self.bible = None
QtGui.QDialog.accept(self)
- def validateInput(self):
+ def validateMeta(self):
"""
- Validate the Input before saving.
+ Validate the Meta before saving.
"""
if not self.version:
critical_error_message_box(UiStrings().EmptyField,
@@ -149,3 +177,42 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
self.versionNameEdit.setFocus()
return False
return True
+
+ def validateBook(self, new_bookname, abbreviation):
+ """
+ Validate a book.
+ """
+ if not new_bookname:
+ self.changeBackgroundColor(self.bookNameEdit[abbreviation], 'red')
+ self.validate_error = [self.bookNameEdit[abbreviation]]
+ self.bookNameEdit[abbreviation].setFocus()
+ critical_error_message_box(UiStrings().EmptyField,
+ unicode(translate('BiblesPlugin.BibleEditForm',
+ 'You need to specify a book name for "%s".')) %
+ self.booknames[abbreviation])
+ return False
+ for abbr, book in self.books.iteritems():
+ if book:
+ if book.name == new_bookname:
+ self.changeBackgroundColor(self.bookNameEdit[abbreviation],
+ 'red')
+ self.bookNameEdit[abbreviation].setFocus()
+ self.changeBackgroundColor(self.bookNameEdit[abbr], 'red')
+ self.validate_error = [self.bookNameEdit[abbr],
+ self.bookNameEdit[abbreviation]]
+ critical_error_message_box(
+ translate('BiblesPlugin.BibleEditForm',
+ 'Book Name Exists Twice'),
+ unicode(translate('BiblesPlugin.BibleEditForm',
+ 'The Book Name "%s" exists twice. Please change one.'))
+ % new_bookname)
+ return False
+ return True
+
+ def changeBackgroundColor(self, lineedit, color):
+ """
+ Change the Background Color of the given LineEdit
+ """
+ pal = QtGui.QPalette(lineedit.palette())
+ pal.setColor(QtGui.QPalette.Base,QtGui.QColor(color))
+ lineedit.setPalette(pal)
diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py
index cd7c194cb..b6f3a2df8 100644
--- a/openlp/plugins/bibles/lib/db.py
+++ b/openlp/plugins/bibles/lib/db.py
@@ -183,7 +183,7 @@ class BibleDB(QtCore.QObject, Manager):
The actual Qt wizard form.
"""
self.wizard = wizard
- self.create_meta(u'dbversion', u'2')
+ self.save_meta(u'dbversion', u'2')
return self.name
def create_book(self, name, bk_ref_id, testament=1):
@@ -284,9 +284,9 @@ class BibleDB(QtCore.QObject, Manager):
self.session.add(verse)
return verse
- def create_meta(self, key, value):
+ def save_meta(self, key, value):
"""
- Utility method to save BibleMeta objects in a Bible database.
+ Utility method to save or update BibleMeta objects in a Bible database.
``key``
The key for this instance.
@@ -297,21 +297,6 @@ class BibleDB(QtCore.QObject, Manager):
if not isinstance(value, unicode):
value = unicode(value)
log.debug(u'BibleDB.save_meta("%s/%s")', key, value)
- self.save_object(BibleMeta.populate(key=key, value=value))
-
- def update_meta(self, key, value):
- """
- Utility method to update BibleMeta objects in a Bible database.
-
- ``key``
- The key for this instance.
-
- ``value``
- The value for this instance.
- """
- if not isinstance(value, unicode):
- value = unicode(value)
- log.debug(u'BibleDB.update_meta("%s/%s")', key, value)
meta = self.get_object(BibleMeta, key)
if meta:
meta.value = value
@@ -507,7 +492,7 @@ class BibleDB(QtCore.QObject, Manager):
return False
language = BiblesResourcesDB.get_language(language)
language_id = language[u'id']
- self.create_meta(u'language_id', language_id)
+ self.save_meta(u'language_id', language_id)
return language_id
def is_old_database(self):
diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py
index 72ffed487..630772bf3 100644
--- a/openlp/plugins/bibles/lib/http.py
+++ b/openlp/plugins/bibles/lib/http.py
@@ -401,16 +401,16 @@ class HTTPBible(BibleDB):
self.wizard.incrementProgressBar(unicode(translate(
'BiblesPlugin.HTTPBible',
'Registering Bible and loading books...')))
- self.create_meta(u'download source', self.download_source)
- self.create_meta(u'download name', self.download_name)
+ self.save_meta(u'download source', self.download_source)
+ self.save_meta(u'download name', self.download_name)
if self.proxy_server:
- self.create_meta(u'proxy server', self.proxy_server)
+ self.save_meta(u'proxy server', self.proxy_server)
if self.proxy_username:
# Store the proxy userid.
- self.create_meta(u'proxy username', self.proxy_username)
+ self.save_meta(u'proxy username', self.proxy_username)
if self.proxy_password:
# Store the proxy password.
- self.create_meta(u'proxy password', self.proxy_password)
+ self.save_meta(u'proxy password', self.proxy_password)
if self.download_source.lower() == u'crosswalk':
handler = CWExtract(self.proxy_server)
elif self.download_source.lower() == u'biblegateway':
@@ -429,7 +429,7 @@ class HTTPBible(BibleDB):
self.download_source.lower())
if bible[u'language_id']:
language_id = bible[u'language_id']
- self.create_meta(u'language_id', language_id)
+ self.save_meta(u'language_id', language_id)
else:
language_id = self.get_language(bible_name)
if not language_id:
diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py
index 46cfae6b8..fb4c606d0 100644
--- a/openlp/plugins/bibles/lib/manager.py
+++ b/openlp/plugins/bibles/lib/manager.py
@@ -414,27 +414,17 @@ class BibleManager(object):
})
return None
- def save_meta_data(self, bible, version, copyright, permissions):
+ def save_meta_data(self, bible, version, copyright, permissions,
+ bookname_language):
"""
Saves the bibles meta data.
"""
log.debug(u'save_meta data %s, %s, %s, %s',
bible, version, copyright, permissions)
- self.db_cache[bible].create_meta(u'Version', version)
- self.db_cache[bible].create_meta(u'Copyright', copyright)
- self.db_cache[bible].create_meta(u'Permissions', permissions)
-
- def update_meta_data(self, bible, version, copyright, permissions,
- bookname_language):
- """
- Saves the bibles meta data.
- """
- log.debug(u'update_meta data %s, %s, %s, %s',
- bible, version, copyright, permissions)
- self.db_cache[bible].update_meta(u'Version', version)
- self.db_cache[bible].update_meta(u'Copyright', copyright)
- self.db_cache[bible].update_meta(u'Permissions', permissions)
- self.db_cache[bible].update_meta(u'Bookname language',
+ self.db_cache[bible].save_meta(u'Version', version)
+ self.db_cache[bible].save_meta(u'Copyright', copyright)
+ self.db_cache[bible].save_meta(u'Permissions', permissions)
+ self.db_cache[bible].save_meta(u'Bookname language',
bookname_language)
def get_meta_data(self, bible, key):
diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py
index 980d8d94d..728bc3931 100644
--- a/openlp/plugins/bibles/lib/mediaitem.py
+++ b/openlp/plugins/bibles/lib/mediaitem.py
@@ -349,10 +349,6 @@ class BibleMediaItem(MediaManagerItem):
log.debug(u'bible manager initialise')
self.plugin.manager.media = self
self.loadBibles()
- bible = QtCore.QSettings().value(
- self.settingsSection + u'/quick bible', QtCore.QVariant(
- self.quickVersionComboBox.currentText())).toString()
- find_and_set_in_combo_box(self.quickVersionComboBox, bible)
self.quickSearchEdit.setSearchTypes([
(BibleSearch.Reference, u':/bibles/bibles_search_reference.png',
translate('BiblesPlugin.MediaItem', 'Scripture Reference')),
@@ -392,6 +388,10 @@ class BibleMediaItem(MediaManagerItem):
self.initialiseAdvancedBible(unicode(bible))
elif len(bibles):
self.initialiseAdvancedBible(bibles[0])
+ bible = QtCore.QSettings().value(
+ self.settingsSection + u'/quick bible', QtCore.QVariant(
+ self.quickVersionComboBox.currentText())).toString()
+ find_and_set_in_combo_box(self.quickVersionComboBox, bible)
def reloadBibles(self, process=False):
log.debug(u'Reloading Bibles')
@@ -426,9 +426,14 @@ class BibleMediaItem(MediaManagerItem):
book_data = book_data_temp
self.advancedBookComboBox.clear()
first = True
- language_selection = QtCore.QSettings().value(
- self.settingsSection + u'/bookname language',
- QtCore.QVariant(0)).toInt()[0]
+ language_selection = self.plugin.manager.get_meta_data(
+ bible, u'Bookname language')
+ if language_selection:
+ language_selection = int(language_selection.value)
+ if not language_selection or language_selection == -1:
+ language_selection = QtCore.QSettings().value(
+ self.settingsSection + u'/bookname language',
+ QtCore.QVariant(0)).toInt()[0]
booknames = BibleStrings().Booknames
for book in book_data:
row = self.advancedBookComboBox.count()
diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py
index 4afee912d..b9420d5cd 100644
--- a/openlp/plugins/bibles/lib/osis.py
+++ b/openlp/plugins/bibles/lib/osis.py
@@ -123,7 +123,7 @@ class OSISBible(BibleDB):
language_match.group(1))
if language:
language_id = language[u'id']
- self.create_meta(u'language_id', language_id)
+ self.save_meta(u'language_id', language_id)
continue
match = self.verse_regex.search(file_record)
if match:
From 0e34ed3a948fd9363a50e178d4cb609c77f404ee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Armin=20K=C3=B6hler?=
Date: Wed, 21 Mar 2012 22:00:44 +0100
Subject: [PATCH 03/19] fixes
---
openlp/plugins/bibles/forms/editbibleform.py | 3 ++-
openlp/plugins/bibles/lib/db.py | 1 -
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/openlp/plugins/bibles/forms/editbibleform.py b/openlp/plugins/bibles/forms/editbibleform.py
index 2af4f5726..07bf7bbbd 100644
--- a/openlp/plugins/bibles/forms/editbibleform.py
+++ b/openlp/plugins/bibles/forms/editbibleform.py
@@ -79,7 +79,8 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
self.languageSelectionComboBox.setCurrentIndex(
int(self.bookname_language.value)+1)
self.books = {}
- self.webbible = self.manager.get_meta_data(self.bible, u'download source')
+ self.webbible = self.manager.get_meta_data(self.bible,
+ u'download source')
if self.webbible:
self.bookNameNotice.setText(translate('BiblesPlugin.EditBibleForm',
'This is a webbible.\nIt is not possible to customize the Book '
diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py
index b6f3a2df8..2f9ce0cb8 100644
--- a/openlp/plugins/bibles/lib/db.py
+++ b/openlp/plugins/bibles/lib/db.py
@@ -81,7 +81,6 @@ def init_schema(url):
Column(u'book_reference_id', types.Integer, index=True),
Column(u'testament_reference_id', types.Integer),
Column(u'name', types.Unicode(50), index=True),
- #Column(u'custom_name', types.Unicode(50), index=True),
)
verse_table = Table(u'verse', metadata,
Column(u'id', types.Integer, primary_key=True, index=True),
From 800510f2f8e92ef212e042a7cc2225b8d8b6b833 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Armin=20K=C3=B6hler?=
Date: Tue, 3 Apr 2012 20:42:21 +0200
Subject: [PATCH 04/19] some fixes - improve error handling with duplicate book
names
---
.../plugins/bibles/forms/editbibledialog.py | 10 ++--
openlp/plugins/bibles/forms/editbibleform.py | 48 +++++++++++++------
openlp/plugins/bibles/lib/manager.py | 12 +++--
openlp/plugins/bibles/lib/mediaitem.py | 13 +++--
4 files changed, 56 insertions(+), 27 deletions(-)
diff --git a/openlp/plugins/bibles/forms/editbibledialog.py b/openlp/plugins/bibles/forms/editbibledialog.py
index c2596ddab..e73af55a1 100644
--- a/openlp/plugins/bibles/forms/editbibledialog.py
+++ b/openlp/plugins/bibles/forms/editbibledialog.py
@@ -28,7 +28,7 @@
from PyQt4 import QtCore, QtGui
from openlp.core.lib import build_icon, translate
-from openlp.core.lib.ui import UiStrings, create_accept_reject_button_box
+from openlp.core.lib.ui import create_accept_reject_button_box
from openlp.plugins.bibles.lib import LanguageSelection, BibleStrings
from openlp.plugins.bibles.lib.db import BiblesResourcesDB
@@ -36,7 +36,7 @@ from openlp.plugins.bibles.lib.db import BiblesResourcesDB
class Ui_EditBibleDialog(object):
def setupUi(self, editBibleDialog):
editBibleDialog.setObjectName(u'editBibleDialog')
- editBibleDialog.resize(650, 400)
+ editBibleDialog.resize(600, 400)
editBibleDialog.setWindowIcon(
build_icon(u':/icon/openlp-logo-16x16.png'))
editBibleDialog.setModal(True)
@@ -166,11 +166,11 @@ class Ui_EditBibleDialog(object):
self.languageSelectionComboBox.setItemText(LanguageSelection.English+1,
translate('BiblesPlugin.EditBibleForm', 'English'))
self.languageSelectionComboBox.setToolTip(
- translate('BiblesPlugin.EditBibleForm', 'Multiple options:\n '
+ translate('BiblesPlugin.EditBibleForm', 'Multiple options:\n'
'General Settings - the option choosen in settings section\n'
'Bible language - the language in which the Bible book names '
- 'were imported\n Application language - the language you have '
- 'chosen for OpenLP\n English - always use English book names'))
+ 'were imported\nApplication language - the language you have '
+ 'chosen for OpenLP\nEnglish - always use English book names'))
for book in BiblesResourcesDB.get_books():
self.bookNameLabel[book[u'abbreviation']].setText(
u'%s:' % unicode(self.booknames[book[u'abbreviation']]))
diff --git a/openlp/plugins/bibles/forms/editbibleform.py b/openlp/plugins/bibles/forms/editbibleform.py
index 07bf7bbbd..5ababcaa0 100644
--- a/openlp/plugins/bibles/forms/editbibleform.py
+++ b/openlp/plugins/bibles/forms/editbibleform.py
@@ -26,16 +26,15 @@
###############################################################################
import logging
+import re
-from PyQt4 import QtCore, QtGui
+from PyQt4 import QtGui
-from openlp.core.lib import PluginStatus, Receiver, MediaType, translate, \
- create_separated_list
+from openlp.core.lib import Receiver, translate
from openlp.core.lib.ui import UiStrings, critical_error_message_box
-from openlp.core.utils import AppLocation
from editbibledialog import Ui_EditBibleDialog
from openlp.plugins.bibles.lib import BibleStrings
-from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, BiblesResourcesDB
+from openlp.plugins.bibles.lib.db import BiblesResourcesDB
log = logging.getLogger(__name__)
@@ -89,9 +88,8 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
self.scrollArea.setParent(None)
else:
self.bookNameNotice.setText(translate('BiblesPlugin.EditBibleForm',
- 'You could customize the Book Names of this Bible.\nTo use '
- 'the Book Names below, you have to choose the option "Bible '
- 'language" in general settings or explicit for this Bible.'))
+ 'To use the customized Book Names, choose the option "Bible '
+ 'language"\nin general settings or explicit for this Bible.'))
for book in BiblesResourcesDB.get_books():
self.books[book[u'abbreviation']] = self.manager.get_book_by_id(
self.bible, book[u'id'])
@@ -125,12 +123,12 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
self.permissions = unicode(self.permissionsEdit.text())
self.bookname_language = \
self.languageSelectionComboBox.currentIndex()-1
+ for error in self.validate_error:
+ self.changeBackgroundColor(error, 'white')
if not self.validateMeta():
save = False
if not self.webbible and save:
custom_names = {}
- for error in self.validate_error:
- self.changeBackgroundColor(error, 'white')
for abbr, book in self.books.iteritems():
if book:
custom_names[abbr] = unicode(self.bookNameEdit[abbr].text())
@@ -139,6 +137,8 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
save = False
break
if save:
+ Receiver.send_message(u'openlp_process_events')
+ Receiver.send_message(u'cursor_busy')
self.manager.save_meta_data(self.bible, self.version,
self.copyright, self.permissions, self.bookname_language)
if not self.webbible:
@@ -148,6 +148,7 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
book.name = custom_names[abbr]
self.manager.update_book(self.bible, book)
self.bible = None
+ Receiver.send_message(u'cursor_normal')
QtGui.QDialog.accept(self)
def validateMeta(self):
@@ -155,27 +156,33 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
Validate the Meta before saving.
"""
if not self.version:
+ self.changeBackgroundColor(self.versionNameEdit, 'red')
+ self.validate_error = [self.versionNameEdit]
+ self.versionNameEdit.setFocus()
critical_error_message_box(UiStrings().EmptyField,
translate('BiblesPlugin.BibleEditForm',
'You need to specify a version name for your Bible.'))
- self.versionNameEdit.setFocus()
return False
elif not self.copyright:
+ self.changeBackgroundColor(self.copyrightEdit, 'red')
+ self.validate_error = [self.copyrightEdit]
+ self.copyrightEdit.setFocus()
critical_error_message_box(UiStrings().EmptyField,
translate('BiblesPlugin.BibleEditForm',
'You need to set a copyright for your Bible. '
'Bibles in the Public Domain need to be marked as such.'))
- self.copyrightEdit.setFocus()
return False
elif self.manager.exists(self.version) and \
self.manager.get_meta_data(self.bible, u'Version').value != \
self.version:
+ self.changeBackgroundColor(self.versionNameEdit, 'red')
+ self.validate_error = [self.versionNameEdit]
+ self.versionNameEdit.setFocus()
critical_error_message_box(
translate('BiblesPlugin.BibleEditForm', 'Bible Exists'),
translate('BiblesPlugin.BibleEditForm',
'This Bible already exists. Please import '
'a different Bible or first delete the existing one.'))
- self.versionNameEdit.setFocus()
return False
return True
@@ -183,6 +190,7 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
"""
Validate a book.
"""
+ book_regex = re.compile(u'[\d]*[^\d]+$')
if not new_bookname:
self.changeBackgroundColor(self.bookNameEdit[abbreviation], 'red')
self.validate_error = [self.bookNameEdit[abbreviation]]
@@ -192,9 +200,21 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
'You need to specify a book name for "%s".')) %
self.booknames[abbreviation])
return False
+ elif not book_regex.match(new_bookname):
+ self.changeBackgroundColor(self.bookNameEdit[abbreviation], 'red')
+ self.validate_error = [self.bookNameEdit[abbreviation]]
+ self.bookNameEdit[abbreviation].setFocus()
+ critical_error_message_box(UiStrings().EmptyField,
+ unicode(translate('BiblesPlugin.BibleEditForm',
+ 'The book name "%s" is not correct.\nDecimal digits only could '
+ 'be used at the beginning and\nmust be followed by one or more '
+ 'non-digit characters')) % new_bookname)
+ return False
for abbr, book in self.books.iteritems():
if book:
- if book.name == new_bookname:
+ if abbr == abbreviation:
+ continue
+ if unicode(self.bookNameEdit[abbr].text()) == new_bookname:
self.changeBackgroundColor(self.bookNameEdit[abbreviation],
'red')
self.bookNameEdit[abbreviation].setFocus()
diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py
index fb4c606d0..4879e3434 100644
--- a/openlp/plugins/bibles/lib/manager.py
+++ b/openlp/plugins/bibles/lib/manager.py
@@ -327,9 +327,13 @@ class BibleManager(object):
'Import Wizard to install one or more Bibles.')
})
return None
- language_selection = QtCore.QSettings().value(
- self.settingsSection + u'/bookname language',
- QtCore.QVariant(0)).toInt()[0]
+ language_selection = self.get_meta_data(bible, u'Bookname language')
+ if language_selection:
+ language_selection = int(language_selection.value)
+ if language_selection == None or language_selection == -1:
+ language_selection = QtCore.QSettings().value(
+ self.settingsSection + u'/bookname language',
+ QtCore.QVariant(0)).toInt()[0]
reflist = parse_reference(versetext, self.db_cache[bible],
language_selection, book_ref_id)
if reflist:
@@ -415,7 +419,7 @@ class BibleManager(object):
return None
def save_meta_data(self, bible, version, copyright, permissions,
- bookname_language):
+ bookname_language=-1):
"""
Saves the bibles meta data.
"""
diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py
index 4611cb643..82416b832 100644
--- a/openlp/plugins/bibles/lib/mediaitem.py
+++ b/openlp/plugins/bibles/lib/mediaitem.py
@@ -433,7 +433,7 @@ class BibleMediaItem(MediaManagerItem):
bible, u'Bookname language')
if language_selection:
language_selection = int(language_selection.value)
- if not language_selection or language_selection == -1:
+ if language_selection == None or language_selection == -1:
language_selection = QtCore.QSettings().value(
self.settingsSection + u'/bookname language',
QtCore.QVariant(0)).toInt()[0]
@@ -508,9 +508,14 @@ class BibleMediaItem(MediaManagerItem):
secondbook.book_reference_id:
book_data_temp.append(book)
book_data = book_data_temp
- language_selection = QtCore.QSettings().value(
- self.settingsSection + u'/bookname language',
- QtCore.QVariant(0)).toInt()[0]
+ language_selection = self.plugin.manager.get_meta_data(
+ bible, u'Bookname language')
+ if language_selection:
+ language_selection = int(language_selection.value)
+ if language_selection == None or language_selection == -1:
+ language_selection = QtCore.QSettings().value(
+ self.settingsSection + u'/bookname language',
+ QtCore.QVariant(0)).toInt()[0]
if language_selection == LanguageSelection.Bible:
books = [book.name + u' ' for book in book_data]
elif language_selection == LanguageSelection.Application:
From 02e36ba6417e23c84dff5da9bcc9cb6ed81a35f2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Armin=20K=C3=B6hler?=
Date: Tue, 3 Apr 2012 21:23:26 +0200
Subject: [PATCH 05/19] bookname in list view and shown in footer now uses the
choosen language
---
openlp/plugins/bibles/lib/mediaitem.py | 25 ++++++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)
diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py
index 82416b832..072de9bf6 100644
--- a/openlp/plugins/bibles/lib/mediaitem.py
+++ b/openlp/plugins/bibles/lib/mediaitem.py
@@ -837,9 +837,28 @@ class BibleMediaItem(MediaManagerItem):
second_permissions = self.plugin.manager.get_meta_data(
second_bible, u'Permissions').value
items = []
+ language_selection = self.plugin.manager.get_meta_data(
+ bible, u'Bookname language')
+ if language_selection:
+ language_selection = int(language_selection.value)
+ if language_selection == None or language_selection == -1:
+ language_selection = QtCore.QSettings().value(
+ self.settingsSection + u'/bookname language',
+ QtCore.QVariant(0)).toInt()[0]
for count, verse in enumerate(search_results):
+ if language_selection == LanguageSelection.Bible:
+ book = verse.book.name
+ elif language_selection == LanguageSelection.Application:
+ booknames = BibleStrings().Booknames
+ data = BiblesResourcesDB.get_book_by_id(
+ verse.book.book_reference_id)
+ book = unicode(booknames[data[u'abbreviation']])
+ elif language_selection == LanguageSelection.English:
+ data = BiblesResourcesDB.get_book_by_id(
+ verse.book.book_reference_id)
+ book = data[u'name']
data = {
- 'book': QtCore.QVariant(verse.book.name),
+ 'book': QtCore.QVariant(book),
'chapter': QtCore.QVariant(verse.chapter),
'verse': QtCore.QVariant(verse.verse),
'bible': QtCore.QVariant(bible),
@@ -861,11 +880,11 @@ class BibleMediaItem(MediaManagerItem):
log.exception(u'The second_search_results does not have as '
'many verses as the search_results.')
break
- bible_text = u'%s %d%s%d (%s, %s)' % (verse.book.name,
+ bible_text = u'%s %d%s%d (%s, %s)' % (book,
verse.chapter, verse_separator, verse.verse, version,
second_version)
else:
- bible_text = u'%s %d%s%d (%s)' % (verse.book.name,
+ bible_text = u'%s %d%s%d (%s)' % (book,
verse.chapter, verse_separator, verse.verse, version)
bible_verse = QtGui.QListWidgetItem(bible_text)
bible_verse.setData(QtCore.Qt.UserRole, QtCore.QVariant(data))
From 0b246275b26cf54b13598164a3853fb9fccd3ae6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Armin=20K=C3=B6hler?=
Date: Tue, 3 Apr 2012 21:51:20 +0200
Subject: [PATCH 06/19] adapt to run with HEAD r1934
---
openlp/plugins/bibles/forms/editbibledialog.py | 5 +++--
openlp/plugins/bibles/lib/manager.py | 2 --
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/openlp/plugins/bibles/forms/editbibledialog.py b/openlp/plugins/bibles/forms/editbibledialog.py
index e73af55a1..51e7a0ab7 100644
--- a/openlp/plugins/bibles/forms/editbibledialog.py
+++ b/openlp/plugins/bibles/forms/editbibledialog.py
@@ -28,7 +28,7 @@
from PyQt4 import QtCore, QtGui
from openlp.core.lib import build_icon, translate
-from openlp.core.lib.ui import create_accept_reject_button_box
+from openlp.core.lib.ui import create_button_box
from openlp.plugins.bibles.lib import LanguageSelection, BibleStrings
from openlp.plugins.bibles.lib.db import BiblesResourcesDB
@@ -133,7 +133,8 @@ class Ui_EditBibleDialog(object):
self.bibleTabWidget.addTab(self.bookNameTab, u'')
# Last few bits
self.dialogLayout.addWidget(self.bibleTabWidget)
- self.buttonBox = create_accept_reject_button_box(editBibleDialog)
+ self.buttonBox = create_button_box(editBibleDialog, u'buttonBox',
+ [u'cancel', u'save'])
self.dialogLayout.addWidget(self.buttonBox)
self.retranslateUi(editBibleDialog)
QtCore.QMetaObject.connectSlotsByName(editBibleDialog)
diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py
index 4879e3434..25ca8cd8e 100644
--- a/openlp/plugins/bibles/lib/manager.py
+++ b/openlp/plugins/bibles/lib/manager.py
@@ -31,8 +31,6 @@ import os
from PyQt4 import QtCore
from openlp.core.lib import Receiver, SettingsManager, translate
-from openlp.core.lib.ui import critical_error_message_box, \
- create_accept_reject_button_box
from openlp.core.utils import AppLocation, delete_file
from openlp.plugins.bibles.lib import parse_reference, \
get_reference_separator, LanguageSelection
From 5f88f49754bc709e0e8bed1fc029bf6acd46fd8f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Armin=20K=C3=B6hler?=
Date: Wed, 4 Apr 2012 21:34:14 +0200
Subject: [PATCH 07/19] some fixes
---
.../plugins/bibles/forms/editbibledialog.py | 59 +++++++------------
openlp/plugins/bibles/forms/editbibleform.py | 33 +++++------
openlp/plugins/bibles/lib/__init__.py | 2 +-
openlp/plugins/bibles/lib/db.py | 4 +-
openlp/plugins/bibles/lib/manager.py | 2 +-
openlp/plugins/bibles/lib/mediaitem.py | 19 +++---
6 files changed, 50 insertions(+), 69 deletions(-)
diff --git a/openlp/plugins/bibles/forms/editbibledialog.py b/openlp/plugins/bibles/forms/editbibledialog.py
index 51e7a0ab7..febfa820d 100644
--- a/openlp/plugins/bibles/forms/editbibledialog.py
+++ b/openlp/plugins/bibles/forms/editbibledialog.py
@@ -53,40 +53,29 @@ class Ui_EditBibleDialog(object):
self.metaTabLayout.setObjectName(u'metaTabLayout')
self.versionNameLabel = QtGui.QLabel(self.metaTab)
self.versionNameLabel.setObjectName(u'versionNameLabel')
- self.metaTabLayout.setWidget(0, QtGui.QFormLayout.LabelRole,
- self.versionNameLabel)
self.versionNameEdit = QtGui.QLineEdit(self.metaTab)
self.versionNameEdit.setObjectName(u'versionNameEdit')
self.versionNameLabel.setBuddy(self.versionNameEdit)
- self.metaTabLayout.setWidget(0, QtGui.QFormLayout.FieldRole,
- self.versionNameEdit)
+ self.metaTabLayout.addRow(self.versionNameLabel, self.versionNameEdit)
self.copyrightLabel = QtGui.QLabel(self.metaTab)
self.copyrightLabel.setObjectName(u'copyrightLabel')
- self.metaTabLayout.setWidget(1, QtGui.QFormLayout.LabelRole,
- self.copyrightLabel)
self.copyrightEdit = QtGui.QLineEdit(self.metaTab)
self.copyrightEdit.setObjectName(u'copyrightEdit')
self.copyrightLabel.setBuddy(self.copyrightEdit)
- self.metaTabLayout.setWidget(1, QtGui.QFormLayout.FieldRole,
- self.copyrightEdit)
+ self.metaTabLayout.addRow(self.copyrightLabel, self.copyrightEdit)
self.permissionsLabel = QtGui.QLabel(self.metaTab)
self.permissionsLabel.setObjectName(u'permissionsLabel')
- self.metaTabLayout.setWidget(2, QtGui.QFormLayout.LabelRole,
- self.permissionsLabel)
self.permissionsEdit = QtGui.QLineEdit(self.metaTab)
self.permissionsEdit.setObjectName(u'permissionsEdit')
self.permissionsLabel.setBuddy(self.permissionsEdit)
- self.metaTabLayout.setWidget(2, QtGui.QFormLayout.FieldRole,
- self.permissionsEdit)
+ self.metaTabLayout.addRow(self.permissionsLabel, self.permissionsEdit)
self.languageSelectionLabel = QtGui.QLabel(self.metaTab)
self.languageSelectionLabel.setObjectName(u'languageSelectionLabel')
- self.metaTabLayout.setWidget(3, QtGui.QFormLayout.LabelRole,
- self.languageSelectionLabel)
self.languageSelectionComboBox = QtGui.QComboBox(self.metaTab)
self.languageSelectionComboBox.setObjectName(
u'languageSelectionComboBox')
self.languageSelectionComboBox.addItems([u'', u'', u'', u''])
- self.metaTabLayout.setWidget(3, QtGui.QFormLayout.FieldRole,
+ self.metaTabLayout.addRow(self.languageSelectionLabel,
self.languageSelectionComboBox)
self.bibleTabWidget.addTab(self.metaTab, u'')
# Book name tab
@@ -102,34 +91,29 @@ class Ui_EditBibleDialog(object):
self.scrollArea.setObjectName(u'scrollArea')
self.scrollArea.setHorizontalScrollBarPolicy(
QtCore.Qt.ScrollBarAlwaysOff)
- self.bookNameGroupBox = QtGui.QWidget(self.scrollArea)
- self.bookNameGroupBox.setObjectName(u'bookNameGroupBox')
- self.bookNameGroupBoxLayout = QtGui.QFormLayout(self.bookNameGroupBox)
- self.bookNameGroupBoxLayout.setObjectName(u'bookNameGroupBoxLayout')
+ self.bookNameWidget = QtGui.QWidget(self.scrollArea)
+ self.bookNameWidget.setObjectName(u'bookNameWidget')
+ self.bookNameWidgetLayout = QtGui.QFormLayout(self.bookNameWidget)
+ self.bookNameWidgetLayout.setObjectName(u'bookNameWidgetLayout')
self.bookNameLabel = {}
self.bookNameEdit= {}
x = 0
for book in BiblesResourcesDB.get_books():
self.bookNameLabel[book[u'abbreviation']] = QtGui.QLabel(
- self.bookNameGroupBox)
+ self.bookNameWidget)
self.bookNameLabel[book[u'abbreviation']].setObjectName(
u'bookNameLabel[%s]' % book[u'abbreviation'])
- self.bookNameGroupBoxLayout.setWidget(x,
- QtGui.QFormLayout.LabelRole,
- self.bookNameLabel[book[u'abbreviation']])
self.bookNameEdit[book[u'abbreviation']] = QtGui.QLineEdit(
- self.bookNameGroupBox)
+ self.bookNameWidget)
self.bookNameEdit[book[u'abbreviation']].setObjectName(
u'bookNameEdit[%s]' % book[u'abbreviation'])
- self.bookNameGroupBoxLayout.setWidget(x,
- QtGui.QFormLayout.FieldRole,
+ self.bookNameWidgetLayout.addRow(
+ self.bookNameLabel[book[u'abbreviation']],
self.bookNameEdit[book[u'abbreviation']])
- x = x+1
- self.scrollArea.setWidget(self.bookNameGroupBox)
+ x = x + 1
+ self.scrollArea.setWidget(self.bookNameWidget)
self.bookNameTabLayout.addWidget(self.scrollArea)
- self.spacer = QtGui.QSpacerItem(20, 5, QtGui.QSizePolicy.Minimum,
- QtGui.QSizePolicy.Expanding)
- self.bookNameTabLayout.addItem(self.spacer)
+ self.bookNameTabLayout.addStretch()
self.bibleTabWidget.addTab(self.bookNameTab, u'')
# Last few bits
self.dialogLayout.addWidget(self.bibleTabWidget)
@@ -156,15 +140,16 @@ class Ui_EditBibleDialog(object):
self.bibleTabWidget.indexOf(self.bookNameTab),
translate('SongsPlugin.EditBibleForm', 'Custom Book Names'))
self.languageSelectionLabel.setText(
- translate('BiblesPlugin.EditBibleForm', 'Bookname language:'))
+ translate('BiblesPlugin.EditBibleForm', 'Book name language:'))
self.languageSelectionComboBox.setItemText(0,
translate('BiblesPlugin.EditBibleForm', 'General Settings'))
- self.languageSelectionComboBox.setItemText(LanguageSelection.Bible+1,
- translate('BiblesPlugin.EditBibleForm', 'Bible language'))
+ self.languageSelectionComboBox.setItemText(LanguageSelection.Bible + 1,
+ translate('BiblesPlugin.EditBibleForm', 'Bible Language'))
self.languageSelectionComboBox.setItemText(
- LanguageSelection.Application+1,
- translate('BiblesPlugin.EditBibleForm', 'Application language'))
- self.languageSelectionComboBox.setItemText(LanguageSelection.English+1,
+ LanguageSelection.Application + 1,
+ translate('BiblesPlugin.EditBibleForm', 'Application Language'))
+ self.languageSelectionComboBox.setItemText(
+ LanguageSelection.English + 1,
translate('BiblesPlugin.EditBibleForm', 'English'))
self.languageSelectionComboBox.setToolTip(
translate('BiblesPlugin.EditBibleForm', 'Multiple options:\n'
diff --git a/openlp/plugins/bibles/forms/editbibleform.py b/openlp/plugins/bibles/forms/editbibleform.py
index 5ababcaa0..cb825db04 100644
--- a/openlp/plugins/bibles/forms/editbibleform.py
+++ b/openlp/plugins/bibles/forms/editbibleform.py
@@ -52,8 +52,6 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
self.mediaitem = mediaitem
self.validate_error = []
self.booknames = BibleStrings().Booknames
- # can this be automated?
- self.width = 400
self.setupUi(self)
self.manager = manager
@@ -76,7 +74,7 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
self.bible, u'Bookname language')
if self.bookname_language:
self.languageSelectionComboBox.setCurrentIndex(
- int(self.bookname_language.value)+1)
+ int(self.bookname_language.value) + 1)
self.books = {}
self.webbible = self.manager.get_meta_data(self.bible,
u'download source')
@@ -97,10 +95,10 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
self.bookNameEdit[book[u'abbreviation']].setText(
self.books[book[u'abbreviation']].name)
else:
- self.bookNameGroupBoxLayout.removeWidget(
+ self.bookNameWidgetLayout.removeWidget(
self.bookNameLabel[book[u'abbreviation']])
self.bookNameLabel[book[u'abbreviation']].setParent(None)
- self.bookNameGroupBoxLayout.removeWidget(
+ self.bookNameWidgetLayout.removeWidget(
self.bookNameEdit[book[u'abbreviation']])
self.bookNameEdit[book[u'abbreviation']].setParent(None)
@@ -122,9 +120,9 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
self.copyright = unicode(self.copyrightEdit.text())
self.permissions = unicode(self.permissionsEdit.text())
self.bookname_language = \
- self.languageSelectionComboBox.currentIndex()-1
+ self.languageSelectionComboBox.currentIndex() - 1
for error in self.validate_error:
- self.changeBackgroundColor(error, 'white')
+ self.changeBackgroundColor(error)
if not self.validateMeta():
save = False
if not self.webbible and save:
@@ -156,7 +154,7 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
Validate the Meta before saving.
"""
if not self.version:
- self.changeBackgroundColor(self.versionNameEdit, 'red')
+ self.changeBackgroundColor(self.versionNameEdit, u'red')
self.validate_error = [self.versionNameEdit]
self.versionNameEdit.setFocus()
critical_error_message_box(UiStrings().EmptyField,
@@ -164,7 +162,7 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
'You need to specify a version name for your Bible.'))
return False
elif not self.copyright:
- self.changeBackgroundColor(self.copyrightEdit, 'red')
+ self.changeBackgroundColor(self.copyrightEdit, u'red')
self.validate_error = [self.copyrightEdit]
self.copyrightEdit.setFocus()
critical_error_message_box(UiStrings().EmptyField,
@@ -175,7 +173,7 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
elif self.manager.exists(self.version) and \
self.manager.get_meta_data(self.bible, u'Version').value != \
self.version:
- self.changeBackgroundColor(self.versionNameEdit, 'red')
+ self.changeBackgroundColor(self.versionNameEdit, u'red')
self.validate_error = [self.versionNameEdit]
self.versionNameEdit.setFocus()
critical_error_message_box(
@@ -192,7 +190,7 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
"""
book_regex = re.compile(u'[\d]*[^\d]+$')
if not new_bookname:
- self.changeBackgroundColor(self.bookNameEdit[abbreviation], 'red')
+ self.changeBackgroundColor(self.bookNameEdit[abbreviation], u'red')
self.validate_error = [self.bookNameEdit[abbreviation]]
self.bookNameEdit[abbreviation].setFocus()
critical_error_message_box(UiStrings().EmptyField,
@@ -201,7 +199,7 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
self.booknames[abbreviation])
return False
elif not book_regex.match(new_bookname):
- self.changeBackgroundColor(self.bookNameEdit[abbreviation], 'red')
+ self.changeBackgroundColor(self.bookNameEdit[abbreviation], u'red')
self.validate_error = [self.bookNameEdit[abbreviation]]
self.bookNameEdit[abbreviation].setFocus()
critical_error_message_box(UiStrings().EmptyField,
@@ -216,9 +214,9 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
continue
if unicode(self.bookNameEdit[abbr].text()) == new_bookname:
self.changeBackgroundColor(self.bookNameEdit[abbreviation],
- 'red')
+ u'red')
self.bookNameEdit[abbreviation].setFocus()
- self.changeBackgroundColor(self.bookNameEdit[abbr], 'red')
+ self.changeBackgroundColor(self.bookNameEdit[abbr], u'red')
self.validate_error = [self.bookNameEdit[abbr],
self.bookNameEdit[abbreviation]]
critical_error_message_box(
@@ -230,10 +228,11 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
return False
return True
- def changeBackgroundColor(self, lineedit, color):
+ def changeBackgroundColor(self, lineedit, color=None):
"""
Change the Background Color of the given LineEdit
"""
- pal = QtGui.QPalette(lineedit.palette())
- pal.setColor(QtGui.QPalette.Base,QtGui.QColor(color))
+ pal = QtGui.QPalette(self.palette())
+ if color:
+ pal.setColor(QtGui.QPalette.Base, QtGui.QColor(color))
lineedit.setPalette(pal)
diff --git a/openlp/plugins/bibles/lib/__init__.py b/openlp/plugins/bibles/lib/__init__.py
index 8d51afdee..0b232959b 100644
--- a/openlp/plugins/bibles/lib/__init__.py
+++ b/openlp/plugins/bibles/lib/__init__.py
@@ -386,7 +386,7 @@ def parse_reference(reference, bible, language_selection, book_ref_id=False):
if bible.get_book_by_book_ref_id(value[u'id']):
book_ref_id = value[u'id']
break
- elif bible.get_book_by_book_ref_id(book_ref_id):
+ elif not bible.get_book_by_book_ref_id(book_ref_id):
book_ref_id = False
ranges = match.group(u'ranges')
range_list = get_reference_match(u'range_separator').split(ranges)
diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py
index 704e0da4b..15f4147e3 100644
--- a/openlp/plugins/bibles/lib/db.py
+++ b/openlp/plugins/bibles/lib/db.py
@@ -213,9 +213,7 @@ class BibleDB(QtCore.QObject, Manager):
The book object
"""
log.debug(u'BibleDB.update_book("%s")', book.name)
- if self.save_object(book):
- return True
- return False
+ return self.save_object(book)
def delete_book(self, db_book):
"""
diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py
index 25ca8cd8e..6dfa56fd2 100644
--- a/openlp/plugins/bibles/lib/manager.py
+++ b/openlp/plugins/bibles/lib/manager.py
@@ -328,7 +328,7 @@ class BibleManager(object):
language_selection = self.get_meta_data(bible, u'Bookname language')
if language_selection:
language_selection = int(language_selection.value)
- if language_selection == None or language_selection == -1:
+ if language_selection is None or language_selection == -1:
language_selection = QtCore.QSettings().value(
self.settingsSection + u'/bookname language',
QtCore.QVariant(0)).toInt()[0]
diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py
index 5c38b5f4f..74a8b7304 100644
--- a/openlp/plugins/bibles/lib/mediaitem.py
+++ b/openlp/plugins/bibles/lib/mediaitem.py
@@ -435,7 +435,7 @@ class BibleMediaItem(MediaManagerItem):
bible, u'Bookname language')
if language_selection:
language_selection = int(language_selection.value)
- if language_selection == None or language_selection == -1:
+ if language_selection is None or language_selection == -1:
language_selection = QtCore.QSettings().value(
self.settingsSection + u'/bookname language',
QtCore.QVariant(0)).toInt()[0]
@@ -514,7 +514,7 @@ class BibleMediaItem(MediaManagerItem):
bible, u'Bookname language')
if language_selection:
language_selection = int(language_selection.value)
- if language_selection == None or language_selection == -1:
+ if language_selection is None or language_selection == -1:
language_selection = QtCore.QSettings().value(
self.settingsSection + u'/bookname language',
QtCore.QVariant(0)).toInt()[0]
@@ -554,7 +554,7 @@ class BibleMediaItem(MediaManagerItem):
bible = unicode(self.quickVersionComboBox.currentText())
elif self.advancedTab.isVisible():
bible = unicode(self.advancedVersionComboBox.currentText())
- if bible != u'':
+ if bible:
self.editBibleForm = EditBibleForm(self, self.plugin.formparent,
self.plugin.manager)
self.editBibleForm.loadBible(bible)
@@ -566,7 +566,7 @@ class BibleMediaItem(MediaManagerItem):
bible = unicode(self.quickVersionComboBox.currentText())
elif self.advancedTab.isVisible():
bible = unicode(self.advancedVersionComboBox.currentText())
- if bible != u'':
+ if bible:
if QtGui.QMessageBox.question(self, UiStrings().ConfirmDelete,
unicode(translate('BiblesPlugin.MediaItem',
'Are you sure you want to delete "%s"?')) % bible,
@@ -843,7 +843,7 @@ class BibleMediaItem(MediaManagerItem):
bible, u'Bookname language')
if language_selection:
language_selection = int(language_selection.value)
- if language_selection == None or language_selection == -1:
+ if language_selection is None or language_selection == -1:
language_selection = QtCore.QSettings().value(
self.settingsSection + u'/bookname language',
QtCore.QVariant(0)).toInt()[0]
@@ -882,12 +882,11 @@ class BibleMediaItem(MediaManagerItem):
log.exception(u'The second_search_results does not have as '
'many verses as the search_results.')
break
- bible_text = u'%s %d%s%d (%s, %s)' % (book,
- verse.chapter, verse_separator, verse.verse, version,
- second_version)
+ bible_text = u'%s %d%s%d (%s, %s)' % (book, verse.chapter,
+ verse_separator, verse.verse, version, second_version)
else:
- bible_text = u'%s %d%s%d (%s)' % (book,
- verse.chapter, verse_separator, verse.verse, version)
+ bible_text = u'%s %d%s%d (%s)' % (book, verse.chapter,
+ verse_separator, verse.verse, version)
bible_verse = QtGui.QListWidgetItem(bible_text)
bible_verse.setData(QtCore.Qt.UserRole, QtCore.QVariant(data))
items.append(bible_verse)
From 06033df8adf32a72d0ef33173afa2bdf47ce47ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Armin=20K=C3=B6hler?=
Date: Thu, 5 Apr 2012 20:31:15 +0200
Subject: [PATCH 08/19] adapt editbibleform - some fixes
---
.../plugins/bibles/forms/editbibledialog.py | 76 ++++++++++++-------
openlp/plugins/bibles/forms/editbibleform.py | 5 +-
openlp/plugins/bibles/lib/biblestab.py | 7 +-
3 files changed, 53 insertions(+), 35 deletions(-)
diff --git a/openlp/plugins/bibles/forms/editbibledialog.py b/openlp/plugins/bibles/forms/editbibledialog.py
index febfa820d..c3db88e91 100644
--- a/openlp/plugins/bibles/forms/editbibledialog.py
+++ b/openlp/plugins/bibles/forms/editbibledialog.py
@@ -49,34 +49,52 @@ class Ui_EditBibleDialog(object):
# Meta tab
self.metaTab = QtGui.QWidget()
self.metaTab.setObjectName(u'metaTab')
- self.metaTabLayout = QtGui.QFormLayout(self.metaTab)
+ self.metaTabLayout = QtGui.QVBoxLayout(self.metaTab)
self.metaTabLayout.setObjectName(u'metaTabLayout')
- self.versionNameLabel = QtGui.QLabel(self.metaTab)
+ self.licenseDetailsGroupBox = QtGui.QGroupBox(self.metaTab)
+ self.licenseDetailsGroupBox.setObjectName(u'licenseDetailsGroupBox')
+ self.licenseDetailsLayout = QtGui.QFormLayout(
+ self.licenseDetailsGroupBox)
+ self.licenseDetailsLayout.setObjectName(u'licenseDetailsLayout')
+ self.versionNameLabel = QtGui.QLabel(self.licenseDetailsGroupBox)
self.versionNameLabel.setObjectName(u'versionNameLabel')
- self.versionNameEdit = QtGui.QLineEdit(self.metaTab)
+ self.versionNameEdit = QtGui.QLineEdit(self.licenseDetailsGroupBox)
self.versionNameEdit.setObjectName(u'versionNameEdit')
self.versionNameLabel.setBuddy(self.versionNameEdit)
- self.metaTabLayout.addRow(self.versionNameLabel, self.versionNameEdit)
- self.copyrightLabel = QtGui.QLabel(self.metaTab)
+ self.licenseDetailsLayout.addRow(self.versionNameLabel,
+ self.versionNameEdit)
+ self.copyrightLabel = QtGui.QLabel(self.licenseDetailsGroupBox)
self.copyrightLabel.setObjectName(u'copyrightLabel')
- self.copyrightEdit = QtGui.QLineEdit(self.metaTab)
+ self.copyrightEdit = QtGui.QLineEdit(self.licenseDetailsGroupBox)
self.copyrightEdit.setObjectName(u'copyrightEdit')
self.copyrightLabel.setBuddy(self.copyrightEdit)
- self.metaTabLayout.addRow(self.copyrightLabel, self.copyrightEdit)
- self.permissionsLabel = QtGui.QLabel(self.metaTab)
+ self.licenseDetailsLayout.addRow(self.copyrightLabel,
+ self.copyrightEdit)
+ self.permissionsLabel = QtGui.QLabel(self.licenseDetailsGroupBox)
self.permissionsLabel.setObjectName(u'permissionsLabel')
- self.permissionsEdit = QtGui.QLineEdit(self.metaTab)
+ self.permissionsEdit = QtGui.QLineEdit(self.licenseDetailsGroupBox)
self.permissionsEdit.setObjectName(u'permissionsEdit')
self.permissionsLabel.setBuddy(self.permissionsEdit)
- self.metaTabLayout.addRow(self.permissionsLabel, self.permissionsEdit)
- self.languageSelectionLabel = QtGui.QLabel(self.metaTab)
+ self.licenseDetailsLayout.addRow(self.permissionsLabel,
+ self.permissionsEdit)
+ self.metaTabLayout.addWidget(self.licenseDetailsGroupBox)
+ self.languageSelectionGroupBox = QtGui.QGroupBox(self.metaTab)
+ self.languageSelectionGroupBox.setObjectName(
+ u'languageSelectionGroupBox')
+ self.languageSelectionLayout = QtGui.QVBoxLayout(
+ self.languageSelectionGroupBox)
+ self.languageSelectionLabel = QtGui.QLabel(
+ self.languageSelectionGroupBox)
self.languageSelectionLabel.setObjectName(u'languageSelectionLabel')
- self.languageSelectionComboBox = QtGui.QComboBox(self.metaTab)
+ self.languageSelectionComboBox = QtGui.QComboBox(
+ self.languageSelectionGroupBox)
self.languageSelectionComboBox.setObjectName(
u'languageSelectionComboBox')
self.languageSelectionComboBox.addItems([u'', u'', u'', u''])
- self.metaTabLayout.addRow(self.languageSelectionLabel,
- self.languageSelectionComboBox)
+ self.languageSelectionLayout.addWidget(self.languageSelectionLabel)
+ self.languageSelectionLayout.addWidget(self.languageSelectionComboBox)
+ self.metaTabLayout.addWidget(self.languageSelectionGroupBox)
+ self.metaTabLayout.addStretch()
self.bibleTabWidget.addTab(self.metaTab, u'')
# Book name tab
self.bookNameTab = QtGui.QWidget()
@@ -97,7 +115,6 @@ class Ui_EditBibleDialog(object):
self.bookNameWidgetLayout.setObjectName(u'bookNameWidgetLayout')
self.bookNameLabel = {}
self.bookNameEdit= {}
- x = 0
for book in BiblesResourcesDB.get_books():
self.bookNameLabel[book[u'abbreviation']] = QtGui.QLabel(
self.bookNameWidget)
@@ -110,7 +127,6 @@ class Ui_EditBibleDialog(object):
self.bookNameWidgetLayout.addRow(
self.bookNameLabel[book[u'abbreviation']],
self.bookNameEdit[book[u'abbreviation']])
- x = x + 1
self.scrollArea.setWidget(self.bookNameWidget)
self.bookNameTabLayout.addWidget(self.scrollArea)
self.bookNameTabLayout.addStretch()
@@ -126,23 +142,27 @@ class Ui_EditBibleDialog(object):
def retranslateUi(self, editBibleDialog):
self.booknames = BibleStrings().Booknames
editBibleDialog.setWindowTitle(
- translate('BiblesPlugin.EditBibleForm', 'Song Editor'))
+ translate('BiblesPlugin.EditBibleForm', 'Bible Editor'))
+ # Meta tab
self.bibleTabWidget.setTabText(
self.bibleTabWidget.indexOf(self.metaTab),
- translate('SongsPlugin.EditBibleForm', 'License Details'))
+ translate('SongsPlugin.EditBibleForm', 'Meta Data'))
+ self.licenseDetailsGroupBox.setTitle(
+ translate('BiblesPlugin.EditBibleForm', 'License Details'))
self.versionNameLabel.setText(
translate('BiblesPlugin.EditBibleForm', 'Version name:'))
self.copyrightLabel.setText(
translate('BiblesPlugin.EditBibleForm', 'Copyright:'))
self.permissionsLabel.setText(
translate('BiblesPlugin.EditBibleForm', 'Permissions:'))
- self.bibleTabWidget.setTabText(
- self.bibleTabWidget.indexOf(self.bookNameTab),
- translate('SongsPlugin.EditBibleForm', 'Custom Book Names'))
+ self.languageSelectionGroupBox.setTitle(translate(
+ 'BiblesPlugin.EditBibleForm', 'Default Bible Language'))
self.languageSelectionLabel.setText(
- translate('BiblesPlugin.EditBibleForm', 'Book name language:'))
+ translate('BiblesPlugin.EditBibleForm',
+ 'Book name language in search field, search results and on '
+ 'display:'))
self.languageSelectionComboBox.setItemText(0,
- translate('BiblesPlugin.EditBibleForm', 'General Settings'))
+ translate('BiblesPlugin.EditBibleForm', 'Global Settings'))
self.languageSelectionComboBox.setItemText(LanguageSelection.Bible + 1,
translate('BiblesPlugin.EditBibleForm', 'Bible Language'))
self.languageSelectionComboBox.setItemText(
@@ -151,12 +171,10 @@ class Ui_EditBibleDialog(object):
self.languageSelectionComboBox.setItemText(
LanguageSelection.English + 1,
translate('BiblesPlugin.EditBibleForm', 'English'))
- self.languageSelectionComboBox.setToolTip(
- translate('BiblesPlugin.EditBibleForm', 'Multiple options:\n'
- 'General Settings - the option choosen in settings section\n'
- 'Bible language - the language in which the Bible book names '
- 'were imported\nApplication language - the language you have '
- 'chosen for OpenLP\nEnglish - always use English book names'))
+ # Book name tab
+ self.bibleTabWidget.setTabText(
+ self.bibleTabWidget.indexOf(self.bookNameTab),
+ translate('SongsPlugin.EditBibleForm', 'Custom Book Names'))
for book in BiblesResourcesDB.get_books():
self.bookNameLabel[book[u'abbreviation']].setText(
u'%s:' % unicode(self.booknames[book[u'abbreviation']]))
diff --git a/openlp/plugins/bibles/forms/editbibleform.py b/openlp/plugins/bibles/forms/editbibleform.py
index cb825db04..4fc73e607 100644
--- a/openlp/plugins/bibles/forms/editbibleform.py
+++ b/openlp/plugins/bibles/forms/editbibleform.py
@@ -82,12 +82,11 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
self.bookNameNotice.setText(translate('BiblesPlugin.EditBibleForm',
'This is a webbible.\nIt is not possible to customize the Book '
'Names.'))
- self.bookNameTabLayout.removeWidget(self.scrollArea)
- self.scrollArea.setParent(None)
+ self.scrollArea.hide()
else:
self.bookNameNotice.setText(translate('BiblesPlugin.EditBibleForm',
'To use the customized Book Names, choose the option "Bible '
- 'language"\nin general settings or explicit for this Bible.'))
+ 'language"\nin global settings or explicit for this Bible.'))
for book in BiblesResourcesDB.get_books():
self.books[book[u'abbreviation']] = self.manager.get_book_by_id(
self.bible, book[u'id'])
diff --git a/openlp/plugins/bibles/lib/biblestab.py b/openlp/plugins/bibles/lib/biblestab.py
index 353dc265d..751c23264 100644
--- a/openlp/plugins/bibles/lib/biblestab.py
+++ b/openlp/plugins/bibles/lib/biblestab.py
@@ -276,10 +276,11 @@ class BiblesTab(SettingsTab):
'end marks may be defined.\nThey have to be separated by a '
'vertical bar "|".\nPlease clear this edit line to use the '
'default value.'))
- self.languageSelectionGroupBox.setTitle(translate('BiblesPlugin.BiblesTab',
- 'Default Search Field Language'))
+ self.languageSelectionGroupBox.setTitle(translate(
+ 'BiblesPlugin.BiblesTab', 'Default Bible Language'))
self.languageSelectionLabel.setText(translate('BiblesPlugin.BiblesTab',
- 'Book name language in search field:'))
+ 'Book name language in search field,\nsearch results and on '
+ 'display:'))
self.languageSelectionComboBox.setItemText(LanguageSelection.Bible,
translate('BiblesPlugin.BiblesTab', 'Bible language'))
self.languageSelectionComboBox.setItemText(
From e310c20cccde70ee87bd9b4fb5a9c439b6e55e82 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Armin=20K=C3=B6hler?=
Date: Fri, 6 Apr 2012 20:14:38 +0200
Subject: [PATCH 09/19] fixes
---
.../plugins/bibles/forms/editbibledialog.py | 9 ++-
openlp/plugins/bibles/forms/editbibleform.py | 81 ++++++-------------
2 files changed, 31 insertions(+), 59 deletions(-)
diff --git a/openlp/plugins/bibles/forms/editbibledialog.py b/openlp/plugins/bibles/forms/editbibledialog.py
index c3db88e91..83e8d39d6 100644
--- a/openlp/plugins/bibles/forms/editbibledialog.py
+++ b/openlp/plugins/bibles/forms/editbibledialog.py
@@ -36,7 +36,7 @@ from openlp.plugins.bibles.lib.db import BiblesResourcesDB
class Ui_EditBibleDialog(object):
def setupUi(self, editBibleDialog):
editBibleDialog.setObjectName(u'editBibleDialog')
- editBibleDialog.resize(600, 400)
+ editBibleDialog.resize(520, 400)
editBibleDialog.setWindowIcon(
build_icon(u':/icon/openlp-logo-16x16.png'))
editBibleDialog.setModal(True)
@@ -103,6 +103,7 @@ class Ui_EditBibleDialog(object):
self.bookNameTabLayout.setObjectName(u'bookNameTabLayout')
self.bookNameNotice = QtGui.QLabel(self.bookNameTab)
self.bookNameNotice.setObjectName(u'bookNameNotice')
+ self.bookNameNotice.setWordWrap(True)
self.bookNameTabLayout.addWidget(self.bookNameNotice)
self.scrollArea = QtGui.QScrollArea(self.bookNameTab)
self.scrollArea.setWidgetResizable(True)
@@ -162,12 +163,12 @@ class Ui_EditBibleDialog(object):
'Book name language in search field, search results and on '
'display:'))
self.languageSelectionComboBox.setItemText(0,
- translate('BiblesPlugin.EditBibleForm', 'Global Settings'))
+ translate('BiblesPlugin.EditBibleForm', 'Global settings'))
self.languageSelectionComboBox.setItemText(LanguageSelection.Bible + 1,
- translate('BiblesPlugin.EditBibleForm', 'Bible Language'))
+ translate('BiblesPlugin.EditBibleForm', 'Bible language'))
self.languageSelectionComboBox.setItemText(
LanguageSelection.Application + 1,
- translate('BiblesPlugin.EditBibleForm', 'Application Language'))
+ translate('BiblesPlugin.EditBibleForm', 'Application language'))
self.languageSelectionComboBox.setItemText(
LanguageSelection.English + 1,
translate('BiblesPlugin.EditBibleForm', 'English'))
diff --git a/openlp/plugins/bibles/forms/editbibleform.py b/openlp/plugins/bibles/forms/editbibleform.py
index 4fc73e607..9300fa079 100644
--- a/openlp/plugins/bibles/forms/editbibleform.py
+++ b/openlp/plugins/bibles/forms/editbibleform.py
@@ -50,7 +50,6 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
"""
QtGui.QDialog.__init__(self, parent)
self.mediaitem = mediaitem
- self.validate_error = []
self.booknames = BibleStrings().Booknames
self.setupUi(self)
self.manager = manager
@@ -80,13 +79,14 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
u'download source')
if self.webbible:
self.bookNameNotice.setText(translate('BiblesPlugin.EditBibleForm',
- 'This is a webbible.\nIt is not possible to customize the Book '
- 'Names.'))
+ 'This is a Web Download Bible.\nIt is not possible to '
+ 'customize the Book Names.'))
self.scrollArea.hide()
else:
self.bookNameNotice.setText(translate('BiblesPlugin.EditBibleForm',
- 'To use the customized Book Names, choose the option "Bible '
- 'language"\nin global settings or explicit for this Bible.'))
+ 'To use the customized book names, "Bible language" must be '
+ 'selected on the Meta Data tab or, if "Global settings" is '
+ 'selected, on the Bible page in Configure OpenLP.'))
for book in BiblesResourcesDB.get_books():
self.books[book[u'abbreviation']] = self.manager.get_book_by_id(
self.bible, book[u'id'])
@@ -114,55 +114,46 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
Exit Dialog and save data
"""
log.debug(u'BibleEditForm.accept')
- save = True
self.version = unicode(self.versionNameEdit.text())
self.copyright = unicode(self.copyrightEdit.text())
self.permissions = unicode(self.permissionsEdit.text())
self.bookname_language = \
self.languageSelectionComboBox.currentIndex() - 1
- for error in self.validate_error:
- self.changeBackgroundColor(error)
if not self.validateMeta():
- save = False
- if not self.webbible and save:
+ return
+ if not self.webbible:
custom_names = {}
for abbr, book in self.books.iteritems():
if book:
custom_names[abbr] = unicode(self.bookNameEdit[abbr].text())
if book.name != custom_names[abbr]:
if not self.validateBook(custom_names[abbr], abbr):
- save = False
- break
- if save:
- Receiver.send_message(u'openlp_process_events')
- Receiver.send_message(u'cursor_busy')
- self.manager.save_meta_data(self.bible, self.version,
- self.copyright, self.permissions, self.bookname_language)
- if not self.webbible:
- for abbr, book in self.books.iteritems():
- if book:
- if book.name != custom_names[abbr]:
- book.name = custom_names[abbr]
- self.manager.update_book(self.bible, book)
- self.bible = None
- Receiver.send_message(u'cursor_normal')
- QtGui.QDialog.accept(self)
+ return
+ Receiver.send_message(u'openlp_process_events')
+ Receiver.send_message(u'cursor_busy')
+ self.manager.save_meta_data(self.bible, self.version,
+ self.copyright, self.permissions, self.bookname_language)
+ if not self.webbible:
+ for abbr, book in self.books.iteritems():
+ if book:
+ if book.name != custom_names[abbr]:
+ book.name = custom_names[abbr]
+ self.manager.update_book(self.bible, book)
+ self.bible = None
+ Receiver.send_message(u'cursor_normal')
+ QtGui.QDialog.accept(self)
def validateMeta(self):
"""
Validate the Meta before saving.
"""
if not self.version:
- self.changeBackgroundColor(self.versionNameEdit, u'red')
- self.validate_error = [self.versionNameEdit]
self.versionNameEdit.setFocus()
critical_error_message_box(UiStrings().EmptyField,
translate('BiblesPlugin.BibleEditForm',
'You need to specify a version name for your Bible.'))
return False
elif not self.copyright:
- self.changeBackgroundColor(self.copyrightEdit, u'red')
- self.validate_error = [self.copyrightEdit]
self.copyrightEdit.setFocus()
critical_error_message_box(UiStrings().EmptyField,
translate('BiblesPlugin.BibleEditForm',
@@ -172,8 +163,6 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
elif self.manager.exists(self.version) and \
self.manager.get_meta_data(self.bible, u'Version').value != \
self.version:
- self.changeBackgroundColor(self.versionNameEdit, u'red')
- self.validate_error = [self.versionNameEdit]
self.versionNameEdit.setFocus()
critical_error_message_box(
translate('BiblesPlugin.BibleEditForm', 'Bible Exists'),
@@ -189,8 +178,6 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
"""
book_regex = re.compile(u'[\d]*[^\d]+$')
if not new_bookname:
- self.changeBackgroundColor(self.bookNameEdit[abbreviation], u'red')
- self.validate_error = [self.bookNameEdit[abbreviation]]
self.bookNameEdit[abbreviation].setFocus()
critical_error_message_box(UiStrings().EmptyField,
unicode(translate('BiblesPlugin.BibleEditForm',
@@ -198,40 +185,24 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
self.booknames[abbreviation])
return False
elif not book_regex.match(new_bookname):
- self.changeBackgroundColor(self.bookNameEdit[abbreviation], u'red')
- self.validate_error = [self.bookNameEdit[abbreviation]]
self.bookNameEdit[abbreviation].setFocus()
critical_error_message_box(UiStrings().EmptyField,
unicode(translate('BiblesPlugin.BibleEditForm',
- 'The book name "%s" is not correct.\nDecimal digits only could '
- 'be used at the beginning and\nmust be followed by one or more '
- 'non-digit characters')) % new_bookname)
+ 'The book name "%s" is not correct.\nNumbers can only be used '
+ 'at the beginning and must\nbe followed by one or more '
+ 'non-numeric characters.')) % new_bookname)
return False
for abbr, book in self.books.iteritems():
if book:
if abbr == abbreviation:
continue
if unicode(self.bookNameEdit[abbr].text()) == new_bookname:
- self.changeBackgroundColor(self.bookNameEdit[abbreviation],
- u'red')
self.bookNameEdit[abbreviation].setFocus()
- self.changeBackgroundColor(self.bookNameEdit[abbr], u'red')
- self.validate_error = [self.bookNameEdit[abbr],
- self.bookNameEdit[abbreviation]]
critical_error_message_box(
translate('BiblesPlugin.BibleEditForm',
- 'Book Name Exists Twice'),
+ 'Duplicate Book Name'),
unicode(translate('BiblesPlugin.BibleEditForm',
- 'The Book Name "%s" exists twice. Please change one.'))
+ 'The Book Name "%s" has been entered more than once.'))
% new_bookname)
return False
return True
-
- def changeBackgroundColor(self, lineedit, color=None):
- """
- Change the Background Color of the given LineEdit
- """
- pal = QtGui.QPalette(self.palette())
- if color:
- pal.setColor(QtGui.QPalette.Base, QtGui.QColor(color))
- lineedit.setPalette(pal)
From 04b4a34c683785816b1e4ee48020d476ac71975f Mon Sep 17 00:00:00 2001
From: Tim Bentley
Date: Tue, 10 Apr 2012 20:38:25 +0100
Subject: [PATCH 10/19] Add service count for remotes
---
openlp/core/ui/servicemanager.py | 4 ++++
openlp/plugins/remotes/lib/httpserver.py | 1 +
2 files changed, 5 insertions(+)
diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py
index bc075c3e1..18261adcb 100644
--- a/openlp/core/ui/servicemanager.py
+++ b/openlp/core/ui/servicemanager.py
@@ -105,6 +105,7 @@ class ServiceManager(QtGui.QWidget):
self.suffixes = []
self.dropPosition = 0
self.expandTabs = False
+ self.serviceId = 0
# is a new service and has not been saved
self._modified = False
self._fileName = u''
@@ -331,6 +332,8 @@ class ServiceManager(QtGui.QWidget):
Setter for property "modified". Sets whether or not the current service
has been modified.
"""
+ if modified:
+ self.serviceId += 1
self._modified = modified
serviceFile = self.shortFileName() or translate(
'OpenLP.ServiceManager', 'Untitled Service')
@@ -439,6 +442,7 @@ class ServiceManager(QtGui.QWidget):
self.serviceManagerList.clear()
self.serviceItems = []
self.setFileName(u'')
+ self.serviceId += 1
self.setModified(False)
QtCore.QSettings(). \
setValue(u'servicemanager/last file',QtCore.QVariant(u''))
diff --git a/openlp/plugins/remotes/lib/httpserver.py b/openlp/plugins/remotes/lib/httpserver.py
index 383c7fa03..d8a5e95ce 100644
--- a/openlp/plugins/remotes/lib/httpserver.py
+++ b/openlp/plugins/remotes/lib/httpserver.py
@@ -396,6 +396,7 @@ class HttpConnection(object):
Poll OpenLP to determine the current slide number and item name.
"""
result = {
+ u'service': self.parent.plugin.serviceManager.serviceId or 0,
u'slide': self.parent.current_slide or 0,
u'item': self.parent.current_item._uuid \
if self.parent.current_item else u'',
From 5f16ddc73ce0102435ce5a34bd0841f944e55d29 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Armin=20K=C3=B6hler?=
Date: Wed, 11 Apr 2012 19:39:15 +0200
Subject: [PATCH 11/19] fixes
---
openlp/plugins/bibles/forms/editbibledialog.py | 6 +++---
openlp/plugins/bibles/forms/editbibleform.py | 6 ++++--
openlp/plugins/bibles/lib/biblestab.py | 4 ++--
3 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/openlp/plugins/bibles/forms/editbibledialog.py b/openlp/plugins/bibles/forms/editbibledialog.py
index 83e8d39d6..0d59db62e 100644
--- a/openlp/plugins/bibles/forms/editbibledialog.py
+++ b/openlp/plugins/bibles/forms/editbibledialog.py
@@ -163,12 +163,12 @@ class Ui_EditBibleDialog(object):
'Book name language in search field, search results and on '
'display:'))
self.languageSelectionComboBox.setItemText(0,
- translate('BiblesPlugin.EditBibleForm', 'Global settings'))
+ translate('BiblesPlugin.EditBibleForm', 'Global Settings'))
self.languageSelectionComboBox.setItemText(LanguageSelection.Bible + 1,
- translate('BiblesPlugin.EditBibleForm', 'Bible language'))
+ translate('BiblesPlugin.EditBibleForm', 'Bible Language'))
self.languageSelectionComboBox.setItemText(
LanguageSelection.Application + 1,
- translate('BiblesPlugin.EditBibleForm', 'Application language'))
+ translate('BiblesPlugin.EditBibleForm', 'Application Language'))
self.languageSelectionComboBox.setItemText(
LanguageSelection.English + 1,
translate('BiblesPlugin.EditBibleForm', 'English'))
diff --git a/openlp/plugins/bibles/forms/editbibleform.py b/openlp/plugins/bibles/forms/editbibleform.py
index 9300fa079..b4afa6295 100644
--- a/openlp/plugins/bibles/forms/editbibleform.py
+++ b/openlp/plugins/bibles/forms/editbibleform.py
@@ -94,12 +94,14 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
self.bookNameEdit[book[u'abbreviation']].setText(
self.books[book[u'abbreviation']].name)
else:
+ # It is nessecary to remove the Widget otherwise there still
+ # exists the vertical spacing in QFormLayout
self.bookNameWidgetLayout.removeWidget(
self.bookNameLabel[book[u'abbreviation']])
- self.bookNameLabel[book[u'abbreviation']].setParent(None)
+ self.bookNameLabel[book[u'abbreviation']].hide()
self.bookNameWidgetLayout.removeWidget(
self.bookNameEdit[book[u'abbreviation']])
- self.bookNameEdit[book[u'abbreviation']].setParent(None)
+ self.bookNameEdit[book[u'abbreviation']].hide()
def reject(self):
"""
diff --git a/openlp/plugins/bibles/lib/biblestab.py b/openlp/plugins/bibles/lib/biblestab.py
index 751c23264..b8ef7bdba 100644
--- a/openlp/plugins/bibles/lib/biblestab.py
+++ b/openlp/plugins/bibles/lib/biblestab.py
@@ -282,10 +282,10 @@ class BiblesTab(SettingsTab):
'Book name language in search field,\nsearch results and on '
'display:'))
self.languageSelectionComboBox.setItemText(LanguageSelection.Bible,
- translate('BiblesPlugin.BiblesTab', 'Bible language'))
+ translate('BiblesPlugin.BiblesTab', 'Bible Language'))
self.languageSelectionComboBox.setItemText(
LanguageSelection.Application,
- translate('BiblesPlugin.BiblesTab', 'Application language'))
+ translate('BiblesPlugin.BiblesTab', 'Application Language'))
self.languageSelectionComboBox.setItemText(LanguageSelection.English,
translate('BiblesPlugin.BiblesTab', 'English'))
From d53f7b65114d505e52ef684e15e97cf538966e34 Mon Sep 17 00:00:00 2001
From: Andreas Preikschat
Date: Thu, 12 Apr 2012 12:48:54 +0200
Subject: [PATCH 12/19] fixed bug 977835 (Advanced search of Bibles is not
working.)
Fixes: https://launchpad.net/bugs/977835
---
openlp/plugins/bibles/lib/__init__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/openlp/plugins/bibles/lib/__init__.py b/openlp/plugins/bibles/lib/__init__.py
index 587e7b8b0..4eccc087f 100644
--- a/openlp/plugins/bibles/lib/__init__.py
+++ b/openlp/plugins/bibles/lib/__init__.py
@@ -386,7 +386,7 @@ def parse_reference(reference, bible, language_selection, book_ref_id=False):
if bible.get_book_by_book_ref_id(value[u'id']):
book_ref_id = value[u'id']
break
- elif bible.get_book_by_book_ref_id(book_ref_id):
+ elif not bible.get_book_by_book_ref_id(book_ref_id):
book_ref_id = False
ranges = match.group(u'ranges')
range_list = get_reference_match(u'range_separator').split(ranges)
From 665c27c785bfa19d043afd6e6f15bd26cc809e7d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Armin=20K=C3=B6hler?=
Date: Thu, 12 Apr 2012 22:58:11 +0200
Subject: [PATCH 13/19] fixes
---
openlp/plugins/bibles/forms/editbibleform.py | 37 ++++++++++----------
openlp/plugins/bibles/lib/manager.py | 35 ++++++++++++++----
openlp/plugins/bibles/lib/mediaitem.py | 28 +++------------
3 files changed, 51 insertions(+), 49 deletions(-)
diff --git a/openlp/plugins/bibles/forms/editbibleform.py b/openlp/plugins/bibles/forms/editbibleform.py
index b4afa6295..aee42dbcc 100644
--- a/openlp/plugins/bibles/forms/editbibleform.py
+++ b/openlp/plugins/bibles/forms/editbibleform.py
@@ -69,11 +69,11 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
self.manager.get_meta_data(self.bible, u'Copyright').value)
self.permissionsEdit.setText(
self.manager.get_meta_data(self.bible, u'Permissions').value)
- self.bookname_language = self.manager.get_meta_data(
- self.bible, u'Bookname language')
- if self.bookname_language:
+ bookname_language = self.manager.get_meta_data(self.bible,
+ u'Bookname language')
+ if bookname_language and bookname_language.value != u'None':
self.languageSelectionComboBox.setCurrentIndex(
- int(self.bookname_language.value) + 1)
+ int(bookname_language.value) + 1)
self.books = {}
self.webbible = self.manager.get_meta_data(self.bible,
u'download source')
@@ -107,7 +107,7 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
"""
Exit Dialog and do not save
"""
- log.debug (u'BibleEditForm.reject')
+ log.debug(u'BibleEditForm.reject')
self.bible = None
QtGui.QDialog.reject(self)
@@ -116,12 +116,13 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
Exit Dialog and save data
"""
log.debug(u'BibleEditForm.accept')
- self.version = unicode(self.versionNameEdit.text())
- self.copyright = unicode(self.copyrightEdit.text())
- self.permissions = unicode(self.permissionsEdit.text())
- self.bookname_language = \
- self.languageSelectionComboBox.currentIndex() - 1
- if not self.validateMeta():
+ version = unicode(self.versionNameEdit.text())
+ copyright = unicode(self.copyrightEdit.text())
+ permissions = unicode(self.permissionsEdit.text())
+ bookname_language = self.languageSelectionComboBox.currentIndex() - 1
+ if bookname_language == -1:
+ bookname_language = None
+ if not self.validateMeta(version, copyright):
return
if not self.webbible:
custom_names = {}
@@ -133,8 +134,8 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
return
Receiver.send_message(u'openlp_process_events')
Receiver.send_message(u'cursor_busy')
- self.manager.save_meta_data(self.bible, self.version,
- self.copyright, self.permissions, self.bookname_language)
+ self.manager.save_meta_data(self.bible, version, copyright, permissions,
+ bookname_language)
if not self.webbible:
for abbr, book in self.books.iteritems():
if book:
@@ -145,26 +146,26 @@ class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
Receiver.send_message(u'cursor_normal')
QtGui.QDialog.accept(self)
- def validateMeta(self):
+ def validateMeta(self, version, copyright):
"""
Validate the Meta before saving.
"""
- if not self.version:
+ if not version:
self.versionNameEdit.setFocus()
critical_error_message_box(UiStrings().EmptyField,
translate('BiblesPlugin.BibleEditForm',
'You need to specify a version name for your Bible.'))
return False
- elif not self.copyright:
+ elif not copyright:
self.copyrightEdit.setFocus()
critical_error_message_box(UiStrings().EmptyField,
translate('BiblesPlugin.BibleEditForm',
'You need to set a copyright for your Bible. '
'Bibles in the Public Domain need to be marked as such.'))
return False
- elif self.manager.exists(self.version) and \
+ elif self.manager.exists(version) and \
self.manager.get_meta_data(self.bible, u'Version').value != \
- self.version:
+ version:
self.versionNameEdit.setFocus()
critical_error_message_box(
translate('BiblesPlugin.BibleEditForm', 'Bible Exists'),
diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py
index 8edd80dfa..b0dd92e3c 100644
--- a/openlp/plugins/bibles/lib/manager.py
+++ b/openlp/plugins/bibles/lib/manager.py
@@ -140,14 +140,14 @@ class BibleManager(object):
BibleDB class.
"""
log.debug(u'Reload bibles')
- self.files = SettingsManager.get_files(self.settingsSection,
+ files = SettingsManager.get_files(self.settingsSection,
self.suffix)
- if u'alternative_book_names.sqlite' in self.files:
- self.files.remove(u'alternative_book_names.sqlite')
- log.debug(u'Bible Files %s', self.files)
+ if u'alternative_book_names.sqlite' in files:
+ files.remove(u'alternative_book_names.sqlite')
+ log.debug(u'Bible Files %s', files)
self.db_cache = {}
self.old_bible_databases = []
- for filename in self.files:
+ for filename in files:
bible = BibleDB(self.parent, path=self.path, file=filename)
name = bible.get_name()
# Remove corrupted files.
@@ -211,7 +211,12 @@ class BibleManager(object):
``name``
The name of the bible.
"""
- for filename in self.files:
+ log.debug(u'BibleManager.delete_bible("%s")', name)
+ files = SettingsManager.get_files(self.settingsSection,
+ self.suffix)
+ if u'alternative_book_names.sqlite' in files:
+ files.remove(u'alternative_book_names.sqlite')
+ for filename in files:
bible = BibleDB(self.parent, path=self.path, file=filename)
# Remove the bible files
if name == bible.get_name():
@@ -364,6 +369,22 @@ class BibleManager(object):
})
return None
+ def get_language_selection(self, bible):
+ """
+ Returns the language selection of a bible.
+
+ ``bible``
+ Unicode. The Bible to get the language selection from.
+ """
+ log.debug(u'BibleManager.get_language_selection("%s")', bible)
+ language_selection = self.get_meta_data(bible, u'Bookname language')
+ if language_selection and language_selection.value != u'None':
+ return int(language_selection.value)
+ if language_selection is None or language_selection.value == u'None':
+ return QtCore.QSettings().value(
+ self.settingsSection + u'/bookname language',
+ QtCore.QVariant(0)).toInt()[0]
+
def verse_search(self, bible, second_bible, text):
"""
Does a verse search for the given bible and text.
@@ -417,7 +438,7 @@ class BibleManager(object):
return None
def save_meta_data(self, bible, version, copyright, permissions,
- bookname_language=-1):
+ bookname_language=None):
"""
Saves the bibles meta data.
"""
diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py
index ba77766ec..bca73fc70 100644
--- a/openlp/plugins/bibles/lib/mediaitem.py
+++ b/openlp/plugins/bibles/lib/mediaitem.py
@@ -432,14 +432,7 @@ class BibleMediaItem(MediaManagerItem):
book_data = book_data_temp
self.advancedBookComboBox.clear()
first = True
- language_selection = self.plugin.manager.get_meta_data(
- bible, u'Bookname language')
- if language_selection:
- language_selection = int(language_selection.value)
- if language_selection is None or language_selection == -1:
- language_selection = QtCore.QSettings().value(
- self.settingsSection + u'/bookname language',
- QtCore.QVariant(0)).toInt()[0]
+ language_selection = self.plugin.manager.get_language_selection(bible)
booknames = BibleStrings().Booknames
for book in book_data:
row = self.advancedBookComboBox.count()
@@ -511,14 +504,8 @@ class BibleMediaItem(MediaManagerItem):
secondbook.book_reference_id:
book_data_temp.append(book)
book_data = book_data_temp
- language_selection = self.plugin.manager.get_meta_data(
- bible, u'Bookname language')
- if language_selection:
- language_selection = int(language_selection.value)
- if language_selection is None or language_selection == -1:
- language_selection = QtCore.QSettings().value(
- self.settingsSection + u'/bookname language',
- QtCore.QVariant(0)).toInt()[0]
+ language_selection = self.plugin.manager.get_language_selection(
+ bible)
if language_selection == LanguageSelection.Bible:
books = [book.name + u' ' for book in book_data]
elif language_selection == LanguageSelection.Application:
@@ -834,14 +821,7 @@ class BibleMediaItem(MediaManagerItem):
second_permissions = self.plugin.manager.get_meta_data(
second_bible, u'Permissions').value
items = []
- language_selection = self.plugin.manager.get_meta_data(
- bible, u'Bookname language')
- if language_selection:
- language_selection = int(language_selection.value)
- if language_selection is None or language_selection == -1:
- language_selection = QtCore.QSettings().value(
- self.settingsSection + u'/bookname language',
- QtCore.QVariant(0)).toInt()[0]
+ language_selection = self.plugin.manager.get_language_selection(bible)
for count, verse in enumerate(search_results):
if language_selection == LanguageSelection.Bible:
book = verse.book.name
From 70d75b0f80d10944a356be72f6a9406eedbfa6a7 Mon Sep 17 00:00:00 2001
From: Raoul Snyman
Date: Fri, 13 Apr 2012 22:08:05 +0200
Subject: [PATCH 14/19] Removed an unused import. Changed the "Split" button to
say "Optional Split" instead.
---
openlp/core/lib/ui.py | 2 +-
openlp/plugins/songs/forms/editversedialog.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py
index 7f411f3dc..1117c01a0 100644
--- a/openlp/core/lib/ui.py
+++ b/openlp/core/lib/ui.py
@@ -124,7 +124,7 @@ class UiStrings(object):
self.Settings = translate('OpenLP.Ui', 'Settings')
self.SaveService = translate('OpenLP.Ui', 'Save Service')
self.Service = translate('OpenLP.Ui', 'Service')
- self.Split = translate('OpenLP.Ui', '&Split')
+ self.Split = translate('OpenLP.Ui', 'Optional &Split')
self.SplitToolTip = translate('OpenLP.Ui', 'Split a slide into two '
'only if it does not fit on the screen as one slide.')
self.StartTimeCode = unicode(translate('OpenLP.Ui', 'Start %s'))
diff --git a/openlp/plugins/songs/forms/editversedialog.py b/openlp/plugins/songs/forms/editversedialog.py
index 062d81d7f..fb5698c88 100644
--- a/openlp/plugins/songs/forms/editversedialog.py
+++ b/openlp/plugins/songs/forms/editversedialog.py
@@ -25,7 +25,7 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
-from PyQt4 import QtCore, QtGui
+from PyQt4 import QtGui
from openlp.core.lib import build_icon, translate, SpellTextEdit
from openlp.core.lib.ui import create_button_box, UiStrings
From cf069afe926e03b26b94a2aefdbe4ea8e44f1f00 Mon Sep 17 00:00:00 2001
From: Philip Ridout
Date: Fri, 13 Apr 2012 22:47:15 +0100
Subject: [PATCH 15/19] Implements the progress bar for all media items for
which it is possible. This shows OpenLP is doing 'something' rather than just
hung.
---
openlp/plugins/images/lib/mediaitem.py | 11 +++++++++--
openlp/plugins/presentations/lib/mediaitem.py | 7 +++++++
openlp/plugins/songs/lib/mediaitem.py | 5 +++++
3 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py
index 053f4d689..702bc7e96 100644
--- a/openlp/plugins/images/lib/mediaitem.py
+++ b/openlp/plugins/images/lib/mediaitem.py
@@ -105,26 +105,30 @@ class ImageMediaItem(MediaManagerItem):
'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.plugin.formparent.displayProgressBar(len(row_list))
for row in row_list:
text = self.listView.item(row)
if text:
delete_file(os.path.join(self.servicePath,
unicode(text.text())))
self.listView.takeItem(row)
+ self.plugin.formparent.incrementProgressBar()
SettingsManager.set_list(self.settingsSection,
u'images', self.getFileList())
+ self.plugin.formparent.finishedProgressBar()
+ Receiver.send_message(u'cursor_normal')
self.listView.blockSignals(False)
def loadList(self, images, initialLoad=False):
if not initialLoad:
+ Receiver.send_message(u'cursor_busy')
self.plugin.formparent.displayProgressBar(len(images))
# Sort the themes by its filename considering language specific
# characters. lower() is needed for windows!
images.sort(cmp=locale.strcoll,
key=lambda filename: os.path.split(unicode(filename))[1].lower())
for imageFile in images:
- if not initialLoad:
- self.plugin.formparent.incrementProgressBar()
filename = os.path.split(unicode(imageFile))[1]
thumb = os.path.join(self.servicePath, filename)
if not os.path.exists(unicode(imageFile)):
@@ -139,8 +143,11 @@ class ImageMediaItem(MediaManagerItem):
item_name.setToolTip(imageFile)
item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(imageFile))
self.listView.addItem(item_name)
+ if not initialLoad:
+ self.plugin.formparent.incrementProgressBar()
if not initialLoad:
self.plugin.formparent.finishedProgressBar()
+ Receiver.send_message(u'cursor_normal')
def generateSlideData(self, service_item, item=None, xmlVersion=False,
remote=False):
diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py
index 45d14f8cc..a94929b45 100644
--- a/openlp/plugins/presentations/lib/mediaitem.py
+++ b/openlp/plugins/presentations/lib/mediaitem.py
@@ -165,6 +165,7 @@ class PresentationMediaItem(MediaManagerItem):
titles = [os.path.split(file)[1] for file in currlist]
Receiver.send_message(u'cursor_busy')
if not initialLoad:
+ Receiver.send_message(u'cursor_busy')
self.plugin.formparent.displayProgressBar(len(files))
# Sort the themes by its filename considering language specific
# characters. lower() is needed for windows!
@@ -217,6 +218,7 @@ class PresentationMediaItem(MediaManagerItem):
Receiver.send_message(u'cursor_normal')
if not initialLoad:
self.plugin.formparent.finishedProgressBar()
+ Receiver.send_message(u'cursor_normal')
def onDeleteClick(self):
"""
@@ -226,6 +228,8 @@ class PresentationMediaItem(MediaManagerItem):
items = self.listView.selectedIndexes()
row_list = [item.row() for item in items]
row_list.sort(reverse=True)
+ Receiver.send_message(u'cursor_busy')
+ self.plugin.formparent.displayProgressBar(len(row_list))
for item in items:
filepath = unicode(item.data(
QtCore.Qt.UserRole).toString())
@@ -233,6 +237,9 @@ class PresentationMediaItem(MediaManagerItem):
doc = self.controllers[cidx].add_document(filepath)
doc.presentation_deleted()
doc.close_presentation()
+ self.plugin.formparent.incrementProgressBar()
+ self.plugin.formparent.finishedProgressBar()
+ Receiver.send_message(u'cursor_normal')
for row in row_list:
self.listView.takeItem(row)
SettingsManager.set_list(self.settingsSection,
diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py
index 38f5db956..dd398ec1c 100644
--- a/openlp/plugins/songs/lib/mediaitem.py
+++ b/openlp/plugins/songs/lib/mediaitem.py
@@ -408,6 +408,8 @@ class SongMediaItem(MediaManagerItem):
QtGui.QMessageBox.No),
QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No:
return
+ Receiver.send_message(u'cursor_busy')
+ self.plugin.formparent.displayProgressBar(len(items))
for item in items:
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
media_files = self.plugin.manager.get_all_objects(MediaFile,
@@ -426,6 +428,9 @@ class SongMediaItem(MediaManagerItem):
except OSError:
log.exception(u'Could not remove directory: %s', save_path)
self.plugin.manager.delete_object(Song, item_id)
+ self.plugin.formparent.incrementProgressBar()
+ self.plugin.formparent.finishedProgressBar()
+ Receiver.send_message(u'cursor_normal')
self.onSearchTextButtonClicked()
def onCloneClick(self):
From aae1d3753bd44e1c03f8426a7f2319f3cb7f216c Mon Sep 17 00:00:00 2001
From: Raoul Snyman
Date: Mon, 16 Apr 2012 23:57:10 +0200
Subject: [PATCH 16/19] Updated jQuery. Updated jQuery Mobile. Fixed headers at
the top. Fixed toolbars at the bottom. Removed top toolbars. Added navigation
to the top of most screens. Added a "Add & Go to Service" button on the
search result options dialog. Implemented Theme and Desktop blank types.
Changed "back" button to say "Home" instead, and actually added the text.
---
.../remotes/html/images/ajax-loader.gif | Bin 0 -> 7825 bytes
.../remotes/html/images/ajax-loader.png | Bin 503 -> 340 bytes
.../remotes/html/images/icons-18-black.png | Bin 2064 -> 1767 bytes
.../remotes/html/images/icons-18-white.png | Bin 2200 -> 1806 bytes
.../remotes/html/images/icons-36-black.png | Bin 3403 -> 3611 bytes
.../remotes/html/images/icons-36-white.png | Bin 4020 -> 3648 bytes
openlp/plugins/remotes/html/index.html | 89 +++--
openlp/plugins/remotes/html/jquery.js | 8 +-
openlp/plugins/remotes/html/jquery.mobile.css | 4 +-
openlp/plugins/remotes/html/jquery.mobile.js | 356 +++++++++---------
openlp/plugins/remotes/html/openlp.js | 53 ++-
openlp/plugins/remotes/lib/httpserver.py | 6 +-
12 files changed, 281 insertions(+), 235 deletions(-)
create mode 100644 openlp/plugins/remotes/html/images/ajax-loader.gif
diff --git a/openlp/plugins/remotes/html/images/ajax-loader.gif b/openlp/plugins/remotes/html/images/ajax-loader.gif
new file mode 100644
index 0000000000000000000000000000000000000000..fd1a189c21fed1c7ba00c4bb4fad407bd6d1e5f9
GIT binary patch
literal 7825
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
LHfkt@K(PD|Q{O_Y
literal 0
HcmV?d00001
diff --git a/openlp/plugins/remotes/html/images/ajax-loader.png b/openlp/plugins/remotes/html/images/ajax-loader.png
index 811a2cdd1b492c47faf85c1206ad6606521eb6e4..13b208dddd67f65dc5af0f6ed1a8c8227e458ed3 100644
GIT binary patch
delta 325
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
diff --git a/openlp/plugins/remotes/html/images/icons-36-black.png b/openlp/plugins/remotes/html/images/icons-36-black.png
index 4c72adf1e81039a59ae8ab74cdeb6148c67acfbb..1a59d7c375d6611262a9ac86db23eb94570d7319 100644
GIT binary patch
literal 3611
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
diff --git a/openlp/plugins/remotes/html/images/icons-36-white.png b/openlp/plugins/remotes/html/images/icons-36-white.png
index 84ea9fb31ae442d0c60523fbce08ec5f202b7d9c..5647bdc945d547080a673d35a42e8cfe5f2bfe3e 100644
GIT binary patch
literal 3648
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
A8~^|S
literal 4020
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
O16?#i8CL6~qyGU`IBHY?
diff --git a/openlp/plugins/remotes/html/index.html b/openlp/plugins/remotes/html/index.html
index fd1b37472..88a0584c9 100644
--- a/openlp/plugins/remotes/html/index.html
+++ b/openlp/plugins/remotes/html/index.html
@@ -39,7 +39,7 @@
"go_live": "${go_live}",
"add_to_service": "${add_to_service}",
"no_results": "${no_results}",
- "back": "${back}"
+ "home": "${home}"
}
@@ -58,71 +58,79 @@
"),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;ca ",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j =0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c ",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML=" ",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="
";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,""," "],thead:[1,""],tr:[2,""],td:[3,""],col:[2,""],area:[1,""," "],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>$2>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/