<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="awt_XTextComponent" script:language="StarBasic">


'*************************************************************************
'
'  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.
'
'*************************************************************************





' Be sure that all variables are dimensioned:
option explicit


Dim bCB1_textChanged As Boolean
Dim bCB2_textChanged As Boolean


Sub RunTest()

'*************************************************************************
' INTERFACE: 
' com.sun.star.awt.XTextComponent
'*************************************************************************
On Error Goto ErrHndl
    Dim bOK As Boolean
    Dim oListener1 As Object, oListener2 As Object
    Dim vSelection As new com.sun.star.awt.Selection
    Dim vSelectionSelection As new com.sun.star.awt.Selection
    Dim vGetSelection As  new com.sun.star.awt.Selection
    Dim vInsertSelection As  new com.sun.star.awt.Selection
    Dim cGetText As String
    Dim len2set As Integer

    Out.Log("create two com.sun.star.awt.XTextListener")
    oListener1 = createUNOListener("CB1_", "com.sun.star.awt.XTextListener")
    oListener2 = createUNOListener("CB2_", "com.sun.star.awt.XTextListener")

    Test.StartMethod("setText()")
    bOK = true
    Dim cText As String
    cText = "XTextComponent: setText()"
    oObj.setText(cText)
    Test.StartMethod("getText()")
    bOK = bOK AND (cText = oObj.getText())
    Test.MethodTested("setText()", bOK)
    Test.MethodTested("getText()", bOK)

    Test.StartMethod("insertText()")
    bOK = true
    oObj.setText("setSelection")
    vInsertSelection.Min = 0
    vInsertSelection.Max = 3
    oObj.insertText(vInsertSelection,"new")
    Out.Log("result of getText is: '" + oObj.getText() +"'. It sould be 'newSelection'")
    bOK = bOK AND (oObj.getText() = "newSelection")
    Test.MethodTested("insertText()", bOK)


    Test.StartMethod("setSelection()")
    bOK = true
    vSelectionSelection.Min = 2
    vSelectionSelection.Max = 3
    oObj.setSelection(vSelectionSelection)
    Test.StartMethod("getSelection()")
    vGetSelection = oObj.getSelection()
    bOK = bOK AND (vGetSelection.Min = vSelectionSelection.Min) AND _
          (vGetSelection.Max = vSelectionSelection.Max)
    Test.MethodTested("setSelection()", bOK)
    Test.MethodTested("getSelection()", bOK)

    Test.StartMethod("getSelectedText()")
    bOK = true
    oObj.setText("getSelectedText")
    vSelectionSelection.Min = 0
    vSelectionSelection.Max = 3
    oObj.setSelection(vSelectionSelection)
    Out.Log("result of getSelectedText is: '" + oObj.getSelectedText() +"'. It sould be 'get'")
    bOK = bOK AND (oObj.getSelectedText() = "get")
    Test.MethodTested("getSelectedText()", bOK)

    Test.StartMethod("setEditable()")
    bOK = true
    oObj.setEditable(true)
    Test.StartMethod("isEditable()")
    bOK = bOK AND oObj.isEditable()
    oObj.setEditable(false)
    bOK = bOK AND NOT oObj.isEditable()
    oObj.setEditable(true)
    bOK = bOK AND oObj.isEditable()
    Test.MethodTested("setEditable()", bOK)
    Test.MethodTested("isEditable()", bOK)

    Test.StartMethod("setMaxTextLen()")
    bOK = true
    if (oObj.getMaxTextLen = 12) then
        len2set = 10
    else
        len2set = 12
    endif
    oObj.setMaxTextLen(len2set)
    oObj.setText("0123456789ABCDE")
    cGetText = oObj.getText()
    Out.Log("result of Len(cGetText) is: '" + Len(cGetText) + "'. It sould be >'" + len2set+"' ")
    bOK = bOK AND (Len(cGetText) > len2set)
    Test.MethodTested("setMaxTextLen()", bOK)

    Test.StartMethod("getMaxTextLen()")
    bOK = true
    if (oObj.getMaxTextLen = 12) then
        len2set = 10
    else
        len2set = 12
    endif
    oObj.setMaxTextLen(len2set)
    Out.Log("result of getMaxTextLen is: '" + oObj.getMaxTextLen() +"'. It sould be '"+len2set+"'")
    bOK = bOK AND (oObj.getMaxTextLen() = len2set)
    Test.MethodTested("getMaxTextLen()", bOK)

    bCB1_textChanged = false
    bCB2_textChanged = false

    Test.StartMethod("addTextListener()")
    bOK = true
    oObj.addTextListener(oListener1)
    oObj.addTextListener(oListener2)
    oObj.setText("addTextListener")
    Wait(500)
    bOK = bOK AND bCB1_textChanged AND bCB2_textChanged
    Test.MethodTested("addTextListener()", bOK)

    bCB1_textChanged = false
    bCB2_textChanged = false

    Test.StartMethod("removeTextListener()")
    bOK = true
    oObj.removeTextListener(oListener1)
    oObj.setText("removeTextListener")
    Wait(500)
    bOK = bOK AND NOT bCB1_textChanged AND bCB2_textChanged
    oObj.removeTextListener(oListener2)
    Test.MethodTested("removeTextListener()", bOK)

Exit Sub
ErrHndl:
    Test.Exception()
    bOK = false
    resume next
End Sub

Sub CB1_disposing()
End Sub

Sub CB2_disposing()
End Sub

' Listener call backs for com.sun.star.awt.XTextListener
Sub CB1_textChanged
    Out.Log("CallBack for Listener1 textChanged was called.")
    bCB1_textChanged = true
End Sub
Sub CB2_TextChanged
    Out.Log("CallBack for Listener2 textChanged was called.")
    bCB2_textChanged = true
End Sub
</script:module>
