Package org.eclipse.ui.internal

Source Code of org.eclipse.ui.internal.AggregateWorkingSet

/*******************************************************************************
* Copyright (c) 2005, 2006 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.ui.internal;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.internal.util.Util;

/**
*
* @since 3.2
*/
public class AggregateWorkingSet extends AbstractWorkingSet implements
    IPropertyChangeListener {

  private IWorkingSet[] components;

  /**
   *
   * @param name
   * @param label
   * @param components
   */
  public AggregateWorkingSet(String name, String label,
      IWorkingSet[] components) {
    super(name, label);

    IWorkingSet[] componentCopy = new IWorkingSet[components.length];
    System.arraycopy(components, 0, componentCopy, 0, components.length);
    internalSetComponents(componentCopy);
    constructElements(false);
  }

  /**
   *
   * @param name
   * @param label
   * @param memento
   */
  public AggregateWorkingSet(String name, String label, IMemento memento) {
    super(name, label);
    workingSetMemento = memento;
  }

  void setComponents(IWorkingSet[] components) {
    internalSetComponents(components);
    constructElements(true);
  }

  private void internalSetComponents(IWorkingSet[] components) {
    this.components = components;
  }

  /**
   * Takes the elements from all component working sets and sets them to be
   * the elements of this working set. Any duplicates are trimmed.
   *
   * @param fireEvent whether a working set change event should be fired
   */
  private void constructElements(boolean fireEvent) {
    Set elements = new HashSet();
    for (int i = 0; i < components.length; i++) {
      IWorkingSet workingSet = components[i];
      elements.addAll(Arrays.asList(workingSet.getElements()));
    }
    internalSetElements((IAdaptable[]) elements
        .toArray(new IAdaptable[elements.size()]));
    if (fireEvent) {
      fireWorkingSetChanged(
        IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE, null);
    }
  }

  public String getId() {
    return null;
  }

  public ImageDescriptor getImageDescriptor() {
    return WorkbenchImages
        .getImageDescriptor(IWorkbenchGraphicConstants.IMG_OBJ_WORKING_SETS);
  }

  /**
   * A no-op for aggregates - their contents should be derived.
   */
  public void setElements(IAdaptable[] elements) {
  }

  public void setId(String id) {

  }

  /**
   * Aggregates are not editable.
   */
  public boolean isEditable() {
    return false;
  }

  /**
   * Aggregates should not generally be visible in the UI.
   */
  public boolean isVisible() {
    return false;
  }

  public void saveState(IMemento memento) {
    if (workingSetMemento != null) {
      // just re-save the previous memento if the working set has
      // not been restored
      memento.putMemento(workingSetMemento);
    } else {
      memento.putString(IWorkbenchConstants.TAG_NAME, getName());
      memento.putString(IWorkbenchConstants.TAG_LABEL, getLabel());
      memento.putString(AbstractWorkingSet.TAG_AGGREGATE, Boolean.TRUE
          .toString());

      for (int i = 0; i < components.length; i++) {
        IWorkingSet componentSet = components[i];
        memento.createChild(IWorkbenchConstants.TAG_WORKING_SET,
            componentSet.getName());
      }
    }
  }

  public void connect(IWorkingSetManager manager) {
    manager.addPropertyChangeListener(this);
    super.connect(manager);
  }

  public void disconnect() {
    getManager().removePropertyChangeListener(this);
    super.disconnect();
  }

  /**
   * Return the component working sets.
   *
   * @return the component working sets
   */
  public IWorkingSet[] getComponents() {
    if (components == null) {
      restoreWorkingSet();
      workingSetMemento = null;
    }
    return components;
  }

  public void propertyChange(PropertyChangeEvent event) {
    String property = event.getProperty();
    if (property.equals(IWorkingSetManager.CHANGE_WORKING_SET_REMOVE)) {
      for (int i = 0; i < getComponents().length; i++) {
        IWorkingSet set = getComponents()[i];
        if (set.equals(event.getOldValue())) {
          IWorkingSet[] newComponents = new IWorkingSet[components.length - 1];
          Util
              .arrayCopyWithRemoval(getComponents(),
                  newComponents, i);
          setComponents(newComponents);
        }
      }
    } else if (property
        .equals(IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE)) {
      for (int i = 0; i < getComponents().length; i++) {
        IWorkingSet set = getComponents()[i];
        if (set.equals(event.getNewValue())) {
          constructElements(true);
          break;
        }
      }
    }
  }

  void restoreWorkingSet() {
    IWorkingSetManager manager = getManager();
    if (manager == null) {
      throw new IllegalStateException();
    }
    IMemento[] workingSetReferences = workingSetMemento
        .getChildren(IWorkbenchConstants.TAG_WORKING_SET);
    ArrayList list = new ArrayList(workingSetReferences.length);

    for (int i = 0; i < workingSetReferences.length; i++) {
      IMemento setReference = workingSetReferences[i];
      String setId = setReference.getID();
      IWorkingSet set = manager.getWorkingSet(setId);
      if (set != null) {
        list.add(set);
      }
    }
    internalSetComponents((IWorkingSet[]) list
        .toArray(new IWorkingSet[list.size()]));
    constructElements(false);
  }

  public boolean equals(Object object) {
    if (this == object) {
      return true;
    }
    if (object instanceof AggregateWorkingSet) {
      AggregateWorkingSet workingSet = (AggregateWorkingSet) object;

      return Util.equals(workingSet.getName(), getName())
          && Util.equals(workingSet.getComponents(), getComponents());
    }
    return false;
  }

  public int hashCode() {
    int hashCode = getName().hashCode() & getComponents().hashCode();
    return hashCode;
  }
 
  public boolean isSelfUpdating() {
    if (components == null || components.length == 0) {
      return false;
    }
    for (int i= 0; i < components.length; i++) {
      if (!components[i].isSelfUpdating()) {
        return false;
      }
    }
    return true;
  }
 
  public boolean isAggregateWorkingSet() {
    return true;
  }

  /* (non-Javadoc)
   * @see org.eclipse.ui.IWorkingSet#adaptElements(org.eclipse.core.runtime.IAdaptable[])
   */
  public IAdaptable[] adaptElements(IAdaptable[] objects) {
    return new IAdaptable[0];
  }
}
TOP

Related Classes of org.eclipse.ui.internal.AggregateWorkingSet

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.