/*******************************************************************************
* Copyright (c) 2010 Neil Bartlett.
* 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
*
* Contributors:
* Neil Bartlett - initial API and implementation
*******************************************************************************/
package bndtools.wizards.bndfile;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Collection;
import java.util.Iterator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.osgi.framework.Version;
import aQute.bnd.osgi.Constants;
import bndtools.utils.PathUtils;
public class NewWrappingBndFileWizardPage extends NewBndFileWizardPage {
private static final String LIST_SEPARATOR = ",\\\n\t"; //$NON-NLS-1$
private static final Object ASSIGNMENT_SEPARATOR = ": "; //$NON-NLS-1$
private Collection< ? extends IPath> paths;
private Text txtBSN;
private Text txtVersion;
private String bsn = ""; //$NON-NLS-1$
private Version version = new Version(0, 0, 0);
private String error = null;
public NewWrappingBndFileWizardPage(String pageName, IStructuredSelection selection) {
super(pageName, selection);
setTitle(Messages.NewWrappingBndFileWizardPage_title);
setMessage(Messages.NewWrappingBndFileWizardPage_messageSpecifyFileName);
}
public void setPaths(Collection< ? extends IPath> paths) {
this.paths = paths;
}
@Override
protected void createAdvancedControls(Composite parent) {
// Override the existing advanced controls
Composite composite = new Composite(parent, SWT.NONE);
new Label(composite, SWT.NONE).setText(Messages.NewWrappingBndFileWizardPage_labelBSN);
txtBSN = new Text(composite, SWT.BORDER);
new Label(composite, SWT.NONE).setText(Messages.NewWrappingBndFileWizardPage_labelVersion);
txtVersion = new Text(composite, SWT.BORDER);
txtBSN.setText(bsn);
txtVersion.setText(version.toString());
txtBSN.addListener(SWT.Modify, new Listener() {
public void handleEvent(Event event) {
bsn = txtBSN.getText();
getContainer().updateButtons();
getContainer().updateMessage();
}
});
txtVersion.addListener(SWT.Modify, new Listener() {
public void handleEvent(Event event) {
try {
version = Version.parseVersion(txtVersion.getText());
error = null;
} catch (IllegalArgumentException e) {
version = null;
error = Messages.NewWrappingBndFileWizardPage_errorInvalidVersion;
}
getContainer().updateButtons();
getContainer().updateMessage();
}
});
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
GridLayout layout = new GridLayout(2, false);
layout.marginWidth = 0;
layout.marginHeight = 0;
composite.setLayout(layout);
txtBSN.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
txtVersion.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
super.createAdvancedControls(parent);
}
@Override
public boolean isPageComplete() {
return super.isPageComplete() && version != null;
}
@Override
public String getErrorMessage() {
String error = super.getErrorMessage();
if (error != null)
return error;
return this.error;
}
@Override
protected InputStream getInitialContents() {
StringBuilder builder = new StringBuilder();
// Do -classpath
IPath containerPath = getContainerFullPath();
builder.append(Constants.CLASSPATH).append(ASSIGNMENT_SEPARATOR);
for (Iterator< ? extends IPath> iterator = paths.iterator(); iterator.hasNext();) {
IPath path = iterator.next();
if (path.isAbsolute()) {
builder.append(path.toString());
} else {
IPath relative = PathUtils.makeRelativeTo(path, containerPath); // path.makeRelativeTo(containerPath);
builder.append(relative.toString());
}
if (iterator.hasNext())
builder.append(LIST_SEPARATOR);
}
builder.append('\n');
// Do BSN and Bundle-Version
if (bsn != null && bsn.length() > 0)
builder.append(Constants.BUNDLE_SYMBOLICNAME).append(ASSIGNMENT_SEPARATOR).append(bsn).append('\n');
builder.append(Constants.BUNDLE_VERSION).append(ASSIGNMENT_SEPARATOR).append(version.toString()).append('\n');
// Do Export Package
builder.append(Constants.EXPORT_PACKAGE).append(ASSIGNMENT_SEPARATOR).append("*;") //$NON-NLS-1$
.append(Constants.VERSION_ATTRIBUTE).append('=').append("${").append(Constants.BUNDLE_VERSION).append("}\n"); //$NON-NLS-1$ //$NON-NLS-2$
try {
return new ByteArrayInputStream(builder.toString().getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
return null;
}
}
}