release 0.9.6
[debian/openrocket] / src / net / sf / openrocket / gui / main / Splash.java
diff --git a/src/net/sf/openrocket/gui/main/Splash.java b/src/net/sf/openrocket/gui/main/Splash.java
new file mode 100644 (file)
index 0000000..15198c3
--- /dev/null
@@ -0,0 +1,103 @@
+package net.sf.openrocket.gui.main;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.SplashScreen;
+import java.awt.font.GlyphVector;
+import java.awt.geom.Rectangle2D;
+import java.io.IOException;
+
+import net.sf.openrocket.util.Prefs;
+
+/**
+ * Helper methods for manipulating the Java runtime splash screen.
+ * <p>
+ * Notes:
+ * SplashScreen.update() takes randomly between 4 and 500 ms to complete,
+ * even after it has been called ~100 times (and therefore pre-compiled).
+ * Therefore it cannot be relied upon to perform for example color fades.
+ * Care should be taken to call update() only once or twice per second.
+ * 
+ * @author Sampo Niskanen <sampo.niskanen@iki.fi>
+ */
+public class Splash {
+       
+       // The right edge of the text base line for the version string
+       private static final int VERSION_POSITION_X = 617;
+       private static final int VERSION_POSITION_Y = 135;
+       private static final Font VERSION_FONT = new Font(Font.SANS_SERIF, Font.PLAIN, 9);
+       private static final Color VERSION_COLOR = Color.WHITE;
+       
+       
+       /**
+        * Initialize the splash screen with additional information.  This method should
+        * be called as soon as reasonably possible during program startup.
+        * 
+        * @return      <code>true</code> if the splash screen could be successfully initialized
+        */
+       public static boolean init() {
+               // Get the splash screen
+               SplashScreen s = getSplash();
+               if (s == null)
+                       return false;
+               
+               // Create graphics context and set antialiasing on
+               Graphics2D g2 = s.createGraphics();
+               g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, 
+                               RenderingHints.VALUE_STROKE_NORMALIZE);
+               g2.setRenderingHint(RenderingHints.KEY_RENDERING, 
+                               RenderingHints.VALUE_RENDER_QUALITY);
+               g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
+                               RenderingHints.VALUE_ANTIALIAS_ON);
+               
+               // Draw the version number
+               drawVersionNumber(g2);
+               
+               // Update the splash screen
+               s.update();
+               return true;
+       }
+       
+       
+       
+       private static void drawVersionNumber(Graphics2D g2) {
+               String text = "Version " + Prefs.getVersion();
+               GlyphVector gv = VERSION_FONT.createGlyphVector(g2.getFontRenderContext(), text);
+               
+               Rectangle2D rect = gv.getVisualBounds();
+               double width = rect.getWidth();
+               
+               g2.setColor(VERSION_COLOR);
+               g2.drawGlyphVector(gv, (float)(VERSION_POSITION_X - width), (float)VERSION_POSITION_Y);
+               
+       }
+       
+       
+       /**
+        * Return the current splash screen or <code>null</code> if not available.
+        * This method catches the possible exceptions and returns null if they occur.
+        * 
+        * @return      the current splash screen, or <code>null</code>.
+        */
+       private static SplashScreen getSplash() {
+               try {
+                       return SplashScreen.getSplashScreen();
+               } catch (RuntimeException e) {
+                       return null;
+               }
+       }
+       
+
+       
+       
+       public static void main(String[] args) throws InterruptedException, IOException {
+               System.out.println("Calling init...");
+               System.out.println("Init returned " + Splash.init());
+               System.out.println("Press enter...");
+               System.in.read();
+               System.out.println("Exiting...");
+       }
+
+}