org.wso2.developerstudio.eclipse.updater.ui.UpdaterDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.developerstudio.eclipse.updater.ui.UpdaterDialog.java

Source

/*
 * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.wso2.developerstudio.eclipse.updater.ui;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;

import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
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.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.wso2.developerstudio.eclipse.logging.core.IDeveloperStudioLog;
import org.wso2.developerstudio.eclipse.logging.core.Logger;
import org.wso2.developerstudio.eclipse.platform.ui.preferences.UpdateCheckerPreferencePage;
import org.wso2.developerstudio.eclipse.updater.UpdaterPlugin;
import org.wso2.developerstudio.eclipse.updater.core.UpdateManager;
import org.wso2.developerstudio.eclipse.updater.model.EnhancedFeature;

public class UpdaterDialog extends Dialog {

    private static final String CANCEL_BTN_TXT = Messages.UpdaterDialog_0;
    private static final String VERSION_LABEL = Messages.UpdaterDialog_1;
    private static final String INSTALL_BTN_TXT = Messages.UpdaterDialog_2;
    private static final String FILE_PROTOCOL = "file:"; //$NON-NLS-1$
    private static final String TITLE = Messages.UpdaterDialog_4;
    private static final String UPDATES_TAB_TITLE = Messages.UpdaterDialog_5;
    private static final String ALL_FEATURES_TAB_TITLE = Messages.UpdaterDialog_6;

    private UpdateManager updateManager;
    private ActiveTab activeTab;
    protected List<EnhancedFeature> selectedFeatures;
    protected List<EnhancedFeature> selectedUpdates;
    private Button installBtn;
    private Dialog dialog;
    private TabFolder tabFolder;

    protected static IDeveloperStudioLog log = Logger.getLog(UpdaterPlugin.PLUGIN_ID);

    public enum ActiveTab {
        ALL_FEATURES, UPDATE_FEATURES
    }

    public UpdaterDialog(UpdateManager updateManager, ActiveTab activeTab) {
        super(Display.getDefault().getActiveShell());
        this.dialog = this;
        this.activeTab = activeTab;
        this.updateManager = updateManager;
        this.selectedFeatures = new ArrayList<>();
        this.selectedUpdates = new ArrayList<>();
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        final Composite topContainer = createTopContainer(parent);
        Composite leftContainer = createSubColumnContainer(topContainer);
        tabFolder = createLeftContainerTabFolder(leftContainer);

        createFeatureItemsInTabFolder(tabFolder);
        if (activeTab == ActiveTab.ALL_FEATURES) {
            tabFolder.setSelection(0);
        } else {
            tabFolder.setSelection(1);
        }
        return topContainer;
    }

    private void createFeatureItemsInTabFolder(TabFolder tabFolder) {
        createFeatureListTab(tabFolder, ActiveTab.ALL_FEATURES);
        createFeatureListTab(tabFolder, ActiveTab.UPDATE_FEATURES);
    }

    private void createFeatureListTab(TabFolder tabFolder, ActiveTab type) {
        TabItem tabItem = new TabItem(tabFolder, SWT.NULL);
        if (type == ActiveTab.ALL_FEATURES) {
            tabItem.setText(ALL_FEATURES_TAB_TITLE);
        } else {
            tabItem.setText(UPDATES_TAB_TITLE);
        }
        ScrolledComposite scroll = new ScrolledComposite(tabFolder, SWT.V_SCROLL | SWT.H_SCROLL);
        scroll.setLayout(new GridLayout());
        scroll.setLayoutData(new GridData());

        Group group = new Group(scroll, SWT.NONE);
        group.setLayout(new GridLayout());
        group.setLayoutData(new GridData());
        listFeatures(group, type);
        scroll.setContent(group);
        scroll.setExpandHorizontal(true);
        scroll.setExpandVertical(true);
        scroll.setMinSize(group.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        tabItem.setControl(scroll);
    }

    private TabFolder createLeftContainerTabFolder(Composite leftContainer) {
        GridData tabGridData = new GridData();
        tabGridData.horizontalAlignment = GridData.FILL;
        tabGridData.verticalAlignment = GridData.FILL;
        tabGridData.horizontalSpan = 3;
        tabGridData.verticalSpan = 7;
        tabGridData.grabExcessVerticalSpace = true;
        tabGridData.heightHint = 600;
        tabGridData.widthHint = 700;

        final TabFolder tabFolder = new TabFolder(leftContainer, SWT.CHECK | SWT.BORDER | SWT.H_SCROLL);
        tabFolder.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                if (tabFolder.getSelection()[0].getText().equals(ALL_FEATURES_TAB_TITLE)) {
                    installBtn.setEnabled(!selectedFeatures.isEmpty());
                } else if (tabFolder.getSelection()[0].getText().equals(UPDATES_TAB_TITLE)) {
                    installBtn.setEnabled(!selectedUpdates.isEmpty());
                }
            }
        });
        tabFolder.setLayoutData(tabGridData);
        tabFolder.setSize(400, 420);
        return tabFolder;
    }

    private Composite createSubColumnContainer(final Composite topContainer) {
        Composite leftContainer = new Composite(topContainer, SWT.NONE);
        leftContainer.setLayout(new GridLayout(1, false));
        GridData leftContainerGridData = new GridData(GridData.FILL_BOTH);
        leftContainer.setLayoutData(leftContainerGridData);
        return leftContainer;
    }

    private Composite createTopContainer(Composite parent) {
        final Composite topContainer = new Composite(parent, SWT.NONE);
        GridData topContainerGridData = new GridData(GridData.FILL_BOTH);
        topContainerGridData.heightHint = 600;
        topContainer.setLayoutData(topContainerGridData);
        GridLayout topContainerGridLayout = new GridLayout();
        topContainerGridLayout.numColumns = 1;
        topContainerGridLayout.makeColumnsEqualWidth = true;
        topContainer.setLayout(topContainerGridLayout);
        return topContainer;
    }

    private void listFeatures(Group group, ActiveTab tab) {
        IPreferenceStore prefPage = org.wso2.developerstudio.eclipse.platform.ui.Activator.getDefault()
                .getPreferenceStore();
        boolean showHiddenFeatures = prefPage.getBoolean(UpdateCheckerPreferencePage.SHOW_HIDDEN_FEATURES);

        Iterator<Entry<String, EnhancedFeature>> featureList;
        if (tab == ActiveTab.ALL_FEATURES) {
            featureList = updateManager.getAvailableFeaturesMap().entrySet().iterator();
        } else {
            featureList = updateManager.getPossibleUpdatesMap().entrySet().iterator();
        }
        while (featureList.hasNext()) {
            EnhancedFeature feature = featureList.next().getValue();
            // set isKernelFeature=true or isHidden=true in update.properties file in features to
            // ignore them in available Features tab
            if (tab == ActiveTab.ALL_FEATURES && !showHiddenFeatures) {
                if (feature.isKernelFeature() || feature.isHidden()) {
                    continue;
                }
            }
            GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
            final Group featureGroup = createFeatureRepresentationGroup(group, gridData);
            createCheckBoxInFeatureGroup(feature, featureGroup, tab);

            Label featureImageLabel = new Label(featureGroup, SWT.NONE);
            try {
                Image image = new Image(Display.getDefault(), feature.getIconURL().replace(FILE_PROTOCOL, "")); //$NON-NLS-1$
                featureImageLabel.setImage(image);
            } catch (Exception ex) {
                log.warn(Messages.UpdaterDialog_8 + feature.getId(), ex);
            }
            final Group featureInfoGroup = createFeatureInfoRepresentationGroup(featureGroup);
            StyledText featureName = createFeatureNameText(feature, featureInfoGroup);
            FontData fontData = featureName.getFont().getFontData()[0];
            Font font = new Font(featureInfoGroup.getDisplay(),
                    new FontData(fontData.getName(), fontData.getHeight() + 3, SWT.BOLD));
            featureName.setFont(font);
            createFeatureNewVersionText(feature, featureInfoGroup);
        }
    }

    private void createFeatureNewVersionText(EnhancedFeature feature, final Group featureInfoGroup) {
        StyledText featureNewVersion = new StyledText(featureInfoGroup, SWT.WRAP);
        String featureVersionString = VERSION_LABEL + feature.getVersion();
        featureNewVersion.setText(featureVersionString);
    }

    private StyledText createFeatureNameText(EnhancedFeature feature, final Group featureInfoGroup) {
        StyledText featureName = new StyledText(featureInfoGroup, SWT.WRAP);
        final String featureNameString = feature.getLabel();
        featureName.setText(featureNameString);
        return featureName;
    }

    private Group createFeatureInfoRepresentationGroup(final Group featureGroup) {
        GridData gridData;
        final Group featureInfoGroup = new Group(featureGroup, SWT.NONE);
        featureInfoGroup.setBackground(featureGroup.getDisplay().getSystemColor(SWT.COLOR_WHITE));
        gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
        gridData.horizontalSpan = 2;
        featureInfoGroup.setLayoutData(gridData);
        featureInfoGroup.setLayout(new GridLayout(1, false));
        return featureInfoGroup;
    }

    private void createCheckBoxInFeatureGroup(EnhancedFeature feature, final Group featureGroup,
            final ActiveTab type) {
        final SelectableFeatureButton btn = new SelectableFeatureButton(featureGroup, SWT.CHECK);
        btn.setFeature(feature);
        btn.getCheckBox().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                if (btn.getCheckBox().getSelection()) {
                    if (type == ActiveTab.ALL_FEATURES) {
                        selectedFeatures.add(btn.getFeature());
                    } else {
                        selectedUpdates.add(btn.getFeature());
                    }
                } else {
                    if (type == ActiveTab.ALL_FEATURES) {
                        selectedFeatures.remove(btn.getFeature());
                    } else {
                        selectedUpdates.remove(btn.getFeature());
                    }
                }
                if (type == ActiveTab.ALL_FEATURES) {
                    installBtn.setEnabled(!selectedFeatures.isEmpty());
                } else {
                    installBtn.setEnabled(!selectedUpdates.isEmpty());
                }
            }
        });
    }

    private Group createFeatureRepresentationGroup(Group group, GridData gridData) {
        final Group featureGroup = new Group(group, SWT.NONE);
        featureGroup.setBackground(featureGroup.getDisplay().getSystemColor(SWT.COLOR_WHITE));
        gridData.horizontalSpan = 2;
        featureGroup.setLayout(new GridLayout(4, false));
        featureGroup.setLayoutData(gridData);
        return featureGroup;
    }

    protected void createButtonsForButtonBar(Composite parent) {
        // Change parent layout data to fill the whole bar
        parent.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        installBtn = createButton(parent, IDialogConstants.NO_ID, INSTALL_BTN_TXT, true);
        installBtn.setEnabled(false);
        installBtn.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event e) {
                switch (e.type) {
                case SWT.Selection:
                    if (tabFolder.getSelection()[0].getText().equals(ALL_FEATURES_TAB_TITLE)) {
                        updateManager.setSelectedFeaturesToInstall(selectedFeatures);
                        updateManager.installSelectedFeatures(new NullProgressMonitor());
                    } else if (tabFolder.getSelection()[0].getText().equals(UPDATES_TAB_TITLE)) {
                        updateManager.setSelectedUpdates(selectedUpdates);
                        updateManager.installSelectedUpdates(new NullProgressMonitor());
                    }
                    dialog.close();
                    break;
                }
            }
        });

        // Create a spacer label
        Label spacer = new Label(parent, SWT.NONE);
        spacer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        // Update layout of the parent composite to count the spacer
        GridLayout layout = (GridLayout) parent.getLayout();
        layout.numColumns++;
        layout.makeColumnsEqualWidth = false;
        createButton(parent, IDialogConstants.CANCEL_ID, CANCEL_BTN_TXT, false);
    }

    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText(TITLE);
    }
}