blob: 57124b20b920152b788fca914383c69b835c21b7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 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.editor.plugin;
import org.eclipse.pde.core.*;
import org.eclipse.pde.core.plugin.*;
import org.eclipse.pde.internal.core.*;
import org.eclipse.pde.internal.core.IModelChangeProviderExtension;
import org.eclipse.pde.internal.core.bundle.*;
import org.eclipse.pde.internal.core.ibundle.*;
import org.eclipse.pde.internal.ui.editor.*;
import org.eclipse.pde.internal.ui.editor.PDEFormEditor;
import org.eclipse.pde.internal.ui.editor.build.*;
import org.eclipse.pde.internal.ui.editor.context.*;
import org.eclipse.ui.forms.IFormPart;
public class PluginInputContextManager extends InputContextManager {
private BundlePluginModelBase bmodel;
/**
*
*/
public PluginInputContextManager(PDEFormEditor editor) {
super(editor);
}
public IBaseModel getAggregateModel() {
if (bmodel!=null)
return bmodel;
return findPluginModel();
}
public IModel getPluginModel() {
if (bmodel!=null)
return bmodel.getExtensionsModel();
return findPluginModel();
}
protected void fireContextChange(InputContext context, boolean added) {
super.fireContextChange(context, added);
if (context.getId().equals(BundleInputContext.CONTEXT_ID)) {
if (added)// bundle arriving
bundleAdded(context);
else
// bundle going away
bundleRemoved(context);
}
else if (context.getId().equals(BuildInputContext.CONTEXT_ID)) {
if (added)
buildAdded(context);
else
buildRemoved(context);
}
else if (context.getId().equals(PluginInputContext.CONTEXT_ID)) {
if (added)
pluginAdded(context);
else
pluginRemoved(context);
}
}
private void bundleAdded(InputContext bundleContext) {
IBundleModel model = (IBundleModel)bundleContext.getModel();
if (model.isFragmentModel())
bmodel = new BundleFragmentModel();
else
bmodel = new BundlePluginModel();
bmodel.setBundleModel(model);
syncExtensions();
}
private void syncExtensions() {
IModel emodel = findPluginModel();
if (emodel!=null && emodel instanceof ISharedExtensionsModel) {
bmodel.setExtensionsModel((ISharedExtensionsModel)emodel);
transferListeners(emodel, bmodel);
}
else
bmodel.setExtensionsModel(null);
}
private IModel findPluginModel() {
InputContext pcontext = findContext(PluginInputContext.CONTEXT_ID);
return (pcontext != null) ? (IModel)pcontext.getModel() : null;
}
private void bundleRemoved(InputContext bundleContext) {
if (bmodel!=null) {
BundlePluginModelBase preserved = bmodel;
bmodel = null;
IModel emodel = findPluginModel();
if (emodel!=null)
transferListeners(preserved, emodel);
}
}
private void transferListeners(IModel source, IModel target) {
if (source instanceof IModelChangeProviderExtension &&
target instanceof IModelChangeProviderExtension) {
IModelChangeProviderExtension smodel = (IModelChangeProviderExtension)source;
IModelChangeProviderExtension tmodel = (IModelChangeProviderExtension)target;
// first fire one last event to all the listeners to
// refresh
smodel.fireModelChanged(new ModelChangedEvent(smodel, IModelChangedEvent.WORLD_CHANGED, null, null));
// now pass the listener to the target model
smodel.transferListenersTo(tmodel, new IModelChangedListenerFilter() {
public boolean accept(IModelChangedListener listener) {
if (listener instanceof IFormPart ||
listener instanceof FormOutlinePage)
return true;
return false;
}
});
}
}
private void pluginAdded(InputContext pluginContext) {
if (bmodel!=null)
syncExtensions();
}
private void pluginRemoved(InputContext pluginContext) {
if (bmodel!=null)
syncExtensions();
}
private void buildAdded(InputContext buildContext) {
}
private void buildRemoved(InputContext buildContext) {
}
}