package org.javabuilders.swing.handler.property; import java.awt.Frame; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.javabuilders.BuildException; import org.javabuilders.BuildProcess; import org.javabuilders.BuilderConfig; import org.javabuilders.IAllowedValues; import org.javabuilders.Node; import org.javabuilders.handler.AbstractPropertyHandler; import org.javabuilders.util.BuilderUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Handles java.awt.Frame.setExtendedState(). * @author Jacek Furmankiewicz */ public class FrameExtendedStateHandler extends AbstractPropertyHandler implements IAllowedValues { public final static String STATE = "state"; public final static String ICON = "icon"; public final static String MAXH = "maxh"; public final static String MAXV = "maxv"; public final static String MAX = "max"; private final static Logger logger = LoggerFactory.getLogger(FrameExtendedStateHandler.class); private final static FrameExtendedStateHandler singleton = new FrameExtendedStateHandler(); private Map<String,Integer> values = new HashMap<String,Integer>(); /** * Return singleton * * @return Singleton */ public static FrameExtendedStateHandler getInstance() { return singleton; } /** * Constructor */ private FrameExtendedStateHandler() { super(STATE); // define list of values values.put("normal", Frame.NORMAL); values.put("iconified", Frame.ICONIFIED); values.put("maximized_horiz", Frame.MAXIMIZED_HORIZ); values.put("maximized_vert", Frame.MAXIMIZED_VERT); values.put("maximized_both", Frame.MAXIMIZED_BOTH); // user friendly aliases values.put("icon", Frame.ICONIFIED); values.put("maxh", Frame.MAXIMIZED_HORIZ); values.put("maxv", Frame.MAXIMIZED_VERT); values.put("max", Frame.MAXIMIZED_BOTH); } /* (non-Javadoc) * @see org.javabuilders.handler.IPropertyHandler#handle(org.javabuilders.BuilderConfig, org.javabuilders.BuildResult, org.javabuilders.Node, java.lang.String) */ public void handle(BuilderConfig config, BuildProcess result, Node node, String key) throws BuildException { Frame frame = (Frame) node.getMainObject(); String value = node.getStringProperty(key); Integer state = values.get(value); frame.setExtendedState(state); //this Swing functionality is buggy on non-Windows platforms //even Toolkit.getDefaultToolkit().isFrameStateSupported(state) returns the wrong value under GTK+ //need to fix it manually if (BuilderUtils.getOS() == BuilderUtils.OperatingSystem.LinuxUnix) { if (logger.isDebugEnabled()) { logger.debug("Due to OS-specific Swing bug, handling manually Frame.extendedState: " + state); } //get the max screen size GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment(); Rectangle screenRect= ge.getMaximumWindowBounds(); switch (state) { case Frame.MAXIMIZED_BOTH: frame.setSize(screenRect.width, screenRect.height); break; case Frame.MAXIMIZED_HORIZ: frame.pack(); frame.setSize(screenRect.width,frame.getHeight()); break; case Frame.MAXIMIZED_VERT: frame.pack(); frame.setSize(frame.getWidth(),screenRect.height); break; } } } /* (non-Javadoc) * @see org.javabuilders.IKeyValueConsumer#getApplicableClass() */ public Class<?> getApplicableClass() { return Frame.class; } /* (non-Javadoc) * @see org.javabuilders.IAllowedValues#getAllowedValues() */ public Collection<String> getAllowedValues() { return values.keySet(); } }