<?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="util_XRefreshable" 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 nCB1Val As Integer
Dim nCB2Val As Integer


Sub RunTest()

'*************************************************************************
' INTERFACE: 
' com.sun.star.util.XRefreshable
'*************************************************************************
On Error Goto ErrHndl
    Dim bOK As Boolean
    Dim oListener1, oListener2 As Object
    Dim nCount As Integer

    bOK = true
    nCount = 0
    nCB1Val = 0
    nCB2Val = 0

    Out.Log("Create two listeners...")
    oListener1 = createUNOListener("CB1_", "com.sun.star.util.XRefreshListener")
    oListener2 = createUNOListener("CB2_", "com.sun.star.util.XRefreshListener")

    Out.Log("Adding two refresh listeners")
    oObj.addRefreshListener(oListener1)
    oObj.addRefreshListener(oListener2)

    Test.StartMethod("addRefreshListener()")
    bOK = true
    oObj.refresh()
    bOK = bOK AND (nCB1Val = 1) AND (nCB2Val = 1)
    Test.MethodTested("addRefreshListener()", bOK)

    Test.StartMethod("removeRefreshListener()")
    bOK = true
    Out.Log("Removing second refresh listener")
    oObj.removeRefreshListener(oListener2)
    oObj.refresh()
    bOK = bOK AND (nCB1Val = 2) AND (nCB2Val = 1)
    Test.MethodTested("removeRefreshListener()", bOK)

    Test.StartMethod("refresh()")
    bOK = true
    bOK = bOK AND (nCB1Val = 2) AND (nCB2Val = 1)
    Test.MethodTested("refresh()", bOK)

    Out.Log("Removing first refresh listener")
    oObj.removeRefreshListener(oListener1)

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

Sub CB1_refreshed()
  Out.Log("First listener CallBack called")
  nCB1Val = nCB1Val + 1
End Sub

Sub CB2_refreshed()
  Out.Log("Second listener CallBack called")
  nCB2Val = nCB2Val + 1
End Sub
</script:module>
