/*******************************************************************************
* Copyright (c) 2006-2012
* Software Technology Group, Dresden University of Technology
* DevBoost GmbH, Berlin, Amtsgericht Charlottenburg, HRB 140026
*
* 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:
* Software Technology Group - TU Dresden, Germany;
* DevBoost GmbH - Berlin, Germany
* - initial API and implementation
******************************************************************************/
package org.reuseware.coconut.description.browse;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Observable;
import java.util.Set;
import org.eclipse.emf.common.util.EList;
import org.reuseware.coconut.description.BrowserState;
import org.reuseware.coconut.description.DescriptionFactory;
import org.reuseware.coconut.description.Facet;
import org.reuseware.coconut.description.FacetType;
import org.reuseware.coconut.description.FacetTypeDecorator;
import org.reuseware.coconut.description.browse.util.DynamicDecorationManager;
import org.reuseware.coconut.description.browse.views.BrowserStateListener;
import org.reuseware.coconut.description.classify.DescriptionManager;
import org.reuseware.coconut.description.classify.FacetManager;
import org.reuseware.coconut.repository.ID;
import org.reuseware.coconut.repository.resource.ReuseResources;
public class BrowserStateManager extends Observable {
private BrowserState state;
public BrowserStateManager() {
iniBrowserState();
ReuseResources.INSTANCE.getRootPackage().eAdapters().add(new BrowserStateListener(this));
}
private void iniBrowserState() {
// create new instance of BrowserState
state = DescriptionFactory.eINSTANCE.createBrowserState();
// set 'filtered' content to all FragmentDescription in the store
state.getFilteredContent().addAll(DescriptionManager.getRegisteredDescriptions());
// set presented and additional facets
updateFacets();
}
public BrowserState getState() {
return state;
}
public void setState(BrowserState state) {
this.state = state;
refreshPresentedFacets();
setChanged();
notifyObservers(state);
}
public void setState(BrowserState state, boolean lazy) {
if (!lazy)
setState(state);
else
this.state = state;
refreshPresentedFacets();
}
public void restart() {
iniBrowserState();
setState(state);
// setChanged();
// notifyObservers(state);
// this.addObserver(null);
}
public BrowserState updateFacets() {
Set<FacetType> types = FacetManager.getRegisteredTypes();
List<FacetTypeDecorator> decors = new LinkedList<FacetTypeDecorator>();
List<FacetTypeDecorator> decorsToShow = new LinkedList<FacetTypeDecorator>();
state.getAdditionalFacets().clear();
state.getPresentedFacets().clear();
// create decorators for each FacetType
for (FacetType facetType : types)
decors.add(DynamicDecorationManager.buildFacetTypeDecorator(facetType));
// fill list of presented facets
int viewCounter = MainBrowserManager.FACET_VIEW_NUMBER;
Iterator<FacetTypeDecorator> it = decors.iterator();
while (viewCounter > 0 && it.hasNext()) {
FacetTypeDecorator decor = it.next();
state.getPresentedFacets().add(decor);
decorsToShow.add(decor);
viewCounter--;
}
decors.removeAll(decorsToShow);
// rest goes into the list of additional facets
state.getAdditionalFacets().addAll(decors);
return state;
}
public FacetTypeDecorator getAdditionalFacetBy(ID facetTypeID) {
List<FacetTypeDecorator> tDecors = state.getAdditionalFacets();
return findDecorIn(tDecors, facetTypeID);
}
public FacetTypeDecorator getDecoratorBy(ID facetTypeID) {
// fill list with all registered decorators in the state
List<FacetTypeDecorator> tDecors = new LinkedList<FacetTypeDecorator>();
tDecors.addAll(state.getAdditionalFacets());
tDecors.addAll(state.getPresentedFacets());
for (Facet selectedFacet : state.getSelectedFacets()) {
tDecors.add(DynamicDecorationManager.buildFacetTypeDecorator(selectedFacet.getType()));
}
return findDecorIn(tDecors, facetTypeID);
}
private FacetTypeDecorator findDecorIn(List<FacetTypeDecorator> tDecors,
ID facetTypeID) {
FacetType fType = FacetManager.getTypeByID(facetTypeID);
for (FacetTypeDecorator tDecor : tDecors) {
if (tDecor.getDecoratee().equals(fType))
return tDecor;
}
return null;
}
private void refreshPresentedFacets() {
// there are enough facets presented
EList<FacetTypeDecorator> presented = state.getPresentedFacets();
int facetNumber = MainBrowserManager.FACET_VIEW_NUMBER;
if (presented.size() >= facetNumber)
return;
// there are no more additional facets
EList<FacetTypeDecorator> additionals = state.getAdditionalFacets();
if (additionals.size() < 1)
return;
// move some facets form additional to presented
for (int i = presented.size(); i < facetNumber; i++) {
// perform move
presented.add(additionals.remove(0));
// stop if there are no additional facets
if (additionals.size() < 1)
break;
}
}
}