org.eclipse.help.ui.internal.preferences.ICDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.help.ui.internal.preferences.ICDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2011, 2014 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *     Lars Vogel <Lars.Vogel@gmail.com> - Bug 431683
 *******************************************************************************/

package org.eclipse.help.ui.internal.preferences;

import java.net.MalformedURLException;
import java.net.URL;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.help.internal.base.util.TestConnectionUtility;
import org.eclipse.help.ui.internal.Messages;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.StatusDialog;
import org.eclipse.jface.window.IShellProvider;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;

public class ICDialog extends StatusDialog implements IShellProvider, Listener, SelectionListener {

    private IC ic = null;

    private Text nameText;
    private Text hrefText;

    private Button testButton;

    private boolean testConnect = false;

    public ICDialog(Shell parentShell) {
        this(parentShell, null, false);
    }

    public ICDialog(Shell parentShell, IC initialIC) {
        this(parentShell, initialIC, false);
    }

    public ICDialog(Shell parentShell, IC initialIC, boolean testConnect) {
        super(parentShell);
        this.ic = initialIC;
        this.testConnect = testConnect;
    }

    protected Control createDialogArea(Composite parent) {
        PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, "org.eclipse.help.ui.prefPageHelpContent"); //$NON-NLS-1$

        Composite top = (Composite) super.createDialogArea(parent);
        top.setSize(top.computeSize(SWT.DEFAULT, SWT.DEFAULT));

        Composite topGroup = new Composite(top, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        layout.marginHeight = 2;
        layout.marginWidth = 2;
        layout.makeColumnsEqualWidth = false;
        topGroup.setLayout(layout);
        topGroup.setFont(top.getFont());
        topGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));

        Label label = new Label(topGroup, SWT.NONE);
        label.setText(Messages.AddICDialog_4);

        nameText = new Text(topGroup, SWT.BORDER);
        nameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        if (nameText.getOrientation() == SWT.RIGHT_TO_LEFT)
            nameText.setOrientation(SWT.LEFT_TO_RIGHT);
        nameText.addListener(SWT.Modify, this);

        label = new Label(topGroup, SWT.NONE);
        label.setText(Messages.InfoCenterPage_url);

        hrefText = new Text(topGroup, SWT.BORDER);
        hrefText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        if (hrefText.getOrientation() == SWT.RIGHT_TO_LEFT)
            hrefText.setOrientation(SWT.LEFT_TO_RIGHT);
        hrefText.addListener(SWT.Modify, this);

        if (ic != null) {
            nameText.setText(ic.getName());
            hrefText.setText(ic.getHref());
            this.getShell().setText(NLS.bind(Messages.EditICDialog_7, ic.getName()));
        } else
            this.getShell().setText(Messages.AddICDialog_2);

        Dialog.applyDialogFont(top);
        return top;

    }

    protected void createButtonsForButtonBar(Composite parent) {

        testButton = this.createButton(parent, IDialogConstants.CLIENT_ID,
                Messages.HelpContentBlock_testConnectionTitle, true);
        testButton.addSelectionListener(this);
        super.createButtonsForButtonBar(parent);

        //Initialize validity
        updateValidity();

        if (testConnect)
            testConnection();
    }

    public void initializeBounds() {
        Point size = getInitialSize();
        Point location = getInitialLocation(size);
        this.getShell().setBounds(location.x, location.y, size.x + 180, size.y);
    }

    public void okPressed() {
        try {
            String href = formalizeHref(hrefText.getText());

            ic = new IC(nameText.getText(), href, true);
        } catch (MalformedURLException e) {
        } // This should never happen since we test in updateValidity
        this.setReturnCode(OK);
        this.close();
    }

    public String formalizeHref(String href) {
        if (href.endsWith("/index.jsp")) //$NON-NLS-1$
            href = href.substring(0, href.lastIndexOf("/index.jsp")); //$NON-NLS-1$
        else if (href.endsWith("/site/site.xml")) //$NON-NLS-1$
            href = href.substring(0, href.lastIndexOf("/site/site.xml")); //$NON-NLS-1$

        return href;
    }

    /*
     * Checks for errors in the user input and shows/clears the error message
     * as appropriate.
     */
    private void updateValidity() {

        IStatus status = Status.OK_STATUS;

        if (nameText != null && nameText.getText().equals("")) //$NON-NLS-1$
            status = new Status(IStatus.ERROR, "org.eclipse.help.ui", Messages.InfoCenterPage_invalidURL); //$NON-NLS-1$
        else if (hrefText != null) {
            try {
                String href = hrefText.getText();
                new URL(href);

                if (!href.matches(".*\\://.+/.+")) //$NON-NLS-1$
                    status = new Status(IStatus.ERROR, "org.eclipse.help.ui", Messages.InfoCenterPage_invalidURL); //$NON-NLS-1$

            } catch (MalformedURLException e) {
                status = new Status(IStatus.ERROR, "org.eclipse.help.ui", Messages.InfoCenterPage_invalidURL); //$NON-NLS-1$
            }
        }

        //      if (testButton!=null)
        //         testButton.setEnabled(status.isOK());

        this.updateStatus(status);
    }

    private boolean areFieldsValid() {
        if (nameText != null && nameText.getText().equals("")) //$NON-NLS-1$
            return false;
        else if (hrefText != null) {
            try {
                String href = hrefText.getText();
                new URL(href);

                if (!href.matches(".*\\://.+/.+")) //$NON-NLS-1$
                    return false;

            } catch (MalformedURLException e) {
                return false;
            }
        }
        return true;
    }

    private void testConnection() {
        IC testIC;
        IStatus status;
        try {
            testIC = new IC(nameText.getText(), formalizeHref(hrefText.getText()), true);
            boolean connected = TestConnectionUtility.testConnection(testIC.getHost(), testIC.getPort() + "", //$NON-NLS-1$
                    testIC.getPath(), testIC.getProtocol());

            if (connected)
                status = new Status(IStatus.INFO, "org.eclipse.help.ui", Messages.TestConnectionDialog_12); //$NON-NLS-1$
            else
                status = new Status(IStatus.WARNING, "org.eclipse.help.ui", Messages.TestConnectionDialog_13); //$NON-NLS-1$

        } catch (MalformedURLException e) {

            status = new Status(IStatus.WARNING, "org.eclipse.help.ui", Messages.TestConnectionDialog_13); //$NON-NLS-1$
        }

        updateStatus(status);
        this.getButton(IDialogConstants.OK_ID).setEnabled(areFieldsValid());
        this.getButton(IDialogConstants.CANCEL_ID).setEnabled(true);
    }

    public IC getIC() {
        return ic;
    }

    public void handleEvent(Event event) {
        updateValidity();
    }

    public void widgetSelected(SelectionEvent e) {
        if (e.getSource() instanceof Button)
            testConnection();
    }

    public void widgetDefaultSelected(SelectionEvent e) {
    }

}