blob: 9598256d66166f80ab81d6d1a7845fe5ea3947ce [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2008 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.views.dependencies;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.ModelEntry;
import org.eclipse.pde.internal.core.*;
import org.eclipse.pde.internal.ui.elements.DefaultContentProvider;
public class DependenciesViewPageContentProvider extends DefaultContentProvider implements IPluginModelListener {
private DependenciesView fView;
private StructuredViewer fViewer;
/**
* Constructor.
*/
public DependenciesViewPageContentProvider(DependenciesView view) {
this.fView = view;
attachModelListener();
}
public void attachModelListener() {
PDECore.getDefault().getModelManager().addPluginModelListener(this);
}
public void removeModelListener() {
PDECore.getDefault().getModelManager().removePluginModelListener(this);
}
public void dispose() {
removeModelListener();
}
private void handleModifiedModels(ModelEntry[] modified) {
Object input = fViewer.getInput();
if (input instanceof IPluginModelBase) {
BundleDescription desc = ((IPluginModelBase) input).getBundleDescription();
String inputID = (desc != null) ? desc.getSymbolicName() : ((IPluginModelBase) input).getPluginBase().getId();
for (int i = 0; i < modified.length; i++) {
ModelEntry entry = modified[i];
if (entry.getId().equals(inputID)) {
// if we find a matching id to our current input, check to see if the input still exists
if (modelExists(entry, (IPluginModelBase) input))
fView.updateTitle(input);
else
// if input model does not exist, clear view
fView.openTo(null);
return;
}
}
}
}
private boolean modelExists(ModelEntry entry, IPluginModelBase input) {
IPluginModelBase[][] entries = new IPluginModelBase[][] {entry.getExternalModels(), entry.getWorkspaceModels()};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < entries[i].length; j++) {
if (entries[i][j].equals(input))
return true;
}
}
return false;
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
fView.updateTitle(newInput);
this.fViewer = (StructuredViewer) viewer;
}
public void modelsChanged(final PluginModelDelta delta) {
if (fViewer == null || fViewer.getControl().isDisposed())
return;
fViewer.getControl().getDisplay().asyncExec(new Runnable() {
public void run() {
int kind = delta.getKind();
if (fViewer.getControl().isDisposed())
return;
try {
if ((kind & PluginModelDelta.REMOVED) != 0) {
// called when all instances of a Bundle-SymbolicName are all removed
handleModifiedModels(delta.getRemovedEntries());
}
if ((kind & PluginModelDelta.CHANGED) != 0) {
// called when a plug-in is changed (possibly the input)
// AND when the model for the ModelEntry changes (new bundle with existing id/remove bundle with 2 instances with same id)
handleModifiedModels(delta.getChangedEntries());
}
if ((kind & PluginModelDelta.ADDED) != 0) {
// when user modifies Bundle-SymbolicName, a ModelEntry is created for the new name. In this case, if the input matches
// the modified model, we need to update the title.
handleModifiedModels(delta.getAddedEntries());
}
} finally {
// no matter what, refresh the viewer since bundles might un/resolve with changes
fViewer.refresh();
}
}
});
}
}