blob: b0de71db83bf6449f1c1f7883d2017a2baa2ccbb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 EclipseSource Corporation and others.
* 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:
* EclipseSource Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.ui.preferences;
import java.util.*;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.pde.internal.core.PDECore;
import org.eclipse.pde.internal.core.PluginModelManager;
import org.eclipse.pde.internal.core.target.impl.TargetDefinition;
import org.eclipse.pde.internal.core.target.impl.TargetPlatformService;
import org.eclipse.pde.internal.core.target.provisional.*;
import org.eclipse.pde.internal.ui.*;
import org.eclipse.pde.internal.ui.wizards.target.EditTargetDefinitionWizard;
import org.eclipse.pde.internal.ui.wizards.target.NewTargetDefinitionWizard2;
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.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.*;
public class TargetPlatformPreferencePage2 extends PreferencePage implements IWorkbenchPreferencePage {
private class TargetLabelProvider extends LabelProvider {
public Image getImage(Object element) {
return PDEPlugin.getDefault().getLabelProvider().get(PDEPluginImages.DESC_TARGET_DEFINITION);
}
public String getText(Object element) {
String name = ((ITargetDefinition) element).getName();
if (name == null || name.length() == 0) {
return ((ITargetDefinition) element).getHandle().toString();
}
return name;
}
}
// Table viewer
private CheckboxTableViewer fTableViewer = null;
// Buttons
private Button fAddButton = null;
private Button fEditButton = null;
//private Button fDuplicateButton = null;
private Button fRemoveButton = null;
// Initial collection of targets (handles are realized into definitions as working copies)
private List fTargets = new ArrayList();
// Removed definitions (to be removed on apply)
private List fRemoved = new ArrayList();
public TargetPlatformPreferencePage2() {
// nothing
}
public void dispose() {
super.dispose();
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
*/
public Control createContents(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginHeight = layout.marginWidth = 0;
container.setLayout(layout);
createTargetProfilesGroup(container);
Dialog.applyDialogFont(container);
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IHelpContextIds.TARGET_PLATFORM_PREFERENCE_PAGE);
return container;
}
private void createTargetProfilesGroup(Composite container) {
Composite comp = SWTFactory.createComposite(container, 1, 1, GridData.FILL_BOTH, 0, 0);
SWTFactory.createWrapLabel(comp, PDEUIMessages.TargetPlatformPreferencePage2_0, 2, 250);
SWTFactory.createWrapLabel(comp, PDEUIMessages.TargetPlatformPreferencePage2_1, 2, 250);
SWTFactory.createVerticalSpacer(comp, 1);
Composite tableComposite = SWTFactory.createComposite(comp, 2, 1, GridData.FILL_BOTH, 0, 0);
SWTFactory.createWrapLabel(tableComposite, PDEUIMessages.TargetPlatformPreferencePage2_2, 2);
Table table = new Table(tableComposite, SWT.FULL_SELECTION | SWT.MULTI | SWT.BORDER | SWT.CHECK);
table.setLayoutData(new GridData(GridData.FILL_BOTH));
fTableViewer = new CheckboxTableViewer(table);
fTableViewer.setLabelProvider(new TargetLabelProvider());
fTableViewer.setContentProvider(ArrayContentProvider.getInstance());
fTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
updateButtons();
}
});
fTableViewer.setComparator(new ViewerComparator());
// add the targets
ITargetPlatformService service = getTargetService();
if (service != null) {
ITargetHandle[] targets = service.getTargets(null);
for (int i = 0; i < targets.length; i++) {
try {
fTargets.add(targets[i].getTargetDefinition());
} catch (CoreException e) {
setErrorMessage(e.getMessage());
}
}
fTableViewer.setInput(fTargets);
}
// Single check behavior
fTableViewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
if (event.getChecked()) {
fTableViewer.setCheckedElements(new Object[] {event.getElement()});
} else {
fTableViewer.setCheckedElements(new Object[0]);
}
}
});
Composite buttonComposite = SWTFactory.createComposite(tableComposite, 1, 1, GridData.FILL_VERTICAL | GridData.VERTICAL_ALIGN_BEGINNING, 0, 0);
fAddButton = SWTFactory.createPushButton(buttonComposite, PDEUIMessages.TargetPlatformPreferencePage2_3, null);
fAddButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
NewTargetDefinitionWizard2 wizard = new NewTargetDefinitionWizard2();
wizard.setWindowTitle(PDEUIMessages.TargetPlatformPreferencePage2_4);
WizardDialog dialog = new WizardDialog(fAddButton.getShell(), wizard);
if (dialog.open() == Window.OK) {
ITargetDefinition def = wizard.getTargetDefinition();
fTargets.add(def);
fTableViewer.refresh();
fTableViewer.setSelection(new StructuredSelection(def));
}
}
});
fEditButton = SWTFactory.createPushButton(buttonComposite, PDEUIMessages.TargetPlatformPreferencePage2_5, null);
fEditButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
ITargetDefinition def = (ITargetDefinition) ((IStructuredSelection) fTableViewer.getSelection()).getFirstElement();
EditTargetDefinitionWizard wizard = new EditTargetDefinitionWizard(def);
wizard.setWindowTitle(PDEUIMessages.TargetPlatformPreferencePage2_6);
WizardDialog dialog = new WizardDialog(fEditButton.getShell(), wizard);
if (dialog.open() == Window.OK) {
fTableViewer.refresh();
}
}
});
// TODO: post M5, implement "duplicate"
// fDuplicateButton = SWTFactory.createPushButton(buttonComposite, "Duplicate...", null);
// fDuplicateButton.addSelectionListener(new SelectionAdapter() {
// public void widgetSelected(SelectionEvent e) {
// // for now we always duplicate to local metadata
// IStructuredSelection selection = (IStructuredSelection) fTableViewer.getSelection();
// ITargetDefinition source = (ITargetDefinition) selection.getFirstElement();
// ITargetPlatformService service = getTargetService();
// if (service != null) {
// ITargetDefinition dup = service.newTarget();
// try {
// service.copyTargetDefinition(source, dup);
// dup.setName(NLS.bind("Copy of {0}", source.getName()));
// fTargets.add(dup);
// fTableViewer.refresh();
// fTableViewer.setSelection(new StructuredSelection(dup));
// } catch (CoreException ex) {
// setErrorMessage(ex.getMessage());
// }
// }
// }
// });
fRemoveButton = SWTFactory.createPushButton(buttonComposite, PDEUIMessages.TargetPlatformPreferencePage2_7, null);
fRemoveButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selection = (IStructuredSelection) fTableViewer.getSelection();
List selected = selection.toList();
fRemoved.addAll(selected);
fTargets.removeAll(selected);
fTableViewer.refresh();
// TODO: update selection
}
});
updateButtons();
if (service != null) {
try {
ITargetHandle handle = service.getWorkspaceTargetHandle();
Iterator iterator = fTargets.iterator();
while (iterator.hasNext()) {
ITargetDefinition target = (ITargetDefinition) iterator.next();
if (target.getHandle().equals(handle)) {
fTableViewer.setCheckedElements(new Object[] {target});
break;
}
}
} catch (CoreException e) {
setErrorMessage(e.getMessage());
}
}
}
/**
* Update enabled state of buttons
*/
protected void updateButtons() {
// update enabled state of buttons
IStructuredSelection selection = (IStructuredSelection) fTableViewer.getSelection();
int size = selection.size();
fRemoveButton.setEnabled(size > 0);
fEditButton.setEnabled(size == 1);
//fDuplicateButton.setEnabled(size == 1);
}
/**
* Returns the target platform service.
*
* @return target platform service
*/
private ITargetPlatformService getTargetService() {
return (ITargetPlatformService) PDECore.getDefault().acquireService(ITargetPlatformService.class.getName());
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
*/
public void init(IWorkbench workbench) {
// ensures default targets are created when page is opened (if not created yet)
PluginModelManager manager = PDECore.getDefault().getModelManager();
manager.getExternalModelManager();
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage#performDefaults()
*/
public void performDefaults() {
// add a default target platform and select it (or just select it if present)
ITargetPlatformService service = getTargetService();
if (service instanceof TargetPlatformService) {
TargetPlatformService ts = (TargetPlatformService) service;
ITargetDefinition deflt = ts.newDefaultTargetDefinition();
Iterator iterator = fTargets.iterator();
ITargetDefinition reuse = null;
while (iterator.hasNext()) {
TargetDefinition existing = (TargetDefinition) iterator.next();
if (existing.isContentEquivalent(deflt)) {
reuse = existing;
break;
}
}
if (reuse != null) {
deflt = reuse;
} else {
fTargets.add(deflt);
}
fTableViewer.refresh();
fTableViewer.setCheckedElements(new Object[] {deflt});
}
super.performDefaults();
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage#performOk()
*/
public boolean performOk() {
ITargetPlatformService service = getTargetService();
if (service == null) {
return false;
}
// determine if default target has changed
ITargetDefinition toLoad = null;
boolean load = false;
try {
ITargetHandle prev = service.getWorkspaceTargetHandle();
ITargetHandle currH = null;
ITargetDefinition currD = null;
Object[] elements = fTableViewer.getCheckedElements();
if (elements.length > 0) {
currD = (ITargetDefinition) elements[0];
currH = currD.getHandle();
}
if (prev == null) {
if (currH != null) {
toLoad = currD;
load = true;
}
} else {
if (currH == null) {
// load empty
load = true;
} else if (!prev.equals(currH)) {
toLoad = currD;
load = true;
} else {
ITargetDefinition original = prev.getTargetDefinition();
// TODO: should just check for structural changes
if (((TargetDefinition) original).isContentEquivalent(currD)) {
load = false;
} else {
load = true;
toLoad = currD;
}
}
}
} catch (CoreException e) {
ErrorDialog.openError(getShell(), PDEUIMessages.TargetPlatformPreferencePage2_8, PDEUIMessages.TargetPlatformPreferencePage2_9, e.getStatus());
return false;
}
// Remove any definitions that have been removed
// TODO should we prompt? (only if workspace files?)
Iterator iterator = fRemoved.iterator();
while (iterator.hasNext()) {
ITargetDefinition target = (ITargetDefinition) iterator.next();
try {
service.deleteTarget(target.getHandle());
} catch (CoreException e) {
ErrorDialog.openError(getShell(), PDEUIMessages.TargetPlatformPreferencePage2_8, PDEUIMessages.TargetPlatformPreferencePage2_11, e.getStatus());
return false;
}
}
// save others that are dirty
iterator = fTargets.iterator();
while (iterator.hasNext()) {
ITargetDefinition def = (ITargetDefinition) iterator.next();
boolean save = true;
if (def.getHandle().exists()) {
try {
ITargetDefinition original = def.getHandle().getTargetDefinition();
if (((TargetDefinition) original).isContentEqual(def)) {
save = false;
}
} catch (CoreException e) {
// failed to generate original
setErrorMessage(e.getMessage());
return false;
}
}
if (save) {
try {
service.saveTargetDefinition(def);
} catch (CoreException e) {
setErrorMessage(e.getMessage());
return false;
}
}
}
// set workspace target if required
if (load) {
// TODO: prompt to warn of build? (like JRE page)
Job job = new LoadTargetDefinitionJob(toLoad);
job.schedule();
}
return super.performOk();
}
}