org.pentaho.di.ui.core.dialog.Splash.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.di.ui.core.dialog.Splash.java

Source

/*! ******************************************************************************
 *
 * 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);
        }
    }
}