/*******************************************************************************
 * Copyright (c) 2001, 2006 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
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/


package org.eclipse.wst.xml.ui.internal.actions;

import com.ibm.icu.text.Collator;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;


public class MenuBuilder {


	protected Comparator comparator = new Comparator() {

		public int compare(Object o1, Object o2) {
			return Collator.getInstance().compare(getSortKey(o1), getSortKey(o2));
		}

		protected String getSortKey(Object o) {
			String result = ""; //$NON-NLS-1$
			if (o instanceof IAction) {
				IAction action = (IAction) o;
				result = action.getText();
			}
			// else if (o instanceof MenuData)
			// {
			// result = "z" + ((MenuData)o).name;
			// }
			return result;
		}
	};


	protected void createAlphebeticalGrouping(IMenuManager menu, List actionList) {
		Object[] array = actionList.toArray();
		if (array.length > 0) {
			Arrays.sort(array, comparator);
		}

		int groupSize = 15;
		int minGroupSize = 5;
		int numberOfGroups = (array.length / groupSize) + ((array.length % groupSize > minGroupSize) ? 1 : 0);

		for (int i = 0; i < numberOfGroups; i++) {
			boolean isLastGroup = (i == (numberOfGroups - 1));
			int firstIndex = i * groupSize;
			int lastIndex = isLastGroup ? array.length - 1 : i * groupSize + groupSize - 1;
			Action firstAction = (Action) array[firstIndex];
			Action lastAction = (Action) array[lastIndex];
			MenuManager submenu = new MenuManager(firstAction.getText() + " - " + lastAction.getText()); //$NON-NLS-1$
			menu.add(submenu);
			for (int j = firstIndex; j <= lastIndex; j++) {
				submenu.add((Action) array[j]);
			}
		}
	}


	public void populateMenu(IMenuManager menu, List actionList, boolean createTiered) {
		// sort the actions
		if (actionList.size() < 25) {
			Object[] array = actionList.toArray();
			if (array.length > 0) {
				Arrays.sort(array, comparator);
			}
			for (int i = 0; i < array.length; i++) {
				menu.add((Action) array[i]);
			}
		}
		else {
			createAlphebeticalGrouping(menu, actionList);
		}
	}

	/*
	 * protected void createPropertyGrouping(IMenuManager menu, List
	 * actionList) { MenuDataTable menuDataTable = new MenuDataTable();
	 * 
	 * for (Iterator i = actionList.iterator(); i.hasNext(); ) { String
	 * groupName = null; Action action = (Action)i.next(); if (action
	 * instanceof NodeAction) { groupName =
	 * ((NodeAction)action).getGroupName(); } if (groupName == null) {
	 * groupName = ""; } MenuData menuData =
	 * menuDataTable.lookupOrCreate(groupName, "");
	 * menuData.childList.add(action); } populateMenu(menu,
	 * menuDataTable.getRoot()); }
	 * 
	 * 
	 * protected void populateMenu(MenuManager menuManager, MenuData menuData) {
	 * for (Iterator i = menuData.childList.iterator(); i.hasNext(); ) {
	 * Object o = i.next(); if (o instanceof Action) {
	 * menuManager.add((Action)o); } else if (o instanceof MenuData) {
	 * MenuData childMenuData = (MenuData)o; MenuManager childMenuManager =
	 * new MenuManager(childMenuData.name); menuManager.add(childMenuManager);
	 * populateMenu(childMenuManager, childMenuData); } } }
	 * 
	 * 
	 * public MenuDataTable { protected Hashtable table = new Hashtable();
	 * protected MenuData root;
	 * 
	 * public MenuDataTable() { root = lookupOrCreateMenuData(null, null); }
	 * 
	 * protected MenuData lookupMenuData(String name) { String key = name !=
	 * null ? name : ""; return (MenuData)menuDataTable.get(key); }
	 * 
	 * protected MenuData lookupOrCreateMenuData(String name, String
	 * parentName) { String key = name != null ? name : ""; MenuData menuData =
	 * (MenuData)menuDataTable.get(key); if (menuData == null) { menuData =
	 * new MenuData(name, parentName); menuDataTable.put(key, menuData); }
	 * return menuData; }
	 * 
	 * public MenuData getRoot() { return root; } }
	 * 
	 * 
	 * protected class MenuData { public String name; public String
	 * parentName; public List childList = new Vector();
	 * 
	 * MenuData(String name, String parentName) { this.name = name;
	 * this.parentName = parentName; }
	 * 
	 * protected void sort() { Object[] array = childList.toArray(); if
	 * (array.length > 0 ) { Arrays.sort(array, comparator); } childList =
	 * Arrays.asList(array);
	 * 
	 * for (Iterator i = childList.iterator(); i.hasNext(); ) { Object o =
	 * i.next(); if (o instanceof MenuData) { ((MenuData)o).sort(); } } } }
	 */
}
