/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * 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 org.pentaho.di.ui.core.dialog; import java.io.BufferedReader; import java.io.InputStreamReader; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; import org.apache.commons.lang.StringUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.pentaho.di.core.Const; import org.pentaho.di.core.SwtUniversalImage; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.logging.LogChannel; import org.pentaho.di.core.logging.LogChannelInterface; import org.pentaho.di.i18n.BaseMessages; import org.pentaho.di.laf.BasePropertyHandler; import org.pentaho.di.ui.spoon.Spoon; import org.pentaho.di.ui.util.SwtSvgImageUtil; import org.pentaho.di.version.BuildVersion; /** * Displays the Kettle splash screen * * @author Matt * @since 14-mrt-2005 */ public class Splash { private Shell splash; private Image kettle_image; private Image kettle_icon; private Image exclamation_image; private Font verFont; private Font licFont; private Font devWarningFont; private Color versionWarningBackgroundColor; private Color versionWarningForegroundColor; private int licFontSize = 8; private static Class<?> PKG = Splash.class; // for i18n purposes, needed by Translator2!! private static LogChannelInterface log; public Splash( Display display ) throws KettleException { this( display, new Shell( display, SWT.APPLICATION_MODAL ) ); } protected Splash( Display display, Shell splashShell ) throws KettleException { log = new LogChannel( Spoon.APP_NAME ); Rectangle displayBounds = display.getPrimaryMonitor().getBounds(); // "kettle_splash.png" kettle_image = loadAsResource( display, BasePropertyHandler.getProperty( "splash_image" ) ); // "spoon.ico" kettle_icon = loadAsResource( display, BasePropertyHandler.getProperty( "splash_icon" ) ); // "exclamation.png" exclamation_image = loadAsResource( display, BasePropertyHandler.getProperty( "exclamation_image" ) ); verFont = new Font( display, "Helvetica", 11, SWT.BOLD ); licFont = new Font( display, "Helvetica", licFontSize, SWT.NORMAL ); devWarningFont = new Font( display, "Helvetica", 10, SWT.NORMAL ); // versionWarningBackgroundColor = new Color(display, 255, 253, 213); versionWarningBackgroundColor = new Color( display, 255, 255, 255 ); versionWarningForegroundColor = new Color( display, 220, 177, 20 ); splash = splashShell; splash.setImage( kettle_icon ); splash.setText( BaseMessages.getString( PKG, "SplashDialog.Title" ) ); // "Pentaho Data Integration" splash.addPaintListener( new PaintListener() { public void paintControl( PaintEvent e ) { StringBuilder sb = new StringBuilder(); String line = null; try { BufferedReader reader = new BufferedReader( new InputStreamReader( Splash.class.getClassLoader().getResourceAsStream( "org/pentaho/di/ui/core/dialog/license/license.txt" ) ) ); while ( ( line = reader.readLine() ) != null ) { sb.append( line + System.getProperty( "line.separator" ) ); } } catch ( Exception ex ) { sb.append( "" ); log.logError( BaseMessages.getString( PKG, "SplashDialog.LicenseTextNotFound" ), ex ); } Calendar cal = Calendar.getInstance(); String licenseText = String.format( sb.toString(), cal ); e.gc.drawImage( kettle_image, 0, 0 ); String fullVersionText = BaseMessages.getString( PKG, "SplashDialog.Version" ); String buildVersion = BuildVersion.getInstance().getVersion(); if ( StringUtils.ordinalIndexOf( buildVersion, ".", 2 ) > 0 ) { fullVersionText = fullVersionText + " " + buildVersion.substring( 0, StringUtils.ordinalIndexOf( buildVersion, ".", 2 ) ); } else { fullVersionText = fullVersionText + " " + buildVersion; } e.gc.setFont( verFont ); e.gc.setForeground( display.getSystemColor( SWT.COLOR_WHITE ) ); e.gc.drawText( fullVersionText, 290, 205, true ); String inputStringDate = BuildVersion.getInstance().getBuildDate(); String outputStringDate = ""; SimpleDateFormat inputFormat = null; SimpleDateFormat outputFormat = null; if ( inputStringDate.matches( "^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}:\\d{2}:\\d{2}.\\d{3}$" ) ) { inputFormat = new SimpleDateFormat( "yyyy/MM/dd hh:mm:ss.SSS" ); } if ( inputStringDate.matches( "^\\d{4}-\\d{1,2}-\\d{1,2}\\_\\d{1,2}-\\d{2}-\\d{2}$" ) ) { inputFormat = new SimpleDateFormat( "yyyy-MM-dd_hh-mm-ss" ); } if ( inputStringDate.matches( "^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}.\\d{2}.\\d{2}$" ) ) { inputFormat = new SimpleDateFormat( "yyyy-MM-dd hh.mm.ss" ); } outputFormat = new SimpleDateFormat( "MMMM d, yyyy hh:mm:ss" ); try { if ( inputFormat != null ) { Date date = inputFormat.parse( inputStringDate ); outputStringDate = outputFormat.format( date ); } else { // If date isn't correspond to formats above just show date in origin format outputStringDate = inputStringDate; } } catch ( ParseException pe ) { // Just show date in origin format outputStringDate = inputStringDate; } // try using the desired font size for the license text e.gc.setFont( licFont ); e.gc.setForeground( display.getSystemColor( SWT.COLOR_WHITE ) ); // if the text will not fit the allowed space while ( !willLicenseTextFit( licenseText, e.gc ) ) { licFontSize--; if ( licFont != null ) { licFont.dispose(); } licFont = new Font( e.display, "Helvetica", licFontSize, SWT.NORMAL ); e.gc.setFont( licFont ); } e.gc.drawText( licenseText, 290, 275, true ); String version = buildVersion; // If this is a Milestone or RC release, warn the user if ( Const.RELEASE.equals( Const.ReleaseType.MILESTONE ) ) { version = BaseMessages.getString( PKG, "SplashDialog.DeveloperRelease" ) + " - " + version; drawVersionWarning( e ); } else if ( Const.RELEASE.equals( Const.ReleaseType.RELEASE_CANDIDATE ) ) { version = BaseMessages.getString( PKG, "SplashDialog.ReleaseCandidate" ) + " - " + version; } else if ( Const.RELEASE.equals( Const.ReleaseType.PREVIEW ) ) { version = BaseMessages.getString( PKG, "SplashDialog.PreviewRelease" ) + " - " + version; } else if ( Const.RELEASE.equals( Const.ReleaseType.GA ) ) { version = BaseMessages.getString( PKG, "SplashDialog.GA" ) + " - " + version; } String buildDate = BaseMessages.getString( PKG, "SplashDialog.BuildDate" ) + " " + outputStringDate; // use the same font/size as the license text e.gc.setForeground( display.getSystemColor( SWT.COLOR_WHITE ) ); e.gc.drawText( version, 290, 235, true ); e.gc.drawText( buildDate, 290, 250, true ); } } ); splash.addDisposeListener( new DisposeListener() { public void widgetDisposed( DisposeEvent arg0 ) { kettle_image.dispose(); kettle_icon.dispose(); exclamation_image.dispose(); verFont.dispose(); licFont.dispose(); devWarningFont.dispose(); versionWarningForegroundColor.dispose(); versionWarningBackgroundColor.dispose(); } } ); Rectangle bounds = kettle_image.getBounds(); int x = ( displayBounds.width - bounds.width ) / 2; int y = ( displayBounds.height - bounds.height ) / 2; splash.setSize( bounds.width, bounds.height ); splash.setLocation( x, y ); splash.open(); TimerTask timerTask = new TimerTask() { @Override public void run() { try { splash.redraw(); LogChannel.UI.logBasic( "Redraw!" ); } catch ( Throwable e ) { // ignore. } } }; final Timer timer = new Timer(); timer.schedule( timerTask, 0, 100 ); splash.addDisposeListener( new DisposeListener() { public void widgetDisposed( DisposeEvent arg0 ) { timer.cancel(); } } ); } // load image from svg private Image loadAsResource( Display display, String location ) { SwtUniversalImage img = SwtSvgImageUtil.getImageAsResource( display, location ); Image image = new Image( display, img.getAsBitmap( display ), SWT.IMAGE_COPY ); img.dispose(); return image; } // determine if the license text will fit the allocated space private boolean willLicenseTextFit( String licenseText, GC gc ) { Point splashSize = splash.getSize(); Point licenseDrawLocation = new Point( 290, 290 ); Point requiredSize = gc.textExtent( licenseText ); int width = splashSize.x - licenseDrawLocation.x; int height = splashSize.y - licenseDrawLocation.y; boolean fitsVertically = width >= requiredSize.x; boolean fitsHorizontally = height >= requiredSize.y; return ( fitsVertically && fitsHorizontally ); } private void drawVersionWarning( PaintEvent e ) { drawVersionWarning( e.gc, e.display ); } private void drawVersionWarning( GC gc, Display display ) { gc.setBackground( versionWarningBackgroundColor ); gc.setForeground( display.getSystemColor( SWT.COLOR_WHITE ) ); // gc.fillRectangle(290, 231, 367, 49); // gc.drawRectangle(290, 231, 367, 49); gc.drawImage( exclamation_image, 304, 243 ); gc.setFont( devWarningFont ); gc.drawText( BaseMessages.getString( PKG, "SplashDialog.DevelopmentWarning" ), 335, 241, true ); } public void dispose() { if ( !splash.isDisposed() ) { splash.dispose(); } } public void hide() { if ( !splash.isDisposed() ) { splash.setVisible( false ); } } public void show() { if ( !splash.isDisposed() ) { splash.setVisible( true ); } } }