Difference between revisions of "PythonDialogBox"

From Apache OpenOffice Wiki
Jump to: navigation, search
(UNO component composition)
m (Anatomy of the snippet)
(4 intermediate revisions by 3 users not shown)
Line 17: Line 17:
 
 
 
s = res
 
s = res
MessageBox(parentwin, s, t, "infobox")
+
MessageBox(parentwin, s, t, INFOBOX)
  
 
# Show a message box with the UNO based toolkit
 
# Show a message box with the UNO based toolkit
Line 53: Line 53:
 
Analyzing the script we can consider the following:
 
Analyzing the script we can consider the following:
 
* Studying the series of UNO components for the UNO widgets
 
* Studying the series of UNO components for the UNO widgets
* Difference between TextMessageBox() and MessageBox()
+
* Difference between '''TextMessageBox()''' and '''MessageBox()'''
 
* Dialog object properties  
 
* Dialog object properties  
  
Line 60: Line 60:
  
 
=== Anatomy of the snippet ===
 
=== Anatomy of the snippet ===
The snippet have two different classes the one in charge of creating the message box called '''MessageBox()''' which design the specs of the dialog and the '''TestMessageBox()''' which pass the arguments to the dialog. The MessageBox() set the following properties:
+
The snippet has two different functions : the one in charge of creating the message box called '''MessageBox()''' which design the specs of the dialog and the '''TestMessageBox()''' which pass the arguments to the dialog. The MessageBox() set the following properties:
 
* [http://www.openoffice.org/api/docs/common/ref/com/sun/star/awt/WindowDescriptor.html#Type Type] - specifies the type of window.
 
* [http://www.openoffice.org/api/docs/common/ref/com/sun/star/awt/WindowDescriptor.html#Type Type] - specifies the type of window.
 
* [http://www.openoffice.org/api/docs/common/ref/com/sun/star/awt/WindowDescriptor.html#WindowServiceName WindowServiceName] - specifies the name of the component service.  
 
* [http://www.openoffice.org/api/docs/common/ref/com/sun/star/awt/WindowDescriptor.html#WindowServiceName WindowServiceName] - specifies the name of the component service.  
Line 66: Line 66:
 
* [http://www.openoffice.org/api/docs/common/ref/com/sun/star/awt/WindowDescriptor.html#Bounds Bounds] - specifies the position and size of the window.
 
* [http://www.openoffice.org/api/docs/common/ref/com/sun/star/awt/WindowDescriptor.html#Bounds Bounds] - specifies the position and size of the window.
 
* [http://www.openoffice.org/api/docs/common/ref/com/sun/star/awt/WindowDescriptor.html#WindowAttributes WindowAttributes] - specifies the window attributes.
 
* [http://www.openoffice.org/api/docs/common/ref/com/sun/star/awt/WindowDescriptor.html#WindowAttributes WindowAttributes] - specifies the window attributes.
The following properties can be find on the WindowDescriptor struct on the API documentation.
+
The above properties can be found in the WindowDescriptor struct on the API documentation.
 +
 
 +
==MsgBox in Python, simplified==
 +
Since Paolo Mantovani created his snippet, interface <idls>com.sun.star.awt.XMessageBoxFactory</idls> was added to the API.
 +
 
 +
The code is now simpler:
 +
<source lang=Python>
 +
import uno
 +
 
 +
from com.sun.star.awt.MessageBoxButtons import BUTTONS_OK, BUTTONS_OK_CANCEL, BUTTONS_YES_NO, BUTTONS_YES_NO_CANCEL, BUTTONS_RETRY_CANCEL, BUTTONS_ABORT_IGNORE_RETRY
 +
from com.sun.star.awt.MessageBoxButtons import DEFAULT_BUTTON_OK, DEFAULT_BUTTON_CANCEL, DEFAULT_BUTTON_RETRY, DEFAULT_BUTTON_YES, DEFAULT_BUTTON_NO, DEFAULT_BUTTON_IGNORE
 +
 
 +
from com.sun.star.awt.MessageBoxType import MESSAGEBOX, INFOBOX, WARNINGBOX, ERRORBOX, QUERYBOX
 +
 
 +
 +
def TestMessageBox():
 +
  doc = XSCRIPTCONTEXT.getDocument()
 +
  parentwin = doc.CurrentController.Frame.ContainerWindow
 +
 +
  s = "This a message"
 +
  t = "Title of the box"
 +
  res = MessageBox(parentwin, s, t, QUERYBOX, BUTTONS_YES_NO_CANCEL + DEFAULT_BUTTON_NO)
 +
 +
  s = res
 +
  MessageBox(parentwin, s, t, "infobox")
 +
 +
# Show a message box with the UNO based toolkit
 +
def MessageBox(ParentWin, MsgText, MsgTitle, MsgType=MESSAGEBOX, MsgButtons=BUTTONS_OK):
 +
 +
  ctx = uno.getComponentContext()
 +
  sm = ctx.ServiceManager
 +
  sv = sm.createInstanceWithContext("com.sun.star.awt.Toolkit", ctx)
 +
  myBox = sv.createMessageBox(ParentWin, MsgType, MsgButtons, MsgTitle, MsgText)
 +
  return myBox.execute()
 +
 +
g_exportedScripts = TestMessageBox,</source>
 +
 
 +
===Analysis===
 +
All the constants and enums that can be used by the box are imported.
 +
 
 +
The function TestMessageBox() invokes the service <idl>com.sun.star.awt.Toolkit</idl> which exposes the interface <idls>com.sun.star.awt.XMessageBoxFactory</idls>.
 +
To invoke the service, we need the Service Manager, and the context.
 +
 
 +
Method createMessageBox of interface XMessageBoxFactory initializes a box with all its options.
 +
[[Category:Python]]

Revision as of 10:19, 26 September 2014

Originally created by Paolo Mantovani for the Code Snippet Project. The snippet explains how to generate a MsgBox within the Python-Uno environment.

from com.sun.star.awt import Rectangle
from com.sun.star.awt import WindowDescriptor
 
from com.sun.star.awt.WindowClass import MODALTOP
from com.sun.star.awt.VclWindowPeerAttribute import OK, OK_CANCEL, YES_NO, YES_NO_CANCEL, RETRY_CANCEL, DEF_OK, DEF_CANCEL, DEF_RETRY, DEF_YES, DEF_NO
 
def TestMessageBox():
	doc = XSCRIPTCONTEXT.getDocument()
	parentwin = doc.CurrentController.Frame.ContainerWindow
 
	s = "This is a test"
	t = "Test"
	res = MessageBox(parentwin, s, t, "querybox", YES_NO_CANCEL + DEF_NO)
 
	s = res
	MessageBox(parentwin, s, t, INFOBOX)
 
# Show a message box with the UNO based toolkit
def MessageBox(ParentWin, MsgText, MsgTitle, MsgType="messbox", MsgButtons=OK):
 
	MsgType = MsgType.lower()
 
	#available msg types
	MsgTypes = ("messbox", "infobox", "errorbox", "warningbox", "querybox")
 
	if not ( MsgType in MsgTypes ):
		MsgType = "messbox"
 
	#describe window properties.
	aDescriptor = WindowDescriptor()
	aDescriptor.Type = MODALTOP
	aDescriptor.WindowServiceName = MsgType
	aDescriptor.ParentIndex = -1
	aDescriptor.Parent = ParentWin
	#aDescriptor.Bounds = Rectangle()
	aDescriptor.WindowAttributes = MsgButtons
 
	tk = ParentWin.getToolkit()
	msgbox = tk.createWindow(aDescriptor)
 
	msgbox.setMessageText(MsgText)
	if MsgTitle :
		msgbox.setCaptionText(MsgTitle)
 
	return msgbox.execute()
 
g_exportedScripts = TestMessageBox,

Analysis

Analyzing the script we can consider the following:

  • Studying the series of UNO components for the UNO widgets
  • Difference between TextMessageBox() and MessageBox()
  • Dialog object properties

UNO component composition

First thing we notice is the amount of widgets imported from the awt module. The WindowDescriptor struct is well documented on the API documentation.

Anatomy of the snippet

The snippet has two different functions : the one in charge of creating the message box called MessageBox() which design the specs of the dialog and the TestMessageBox() which pass the arguments to the dialog. The MessageBox() set the following properties:

  • Type - specifies the type of window.
  • WindowServiceName - specifies the name of the component service.
  • ParentIndex - specifies the index of the parent window, if available.
  • Bounds - specifies the position and size of the window.
  • WindowAttributes - specifies the window attributes.

The above properties can be found in the WindowDescriptor struct on the API documentation.

MsgBox in Python, simplified

Since Paolo Mantovani created his snippet, interface XMessageBoxFactory was added to the API.

The code is now simpler:

import uno
 
from com.sun.star.awt.MessageBoxButtons import BUTTONS_OK, BUTTONS_OK_CANCEL, BUTTONS_YES_NO, BUTTONS_YES_NO_CANCEL, BUTTONS_RETRY_CANCEL, BUTTONS_ABORT_IGNORE_RETRY
from com.sun.star.awt.MessageBoxButtons import DEFAULT_BUTTON_OK, DEFAULT_BUTTON_CANCEL, DEFAULT_BUTTON_RETRY, DEFAULT_BUTTON_YES, DEFAULT_BUTTON_NO, DEFAULT_BUTTON_IGNORE
 
from com.sun.star.awt.MessageBoxType import MESSAGEBOX, INFOBOX, WARNINGBOX, ERRORBOX, QUERYBOX
 
 
def TestMessageBox():
  doc = XSCRIPTCONTEXT.getDocument()
  parentwin = doc.CurrentController.Frame.ContainerWindow
 
  s = "This a message"
  t = "Title of the box"
  res = MessageBox(parentwin, s, t, QUERYBOX, BUTTONS_YES_NO_CANCEL + DEFAULT_BUTTON_NO)
 
  s = res
  MessageBox(parentwin, s, t, "infobox")
 
# Show a message box with the UNO based toolkit
def MessageBox(ParentWin, MsgText, MsgTitle, MsgType=MESSAGEBOX, MsgButtons=BUTTONS_OK):
 
  ctx = uno.getComponentContext()
  sm = ctx.ServiceManager
  sv = sm.createInstanceWithContext("com.sun.star.awt.Toolkit", ctx) 
  myBox = sv.createMessageBox(ParentWin, MsgType, MsgButtons, MsgTitle, MsgText)
  return myBox.execute()
 
g_exportedScripts = TestMessageBox,

Analysis

All the constants and enums that can be used by the box are imported.

The function TestMessageBox() invokes the service com.sun.star.awt.Toolkit which exposes the interface XMessageBoxFactory. To invoke the service, we need the Service Manager, and the context.

Method createMessageBox of interface XMessageBoxFactory initializes a box with all its options.

Personal tools