Individual presentation controllers are now completely self-contained.

(left out dll to see if breaks the merge, so powerpoint viewer won't work anymore. If this succeeds and is approved I'll then try pushing the dll separately)
This commit is contained in:
Jonathan Corwin 2009-09-30 20:26:51 +01:00
parent 268b0e98f3
commit bbef55326b
11 changed files with 138 additions and 93 deletions

View File

@ -23,9 +23,6 @@
###############################################################################
from presentationcontroller import PresentationController
from impresscontroller import ImpressController
from powerpointcontroller import PowerpointController
from pptviewcontroller import PptviewController
from messagelistener import MessageListener
from mediaitem import PresentationMediaItem
from presentationtab import PresentationTab

View File

@ -34,11 +34,8 @@ if os.name == u'nt':
else:
import uno
from PyQt4 import QtCore
from presentationcontroller import PresentationController
class ImpressController(PresentationController):
"""
Class to control interactions with Impress presentations.
@ -47,6 +44,7 @@ class ImpressController(PresentationController):
"""
global log
log = logging.getLogger(u'ImpressController')
log.info(u'loaded')
def __init__(self, plugin):
"""
@ -59,16 +57,17 @@ class ImpressController(PresentationController):
self.presentation = None
self.controller = None
def is_available(self):
def check_available(self):
"""
PPT Viewer is able to run on this machine
Impress is able to run on this machine
"""
log.debug(u'is_available')
try:
self.start_process()
log.debug(u'check_available')
if os.name == u'nt':
return self.get_com_servicemanager() is not None
else:
# If not windows, and we've got this far then probably
# installed else the import uno would likely have failed
return True
except:
return False
def start_process(self):
"""
@ -148,13 +147,21 @@ class ImpressController(PresentationController):
def get_com_desktop(self):
log.debug(u'getCOMDesktop')
try:
smgr = Dispatch("com.sun.star.ServiceManager")
smgr = self.get_com_servicemanager()
desktop = smgr.createInstance( "com.sun.star.frame.Desktop")
return desktop
except:
log.exception(u'Failed to get COM desktop')
return None
def get_com_servicemanager(self):
log.debug(u'get_com_servicemanager')
try:
return Dispatch("com.sun.star.ServiceManager")
except:
log.exception(u'Failed to get COM service manager')
return None
def close_presentation(self):
"""
Close presentation and clean up objects

View File

@ -94,7 +94,8 @@ class PresentationMediaItem(MediaManagerItem):
self.loadList(list)
for item in self.controllers:
#load the drop down selection
self.DisplayTypeComboBox.addItem(item)
if self.controllers[item].enabled:
self.DisplayTypeComboBox.addItem(item)
def loadList(self, list):
for file in list:

View File

@ -27,6 +27,7 @@ import logging
if os.name == u'nt':
from win32com.client import Dispatch
import _winreg
from presentationcontroller import PresentationController
@ -41,7 +42,8 @@ class PowerpointController(PresentationController):
"""
global log
log = logging.getLogger(u'PowerpointController')
log.info(u'loaded')
def __init__(self, plugin):
"""
Initialise the class
@ -51,18 +53,18 @@ class PowerpointController(PresentationController):
self.process = None
self.presentation = None
def is_available(self):
def check_available(self):
"""
PowerPoint is able to run on this machine
"""
log.debug(u'is_available')
if os.name != u'nt':
return False
try:
self.start_process()
return True
except:
return False
log.debug(u'check_available')
if os.name == u'nt':
try:
_winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, u'PowerPoint.Application').Close()
return True
except:
pass
return False
if os.name == u'nt':
def start_process(self):
@ -83,6 +85,9 @@ class PowerpointController(PresentationController):
return False
def kill(self):
"""
Called at system exit to clean up any running presentations
"""
self.process.Quit()
self.process = None

View File

@ -39,37 +39,50 @@ class PptviewController(PresentationController):
"""
global log
log = logging.getLogger(u'PptviewController')
log.info(u'loaded')
def __init__(self, plugin):
"""
Initialise the class
"""
log.debug(u'Initialising')
PresentationController.__init__(self, plugin, u'Powerpoint Viewer')
self.process = None
PresentationController.__init__(self, plugin, u'Powerpoint Viewer')
self.pptid = None
self.thumbnailpath = os.path.join(plugin.config.get_data_path(),
u'pptview', u'thumbnails')
self.thumbprefix = u'slide'
def is_available(self):
def check_available(self):
"""
PPT Viewer is able to run on this machine
"""
log.debug(u'is_available')
log.debug(u'check_available')
if os.name != u'nt':
return False
try:
self.start_process()
return True
return self.check_installed()
except:
return False
if os.name == u'nt':
def check_installed(self):
"""
Check the viewer is installed
"""
log.debug(u'Check installed')
try:
self.start_process()
return self.process.CheckInstalled()
except:
return False
def start_process(self):
"""
Loads the PPTVIEWLIB library
"""
if self.process is not None:
return
log.debug(u'start PPTView')
self.process = cdll.LoadLibrary(r'openlp\plugins\presentations\lib\pptviewlib\pptviewlib.dll')

View File

@ -25,6 +25,9 @@ This library has a limit of 50 PowerPoints which can be opened simultaneously.
USAGE
-----
BOOL CheckInstalled(void);
Returns TRUE if PowerPointViewer is installed. FALSE if not.
int OpenPPT(char *filename, HWND hParentWnd, RECT rect, char *previewpath);
Opens the PowerPoint file, counts the number of slides, sizes and positions accordingly

View File

@ -82,6 +82,14 @@ DllExport void SetDebug(BOOL onoff)
DEBUG("enabled\n");
}
DllExport BOOL CheckInstalled()
{
DEBUG("CheckInstalled\n");
char cmdline[MAX_PATH * 2];
return GetPPTViewerPath(cmdline, sizeof(cmdline));
}
// Open the PointPoint, count the slides and take a snapshot of each slide
// for use in previews
// previewpath is a prefix for the location to put preview images of each slide.

View File

@ -4,6 +4,7 @@
enum PPTVIEWSTATE { PPT_CLOSED, PPT_STARTED, PPT_OPENED, PPT_LOADED, PPT_CLOSING};
DllExport int OpenPPT(char *filename, HWND hParentWnd, RECT rect, char *previewpath);
DllExport BOOL CheckInstalled();
DllExport void ClosePPT(int id);
DllExport int GetCurrentSlide(int id);
DllExport int GetSlideCount(int id);

View File

@ -20,6 +20,8 @@ Place, Suite 330, Boston, MA 02111-1307 USA
import logging
from PyQt4 import QtCore
class PresentationController(object):
"""
Base class for presentation controllers to inherit from
@ -32,6 +34,13 @@ class PresentationController(object):
``name``
The name that appears in the options and the media manager
``enabled``
The controller is enabled
``available``
The controller is available on this machine. Set by init via
call to check_available
``plugin``
The presentationplugin object
@ -40,7 +49,7 @@ class PresentationController(object):
``kill()``
Called at system exit to clean up any running presentations
``is_available()``
``check_available()``
Returns True if presentation application is installed/can run on this machine
``load_presentation(presentation)``
@ -108,8 +117,14 @@ class PresentationController(object):
"""
self.plugin = plugin
self.name = name
self.available = self.check_available()
if self.available:
self.enabled = int(plugin.config.get_config(
name, QtCore.Qt.Unchecked)) == QtCore.Qt.Checked
else:
self.enabled = False
def is_available(self):
def check_available(self):
"""
Presentation app is able to run on this machine
"""

View File

@ -60,24 +60,17 @@ class PresentationTab(SettingsTab):
self.VerseTypeLayout.setSpacing(8)
self.VerseTypeLayout.setMargin(0)
self.VerseTypeLayout.setObjectName(u'VerseTypeLayout')
self.PowerpointCheckBox = QtGui.QCheckBox(self.VerseDisplayGroupBox)
self.PowerpointCheckBox.setTristate(False)
if os.name != u'nt':
self.PowerpointCheckBox.setEnabled(False)
self.PowerpointCheckBox.setObjectName(u'PowerpointCheckBox')
self.VerseDisplayLayout.addWidget(self.PowerpointCheckBox, 0, 0, 1, 1)
self.PowerpointViewerCheckBox = QtGui.QCheckBox(
self.VerseDisplayGroupBox)
self.PowerpointViewerCheckBox.setTristate(False)
if os.name != u'nt':
self.PowerpointViewerCheckBox.setEnabled(False)
self.PowerpointViewerCheckBox.setObjectName(u'PowerpointViewerCheckBox')
self.VerseDisplayLayout.addWidget(
self.PowerpointViewerCheckBox, 1, 0, 1, 1)
self.ImpressCheckBox = QtGui.QCheckBox(self.VerseDisplayGroupBox)
self.ImpressCheckBox.setTristate(False)
self.ImpressCheckBox.setObjectName(u'ImpressCheckBox')
self.VerseDisplayLayout.addWidget(self.ImpressCheckBox, 2, 0, 1, 1)
self.PresenterCheckboxes = {}
index = 0
for key in self.controllers:
controller = self.controllers[key]
checkbox = QtGui.QCheckBox(self.VerseDisplayGroupBox)
checkbox.setTristate(False)
checkbox.setEnabled(controller.available)
checkbox.setObjectName(controller.name + u'CheckBox')
self.PresenterCheckboxes[controller.name] = checkbox
index = index + 1
self.VerseDisplayLayout.addWidget(checkbox, index, 0, 1, 1)
self.PresentationThemeWidget = QtGui.QWidget(self.VerseDisplayGroupBox)
self.PresentationThemeWidget.setObjectName(u'PresentationThemeWidget')
self.PresentationThemeLayout = QtGui.QHBoxLayout(
@ -103,26 +96,23 @@ class PresentationTab(SettingsTab):
self.PresentationLayout.addWidget(self.PresentationRightWidget)
def retranslateUi(self):
self.PowerpointCheckBox.setText(
translate(u'PresentationTab', 'Powerpoint available:'))
self.PowerpointViewerCheckBox.setText(
translate(u'PresentationTab', 'PowerpointViewer available:'))
self.ImpressCheckBox.setText(
translate(u'PresentationTab', 'Impress available:'))
for key in self.controllers:
controller = self.controllers[key]
checkbox = self.PresenterCheckboxes[controller.name]
checkbox.setText(translate(u'PresentationTab',
controller.name + u' available:'))
def load(self):
self.PowerpointCheckBox.setChecked(
int(self.config.get_config(u'Powerpoint', 0)))
self.PowerpointViewerCheckBox.setChecked(
int(self.config.get_config(u'Powerpoint Viewer', 0)))
self.ImpressCheckBox.setChecked(
int(self.config.get_config(u'Impress', 0)))
for key in self.controllers:
controller = self.controllers[key]
if controller.available:
checkbox = self.PresenterCheckboxes[controller.name]
checkbox.setChecked(
int(self.config.get_config(controller.name, 0)))
def save(self):
self.config.set_config(
u'Powerpoint', unicode(self.PowerpointCheckBox.checkState()))
self.config.set_config(
u'Powerpoint Viewer',
unicode(self.PowerpointViewerCheckBox.checkState()))
self.config.set_config(
u'Impress', unicode(self.ImpressCheckBox.checkState()))
for key in self.controllers:
controller = self.controllers[key]
checkbox = self.PresenterCheckboxes[controller.name]
self.config.set_config(
controller.name, unicode(checkbox.checkState()))

View File

@ -22,11 +22,12 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
import os
import logging
from PyQt4 import QtCore
from PyQt4 import QtGui
from openlp.core.lib import Plugin, buildIcon
from openlp.core.lib import Plugin
from openlp.plugins.presentations.lib import *
class PresentationPlugin(Plugin):
@ -41,7 +42,9 @@ class PresentationPlugin(Plugin):
Plugin.__init__(self, u'Presentations', u'1.9.0', plugin_helpers)
self.weight = -8
# Create the plugin icon
self.icon = buildIcon(u':/media/media_presentation.png')
self.icon = QtGui.QIcon()
self.icon.addPixmap(QtGui.QPixmap(u':/media/media_presentation.png'),
QtGui.QIcon.Normal, QtGui.QIcon.Off)
def get_settings_tab(self):
"""
@ -67,25 +70,25 @@ class PresentationPlugin(Plugin):
If Not do not install the plugin.
"""
log.debug(u'check_pre_conditions')
#Lets see if Powerpoint is required (Default is Not wanted)
controller = PowerpointController(self)
if int(self.config.get_config(
controller.name, QtCore.Qt.Unchecked)) == QtCore.Qt.Checked:
if controller.is_available():
self.registerControllers(controller)
#Lets see if Impress is required (Default is Not wanted)
controller = ImpressController(self)
if int(self.config.get_config(
controller.name, QtCore.Qt.Unchecked)) == QtCore.Qt.Checked:
if controller.is_available():
self.registerControllers(controller)
#Lets see if Powerpoint Viewer is required (Default is Not wanted)
controller = PptviewController(self)
if int(self.config.get_config(
controller.name, QtCore.Qt.Unchecked)) == QtCore.Qt.Checked:
if controller.is_available():
self.registerControllers(controller)
#If we have no available controllers disable plugin
dir = os.path.join(os.path.dirname(__file__), u'lib')
for filename in os.listdir(dir):
if filename.endswith(u'controller.py') and \
not filename == 'presentationcontroller.py':
path = os.path.join(dir, filename)
if os.path.isfile(path):
modulename = u'openlp.plugins.presentations.lib.' + \
os.path.splitext(filename)[0]
log.debug(u'Importing controller %s', modulename)
try:
__import__(modulename, globals(), locals(), [])
except ImportError, e:
log.error(u'Failed to import %s on path %s for reason %s', modulename, path, e.args[0])
controller_classes = PresentationController.__subclasses__()
for controller_class in controller_classes:
controller = controller_class(self)
self.registerControllers(controller)
if controller.enabled:
controller.start_process()
if len(self.controllers) > 0:
return True
else:
@ -94,5 +97,7 @@ class PresentationPlugin(Plugin):
def finalise(self):
log.debug(u'Finalise')
#Ask each controller to tidy up
for controller in self.controllers:
self.controllers[controller].kill()
for key in self.controllers:
controller = self.controllers[key]
if controller.enabled:
controller.kill()