/******************************************************************************
* Copyright (c) 2009-2013, Linagora
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Linagora - initial API and implementation
*******************************************************************************/
package com.ebmwebsourcing.petals.studio.welcome;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.net.URLEncoder;
import java.security.GeneralSecurityException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.HyperlinkSettings;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.FormText;
import org.eclipse.ui.part.IntroPart;
import com.ebmwebsourcing.petals.studio.PetalsStudioPlugin;
import com.ebmwebsourcing.petals.studio.utils.Base64;
import com.ebmwebsourcing.petals.studio.utils.SwtJFaceUtils;
import com.ebmwebsourcing.petals.studio.utils.VersionUtils;
/**
* This class creates the welcome page GUI.
* @author Vincent Zurczak - EBM WebSourcing
*/
public class PetalsStudioWelcomePage extends IntroPart implements IPartListener {
private final static String EMAIL_PATTERN = "[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)*";
private final static int TEXT_FIELD_WIDTH_HINT = 260;
private Image backgroundImage, logoImage, iconImage;
private Image validImg, warnedImg;
private Image eOkButton, eFinishButton, dOkButton;
private Font titleFont, subTitleFont;
private Color orangeColor, purpleColor;
private String email, name, company, phone, language;
private boolean subsNews, subsNotif, subsTain;
private String proxyHost, proxyUser, proxyPassword;
private int proxyPort;
/**
* Constructor.
*/
public PetalsStudioWelcomePage() {
try {
ImageDescriptor desc = PetalsStudioPlugin.getImageDescriptor( "icons/prod/background_theme.png" );
this.backgroundImage = desc.createImage();
desc = PetalsStudioPlugin.getImageDescriptor( "icons/prod/background_theme_logo.png" );
this.logoImage = desc.createImage();
desc = PetalsStudioPlugin.getImageDescriptor( "icons/prod/pstudio_16x16_2.png" );
this.iconImage = desc.createImage();
desc = PetalsStudioPlugin.getImageDescriptor( "icons/obj16/Warning.gif" );
this.warnedImg = desc.createImage();
desc = PetalsStudioPlugin.getImageDescriptor( "icons/obj16/Validated.gif" );
this.validImg = desc.createImage();
desc = PetalsStudioPlugin.getImageDescriptor( "icons/prod/bouton_eclipse_contact_ok.png" );
this.eOkButton = desc.createImage();
desc = PetalsStudioPlugin.getImageDescriptor( "icons/prod/bouton_eclipse_contact_finish.png" );
this.eFinishButton = desc.createImage();
desc = PetalsStudioPlugin.getImageDescriptor( "icons/prod/bouton_eclipse_contact_ok_gris.png" );
this.dOkButton = desc.createImage();
} catch( Exception e ) {
PetalsStudioPlugin.log( e, IStatus.WARNING );
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.IntroPart#dispose()
*/
@Override
public void dispose() {
if( this.eOkButton != null )
this.eOkButton.dispose();
if( this.dOkButton != null )
this.dOkButton.dispose();
if( this.eFinishButton != null )
this.eFinishButton.dispose();
if( this.backgroundImage != null )
this.backgroundImage.dispose();
if( this.logoImage != null )
this.logoImage.dispose();
if( this.iconImage != null )
this.iconImage.dispose();
if( this.warnedImg != null )
this.warnedImg.dispose();
if( this.validImg != null )
this.validImg.dispose();
if( this.titleFont != null )
this.titleFont.dispose();
if( this.subTitleFont != null )
this.subTitleFont.dispose();
if( this.orangeColor != null )
this.orangeColor.dispose();
if( this.purpleColor != null )
this.purpleColor.dispose();
getIntroSite().getPage().removePartListener( this );
super.dispose();
}
/**
* Creates the content of the home page.
* @param container the container of the content home page
*/
@Override
public void createPartControl( Composite container ) {
PetalsStudioPlugin.getDefault().setWelcomePageAlreadyShown( true );
getIntroSite().getPage().addPartListener( this );
final ScrolledComposite scrollComposite = new ScrolledComposite( container, SWT.V_SCROLL | SWT.H_SCROLL );
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
scrollComposite.setLayout( layout );
scrollComposite.setLayoutData( new GridData( GridData.FILL_BOTH ));
final Composite outerContainer = new Composite( scrollComposite, SWT.NONE );
outerContainer.setLayout( new GridLayout());
outerContainer.setBackgroundMode( SWT.INHERIT_DEFAULT );
layout = new GridLayout();
layout.marginWidth = 20;
outerContainer.setLayout( layout );
outerContainer.setLayoutData( new GridData( GridData.FILL_BOTH ));
scrollComposite.setContent( outerContainer );
scrollComposite.setExpandVertical( true );
scrollComposite.setExpandHorizontal( true );
scrollComposite.addControlListener( new ControlAdapter() {
@Override
public void controlResized( ControlEvent e ) {
scrollComposite.setMinSize( outerContainer.computeSize( SWT.DEFAULT, SWT.DEFAULT ));
}
});
// Get the group to display
final Label logoLabel = new Label( outerContainer, SWT.NONE );
logoLabel.setImage( this.logoImage );
GridData layoutData = new GridData( SWT.CENTER, SWT.CENTER, true, false );
logoLabel.setLayoutData( layoutData );
FontData[] fs = logoLabel.getFont().getFontData();
fs = SwtJFaceUtils.changeFontDataSize( fs, 14 );
fs = SwtJFaceUtils.getModifiedFontData( fs, SWT.BOLD );
this.titleFont = new Font( logoLabel.getDisplay(), fs );
this.purpleColor = new Color( logoLabel.getDisplay(), 115, 46, 131 );
if( RegistrationManager.needsRegistration())
addRegistrationWidgetPart1( outerContainer );
else
addPresentationWidget( outerContainer );
// Resize listener
final Listener resizeListener = new Listener() {
Image oldImage;
public void handleEvent( Event event ) {
// Background image
if( this.oldImage != null )
this.oldImage.dispose();
Rectangle rect = outerContainer.getClientArea();
Image scaled = new Image( Display.getDefault(), rect.width, rect.height );
GC gc = new GC( scaled );
gc.setAntialias( SWT.ON );
gc.setInterpolation( SWT.HIGH );
gc.drawImage(
PetalsStudioWelcomePage.this.backgroundImage,
0, 0,
PetalsStudioWelcomePage.this.backgroundImage.getBounds().width,
PetalsStudioWelcomePage.this.backgroundImage.getBounds().height,
0, 0,
rect.width, rect.height );
gc.dispose();
outerContainer.setBackgroundImage( scaled );
this.oldImage = scaled;
// Update the location of the label
GridData layoutData = (GridData) logoLabel.getLayoutData();
layoutData.verticalIndent = rect.height / 7;
logoLabel.setLayoutData( layoutData );
}
};
outerContainer.addListener( SWT.Resize, resizeListener );
}
/**
* Adds the registration group.
* @param outerContainer
*/
private void addRegistrationWidgetPart1( final Composite outerContainer ) {
Composite container = new Composite( outerContainer, SWT.BORDER );
container.setBackground( outerContainer.getDisplay().getSystemColor( SWT.COLOR_WHITE ));
container.setLayout( new GridLayout());
GridData layoutData = new GridData( SWT.CENTER, SWT.DEFAULT, true, true );
layoutData.verticalIndent = 20;
container.setLayoutData( layoutData );
// Restore values ?
try {
if( this.email == null ) {
RegistrationBean bean = RegistrationManager.getInstance().restoreRegistrationData();
this.email = bean.getEmail();
this.company = bean.getCompany();
this.name = bean.getName();
this.phone = bean.getPhone();
this.language = bean.getLanguage();
this.proxyHost = bean.getProxyHost();
this.proxyPassword = bean.getProxyPassword();
this.proxyPort = bean.getProxyPort();
this.proxyUser = bean.getProxyUser();
}
} catch( IOException e1 ) {
// nothing
} catch( GeneralSecurityException e1 ) {
// nothing
}
// Populate container
Label label = new Label( container, SWT.NONE );
label.setText( "Let us know about you!" );
label.setFont( this.titleFont );
label.setForeground( this.purpleColor );
layoutData = new GridData( SWT.CENTER, SWT.DEFAULT, true, false );
layoutData.verticalIndent = 10;
label.setLayoutData( layoutData );
label = new Label( container, SWT.NONE );
label.setText( "We are willing to know you." );
layoutData = new GridData();
layoutData.verticalIndent = 14;
layoutData.horizontalIndent = 20;
label.setLayoutData( layoutData );
label = new Label( container, SWT.NONE );
label.setText( "Please, take two minutes to fill-in this two-step form." );
layoutData = new GridData();
layoutData.horizontalIndent = 20;
label.setLayoutData( layoutData );
Composite subContainer = new Composite( container, SWT.NONE );
GridLayout layout = new GridLayout( 3, false );
layout.marginHeight = 10;
layout.marginWidth = 20;
layout.marginRight = 7;
subContainer.setLayout( layout );
subContainer.setLayoutData( new GridData( GridData.FILL_BOTH ));
// OK "button"
final Label okLabel = new Label( container, SWT.NONE );
okLabel.setImage( this.dOkButton );
okLabel.setToolTipText( "Move on the next step" );
okLabel.addMouseListener( new MouseAdapter() {
@Override
public void mouseDown( MouseEvent e ) {
if( PetalsStudioWelcomePage.this.eOkButton.equals( okLabel.getImage())) {
cleanContainer( outerContainer );
addRegistrationWidgetPart2( outerContainer );
outerContainer.layout();
}
}
});
layoutData = new GridData( SWT.CENTER, SWT.DEFAULT, true, false );
layoutData.verticalIndent = 10;
okLabel.setLayoutData( layoutData );
// No, thanks...
Link link = new Link( container, SWT.NONE );
link.setText( "<A>No, thanks. I will register later. \u00bb </A>" );
layoutData = new GridData( SWT.END, SWT.END, true, false );
layoutData.verticalIndent = 23;
link.setLayoutData( layoutData );
link.addSelectionListener( new SelectionListener() {
public void widgetSelected( SelectionEvent e ) {
widgetDefaultSelected( e );
}
public void widgetDefaultSelected( SelectionEvent e ) {
closeWelComePage();
}
});
// Populate subContainer
// Email
label = new Label( subContainer, SWT.NONE );
label.setText( "Email*:" );
Text text = new Text( subContainer, SWT.SINGLE | SWT.BORDER );
layoutData = new GridData( GridData.FILL_HORIZONTAL );
// No need to set the width hint on the other text fields
// They will fill the remaining space anyway
layoutData.widthHint = TEXT_FIELD_WIDTH_HINT;
text.setLayoutData( layoutData );
final Label emailDecoratorLabel = new Label( subContainer, SWT.NONE );
text.addModifyListener( new ModifyListener() {
public void modifyText( ModifyEvent e ) {
PetalsStudioWelcomePage.this.email = ((Text) e.widget).getText().trim();
if( PetalsStudioWelcomePage.this.email.length() == 0 ) {
emailDecoratorLabel.setImage( PetalsStudioWelcomePage.this.warnedImg );
emailDecoratorLabel.setToolTipText( "Please fill-in your email address." );
}
else if( PetalsStudioWelcomePage.this.email.length() > 79 ) {
emailDecoratorLabel.setImage( PetalsStudioWelcomePage.this.warnedImg );
emailDecoratorLabel.setToolTipText( "Your email address can not exceed 80 characters." );
}
else if( ! PetalsStudioWelcomePage.this.email.matches( EMAIL_PATTERN )) {
emailDecoratorLabel.setImage( PetalsStudioWelcomePage.this.warnedImg );
emailDecoratorLabel.setToolTipText( "This email address is not valid." );
}
else {
emailDecoratorLabel.setImage( PetalsStudioWelcomePage.this.validImg );
emailDecoratorLabel.setToolTipText( null );
}
emailDecoratorLabel.update();
emailDecoratorLabel.getParent().layout();
checkNextButton( okLabel );
}
});
if( this.email != null && this.email.trim().length() > 0 )
text.setText( this.email );
// Company
label = new Label( subContainer, SWT.NONE );
label.setText( "Company / Organization*:" );
text = new Text( subContainer, SWT.SINGLE | SWT.BORDER );
text.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
final Label companyDecoratorLabel = new Label( subContainer, SWT.NONE );
text.addModifyListener( new ModifyListener() {
public void modifyText( ModifyEvent e ) {
PetalsStudioWelcomePage.this.company = ((Text) e.widget).getText().trim();
if( PetalsStudioWelcomePage.this.company.length() == 0 ) {
companyDecoratorLabel.setImage( PetalsStudioWelcomePage.this.warnedImg );
companyDecoratorLabel.setToolTipText( "Please, fill-in your company or organization name (write none if you do not have one)." );
}
else if( PetalsStudioWelcomePage.this.company.length() > 39 ) {
companyDecoratorLabel.setImage( PetalsStudioWelcomePage.this.warnedImg );
companyDecoratorLabel.setToolTipText( "Your company name can not exceed 40 characters." );
}
else {
companyDecoratorLabel.setImage( PetalsStudioWelcomePage.this.validImg );
companyDecoratorLabel.setToolTipText( null );
}
companyDecoratorLabel.update();
companyDecoratorLabel.getParent().layout();
checkNextButton( okLabel );
}
});
if( this.company != null && this.company.trim().length() > 0 )
text.setText( this.company );
// Name
label = new Label( subContainer, SWT.NONE );
label.setText( "Name (First, Last)*:" );
text = new Text( subContainer, SWT.SINGLE | SWT.BORDER );
text.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
final Label nameDecoratorLabel = new Label( subContainer, SWT.NONE );
text.addModifyListener( new ModifyListener() {
public void modifyText( ModifyEvent e ) {
PetalsStudioWelcomePage.this.name = ((Text) e.widget).getText().trim();
if( PetalsStudioWelcomePage.this.name.length() == 0 ) {
nameDecoratorLabel.setImage( PetalsStudioWelcomePage.this.warnedImg );
nameDecoratorLabel.setToolTipText( "Please, fill-in your name." );
}
else if( PetalsStudioWelcomePage.this.name.length() > 39 ) {
nameDecoratorLabel.setImage( PetalsStudioWelcomePage.this.warnedImg );
nameDecoratorLabel.setToolTipText( "Your name should not be longer than 40 characters (you can use initials)." );
}
else {
nameDecoratorLabel.setImage( PetalsStudioWelcomePage.this.validImg );
nameDecoratorLabel.setToolTipText( null );
}
nameDecoratorLabel.update();
nameDecoratorLabel.getParent().layout();
checkNextButton( okLabel );
}
});
if( this.name != null && this.name.trim().length() > 0 )
text.setText( this.name );
// Phone
label = new Label( subContainer, SWT.NONE );
label.setText( "Phone:" );
text = new Text( subContainer, SWT.SINGLE | SWT.BORDER );
text.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
new Label( subContainer, SWT.NONE );
text.addModifyListener( new ModifyListener() {
public void modifyText( ModifyEvent e ) {
PetalsStudioWelcomePage.this.phone = ((Text) e.widget).getText();
}
});
if( this.phone != null )
text.setText( this.phone );
// Favorite language
label = new Label( subContainer, SWT.NONE );
label.setText( "Favorite language:" );
final String[] languages = new String[] {
"English", "Fran\u00e7ais", "Espan\u00f5l",
"Deutsche", "Portug\u00eas", "Chinese"
};
Combo combo = new Combo( subContainer, SWT.BORDER | SWT.READ_ONLY );
combo.setLayoutData( new GridData( 120, SWT.DEFAULT ));
combo.setItems( languages );
combo.setVisibleItemCount( languages.length );
combo.addSelectionListener( new SelectionListener() {
public void widgetSelected( SelectionEvent e ) {
widgetDefaultSelected( e );
}
public void widgetDefaultSelected( SelectionEvent e ) {
int selection = ((Combo) e.widget).getSelectionIndex();
if( selection >= 0 )
PetalsStudioWelcomePage.this.language = languages[ selection ];
}
});
if( this.language == null || this.language.trim().length() == 0 ) {
combo.select( 0 );
combo.notifyListeners( SWT.Selection, new Event());
}
else {
int index = combo.indexOf( this.language );
combo.select( index );
}
}
/**
* Enables or disables the first form label.
* @param nextButton
*/
private void checkNextButton( Label label ) {
boolean enable = this.email != null
&& this.email.length() > 0
&& this.email.length() <= 79
&& this.email.matches( EMAIL_PATTERN )
&& this.company != null
&& this.company.length() > 0
&& this.company.length() <= 39
&& this.name != null
&& this.name.length() > 0
&& this.name.length() <= 39;
if( enable )
label.setImage( this.eOkButton );
else
label.setImage( this.dOkButton );
}
/**
* Adds the registration group.
* @param outerContainer
*/
private void addRegistrationWidgetPart2( final Composite outerContainer ) {
Composite container = new Composite( outerContainer, SWT.BORDER );
container.setBackground( outerContainer.getDisplay().getSystemColor( SWT.COLOR_WHITE ));
container.setLayout( new GridLayout());
GridData layoutData = new GridData( SWT.CENTER, SWT.DEFAULT, true, true );
layoutData.verticalIndent = 20;
container.setLayoutData( layoutData );
// Populate the container
Label label = new Label( container, SWT.WRAP );
label.setText( "Stay tuned!" );
label.setFont( this.titleFont );
label.setForeground( this.purpleColor );
layoutData = new GridData( SWT.CENTER, SWT.DEFAULT, true, false );
layoutData.verticalIndent = 10;
label.setLayoutData( layoutData );
label = new Label( container, SWT.WRAP );
label.setText( "Would you be interested in receiving our newsletters?" );
layoutData = new GridData();
layoutData.verticalIndent = 14;
layoutData.horizontalIndent = 20;
label.setLayoutData( layoutData );
label = new Label( container, SWT.WRAP );
label.setText( "Our goal is not to spam you. You can unsubscribe anytime." );
layoutData = new GridData();
layoutData.horizontalIndent = 20;
label.setLayoutData( layoutData );
Composite subContainer = new Composite( container, SWT.NONE );
GridLayout layout = new GridLayout();
layout.marginTop = 10;
layout.marginWidth = 20;
layout.marginRight = 7;
layout.verticalSpacing = 3;
layout.marginLeft = 22;
subContainer.setLayout( layout );
subContainer.setLayoutData( new GridData( GridData.FILL_BOTH ));
// Newsletter
Button button = new Button( subContainer, SWT.CHECK );
button.setText( "Send me Petals Newsletter, every two-month." );
button.setSelection( this.subsNews );
button.addSelectionListener( new SelectionListener() {
public void widgetSelected( SelectionEvent e ) {
PetalsStudioWelcomePage.this.subsNews = ((Button) e.widget).getSelection();
}
public void widgetDefaultSelected( SelectionEvent e ) {
PetalsStudioWelcomePage.this.subsNews = ((Button) e.widget).getSelection();
}
});
// Software updates
button = new Button( subContainer, SWT.CHECK );
button.setText( "Notify me about Petals Software updates and releases." );
button.setSelection( this.subsNotif );
button.addSelectionListener( new SelectionListener() {
public void widgetSelected( SelectionEvent e ) {
PetalsStudioWelcomePage.this.subsNotif = ((Button) e.widget).getSelection();
}
public void widgetDefaultSelected( SelectionEvent e ) {
PetalsStudioWelcomePage.this.subsNotif = ((Button) e.widget).getSelection();
}
});
layoutData = new GridData();
layoutData.verticalIndent = 5;
button.setLayoutData( layoutData );
// Training
button = new Button( subContainer, SWT.CHECK );
button.setText( "Inform me when new training sessions are organized." );
button.setSelection( this.subsTain );
button.addSelectionListener( new SelectionListener() {
public void widgetSelected( SelectionEvent e ) {
PetalsStudioWelcomePage.this.subsTain = ((Button) e.widget).getSelection();
}
public void widgetDefaultSelected( SelectionEvent e ) {
PetalsStudioWelcomePage.this.subsTain = ((Button) e.widget).getSelection();
}
});
layoutData = new GridData();
layoutData.verticalIndent = 5;
button.setLayoutData( layoutData );
// Proxy
subContainer = new Composite( container, SWT.NONE );
layout = new GridLayout();
layout.marginHeight = 0;
layout.marginRight = 7;
layout.marginLeft = 22;
subContainer.setLayout( layout );
subContainer.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
StringBuilder sb = new StringBuilder();
sb.append( "<form><p>");
sb.append( "Before completing the registration, you might want to <a>configure proxy settings</a>." );
sb.append( "<br />Click finish to complete your registration." );
sb.append( "</p></form>");
FormText formText = new FormText( subContainer, SWT.NO_FOCUS );
formText.setText( sb.toString(), true, false );
formText.setLayoutData( new GridData( GridData.FILL_BOTH ));
formText.addHyperlinkListener( new HyperlinkAdapter() {
@Override
public void linkActivated( HyperlinkEvent e ) {
ProxyDialog dlg = new ProxyDialog( outerContainer.getShell());
dlg.setProxyHost( PetalsStudioWelcomePage.this.proxyHost );
dlg.setProxyPassword( PetalsStudioWelcomePage.this.proxyPassword );
dlg.setProxyPort( PetalsStudioWelcomePage.this.proxyPort );
dlg.setProxyUser( PetalsStudioWelcomePage.this.proxyUser );
if( dlg.open() == Window.OK ) {
PetalsStudioWelcomePage.this.proxyHost = dlg.getProxyHost();
PetalsStudioWelcomePage.this.proxyPort = dlg.getProxyPort();
PetalsStudioWelcomePage.this.proxyUser = dlg.getProxyUser();
PetalsStudioWelcomePage.this.proxyPassword = dlg.getProxyPassword();
}
}
});
// Send
Label finishLabel = new Label( container, SWT.PUSH );
finishLabel.setImage( this.eFinishButton );
finishLabel.setToolTipText( "Complete registration" );
finishLabel.addMouseListener( new MouseAdapter() {
@Override
public void mouseDown( MouseEvent e ) {
new Job( "Registration process" ) {
@Override
protected IStatus run( IProgressMonitor monitor ) {
try {
monitor.beginTask( "Registration in progress...", IProgressMonitor.UNKNOWN );
register( monitor );
} finally {
monitor.done();
outerContainer.getDisplay().asyncExec( new Runnable() {
public void run() {
closeWelComePage();
}
});
}
return Status.OK_STATUS;
}
}.schedule();
}
});
layoutData = new GridData( SWT.CENTER, SWT.DEFAULT, true, false );
layoutData.verticalIndent = 15;
finishLabel.setLayoutData( layoutData );
// Back...
Link link = new Link( container, SWT.NONE );
link.setText( "<A> \u00ab Back</A>" );
layoutData = new GridData( SWT.BEGINNING, SWT.END, true, false );
layoutData.verticalIndent = 20;
link.setLayoutData( layoutData );
link.addSelectionListener( new SelectionListener() {
public void widgetSelected( SelectionEvent e ) {
widgetDefaultSelected( e );
}
public void widgetDefaultSelected( SelectionEvent e ) {
cleanContainer( outerContainer );
addRegistrationWidgetPart1( outerContainer );
outerContainer.layout();
}
});
}
/**
* Removes all the widgets, except the first one, contained in this container.
* @param container
*/
private void cleanContainer( Composite container ) {
// Do not kill the first child - the logo label
boolean first = true;
for( Control control : container.getChildren()) {
if( first )
first = false;
else
control.dispose();
}
}
/**
* Adds the presentation group.
* @param outerContainer
*/
private void addPresentationWidget( Composite outerContainer ) {
Composite container = new Composite( outerContainer, SWT.BORDER );
container.setBackground( outerContainer.getDisplay().getSystemColor( SWT.COLOR_WHITE ));
GridLayout layout = new GridLayout();
layout.marginHeight = 10;
layout.marginWidth = 15;
container.setLayout( layout );
GridData layoutData = new GridData( SWT.CENTER, SWT.DEFAULT, true, true );
layoutData.verticalIndent = 20;
container.setLayoutData( layoutData );
// Title & introduction
Label label = new Label( container, SWT.NONE );
label.setText( "Welcome into the Petals Studio!" );
label.setFont( this.titleFont );
label.setForeground( this.purpleColor );
layoutData = new GridData( SWT.CENTER, SWT.DEFAULT, true, false );
layoutData.verticalIndent = 10;
label.setLayoutData( layoutData );
label = new Label( container, SWT.WRAP );
label.setText( "Petals Studio is a set of tools for Petals ESB." );
layoutData = new GridData();
layoutData.verticalIndent = 15;
label.setLayoutData( layoutData );
label = new Label( container, SWT.WRAP );
label.setText( "Petals ESB is a distributed platform to interconnect heteregenous applications and services." );
// Features
Composite section = new Composite( container, SWT.NONE );
layout = new GridLayout( 2, false );
layout.marginWidth = 0;
layout.marginTop = 11;
section.setLayout( layout );
section.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
FontData[] fs = label.getFont().getFontData();
fs = SwtJFaceUtils.changeFontDataSize( fs, 12 );
fs = SwtJFaceUtils.getModifiedFontData( fs, SWT.BOLD );
this.subTitleFont = new Font( label.getDisplay(), fs );
label = new Label( section, SWT.NONE );
label.setText( "Features" );
label.setFont( this.subTitleFont );
label.setForeground( this.purpleColor );
label = new Label( section, SWT.SEPARATOR | SWT.HORIZONTAL );
label.setLayoutData( new GridData( SWT.FILL, SWT.END, true, true ));
//
StringBuilder sb = new StringBuilder();
sb.append( "<form>");
sb.append( "Petals Studio provides tools to:" );
sb.append( "<li indent=\"15\">Create and export configurations for Petals components.</li>" );
sb.append( "<li indent=\"15\">Create and export BPEL processes and SCA applications for Petals ESB.</li>" );
sb.append( "<li indent=\"15\">Create and debug Petals components.</li>" );
sb.append( "</form>");
FormText formText = new FormText( container, SWT.WRAP | SWT.NO_FOCUS );
formText.setText( sb.toString(), true, false );
// Links
this.orangeColor = new Color( label.getDisplay(), 228, 98, 17 );
section = new Composite( container, SWT.NONE );
layout = new GridLayout( 2, false );
layout.marginWidth = 0;
layout.marginTop = 14;
section.setLayout( layout );
section.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
label = new Label( section, SWT.NONE );
label.setText( "Links" );
label.setFont( this.subTitleFont );
label.setForeground( this.purpleColor );
label = new Label( section, SWT.SEPARATOR | SWT.HORIZONTAL );
label.setLayoutData( new GridData( SWT.FILL, SWT.END, true, true ));
//
sb = new StringBuilder();
sb.append( "<form>");
sb.append( "<li indent=\"15\">Find documentation on <a href=\"http://doc.petalslink.com/display/petalsstudio\">Petals Link's wiki</a>.</li>" );
sb.append( "<li indent=\"15\">Ask community help on <a href=\"http://www.ebmwebsourcing.com/forum/\">Petals Link's forum</a>.</li>" );
sb.append( "<li indent=\"15\">Get training, expertise and support on <a href=\"http://petalslink.com/en/services\">Petals Link's website</a>.</li>" );
sb.append( "</form>");
HyperlinkSettings settings = new HyperlinkSettings( label.getDisplay());
settings.setActiveForeground( this.orangeColor );
settings.setForeground( this.orangeColor );
settings.setHyperlinkUnderlineMode( HyperlinkSettings.UNDERLINE_HOVER );
formText = new FormText( container, SWT.WRAP | SWT.NO_FOCUS );
formText.setHyperlinkSettings( settings );
formText.setText( sb.toString(), true, true );
formText.addHyperlinkListener( new HyperlinkAdapter() {
@Override
public void linkActivated( HyperlinkEvent e ) {
try {
URL url = new URL((String) e.getHref());
PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser().openURL( url );
} catch( Exception e1 ) {
PetalsStudioPlugin.log( e1, IStatus.ERROR );
}
}
@Override
public void linkEntered( HyperlinkEvent e ) {
IStatusLineManager manager = getIntroSite().getActionBars().getStatusLineManager();
manager.setMessage( PetalsStudioWelcomePage.this.iconImage, (String) e.getHref());
}
@Override
public void linkExited( HyperlinkEvent e ) {
IStatusLineManager manager = getIntroSite().getActionBars().getStatusLineManager();
manager.setMessage( null, "" );
}
});
}
/**
* Registers the product with the form information.
* @param monitor
*/
private void register( IProgressMonitor monitor ) {
boolean registrationWorked = false;
try {
monitor.subTask( "Preparing the registration message..." );
//
// Build the response
StringBuilder sb = new StringBuilder();
// Hidden fields
sb.append( URLEncoder.encode( "FORM_ID", "UTF-8" ) + "=" + URLEncoder.encode( "042281da-6c39-499b-8eef-12676669cf55 ", "UTF-8" ));
sb.append( "&" );
sb.append( URLEncoder.encode( "REVIEW_ID", "UTF-8" ) + "=" + URLEncoder.encode( "9948", "UTF-8" ));
sb.append( "&" );
sb.append( URLEncoder.encode( "TAG", "UTF-8" ) + "=" + URLEncoder.encode( "Lead", "UTF-8" ));
sb.append( "&" );
sb.append( URLEncoder.encode( "TAG", "UTF-8" ) + "=" + URLEncoder.encode( "Petals Studio", "UTF-8" ));
sb.append( "&" );
sb.append( URLEncoder.encode( "CUSTOMFIELD[Origine-categorie]", "UTF-8" ) + "=" + URLEncoder.encode( "Web - download", "UTF-8" ));
// Version and Build ID
String studioVersion = "Version: " + VersionUtils.getProductVersion( true );
studioVersion += " // Build ID: " + VersionUtils.getProductBuildId();
// User information
if( this.company == null )
this.company = "";
sb.append( "&" );
sb.append( URLEncoder.encode( "ORGANISATION_NAME", "UTF-8" ) + "=" + URLEncoder.encode( this.company, "UTF-8" ));
if( this.email == null )
this.email = "";
sb.append( "&" );
sb.append( URLEncoder.encode( "EMAIL", "UTF-8" ) + "=" + URLEncoder.encode( this.email, "UTF-8" ));
if( this.name == null )
this.name = "";
sb.append( "&" );
sb.append( URLEncoder.encode( "PERSON_NAME", "UTF-8" ) + "=" + URLEncoder.encode( this.name, "UTF-8" ));
if( this.phone == null )
this.phone = "";
sb.append( "&" );
sb.append( URLEncoder.encode( "PHONE", "UTF-8" ) + "=" + URLEncoder.encode( this.phone, "UTF-8" ));
if( this.language == null )
this.language = "English";
sb.append( "&" );
sb.append( URLEncoder.encode( "TAG", "UTF-8" ) + "=" + URLEncoder.encode( this.language, "UTF-8" ));
// Mailing-lists
String tags = "";
if( this.subsNews ) {
tags += "Info-Newsletter";
sb.append( "&" );
sb.append( URLEncoder.encode( "TAG", "UTF-8" ) + "=" + URLEncoder.encode( "Info-Newsletter", "UTF-8" ));
}
if( this.subsNotif ) {
if( tags.length() > 0 )
tags += ", ";
tags += "Info-Releases";
sb.append( "&" );
sb.append( URLEncoder.encode( "TAG", "UTF-8" ) + "=" + URLEncoder.encode( "Info-Releases", "UTF-8" ));
}
if( this.subsTain ) {
if( tags.length() > 0 )
tags += ", ";
tags += "Info-Trainings";
sb.append( "&" );
sb.append( URLEncoder.encode( "TAG", "UTF-8" ) + "=" + URLEncoder.encode( "Info-Trainings", "UTF-8" ));
}
if( tags.length() == 0 ) {
tags = "Pas d'email";
sb.append( "&" );
sb.append( URLEncoder.encode( "TAG", "UTF-8" ) + "=" + URLEncoder.encode( "Pas d'email", "UTF-8" ));
}
tags = "Pr\u00e9f\u00e9rences : " + tags + ", " + this.language;
sb.append( "&" );
sb.append( URLEncoder.encode( "NOTE", "UTF-8" ) + "=" );
sb.append( URLEncoder.encode( "Enregistr\u00e9 depuis Petals Studio " + studioVersion + "\n" + tags, "UTF-8" ));
//
// Is there a proxy to use?
Proxy proxy = null;
if( this.proxyHost != null )
proxy = new Proxy( Proxy.Type.HTTP, new InetSocketAddress( this.proxyHost, this.proxyPort ));
//
// Send data
monitor.subTask( "Sending the registration message..." );
URL url = new URL( "https://service.capsulecrm.com/service/newlead" );
HttpURLConnection urlConnection = null;
if( proxy == null )
urlConnection = (HttpURLConnection) url.openConnection();
else
urlConnection = (HttpURLConnection) url.openConnection( proxy );
urlConnection.setRequestMethod( "POST" );
urlConnection.setDoOutput( true );
urlConnection.setDoInput( true );
urlConnection.setUseCaches( false );
urlConnection.setAllowUserInteraction( false );
if( proxy != null
&& this.proxyUser != null
&& this.proxyUser.length() > 0
&& this.proxyPassword != null ) {
String encoded = new String( Base64.encode(( this.proxyUser + ":" + this.proxyPassword ).getBytes()));
urlConnection.setRequestProperty( "Proxy-Authorization", "Basic " + encoded );
}
OutputStreamWriter wr = new OutputStreamWriter( urlConnection.getOutputStream());
wr.write( sb.toString());
wr.flush();
// Get the response
BufferedReader rd = new BufferedReader( new InputStreamReader( urlConnection.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
System.out.println( line );
}
wr.close();
rd.close();
// Mark the registration as successful
registrationWorked = true;
} catch( Exception e ) {
PetalsStudioPlugin.log( e, IStatus.ERROR, "The registration of Petals Studio failed." );
} finally {
// Keep a trace of the registration
saveRegistrationTrace( registrationWorked );
// Indicate to the user if the registration process worked
if( registrationWorked ) {
Display.getDefault().syncExec( new Runnable() {
public void run() {
MessageDialog.openInformation( new Shell(), "Successful Registration",
"The registration process concluded successfully." );
}
});
}
else {
Display.getDefault().syncExec( new Runnable() {
public void run() {
MessageDialog.openError( new Shell(), "Registration Error",
"The registration process failed, probably because of network problems." );
}
});
}
}
}
/**
* Writes a file on the disk which indicates the registration status.
* <p>
* This file is used to determine if someone registered its version.
* </p>
*
* @param registrationWorked true if the online registration was done, false otherwise
*/
private void saveRegistrationTrace( boolean registrationWorked ) {
boolean traceSaved = false;
try {
RegistrationManager mng = RegistrationManager.getInstance();
// Keep the registration tentative
RegistrationBean bean = new RegistrationBean();
bean.setName( this.name );
bean.setEmail( this.email );
bean.setCompany( this.company );
bean.setLanguage( this.language );
bean.setPhone( this.phone );
bean.setRegistered( registrationWorked );
bean.setLastRegisteredVersion( VersionUtils.getProductVersion( true ));
if( this.proxyHost != null )
bean.setProxyHost( this.proxyHost );
if( this.proxyPassword != null )
bean.setProxyPassword( this.proxyPassword );
if( this.proxyPort != 0 )
bean.setProxyPort( this.proxyPort );
if( this.proxyUser != null )
bean.setProxyUser( this.proxyUser );
traceSaved = mng.backupRegistrationData( bean );
} catch( IOException e ) {
PetalsStudioPlugin.log( e, IStatus.WARNING );
} catch( GeneralSecurityException e ) {
PetalsStudioPlugin.log( e, IStatus.WARNING );
}
if( ! traceSaved )
PetalsStudioPlugin.log( "The registration process trace could not be saved.", IStatus.INFO );
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.part.IntroPart#setFocus()
*/
@Override
public void setFocus() {
// nothing
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.intro.IIntroPart#standbyStateChanged(boolean)
*/
public void standbyStateChanged( boolean standby ) {
// nothing
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.IPartListener
* #partActivated(org.eclipse.ui.IWorkbenchPart)
*/
public void partActivated( IWorkbenchPart part ) {
// nothing
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.IPartListener
* #partBroughtToTop(org.eclipse.ui.IWorkbenchPart)
*/
public void partBroughtToTop( IWorkbenchPart part ) {
// nothing
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.IPartListener
* #partClosed(org.eclipse.ui.IWorkbenchPart)
*/
public void partClosed( IWorkbenchPart part ) {
// nothing
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.IPartListener
* #partDeactivated(org.eclipse.ui.IWorkbenchPart)
*/
public void partDeactivated( IWorkbenchPart part ) {
if( "welcome".equalsIgnoreCase( part.getTitle()))
PlatformUI.getWorkbench().getIntroManager().closeIntro( this );
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.IPartListener
* #partOpened(org.eclipse.ui.IWorkbenchPart)
*/
public void partOpened( IWorkbenchPart part ) {
// nothing
}
/**
* Closes the welcome page and checks if projects need to be migrated.
*/
private void closeWelComePage() {
try {
PlatformUI.getWorkbench().getIntroManager().closeIntro( PetalsStudioWelcomePage.this );
} catch( Exception e ) {
PetalsStudioPlugin.log( e, IStatus.ERROR );
}
}
}