<?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="sw_SwXTextFrame" 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


' REQUIRED VARIABLES for interface/service tests:
Global nGlobalLong As Long
Global oCollection As Object
Global oComponentInstance As Object

Global oXTextContent as Object
Global oXTextContentRange as Object


Sub CreateObj()

'*************************************************************************
' COMPONENT: 
' sw.SwXTextFrame
'*************************************************************************
On Error Goto ErrHndl
    Dim bOK As Boolean
    Dim nHeight As Integer
    Dim nWidth As Integer
    Dim i As Integer
    Dim oCursor As Object
    Dim sSize As Object
    Dim aFrame As Object
    Dim oBookmark As Object

    bOK = true
    oDoc = utils.createDocument("swriter", cObjectName)

    oCursor = oDoc.Text.createTextCursor()

    nHeight = 10000
    nWidth = 10000
    nGlobalLong = 2

    for i = 1 to nGlobalLong
        ' create some frames on doc
        oObj = oDoc.createInstance("com.sun.star.text.TextFrame")
        sSize = createUNOStruct("com.sun.star.awt.Size")
        sSize.Height = nHeight
        sSize.Width = nWidth
        oObj.Size = sSize
        oObj.SizeType = 1
        oObj.Name = cObjectName + i
        oObj.HoriOrient = i
        oObj.VertOrient = 1

        ' AnchorTypes: 0 = paragraph, 1 = as char, 2 = page, 3 = frame/paragraph 4= at char
        oObj.AnchorType = 2
        oDoc.Text.insertTextContent(oCursor, oObj, false)
        If i = 1 Then
          oComponentInstance = oObj
        End If
    next i

    ' the tested frame must be inside another frame to check the property AnchorType
    ' (the value AT_FRAME can be set only in this case)
    aFrame = oDoc.createInstance("com.sun.star.text.TextFrame")
    oCursor = oObj.Text.createTextCursor()
    oObj.Text.insertTextContent(oCursor, aFrame, false)
    oObj = aFrame 

    oCollection = oDoc.TextFrames

    oObj.String = "-Text"

    oCursor = oObj.createTextCursor()
    oObj.insertString(oCursor, "SwXTextFrame", false)

    oBookmark = oDoc.createInstance("com.sun.star.text.Bookmark")
    oCursor.gotoEnd(false)
    oObj.insertTextContent(oCursor, oBookmark, false)

	oXTextContent = oDoc.createInstance("com.sun.star.text.TextFrame")
	oXTextContentRange = oDoc.Text.createTextCursor()


Exit Sub
ErrHndl:
    Test.Exception()
End Sub
</script:module>
