DependenciesViewPageContentProvider.java :  » IDE-Eclipse » Eclipse-plug-in-development » org » eclipse » pde » internal » ui » views » dependencies » Java Open Source

Java Open Source » IDE Eclipse » Eclipse plug in development 
Eclipse plug in development » org » eclipse » pde » internal » ui » views » dependencies » DependenciesViewPageContentProvider.java
/*******************************************************************************
 * Copyright (c) 2000, 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.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.IPluginModelListener;
import org.eclipse.pde.internal.core.PDECore;
import org.eclipse.pde.internal.core.PluginModelDelta;
import org.eclipse.pde.internal.core.PluginModelManager;
import org.eclipse.pde.internal.ui.elements.DefaultContentProvider;

public class DependenciesViewPageContentProvider extends DefaultContentProvider
    implements IPluginModelListener {
  private PluginModelManager fPluginManager;

  private DependenciesView fView;

  private StructuredViewer fViewer;

  /**
   * Constructor.
   */
  public DependenciesViewPageContentProvider(DependenciesView view) {
    this.fView = view;
    fPluginManager = PDECore.getDefault().getModelManager();
    attachModelListener();
  }
  
  public void attachModelListener() {
    fPluginManager.addPluginModelListener(this);
  }
  
  public void removeModelListener() {
    fPluginManager.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();
        }
      }
    });
  }

  /**
   * @return Returns the fPluginManager.
   */
  protected PluginModelManager getPluginManager() {
    return fPluginManager;
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.