/*******************************************************************************
* 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(); } } } }
*/
}