<?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="SearchAndReplace" script:language="StarBasic">&apos; ***
&apos; SearchAndReplace basic script
&apos; Uses a user interface to search and replace the specified strings
&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;SearchAndReplaceDialog&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

 If isMissing(oLibContainer ) then
  oLibContainer = DialogLibraries
 End If
 oLibContainer.loadLibrary(LibName)
 oLib = oLibContainer.getByName(Libname)
 oLibDialog = oLib.getByName(DialogName)
 oRuntimeDialog = createUnoDialog(oLibDialog)
 loadDialog() = oRuntimeDialog
End Function



&apos; ***
&apos; Creates a connection to the current document.
&apos; Gets the search and replace keys from the dialog and replaces all
&apos; instances of the search key with the replace key.
&apos;
&apos; ***
Sub getInfoFromDialog
 Dim oDocument As Object
 Dim oSearch As Object
 Dim oFound As Object
 Dim oFoundCursor As Object
 Dim oSearchText as Object
 Dim oReplaceText as Object

 &apos; Create a document object for the current document then create text and
 &apos; cursor objects
 oDocument = StarDesktop.ActiveFrame.Controller.Model
 oSearch = oDocument.createSearchDescriptor

 &apos; Replace all instances of the search string with the replavce string
 oSearch.SearchString = getSearchKey()
 oSearch.ReplaceString = getReplaceKey()
 oDocument.replaceAll(oSearch)
End Sub


&apos; ***
&apos; Gets the search key string from the dialog
&apos;
&apos; returns	string 		representing the search key
&apos; ***
Function getSearchKey() as String
 Dim sSearch As String

 &apos; Get the search key from the dialog
 oSearchText = oDialog.GetControl(&quot;SearchKeyTextBox&quot;)
 sSearch = oSearchText.Text
 getSearchKey = sSearch
End Function



&apos; ***
&apos; Gets the replace key string from the dialog
&apos;
&apos; returns 	string		representing the replace key
&apos; ***
Function getReplaceKey() as String
 Dim sReplace As String

 &apos; Get the replace key from the dialog
 oReplaceText = oDialog.GetControl(&quot;ReplaceKeyTextBox&quot;)
 sReplace = oReplaceText.Text
 getReplaceKey = sReplace
End Function</script:module>
