Presentations - close app down correctly, and mode to automatically detect file type

This commit is contained in:
Jonathan Corwin 2010-03-05 08:36:32 +00:00
parent e0acec1274
commit 77838615b3
7 changed files with 67 additions and 10 deletions

View File

@ -25,6 +25,7 @@
# OOo API documentation:
# http://api.openoffice.org/docs/common/ref/com/sun/star/presentation/XSlideShowController.html
# http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Basic/Getting_Information_about_UNO_Objects#Inspecting_interfaces_during_debugging
# http://docs.go-oo.org/sd/html/classsd_1_1SlideShow.html
# http://www.oooforum.org/forum/viewtopic.phtml?t=5252
# http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Working_with_Presentations
@ -62,7 +63,8 @@ class ImpressController(PresentationController):
"""
log.debug(u'Initialising')
PresentationController.__init__(self, plugin, u'Impress')
self.supports = [u'.odp', u'.ppt', u'.pps', u'.pptx', u'.ppsx']
self.supports = [u'.odp']
self.alsosupports = [u'.ppt', u'.pps', u'.pptx', u'.ppsx']
self.process = None
self.desktop = None
@ -145,10 +147,17 @@ class ImpressController(PresentationController):
doc.close_presentation()
if os.name != u'nt':
desktop = self.get_uno_desktop()
else:
desktop = self.get_com_desktop()
docs = desktop.getComponents()
if docs.hasElements():
log.debug(u'OpenOffice not terminated')
else:
try:
desktop.terminate()
log.debug(u'OpenOffice killed')
except:
pass
log.exception(u'Failed to terminate OpenOffice')
def add_doc(self, name):
log.debug(u'Add Doc OpenOffice')

View File

@ -56,7 +56,7 @@ class PresentationMediaItem(MediaManagerItem):
# be instanced by the base MediaManagerItem
self.ListViewWithDnD_class = PresentationListView
MediaManagerItem.__init__(self, parent, icon, title)
self.message_listener = MessageListener(controllers)
self.message_listener = MessageListener(self)
def initPluginNameVisible(self):
self.PluginNameVisible = self.trUtf8('Presentation')
@ -66,7 +66,8 @@ class PresentationMediaItem(MediaManagerItem):
fileType = u''
for controller in self.controllers:
if self.controllers[controller].enabled:
for type in self.controllers[controller].supports:
types = self.controllers[controller].supports + self.controllers[controller].alsosupports
for type in types:
if fileType.find(type) == -1:
fileType += u'*%s ' % type
self.OnNewFileMasks = self.trUtf8('Presentations (%s)' % fileType)
@ -106,6 +107,9 @@ class PresentationMediaItem(MediaManagerItem):
#load the drop down selection
if self.controllers[item].enabled:
self.DisplayTypeComboBox.addItem(item)
if self.DisplayTypeComboBox.count > 1:
self.DisplayTypeComboBox.insertItem(0, u'Automatic')
self.DisplayTypeComboBox.setCurrentIndex(0)
def loadList(self, list):
currlist = self.getFileList()
@ -145,10 +149,16 @@ class PresentationMediaItem(MediaManagerItem):
return False
service_item.title = unicode(self.DisplayTypeComboBox.currentText())
service_item.shortname = unicode(self.DisplayTypeComboBox.currentText())
controller = self.controllers[service_item.shortname]
shortname = service_item.shortname
for item in items:
bitem = self.ListView.item(item.row())
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
if shortname==u'Automatic':
service_item.shortname = self.findControllerByType(filename)
if not service_item.shortname:
return False
controller = self.controllers[service_item.shortname]
(path, name) = os.path.split(filename)
doc = controller.add_doc(filename)
if doc.get_slide_preview_file(1) is None:
@ -159,5 +169,19 @@ class PresentationMediaItem(MediaManagerItem):
service_item.add_from_command(path, name, img)
i = i + 1
img = doc.get_slide_preview_file(i)
controller.remove_doc(doc)
controller.remove_doc(doc)
return True
def findControllerByType(self, filename):
filetype = os.path.splitext(filename)[1]
if not filetype:
return None
for controller in self.controllers:
if self.controllers[controller].enabled:
if filetype in self.controllers[controller].supports:
return controller
for controller in self.controllers:
if self.controllers[controller].enabled:
if filetype in self.controllers[controller].alsosupports:
return controller
return None

View File

@ -156,8 +156,9 @@ class MessageListener(object):
log = logging.getLogger(u'MessageListener')
log.info(u'Message Listener loaded')
def __init__(self, controllers):
self.controllers = controllers
def __init__(self, mediaitem):
self.controllers = mediaitem.controllers
self.mediaitem = mediaitem
self.previewHandler = Controller(False)
self.liveHandler = Controller(True)
# messages are sent from core.ui.slidecontroller
@ -190,6 +191,12 @@ class MessageListener(object):
"""
log.debug(u'Startup called with message %s' % message)
self.handler, file, isLive = self.decodeMessage(message)
filetype = os.path.splitext(file)[1][1:]
if self.handler==u'Automatic':
self.handler = self.mediaitem.findControllerByType(file)
if not self.handler:
return
if isLive:
self.liveHandler.addHandler(self.controllers[self.handler], file)
else:

View File

@ -52,7 +52,7 @@ class PowerpointController(PresentationController):
"""
log.debug(u'Initialising')
PresentationController.__init__(self, plugin, u'Powerpoint')
self.supports = [u'.ppt', u'.pps']
self.supports = [u'.ppt', u'.pps', u'.pptx', u'.ppsx']
self.process = None
def check_available(self):
@ -100,6 +100,8 @@ class PowerpointController(PresentationController):
doc.close_presentation()
if self.process is None:
return
if self.process.Presentations.Count > 0:
return
try:
self.process.Quit()
except:

View File

@ -49,7 +49,7 @@ class PptviewController(PresentationController):
log.debug(u'Initialising')
self.process = None
PresentationController.__init__(self, plugin, u'Powerpoint Viewer')
self.supports = [u'.ppt', u'.pps']
self.supports = [u'.ppt', u'.pps', u'.pptx', u'.ppsx']
def check_available(self):
"""

View File

@ -93,6 +93,7 @@ class PresentationController(object):
Name of the application, to appear in the application
"""
self.supports = []
self.alsosupports = []
self.docs = []
self.plugin = plugin
self.name = name

View File

@ -114,3 +114,17 @@ class PresentationPlugin(Plugin):
'programs. The choice of available presentation programs is '
'available to the user in a drop down box.')
return about_text
def find_controller_by_type(self, filename):
filetype = os.path.splitext(filename)[1][1:]
if not filetype:
return None
for controller in self.controllers:
if self.controllers[controller].enabled:
if filetype in self.controllers[controller].supports:
return controller
for controller in self.controllers:
if self.controllers[controller].enabled:
if filetype in self.controllers[self.handler].alsosupports:
return controller
return None