/**************************************************************
 * 
 * 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 complex.loadAllDocuments;

// __________ Imports __________

// structs, const, ...
import com.sun.star.beans.PropertyValue;

// exceptions
import com.sun.star.uno.Exception;
import com.sun.star.uno.RuntimeException;

// interfaces
import com.sun.star.task.XStatusIndicator;

// helper
import com.sun.star.uno.UnoRuntime;

// others
//import java.lang.*;

// __________ Implementation __________

/**
 * Implemets a simple status indicator, which
 * provide informations about state of a load request.
 * It can be used as an argument e.g. for loadComponentFromURL().
 */
public class StatusIndicator implements com.sun.star.task.XStatusIndicator
{
    // ____________________

    /**
     * @const SHOWSTATUS_NO         don't show the status - but save information about using of this indicator object
     * @const SHOWSTATUS_LOG        the possible set protocol object will be used (it covers STDOUT, STDERR automaticly too)
     * @const SHOWSTATUS_DIALOG     the status will be shown inside a java dialog
     * @const SHOWSTATUS_LINK       the status will be notified to interested listener (one listener only!)
     */
    public static final int SHOWSTATUS_NO       =   0;
    public static final int SHOWSTATUS_LOG      =   1;
    public static final int SHOWSTATUS_DIALOG   =   4;
    public static final int SHOWSTATUS_LINK     =   8;

    // ____________________

    /**
     * @member m_sText      text, which describe the current status
     * @member m_nRange     max value for any progress
     * @member m_nValue     the progress value
     * @member m_nOut       regulate, how the status will be shown
     * @member m_aProtocol  used for logging and transport information about used interface of this object
     */
    private String          m_sText     ;
    private int             m_nRange    ;
    private int             m_nValue    ;
    private int             m_nOut      ;
//    private Protocol        m_aProtocol ;
    private boolean         m_bWasUsed  ;

    // ____________________

    /**
     * ctor
     * It's initialize an object of this class with default values.
     */
    public StatusIndicator( int nOut)
    {
        m_sText     = new String()  ;
        m_nRange    = 100           ;
        m_nValue    = 0             ;
        m_nOut      = nOut          ;
        //m_aProtocol = aProtocol     ;
        m_bWasUsed  = false;
//        aProtocol.resetUsingState();
    }

    // ____________________

    /**
     * It starts the progress and set the initial text and range.
     *
     * @param sText
     *          the initial text for showing
     *
     * @param nRange
     *          the new range for following progress
     */
    public void start( /*IN*/String sText, /*IN*/int nRange )
    {
        synchronized(this)
        {
            //m_aProtocol.log("start("+sText+","+nRange+")\n");
            m_bWasUsed = true;
//            m_aProtocol.itWasUsed();

            m_sText  = sText ;
            m_nRange = nRange;
            m_nValue = 0     ;
        }
        impl_show();
    }

    // ____________________

    /**
     * Finish the progress and reset internal members.
     */
    public void end()
    {
        synchronized(this)
        {
            //m_aProtocol.log("end()\n");
            m_bWasUsed = true;
//            m_aProtocol.itWasUsed();

            m_sText  = new String();
            m_nRange = 100;
            m_nValue = 0;
        }
        impl_show();
    }

    // ____________________

    /**
     * Set the new description text.
     *
     * @param sText
     *          the new text for showing
     */
    public void setText( /*IN*/String sText )
    {
        synchronized(this)
        {
            //m_aProtocol.log("setText("+sText+")\n");
            m_bWasUsed = true;
//            m_aProtocol.itWasUsed();

            m_sText = sText;
        }
        impl_show();
    }

    // ____________________

    /**
     * Set the new progress value.
     *
     * @param nValue
     *          the new progress value
     *          Must fit the range!
     */
    public void setValue( /*IN*/int nValue )
    {
        synchronized(this)
        {
            //m_aProtocol.log("setValue("+nValue+")\n");
            m_bWasUsed = true;
//            m_aProtocol.itWasUsed();

            if (nValue<=m_nRange)
                m_nValue = nValue;
        }
        impl_show();
    }

    // ____________________

    /**
     * Reset text and progress value to her defaults.
     */
    public void reset()
    {
        synchronized(this)
        {
            //m_aProtocol.log("reset()\n");
            m_bWasUsed = true;
//            m_aProtocol.itWasUsed();

            m_sText  = new String();
            m_nValue = 0;
        }
        impl_show();
    }

    // ____________________

    /**
     * Internal helper to show the status.
     * Currently it's implement as normal text out on stdout.
     * But of course other thimngs are possible here too.
     * e.g. a dialog
     */
    private void impl_show()
    {
/*        synchronized(this)
        {
            if ((m_nOut & SHOWSTATUS_LOG) == SHOWSTATUS_LOG)
                //m_aProtocol.log("\t["+m_nValue+"/"+m_nRange+"] "+m_sText+"\n");

            //if ((m_nOut & SHOWSTATUS_DIALOG) == SHOWSTATUS_DIALOG)
                // not supported yet!

            //if ((m_nOut & SHOWSTATUS_LINK) == SHOWSTATUS_LINK)
                // not supported yet!
        } */
    }
    
    public boolean wasUsed() {
        return m_bWasUsed;
    }
}
