<?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="InsertColouredText" script:language="StarBasic">&apos; ***
&apos; InsertColouredText basic script
&apos; Uses a user interface to insert text of a specified colour to the
&apos; start and end of a document
&apos;
&apos; author	Neil Montgomery
&apos; created	August 12, 2002
&apos; ***


&apos; Main subprocedure to start script
Sub Main
 dialogShow()
End Sub


&apos; Global reference to the dialog object
Dim oDialog as Object


&apos; Uses the loadDialog subprocedure to load and execute the dialog box
Sub dialogShow
 oDialog = loadDialog(&quot;Standard&quot;,&quot;InsertColouredTextDialog&quot;)
 oDialog.execute()
End Sub


&apos; ***
&apos; Loads the dialog from the dialog library
&apos;
&apos; param	Libname 	the library name where dialog is stored
&apos; param  DialogName	the name of the dialog
&apos; param 	oLibContainer	library container to hold the loaded dialog library (optional)
&apos; return	runtime dialog object
&apos; ***
Function loadDialog(Libname as String, DialogName as String, Optional oLibContainer)
 Dim oLib as Object
 Dim oLibDialog as Object
 Dim oRuntimeDialog as Object

 &apos; If the optional oLibContainer is not passed to the function then
 &apos; DialogLibraries is loaded by default
 If isMissing(oLibContainer ) then
  oLibContainer = DialogLibraries
 End If

 &apos; Loads the specified library, then loads the dialog
 oLibContainer.loadLibrary(LibName)
 oLib = oLibContainer.getByName(Libname)
 oLibDialog = oLib.getByName(DialogName)
 oRuntimeDialog = createUnoDialog(oLibDialog)

 &apos; Returns the runtime dialog object
 loadDialog() = oRuntimeDialog
End Function



&apos; ***
&apos; Gets the RGB integer values and new text string from the dialog
&apos; then writes the new coloured text to the start and end of the document
&apos;
&apos; ***
Sub getFromDialog
 Dim oDocument As Object
 Dim oText As Object
 Dim oCursor As Object

 &apos; Create a document object for the current document then create text and
 &apos; cursor objects
 oDocument = StarDesktop.ActiveFrame.Controller.Model
 oText = oDocument.Text
 oCursor = oText.createTextCursor()

 &apos; Write the coloured text to the start and end of the document
 oCursor.gotoStart(false)
 oCursor.CharColor = getColor()
 oCursor.setString(&quot;New text at start: &quot; + getNewText())
 oCursor.gotoEnd(false)
 oCursor.CharColor = getColor()
 oCursor.setString(&quot;New text at end: &quot; + getNewText())
End Sub



&apos; ***
&apos; Reads the RGB integer values from the dialog
&apos;
&apos; returns   long  representing the RGB value
&apos; ***
Function getColor() as Long
 Dim oRedText as Object
 Dim oGreenText as Object
 Dim oBlueText as Object
 Dim nColor As Long

 &apos; Get the three RGB values
 oRedText = oDialog.GetControl(&quot;RedTextBox&quot;)
 oGreenText = oDialog.GetControl(&quot;GreenTextBox&quot;)
 oBlueText = oDialog.GetControl(&quot;BlueTextBox&quot;)

 &apos; Convert the values to long type and return the value
 nColor = RGB(oRedText.Text,oGreenText.Text,oBlueText.Text)
 getColor = nColor
End Function



&apos; ***
&apos; Reads the new text from the dialog
&apos;
&apos; returns   string  the new text
&apos; ***
Function getNewText() as String
 Dim oNewText As Object
 Dim sNewText As String

 &apos; Gets the string from dialog and returns the new text
 oNewText = oDialog.GetControl(&quot;NewTextBox&quot;)
 sNewText = oNewText.Text
 getNewText = sNewText
End Function</script:module>
