/******************************************************************************* * 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.ui.views; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.jface.action.Action; import org.eclipse.jface.resource.ImageDescriptor; import org.reuseware.coconut.compositionprogram.DerivedCompositionProgram; import org.reuseware.coconut.compositionprogram.PhysicalCompositionProgram; import org.reuseware.coconut.fragment.Fragment; import org.reuseware.coconut.fragment.FragmentPackage; import org.reuseware.coconut.fragment.PhysicalFragment; import org.reuseware.coconut.fragment.provider.FragmentItemProviderAdapterFactory; import org.reuseware.coconut.fragment.provider.PhysicalFragmentItemProvider; import org.reuseware.coconut.reuseextensionactivator.ReuseextensionactivatorPackage; import org.reuseware.coconut.ui.CoCoNutUIPlugin; import org.reuseware.coconut.ui.internal.actions.OpenCompositionProgramAction; import org.reuseware.coconut.ui.internal.actions.OpenDiagramAction; import org.reuseware.coconut.ui.internal.actions.RenameAction; import org.reuseware.coconut.ui.internal.actions.ReuseAction; import org.reuseware.sokan.index.util.ResourceUtil; import org.reuseware.sokan.ui.model.sokanui.provider.PackageItemProvider; import org.reuseware.sokan.ui.model.sokanui.provider.SokanuiItemProviderAdapterFactory; import org.reuseware.sokan.ui.views.BasicRepositoryView; /** * A specialized repository view that shows the composition interface * of fragments (i.e., models) instead of their content. It is indended to * be used by composition system users and therefore filters * out composition system specifications (Fracol and Rex files). */ public class FragmentRepositoryView extends BasicRepositoryView { private ReuseAction reuseAction = new ReuseAction(this); private OpenDiagramAction openDiagramAction = new OpenDiagramAction(this); private OpenCompositionProgramAction openCompositionProgramAction = new OpenCompositionProgramAction(this); private RenameAction renameAction = new RenameAction(this); /** * Constructor of this view. */ public FragmentRepositoryView() { getAdapterFactory().addAdapterFactory(new SokanuiItemProviderAdapterFactory() { private ImageDescriptor packageImage = null; @Override public Adapter createPackageAdapter() { if (packageItemProvider == null) { packageItemProvider = new PackageItemProvider(this) { public Object getImage(Object object) { if (packageImage == null) { URL url = CoCoNutUIPlugin.getDefault().getBundle().getResource( "icons/Package.gif"); packageImage = ImageDescriptor.createFromURL(url); } return packageImage; }; }; } return packageItemProvider; } }); getAdapterFactory().addAdapterFactory(new FragmentItemProviderAdapterFactory() { private ImageDescriptor compositionProgramImage = null; private ImageDescriptor derivedCompositionProgramImage = null; @Override public Adapter createPhysicalFragmentAdapter() { if (physicalFragmentItemProvider == null) { physicalFragmentItemProvider = new PhysicalFragmentItemProvider(this) { public Object getImage(Object object) { if (compositionProgramImage == null) { URL url = CoCoNutUIPlugin.getDefault().getBundle().getResource( "icons/CompositionProgram.gif"); compositionProgramImage = ImageDescriptor.createFromURL(url); url = CoCoNutUIPlugin.getDefault().getBundle().getResource( "icons/DerivedCompositionProgram.gif"); derivedCompositionProgramImage = ImageDescriptor.createFromURL(url); } Fragment fragment = (Fragment) object; URI uri = ResourceUtil.uriFrom(ResourceUtil.idFrom(fragment.getUFI())); if (uri != null && "ucl".equals(uri.fileExtension()) && fragment.getContents().size() == 1) { if (fragment.getContents().get(0) instanceof PhysicalCompositionProgram) { return compositionProgramImage; } if (fragment.getContents().get(0) instanceof DerivedCompositionProgram) { return derivedCompositionProgramImage; } } return super.getImage(object); }; }; } return physicalFragmentItemProvider; } }); } @Override protected List<Action> getAdditionalActions() { List<Action> actions = new ArrayList<Action>(); actions.add(openDiagramAction); actions.add(openCompositionProgramAction); actions.add(reuseAction); actions.add(renameAction); return actions; } @Override protected boolean canHandle(Action additinalAction, EObject element) { if (additinalAction == openDiagramAction) { return openDiagramAction.hasDiagrams(element); } if (additinalAction == openCompositionProgramAction) { return openCompositionProgramAction.getComposingCompositionProgramRow(element) != null; } if (additinalAction == reuseAction) { return reuseAction.getActiveCompositionProgramEditor() != null; } if (additinalAction == renameAction) { if (element instanceof PhysicalFragment) { Fragment fragment = (Fragment) element; URI uri = ResourceUtil.uriFrom(ResourceUtil.idFrom(fragment.getUFI())); if (uri != null && "ucl".equals(uri.fileExtension()) && fragment.getContents().size() == 1) { if (fragment.getContents().get(0) instanceof DerivedCompositionProgram) { return false; } } return true; } return false; } return true; } @Override protected Action getDoubleClickAction() { return openDiagramAction; } private List<EClass> visibleTypes = null; @Override protected List<EClass> getVisibleTypes() { if (visibleTypes == null) { visibleTypes = new ArrayList<EClass>(); visibleTypes.add( FragmentPackage.Literals.FRAGMENT); visibleTypes.add( ReuseextensionactivatorPackage.Literals.REUSE_EXTENSION_ACTIVATOR_LIST); } return visibleTypes; } @Override public URI getURIForElement(EObject element) { EObject root = EcoreUtil.getRootContainer(element); if (root instanceof Fragment) { Fragment fragment = (Fragment) root; return ResourceUtil.uriFrom(ResourceUtil.idFrom(fragment.getUFI())); } return super.getURIForElement(element); } }