blob: db1ca5d68569040f096301a63369f64359443ec6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2007 IBM 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.ui.preferences;
import java.util.*;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.osgi.service.resolver.State;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.PluginRegistry;
import org.eclipse.pde.internal.core.ICoreConstants;
import org.eclipse.pde.internal.core.PDECore;
import org.eclipse.pde.internal.core.itarget.*;
import org.eclipse.pde.internal.ui.*;
import org.eclipse.pde.internal.ui.elements.DefaultTableProvider;
import org.eclipse.pde.internal.ui.util.SWTUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
public class TargetImplicitPluginsTab {
private TableViewer fElementViewer;
protected Set fElements;
private Button fAddButton;
private Button fRemoveButton;
private Button fRemoveAllButton;
private TargetPlatformPreferencePage fPage;
public TargetImplicitPluginsTab(TargetPlatformPreferencePage page) {
fPage = page;
}
class ContentProvider extends DefaultTableProvider {
public Object[] getElements(Object inputElement) {
if (fElements == null)
loadTable();
return fElements.toArray();
}
}
public Control createContents(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
container.setLayout(layout);
container.setLayoutData(new GridData(GridData.FILL_BOTH));
createLabel(container);
createTable(container);
createButtons(container);
PlatformUI.getWorkbench().getHelpSystem().setHelp(container, IHelpContextIds.IMPLICIT_PLUGINS_PREFERENCE_PAGE);
return container;
}
private void createLabel(Composite container) {
Label label = new Label(container, SWT.NONE);
label.setText(PDEUIMessages.TargetImplicitPluginsTab_desc);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
label.setLayoutData(gd);
}
private void createTable(Composite container) {
fElementViewer = new TableViewer(container, SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER);
GridData gd = new GridData(GridData.FILL_BOTH);
fElementViewer.getControl().setLayoutData(gd);
fElementViewer.setContentProvider(new ContentProvider());
fElementViewer.setLabelProvider(PDEPlugin.getDefault().getLabelProvider());
fElementViewer.setInput(PDEPlugin.getDefault());
fElementViewer.setComparator(new ViewerComparator());
fElementViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
updateButtons();
}
});
fElementViewer.getTable().addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.character == SWT.DEL && e.stateMask == 0) {
handleRemove();
}
}
});
}
protected void loadTable() {
Preferences preferences = PDECore.getDefault().getPluginPreferences();
String value = preferences.getString(ICoreConstants.IMPLICIT_DEPENDENCIES);
StringTokenizer tokens = new StringTokenizer(value, ","); //$NON-NLS-1$
fElements = new HashSet((4 / 3) * tokens.countTokens() + 1);
while (tokens.hasMoreElements()) {
IPluginModelBase base = PluginRegistry.findModel(tokens.nextToken());
if (base != null) {
BundleDescription desc = base.getBundleDescription();
fElements.add(desc);
fElementViewer.add(desc);
}
}
}
private void createButtons(Composite container) {
Composite buttonContainer = new Composite(container, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginWidth = layout.marginHeight = 0;
buttonContainer.setLayout(layout);
buttonContainer.setLayoutData(new GridData(GridData.FILL_VERTICAL));
fAddButton = new Button(buttonContainer, SWT.PUSH);
fAddButton.setText(PDEUIMessages.SourceBlock_add);
fAddButton.setLayoutData(new GridData(GridData.FILL | GridData.VERTICAL_ALIGN_BEGINNING));
SWTUtil.setButtonDimensionHint(fAddButton);
fAddButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleAdd();
}
});
fRemoveButton = new Button(buttonContainer, SWT.PUSH);
fRemoveButton.setText(PDEUIMessages.SourceBlock_remove);
fRemoveButton.setLayoutData(new GridData(GridData.FILL | GridData.VERTICAL_ALIGN_BEGINNING));
SWTUtil.setButtonDimensionHint(fRemoveButton);
fRemoveButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleRemove();
}
});
fRemoveAllButton = new Button(buttonContainer, SWT.PUSH);
fRemoveAllButton.setText(PDEUIMessages.TargetImplicitPluginsTab_removeAll3);
fRemoveAllButton.setLayoutData(new GridData(GridData.FILL | GridData.VERTICAL_ALIGN_BEGINNING));
SWTUtil.setButtonDimensionHint(fRemoveAllButton);
fRemoveAllButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleRemoveAll();
}
});
if (fElements.size() == 0) {
fRemoveButton.setEnabled(false);
fRemoveAllButton.setEnabled(false);
}
}
private void updateButtons() {
boolean empty = fElementViewer.getSelection().isEmpty();
fRemoveButton.setEnabled(!empty);
fRemoveAllButton.setEnabled(fElementViewer.getElementAt(0) != null);
}
private void handleAdd() {
ElementListSelectionDialog dialog = new ElementListSelectionDialog(PDEPlugin.getActiveWorkbenchShell(), PDEPlugin.getDefault().getLabelProvider());
dialog.setElements(getValidBundles());
dialog.setTitle(PDEUIMessages.PluginSelectionDialog_title);
dialog.setMessage(PDEUIMessages.PluginSelectionDialog_message);
dialog.setMultipleSelection(true);
dialog.create();
PlatformUI.getWorkbench().getHelpSystem().setHelp(dialog.getShell(), IHelpContextIds.IMPLICIT_PLUGINS_SELECTION_DIALOG);
if (dialog.open() == Window.OK) {
Object[] bundles = dialog.getResult();
for (int i = 0; i < bundles.length; i++) {
fElementViewer.add(bundles[i]);
fElements.add(bundles[i]);
}
updateButtons();
}
}
protected Object[] getValidBundles() {
Set currentPlugins = new HashSet((4 / 3) * fElements.size() + 1);
Iterator it = fElements.iterator();
while (it.hasNext()) {
BundleDescription desc = (BundleDescription) it.next();
currentPlugins.add(desc.getSymbolicName());
}
IPluginModelBase[] models = fPage.getCurrentModels();
Set result = new HashSet((4 / 3) * models.length + 1);
for (int i = 0; i < models.length; i++) {
BundleDescription desc = models[i].getBundleDescription();
if (!currentPlugins.contains(desc.getSymbolicName()))
result.add(desc);
}
return result.toArray();
}
private void handleRemove() {
IStructuredSelection ssel = (IStructuredSelection) fElementViewer.getSelection();
Iterator it = ssel.iterator();
while (it.hasNext()) {
Object item = it.next();
fElements.remove(item);
fElementViewer.remove(item);
}
if (fElements.size() == 0)
fRemoveButton.setEnabled(false);
updateButtons();
}
private void handleRemoveAll() {
fElementViewer.remove(fElements.toArray());
fElements.clear();
updateButtons();
}
public void performDefauls() {
fElementViewer.remove(fElements.toArray());
fElements.clear();
fRemoveButton.setEnabled(false);
}
public void performOk() {
StringBuffer buffer = new StringBuffer();
Iterator it = fElements.iterator();
while (it.hasNext()) {
if (buffer.length() > 0)
buffer.append(","); //$NON-NLS-1$
BundleDescription desc = (BundleDescription) it.next();
buffer.append(desc.getSymbolicName());
}
Preferences preferences = PDECore.getDefault().getPluginPreferences();
preferences.setValue(ICoreConstants.IMPLICIT_DEPENDENCIES, buffer.toString());
}
public void loadTargetProfile(ITarget target) {
fElements.clear();
IImplicitDependenciesInfo info = target.getImplicitPluginsInfo();
if (info != null) {
State state = fPage.getCurrentState().getState();
ITargetPlugin[] plugins = info.getPlugins();
for (int i = 0; i < plugins.length; i++) {
BundleDescription desc = state.getBundle(plugins[i].getId(), null);
if (desc != null)
fElements.add(desc);
}
}
fElementViewer.refresh();
}
protected String[] getImplicitPlugins() {
String[] result = new String[fElements.size()];
Iterator iter = fElements.iterator();
int i = 0;
while (iter.hasNext()) {
result[i++] = ((BundleDescription) iter.next()).getSymbolicName();
}
return result;
}
}