/*******************************************************************************
* 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.Collections;
import java.util.List;
import java.util.Observer;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.Perspective;
import org.eclipse.ui.internal.WorkbenchPage;
import org.reuseware.coconut.description.BrowserState;
import org.reuseware.coconut.description.Facet;
import org.reuseware.coconut.description.FacetTypeDecorator;
import org.reuseware.coconut.description.FacetValue;
import org.reuseware.coconut.description.FragmentDescription;
import org.reuseware.coconut.description.browse.util.DynamicDecorationManager;
import org.reuseware.coconut.description.browse.views.AbstractBrowserView;
import org.reuseware.coconut.description.browse.views.BrowserPerspectiveFactory;
import org.reuseware.coconut.description.browse.views.FacetViewsController;
import org.reuseware.coconut.description.classify.DescriptionManager;
import org.reuseware.coconut.repository.ID;
import org.reuseware.coconut.repository.RepositoryFactory;
import org.reuseware.coconut.ui.eclipse.resource.WorkspaceFragmentStoreManager;
@SuppressWarnings("restriction")
public class MainBrowserManager {
public final static int FACET_VIEW_NUMBER = 6;
private static MainBrowserManager instance;
private BrowserStateManager browserStateManager;
private FacetViewsController facetViewsController;
private IWorkbenchWindow myWindow;
private BrowserListener listener;
private Facet transientFacet;
private MainBrowserManager() {
// TODO hack to start coconut plug-in which fills the fragment store
WorkspaceFragmentStoreManager.isFragment(null);
browserStateManager = new BrowserStateManager();
myWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
listener = new BrowserListener(this, true);
myWindow.addPerspectiveListener(listener);
}
public static MainBrowserManager getInstance() {
if (instance == null)
instance = new MainBrowserManager();
return instance;
}
public BrowserStateManager getBrowserStateManager() {
return browserStateManager;
}
public void addStateObserver(Observer observer) {
System.out.println();
System.out.println("ADD");
System.out.println(observer);
System.out.println("vorher: " + browserStateManager.countObservers());
browserStateManager.addObserver(observer);
System.out.println("hinterher: " + browserStateManager.countObservers());
System.out.println();
}
public void removeStateObserver(Observer observer) {
System.out.println();
System.out.println("REMOVE");
System.out.println(observer);
System.out.println("vorher: " + browserStateManager.countObservers());
browserStateManager.deleteObserver(observer);
System.out.println("hinterher: " + browserStateManager.countObservers());
System.out.println();
}
private void makeSureAllViewsAreRegisteredAsObserver() {
IViewReference[] refs = myWindow.getActivePage().getViewReferences();
for (IViewReference ref : refs) {
if (ref.getPart(true) instanceof AbstractBrowserView) {
((AbstractBrowserView) ref.getPart(true)).register();
}
}
}
public void restart() {
// restart the BrowserState
browserStateManager.restart();
// clean all facet views
// System.out.println("CLEAN!");
facetViewsController.clean();
}
public void start() {
listener.setNewPerspective(false);
Runnable run = new Runnable() {
public void run() {
// create a new controller for the FacetView
removeStateObserver(facetViewsController);
facetViewsController = new FacetViewsController(browserStateManager);
addStateObserver(facetViewsController);
// make sure all views are registered as Observer with the
// BrowserStateManager
makeSureAllViewsAreRegisteredAsObserver();
// restart the BrowserState
browserStateManager.restart();
}
};
try {
PlatformUI.getWorkbench().getDisplay().asyncExec(run);
} catch (Exception e) {
e.printStackTrace();
}
}
public void isNewPerspective(boolean newPersp) {
listener.setNewPerspective(newPersp);
}
public boolean isBrowserPerspectivActive() {
WorkbenchPage page = (WorkbenchPage) myWindow.getActivePage();
Perspective persp = page.getActivePerspective();
return persp.getDesc().getId().equals(BrowserPerspectiveFactory.PERSPECTIVE_ID);
}
public void openFacetViewFor(FacetTypeDecorator tDecor) {
if (isBrowserPerspectivActive()) {
DynamicDecorationManager.refresh(tDecor);
facetViewsController.openFacetViewFor(tDecor);
}
}
public void openFacetViewFor(Facet facet) {
if (isBrowserPerspectivActive()) {
// store the selection to show in next opend view
setTransientFacet(facet);
// calculate the right decorator
ID typeID = RepositoryFactory.eINSTANCE.createID();
typeID.getSegments().addAll(facet.getTypeID());
FacetTypeDecorator tDecor = browserStateManager.getDecoratorBy(typeID);
tDecor.setSelection(facet);
BrowserState state = browserStateManager.getState();
state.getSelectedFacets().remove(facet);
EList<FragmentDescription> oldContent = new BasicEList<FragmentDescription>();
oldContent.addAll(state.getFilteredContent());
List<FacetValue> noValues = Collections.emptyList();
Facet empty = DescriptionManager.buildFacet(facet.getType(), noValues);
state = DynamicDecorationManager.getZoomLister().zoomContent(state, empty);
DynamicDecorationManager.refresh(tDecor);
state.getFilteredContent().clear();
state.getFilteredContent().addAll(oldContent);
// open new view
facetViewsController.openFacetViewFor(tDecor);
}
}
public void setTransientFacet(Facet facet) {
this.transientFacet = facet;
}
public Facet pullTransientFacet() {
Facet back = transientFacet;
transientFacet = null;
return back;
}
public void resetInstance() {
System.out.println("**************** Kill!!!");
// remove all listeners
myWindow.removePerspectiveListener(listener);
if (facetViewsController != null)
facetViewsController.unregisterListeners();
// browserStateManager.deleteObservers();
// set the singleton instance to null
instance = null;
}
public FacetTypeDecorator update(FacetTypeDecorator tDecor) {
BrowserState state = browserStateManager.getState();
return DynamicDecorationManager.getZoomLister().calcValueCounts(tDecor, state);
}
}