blob: f49e00c239bab66b5198043b42e99c1194d4e497 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 GianMaria Romanato
* 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:
* GianMaria Romanato - initial API and implementation
*******************************************************************************/
package org.eclipse.virgo.ide.runtime.internal.ui;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.BaseLabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.statushandlers.StatusManager;
import org.eclipse.virgo.ide.runtime.internal.core.utils.StatusUtil;
import org.eclipse.wst.server.core.IRuntimeWorkingCopy;
/**
* Gather required data for setting up a PDE target platform.
*/
public class PDETargetPlatformComposite extends Composite {
class DirectoryLabelProvider extends BaseLabelProvider implements ITableLabelProvider {
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
return element != null ? element.toString() : null;
}
}
private List<File> folders;
private final Button enablePDEDevelopmentButton;
private final TableViewer foldersTableViewer;
private final Button addButton;
private final Button removeButton;
private final Button editButton;
private final Label comment;
private final IRunnableContext runnableContext;
private final IRuntimeWorkingCopy runtimeWorkingCopy;
private boolean repositoryConfigurationChanged;
public PDETargetPlatformComposite(Composite parent, IRunnableContext runnableContext, IRuntimeWorkingCopy iRuntimeWorkingCopy) {
super(parent, SWT.NONE);
this.runnableContext = runnableContext;
this.runtimeWorkingCopy = iRuntimeWorkingCopy;
setLayout(GridLayoutFactory.swtDefaults().numColumns(2).create());
setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
enablePDEDevelopmentButton = new Button(this, SWT.CHECK);
enablePDEDevelopmentButton.setSelection(false);
enablePDEDevelopmentButton.setText(Messages.PDETargetPlatformComposite_enable_checkbox);
enablePDEDevelopmentButton.setLayoutData(GridDataFactory.swtDefaults().span(2, SWT.DEFAULT).create());
foldersTableViewer = new TableViewer(this);
foldersTableViewer.setContentProvider(ArrayContentProvider.getInstance());
foldersTableViewer.setSorter(new ViewerSorter());
foldersTableViewer.setLabelProvider(new DirectoryLabelProvider());
foldersTableViewer.getTable().setLayoutData(GridDataFactory.fillDefaults().grab(true, true).span(1, 3).create());
foldersTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
int size = foldersTableViewer.getStructuredSelection().size();
editButton.setEnabled(size == 1);
removeButton.setEnabled(size > 0);
}
});
addButton = new Button(this, SWT.PUSH);
addButton.setLayoutData(GridDataFactory.fillDefaults().create());
addButton.setText(Messages.PDETargetPlatformComposite_add);
addButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
PDETargetPlatformComposite.this.addPressed(e);
}
});
removeButton = new Button(this, SWT.PUSH);
removeButton.setText(Messages.PDETargetPlatformComposite_remove);
removeButton.setLayoutData(GridDataFactory.fillDefaults().create());
removeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
PDETargetPlatformComposite.this.removePressed(e);
}
});
editButton = new Button(this, SWT.PUSH);
editButton.setText(Messages.PDETargetPlatformComposite_edit);
editButton.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).create());
editButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
PDETargetPlatformComposite.this.editPressed(e);
}
});
comment = new Label(this, SWT.WRAP);
comment.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).span(2, SWT.DEFAULT).create());
comment.setText(Messages.PDETargetPlatformComposite_note);
if (PDEHelper.existsTargetDefinition(runtimeWorkingCopy.getName())) {
enableTargetPlatform(true);
enablePDEDevelopmentButton.setSelection(true);
} else {
enableTargetPlatform(false);
}
enablePDEDevelopmentButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
PDETargetPlatformComposite.this.enableButtonSelected(e);
}
});
}
protected void editPressed(SelectionEvent e) {
DirectoryDialog dlg = new DirectoryDialog(e.display.getActiveShell());
dlg.setText(Messages.PDETargetPlatformComposite_edit_dialog_title);
dlg.setMessage(Messages.PDETargetPlatformComposite_edit_dialog_message);
String path = dlg.open();
if (path != null) {
LinkedHashSet<File> folders2 = new LinkedHashSet<File>(getTargetPlatformFolders());
folders2.remove(this.foldersTableViewer.getStructuredSelection().getFirstElement());
folders2.add(new File(path));
List<File> folders3 = new ArrayList<File>(folders2);
setTableInput(folders3);
repositoryConfigurationChanged = true;
}
}
protected void removePressed(SelectionEvent e) {
LinkedHashSet<File> folders2 = new LinkedHashSet<File>(getTargetPlatformFolders());
folders2.removeAll(this.foldersTableViewer.getStructuredSelection().toList());
List<File> folders3 = new ArrayList<File>(folders2);
setTableInput(folders3);
repositoryConfigurationChanged = true;
}
protected void addPressed(SelectionEvent e) {
DirectoryDialog dlg = new DirectoryDialog(e.display.getActiveShell());
dlg.setText(Messages.PDETargetPlatformComposite_add_dialog_title);
dlg.setMessage(Messages.PDETargetPlatformComposite_add_dialog_message);
String path = dlg.open();
if (path != null) {
LinkedHashSet<File> folders2 = new LinkedHashSet<File>(getTargetPlatformFolders());
folders2.add(new File(path));
List<File> folders3 = new ArrayList<File>(folders2);
setTableInput(folders3);
repositoryConfigurationChanged = true;
}
}
protected void enableButtonSelected(SelectionEvent e) {
enableTargetPlatform(enablePDEDevelopmentButton.getSelection());
}
protected void enableTargetPlatform(boolean enabled) {
comment.setEnabled(enabled);
foldersTableViewer.getTable().setEnabled(enabled);
addButton.setEnabled(enabled);
removeButton.setEnabled(enabled);
editButton.setEnabled(enabled);
if (enabled) {
try {
runnableContext.run(true, false, new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
folders = PDEHelper.getFoldersForTargetDefinition(runtimeWorkingCopy);
monitor.done();
if (foldersTableViewer.getTable() != null && !foldersTableViewer.getTable().isDisposed()) {
foldersTableViewer.getTable().getDisplay().asyncExec(new Runnable() {
public void run() {
foldersTableViewer.setInput(folders);
}
});
}
}
});
} catch (Exception e) {
StatusUtil.error(Messages.PDETargetPlatformComposite_error_message, e, StatusManager.LOG | StatusManager.SHOW);
}
} else {
foldersTableViewer.setInput(Collections.emptyList());
}
}
public Button getEnablePDEDevelopmentButton() {
return enablePDEDevelopmentButton;
}
public void setTableInput(List<File> targetPlatformFolders) {
this.folders = targetPlatformFolders;
foldersTableViewer.setInput(targetPlatformFolders);
}
public List<File> getTargetPlatformFolders() {
return folders;
}
public boolean isRepositoryConfigurationChanged() {
return repositoryConfigurationChanged;
}
public void performFinish(IProgressMonitor monitor) {
final List<File> folders = getTargetPlatformFolders();
boolean changed = isRepositoryConfigurationChanged();
Status st = PDEHelper.createTargetDefinition(monitor, runtimeWorkingCopy, folders);
if (!st.isOK()) {
StatusManager.getManager().handle(st, StatusManager.SHOW | StatusManager.LOG);
} else {
if (changed) {
getDisplay().syncExec(new Runnable() {
public void run() {
boolean applyToRepository = MessageDialog.openQuestion(getShell(),
PDEUIMessages.PDETargetPlatformWizardFragment_update_dialog_title,
PDEUIMessages.PDETargetPlatformWizardFragment_update_dialog_message);
if (applyToRepository) {
try {
PDEHelper.updateRepositoryConfiguration(runtimeWorkingCopy, folders);
} catch (IOException e) {
StatusUtil.error(PDEUIMessages.PDETargetPlatformWizardFragment_update_dialog_error, e,
StatusManager.SHOW | StatusManager.LOG);
}
}
}
});
}
}
}
}