OO-Snippets: Drawing directly on Uno Dialogs

Commons

Keywordsdrawing, dialog, listener, com.sun.star.awt.XWindowPeer, com.sun.star.awt.XDevice, com.sun.star.awt.XGraphics, com.sun.star.awt.XPaintListener
LanguageOOBasic
ApplicationOffice
AuthorsPaolo Mantovani (initial)
Supported Versions1.1.4  1.1.x  
Supported OSAll  
Question Is it possible to draw lines or shapes (or text) directly on a Uno dialog ?
Answer

Yes, it is.

the com.sun.star.awt.XGraphics provide methods for drawing.

If you want your draw to be persistent you shall register an com.sun.star.awt.XPaintListener and place your drawing instructions in the method XPaintListener.windowPaint.

To see the whole thing at work, create an empty dialog in the OOBasic IDE and run the example code below:

Code-Snippet-Listing (snippet-source)

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

Dim oDlg As Object
Dim oPaintListener As Object
Dim oDlgGraph As Object

'__________________________________________________________________________________________________________
Sub Main

	oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
	oDlgGraph = oDlg.getPeer.createGraphics
	
'	setup some defaults
	With oDlgGraph
'		.setFillColor(RGB(255,255,255))
		.setLineColor(RGB(200,200,200))
	End With

	oPaintListener = CreateUnoListener("ThisDialog_", "com.sun.star.awt.XPaintListener")

	oDlg.addPaintListener( oPaintListener ) 
	oDlg.execute

	oDlg.removePaintListener( oPaintListener )
	
End Sub


'__________________________________________________________________________________________________________
' This is a good place for drawing instructions. 
' This routine is called whenever the dialog has to be repainted
Sub ThisDialog_windowPaint(oEvt)

	'skip if there are other paint events in queue
	If oEvt.count > 0 Then Exit Sub

	Dim oGrad As New com.sun.star.awt.Gradient
	With oGrad
		.Style = com.sun.star.awt.GradientStyle.LINEAR
		.StartColor = RGB( 255, 255, 255 )
		.EndColor = RGB( 200, 230, 230 )
		.Angle = 450 ' 45.0 degrees
'		.Border = 0
'		.XOffset = 0
'		.YOffset = 0
		.StartIntensity = 100
		.EndIntensity = 100
		.StepCount = 100
	End With

	nDlgWidth = oDlg.Peer.Size.Width
	nDlgHeight = oDlg.Peer.Size.Height
	
	'draw something
	With oDlgGraph
		.drawGradient(0,0, 100,220, oGrad)
		.drawGradient(100,220, nDlgWidth,nDlgHeight, oGrad)
		.drawText(10,10,"ciao a tutti")
		.DrawLine(100,0,100,nDlgHeight)
		.DrawLine(0,220,nDlgWidth,220)
	End With
	
	'some nested rounded rect
	For I = 10 To 100 Step 10
	
		nX = 100 + I
		nY = 0 + I
		nWidth = nDlgWidth - 100 - 2*I
		nHeight = 220 - 2*I
		nRound = 110-I
		
		oDlgGraph.setFillColor(RGB(255-I, 255, 255-I))
		oDlgGraph.drawRoundedRect(nX, nY, nWidth, nHeight ,nRound, nRound)	
		
	Next I
	
	
End Sub

'__________________________________________________________________________________________________________
Sub ThisDialog_disposing(oEvt As Object)
	'nothing to do 
End Sub



Changelog

DateUserModification
2005-03-11paolomantovaniInitial version

and