diff --git a/openlp/plugins/presentations/lib/__init__.py b/openlp/plugins/presentations/lib/__init__.py index 2ee88aaba..de2b19ce1 100644 --- a/openlp/plugins/presentations/lib/__init__.py +++ b/openlp/plugins/presentations/lib/__init__.py @@ -24,6 +24,7 @@ from impresscontroller import ImpressController #from powerpointcontroller import PowerpointController +from pptviewcontroller import PptviewController from messagelistener import MessageListener from mediaitem import PresentationMediaItem from presentationtab import PresentationTab diff --git a/openlp/plugins/presentations/lib/pptviewcontroller.py b/openlp/plugins/presentations/lib/pptviewcontroller.py index 324119fc0..a772c62cd 100644 --- a/openlp/plugins/presentations/lib/pptviewcontroller.py +++ b/openlp/plugins/presentations/lib/pptviewcontroller.py @@ -22,128 +22,135 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +import logging +import os, subprocess +import time import sys import win32api -from PyQt4 import QtGui, QtCore from ctypes import * from ctypes.wintypes import RECT -pptdll = cdll.LoadLibrary(r'C:\Documents and Settings\jonathan\My Documents\Personal\openlp\openlp-2\trunk\openlp\libraries\pptviewlib\pptviewlib.dll') +from PyQt4 import QtCore -class BoxLayout(QtGui.QWidget): - def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) +class PptviewController(object): + """ + Class to control interactions with PowerPOint Viewer Presentations + It creates the runtime Environment , Loads the and Closes the Presentation + As well as trigggering the correct activities based on the users input + """ + global log + log = logging.getLogger(u'PptviewController') + + def __init__(self): + log.debug(u'Initialising') + self.process = None + self.document = None + self.presentation = None + self.pptid = None + self.startPPTView() + + def startPPTView(self): + """ + Loads the PPTVIEWLIB library + """ + log.debug(u'start PPTView') + self.presentation = cdll.LoadLibrary(r'openlp\plugins\presentations\lib\pptviewlib\pptviewlib.dll') + + def kill(self): + """ + Called at system exit to clean up any running presentations + """ + log.debug(u'Kill') + self.closePresentation() + + def loadPresentation(self, presentation): + """ + Called when a presentation is added to the SlideController. + It builds the environment, starts communcations with the background + OpenOffice task started earlier. If OpenOffice is not present is is + started. Once the environment is available the presentation is loaded + and started. + + ``presentation`` + The file name of the presentatios to the run. + """ + log.debug(u'LoadPresentation') + if(self.pptid>=0): + self.CloseClick() + rect = RECT() + rect.left = 0 + rect.top = 0 + rect.width = 0 + rect.hight = 0 + try: + tempfolder = None #r'c:\temp\pptviewlib\' + presentation + self.pptid = self.presentation.OpenPPT(presentation, None, rect, tempfolder) + except: + log.exception(u'Failed to load presentation') + #self.slidecount = pptdll.GetSlideCount(self.pptid) + + def closePresentation(self): + """ + Close presentation and clean up objects + Triggerent by new object being added to SlideController orOpenLP + being shut down + """ + if(self.pptid<0): return + self.presentation.Close(self.pptid) self.pptid = -1 - self.setWindowTitle(u'box layout') - PPTLabel = QtGui.QLabel(u'Open PowerPoint file') - slideLabel = QtGui.QLabel(u'Go to slide #') - self.PPTEdit = QtGui.QLineEdit() - self.slideEdit = QtGui.QLineEdit() - self.total = QtGui.QLabel() - PPTBtn = QtGui.QPushButton(u'Open') - PPTDlgBtn = QtGui.QPushButton(u'...') - slideBtn = QtGui.QPushButton(u'Go') - prev = QtGui.QPushButton(u'Prev') - next = QtGui.QPushButton(u'Next') - blank = QtGui.QPushButton(u'Blank') - unblank = QtGui.QPushButton(u'Unblank') - restart = QtGui.QPushButton(u'Restart') - close = QtGui.QPushButton(u'Close') - resume = QtGui.QPushButton(u'Resume') - stop = QtGui.QPushButton(u'Stop') - pptwindow = QtGui.QWidget() + def isActive(self): + return self.pptid >= 0 - grid = QtGui.QGridLayout() - grid.addWidget(PPTLabel, 0, 0) - grid.addWidget(self.PPTEdit, 0, 1) - grid.addWidget(PPTDlgBtn, 0, 2) - grid.addWidget(PPTBtn, 0, 3) - grid.addWidget(slideLabel, 1, 0) - grid.addWidget(self.slideEdit, 1, 1) - grid.addWidget(slideBtn, 1, 3) - grid.addWidget(prev, 2, 0) - grid.addWidget(next, 2, 1) - grid.addWidget(blank, 3, 0) - grid.addWidget(unblank, 3, 1) - grid.addWidget(restart, 4, 0) - grid.addWidget(stop, 4, 1) - grid.addWidget(resume, 4, 2) - grid.addWidget(pptwindow, 5, 0, 10, 3) - self.connect(PPTBtn, QtCore.SIGNAL(u'clicked()'), self.OpenClick) - self.connect(PPTDlgBtn, QtCore.SIGNAL(u'clicked()'), self.OpenDialog) - self.connect(slideBtn, QtCore.SIGNAL(u'clicked()'), self.GotoClick) - self.connect(prev, QtCore.SIGNAL(u'clicked()'), self.PrevClick) - self.connect(next, QtCore.SIGNAL(u'clicked()'), self.NextClick) - self.connect(blank, QtCore.SIGNAL(u'clicked()'), self.BlankClick) - self.connect(unblank, QtCore.SIGNAL(u'clicked()'), self.UnblankClick) - self.connect(restart, QtCore.SIGNAL(u'clicked()'), self.RestartClick) - self.connect(close, QtCore.SIGNAL(u'clicked()'), self.CloseClick) - self.connect(stop, QtCore.SIGNAL(u'clicked()'), self.StopClick) - self.connect(resume, QtCore.SIGNAL(u'clicked()'), self.ResumeClick) + def resume(self): + if(self.pptid<0): return + self.presentation.Resume(self.pptid) - self.setLayout(grid) + def pause(self): + return - self.resize(300, 150) + def blankScreen(self): + if(self.pptid<0): return + self.presentation.Blank(self.pptid) - def PrevClick(self): + def unblankScreen(self): + if(self.pptid<0): return + self.presentation.Unblank(self.pptid) + + def stop(self): + if(self.pptid<0): return + self.presentation.Stop(self.pptid) + + def go(self): + if(self.pptid<0): return + self.presentation.RestartShow(self.pptid) + + def getSlideNumber(self): + if(self.pptid<0): return -1 + return self.presentation.GetCurrentSlide(self.pptid) + + def setSlideNumber(self, slideno): + if(self.pptid<0): return + self.presentation.GotoSlide(self.pptid, slideno) + + slideNumber = property(getSlideNumber, setSlideNumber) + + def nextStep(self): + """ + Triggers the next effect of slide on the running presentation + """ + if(self.pptid<0): return + self.presentation.NextStep(self.pptid) + + def previousStep(self): + """ + Triggers the previous slide on the running presentation + """ if self.pptid<0: return - pptdll.PrevStep(self.pptid) - self.slideEdit.setText(pptdll.GetCurrentSlide(self.pptid)) + self.presentation.PrevStep(self.pptid) def NextClick(self): if(self.pptid<0): return pptdll.NextStep(self.pptid) self.slideEdit.setText(pptdll.GetCurrentSlide(self.pptid)) - def BlankClick(self): - if(self.pptid<0): return - pptdll.Blank(self.pptid) - - def UnblankClick(self): - if(self.pptid<0): return - pptdll.Unblank(self.pptid) - - def RestartClick(self): - if(self.pptid<0): return - pptdll.RestartShow(self.pptid) - self.slideEdit.setText(pptdll.GetCurrentSlide(self.pptid)) - - def StopClick(self): - if(self.pptid<0): return - pptdll.Stop(self.pptid) - - def ResumeClick(self): - if(self.pptid<0): return - pptdll.Resume(self.pptid) - - def CloseClick(self): - if(self.pptid<0): return - pptdll.Close(self.pptid) - self.pptid = -1 - - def OpenClick(self): - if(self.pptid>=0): - self.CloseClick() - rect = RECT() - rect.left = 100 - rect.top = 100 - rect.width = 900 - rect.hight = 700 - #self.pptid = pptdll.OpenPPT(self.PPTEdit.text, None, rect, "c:\temp\slide') - self.pptid = pptdll.OpenPPT(u'C:\\test 1.ppt', None, rect, 'c:\temp\slide') - self.total.setText(pptdll.GetSlideCount(self.pptid)) - self.slideEdit.setText(unicode(pptdll.GetCurrentSlide(self.pptid))) - - def GotoClick(self): - if(self.pptid<0): return - pptdll.GotoSlide(self.pptid, self.slideEdit.text) - self.slideEdit.setText(pptdll.GetCurrentSlide(self.pptid)) - - def OpenDialog(self): - self.PPTEdit.setText(QtGui.QFileDialog.getOpenFileName(self, 'Open file')) - -app = QtGui.QApplication(sys.argv) -qb = BoxLayout() -qb.show() -sys.exit(app.exec_()) diff --git a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp index 336241fd0..8e4cc7e82 100644 --- a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp +++ b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp @@ -27,6 +27,7 @@ #include #include "pptviewlib.h" + // Because of the callbacks used by SetWindowsHookEx, the memory used needs to be // sharable across processes (the callbacks are done from a different process) // Therefore use data_seg with RWS memory. @@ -310,9 +311,10 @@ BOOL GetPPTViewerPath(char *pptviewerpath, int strsize) LRESULT lresult; DEBUG("GetPPTViewerPath: start\n"); - if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "Applications\\PPTVIEW.EXE\\shell\\open\\command", 0, KEY_READ, &hkey)!=ERROR_SUCCESS) - if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "Applications\\PPTVIEW.EXE\\shell\\Show\\command", 0, KEY_READ, &hkey)!=ERROR_SUCCESS) - return FALSE; + if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "PowerPointViewer.Show.12\\shell\\Show\\command", 0, KEY_READ, &hkey)!=ERROR_SUCCESS) + if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "Applications\\PPTVIEW.EXE\\shell\\open\\command", 0, KEY_READ, &hkey)!=ERROR_SUCCESS) + if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "Applications\\PPTVIEW.EXE\\shell\\Show\\command", 0, KEY_READ, &hkey)!=ERROR_SUCCESS) + return FALSE; dwtype = REG_SZ; dwsize = (DWORD)strsize; lresult = RegQueryValueEx(hkey, NULL, NULL, &dwtype, (LPBYTE)pptviewerpath, &dwsize ); diff --git a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.dll b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.dll index 13ea7d182..52a6504ee 100644 Binary files a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.dll and b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.dll differ diff --git a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h index 5b33576af..3e365215b 100644 --- a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h +++ b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h @@ -51,4 +51,4 @@ struct PPTVIEWOBJ char filename[MAX_PATH]; char previewpath[MAX_PATH]; PPTVIEWSTATE state; -}; \ No newline at end of file +}; diff --git a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.vcproj b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.vcproj index 040898672..f20db6c8f 100644 --- a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.vcproj +++ b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.vcproj @@ -1,203 +1,202 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index 4af3781e4..96947cc66 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -31,10 +31,12 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, MediaManagerItem from openlp.plugins.presentations.lib import PresentationMediaItem, \ PresentationTab, ImpressController -try: - from openlp.plugins.presentations.lib import PowerpointController -except: - pass +if os.name == u'nt': + try: + from openlp.plugins.presentations.lib import PowerpointController + except: + pass + from openlp.plugins.presentations.lib import PptviewController class PresentationPlugin(Plugin): @@ -91,26 +93,25 @@ class PresentationPlugin(Plugin): self.registerControllers(u'Impress', openoffice) except: log.exception(u'Failed to set up plugin for Impress') - #Lets see if Powerpoint is required (Default is Not wanted) - if int(self.config.get_config( - u'Powerpoint', QtCore.Qt.Unchecked)) == QtCore.Qt.Checked: - try: - #Check to see if we are Win32 - from win32com.client import Dispatch - powerpoint = PowerpointController() - self.registerControllers(u'Powerpoint', powerpoint) - except: - log.exception(u'Failed to set up plugin for Powerpoint') - #Lets see if Powerpoint Viewer is required (Default is Not wanted) - if int(self.config.get_config( - u'Powerpoint Viewer', QtCore.Qt.Unchecked)) == QtCore.Qt.Checked: - try: - #Check to see if we are Win32 - from win32com.client import Dispatch - powerpoint = PowerpointController() - self.registerControllers(u'Powerpoint Viewer', powerpoint) - except: - log.exception(u'Failed to set up plugin for Powerpoint Viewer') + if os.name == u'nt': + #Lets see if Powerpoint is required (Default is Not wanted) + if int(self.config.get_config( + u'Powerpoint', QtCore.Qt.Unchecked)) == QtCore.Qt.Checked: + try: + #Check to see if we are Win32 + from win32com.client import Dispatch + powerpoint = PowerpointController() + self.registerControllers(u'Powerpoint', powerpoint) + except: + log.exception(u'Failed to set up plugin for Powerpoint') + #Lets see if Powerpoint Viewer is required (Default is Not wanted) + if int(self.config.get_config( + u'Powerpoint Viewer', QtCore.Qt.Unchecked)) == QtCore.Qt.Checked: + try: + pptview = PptviewController() + self.registerControllers(u'Powerpoint Viewer', pptview) + except: + log.exception(u'Failed to set up plugin for Powerpoint Viewer') #If we have no available controllers disable plugin if len(self.controllers) > 0: return True