Re: Dialog control like JPanel in UNO awt

Paolo Mantovani <[email protected]>
Newsgroups gmane.comp.openoffice.devel.api
Message-ID <[email protected]>
Hi,

Il 26/10/2010 05:33, Pivithuru Wijegunawardana ha scritto:
> Hi,
>
> I am searching for a JPanel in java  like performing dialog control in
> Openoffice to contain some other controls inside. And this control model
> should be able to make visible and invisible such that the controls inside
> it also does the same action. I looked into UnoControlGroupBoxModel, but it
> seem to be only a visual component to group controls.
> Is the above task possible in UNO awt? If it is possible what control I
> should use for that?

The basic and most spread technique to control the visibility of groups 
of controls is by means of "dialog steps"

You may think to dialog steps just like to layers.
Each layer may contain controls.

Both dialog and control models offer a "Step" property that can be set 
to an integer value at design time or even at runtime.

If you set the Step property of the dialog to a given value, only 
controls with the same Step value are shown

The Step=0 have a special meaning:

If you set the *dialog* Step to 0 , all controls will be made visible, 
regardless their Step actual value.

If you set one control Step to 0 , that control wil be always visible, 
regardless the current Step value of the dialog.

A more versatile technique is by using the service: 
com.sun.star.awt.UnoControlContainer

Is not easy to use this control in dialogs, because it is not available 
in the toolbox of the dialog designer (you cannot use it at design time)

Another problem is that UnoControlContainer is not even registered at 
the XMultiServiceFactory of the UnoDialog model, so in theory you 
couldn't even use it at runtime.

In order to workaround the above mentioned limitations, I use a 
technique that makes use of normal FixedText controls as "placeholders" 
at design time.
(Actually you can use any kind of control as placeholders but the 
fixedtext is the more suitable since it doesn't react to mouse/keyboard 
events and it doesn't eat much resources )

At runtime, placeholder controls are replaced (or better: overlayed) by 
a UnoControlContainer instanciated from the main MultiServiceFactory

Please, see the example below:
(before to run it you should prepare an Uno dialog named "Dialog1" with 
two labels (UnoFixedText controls) named "Label1" and "Label2"

More examples of that technique are in the source code of the 
BasicAddonBuilder extension:
http://www.paolo-mantovani.org/downloads/BasicAddonBuilder/


regards
Paolo Mantovani


------------------8<------------------


REM  *****  BASIC  *****

Sub Main
   oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)

   xray oDlg
   oLbl1 = oDlg.getControl("Label1")
   oLbl2 = oDlg.getControl("Label2")

   'create a child window in the area of the oLbl1
   aPosSize = GetRect(0, 0, oLbl1.Size.Width, oLbl1.Size.Height)
   oViewFrame = CreateChildFrame(oLbl1.Peer, aPosSize)

   'create a control container service that will host the whole TranslateBox
   oCont1 = CreateUnoControl("Container")
   With oCont1.Model
     .Border = 1 ' 3D border
     '.BackgroundColor = //
   End With
   oCont1.createPeer(oViewFrame.ContainerWindow.Toolkit, 
oViewFrame.ContainerWindow)
   oViewFrame.setComponent(oCont1, Null)

   'create a child window in the area of the oLbl1
   aPosSize = GetRect(0, 0, oLbl2.Size.Width, oLbl2.Size.Height)
   oViewFrame = CreateChildFrame(oLbl2.Peer, aPosSize)

   'create a control container service that will host the whole TranslateBox
   oCont2 = CreateUnoControl("Container")
   With oCont2.Model
     .Border = 1 ' 3D border
     '.BackgroundColor = //
   End With
   oCont2.createPeer(oViewFrame.ContainerWindow.Toolkit, 
oViewFrame.ContainerWindow)
   oViewFrame.setComponent(oCont2, Null)

   oButton1 = InsertNewControl(oCont1, "Button", "Button1")
   oButton1.Label = "1"
   oButton2 = InsertNewControl(oCont2, "Button", "Button2")
   oButton2.Label = "2"

   oDlg.execute

End Sub


'______________________________________________________________________________
Function CreateChildFrame(oParentWin As Object, aPosSize As Object) As 
Object
Dim oChildWin As Object
Dim oToolkit As Object
Dim oChildFrame As Object

   oToolkit = oParentWin.getToolkit

   Dim aDescriptor as new com.sun.star.awt.WindowDescriptor
   With aDescriptor
     .Type = com.sun.star.awt.WindowClass.SIMPLE
     .WindowServiceName = ""
     '.ParentIndex = 0
     .Parent = oParentWin
     .Bounds = aPosSize
     .WindowAttributes = com.sun.star.awt.WindowAttribute.SHOW '+ 
com.sun.star.awt.WindowAttribute.BORDER
   End With

   oChildWin = oToolkit.createWindow(aDescriptor)

   oChildFrame = createUnoService("com.sun.star.frame.Frame")
   oChildFrame.initialize(oChildWin)

   CreateChildFrame = oChildFrame

End Function


'______________________________________________________________________________
Function GetRect(nX, nY, nWidth, nHeight) As Object
Dim aRect as new com.sun.star.awt.Rectangle

   With aRect
     .X = nX
     .Y = nY
     .Width = nWidth
     .Height = nHeight
   End With

   GetRect = aRect
End Function

'______________________________________________________________________________
Function CreateUnoControl(sControlType As String) As Object
Dim oCtrl As Object
Dim oCModel As Object
   oCtrl = CreateUnoService("com.sun.star.awt.UnoControl" & sControlType)
   oCModel = CreateUnoService("com.sun.star.awt.UnoControl" & 
sControlType & "Model")
   oCtrl.setModel(oCModel)
   CreateUnoControl = oCtrl

End Function


'______________________________________________________________________________
Function InsertNewControl(oContainer As Object, sControlType As String, 
sName As String) As Object
Dim oCtrl As Object

   oCtrl = CreateUnoControl(sControlType)
   oContainer.addControl(sName, oCtrl)

   InsertNewControl = oCtrl

End Function



'______________________________________________________________________________
Function CreateChildFrame(oParentWin As Object, aPosSize As Object) As 
Object
Dim oChildWin As Object
Dim oToolkit As Object
Dim oChildFrame As Object

	oToolkit = oParentWin.getToolkit
	
	Dim aDescriptor as new com.sun.star.awt.WindowDescriptor
	With aDescriptor
		.Type = com.sun.star.awt.WindowClass.SIMPLE
		.WindowServiceName = ""
		'.ParentIndex = 0
		.Parent = oParentWin
		.Bounds = aPosSize
		.WindowAttributes = com.sun.star.awt.WindowAttribute.SHOW '+ 
com.sun.star.awt.WindowAttribute.BORDER
	End With
	
	oChildWin = oToolkit.createWindow(aDescriptor)
	
	oChildFrame = createUnoService("com.sun.star.frame.Frame")
	oChildFrame.initialize(oChildWin)
	
	CreateChildFrame = oChildFrame

End Function


'______________________________________________________________________________
Function GetRect(nX, nY, nWidth, nHeight) As Object
Dim aRect as new com.sun.star.awt.Rectangle
	
	With aRect
		.X = nX
		.Y = nY
		.Width = nWidth
		.Height = nHeight
	End With
	
	GetRect = aRect
End Function

'______________________________________________________________________________
Function CreateUnoControl(sControlType As String) As Object
Dim oCtrl As Object
Dim oCModel As Object
	oCtrl = CreateUnoService("com.sun.star.awt.UnoControl" & sControlType)
	oCModel = CreateUnoService("com.sun.star.awt.UnoControl" & sControlType 
& "Model")
	oCtrl.setModel(oCModel)
	CreateUnoControl = oCtrl
	
End Function


'______________________________________________________________________________
Function InsertNewControl(oContainer As Object, sControlType As String, 
sName As String) As Object
Dim oCtrl As Object

	oCtrl = CreateUnoControl(sControlType)
	oContainer.addControl(sName, oCtrl)
	
	InsertNewControl = oCtrl
	
End Function
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.