AutoRadialOffset is a boolean flag on parallel stages
- when enabled, the radialOffset is automatically
- auto radius is based on the max radius of contained components
247 lines
8.7 KiB
Java
247 lines
8.7 KiB
Java
package net.sf.openrocket.gui.main;
|
|
|
|
import java.awt.image.BufferedImage;
|
|
import java.io.IOException;
|
|
import java.net.URL;
|
|
import java.util.HashMap;
|
|
|
|
import javax.imageio.ImageIO;
|
|
import javax.swing.Icon;
|
|
import javax.swing.ImageIcon;
|
|
|
|
import net.sf.openrocket.l10n.Translator;
|
|
import net.sf.openrocket.rocketcomponent.AxialStage;
|
|
import net.sf.openrocket.rocketcomponent.BodyTube;
|
|
import net.sf.openrocket.rocketcomponent.ParallelStage;
|
|
import net.sf.openrocket.rocketcomponent.Bulkhead;
|
|
import net.sf.openrocket.rocketcomponent.CenteringRing;
|
|
import net.sf.openrocket.rocketcomponent.EllipticalFinSet;
|
|
import net.sf.openrocket.rocketcomponent.EngineBlock;
|
|
import net.sf.openrocket.rocketcomponent.FreeformFinSet;
|
|
import net.sf.openrocket.rocketcomponent.InnerTube;
|
|
import net.sf.openrocket.rocketcomponent.LaunchLug;
|
|
import net.sf.openrocket.rocketcomponent.MassComponent;
|
|
import net.sf.openrocket.rocketcomponent.MassComponent.MassComponentType;
|
|
import net.sf.openrocket.rocketcomponent.NoseCone;
|
|
import net.sf.openrocket.rocketcomponent.Parachute;
|
|
import net.sf.openrocket.rocketcomponent.PodSet;
|
|
import net.sf.openrocket.rocketcomponent.ShockCord;
|
|
import net.sf.openrocket.rocketcomponent.Streamer;
|
|
import net.sf.openrocket.rocketcomponent.Transition;
|
|
import net.sf.openrocket.rocketcomponent.TrapezoidFinSet;
|
|
import net.sf.openrocket.rocketcomponent.TubeCoupler;
|
|
import net.sf.openrocket.rocketcomponent.TubeFinSet;
|
|
import net.sf.openrocket.startup.Application;
|
|
|
|
public class ComponentIcons {
|
|
private static final Translator trans = Application.getTranslator();
|
|
|
|
private static final String ICON_DIRECTORY = "pix/componenticons/";
|
|
private static final String SMALL_SUFFIX = "-small.png";
|
|
private static final String LARGE_SUFFIX = "-large.png";
|
|
|
|
private static final HashMap<Class<?>, ImageIcon> SMALL_ICONS = new HashMap<Class<?>, ImageIcon>();
|
|
private static final HashMap<Class<?>, ImageIcon> LARGE_ICONS = new HashMap<Class<?>, ImageIcon>();
|
|
private static final HashMap<Class<?>, ImageIcon> DISABLED_ICONS = new HashMap<Class<?>, ImageIcon>();
|
|
private static final HashMap<MassComponentType, ImageIcon> MASS_COMPONENT_SMALL_ICONS = new HashMap<MassComponentType, ImageIcon>();
|
|
static {
|
|
// // Nose cone
|
|
load("nosecone", trans.get("ComponentIcons.Nosecone"), NoseCone.class);
|
|
// // Body tube
|
|
load("bodytube", trans.get("ComponentIcons.Bodytube"), BodyTube.class);
|
|
//// Transition
|
|
load("transition", trans.get("ComponentIcons.Transition"), Transition.class);
|
|
//// Trapezoidal fin set
|
|
load("trapezoidfin", trans.get("ComponentIcons.Trapezoidalfinset"), TrapezoidFinSet.class);
|
|
//// Elliptical fin set
|
|
load("ellipticalfin", trans.get("ComponentIcons.Ellipticalfinset"), EllipticalFinSet.class);
|
|
//// Freeform fin set
|
|
load("freeformfin", trans.get("ComponentIcons.Freeformfinset"), FreeformFinSet.class);
|
|
//// Tube fin set
|
|
load("tubefin", trans.get("ComponentIcons.Tubefinset"), TubeFinSet.class);
|
|
//// Launch lug
|
|
load("launchlug", trans.get("ComponentIcons.Launchlug"), LaunchLug.class);
|
|
//// Inner tube
|
|
load("innertube", trans.get("ComponentIcons.Innertube"), InnerTube.class);
|
|
//// Tube coupler
|
|
load("tubecoupler", trans.get("ComponentIcons.Tubecoupler"), TubeCoupler.class);
|
|
//// Centering ring
|
|
load("centeringring", trans.get("ComponentIcons.Centeringring"), CenteringRing.class);
|
|
//// Bulk head
|
|
load("bulkhead", trans.get("ComponentIcons.Bulkhead"), Bulkhead.class);
|
|
// // Engine block
|
|
load("engineblock", trans.get("ComponentIcons.Engineblock"),
|
|
EngineBlock.class);
|
|
// // Parachute
|
|
load("parachute", trans.get("ComponentIcons.Parachute"),
|
|
Parachute.class);
|
|
// // Streamer
|
|
load("streamer", trans.get("ComponentIcons.Streamer"), Streamer.class);
|
|
// // Shock cord
|
|
load("shockcord", trans.get("ComponentIcons.Shockcord"),
|
|
ShockCord.class);
|
|
load("mass", trans.get("ComponentIcons.Masscomponent"),
|
|
MassComponent.class);
|
|
// // Component Assemblies
|
|
load("stage", trans.get("ComponentIcons.Stage"),
|
|
AxialStage.class);
|
|
load("boosters", trans.get("ComponentIcons.Boosters"),
|
|
ParallelStage.class);
|
|
load("pods", trans.get("ComponentIcons.Pods"),
|
|
PodSet.class);
|
|
// // Mass components
|
|
loadMassTypeIcon("mass", trans.get("ComponentIcons.Masscomponent"),
|
|
MassComponentType.MASSCOMPONENT);
|
|
loadMassTypeIcon("altimeter", trans.get("ComponentIcons.Altimeter"),
|
|
MassComponentType.ALTIMETER);
|
|
loadMassTypeIcon("battery", trans.get("ComponentIcons.Battery"),
|
|
MassComponentType.BATTERY);
|
|
loadMassTypeIcon("deployment-charge",
|
|
trans.get("ComponentIcons.Deploymentcharge"),
|
|
MassComponentType.DEPLOYMENTCHARGE);
|
|
loadMassTypeIcon("payload", trans.get("ComponentIcons.Payload"),
|
|
MassComponentType.PAYLOAD);
|
|
loadMassTypeIcon("flight-comp",
|
|
trans.get("ComponentIcons.Flightcomputer"),
|
|
MassComponentType.FLIGHTCOMPUTER);
|
|
loadMassTypeIcon("recovery-hardware",
|
|
trans.get("ComponentIcons.Recoveryhardware"),
|
|
MassComponentType.RECOVERYHARDWARE);
|
|
loadMassTypeIcon("tracker", trans.get("ComponentIcons.Tracker"),
|
|
MassComponentType.TRACKER);
|
|
}
|
|
|
|
private static void load(String filename, String name,
|
|
Class<?> componentClass) {
|
|
ImageIcon icon = loadSmall(ICON_DIRECTORY + filename + SMALL_SUFFIX,
|
|
name);
|
|
SMALL_ICONS.put(componentClass, icon);
|
|
|
|
ImageIcon[] icons = loadLarge(ICON_DIRECTORY + filename + LARGE_SUFFIX,
|
|
name);
|
|
LARGE_ICONS.put(componentClass, icons[0]);
|
|
DISABLED_ICONS.put(componentClass, icons[1]);
|
|
}
|
|
|
|
private static void loadMassTypeIcon(String filename, String name,
|
|
MassComponentType t) {
|
|
ImageIcon icon = loadSmall(ICON_DIRECTORY + filename + SMALL_SUFFIX,
|
|
name);
|
|
MASS_COMPONENT_SMALL_ICONS.put(t, icon);
|
|
}
|
|
|
|
/**
|
|
* Return the small icon for a component type.
|
|
*
|
|
* @param c
|
|
* the component class.
|
|
* @return the icon, or <code>null</code> if none available.
|
|
*/
|
|
public static Icon getSmallIcon(Class<?> c) {
|
|
if (c.isAssignableFrom(MassComponent.class)) {
|
|
}
|
|
return SMALL_ICONS.get(c);
|
|
}
|
|
|
|
public static Icon getSmallMassTypeIcon(MassComponentType t) {
|
|
return MASS_COMPONENT_SMALL_ICONS.get(t);
|
|
}
|
|
|
|
/**
|
|
* Return the large icon for a component type.
|
|
*
|
|
* @param c
|
|
* the component class.
|
|
* @return the icon, or <code>null</code> if none available.
|
|
*/
|
|
public static Icon getLargeIcon(Class<?> c) {
|
|
return LARGE_ICONS.get(c);
|
|
}
|
|
|
|
/**
|
|
* Return the large disabled icon for a component type.
|
|
*
|
|
* @param c
|
|
* the component class.
|
|
* @return the icon, or <code>null</code> if none available.
|
|
*/
|
|
public static Icon getLargeDisabledIcon(Class<?> c) {
|
|
return DISABLED_ICONS.get(c);
|
|
}
|
|
|
|
private static ImageIcon loadSmall(String file, String desc) {
|
|
URL url = ClassLoader.getSystemResource(file);
|
|
if (url == null) {
|
|
Application.getExceptionHandler().handleErrorCondition(
|
|
"ERROR: Couldn't find file: " + file);
|
|
return null;
|
|
}
|
|
return new ImageIcon(url, desc);
|
|
}
|
|
|
|
private static ImageIcon[] loadLarge(String file, String desc) {
|
|
ImageIcon[] icons = new ImageIcon[2];
|
|
|
|
URL url = ClassLoader.getSystemResource(file);
|
|
if (url != null) {
|
|
BufferedImage bi, bi2;
|
|
try {
|
|
bi = ImageIO.read(url);
|
|
bi2 = ImageIO.read(url); // How the fsck can one duplicate a
|
|
// BufferedImage???
|
|
} catch (IOException e) {
|
|
Application.getExceptionHandler().handleErrorCondition(
|
|
"ERROR: Couldn't read file: " + file, e);
|
|
return new ImageIcon[] { null, null };
|
|
}
|
|
|
|
icons[0] = new ImageIcon(bi, desc);
|
|
|
|
// Create disabled icon
|
|
boolean useAlphaFade = false; // don't use fade to alpha yet
|
|
if (useAlphaFade) { // Fade using alpha
|
|
|
|
/*
|
|
* TODO This code to do fade using alpha had been dead code
|
|
* inside a "if (false) {" block. Eclipse would give a build
|
|
* warning about dead code, so this code has been commented out
|
|
* but left here for future use; am assuming it was dead code
|
|
* because it wasn't working correctly but that it will be
|
|
* useful in the future.
|
|
*/
|
|
// int rgb[] = bi2.getRGB(0, 0, bi2.getWidth(), bi2.getHeight(),
|
|
// null, 0, bi2.getWidth());
|
|
// for (int i = 0; i < rgb.length; i++) {
|
|
// final int alpha = (rgb[i] >> 24) & 0xFF;
|
|
// rgb[i] = (rgb[i] & 0xFFFFFF) | (alpha / 3) << 24;
|
|
//
|
|
// //rgb[i] = (rgb[i]&0xFFFFFF) | ((rgb[i]>>1)&0x3F000000);
|
|
// }
|
|
// bi2.setRGB(0, 0, bi2.getWidth(), bi2.getHeight(), rgb, 0,
|
|
// bi2.getWidth());
|
|
|
|
} else { // Raster alpha
|
|
|
|
for (int x = 0; x < bi.getWidth(); x++) {
|
|
for (int y = 0; y < bi.getHeight(); y++) {
|
|
if ((x + y) % 2 == 0) {
|
|
bi2.setRGB(x, y, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
// // (disabled)
|
|
icons[1] = new ImageIcon(bi2, desc + " "
|
|
+ trans.get("ComponentIcons.disabled"));
|
|
|
|
return icons;
|
|
} else {
|
|
Application.getExceptionHandler().handleErrorCondition(
|
|
"ERROR: Couldn't find file: " + file);
|
|
return new ImageIcon[] { null, null };
|
|
}
|
|
}
|
|
}
|