/*
* Copyright 2003-2016 JetBrains s.r.o.
*
* 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 jetbrains.mps.ide.devkit.generator;
import com.intellij.icons.AllIcons.Actions;
import com.intellij.icons.AllIcons.General;
import com.intellij.icons.AllIcons.Nodes;
import jetbrains.mps.icons.MPSIcons.Generator;
import jetbrains.mps.ide.devkit.generator.TraceNodeUI.Kind;
import jetbrains.mps.ide.icons.IconManager;
import jetbrains.mps.ide.icons.IdeIcons;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.mps.openapi.model.SNode;
import javax.swing.Icon;
import java.awt.Component;
import java.awt.Graphics;
/*package*/final class Icons {
// view
public static final Icon CLOSE = Actions.Cancel;
public static final Icon AUTOSCROLL_TO_SOURCE = General.AutoscrollToSource;
public static final Icon COLLECTION = Nodes.Folder;
/**
* @return never {@code null}, default icon image if neither node nor kind are specified
*/
/*package*/ static Icon getIcon(@Nullable Kind kind, @Nullable SNode node) {
Icon mainIcon = getNodeIcon(node);
if (kind == null) {
return mainIcon;
}
return new CompositeIcon(mainIcon, getKindIcon(kind));
}
private static Icon getNodeIcon(@Nullable SNode node) {
Icon icon = node == null ? null : IconManager.getIconFor(node);
return icon != null ? icon : IdeIcons.DEFAULT_ICON;
}
private static Icon getKindIcon(Kind kind) {
switch (kind) {
case INPUT:
case APPROXIMATE_INPUT:
return Generator.Input;
case OUTPUT:
case APPROXIMATE_OUTPUT:
return Generator.Output;
case RULE: return Generator.Rule;
case RULE_CONSEQUENCE: return Generator.RuleConsequence;
case MACRO: return Generator.Macro;
case TEMPLATE: return Generator.Template;
case SWITCH: return Generator.Switch;
case COPY_OPERATION: return Generator.CopyOperation;
case MAPPING_SCRIPT: return Generator.MappingScript;
}
return null;
}
private static class CompositeIcon implements Icon {
private Icon myMainIcon;
private Icon myMarkerIcon; // 12 x 12
private CompositeIcon(Icon mainIcon, Icon markerIcon) {
myMainIcon = mainIcon;
myMarkerIcon = markerIcon;
}
public void paintIcon(Component c, Graphics g, int x, int y) {
if (myMainIcon != null) {
myMainIcon.paintIcon(c, g, x + 12, y);
}
if (myMarkerIcon != null) {
myMarkerIcon.paintIcon(c, g, x, y + (getIconHeight() - myMarkerIcon.getIconHeight()) / 2);
}
}
public int getIconWidth() {
int mainIconWidth = 18;
if (myMainIcon != null) {
mainIconWidth = Math.max(18, myMainIcon.getIconWidth());
}
return mainIconWidth + 12;
}
public int getIconHeight() {
if (myMainIcon != null) {
return Math.max(18, myMainIcon.getIconHeight());
}
return 18;
}
}
}