com.liferay.ide.sdk.ui.InstalledSDKsCompostite.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.ide.sdk.ui.InstalledSDKsCompostite.java

Source

/*******************************************************************************
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 *
 *******************************************************************************/

package com.liferay.ide.sdk.ui;

import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.core.util.StringPool;
import com.liferay.ide.sdk.core.SDK;
import com.liferay.ide.sdk.core.SDKManager;
import com.liferay.ide.sdk.core.SDKUtil;
import com.liferay.ide.ui.util.SWTUtil;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ICheckStateProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
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.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

/**
 * @author Greg Amerson
 */
public class InstalledSDKsCompostite extends Composite {

    protected class SDKContentProvider implements IStructuredContentProvider {

        public void dispose() {
        }

        public Object[] getElements(Object inputElement) {
            return getSDKs();
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }

    }

    protected class SDKLabelProvider extends LabelProvider implements ITableLabelProvider {

        public Image getColumnImage(Object element, int columnIndex) {
            if (columnIndex == 0) {
                return SDKUIPlugin.getDefault().getImage(SDKUIPlugin.IMG_ICON_SDK_SMALL);
            }

            return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            String retval = null;

            if (element instanceof SDK) {
                SDK sdk = (SDK) element;

                switch (columnIndex) {

                case 0:
                    retval = sdk.getName();

                    break;

                case 1:
                    retval = sdk.getVersion();

                    break;
                case 2:
                    retval = sdk.getLocation().toOSString();

                    break;

                // case 3:
                // retval = sdk.getRuntime() != null ? sdk.getRuntime() :
                // "<None>";
                }
            } else {
                retval = StringPool.EMPTY;
            }
            return retval;
        }
    }

    protected Button fAddButton;
    protected Button fEditButton;
    protected Button fOpenInEclipse;
    protected ISelection fPrevSelection;
    protected Button fRemoveButton;
    protected PreferencePage page;
    protected List<SDK> sdks = null;
    protected Table table;
    protected CheckboxTableViewer tableViewer;

    public InstalledSDKsCompostite(Composite parent, int style) {
        super(parent, style);

        GridLayout gl = new GridLayout(2, false);

        setLayout(gl);

        createControl(this);
    }

    protected void addSDK() {
        AddSDKDialog dialog = new AddSDKDialog(this.getShell(), getSDKs());
        int retval = dialog.open();

        if (retval == AddSDKDialog.OK) {
            String name = dialog.getName();

            SDK newSDK = SDKUtil.createSDKFromLocation(new Path(dialog.getLocation()));
            newSDK.setName(name);

            if (dialog.getAddProject()) {
                newSDK.addProjectFile();

                if (dialog.getOpenInEclipse()) {
                    openInEclipse(newSDK);
                }
            }

            sdks.add(newSDK);

            ensureDefaultSDK();

            this.tableViewer.refresh();
        }
    }

    protected void createControl(Composite parent) {
        SWTUtil.createLabel(parent, Msgs.installedLiferayPluginSDKsLabel, 2);

        this.table = new Table(parent, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);

        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.heightHint = 250;
        gd.widthHint = 350;

        this.table.setLayoutData(gd);
        this.table.setFont(parent.getFont());
        this.table.setHeaderVisible(true);
        this.table.setLinesVisible(true);

        TableColumn column = new TableColumn(this.table, SWT.NULL);
        column.setText(Msgs.name);

        int defaultwidth = (gd.widthHint / 3) + 1;
        column.setWidth(defaultwidth);

        column = new TableColumn(this.table, SWT.NULL);
        column.setText(Msgs.version);
        column.setWidth(defaultwidth - 60);

        column = new TableColumn(this.table, SWT.NULL);
        column.setText(Msgs.location);
        column.setWidth(defaultwidth + 90);

        // column = new TableColumn(this.table, SWT.NULL);
        // column.setText("Runtime");
        // column.setWidth(defaultwidth+30);

        this.tableViewer = new CheckboxTableViewer(this.table);
        this.tableViewer.setLabelProvider(new SDKLabelProvider());
        this.tableViewer.setContentProvider(new SDKContentProvider());
        this.tableViewer.setCheckStateProvider(new ICheckStateProvider() {
            public boolean isChecked(Object element) {
                return ((SDK) element).isDefault();
            }

            public boolean isGrayed(Object element) {
                return false;
            }
        });

        this.tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(SelectionChangedEvent evt) {
                enableButtons();
            }

        });

        this.tableViewer.addCheckStateListener(new ICheckStateListener() {

            public void checkStateChanged(CheckStateChangedEvent event) {
                if (event.getChecked()) {
                    setCheckedSDK((SDK) event.getElement());
                } else {
                    setCheckedSDK(null);
                }
            }
        });

        Composite buttons = SWTUtil.createComposite(parent, 1, 1, GridData.VERTICAL_ALIGN_BEGINNING, 0, 0);

        fAddButton = SWTUtil.createPushButton(buttons, Msgs.add, null);
        fAddButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event evt) {
                addSDK();
            }
        });

        fEditButton = SWTUtil.createPushButton(buttons, Msgs.edit, null);
        fEditButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event evt) {
                editSDK(getFirstSelectedSDK());
            }
        });

        fRemoveButton = SWTUtil.createPushButton(buttons, Msgs.remove, null);
        fRemoveButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event evt) {
                removeSelectedSDKs();// remove all selected sdks
            }
        });

        fOpenInEclipse = SWTUtil.createPushButton(buttons, Msgs.openInEclipse, null);
        fOpenInEclipse.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                openInEclipse(getFirstSelectedSDK());
            }
        });

        final SDK[] sdks = SDKManager.getInstance().getSDKs();

        SDK[] editableSDKs = new SDK[sdks.length];

        for (int i = 0; i < sdks.length; i++) {
            editableSDKs[i] = sdks[i].copy();
        }

        setSDKs(editableSDKs);

        enableButtons();

        fAddButton.setEnabled(true);
    }

    protected void editSDK(SDK sdk) {
        AddSDKDialog dialog = new AddSDKDialog(this.getShell(), getSDKs(), sdk);

        int retval = dialog.open();

        if (retval == AddSDKDialog.OK) {
            String newName = dialog.getName();

            String newLocation = dialog.getLocation();

            sdk.setName(newName);
            sdk.setLocation(new Path(newLocation));

            if (dialog.getAddProject()) {
                sdk.addProjectFile();

                if (dialog.getOpenInEclipse()) {
                    openInEclipse(sdk);
                }
            }

            this.tableViewer.refresh();

            ensureDefaultSDK();

            this.tableViewer.refresh();
        }
    }

    protected void enableButtons() {
        IStructuredSelection selection = (IStructuredSelection) this.tableViewer.getSelection();

        int selectionCount = selection.size();

        if (selectionCount > 0 && selectionCount <= this.tableViewer.getTable().getItemCount()) {
            Iterator<?> iterator = selection.iterator();

            while (iterator.hasNext()) {
                SDK install = (SDK) iterator.next();

                if (isContributed(install)) {
                    fEditButton.setEnabled(false);
                    fRemoveButton.setEnabled(false);

                    return;
                }
            }

            fEditButton.setEnabled(true);
            fRemoveButton.setEnabled(true);
            fOpenInEclipse.setEnabled(true);
        } else {
            fEditButton.setEnabled(false);
            fRemoveButton.setEnabled(false);
            fOpenInEclipse.setEnabled(false);
        }
    }

    protected void ensureDefaultSDK() {
        // check if we only have one sdk it is new default
        if (sdks.size() == 1) {
            sdks.get(0).setDefault(true);
        }
    }

    protected void fireSelectionChanged() {
    }

    public SDK getDefaultSDK() {
        List<SDK> sdkList = new ArrayList<SDK>();

        for (SDK sdk : sdks) {
            if (sdk.isDefault()) {
                sdkList.add(sdk);
            }
        }

        if (sdkList.size() == 1) {
            return sdkList.get(0);
        }

        return null;
    }

    protected SDK getFirstSelectedSDK() {
        IStructuredSelection selection = (IStructuredSelection) getSelection();
        Iterator<?> iterator = selection.iterator();

        if (iterator.hasNext()) {
            Object next = iterator.next();

            if (next instanceof SDK) {
                return (SDK) next;
            }
        }

        return null;
    }

    public SDK[] getSDKs() {
        return sdks.toArray(new SDK[0]);
    }

    private ISelection getSelection() {
        return this.tableViewer.getSelection();
    }

    protected boolean isContributed(SDK install) {
        return install.isContributed();
    }

    protected void openInEclipse(SDK sdk) {
        if (!sdk.hasProjectFile()) {
            sdk.addProjectFile();
        }

        IProject sdkProject = CoreUtil.getProject(sdk.getName());

        if (sdkProject == null || (!sdkProject.exists())) {
            final IWorkspace workspace = ResourcesPlugin.getWorkspace();

            IProjectDescription description = workspace.newProjectDescription(sdk.getName());
            description.setLocationURI(sdk.getLocation().toFile().toURI());

            IProgressMonitor npm = new NullProgressMonitor();

            try {
                sdkProject.create(description, npm);
                sdkProject.open(npm);
            } catch (Exception e) {
                SDKUIPlugin.logError(e);
            }
        }
    }

    protected void removeSDKs(SDK[] removeSdks) {
        IStructuredSelection prev = (IStructuredSelection) getSelection();

        for (int i = 0; i < removeSdks.length; i++) {
            sdks.remove(removeSdks[i]);
        }

        ensureDefaultSDK();

        this.tableViewer.refresh();

        IStructuredSelection curr = (IStructuredSelection) getSelection();

        if (!curr.equals(prev)) {
            SDK[] curSdks = getSDKs();

            if (curr.size() == 0 && curSdks.length == 1) {
                // pick a default SDK automatically
                setSelection(new StructuredSelection(curSdks[0]));
            } else {
                fireSelectionChanged();
            }
        }

        this.tableViewer.refresh();

        if (this.page != null) {
            this.page.getContainer().updateButtons();
        }
    }

    protected void removeSelectedSDKs() {
        IStructuredSelection selection = (IStructuredSelection) getSelection();

        SDK[] selectedSdks = new SDK[selection.size()];

        Iterator<?> iterator = selection.iterator();

        int i = 0;

        while (iterator.hasNext()) {
            SDK sdk = null;

            Object next = iterator.next();

            if (next instanceof SDK) {
                sdk = (SDK) next;
            } else if (next instanceof IStructuredSelection) {
                sdk = (SDK) ((IStructuredSelection) next).getFirstElement();
            }

            selectedSdks[i++] = sdk;
        }

        List<SDK> sdksList = Arrays.asList(selectedSdks);
        // IDE-6 check to make sure that no existing projects use this SDK

        List<SDK> sdksToRemove = new ArrayList<SDK>();
        sdksToRemove.addAll(sdksList);
        List<SDK> checkedSDks = new ArrayList<SDK>();

        IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();

        for (IProject project : projects) {
            SDK sdk = SDKUtil.getSDK(project);

            if (sdksList.contains(sdk)) {
                if (checkedSDks.contains(sdk)) {
                    continue;
                } else {
                    boolean remove = MessageDialog.openQuestion(this.getShell(), Msgs.installedSDKs,
                            MessageFormat.format(Msgs.sdkRemovalConfirmation, sdk.getName()));

                    if (!remove) {
                        sdksToRemove.remove(sdk);
                    }

                    checkedSDks.add(sdk);
                }
            }
        }

        removeSDKs(sdksToRemove.toArray(new SDK[sdksToRemove.size()]));
    }

    protected void setCheckedSDK(SDK element) {
        if (element != null) {
            for (SDK sdk : getSDKs()) {
                sdk.setDefault(false);
            }

            element.setDefault(true);

            this.tableViewer.refresh();
        } else {
            for (SDK sdk : getSDKs()) {
                sdk.setDefault(false);
            }

            this.tableViewer.refresh();
        }

        if (this.page != null) {
            this.page.getContainer().updateButtons();
        }
    }

    public void setPreferencePage(PreferencePage prefPage) {
        this.page = prefPage;
    }

    protected void setSDKs(SDK[] newSdks) {
        this.sdks = new ArrayList<SDK>();

        Collections.addAll(this.sdks, newSdks);

        this.tableViewer.setInput(sdks);

        this.tableViewer.refresh();
    }

    protected void setSelection(ISelection selection) {
        if (selection instanceof IStructuredSelection) {
            if (!selection.equals(fPrevSelection)) {
                fPrevSelection = selection;

                Object sdk = ((IStructuredSelection) selection).getFirstElement();

                if (sdk == null) {
                    this.tableViewer.setCheckedElements(new Object[0]);
                } else {
                    this.tableViewer.setCheckedElements(new Object[] { sdk });

                    this.tableViewer.reveal(sdk);
                }

                fireSelectionChanged();
            }
        }
    }

    private static class Msgs extends NLS {
        public static String add;
        public static String edit;
        public static String installedLiferayPluginSDKsLabel;
        public static String installedSDKs;
        public static String location;
        public static String name;
        public static String openInEclipse;
        public static String remove;
        public static String sdkRemovalConfirmation;
        public static String version;

        static {
            initializeMessages(InstalledSDKsCompostite.class.getName(), Msgs.class);
        }
    }
}