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