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