Java tutorial
/* * 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 */ 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; } }