/*******************************************************************************
* Copyright (c) 2012 Bundlemaker project team.
* 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:
* Bundlemaker project team - initial API and implementation
******************************************************************************/
package org.bundlemaker.core.ui.handler.exporter;
import java.io.File;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jdt.internal.ui.wizards.TypedViewerFilter;
import org.eclipse.jdt.internal.ui.wizards.buildpaths.FolderSelectionDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
/**
* @author Nils Hartmann (nils@nilshartmann.net)
*
*/
@SuppressWarnings("restriction")
public class BinaryBundleExporterConfigurationDialog extends AbstractExporterConfigurationDialog {
// output location
private boolean _saveToFileSystem = true;
private Combo _externalFolderCombo;
private Button _externalFolderRadio;
private String _externalFolder = ""; //$NON-NLS-1$
private Text _workspaceText;
private IResource _workspaceFolder;
private Button _workspaceFolderRadio;
// configuration
private Button _includeSourcesCheckBox;
private boolean _includeSources = false;
private Button _createEclipseSourceBundleCheckBox;
private boolean _createEclipseSourceBundle = false;
private Button _useOptionalResolutionOnMissingImportsCheckBox;
private boolean _useOptionalResolutionOnMissingImports = true;
/**
* @param parentShell
*/
public BinaryBundleExporterConfigurationDialog(Shell parentShell) {
super(parentShell);
}
@Override
protected void createControls(Composite dialogComposite) {
setTitle("Export modules as binary bundles");
setMessage("Choose how to export your modules");
// Location group
Group locationGroup = createGroup(dialogComposite, "Export destination");
createExportToFolder(locationGroup);
createExportToWorkspace(locationGroup);
// Configuration group
Group settingsGroup = createGroup(dialogComposite, "Exporter settings");
createSettings(settingsGroup);
// set initial enablement
updateEnablement();
}
/**
* @param settingsGroup
*/
private void createSettings(Group settingsGroup) {
_useOptionalResolutionOnMissingImportsCheckBox = new Button(settingsGroup, SWT.CHECK);
_useOptionalResolutionOnMissingImportsCheckBox.setText("Use Optional Resolution on missing Packages");
_useOptionalResolutionOnMissingImportsCheckBox.setSelection(_useOptionalResolutionOnMissingImports);
_useOptionalResolutionOnMissingImportsCheckBox.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
_useOptionalResolutionOnMissingImports = _useOptionalResolutionOnMissingImportsCheckBox.getSelection();
}
});
_includeSourcesCheckBox = new Button(settingsGroup, SWT.CHECK);
_includeSourcesCheckBox.setText("Include sources in OSGI-OPT");
_includeSourcesCheckBox.setSelection(_includeSources);
_includeSourcesCheckBox.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
_includeSources = _includeSourcesCheckBox.getSelection();
}
});
_createEclipseSourceBundleCheckBox = new Button(settingsGroup, SWT.CHECK);
_createEclipseSourceBundleCheckBox.setText("Additionaly create Eclipse Source Bundle");
_createEclipseSourceBundleCheckBox.setSelection(_createEclipseSourceBundle);
_createEclipseSourceBundleCheckBox.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
_createEclipseSourceBundle = _createEclipseSourceBundleCheckBox.getSelection();
}
});
}
private void createExportToFolder(Composite composite) {
_externalFolderRadio = new Button(composite, SWT.RADIO);
_externalFolderRadio.setText("External folder");
_externalFolderRadio.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
_saveToFileSystem = true;
_externalFolder = _externalFolderCombo.getText();
_externalFolderCombo.setFocus();
updateEnablement();
}
});
Composite inner = new Composite(composite, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginWidth = 0;
inner.setLayout(layout);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
inner.setLayoutData(data);
_externalFolderCombo = createDropDownCombo(inner);
_externalFolder = "";
_externalFolderCombo.setItems(BinaryBundleConfigurationStore.getInstance().getHistory());
_externalFolderCombo.setText(_externalFolder);
_externalFolderCombo.addListener(SWT.Modify, new Listener() {
@Override
public void handleEvent(Event event) {
_externalFolder = _externalFolderCombo.getText();
updateEnablement();
}
});
final Button browseButton = new Button(inner, SWT.PUSH);
browseButton.setText("Browse...");
data = new GridData();
data.horizontalAlignment = GridData.FILL;
int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
data.widthHint = Math.max(widthHint, browseButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
browseButton.setLayoutData(data);
browseButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.MULTI);
String folder = dialog.open();
if (folder != null) {
_saveToFileSystem = true;
_externalFolderCombo.setText(folder);
_externalFolder = folder;
_externalFolderCombo.setFocus();
updateEnablement();
}
}
});
}
private void createExportToWorkspace(Composite composite) {
_workspaceFolderRadio = new Button(composite, SWT.RADIO);
_workspaceFolderRadio.setText("Workspace location");
_workspaceFolderRadio.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
_saveToFileSystem = false;
_workspaceText.setFocus();
updateEnablement();
}
});
final Composite nameGroup = new Composite(composite, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginWidth = 0;
nameGroup.setLayout(layout);
final GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
nameGroup.setLayoutData(data);
_workspaceText = createTextField(nameGroup);
_workspaceText.setEditable(false);
// _workspaceText.addListener(SWT.Modify, new Listener() {
// @Override
// public void handleEvent(Event event) {
// _externalFolder = _workspaceFolder.getLocation().toString();
// updateEnablement();
// }
// });
Button wsBrowseButton = new Button(nameGroup, SWT.PUSH);
GridData gd = new GridData();
gd.horizontalAlignment = GridData.FILL;
int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
gd.widthHint = Math.max(widthHint, wsBrowseButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
wsBrowseButton.setLayoutData(gd);
wsBrowseButton.setText("Browse...");
wsBrowseButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
_saveToFileSystem = false;
FolderSelectionDialog dialog = new FolderSelectionDialog(getShell(), new WorkbenchLabelProvider(),
new WorkbenchContentProvider());
IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
dialog.setInput(workspaceRoot);
dialog.setTitle("Select folder");
dialog.setMessage("Select a destination folder from your workspace");
dialog.addFilter(new TypedViewerFilter(new Class[] { IProject.class, IFolder.class }));
if (_workspaceFolder != null) {
dialog.setInitialSelection(_workspaceFolder);
}
if (dialog.open() == Window.OK) {
IResource resource = (IResource) dialog.getFirstResult();
if (resource != null) {
_saveToFileSystem = false;
_workspaceFolder = resource;
_workspaceText.setText(resource.getFullPath().toString());
_workspaceText.setFocus();
updateEnablement();
}
}
}
});
}
private void updateEnablement() {
_externalFolderRadio.setSelection(_saveToFileSystem);
_workspaceFolderRadio.setSelection(!_saveToFileSystem);
if (_saveToFileSystem) {
if (_externalFolder == null || _externalFolder.isEmpty()) {
setErrorMessage("Select output folder");
return;
}
}
if (!_saveToFileSystem) {
if (_workspaceFolder == null) {
setErrorMessage("Select a folder from your workspace");
return;
}
}
setErrorMessage(null);
}
public boolean isIncludeSources() {
return _includeSources;
}
/**
* @return the createEclipseSourceBundle
*/
public boolean isCreateEclipseSourceBundle() {
return _createEclipseSourceBundle;
}
/**
* @return the useOptionalResolutionOnMissingImports
*/
public boolean isUseOptionalResolutionOnMissingImports() {
return _useOptionalResolutionOnMissingImports;
}
public File getDestination() {
if (isSaveToFileSystem()) {
// remember last selection
BinaryBundleConfigurationStore.getInstance().remember(_externalFolder);
return new File(_externalFolder);
}
return _workspaceFolder.getLocation().toFile();
}
public IResource getWorkspaceResource() {
return _workspaceFolder;
}
public boolean isSaveToFileSystem() {
return _saveToFileSystem;
}
static class BinaryBundleConfigurationStore extends ConfigurationStore {
private static BinaryBundleConfigurationStore instance;
public static BinaryBundleConfigurationStore getInstance() {
if (instance == null) {
instance = new BinaryBundleConfigurationStore();
}
return instance;
}
@Override
protected String getPreviousTag() {
return "previousFolders";
}
@Override
protected String getListTag() {
return "folders";
}
@Override
protected String getStoreSection() {
return "BinaryBundleExporterConfigurationDialog";
}
}
}