| /******************************************************************************* |
| * 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); |
| } |
| } |
| } |
| }); |
| } |
| } |
| } |
| |
| } |