/******************************************************************************* * Copyright (c) 2007, 2008 Edgar Espina. * 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.deved.antlride.internal.ui.preferences; import org.deved.antlride.core.AntlrCore; import org.deved.antlride.core.resources.AntlrPackage; import org.deved.antlride.core.resources.AntlrPackages; import org.deved.antlride.core.resources.InvalidPackageException; import org.deved.antlride.ui.dialogs.AntlrBaseDialog; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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.DirectoryDialog; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; public class AntlrPackageDialog extends AntlrBaseDialog { private AntlrPackages packages; private AntlrPackage apackage; private Button addExtJARsButton; private Text homeText; private ListViewer viewer; private Text descriptionText; private Text versionText; private String title; private class CreatePackageTask implements SelectionListener { public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { DirectoryDialog dialog = new DirectoryDialog(getShell()); String directory = dialog.open(); if (directory != null) { createPackage(directory); } } } private class AddExternalJARsTask implements SelectionListener { public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { FileDialog dialog = new FileDialog(getShell()); dialog.setFilterExtensions(new String[] { "*.jar" }); String file = dialog.open(); if (file != null) { apackage.addExternalJARs(file); updateUI(apackage); } } } public AntlrPackageDialog(Shell parentShell, AntlrPackages packages, String title) { super(parentShell); this.title = title; this.packages = packages; } @Override protected String getDialogName() { return "package"; } public AntlrPackage getSelectedPackage() { return apackage; } private void createPackage(String directory) { apackage = null; try { apackage = AntlrPackages .createPackage(Path.fromOSString(directory)); if (packages.exist(apackage)) { MessageDialog .openError( getShell(), AntlrPreferenceMessages.Builder_Package_Title, AntlrPreferenceMessages.Builder_Package_Duplicated_Package); apackage = null; } else { updateUI(apackage); } } catch (InvalidPackageException ex) { AntlrCore.error(ex); String message = ex.getMessage(); Status status = new Status(IStatus.ERROR, AntlrCore.PLUGIN_ID, "Couldn't create a package", message != null && message.length() > 0 ? ex : null); ErrorDialog.openError(getShell(), AntlrPreferenceMessages.Builder_Package_Title, AntlrPreferenceMessages.Builder_Package_Invalid_Antlr_Home, status); } finally { addExtJARsButton.setEnabled(apackage != null); } } @Override protected void cancelPressed() { apackage = null; super.cancelPressed(); } @Override protected void setTitle() { setTitle("ANTLR Definition"); setMessage("Specify attributes for an ANTLR", IMessageProvider.INFORMATION); } public void setInput(AntlrPackage antlrPackage) { this.apackage = antlrPackage; } private void updateUI(AntlrPackage antlrPackage) { if (antlrPackage != null) { homeText.setText(antlrPackage.getHome()); descriptionText.setText(antlrPackage.getDescription()); versionText.setText(antlrPackage.getVersion()); viewer.setInput(antlrPackage.getClasspath()); } else { homeText.setText(""); descriptionText.setText(""); versionText.setText(""); viewer.setInput(null); } } @Override protected Control createDialogArea(Composite parent) { GridData gd = null; Composite area = (Composite) super.createDialogArea(parent); getShell().setText(title); Composite composite = new Composite(area, SWT.NONE); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); GridLayout layout = new GridLayout(3, false); layout.marginLeft = 10; layout.marginRight = 10; layout.verticalSpacing = 10; composite.setLayout(layout); Label label = new Label(composite, SWT.NONE); label.setText(AntlrPreferenceMessages.Builder_Package_Home); homeText = new Text(composite, SWT.BORDER); homeText.setEditable(false); gd = new GridData(GridData.FILL_HORIZONTAL); homeText.setLayoutData(gd); Button directoryButton = new Button(composite, SWT.PUSH); directoryButton .setText(AntlrPreferenceMessages.Builder_Package_Directory); directoryButton.addSelectionListener(new CreatePackageTask()); gd = new GridData(); directoryButton.setLayoutData(gd); label = new Label(composite, SWT.NONE); label.setText(AntlrPreferenceMessages.Builder_Package_Version); gd = new GridData(); label.setLayoutData(gd); versionText = new Text(composite, SWT.BORDER); versionText.setEditable(false); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; versionText.setLayoutData(gd); label = new Label(composite, SWT.NONE); label.setText(AntlrPreferenceMessages.Builder_Package_Desc); gd = new GridData(); label.setLayoutData(gd); descriptionText = new Text(composite, SWT.BORDER); descriptionText.setEditable(false); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; descriptionText.setLayoutData(gd); label = new Label(composite, SWT.NONE); label.setText(AntlrPreferenceMessages.Builder_Package_Libs); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 3; label.setLayoutData(gd); viewer = new ListViewer(composite); viewer.setContentProvider(new ArrayContentProvider()); viewer.setLabelProvider(new LabelProvider()); gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = 2; gd.verticalSpan = 10; viewer.getList().setLayoutData(gd); addExtJARsButton = new Button(composite, SWT.PUSH); addExtJARsButton .setText(AntlrPreferenceMessages.Builder_Package_Add_Ext_JARS); addExtJARsButton.setEnabled(false); addExtJARsButton.addSelectionListener(new AddExternalJARsTask()); addExtJARsButton.setToolTipText("Useful for add additional targets"); gd = new GridData(GridData.FILL_BOTH); gd.verticalAlignment = SWT.BEGINNING; updateUI(apackage); return composite; } }