/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.internal;

import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.actions.ContributionItemFactory;

public class PerspectiveBarNewContributionItem extends ContributionItem {

    private MenuManager menuManager = null;

	private Image image;
    private ToolItem toolItem = null;

    public PerspectiveBarNewContributionItem(IWorkbenchWindow workbenchWindow) {
        super(PerspectiveBarNewContributionItem.class.getName());
        menuManager = new MenuManager();
        menuManager.add(ContributionItemFactory.PERSPECTIVES_SHORTLIST
                .create(workbenchWindow));
    }

	/* (non-Javadoc)
	 * @see org.eclipse.jface.action.ContributionItem#dispose()
	 */
	public void dispose() {
		super.dispose();
		if (image != null && !image.isDisposed()) {
			image.dispose();
			image = null;
		}
	}

    public void fill(final ToolBar parent, int index) {
        if (toolItem == null && parent != null) {
            parent.addDisposeListener(new DisposeListener(){
				public void widgetDisposed(DisposeEvent e) {
					//toolItem.getImage().dispose();
					toolItem.dispose();
					toolItem = null;		
				}});
            
            toolItem = new ToolItem(parent, SWT.PUSH);
            if (image == null || image.isDisposed()) {
            	image = WorkbenchImages.getImageDescriptor(
                    IWorkbenchGraphicConstants.IMG_ETOOL_NEW_PAGE)
                    .createImage();
			}
			toolItem.setImage(image);
			
            toolItem.setText(""); //$NON-NLS-1$
            toolItem.setToolTipText(WorkbenchMessages
                    .getString("PerspectiveBarNewContributionItem.toolTip")); //$NON-NLS-1$
            toolItem.addSelectionListener(new SelectionAdapter() {

                public void widgetSelected(SelectionEvent event) {
                    menuManager.update(true);
                    Point point = new Point(event.x, event.y);
                    if (event.widget instanceof ToolItem) {
                        ToolItem toolItem = (ToolItem) event.widget;
                        Rectangle rectangle = toolItem.getBounds();
                        point = new Point(rectangle.x, rectangle.y
                                + rectangle.height);
                    }
                    Menu menu = menuManager.createContextMenu(parent);
                    point = parent.toDisplay(point);
                    menu.setLocation(point.x, point.y);
                    menu.setVisible(true);
                }
            });
        }
    }
}
