/*******************************************************************************
* 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 java.io.IOException;
import java.net.MalformedURLException;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import org.deved.antlride.core.AntlrCore;
import org.deved.antlride.core.resources.AntlrLanguageTarget;
import org.deved.antlride.core.resources.AntlrLanguageTargetRepository;
import org.deved.antlride.core.resources.AntlrPackage;
import org.deved.antlride.ui.dialogs.AntlrBaseDialog;
import org.eclipse.core.runtime.IPath;
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.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
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.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class AntlrLanguageTargetDialog extends AntlrBaseDialog {
private class CreateLanguageTargetTask implements SelectionListener {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
FileDialog dialog = new FileDialog(getShell());
String file = dialog.open();
if (file != null) {
createLanguageTarget(file);
}
}
}
private static final IStatus INVALID_LANGUAGE = new Status(IStatus.ERROR,
AntlrCore.PLUGIN_ID, "Invalid file");
private AntlrPackage selectedPackage;
private String title;
private Text languageText;
private AntlrLanguageTarget languageTarget;
private IPath languagePath;
protected AntlrLanguageTarget parentTarget;
public AntlrLanguageTargetDialog(Shell parentShell, String title) {
super(parentShell);
this.title = title;
}
private void createLanguageTarget(String file) {
languagePath = null;
String language = null;
try {
JarFile jarFile = new JarFile(file);
Enumeration<JarEntry> entries = jarFile.entries();
IPath root = Path
.fromPortableString(AntlrLanguageTargetRepository.STRING_TEMPLATE_PATH);
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
IPath path = Path.fromPortableString(entry.getName());
IPath parent = path.removeLastSegments(1);
if (parent.equals(root)) {
languagePath = Path.fromOSString(file);
language = path.lastSegment();
break;
}
}
jarFile.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (languagePath != null) {
languageText.setText(language);
} else {
ErrorDialog.openError(getShell(), "Invalid language target",
"Can't find an language target", INVALID_LANGUAGE);
}
}
@Override
protected Point getDefaultSize() {
return new Point(383, 250);
}
@Override
protected String getDialogName() {
return "registerLanguageTarget";
}
@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);
composite.setLayout(layout);
Label label = new Label(composite, SWT.NONE);
label.setText("Name:");
languageText = new Text(composite, SWT.READ_ONLY | SWT.BORDER);
gd = new GridData(GridData.FILL_HORIZONTAL);
languageText.setLayoutData(gd);
Button button = new Button(composite, SWT.PUSH);
button.setText("Browse...");
button.addSelectionListener(new CreateLanguageTargetTask());
label = new Label(composite, SWT.NONE);
label.setText("Parent:");
ComboViewer comboViewer = new ComboViewer(composite);
comboViewer.setContentProvider(new ArrayContentProvider());
comboViewer.setInput(selectedPackage.getLanguageTargets());
comboViewer
.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) event
.getSelection();
parentTarget = (AntlrLanguageTarget) selection
.getFirstElement();
validate();
}
});
return composite;
}
@Override
protected void okPressed() {
languageTarget = null;
if (validate()) {
languageTarget = AntlrLanguageTargetRepository.create(parentTarget,
languageText.getText(), languagePath.toOSString());
AntlrLanguageTargetRepository.save(languageTarget);
super.okPressed();
}
}
@Override
protected void cancelPressed() {
languageTarget = null;
super.cancelPressed();
}
public AntlrLanguageTarget getLanguageTarget() {
return languageTarget;
}
private boolean validate() {
if (languagePath == null) {
setMessage("No language target defined", IMessageProvider.ERROR);
return false;
}
if (parentTarget == null) {
setMessage("Select a parent language", IMessageProvider.ERROR);
return false;
}
if (AntlrLanguageTargetRepository.exists(languagePath.lastSegment())) {
setMessage("Duplicated language: " + languagePath.lastSegment(),
IMessageProvider.ERROR);
return false;
}
setDefaultMessage();
return true;
}
private void setDefaultMessage() {
setMessage("Register a new language target for ANTLR",
IMessageProvider.INFORMATION);
}
@Override
protected void setTitle() {
setTitle("Add language target");
setDefaultMessage();
}
public void setInput(AntlrPackage selectedPackage) {
this.selectedPackage = selectedPackage;
}
}