/*******************************************************************************
 * Copyright (c) 2000, 2010 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.gef.ui.palette;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.resource.ImageDescriptor;


import org.eclipse.gef.internal.Internal;

/**
 * This action allows to switch between the various supported layout modes for
 * the given palette.
 * 
 * @author Pratik Shah
 */
public class LayoutAction extends Action implements IMenuCreator {

	private PaletteViewerPreferences prefs;
	private List actions;

	/**
	 * Constructor
	 * 
	 * @param prefs
	 *            PaletteViewerPreferences object where the settings can be
	 *            saved
	 */
	public LayoutAction(PaletteViewerPreferences prefs) {
		this(prefs, false);
	}

	/**
	 * Constructor
	 * 
	 * @param hasIcon
	 *            True if this action should associate an icon with itself
	 * @param prefs
	 *            PaletteViewerPreferences object where the settings can be
	 *            saved
	 */
	public LayoutAction(PaletteViewerPreferences prefs, boolean hasIcon) {
		super(PaletteMessages.LAYOUT_MENU_LABEL);
		this.prefs = prefs;
		actions = createActions();
		setMenuCreator(this);

		if (hasIcon)
			setImageDescriptor(ImageDescriptor.createFromFile(Internal.class,
					"icons/palette_layout.gif")); //$NON-NLS-1$

		setToolTipText(PaletteMessages.LAYOUT_MENU_LABEL);
	}

	/**
	 * Helper method that wraps the given action in an ActionContributionItem
	 * and then adds it to the given menu.
	 * 
	 * @param parent
	 *            The menu to which the given action is to be added
	 * @param action
	 *            The action that is to be added to the given menu
	 */
	protected void addActionToMenu(Menu parent, IAction action) {
		ActionContributionItem item = new ActionContributionItem(action);
		item.fill(parent, -1);
	}

	/**
	 * @return A list of actions that can switch to one of the supported layout
	 *         modes
	 */
	protected List createActions() {
		ArrayList list = new ArrayList();
		int[] modes = prefs.getSupportedLayoutModes();

		Action action;
		for (int i = 0; i < modes.length; i++) {
			switch (modes[i]) {
			case PaletteViewerPreferences.LAYOUT_COLUMNS:
				action = new LayoutChangeAction(
						PaletteViewerPreferences.LAYOUT_COLUMNS);
				action.setText(PaletteMessages.SETTINGS_COLUMNS_VIEW_LABEL);
				list.add(action);
				break;
			case PaletteViewerPreferences.LAYOUT_LIST:
				action = new LayoutChangeAction(
						PaletteViewerPreferences.LAYOUT_LIST);
				action.setText(PaletteMessages.SETTINGS_LIST_VIEW_LABEL);
				list.add(action);
				break;
			case PaletteViewerPreferences.LAYOUT_ICONS:
				action = new LayoutChangeAction(
						PaletteViewerPreferences.LAYOUT_ICONS);
				action.setText(PaletteMessages.SETTINGS_ICONS_VIEW_LABEL_CAPS);
				list.add(action);
				break;
			case PaletteViewerPreferences.LAYOUT_DETAILS:
				action = new LayoutChangeAction(
						PaletteViewerPreferences.LAYOUT_DETAILS);
				action.setText(PaletteMessages.SETTINGS_DETAILS_VIEW_LABEL);
				list.add(action);
				break;
			}
		}
		return list;
	}

	/**
	 * Empty method
	 * 
	 * @see org.eclipse.jface.action.IMenuCreator#dispose()
	 */
	public void dispose() {
	}

	private Menu fillMenu(Menu menu) {
		for (Iterator iter = actions.iterator(); iter.hasNext();) {
			LayoutChangeAction action = (LayoutChangeAction) iter.next();
			action.setChecked(prefs.getLayoutSetting() == action
					.getLayoutSetting());
			addActionToMenu(menu, action);
		}

		setEnabled(!actions.isEmpty());

		return menu;
	}

	/**
	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(Control)
	 */
	public Menu getMenu(Control parent) {
		return fillMenu(new Menu(parent));
	}

	/**
	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(Menu)
	 */
	public Menu getMenu(Menu parent) {
		return fillMenu(new Menu(parent));
	}

	private class LayoutChangeAction extends Action {
		private int value;

		public LayoutChangeAction(int layoutSetting) {
			value = layoutSetting;
		}

		public int getLayoutSetting() {
			return value;
		}

		public void run() {
			prefs.setLayoutSetting(value);
		}
	}

}
