package bndtools.wizards.workspace; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.File; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.swt.SWT; 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.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import aQute.bnd.build.Project; import bndtools.utils.ModificationLock; public class WorkspaceLocationPart { static final String PROP_LOCATION = "location"; private final PropertyChangeSupport propertySupport = new PropertyChangeSupport(this); private final ModificationLock modifyLock = new ModificationLock(); private LocationSelection location = LocationSelection.WORKSPACE; private Runnable updateFields; private Runnable updateEnablement; private Group group; public Control createControl(final Composite parent) { // Create Controls group = new Group(parent, SWT.NONE); group.setText("Location"); GridLayout layout = new GridLayout(3, false); group.setLayout(layout); File workspace = getUpdate(); if (workspace == null) { final Button btnCreateInEclipseWorkspace = new Button(group, SWT.RADIO); btnCreateInEclipseWorkspace.setText("Create in current Eclipse Workspace"); btnCreateInEclipseWorkspace.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 3, 1)); Label lblEclipseWorkspace = new Label(group, SWT.NONE); lblEclipseWorkspace.setText(ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString()); lblEclipseWorkspace.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1)); final Button btnCreateExternal = new Button(group, SWT.RADIO); btnCreateExternal.setText("Create in:"); final Text txtExternalLocation = new Text(group, SWT.BORDER); txtExternalLocation.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); final Button btnBrowseExternal = new Button(group, SWT.PUSH); btnBrowseExternal.setText("Browse"); updateFields = new Runnable() { @Override public void run() { btnCreateInEclipseWorkspace.setSelection(location.eclipseWorkspace); btnCreateExternal.setSelection(!location.eclipseWorkspace); txtExternalLocation.setText(location.externalPath != null ? location.externalPath : ""); } }; updateEnablement = new Runnable() { @Override public void run() { txtExternalLocation.setEnabled(!location.eclipseWorkspace); btnBrowseExternal.setEnabled(!location.eclipseWorkspace); } }; // Load initial state updateFields.run(); updateEnablement.run(); // Event listeners final Listener locationListener = new Listener() { @Override public void handleEvent(Event ev) { modifyLock.modifyOperation(new Runnable() { @Override public void run() { setLocation(new LocationSelection(btnCreateInEclipseWorkspace.getSelection(), txtExternalLocation.getText())); } }); } }; btnCreateExternal.addListener(SWT.Selection, locationListener); btnCreateInEclipseWorkspace.addListener(SWT.Selection, locationListener); txtExternalLocation.addListener(SWT.Modify, locationListener); btnBrowseExternal.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { DirectoryDialog dialog = new DirectoryDialog(parent.getShell()); String path = dialog.open(); if (path != null) txtExternalLocation.setText(path); } }); } else { final Label txtUpdateLocation = new Label(group, SWT.BORDER); txtUpdateLocation.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); txtUpdateLocation.setText("Update in current Bnd Workspace"); Label lblEclipseWorkspace = new Label(group, SWT.NONE); lblEclipseWorkspace.setText(workspace.getAbsolutePath()); lblEclipseWorkspace.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1)); setLocation(new LocationSelection(false, workspace.getAbsolutePath())); } return group; } private File getUpdate() { IProject cnfProject = ResourcesPlugin.getWorkspace().getRoot().getProject(Project.BNDCNF); if (cnfProject != null && cnfProject.exists()) { File cnf = cnfProject.getLocation().toFile(); if (cnf == null || !cnf.exists()) return null; return cnf.getParentFile(); } return null; } public LocationSelection getLocation() { return location; } public void setLocation(LocationSelection location) { LocationSelection oldLoc = this.location; this.location = location; if (group != null && !group.isDisposed() && updateFields != null) { modifyLock.ifNotModifying(updateFields); updateEnablement.run(); propertySupport.firePropertyChange(PROP_LOCATION, oldLoc, location); } } public void addPropertyChangeListener(PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propertySupport.removePropertyChangeListener(listener); } public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(propertyName, listener); } public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertySupport.removePropertyChangeListener(propertyName, listener); } }