123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- # -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
- #
- # This file is part of the LibreOffice project.
- #
- # This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # prepare Python environment - Add the path of this class
- from os import path
- from sys import modules
- from sys import path as syspath
- # pyUNO program itself
- import uno, unohelper
- # UNO GUI toolkit
- from com.sun.star.awt.WindowClass import TOP, SIMPLE
- from com.sun.star.awt.PushButtonType import STANDARD as standard
- from com.sun.star.awt.PushButtonType import OK as ok
- from com.sun.star.awt.PushButtonType import CANCEL as cancel
- from com.sun.star.awt.PushButtonType import HELP as help
- from com.sun.star.awt.TextAlign import CENTER as center
- from com.sun.star.awt.TextAlign import LEFT as left
- from com.sun.star.awt.TextAlign import RIGHT as right
- # used UNO listeners
- from com.sun.star.awt import XActionListener
- class MsgBox(unohelper.Base):
- """Inspect UNO object, link to sdk and recursive calls"""
- def __init__(self, aContext):
- """acontext : a Valid UNO context
- """
- self.VERSION = '0.1'
- self.ctx = aContext
- self.smgr = aContext.ServiceManager
- # UI Dialog object
- self.dialog=None
- # List of opened Listeners
- self.lst_listeners={}
- #UI parameters
- self.ButtonSize = 50
- self.boxSize = 200
- self.lineHeight = 10
- self.fromBroxSize = False
- self.numberOfLines = -1
- self.Buttons = []
- self.Response = ''
- return
- #####################################################
- # GUI definition #
- #####################################################
- def _createBox(self):
- """Create the Box"""
- # computes parameters of the message dialog
- if self.numberOfLines == -1:
- #calculate
- numberOfLines = len(self.message.split(chr(10)))
- else:
- numberOfLines = self.numberOfLines
- numberOfButtons = len(self.Buttons)
- self.ButtonSpace = self.ButtonSize/2
- if self.fromBroxSize:
- # button size is calculated from boxsize
- size = (2 * self.boxSize) / (3 * numberOfButtons + 1)
- self.ButtonSize = size
- self.ButtonSpace = self.ButtonSize/2
- else:
- # boxsize is calculated from buttonsize
- self.boxSize = numberOfButtons * (self.ButtonSize +
- self.ButtonSpace) + self.ButtonSpace
- # create the dialog model and set the properties
- dialog_model = self.smgr.createInstanceWithContext(
- 'com.sun.star.awt.UnoControlDialogModel',
- self.ctx)
- dialog_model.PositionX = 50
- dialog_model.Step = 1
- dialog_model.TabIndex = 7
- dialog_model.Width = self.boxSize#numberOfButtons * (self.ButtonSize +
- # self.ButtonSpace) + 25
- dialog_model.Height = 10 + self.lineHeight * numberOfLines + 10 + 12 + 10
- dialog_model.PositionY = 63
- dialog_model.Sizeable = True
- dialog_model.Closeable = False
- dialog = self.smgr.createInstanceWithContext(
- 'com.sun.star.awt.UnoControlDialog', self.ctx)
- # label Label0
- label = dialog_model.createInstance(
- 'com.sun.star.awt.UnoControlFixedTextModel')
- label.PositionX = 10
- label.TabIndex = 9
- label.Width = dialog_model.Width - label.PositionX
- label.Height = self.lineHeight* numberOfLines
- label.PositionY = 10
- label.Align = left
- label.MultiLine = True
- label.Label = self.message
- dialog_model.insertByName('Label0', label)
- nb = 0
- for buttonName in self.Buttons:
- nb +=1
- button = dialog_model.createInstance(
- 'com.sun.star.awt.UnoControlButtonModel')
- button.PositionX = nb * self.ButtonSpace + (nb-1)* self.ButtonSize
- button.TabIndex = 8
- button.Height = 12
- button.Width = self.ButtonSize
- button.PositionY = 10 + label.Height + 10
- button.PushButtonType = standard
- if nb == 1:
- button.DefaultButton = True
- else:
- button.DefaultButton = False
- button.Label = buttonName
- dialog_model.insertByName('Btn' + str(nb), button )
- if not dialog.getModel():
- dialog.setModel(dialog_model)
- # UNO toolkit definition
- toolkit = self.smgr.createInstanceWithContext('com.sun.star.awt.Toolkit', self.ctx)
- a_rect = uno.createUnoStruct( 'com.sun.star.awt.Rectangle' )
- a_rect.X = 50
- dialog.setTitle ( self.title )
- a_rect.Width = 270
- a_rect.Height = 261
- a_rect.Y = 63
- win_descriptor = uno.createUnoStruct('com.sun.star.awt.WindowDescriptor')
- win_descriptor.Type = TOP
- win_descriptor.ParentIndex = -1
- win_descriptor.Bounds = a_rect
- peer = toolkit.createWindow( win_descriptor )
- dialog.createPeer( toolkit, peer )
- return dialog
- def _addListeners(self):
- """Add listeners to dialog"""
- nb = 0
- for buttonName in self.Buttons:
- nb +=1
- a_control = self.dialog.getControl('Btn'+str(nb))
- the_listener = ButtonListener(self)
- a_control.addActionListener(the_listener)
- self.lst_listeners['Btn'+str(nb)] = the_listener
- return
- def _removeListeners(self):
- """ remove listeners on exiting"""
- nb = 0
- for buttonName in self.Buttons:
- nb +=1
- a_control = self.dialog.getControl('Btn'+str(nb))
- a_control.removeActionListener(self.lst_listeners['Btn'+str(nb)])
- return
- def show(self, message, decoration, title):
- self.message = message
- self.decoration = decoration
- self.title = title
- # Create GUI
- self.dialog = self._createBox()
- self._addListeners()
- #execute the dialog --> blocking call
- self.dialog.execute()
- #end --> release listeners and dispose dialog
- self._removeListeners()
- self.dialog.dispose()
- return self.Response
- def addButton(self, caption):
- self.Buttons.append(caption)
- return
- def renderFromBoxSize(self, size = 150):
- self.boxSize = size
- self.fromBroxSize = True
- return
- def renderFromButtonSize(self, size = 50):
- self.ButtonSize = size
- self.fromBroxSize = False
- return
- class ButtonListener(unohelper.Base, XActionListener):
- """Stops the MessageBox, sets the button label as returned value"""
- def __init__(self, caller):
- self.caller = caller
- def disposing(self, eventObject):
- pass
- def actionPerformed(self, actionEvent):
- button = actionEvent.Source
- self.caller.Response = button.Model.Label
- self.caller.dialog.endExecute()
- return
- ### TEST
- if __name__ == '__main__':
- # get the uno component context from the PyUNO runtime
- localContext = uno.getComponentContext()
- # create the UnoUrlResolver
- resolver = localContext.ServiceManager.createInstanceWithContext(
- "com.sun.star.bridge.UnoUrlResolver", localContext )
- # connect to the running office
- # LibO has to be launched in listen mode as
- # ./soffice "--accept=socket,host=localhost,port=2002;urp;"
- ctx = resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )
- myBox = MsgBox(ctx)
- myBox.addButton("Yes")
- myBox.addButton("No")
- myBox.addButton("May be")
- myBox.renderFromBoxSize(150)
- myBox.numberOflines = 2
- print(myBox.show("A very long message A very long message A very long message A very long message A very long message A very long message A very long message A very long message A very long message A very long message " + chr(10)+chr(10)+"Do you agree ?",0,"Dialog title"))
- myBox = MsgBox(ctx)
- myBox.addButton("oK")
- myBox.renderFromButtonSize()
- myBox.numberOflines = 2
- print(myBox.show("A small message",0,"Dialog title"))
- # vim: set shiftwidth=4 softtabstop=4 expandtab:
|