/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2017 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.awt.Desktop;
import java.net.URI;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.logging.LogChannel;
import org.pentaho.di.core.logging.LogChannelInterface;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.ui.core.PropsUI;
import org.pentaho.di.ui.core.gui.WindowProperty;
/**
* Dialog that shows a warning when the Browser Environment is not supported.
*/
public class BrowserEnvironmentWarningDialog extends Dialog {
private static Class<?> PKG = BrowserEnvironmentWarningDialog.class; // for i18n purposes, needed by Translator2!!
private Shell shell;
private PropsUI props;
private Label warningIcon;
private Text description;
private Link link;
private Button closeButton;
private final int margin = Const.FORM_MARGIN * 3; //15
private final int padding = margin * 2; //30
private final int MAX_TEXT_WIDTH_UBUNTU = 418;
private final int MAX_TEXT_WIDTH_WINDOWS = 286;
private final int MAX_TEXT_WIDTH_MAC = 326;
private final LogChannelInterface log = new LogChannel( this );
private static final String URI_PATH = "/0D0/160/000";
public BrowserEnvironmentWarningDialog( Shell parent ) {
super( parent, SWT.NONE );
}
public void showWarningDialog( EnvironmentCase environment ) {
switch ( environment ) {
case UBUNTU:
showUbuntuWarningDialog();
break;
case UBUNTU_THIN:
showUbuntuThinWarningDialog();
break;
case MAC_OS_X:
showMacWarningDialog();
break;
case MAC_OS_X_THIN:
showMacThinWarningDialog();
break;
case WINDOWS:
showWindowsWarningDialog();
break;
case WINDOWS_THIN:
showWindowsThinWarningDialog();
break;
default:
log.logBasic( "Unknown Environment" );
}
}
private void showMacWarningDialog() {
showWarningDialog(
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.Title" ),
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.Message.Mac" ),
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.HelpLink" ),
EnvironmentCase.MAC_OS_X,
MAX_TEXT_WIDTH_MAC );
}
private void showUbuntuWarningDialog() {
showWarningDialog(
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.Title.Ubuntu" ),
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.Message.Ubuntu" ),
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.HelpLink.Ubuntu" ),
EnvironmentCase.UBUNTU,
MAX_TEXT_WIDTH_UBUNTU );
}
private void showWindowsWarningDialog() {
showWarningDialog(
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.Title" ),
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.Message.Windows" ),
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.HelpLink" ),
EnvironmentCase.WINDOWS,
MAX_TEXT_WIDTH_WINDOWS );
}
private void showMacThinWarningDialog() {
showWarningDialog(
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.Title" ),
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.Message.Mac.Thin" ),
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.HelpLink" ),
EnvironmentCase.MAC_OS_X_THIN,
MAX_TEXT_WIDTH_MAC );
}
private void showUbuntuThinWarningDialog() {
showWarningDialog(
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.Title.Ubuntu" ),
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.Message.Ubuntu.Thin" ),
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.HelpLink.Ubuntu" ),
EnvironmentCase.UBUNTU_THIN,
MAX_TEXT_WIDTH_UBUNTU );
}
private void showWindowsThinWarningDialog() {
showWarningDialog(
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.Title" ),
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.Message.Windows.Thin" ),
BaseMessages.getString( PKG, "BrowserEnvironmentWarningDialog.HelpLink" ),
EnvironmentCase.WINDOWS_THIN,
MAX_TEXT_WIDTH_WINDOWS );
}
/**
* showWarningDialog
*
* Shows a SWT dialog warning the user that something is wrong with the browser environment.
*
* @param title the title on the top of the window.
* @param message the message at the center of the screen.
* @param helpLink a string that contains a hyperlink to a help web page.
* @param maxTextWidth the width for the text inside the dialog.
*/
private void showWarningDialog( String title, String message, String helpLink, EnvironmentCase environment,
int maxTextWidth ) {
if ( this.getParent().isDisposed() ) {
return;
}
this.props = PropsUI.getInstance();
Display display = this.getParent().getDisplay();
shell = new Shell( this.getParent(), SWT.TITLE | SWT.APPLICATION_MODAL );
props.setLook( shell );
FormLayout formLayout = new FormLayout();
formLayout.marginWidth = margin;
formLayout.marginHeight = margin;
shell.setLayout( formLayout ); // setting layout
shell.setText( title ); //setting title of the window
setWarningIcon( display ); //adding icon
setWarningText( message, maxTextWidth ); //adding text
setHelpLink( display, helpLink, maxTextWidth, environment ); //adding link
setCloseButton(); //adding button
shell.setSize( shell.computeSize( SWT.DEFAULT, SWT.DEFAULT, true ) );
Rectangle screenSize = display.getPrimaryMonitor().getBounds();
shell.setLocation( ( screenSize.width - shell.getBounds().width ) / 2, ( screenSize.height - shell.getBounds().height ) / 2 );
closeButton.setFocus();
shell.open();
while ( !shell.isDisposed() ) {
if ( !display.readAndDispatch() ) {
display.sleep();
}
}
}
private void setWarningIcon( Display display ) {
warningIcon = new Label( shell, SWT.NONE );
Image image = display.getSystemImage( SWT.ICON_WARNING );
warningIcon.setImage( image );
props.setLook( warningIcon );
FormData fdIcon = new FormData();
fdIcon.left = new FormAttachment( 0, 0 );
fdIcon.top = new FormAttachment( 0, 0 );
fdIcon.right = new FormAttachment( 0, image.getBounds().width );
fdIcon.bottom = new FormAttachment( 0, image.getBounds().height ); //icon should be at the top left corner
warningIcon.setLayoutData( fdIcon );
}
private void setWarningText( String message, int maxTextWidth ) {
description = new Text( shell, SWT.MULTI | SWT.LEFT | SWT.WRAP | SWT.NO_FOCUS | SWT.HIDE_SELECTION );
description.setText( message );
description.setEditable( false );
FormData fdlDesc = new FormData();
fdlDesc.left = new FormAttachment( warningIcon, margin ); // Text should be right of the icon and at the top
fdlDesc.top = new FormAttachment( 0, 0 );
fdlDesc.width = maxTextWidth;
description.setLayoutData( fdlDesc );
props.setLook( description );
}
private void setHelpLink( Display display, String helpLink, int maxTextWidth, EnvironmentCase environment ) {
link = new Link( shell, SWT.SINGLE | SWT.WRAP );
link.setText( helpLink );
if ( environment == EnvironmentCase.MAC_OS_X || environment == EnvironmentCase.MAC_OS_X_THIN ) {
FontData[] fD = link.getFont().getFontData();
fD[0].setHeight( 13 );
link.setFont( new Font( display, fD[0] ) );
}
FormData fdlink = new FormData();
fdlink.left = new FormAttachment( warningIcon, margin ); // Link should be below description right of icon
fdlink.top = new FormAttachment( description, margin );
fdlink.width = maxTextWidth;
link.setLayoutData( fdlink );
props.setLook( link );
link.addListener( SWT.Selection, new Listener() {
public void handleEvent( Event event ) {
if ( Desktop.isDesktopSupported() ) {
try {
Desktop.getDesktop().browse( new URI( Const.getDocUrl( URI_PATH ) ) );
} catch ( Exception e ) {
log.logError( "Error opening external browser", e );
}
}
}
} );
}
private void setCloseButton() {
closeButton = new Button( shell, SWT.PUSH );
closeButton.setText( BaseMessages.getString( PKG, "System.Button.Close" ) );
FormData fdbutton = new FormData();
fdbutton.right = new FormAttachment( 100, 0 ); //Button should below the link and separated by 30
fdbutton.top = new FormAttachment( link, padding );
fdbutton.height = padding;
closeButton.setLayoutData( fdbutton );
props.setLook( closeButton );
// Add listeners
closeButton.addListener( SWT.Selection, new Listener() {
public void handleEvent( Event e ) {
close();
}
} );
}
/**
* dispose
*
* used to dispose the dialog.
*/
public void dispose() {
props.setScreen( new WindowProperty( shell ) );
shell.dispose();
}
private void close() {
dispose();
}
public enum EnvironmentCase {
UBUNTU, UBUNTU_THIN, MAC_OS_X, MAC_OS_X_THIN, WINDOWS, WINDOWS_THIN
}
}