org.eclipse.cdt.arduino.ui.internal.preferences.ArduinoPlatformsPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.cdt.arduino.ui.internal.preferences.ArduinoPlatformsPreferencePage.java

Source

/*******************************************************************************
 * Copyright (c) 2015 QNX Software Systems 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
 *******************************************************************************/
package org.eclipse.cdt.arduino.ui.internal.preferences;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

import org.eclipse.cdt.arduino.core.internal.ArduinoPreferences;
import org.eclipse.cdt.arduino.core.internal.board.ArduinoManager;
import org.eclipse.cdt.arduino.core.internal.board.ArduinoPackage;
import org.eclipse.cdt.arduino.core.internal.board.ArduinoPlatform;
import org.eclipse.cdt.arduino.core.internal.board.PackageIndex;
import org.eclipse.cdt.arduino.ui.internal.Activator;
import org.eclipse.cdt.arduino.ui.internal.Messages;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;

public class ArduinoPlatformsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {

    private Table table;
    private Button installButton;
    private Button uninstallButton;
    private Button detailButton;

    private Collection<ArduinoPlatform> toInstall = new HashSet<>();
    private Collection<ArduinoPlatform> toUninstall = new HashSet<>();

    private static ArduinoManager manager = Activator.getService(ArduinoManager.class);

    @Override
    public void init(IWorkbench workbench) {
    }

    @Override
    protected Control createContents(Composite parent) {
        Composite control = new Composite(parent, SWT.NONE);
        control.setLayout(new GridLayout());

        Text desc = new Text(control, SWT.READ_ONLY | SWT.WRAP);
        GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, false);
        layoutData.widthHint = 500;
        desc.setLayoutData(layoutData);
        desc.setBackground(parent.getBackground());
        desc.setText(Messages.ArduinoPlatformsPreferencePage_0);

        Composite comp = new Composite(control, SWT.NONE);
        GridLayout layout = new GridLayout(2, false);
        layout.marginWidth = 0;
        comp.setLayout(layout);
        comp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        Composite tableComp = new Composite(comp, SWT.NONE);
        tableComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        table = new Table(tableComp, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.FULL_SELECTION);
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        TableColumn platformColumn = new TableColumn(table, SWT.LEAD);
        platformColumn.setText(Messages.ArduinoPlatformsPreferencePage_1);
        TableColumn installedColumn = new TableColumn(table, SWT.LEAD);
        installedColumn.setText(Messages.ArduinoPlatformsPreferencePage_2);
        TableColumn availableColumn = new TableColumn(table, SWT.LEAD);
        availableColumn.setText(Messages.ArduinoPlatformsPreferencePage_3);

        TableColumnLayout tableLayout = new TableColumnLayout();
        tableLayout.setColumnData(platformColumn, new ColumnWeightData(5, 150, true));
        tableLayout.setColumnData(installedColumn, new ColumnWeightData(2, 75, true));
        tableLayout.setColumnData(availableColumn, new ColumnWeightData(2, 75, true));
        tableComp.setLayout(tableLayout);

        table.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                TableItem[] selection = table.getSelection();
                if (selection.length > 0) {
                    TableItem item = selection[0];
                    detailButton.setEnabled(true);
                    ArduinoPlatform aplat = (ArduinoPlatform) item.getData();
                    ArduinoPlatform iplat = aplat.getPackage().getInstalledPlatforms().get(aplat.getName());
                    if (iplat == null) {
                        installButton.setEnabled(true);
                        installButton.setText(Messages.ArduinoPlatformsPreferencePage_4);
                        uninstallButton.setEnabled(false);
                    } else {
                        installButton.setText(Messages.ArduinoPlatformsPreferencePage_5);
                        if (!aplat.getVersion().equals(iplat.getVersion())) {
                            // Assuming upgrade if not equal, dangerous
                            installButton.setEnabled(true);
                        } else {
                            installButton.setEnabled(false);
                        }
                        uninstallButton.setEnabled(true);
                    }
                } else {
                    detailButton.setEnabled(false);
                    installButton.setEnabled(false);
                    uninstallButton.setEnabled(false);
                }
            }
        });

        Composite buttonComp = new Composite(comp, SWT.NONE);
        buttonComp.setLayout(new GridLayout());
        buttonComp.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));

        detailButton = new Button(buttonComp, SWT.PUSH);
        detailButton.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
        detailButton.setText(Messages.ArduinoPlatformsPreferencePage_6);
        detailButton.setEnabled(false);
        detailButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                TableItem[] selection = table.getSelection();
                // We are only enabled when there is a selection
                ArduinoPlatform platform = (ArduinoPlatform) selection[0].getData();
                PlatformDetailsDialog dialog = new PlatformDetailsDialog(getShell(), platform);
                dialog.open();
            }
        });

        installButton = new Button(buttonComp, SWT.PUSH);
        installButton.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
        installButton.setText(Messages.ArduinoPlatformsPreferencePage_7);
        installButton.setEnabled(false);
        installButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                TableItem[] selection = table.getSelection();
                if (selection.length > 0) {
                    TableItem item = selection[0];
                    toInstall.add(((ArduinoPlatform) item.getData()));
                    item.setImage(Activator.getDefault().getImageRegistry().get(Activator.IMG_ADD));
                }
            }
        });

        uninstallButton = new Button(buttonComp, SWT.PUSH);
        uninstallButton.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
        uninstallButton.setText(Messages.ArduinoPlatformsPreferencePage_8);
        uninstallButton.setEnabled(false);
        uninstallButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                TableItem[] selection = table.getSelection();
                if (selection.length > 0) {
                    TableItem item = selection[0];
                    toUninstall.add(((ArduinoPlatform) item.getData()));
                    item.setImage(Activator.getDefault().getImageRegistry().get(Activator.IMG_DELETE));
                }
            }
        });

        populateTable();

        return control;
    }

    private void populateTable() {
        table.removeAll();
        for (PackageIndex packageIndex : manager.getPackageIndices()) {
            for (ArduinoPackage pkg : packageIndex.getPackages()) {
                Map<String, ArduinoPlatform> available = pkg.getAvailablePlatforms();
                Map<String, ArduinoPlatform> installed = pkg.getInstalledPlatforms();
                List<String> names = new ArrayList<>(available.keySet());
                Collections.sort(names);
                for (String name : names) {
                    TableItem item = new TableItem(table, SWT.NONE);
                    item.setText(0, name);
                    ArduinoPlatform iplat = installed.get(name);
                    item.setText(1, iplat != null ? iplat.getVersion() : "---"); //$NON-NLS-1$
                    ArduinoPlatform aplat = available.get(name);
                    item.setText(2, aplat.getVersion());
                    item.setData(aplat);
                }
            }
        }
    }

    @Override
    public boolean performOk() {
        File acceptedFile = ArduinoPreferences.getArduinoHome().resolve(".accepted").toFile(); //$NON-NLS-1$
        if (!acceptedFile.exists()) {
            String message = Messages.ArduinoPlatformsPreferencePage_9 + Messages.ArduinoPlatformsPreferencePage_10;
            MessageDialog dialog = new MessageDialog(getShell(), Messages.ArduinoPlatformsPreferencePage_11, null,
                    message, MessageDialog.QUESTION, new String[] { Messages.ArduinoPlatformsPreferencePage_12,
                            Messages.ArduinoPlatformsPreferencePage_13 },
                    0);
            int rc = dialog.open();
            if (rc == 0) {
                try {
                    acceptedFile.createNewFile();
                } catch (IOException e) {
                    Activator.log(e);
                }
            } else {
                return false;
            }
        }

        new Job(Messages.ArduinoPlatformsPreferencePage_14) {
            @Override
            protected IStatus run(IProgressMonitor monitor) {
                MultiStatus status = new MultiStatus(Activator.PLUGIN_ID, 0,
                        Messages.ArduinoPlatformsPreferencePage_15, null);

                for (ArduinoPlatform platform : toUninstall) {
                    status.add(platform.uninstall(monitor));
                }
                toUninstall.clear();

                for (ArduinoPlatform platform : toInstall) {
                    status.add(platform.install(monitor));
                }
                toInstall.clear();

                if (table != null && !table.isDisposed()) {
                    table.getDisplay().asyncExec(new Runnable() {
                        @Override
                        public void run() {
                            populateTable();
                        }
                    });
                }

                return status;
            }
        }.schedule();
        return true;
    }

}