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



package ifc.task;



/**
* <code>com.sun.star.task.XInteractionHandler</code> interface testing.
* This test needs the following object relations :
* <ul>
*  <li> <code>'XInteractionHandler.Request'</code>
*    (of type <code>com.sun.star.task.XInteractionRequest</code>):
*    this interface implementation is handler specific and is
*    passed as argument to method <code>handle</code>. </li>
* <ul> <p>
* Test is <b> NOT </b> multithread compilant. <p>
* @see com.sun.star.task.XInteractionHandler
*/
import lib.MultiMethodTest;
import lib.Status;

import com.sun.star.task.XInteractionHandler;
import com.sun.star.task.XInteractionRequest;

/**
* <code>com.sun.star.task.XInteractionHandler</code> interface testing.
* This test needs the following object relations :
* <ul>
*  <li> <code>'XInteractionHandler.Request'</code>
*    (of type <code>com.sun.star.task.XInteractionRequest</code>):
*    this interface implementation is handler specific and is
*    passed as argument to method <code>handle</code>. </li>
* <ul> <p>
* Test is <b> NOT </b> multithread compilant. <p>
* @see com.sun.star.task.XInteractionHandler
*/
public class _XInteractionHandler extends MultiMethodTest {

    // oObj filled by MultiMethodTest
    public XInteractionHandler oObj = null ;

    private XInteractionRequest request = null ;

    /**
    * Retrieves an object relation. <p>
    * @throws StatusException If the relation is not found.
    */
    public void before() {
        request = (XInteractionRequest)
            tEnv.getObjRelation("XInteractionHandler.Request") ;

        //if (request == null)
        //    throw new StatusException(Status.failed("Reelation not found")) ;
    }

    /**
    * Sinse this test is interactive (dialog window can't be
    * disposed using API) it is skipped. <p>
    * Always has <b>SKIPPED.OK</b> status .
    */
    public void _handle() {

        /*

        final XMultiServiceFactory msf = (XMultiServiceFactory)tParam.getMSF() ;
        SOfficeFactory SOF = SOfficeFactory.getFactory( (XMultiServiceFactory)tParam.getMSF() );
        XComponent textDoc = null ;
        try {
            textDoc = SOF.createTextDoc( null );
        } catch (com.sun.star.uno.Exception e) {
            log.println("Can't create Document") ;
            tRes.tested("handle()", false) ;
            return ;
        }
        final XComponent fTextDoc = textDoc ;
        final XModel xModelDoc = (XModel)
            UnoRuntime.queryInterface(XModel.class, textDoc);

        Thread thr = new Thread( new Runnable() {
            public void run() {
                try {
                    Thread.sleep(1000) ;
                } catch (InterruptedException e ) {}

                //fTextDoc.dispose() ;

                XFrame docFr = xModelDoc.getCurrentController().getFrame() ;
                docFr.dispose() ;

                ///*
                try {

                    Object dsk = msf.createInstance
                        ("com.sun.star.frame.Desktop");

                    XFrame xDsk = (XFrame)
                        UnoRuntime.queryInterface(XFrame.class, dsk) ;

                    XFrame fr = xDsk.findFrame("_top", 55) ;

                    XWindow win = fr.getContainerWindow() ;

                    String name = null ;
                    if (fr != null) {
                        name = fr.getName() ;
                        docFr.dispose() ;
                    }

                } catch (com.sun.star.uno.Exception e) {
                    e.printStackTrace();
                } //
            }
        }) ;
        thr.start() ;

        oObj.handle(request) ;
        try {
            thr.join(500) ;
        } catch (InterruptedException e ) {}
        */

        tRes.tested("handle()", Status.skipped(true)) ;
    }
}


