package bibliothek.util.workarounds; import java.awt.Component; import java.awt.Dialog; import java.awt.Frame; import java.awt.Rectangle; import java.awt.Shape; import java.awt.Window; import bibliothek.gui.DockController; import bibliothek.gui.dock.StackDockStation; import bibliothek.gui.dock.station.stack.DnDAutoSelectSupport; import com.sun.awt.AWTUtilities; import com.sun.awt.AWTUtilities.Translucency; /** * Workarounds necessary for Java 1.6. * @author Benjamin Sigg */ public class Java6Workaround implements Workaround{ /** whether to print any warnings */ private static boolean printWarnings = false; /** * Sets whether the methods of the {@link Java6Workaround} can print warnings or not. Calling this method * affects <b>all</b> workarounds. The default behavior is <b>not</b> to print warnings. * @param printWarnings whether to print warnings */ public static void setPrintWarnings( boolean printWarnings ){ Java6Workaround.printWarnings = printWarnings; } /** * Tells whether all {@link Java6Workaround}s are allowed to print warnings. * @return whether to print warnings * @see #setPrintWarnings(boolean) */ public static boolean isPrintWarnings(){ return printWarnings; } /** ensures the warning message is printed out at most once */ private boolean invocationTargetException = false; @Override public void setup( DockController controller ){ controller.getProperties().set( StackDockStation.DND_AUTO_SELECT_SUPPORT, new DnDAutoSelectSupport() ); } public void markAsGlassPane( Component component ){ try{ AWTUtilities.setComponentMixingCutoutShape( component, new Rectangle() ); } catch( NoClassDefFoundError ex ){ // ignore } catch( NoSuchMethodError ex ){ // ignore } catch( SecurityException ex ){ // ignore } catch( IllegalArgumentException e ){ // ignore } } private boolean supports( Translucency translucency ){ // AWTUtilities.isTranslucencySupported(Translucency) try{ return AWTUtilities.isTranslucencySupported( translucency ); } catch( SecurityException ex ){ // ignore } catch( NoClassDefFoundError ex ){ // ignore } catch( NoSuchMethodError ex ){ // ignore } catch( Exception ex ){ if( printWarnings && !invocationTargetException ){ invocationTargetException = true; ex.printStackTrace(); } } return false; } public boolean supportsPerpixelTranslucency( Window window ){ try{ return supports( Translucency.PERPIXEL_TRANSLUCENT ); } catch( NoClassDefFoundError ex ){ // ignore } catch( NoSuchFieldError ex ){ // ignore } return false; } public boolean supportsPerpixelTransparency( Window window ){ if( window instanceof Dialog && !((Dialog)window).isUndecorated() ){ return false; } if( window instanceof Frame && !((Frame)window).isUndecorated() ){ return false; } try{ return supports( Translucency.PERPIXEL_TRANSPARENT ); } catch( NoClassDefFoundError ex ){ // ignore } catch( NoSuchFieldError ex ){ // ignore } return false; } public boolean setTranslucent( Window window ){ if( !supportsPerpixelTranslucency( window )){ return false; } try{ AWTUtilities.setWindowOpaque( window, false ); return true; } catch( NoClassDefFoundError ex ){ // ignore } catch( NoSuchMethodError ex ){ // ignore } catch( SecurityException ex ){ // ignore } catch( Exception ex ){ if( printWarnings && !invocationTargetException ){ invocationTargetException = true; ex.printStackTrace(); } } return false; } public boolean setTransparent( Window window, Shape shape ){ if( !supportsPerpixelTransparency( window )){ return false; } try{ AWTUtilities.setWindowShape( window, shape ); return true; } catch( NoClassDefFoundError ex ){ // ignore } catch( NoSuchMethodError ex ){ // ignore } catch( SecurityException ex ){ // ignore } catch( Exception ex ){ if( printWarnings && !invocationTargetException ){ invocationTargetException = true; ex.printStackTrace(); } } return false; } }