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

import com.sun.star.uno.UnoRuntime;
import com.sun.star.accessibility.XAccessible;
import com.sun.star.accessibility.XAccessibleContext;
import com.sun.star.accessibility.XAccessibleSelection;
import com.sun.star.lang.IndexOutOfBoundsException;

import javax.swing.*;
import java.awt.*;
import java.util.Vector;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;




/**
 * Display a dialog with a list-box of children and select/deselect buttons
 */
class SelectionDialog extends JDialog
    implements ActionListener
{
    public SelectionDialog (AccTreeNode aNode)
    {
        super (AccessibilityWorkBench.Instance());
        
        maNode = aNode;

        Layout();
    }

    /** build dialog */
    protected void Layout ()
    {
        setTitle( "Select" );

        // vertical stacking of the elements
        Container aContent = getContentPane();

        // label with explanation
        aContent.add( new JLabel( "Select/Deselect child elements" ), 
                      BorderLayout.NORTH );

        // the JListBox
        maChildrenSelector = new JList (GetChildrenList());
        maChildrenSelector.setPreferredSize (new Dimension (500,300));
        aContent.add (maChildrenSelector, BorderLayout.CENTER);
        maChildrenSelector.setSelectionMode (ListSelectionModel.SINGLE_SELECTION);

        JPanel aButtons = new JPanel();
        aButtons.setLayout( new FlowLayout() );

        JButton aButton;

        aButton = new JButton( "Select" );
        aButton.setActionCommand( "Select" );
        aButton.addActionListener( this );
        aButtons.add( aButton );

        aButton = new JButton( "Deselect" );
        aButton.setActionCommand( "Deselect" );
        aButton.addActionListener( this );
        aButtons.add( aButton );

        aButton = new JButton( "Select all" );
        aButton.setActionCommand( "Select all" );
        aButton.addActionListener( this );
        aButtons.add( aButton );

        aButton = new JButton( "Clear Selection" );
        aButton.setActionCommand( "Clear Selection" );
        aButton.addActionListener( this );
        aButtons.add( aButton );

        aButton = new JButton( "Close" );
        aButton.setActionCommand( "Close" );
        aButton.addActionListener( this );
        aButtons.add( aButton );

        // add Panel with buttons
        aContent.add( aButtons, BorderLayout.SOUTH );

        setSize( getPreferredSize() );
    }

    /** Get a list of all children
    */
    private Vector GetChildrenList ()
    {
        mxSelection = maNode.getSelection();

        XAccessibleContext xContext = maNode.getContext();
        int nCount = xContext.getAccessibleChildCount();
        Vector aChildVector = new Vector();
        for(int i = 0; i < nCount; i++)
        {
            try
            {
                XAccessible xChild = xContext.getAccessibleChild(i);
                XAccessibleContext xChildContext = xChild.getAccessibleContext();
                aChildVector.add( i + " " + xChildContext.getAccessibleName());
            }
            catch( IndexOutOfBoundsException e )
            {
                aChildVector.add( "ERROR: IndexOutOfBoundsException" );
            }
        }
        return aChildVector;
    }


    void close ()
    {
        hide();
        dispose();
    }

    void select()
    {
        try
        {
            mxSelection.selectAccessibleChild (maChildrenSelector.getSelectedIndex());
        }
        catch( IndexOutOfBoundsException e )
        {
            JOptionPane.showMessageDialog( AccessibilityWorkBench.Instance(), 
                                           "Can't select: IndexOutofBounds",
                                           "Error in selectAccessibleChild", 
                                           JOptionPane.ERROR_MESSAGE);
        }
    }

    void deselect()
    {
        try
        {
            mxSelection.deselectAccessibleChild( 
                maChildrenSelector.getSelectedIndex());
        }
        catch( IndexOutOfBoundsException e )
        {
            JOptionPane.showMessageDialog( AccessibilityWorkBench.Instance(), 
                                           "Can't deselect: IndexOutofBounds",
                                           "Error in deselectAccessibleChild", 
                                           JOptionPane.ERROR_MESSAGE);
        }
    }

    void selectAll()
    {
        mxSelection.selectAllAccessibleChildren();
    }

    void clearSelection()
    {
        mxSelection.clearAccessibleSelection();
    }

        

    public void actionPerformed(ActionEvent e)
    {
        String sCommand = e.getActionCommand();

        if( "Close".equals( sCommand ) )
            close();
        else if ( "Select".equals( sCommand ) )
            select();
        else if ( "Deselect".equals( sCommand ) )
            deselect();
        else if ( "Clear Selection".equals( sCommand ) )
            clearSelection();
        else if ( "Select all".equals( sCommand ) )
            selectAll();
    }

    private JList maChildrenSelector;
    private XAccessibleSelection mxSelection;
    private AccTreeNode maNode;
}
