package jetbrains.mps.editor.contextActionsTool.pluginSolution.plugin;
/*Generated by MPS */
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import jetbrains.mps.nodeEditor.assist.SelectionMenuProvider;
import java.util.List;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.openapi.editor.selection.Selection;
import jetbrains.mps.openapi.editor.menus.transformation.TransformationMenuItem;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.ArrayList;
import jetbrains.mps.openapi.editor.menus.transformation.TransformationMenuItemVisitor;
import jetbrains.mps.openapi.editor.menus.transformation.ActionItem;
import jetbrains.mps.openapi.editor.menus.transformation.SubMenu;
import javax.swing.Icon;
import jetbrains.mps.editor.contextActionsTool.lang.menus.runtime.SidebarActionItem;
import jetbrains.mps.ide.icons.IconManager;
import org.apache.log4j.Level;
import org.jetbrains.annotations.Nullable;
import jetbrains.mps.openapi.editor.menus.transformation.CommandPolicy;
public class ItemConverter {
private static final Logger LOG = LogManager.getLogger(ItemConverter.class);
private final SelectionMenuProvider myMenuProvider;
public ItemConverter(SelectionMenuProvider menuProvider) {
myMenuProvider = menuProvider;
}
protected List<ToolComponent.IItem> queryItems(@NotNull Selection selection) {
List<TransformationMenuItem> menuItems = myMenuProvider.getMenuItems(selection);
return convertItems(menuItems);
}
public static List<ToolComponent.IItem> convertItems(List<TransformationMenuItem> menuItems) {
List<ToolComponent.IItem> uiItems = ListSequence.fromList(new ArrayList<ToolComponent.IItem>());
convertItems(menuItems, "", uiItems);
return uiItems;
}
private static void convertItems(List<TransformationMenuItem> inItems, final String folderName, final List<ToolComponent.IItem> outItems) {
for (TransformationMenuItem inItem : ListSequence.fromList(inItems)) {
inItem.accept(new TransformationMenuItemVisitor<Void>() {
@Override
public Void visit(ActionItem actionItem) {
ListSequence.fromList(outItems).addElement(convertActionItem(actionItem, folderName));
return null;
}
@Override
public Void visit(SubMenu subMenu) {
String subfolderName = ((folderName == null || folderName.length() == 0) ? subMenu.getText() : folderName + "/" + subMenu.getText());
convertItems(subMenu.getItems(), subfolderName, outItems);
return null;
}
});
}
}
private static ToolComponent.IItem convertActionItem(ActionItem actionItem, String folderName) {
Icon icon = null;
String tooltip = null;
if (actionItem instanceof SidebarActionItem) {
SidebarActionItem sidebarItem = (SidebarActionItem) actionItem;
try {
icon = IconManager.getIconForResource(sidebarItem.getIcon());
} catch (LinkageError error) {
if (LOG.isEnabledFor(Level.WARN)) {
LOG.warn("Error trying to get icon for " + actionItem, error);
}
} catch (RuntimeException exception) {
if (LOG.isEnabledFor(Level.WARN)) {
LOG.warn("Exception trying to get icon for " + actionItem, exception);
}
}
try {
tooltip = sidebarItem.getTooltipText();
} catch (LinkageError error) {
if (LOG.isEnabledFor(Level.WARN)) {
LOG.warn("Error trying to get tooltip text for " + actionItem, error);
}
} catch (RuntimeException exception) {
if (LOG.isEnabledFor(Level.WARN)) {
LOG.warn("Exception trying to get tooltip text for " + actionItem, exception);
}
}
}
return new ItemConverter.Item(actionItem, folderName, icon, tooltip);
}
private static class Item implements ToolComponent.IItem {
private final ActionItem myActionItem;
private final String myLabel;
private final String myFolderName;
@Nullable
private final Icon myIcon;
@Nullable
private final String myTooltip;
private Item(ActionItem actionItem, String folderName, Icon icon, String tooltip) {
myActionItem = actionItem;
myLabel = actionItem.getLabelText("");
myFolderName = folderName;
myIcon = icon;
myTooltip = tooltip;
}
@Override
public String getLabel() {
return myLabel;
}
@Override
public Icon getIcon() {
return myIcon;
}
@Override
public String getFolderName() {
return myFolderName;
}
@Override
public String getTooltip() {
return myTooltip;
}
@Override
public boolean isVisible() {
return myActionItem.canExecute("");
}
@Override
public void execute() {
myActionItem.execute("");
}
@NotNull
public CommandPolicy getCommandPolicy() {
return myActionItem.getCommandPolicy();
}
}
}