org.jboss.tools.openshift.cdk.server.ui.internal.CDKServerWizardFragment.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.openshift.cdk.server.ui.internal.CDKServerWizardFragment.java

Source

/******************************************************************************* 
 * Copyright (c) 2015 Red Hat, Inc. 
 * Distributed under license by Red Hat, Inc. All rights reserved. 
 * This program is 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: 
 * Red Hat, Inc. - initial API and implementation 
 ******************************************************************************/
package org.jboss.tools.openshift.cdk.server.ui.internal;

import java.io.File;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.DirectoryDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.core.IServerWorkingCopy;
import org.eclipse.wst.server.core.TaskModel;
import org.eclipse.wst.server.ui.wizard.IWizardHandle;
import org.eclipse.wst.server.ui.wizard.WizardFragment;
import org.jboss.tools.foundation.core.credentials.CredentialService;
import org.jboss.tools.foundation.ui.credentials.ChooseCredentialComponent;
import org.jboss.tools.foundation.ui.credentials.ICredentialCompositeListener;
import org.jboss.tools.openshift.cdk.server.core.internal.CDKCoreActivator;
import org.jboss.tools.openshift.cdk.server.core.internal.adapter.CDKServer;

public class CDKServerWizardFragment extends WizardFragment {
    private IWizardHandle handle;
    private String homeDir;
    private Text homeText;
    private Button browseButton;
    private String selectedUser = null;
    private ChooseCredentialComponent credentials;

    @Override
    public boolean hasComposite() {
        return true;
    }

    @Override
    public boolean isComplete() {
        // Only one instance created per workspace, so we need to workaround this
        boolean b = browseButton != null && !browseButton.isDisposed() && findError() == null && super.isComplete();
        return b;
    }

    public ImageDescriptor getImageDescriptor() {
        return CDKCoreActivator.getDefault().getSharedImages().descriptor(CDKCoreActivator.CDK_WIZBAN);
    }

    @Override
    public Composite createComposite(Composite parent, IWizardHandle handle) {
        this.handle = handle;
        selectedUser = null;
        Composite main = new Composite(parent, SWT.NONE);
        handle.setTitle("Red Hat Container Development Environment");
        handle.setDescription(
                "A server adapter representing a Red Hat Container Development Kit installation folder containing a Vagrantfile.");
        handle.setImageDescriptor(getImageDescriptor());
        main.setLayout(new GridLayout(3, false));

        credentials = new ChooseCredentialComponent(new String[] { CredentialService.REDHAT_ACCESS });
        credentials.addCredentialListener(new ICredentialCompositeListener() {
            @Override
            public void credentialsChanged() {
                selectedUser = credentials.getUser();
                validate();
            }
        });
        credentials.create(main);
        credentials.gridLayout(3);

        Label l = new Label(main, SWT.NONE);
        l.setText("Folder: ");
        GridData homeData = new GridData();
        homeData.grabExcessHorizontalSpace = true;
        homeData.horizontalAlignment = SWT.FILL;
        homeText = new Text(main, SWT.BORDER);
        homeText.setLayoutData(homeData);
        browseButton = new Button(main, SWT.PUSH);
        browseButton.setText("Browse...");

        homeText.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                homeDir = homeText.getText();
                validate();
            }
        });
        browseButton.addSelectionListener(new SelectionListener() {
            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
                widgetSelected(e);
            }

            @Override
            public void widgetSelected(SelectionEvent e) {
                browseHomeDirClicked();
                validate();
            }

        });

        selectedUser = credentials.getUser();
        if (homeDir != null) {
            homeText.setText(homeDir);
        }

        String err = findError();
        setComplete(err == null);
        handle.update();
        main.pack(true);
        return main;
    }

    private void validate() {
        String err = findError();
        if (err != null) {
            handle.setMessage(err, IMessageProvider.ERROR);
            setComplete(false);
        } else {
            setComplete(true);
            String warn = findWarning();
            if (warn != null) {
                handle.setMessage(warn, IMessageProvider.WARNING);
            } else {
                handle.setMessage(null, IMessageProvider.NONE);
            }
        }
        handle.update();
    }

    private String findWarning() {
        return null;
    }

    private String findError() {
        if (homeDir == null || !(new File(homeDir)).exists()) {
            return "The selected folder does not exist.";
        }
        if (!(new File(homeDir, "Vagrantfile").exists())) {
            return "The selected folder does not have a Vagrantfile";
        }
        if (credentials.getDomain() == null || credentials.getUser() == null) {
            return "The Container Development Environment Server Adapter requries Red Hat Access credentials.";
        }
        return null;
    }

    protected void browseHomeDirClicked() {
        File file = homeDir == null ? null : new File(homeDir);
        if (file != null && !file.exists()) {
            file = null;
        }

        File directory = getDirectory(file, homeText.getShell());
        if (directory != null) {
            homeDir = directory.getAbsolutePath();
            homeText.setText(homeDir);
        }
    }

    protected static File getDirectory(File startingDirectory, Shell shell) {
        DirectoryDialog fileDialog = new DirectoryDialog(shell, SWT.OPEN);
        if (startingDirectory != null) {
            fileDialog.setFilterPath(startingDirectory.getPath());
        }

        String dir = fileDialog.open();
        if (dir != null) {
            dir = dir.trim();
            if (dir.length() > 0) {
                return new File(dir);
            }
        }
        return null;
    }

    protected IServer getServerFromTaskModel() {
        IServer wc = (IServer) getTaskModel().getObject(TaskModel.TASK_SERVER);
        return wc;
    }

    @Override
    public void performFinish(IProgressMonitor monitor) throws CoreException {
        exit();
        IServer s = getServerFromTaskModel();
        if (s instanceof IServerWorkingCopy) {
            IServerWorkingCopy swc = (IServerWorkingCopy) s;
            swc.setAttribute(CDKServer.PROP_FOLDER, homeDir);
            swc.setAttribute(CDKServer.PROP_USERNAME, selectedUser);
        }
    }

}