/**
* Copyright 2014
* SMEdit https://github.com/StarMade/SMEdit
* SMTools https://github.com/StarMade/SMTools
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
**/
package jo.sm.ui.logic;
import java.awt.Component;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.Action;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JSeparator;
import jo.sm.logic.StarMadeLogic;
import jo.sm.mods.IBlocksPlugin;
import jo.sm.ui.RenderPanel;
import jo.sm.ui.act.plugin.BlocksPluginAction;
/**
* @Auther Jo Jaquinta for SMEdit Classic - version 1.0
**/
public class MenuLogic {
public static int addPlugins(RenderPanel panel, JMenu menu, int type, int subtype) {
int count = 0;
List<IBlocksPlugin> plugins = StarMadeLogic.getBlocksPlugins(type, subtype);
if (plugins.isEmpty()) {
return 0;
}
Map<Integer, List<IBlocksPlugin>> orderMap = getOrderedMap(plugins, type, subtype);
Integer[] priorities = orderMap.keySet().toArray(new Integer[0]);
Arrays.sort(priorities);
Map<String, JMenu> cascades = new HashMap<>();
int lastPriority = 0;
int menuIdx = findStart(menu);
for (int i = 0; i < priorities.length; i++) {
if ((i > 0) && (priorities[i] / 10 > lastPriority / 10)) {
JSeparator sep = new JSeparator();
sep.setName("plugin");
menu.add(sep, menuIdx++);
}
lastPriority = priorities[i];
List<IBlocksPlugin> pluginsAtPriority = orderMap.get(priorities[i]);
for (IBlocksPlugin plugin : pluginsAtPriority) {
BlocksPluginAction action = new BlocksPluginAction(panel, plugin);
String name = plugin.getName();
int o = name.indexOf('/');
if (o > 0) {
String cascadeName = name.substring(0, o);
JMenu submenu = cascades.get(cascadeName);
if (submenu == null) {
submenu = new JMenu(cascadeName);
submenu.setName("plugin");
cascades.put(cascadeName, submenu);
menu.add(submenu, menuIdx++);
}
JMenuItem m = new JMenuItem(action);
submenu.add(m);
} else {
JMenuItem m = new JMenuItem(action);
menu.add(m, menuIdx++);
}
count++;
}
}
return count;
}
private static int findStart(JMenu menu) {
for (int idx = 0; idx < menu.getItemCount(); idx++) {
String name = null;
JMenuItem it = menu.getItem(idx);
if (it == null) {
Component c = menu.getPopupMenu().getComponent(idx);
name = c.getName();
} else {
name = it.getName();
}
if ("pluginsStartHere".equals(name)) {
return idx + 1;
}
}
return menu.getItemCount();
}
private static Map<Integer, List<IBlocksPlugin>> getOrderedMap(
List<IBlocksPlugin> plugins, int type, int subtype) {
Map<Integer, List<IBlocksPlugin>> map = new HashMap<>();
for (IBlocksPlugin plugin : plugins) {
int[][] classifications = plugin.getClassifications();
int priority = 50;
for (int[] classification : classifications) {
if (StarMadeLogic.isClassification(classification[0], type) && (classification[1] == subtype)) {
if (classification.length > 2) {
priority = classification[2];
break;
}
}
}
List<IBlocksPlugin> pluginsAtPriority = map.get(priority);
if (pluginsAtPriority == null) {
pluginsAtPriority = new ArrayList<>();
map.put(priority, pluginsAtPriority);
}
pluginsAtPriority.add(plugin);
}
return map;
}
public static void clearPluginMenus(JMenu menu) {
for (int idx = menu.getItemCount() - 1; idx >= 0; idx--) {
JMenuItem it = menu.getItem(idx);
if (it == null) {
continue;
}
Action a = it.getAction();
if ((a != null) && (a instanceof BlocksPluginAction)) {
menu.remove(idx);
}
}
for (int idx = menu.getMenuComponentCount() - 1; idx >= 0; idx--) {
Component comp = menu.getMenuComponent(idx);
if ((comp instanceof JSeparator) && "plugin".equals(((JSeparator) comp).getName())) {
menu.remove(idx);
} else if ((comp instanceof JMenu) && "plugin".equals(((JMenu) comp).getName())) {
menu.remove(idx);
}
}
}
}