/*******************************************************************************
 * Copyright (c) 2004, 2008 IBM Corporation and Others
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Kentarou FUKUDA - initial API and implementation
 *******************************************************************************/

package org.eclipse.actf.visualization.engines.blind.html.ui.elementViewer;

import java.util.Iterator;
import java.util.Set;

import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;

public class CSSViewer {
	
    private Composite compositeCss;

    private List cssListCon;

    public CSSViewer(Composite parent) {
        compositeCss = new Composite(parent, SWT.NULL);
        compositeCss.setLayoutData(new GridData(GridData.FILL_BOTH));
        GridLayout gridLayout1 = new GridLayout();
        gridLayout1.numColumns = 1;
        compositeCss.setLayout(gridLayout1);

        cssListCon = new List(compositeCss, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        GridData gridData = new GridData(GridData.FILL_BOTH);
        cssListCon.setLayoutData(gridData);

        cssListCon.addMouseListener(new MouseAdapter() {
            public void mouseUp(MouseEvent arg0) {
                if (arg0.stateMask == SWT.BUTTON3) {
                    if (cssListCon.getSelectionIndex() >= 0)
                        openPopupMenu(cssListCon.getSelectionIndex());
                }
            }

            //			public void mouseDoubleClick(MouseEvent arg0) {
                //				if (cssListCon.getSelectionIndex() >= 0)
                //					getAndViewFile(cssListCon.getSelectionIndex());
                //			}
            });
    }

    /**
     * @return
     */
    public Composite getCompositeCss() {
        return compositeCss;
    }

    public void setCssSet(Set cssSet) {
        cssListCon.removeAll();
        if (cssSet != null) {
            for (Iterator i = cssSet.iterator(); i.hasNext();) {
                cssListCon.add((String) i.next());
            }
        }
    }

    private void openPopupMenu(int index) {
        String[] itemName = new String[2];
        itemName[0] = "&Copy URL";
        itemName[1] = "&Open";
        boolean[] enabled = new boolean[2];
        enabled[0] = true;
        enabled[1] = true;
        PopupMenu popupMenu = new PopupMenu(new Shell(), itemName, enabled);
        String strRet = popupMenu.open();
        if (strRet.equals(itemName[0])) {
            Clipboard clipboard = new Clipboard(compositeCss.getDisplay());
            clipboard.setContents(new Object[] { cssListCon.getItem(index) }, new Transfer[] { TextTransfer
                    .getInstance() });
        } else if (strRet.equals(itemName[1])) {
            getAndViewFile(cssListCon.getSelectionIndex());
        }
    }

    private void getAndViewFile(int index) {
        try {
        	PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(cssListCon.getItem(index));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
