Merge from lp:~j-corwin/openlp/presentations

bzr-revno: 566
This commit is contained in:
Jonathan Corwin 2009-09-24 10:54:38 +02:00 committed by Raoul Snyman
commit 3a9cd0ff03
7 changed files with 347 additions and 337 deletions

View File

@ -24,6 +24,7 @@
from impresscontroller import ImpressController from impresscontroller import ImpressController
#from powerpointcontroller import PowerpointController #from powerpointcontroller import PowerpointController
from pptviewcontroller import PptviewController
from messagelistener import MessageListener from messagelistener import MessageListener
from mediaitem import PresentationMediaItem from mediaitem import PresentationMediaItem
from presentationtab import PresentationTab from presentationtab import PresentationTab

View File

@ -22,128 +22,135 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
import logging
import os, subprocess
import time
import sys import sys
import win32api import win32api
from PyQt4 import QtGui, QtCore
from ctypes import * from ctypes import *
from ctypes.wintypes import RECT 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): class PptviewController(object):
def __init__(self, parent=None): """
QtGui.QWidget.__init__(self, parent) 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.pptid = -1
self.setWindowTitle(u'box layout')
PPTLabel = QtGui.QLabel(u'Open PowerPoint file') def isActive(self):
slideLabel = QtGui.QLabel(u'Go to slide #') return self.pptid >= 0
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()
grid = QtGui.QGridLayout() def resume(self):
grid.addWidget(PPTLabel, 0, 0) if(self.pptid<0): return
grid.addWidget(self.PPTEdit, 0, 1) self.presentation.Resume(self.pptid)
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)
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 if self.pptid<0: return
pptdll.PrevStep(self.pptid) self.presentation.PrevStep(self.pptid)
self.slideEdit.setText(pptdll.GetCurrentSlide(self.pptid))
def NextClick(self): def NextClick(self):
if(self.pptid<0): return if(self.pptid<0): return
pptdll.NextStep(self.pptid) pptdll.NextStep(self.pptid)
self.slideEdit.setText(pptdll.GetCurrentSlide(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_())

View File

@ -27,6 +27,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include "pptviewlib.h" #include "pptviewlib.h"
// Because of the callbacks used by SetWindowsHookEx, the memory used needs to be // Because of the callbacks used by SetWindowsHookEx, the memory used needs to be
// sharable across processes (the callbacks are done from a different process) // sharable across processes (the callbacks are done from a different process)
// Therefore use data_seg with RWS memory. // Therefore use data_seg with RWS memory.
@ -310,6 +311,7 @@ BOOL GetPPTViewerPath(char *pptviewerpath, int strsize)
LRESULT lresult; LRESULT lresult;
DEBUG("GetPPTViewerPath: start\n"); DEBUG("GetPPTViewerPath: start\n");
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\\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) if(RegOpenKeyEx(HKEY_CLASSES_ROOT, "Applications\\PPTVIEW.EXE\\shell\\Show\\command", 0, KEY_READ, &hkey)!=ERROR_SUCCESS)
return FALSE; return FALSE;

View File

@ -93,7 +93,7 @@
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="2" ConfigurationType="2"
CharacterSet="1" CharacterSet="2"
WholeProgramOptimization="1" WholeProgramOptimization="1"
> >
<Tool <Tool
@ -118,7 +118,7 @@
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;PPTVIEWLIB_EXPORTS" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;PPTVIEWLIB_EXPORTS"
RuntimeLibrary="2" RuntimeLibrary="2"
EnableFunctionLevelLinking="true" EnableFunctionLevelLinking="true"
UsePrecompiledHeader="2" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
DebugInformationFormat="3" DebugInformationFormat="3"
/> />
@ -134,7 +134,6 @@
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
LinkIncremental="1" LinkIncremental="1"
ModuleDefinitionFile="pptviewlib.def"
GenerateDebugInformation="true" GenerateDebugInformation="true"
SubSystem="2" SubSystem="2"
OptimizeReferences="2" OptimizeReferences="2"

View File

@ -31,10 +31,12 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import Plugin, MediaManagerItem from openlp.core.lib import Plugin, MediaManagerItem
from openlp.plugins.presentations.lib import PresentationMediaItem, \ from openlp.plugins.presentations.lib import PresentationMediaItem, \
PresentationTab, ImpressController PresentationTab, ImpressController
try: if os.name == u'nt':
try:
from openlp.plugins.presentations.lib import PowerpointController from openlp.plugins.presentations.lib import PowerpointController
except: except:
pass pass
from openlp.plugins.presentations.lib import PptviewController
class PresentationPlugin(Plugin): class PresentationPlugin(Plugin):
@ -91,6 +93,7 @@ class PresentationPlugin(Plugin):
self.registerControllers(u'Impress', openoffice) self.registerControllers(u'Impress', openoffice)
except: except:
log.exception(u'Failed to set up plugin for Impress') log.exception(u'Failed to set up plugin for Impress')
if os.name == u'nt':
#Lets see if Powerpoint is required (Default is Not wanted) #Lets see if Powerpoint is required (Default is Not wanted)
if int(self.config.get_config( if int(self.config.get_config(
u'Powerpoint', QtCore.Qt.Unchecked)) == QtCore.Qt.Checked: u'Powerpoint', QtCore.Qt.Unchecked)) == QtCore.Qt.Checked:
@ -105,10 +108,8 @@ class PresentationPlugin(Plugin):
if int(self.config.get_config( if int(self.config.get_config(
u'Powerpoint Viewer', QtCore.Qt.Unchecked)) == QtCore.Qt.Checked: u'Powerpoint Viewer', QtCore.Qt.Unchecked)) == QtCore.Qt.Checked:
try: try:
#Check to see if we are Win32 pptview = PptviewController()
from win32com.client import Dispatch self.registerControllers(u'Powerpoint Viewer', pptview)
powerpoint = PowerpointController()
self.registerControllers(u'Powerpoint Viewer', powerpoint)
except: except:
log.exception(u'Failed to set up plugin for Powerpoint Viewer') log.exception(u'Failed to set up plugin for Powerpoint Viewer')
#If we have no available controllers disable plugin #If we have no available controllers disable plugin