/******************************************************************************* * Copyright (c) 2012 Bundlemaker project team. * 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: * Bundlemaker project team - initial API and implementation ******************************************************************************/ package org.bundlemaker.core.selection.internal.stage; import static com.google.common.base.Preconditions.checkNotNull; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.concurrent.CopyOnWriteArraySet; import org.bundlemaker.core.analysis.IBundleMakerArtifact; import org.bundlemaker.core.selection.IArtifactSelection; import org.bundlemaker.core.selection.IArtifactSelectionListener; import org.bundlemaker.core.selection.Selection; import org.bundlemaker.core.selection.stage.ArtifactStageAddMode; import org.bundlemaker.core.selection.stage.ArtifactStageChangedEvent; import org.bundlemaker.core.selection.stage.IArtifactStage; import org.bundlemaker.core.selection.stage.IArtifactStageChangeListener; /** * @author Nils Hartmann (nils@nilshartmann.net) * */ public class ArtifactStage implements IArtifactStage { private ArtifactStageAddMode _addMode = ArtifactStageAddMode.autoAddSelectedArtifacts; private List<IBundleMakerArtifact> _stagedArtifacts = new LinkedList<IBundleMakerArtifact>(); private final CopyOnWriteArraySet<IArtifactStageChangeListener> _stageChangeListener = new CopyOnWriteArraySet<IArtifactStageChangeListener>(); private boolean _init; public void init() { if (!_init) { Selection.instance().getArtifactSelectionService() .addArtifactSelectionListener(Selection.PROJECT_EXPLORER_SELECTION_ID, new IArtifactSelectionListener() { @Override public void artifactSelectionChanged(IArtifactSelection event) { projectExplorerSelectionChanged(event); } }); boolean useChildrenOfSelectedArtifacts = Selection.instance().getArtifactSelectionService() .getUseChildrenOfSelectedArtifacts(); if (useChildrenOfSelectedArtifacts) { _addMode = ArtifactStageAddMode.autoAddChildrenOfSelectedArtifacts; } IArtifactSelection selection = Selection.instance().getArtifactSelectionService() .getSelection(Selection.PROJECT_EXPLORER_SELECTION_ID); projectExplorerSelectionChanged(selection); _init = true; } } @Override public boolean hasStagedArtifacts() { return !_stagedArtifacts.isEmpty(); } @Override public void setAddMode(ArtifactStageAddMode addMode) { ArtifactStageAddMode oldMode = _addMode; this._addMode = checkNotNull(addMode); if (!_addMode.equals(oldMode)) { if (!_addMode.isAutoAddMode()) { // "save" effective selection List<IBundleMakerArtifact> effectiveSelectedArtifacts = getArtifactSelection().getEffectiveSelectedArtifacts(); _stagedArtifacts = new LinkedList<IBundleMakerArtifact>(effectiveSelectedArtifacts); } Selection.instance().getArtifactSelectionService() .setUseChildrenOfSelectedArtifacts(addMode == ArtifactStageAddMode.autoAddChildrenOfSelectedArtifacts); fireArtifactStageChange(); if (!_addMode.isAutoAddMode()) { publishStagedArtifacts(); } } } /** * @return the addMode */ @Override public ArtifactStageAddMode getAddMode() { return _addMode; } protected void projectExplorerSelectionChanged(IArtifactSelection newSelection) { // Selection in Project Explorer changed if (_addMode == ArtifactStageAddMode.doNotAutomaticallyAddArtifacts) { return; } if (newSelection == null) { setStagedArtifacts(new LinkedList<IBundleMakerArtifact>()); return; } final List<IBundleMakerArtifact> selectedArtifacts = newSelection.getSelectedArtifacts(); setStagedArtifacts(selectedArtifacts); // List<IBundleMakerArtifact> stagedArtifacts = new LinkedList<IBundleMakerArtifact>(); // if (_addMode == ArtifactStageAddMode.autoAddSelectedArtifacts) { // stagedArtifacts.addAll(selectedArtifacts); // // } else if (_addMode == ArtifactStageAddMode.autoAddChildrenOfSelectedArtifacts) { // // add children of selected Artifacts // // System.out.println("STAGED ARTIFACTS: " + stagedArtifacts); // // for (IBundleMakerArtifact iBundleMakerArtifact : selectedArtifacts) { // Collection<IBundleMakerArtifact> children = iBundleMakerArtifact.getChildren(); // // System.out.println(" ADD CHILDREN: " + children); // stagedArtifacts.addAll(children); // } // } // // setStagedArtifacts(stagedArtifacts); } /** * Set a complete new list of staged artifacts * * @param stagedArtifacts * the new staged artifacts. Might be null */ @Override public void setStagedArtifacts(List<IBundleMakerArtifact> stagedArtifacts) { _stagedArtifacts = (stagedArtifacts == null ? new LinkedList<IBundleMakerArtifact>() : new LinkedList<IBundleMakerArtifact>(stagedArtifacts)); publishStagedArtifacts(); } @Override public void addArtifactStageChangeListener(IArtifactStageChangeListener listener) { checkNotNull(listener); _stageChangeListener.add(listener); } @Override public void removeArtifactStageChangeListener(IArtifactStageChangeListener listener) { checkNotNull(listener); _stageChangeListener.remove(listener); } public void publishStagedArtifacts() { Selection.instance().getArtifactSelectionService().setSelection(// Selection.ARTIFACT_STAGE_SELECTION_ID, // StageSelection.STAGE_VIEW_SELECTION_PROVIDER_ID, // _stagedArtifacts); } protected IArtifactSelection getArtifactSelection() { return Selection.instance().getArtifactSelectionService().getSelection(// Selection.ARTIFACT_STAGE_SELECTION_ID); // } protected void fireArtifactStageChange() { final ArtifactStageChangedEvent event = new ArtifactStageChangedEvent(); for (IArtifactStageChangeListener listener : _stageChangeListener) { listener.artifactStateChanged(event); } } /** * @param selectedArtifacts */ @Override public void addToStage(List<IBundleMakerArtifact> selectedArtifacts) { boolean stageChanged = false; for (IBundleMakerArtifact iBundleMakerArtifact : selectedArtifacts) { if (!_stagedArtifacts.contains(iBundleMakerArtifact)) { _stagedArtifacts.add(iBundleMakerArtifact); stageChanged = true; } } if (stageChanged) { publishStagedArtifacts(); } } /** * @param artifacts */ @Override public void removeStagedArtifacts(Collection<IBundleMakerArtifact> artifacts) { _stagedArtifacts.removeAll(artifacts); // fireArtifactStageChange(ArtifactStageChangeReason.contentChanged); publishStagedArtifacts(); } }