blob: 0403f88d34a53ab7f59fec532d2b7de6080fcad5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2004 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.actions;
import java.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(); } } } }
*/
}