<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
<!--***********************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 ***********************************************************-->
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="ShowInfoDialog" script:language="StarBasic">REM  *****  BASIC  *****
Dim oWnd As Object
Dim oWnd2 As Object
Dim oWnd3 As Object
Dim oDoc as Object
    
Sub ShowInfoMain
	prop() = GetShowInfoPropeties()
	Init(prop(0).Value, prop(1).Value, prop(2).Value, prop(3).Value, prop(4).Value, prop(5).Value, prop(6).Value, prop(7).Value, prop(8).Value)		
End Sub

Sub Init(tFieldText As String, windowX, windowY, windowWidth, windowHeight, tFieldX, tFieldY, tFieldWidth, tFieldHeight)
	toolkit = createUnoService(&quot;com.sun.star.awt.Toolkit&quot;)
    Dim oWndDescr As new com.sun.star.awt.WindowDescriptor
    Dim oBounds As new com.sun.star.awt.Rectangle
    oWndDescr.Type = com.sun.star.awt.WindowClass.TOP
    oWndDescr.WindowServiceName = &quot;&quot;
    oWndDescr.ParentIndex = 0
    
    &apos;officeX = StarDesktop.ActiveFrame.getContainerWindow().AccessibleContext.LocationOnScreen.X
	&apos;officeY = StarDesktop.ActiveFrame.getContainerWindow().AccessibleContext.LocationOnScreen.Y
	&apos;officeWidth  = StarDesktop.ActiveFrame.getContainerWindow().getPosSize().Width
	&apos;officeHeight = StarDesktop.ActiveFrame.getContainerWindow().getPosSize().Height
	officeWidth  = thisComponent.CurrentController.Frame.getContainerWindow().getPosSize().Width
	officeHeight = thisComponent.CurrentController.Frame.getContainerWindow().getPosSize().Height

	&apos;dialogWidth  = myTutoShowDialog.getPosSize().Width
	&apos;dialogHeight = myTutoShowDialog.getPosSize().Height
	X = officeWidth - windowWidth - windowX
	Y = officeHeight - windowHeight - windowY
    
    oBounds.X = X : oBounds.Y = Y
    oBounds.Width = windowWidth : oBounds.Height = windowHeight
    oWndDescr.Bounds = oBounds
    oWndDescr.Parent = thisComponent.CurrentController.Frame.ContainerWindow
    with com.sun.star.awt.WindowAttribute
        oWndDescr.WindowAttributes = .CLOSEABLE AND .MOVEABLE AND .SIZEABLE AND .BORDER AND .SHOW
    end with
           
    oWnd = toolkit.createWindow(oWndDescr)	

	Dim oWndDescr3 As new com.sun.star.awt.WindowDescriptor
    Dim oBounds3 As new com.sun.star.awt.Rectangle
	oWndDescr3.Type = com.sun.star.awt.WindowClass.TOP
    oWndDescr3.WindowServiceName = &quot;fixedimage&quot; &apos;&quot;fixedtext&quot;
    oWndDescr3.ParentIndex = 0
    oBounds3.X = 0 : oBounds3.Y = 0
    oBounds3.Width = tFieldWidth : oBounds3.Height = tFieldHeight
    oWndDescr3.Bounds = oBounds3
    oWndDescr3.Parent = oWnd
    with com.sun.star.awt.WindowAttribute
        oWndDescr3.WindowAttributes = .CLOSEABLE AND .MOVEABLE AND .SIZEABLE AND .BORDER AND .SHOW
    end with

    oWnd3= toolkit.createWindow(oWndDescr3)    
    &apos;oWnd2.Text = tFieldText 	
	&apos;printdbgInfo(oWnd3)
	setImage(oWnd3)
	&apos;oWnd3.Background = 16777215	
&apos;	oWnd2.SetBackGround(16776960)
	oWnd.SetBackGround(16776960)
&apos;	oWnd.FontDescriptors(0).Name = &quot;Albany&quot;
&apos;	oWnd.FontDescriptors(0).StyleName = &quot;BOLD&quot;	

	Dim oWndDescr2 As new com.sun.star.awt.WindowDescriptor
    Dim oBounds2 As new com.sun.star.awt.Rectangle
	oWndDescr2.Type = com.sun.star.awt.WindowClass.TOP
    oWndDescr2.WindowServiceName = &quot;fixedtext&quot;
    oWndDescr2.ParentIndex = 0
    oBounds2.X = tFieldX : oBounds2.Y = tFieldY
    oBounds2.Width = tFieldWidth : oBounds2.Height = tFieldHeight
    oWndDescr2.Bounds = oBounds2
    oWndDescr2.Parent = oWnd3
    with com.sun.star.awt.WindowAttribute
        oWndDescr2.WindowAttributes = .CLOSEABLE AND .MOVEABLE AND .SIZEABLE AND .BORDER AND .SHOW
    end with

    oWnd2= toolkit.createWindow(oWndDescr2)
    oWnd2.Text = tFieldText 
    oWnd2.Background = 268435455
    &apos;printdbgInfo(oWnd2)
    
    &apos;printdbgInfo oWnd.getPosSize()
	
End Sub

Function GetShowInfoPropeties()
	stepText = GetStepTitle()
	Dim Properties(8) As new com.sun.star.beans.NamedValue	
	Properties(0).Name = &quot;ShowInfoDialogText&quot;
	Properties(0).Value = stepText &amp; &quot;Press [Esc] to abort.&quot;	
	Properties(1).Name = &quot;WindowX&quot;
	Properties(1).Value = 20		
	Properties(2).Name = &quot;WindowY&quot;
	Properties(2).Value = 40		
	Properties(3).Name = &quot;WindowWidth&quot;
	Properties(3).Value = 190	
	Properties(4).Name = &quot;WindowHeight&quot;
	Properties(4).Value = 50
	Properties(5).Name = &quot;TFieldX&quot;
	Properties(5).Value = 7
	Properties(6).Name = &quot;TFieldY&quot;
	Properties(6).Value = 8
	Properties(7).Name = &quot;TFieldWidth&quot;
	Properties(7).Value = 190
	Properties(8).Name = &quot;TFieldHeight&quot;
	Properties(8).Value = 50
	GetShowInfoPropeties = Properties()	
End Function

Sub setShowInfoText()
	stepText = GetStepTitle()
	oWnd2.Text = stepText &amp; &quot;Press [Esc] to abort.&quot;
End Sub

Sub ShowON()
	setShowInfoText()
	oWnd.setVisible(True)
	oWnd3.setVisible(True)	
	oWnd2.setVisible(True)
End Sub

Sub ShowOFF()
	&apos;On Local Error Goto NOPROPERTYSETINFO:
		oWnd.setVisible(False)
		oWnd2.setVisible(False)
		oWnd3.setVisible(False)
		&apos;oDoc.dispose()
	Exit Sub
	&apos;NOPROPERTYSETINFO:
End Sub

Sub DisposeIDialog()
    &apos;On Local Error Goto NOPROPERTYSETINFO:	
		oWnd3.dispose
		oWnd2.dispose
		oWnd.dispose
		oDoc.dispose()	
	Exit Sub
	&apos;NOPROPERTYSETINFO:
End Sub

sub setImage(whatever as Object) 
	
	templatePath = GetPathSettings(&quot;Template&quot;,false, 0)
	Dim bitmapPath As String
	iPos = InStr(templatePath,&quot;/&quot;)
	if(iPos &gt; 0) Then
		bitmapPath = templatePath &amp; &quot;../wizard/bitmap/tutorial_background.gif&quot;
	Else
		bitmapPath = templatePath &amp; &quot;..\wizard\bitmap\tutorial_background.gif&quot;
	End If
	
	dim props(0) as new com.sun.star.beans.PropertyValue
	props(0).Name = &quot;Hidden&quot;
	props(0).Value = true
    oDoc = StarDesktop.loadComponentFromUrl(&quot;private:factory/swriter&quot;,&quot;_blank&quot;,0,props())
    oShape = addControlToDefaultForm(&quot;ImageButton&quot;, 1000, 1000, 2000, 1000)    
    imgControl = oShape.getControl()
    &apos;imgControl.ImageUrl=&quot;file:///D:/Program%20Files/src680_m11_qwizards1_49_TEST/share/gallery/tutoItem.gif&quot;    
	imgControl.ImageUrl = bitmapPath  
    imgControl.addConsumer(whatever)
    imgControl.startProduction()
end sub

Function createControlShape(cKind As String) As Object

    Dim oControlShape As Object
    Dim oControl As Object

    
    oControlShape = oDoc.createInstance(&quot;com.sun.star.drawing.ControlShape&quot;)
    oControl = oDoc.createInstance(&quot;com.sun.star.form.component.&quot; &amp; cKind)
    oControl.setPropertyValue(&quot;DefaultControl&quot;, &quot;com.sun.star.form.control.&quot; &amp; cKind)
    oControlShape.setControl(oControl)


    createControlShape() = oControlShape

End Function

Function createControlShapeWithDefaultControl(cKind As String) As Object

    Dim oControlShape As Object
    Dim oControl As Object

    
    oControlShape = oDoc.createInstance(&quot;com.sun.star.drawing.ControlShape&quot;)
    oControl = oDoc.createInstance(&quot;com.sun.star.form.component.&quot; &amp; cKind)
    oControlShape.setControl(oControl)


    createControlShapeWithDefaultControl() = oControlShape

End Function

Function createUNOControlShape(cKind As String, defControl As String) As Object

    Dim oControlShape As Object
    Dim oControl As Object


    oControlShape = oDoc.createInstance(&quot;com.sun.star.drawing.ControlShape&quot;)
    oControl = oDoc.createInstance(&quot;com.sun.star.form.component.&quot; &amp; cKind)
    oControl.setPropertyValue(&quot;DefaultControl&quot;, &quot;com.sun.star.awt.&quot; &amp; defControl)
    oControlShape.setControl(oControl)


    createUNOControlShape() = oControlShape

End Function

Function addShape(oShape As Object) As Boolean

	Dim vSize As New com.sun.star.awt.Size
	Dim oDrawPage As Object
	Dim oForms As Object
	Dim oForm As Object

    oDrawPage = oDoc.getDrawPage()
    oForms = oDrawPage.getForms()
    
    if oForms.Count = 0 then
        oForm = oDoc.createInstance(&quot;com.sun.star.form.component.Form&quot;)
        oForms.insertByIndex(0, oForm)
    end if
    
    vSize.Height = 2000 : vSize.Width = 2000
    oShape.Size = vSize
    oDrawPage.add(oShape)

    addShape() = true

End Function

sub addControl(cKind as String)

    Dim oDrawPage As Object
    Dim oForm As Object, oForms As Object
    Dim oControl As Object, oControlShape As Object
    Dim aSz As Variant
    Dim oText As Object

    oDrawPage = oDoc.DrawPage
    oControlShape = oDoc.createInstance(&quot;com.sun.star.drawing.ControlShape&quot;)
    oControl = oDoc.createInstance(&quot;com.sun.star.form.component.&quot; + cKind)
    oForm = oDoc.createInstance(&quot;com.sun.star.form.component.Form&quot;)
    oforms = oDrawPage.Forms
    if oforms.count = 0 then
            oforms.insertbyindex(0,oForm)
    end if
    oControlShape.Control = oControl
    oDrawPage.add(oControlShape)
        
End sub

Function addControlToDefaultForm(cKind as String, x As Integer, y As Integer, width As Integer, height As Integer) As Object

    Dim oDrawPage As Object
    Dim oControl As Object, oControlShape As Object
    Dim pos As New com.sun.star.awt.Point
    Dim size As New com.sun.star.awt.Size

	pos.X = x
	pos.Y = y
	size.Width = width
	size.Height = height
	
    oDrawPage = oDoc.DrawPage
    oControlShape = oDoc.createInstance(&quot;com.sun.star.drawing.ControlShape&quot;)
    oControl = oDoc.createInstance(&quot;com.sun.star.form.component.&quot; + cKind)
    oControlShape.Control = oControl
    oControlShape.Position = pos
    oControlShape.Size = size
    oDrawPage.add(oControlShape)

	addControlToDefaultForm() = oControlShape

End Function

Function addShapeToDrawDoc(oPage as Object, nPosX, nPosY as Integer, oType As String) As Object
    Dim aPoint As New com.sun.star.awt.Point
    Dim aSize As New com.sun.star.awt.Size
    Dim oShape As Object
    Dim servNames As Variant

    aPoint.x = nPosX
    aPoint.y = nPosY
    aSize.Width = 2000
    aSize.Height = 1000
    oShape = oDoc.createInstance(&quot;com.sun.star.drawing.&quot;+oType+&quot;Shape&quot;)
    oShape.Size = aSize
    oShape.Position = aPoint
    
    if oShape.getPropertySetInfo().hasPropertyByName(&quot;FillColor&quot;) then
    	oShape.FillColor = RGB(128, 255, 0)
    End If

    oPage.add(oShape)

    addShapeToDrawDoc() = oShape
End Function
</script:module>
