Package org.teavm.eclipse.ui

Source Code of org.teavm.eclipse.ui.TeaVMProfileDialog$KeyValue

/*
*  Copyright 2014 Alexey Andreev.
*
*  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.teavm.eclipse.ui;

import java.util.*;
import java.util.List;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.variables.VariablesPlugin;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
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.*;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.views.navigator.ResourceComparator;
import org.teavm.eclipse.TeaVMProfile;
import org.teavm.eclipse.TeaVMProjectSettings;
import org.teavm.eclipse.TeaVMRuntimeMode;

/**
*
* @author Alexey Andreev <konsoletyper@gmail.com>
*/
public class TeaVMProfileDialog extends Dialog {
    private static List<TeaVMRuntimeMode> runtimeModes = Arrays.asList(TeaVMRuntimeMode.SEPARATE,
            TeaVMRuntimeMode.MERGE, TeaVMRuntimeMode.NONE);
    private TabFolder tabFolder;
    private Text nameField;
    private Text mainClassField;
    private Button mainClassChooseButton;
    private Text targetDirectoryField;
    private Button targetDirectoryWorkspaceButton;
    private Button targetDirectoryFileSystemButton;
    private Text targetFileNameField;
    private Button minifyingButton;
    private Combo runtimeField;
    private Button incrementalButton;
    private Text cacheDirectoryField;
    private Button cacheDirectoryWorkspaceButton;
    private Button cacheDirectoryFileSystemButton;
    private Button debugInformationButton;
    private Button sourceMapsButton;
    private Button sourceFilesCopiedButton;
    private TableViewer propertiesTableViewer;
    private Button addPropertyButton;
    private Button deletePropertyButton;
    private WritableList propertyList = new WritableList();
    private TableViewer classAliasesTableViewer;
    private Button addClassAliasButton;
    private Button removeClassAliasButton;
    private WritableList classAliases = new WritableList();
    private org.eclipse.swt.widgets.List transformersList;
    private Button addTransformerButton;
    private Button removeTransformerButton;
    private IJavaProject javaProject;
    private TeaVMProjectSettings settings;
    private TeaVMProfile profile;

    public TeaVMProfileDialog(Shell shell, TeaVMProjectSettings settings, TeaVMProfile profile) {
        super(shell);
        this.settings = settings;
        this.profile = profile;
        setShellStyle(getShellStyle() | SWT.RESIZE);
    }

    @Override
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setText("Editing TeaVM profile");
    }

    @Override
    protected boolean isResizable() {
        return true;
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite area = (Composite)super.createDialogArea(parent);
        area.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        ScrolledComposite scrollContainer = new ScrolledComposite(area, SWT.V_SCROLL | SWT.H_SCROLL);
        scrollContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        tabFolder = new TabFolder(scrollContainer, SWT.TOP);
        scrollContainer.setContent(tabFolder);
        scrollContainer.setExpandHorizontal(true);
        scrollContainer.setExpandVertical(true);
        TabItem generalItem = new TabItem(tabFolder, SWT.NONE);
        generalItem.setText("General");
        generalItem.setControl(createGeneralTab(tabFolder));
        TabItem advancedItem = new TabItem(tabFolder, SWT.NONE);
        advancedItem.setText("Advanced");
        advancedItem.setControl(createAdvancedTab(tabFolder));
        load();
        tabFolder.setSize(tabFolder.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        scrollContainer.setMinSize(tabFolder.getSize());
        return scrollContainer;
    }

    private Composite createGeneralTab(TabFolder folder) {
        Composite container = new Composite(folder, SWT.NONE);
        GridLayout layout = new GridLayout(1, false);
        layout.marginHeight = 8;
        layout.verticalSpacing = 10;
        container.setLayout(layout);
        createMainGroup(container);
        createOutputGroup(container);
        createIncrementalGroup(container);
        createDebugGroup(container);
        createPropertiesGroup(container);
        return container;
    }

    private Composite createAdvancedTab(TabFolder folder) {
        Composite container = new Composite(folder, SWT.NONE);
        GridLayout layout = new GridLayout(1, false);
        layout.marginHeight = 8;
        layout.verticalSpacing = 10;
        container.setLayout(layout);
        createClassesGroup(container);
        createTransformersGroup(container);
        return container;
    }

    private void createMainGroup(Composite parent) {
        Group group = createGroup(parent, "Main settings", 3, false);
        createNameField(group);
        createMainClassField(group);
    }

    private void createOutputGroup(Composite parent) {
        Group group = createGroup(parent, "Output settings", 4, false);
        createTargetDirectoryField(group);
        createTargetFileNameField(group);
        createRuntimeField(group);
        createMinifyField(group);
    }

    private void createIncrementalGroup(Composite parent) {
        Group group = createGroup(parent, "Incremental build settings", 4, false);
        createIncrementalField(group);
        createCacheDirectoryField(group);
    }

    private void createDebugGroup(Composite parent) {
        Group group = createGroup(parent, "Debug settings", 1, false);
        createDebugInformationField(group);
        createSourceMapsField(group);
        createSourceFilesCopiedField(group);
    }

    private void createPropertiesGroup(Composite parent) {
        Group group = createGroup(parent, "Properties", 2, true);
        propertiesTableViewer = new TableViewer(group, SWT.BORDER | SWT.V_SCROLL);
        propertiesTableViewer.getTable().setLinesVisible(true);
        propertiesTableViewer.getTable().setHeaderVisible(true);
        propertiesTableViewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 3));
        propertiesTableViewer.setContentProvider(new ObservableListContentProvider());
        propertiesTableViewer.setInput(propertyList);

        TableViewerColumn propertyColumn = new TableViewerColumn(propertiesTableViewer, SWT.LEFT);
        propertyColumn.getColumn().setWidth(200);
        propertyColumn.getColumn().setText("Property");
        propertyColumn.setLabelProvider(new ColumnLabelProvider() {
            @Override public String getText(Object element) {
                KeyValue item = (KeyValue)element;
                return item.key;
            }
        });
        propertyColumn.setEditingSupport(new KeyValueEditingSupport(propertyColumn.getViewer(),
                propertiesTableViewer.getTable()) {
            @Override protected Object getValue(Object element) {
                KeyValue item = (KeyValue)element;
                return item.key;
            }
            @Override protected void setValue(Object element, Object value) {
                KeyValue item = (KeyValue)element;
                item.key = (String)value;
                getViewer().update(element, null);
            }
        });

        TableViewerColumn valueColumn = new TableViewerColumn(propertiesTableViewer, SWT.LEFT);
        valueColumn.getColumn().setWidth(200);
        valueColumn.getColumn().setText("Value");
        valueColumn.setLabelProvider(new ColumnLabelProvider() {
            @Override public String getText(Object element) {
                KeyValue item = (KeyValue)element;
                return item.value;
            }
        });
        valueColumn.setEditingSupport(new KeyValueEditingSupport(valueColumn.getViewer(),
                propertiesTableViewer.getTable()) {
            @Override protected Object getValue(Object element) {
                KeyValue item = (KeyValue)element;
                return item.value;
            }
            @Override protected void setValue(Object element, Object value) {
                KeyValue item = (KeyValue)element;
                item.value = (String)value;
                getViewer().update(element, null);
            }
        });

        addPropertyButton = new Button(group, SWT.PUSH);
        addPropertyButton.setText("Add");
        addPropertyButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
        addPropertyButton.addSelectionListener(new SelectionAdapter() {
            @Override public void widgetSelected(SelectionEvent e) {
                addProperty();
            }
        });

        deletePropertyButton = new Button(group, SWT.PUSH);
        deletePropertyButton.setText("Delete");
        deletePropertyButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
        deletePropertyButton.addSelectionListener(new SelectionAdapter() {
            @Override public void widgetSelected(SelectionEvent e) {
                deleteProperty();
            }
        });
    }

    static abstract class KeyValueEditingSupport extends EditingSupport {
        private TextCellEditor editor;

        public KeyValueEditingSupport(ColumnViewer viewer, Table table) {
            super(viewer);
            editor = new TextCellEditor(table);
        }

        @Override
        protected CellEditor getCellEditor(Object element) {
            return editor;
        }

        @Override
        protected boolean canEdit(Object element) {
            return true;
        }
    }

    private void addProperty() {
        KeyValue item = new KeyValue();
        propertyList.add(item);
    }

    private void deleteProperty() {
        int index = propertiesTableViewer.getTable().getSelectionIndex();
        if (index < 0) {
            return;
        }
        KeyValue item = (KeyValue)propertyList.get(index);
        boolean confirmed = MessageDialog.openConfirm(getShell(), "Property deletion confirmation",
                "Are you sure to delete property " + item.key + "?");
        if (!confirmed) {
            return;
        }
        propertyList.remove(index);
    }

    static class KeyValue {
        String key = "";
        String value = "";
    }

    private void createClassesGroup(Composite parent) {
        Group group = createGroup(parent, "Class aliases", 2, true);
        classAliasesTableViewer = new TableViewer(group, SWT.BORDER | SWT.V_SCROLL);
        classAliasesTableViewer.getTable().setLinesVisible(true);
        classAliasesTableViewer.getTable().setHeaderVisible(true);
        classAliasesTableViewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 3));
        classAliasesTableViewer.setContentProvider(new ObservableListContentProvider());
        classAliasesTableViewer.setInput(classAliases);

        TableViewerColumn classNameColumn = new TableViewerColumn(classAliasesTableViewer, SWT.LEFT);
        classNameColumn.getColumn().setWidth(200);
        classNameColumn.getColumn().setText("Class");
        classNameColumn.setLabelProvider(new ColumnLabelProvider() {
            @Override public String getText(Object element) {
                ClassAliasRow item = (ClassAliasRow)element;
                return item.className;
            }
        });

        TableViewerColumn valueColumn = new TableViewerColumn(classAliasesTableViewer, SWT.LEFT);
        valueColumn.getColumn().setWidth(200);
        valueColumn.getColumn().setText("Alias");
        valueColumn.setLabelProvider(new ColumnLabelProvider() {
            @Override public String getText(Object element) {
                ClassAliasRow item = (ClassAliasRow)element;
                return item.alias;
            }
        });
        valueColumn.setEditingSupport(new EditingSupport(valueColumn.getViewer()) {
            private TextCellEditor editor = new TextCellEditor(classAliasesTableViewer.getTable());
            @Override protected Object getValue(Object element) {
                ClassAliasRow item = (ClassAliasRow)element;
                return item.alias;
            }
            @Override protected void setValue(Object element, Object value) {
                ClassAliasRow item = (ClassAliasRow)element;
                item.alias = (String)value;
                getViewer().update(element, null);
            }
            @Override protected boolean canEdit(Object element) { return true; }
            @Override protected CellEditor getCellEditor(Object element) { return editor; }
        });

        addClassAliasButton = new Button(group, SWT.PUSH);
        addClassAliasButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
        addClassAliasButton.setText("Add...");
        addClassAliasButton.addSelectionListener(new SelectionAdapter() {
            @Override public void widgetSelected(SelectionEvent e) { addClass(); }
        });

        removeClassAliasButton = new Button(group, SWT.PUSH);
        removeClassAliasButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
        removeClassAliasButton.setText("Remove");
        removeClassAliasButton.addSelectionListener(new SelectionAdapter() {
            @Override public void widgetSelected(SelectionEvent e) { removeClass(); }
        });
    }

    static class ClassAliasRow {
        String className;
        String alias;
    }

    private void createTransformersGroup(Composite parent) {
        Group group = createGroup(parent, "TeaVM bytecode transformers", 2, true);
        transformersList = new org.eclipse.swt.widgets.List(group, SWT.SINGLE | SWT.BORDER);
        transformersList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 3));

        addTransformerButton = new Button(group, SWT.PUSH);
        addTransformerButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
        addTransformerButton.setText("Add...");
        addTransformerButton.addSelectionListener(new SelectionAdapter() {
            @Override public void widgetSelected(SelectionEvent e) {
                addTransformer();
            }
        });

        removeTransformerButton = new Button(group, SWT.PUSH);
        removeTransformerButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
        removeTransformerButton.setText("Remove");
        removeTransformerButton.addSelectionListener(new SelectionAdapter() {
            @Override public void widgetSelected(SelectionEvent e) {
                removeTransformer();
            }
        });
    }

    private Group createGroup(Composite parent, String title, int columns, boolean fillVert) {
        Group group = new Group(parent, SWT.NONE);
        group.setLayoutData(new GridData(SWT.FILL, fillVert ? SWT.FILL : SWT.TOP, true, fillVert));
        group.setText(title);
        GridLayout layout = new GridLayout(columns, false);
        layout.horizontalSpacing = 3;
        layout.verticalSpacing = 2;
        layout.marginWidth = 10;
        group.setLayout(layout);
        return group;
    }

    private void createNameField(Composite container) {
        Label label = new Label(container, SWT.NONE);
        label.setText("&Name:");

        nameField = new Text(container, SWT.SINGLE | SWT.BORDER);
        nameField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
    }

    private void createMainClassField(Composite container) {
        Label label = new Label(container, SWT.NONE);
        label.setText("&Main class:");

        mainClassField = new Text(container, SWT.SINGLE | SWT.BORDER);
        mainClassField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        mainClassChooseButton = new Button(container, SWT.PUSH);
        mainClassChooseButton.setText("Choose...");
        mainClassChooseButton.addSelectionListener(new SelectionAdapter() {
            @Override public void widgetSelected(SelectionEvent e) {
                chooseMainClass();
            }
        });
    }

    private void createTargetDirectoryField(Composite container) {
        Label label = new Label(container, SWT.NONE);
        label.setText("&Target directory:");

        targetDirectoryField = new Text(container, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY);
        targetDirectoryField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        targetDirectoryWorkspaceButton = new Button(container, SWT.PUSH);
        targetDirectoryWorkspaceButton.setText("Workspace...");
        targetDirectoryWorkspaceButton.addSelectionListener(new SelectionAdapter() {
            @Override public void widgetSelected(SelectionEvent e) {
                String dir = chooseWorkspaceDirectory("Please, select a target directory");
                if (dir != null) {
                    targetDirectoryField.setText(dir);
                }
            }
        });

        targetDirectoryFileSystemButton = new Button(container, SWT.PUSH);
        targetDirectoryFileSystemButton.setText("External...");
        targetDirectoryFileSystemButton.addSelectionListener(new SelectionAdapter() {
            @Override public void widgetSelected(SelectionEvent e) {
                String dir = chooseFileSystemDirectory("Please, select a target directory");
                if (dir != null) {
                    targetDirectoryField.setText(dir);
                }
            }
        });
    }

    private void createTargetFileNameField(Composite container) {
        Label label = new Label(container, SWT.NONE);
        label.setText("&Target file:");

        targetFileNameField = new Text(container, SWT.SINGLE | SWT.BORDER);
        targetFileNameField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
    }

    private void createRuntimeField(Composite container) {
        Label label = new Label(container, SWT.NONE);
        label.setText("Attach &runtime:");

        runtimeField = new Combo(container, SWT.DROP_DOWN | SWT.READ_ONLY);
        runtimeField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1));
        runtimeField.add("as a separate file (runtime.js)");
        runtimeField.add("merge into output file");
        runtimeField.add("don't attach");
    }

    private void createMinifyField(Composite container) {
        minifyingButton = new Button(container, SWT.CHECK);
        minifyingButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1));
        minifyingButton.setText("generate minified (&obfuscated) code");
    }

    private void createIncrementalField(Composite container) {
        incrementalButton = new Button(container, SWT.CHECK);
        incrementalButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1));
        incrementalButton.setText("Build &incrementally");
        incrementalButton.addSelectionListener(new SelectionAdapter() {
            @Override public void widgetSelected(SelectionEvent e) {
                updateCacheFieldsEnabled();
            }
        });
    }

    private void createCacheDirectoryField(Composite container) {
        Label label = new Label(container, SWT.NONE);
        label.setText("Cac&he directory:");

        cacheDirectoryField = new Text(container, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY);
        cacheDirectoryField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        cacheDirectoryWorkspaceButton = new Button(container, SWT.PUSH);
        cacheDirectoryWorkspaceButton.setText("Workspace...");
        cacheDirectoryWorkspaceButton.addSelectionListener(new SelectionAdapter() {
            @Override public void widgetSelected(SelectionEvent e) {
                String dir = chooseWorkspaceDirectory("Please, select a directory for the incremental cache");
                if (dir != null) {
                    cacheDirectoryField.setText(dir);
                }
            }
        });

        cacheDirectoryFileSystemButton = new Button(container, SWT.PUSH);
        cacheDirectoryFileSystemButton.setText("External...");
        cacheDirectoryFileSystemButton.addSelectionListener(new SelectionAdapter() {
            @Override public void widgetSelected(SelectionEvent e) {
                String dir = chooseFileSystemDirectory("Please, select a directory for the incremental cache");
                if (dir != null) {
                    cacheDirectoryField.setText(dir);
                }
            }
        });

        updateCacheFieldsEnabled();
    }

    private void createDebugInformationField(Composite container) {
        debugInformationButton = new Button(container, SWT.CHECK);
        debugInformationButton.setText("Generate debug information for TeaVM native debugger");
    }

    private void createSourceMapsField(Composite container) {
        sourceMapsButton = new Button(container, SWT.CHECK);
        sourceMapsButton.setText("Generate source maps");
    }

    private void createSourceFilesCopiedField(Composite container) {
        sourceFilesCopiedButton = new Button(container, SWT.CHECK);
        sourceFilesCopiedButton.setText("Copy source files");
    }

    public void setProject(IProject project) throws CoreException {
        if (project.hasNature(JavaCore.NATURE_ID)) {
            this.javaProject = JavaCore.create(project);
        } else {
            this.javaProject = null;
        }
    }

    private void chooseMainClass() {
        MainClassSelectionDialog selectionDialog = new MainClassSelectionDialog(getShell(), javaProject);
        if (selectionDialog.open() == MainClassSelectionDialog.OK) {
            Object[] result = selectionDialog.getResult();
            if (result.length > 0) {
                IType type = (IType)result[0];
                mainClassField.setText(type.getFullyQualifiedName());
            }
        }
    }

    private String chooseWorkspaceDirectory(String prompt) {
        ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(),
                new WorkbenchContentProvider());
        dialog.setTitle("Selecting directory");
        dialog.setMessage(prompt);
        dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
        dialog.setComparator(new ResourceComparator(ResourceComparator.NAME));
        if (dialog.open() == IDialogConstants.OK_ID) {
            IResource resource = (IResource)dialog.getFirstResult();
            if (resource != null) {
                String path = resource.getFullPath().toString();
                String fileLoc = VariablesPlugin.getDefault().getStringVariableManager()
                        .generateVariableExpression("workspace_loc", path);
                return fileLoc;
            }
        }
        return null;
    }

    private String chooseFileSystemDirectory(String prompt) {
        String filePath = targetDirectoryField.getText();
        DirectoryDialog dialog = new DirectoryDialog(getShell());
        dialog.setMessage(prompt);
        filePath = dialog.open();
        return filePath;
    }

    private void addTransformer() {
        TransformerClassSelectionDialog selectionDialog = new TransformerClassSelectionDialog(getShell(),
                javaProject);
        if (selectionDialog.open() == ClassSelectionDialog.OK) {
            Object[] result = selectionDialog.getResult();
            if (result.length > 0) {
                IType type = (IType)result[0];
                List<String> existingTypes = Arrays.asList(transformersList.getItems());
                if (!existingTypes.contains(type.getFullyQualifiedName())) {
                    transformersList.add(type.getFullyQualifiedName());
                }
            }
        }
    }

    private void removeTransformer() {
        if (transformersList.getSelectionCount() != 1) {
            return;
        }
        boolean confirmed = MessageDialog.openConfirm(getShell(), "Removal confirmation",
                "Are you sure to delete the " + transformersList.getSelection()[0] + " transformer?");
        if (!confirmed) {
            return;
        }
        transformersList.remove(transformersList.getSelectionIndex());
    }

    private void addClass() {
        AnyClassSelectionDialog selectionDialog = new AnyClassSelectionDialog(getShell(), javaProject);
        if (selectionDialog.open() == ClassSelectionDialog.OK) {
            Object[] result = selectionDialog.getResult();
            if (result.length > 0) {
                IType type = (IType)result[0];
                for (int i = 0; i < classAliases.size(); ++i) {
                    ClassAliasRow row = (ClassAliasRow)classAliases.get(i);
                    if (row.className.equals(type.getFullyQualifiedName())) {
                        return;
                    }
                }
                ClassAliasRow row = new ClassAliasRow();
                row.alias = "_";
                row.className = type.getFullyQualifiedName();
                classAliases.add(row);
            }
        }
    }

    private void removeClass() {
        Table table = classAliasesTableViewer.getTable();
        if (table.getSelectionCount() != 1) {
            return;
        }
        boolean confirmed = MessageDialog.openConfirm(getShell(), "Removal confirmation",
                "Are you sure to delete the " + table.getSelection()[0].getText(0) + " class?");
        if (!confirmed) {
            return;
        }
        classAliases.remove(table.getSelectionIndex());
    }

    @Override
    protected void okPressed() {
        if (save()) {
            super.okPressed();
        } else {
            MessageBox mbox = new MessageBox(getShell(), SWT.ICON_ERROR);
            mbox.setMessage("Name " + nameField.getText() + " already used by another profile");
            mbox.setText("Invalid data supplied");
            mbox.open();
        }
    }

    private void updateCacheFieldsEnabled() {
        cacheDirectoryField.setEnabled(incrementalButton.getSelection());
        cacheDirectoryFileSystemButton.setEnabled(incrementalButton.getSelection());
        cacheDirectoryWorkspaceButton.setEnabled(incrementalButton.getSelection());
    }

    private static void setEnabledRecursive(Composite composite, boolean enabled) {
        Control[] children = composite.getChildren();
        for (int i = 0; i < children.length; i++) {
            if (children[i] instanceof Composite) {
                setEnabledRecursive((Composite) children[i], enabled);
            } else {
                children[i].setEnabled(enabled);
            }
        }
        composite.setEnabled(enabled);
    }

    private void load() {
        nameField.setText(profile.getName());
        mainClassField.setText(profile.getMainClass() != null ? profile.getMainClass() : "");
        targetDirectoryField.setText(profile.getTargetDirectory());
        targetFileNameField.setText(profile.getTargetFileName());
        minifyingButton.setSelection(profile.isMinifying());
        runtimeField.select(runtimeModes.indexOf(profile.getRuntimeMode()));
        incrementalButton.setSelection(profile.isIncremental());
        cacheDirectoryField.setText(profile.getCacheDirectory());
        debugInformationButton.setSelection(profile.isDebugInformationGenerated());
        sourceMapsButton.setSelection(profile.isSourceMapsGenerated());
        sourceFilesCopiedButton.setSelection(profile.isSourceFilesCopied());
        propertyList.clear();
        Properties properties = profile.getProperties();
        for (Object key : properties.keySet()) {
            KeyValue property = new KeyValue();
            property.key = (String)key;
            property.value = properties.getProperty((String)key);
            propertyList.add(property);
        }
        updateCacheFieldsEnabled();
        transformersList.setItems(profile.getTransformers());
        for (Map.Entry<String, String> entry : profile.getClassAliases().entrySet()) {
            ClassAliasRow row = new ClassAliasRow();
            row.className = entry.getKey();
            row.alias = entry.getValue();
            classAliases.add(row);
        }
        for (Control control : tabFolder.getTabList()) {
            if (control instanceof Composite) {
                setEnabledRecursive((Composite)control, profile.getExternalToolId().isEmpty());
            }
        }
    }

    private boolean save() {
        String name = nameField.getText().trim();
        TeaVMProfile existingProfile = settings.getProfile(name);
        if (existingProfile != null && existingProfile != profile) {
            return false;
        }
        profile.setName(name);
        String mainClass = mainClassField.getText().trim();
        profile.setMainClass(!mainClass.isEmpty() ? mainClass : null);
        profile.setTargetDirectory(targetDirectoryField.getText());
        profile.setTargetFileName(targetFileNameField.getText().trim());
        profile.setMinifying(minifyingButton.getSelection());
        profile.setRuntimeMode(runtimeModes.get(runtimeField.getSelectionIndex()));
        profile.setIncremental(incrementalButton.getSelection());
        profile.setCacheDirectory(cacheDirectoryField.getText());
        profile.setDebugInformationGenerated(debugInformationButton.getSelection());
        profile.setSourceMapsGenerated(sourceMapsButton.getSelection());
        profile.setSourceFilesCopied(sourceFilesCopiedButton.getSelection());
        Properties properties = new Properties();
        for (Object item : propertyList) {
            KeyValue property = (KeyValue)item;
            properties.setProperty(property.key, property.value);
        }
        profile.setProperties(properties);
        profile.setTransformers(transformersList.getItems());
        Map<String, String> classAliasMap = new HashMap<>();
        for (int i = 0; i < classAliases.size(); ++i) {
            ClassAliasRow row = (ClassAliasRow)classAliases.get(i);
            classAliasMap.put(row.className, row.alias);
        }
        profile.setClassAliases(classAliasMap);
        return true;
    }
}
TOP

Related Classes of org.teavm.eclipse.ui.TeaVMProfileDialog$KeyValue

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.