Monday, January 14, 2013

Recipes : linking EMF with CNF

How to link an EMF model instance with Common Navigator Framework: 

  • CNF overriding
  • CNF ContentBinding with EMF
  • Adding menu contribution (WIP)
  • Using TransactionalEditingDomain (WIP)

Adding a view

  • using org.eclipse.ui.views



<extension point="org.eclipse.ui.views">
   <category
         id="francky.newproject.categoryview"
         name="New Project">
   </category>
   <view
         allowMultiple="false"
         category="francky.newproject.categoryview"
         class="francky.newproject.NewNavigator"
         icon="icons/obj16/Project-nature.gif"
         id="francky.newproject.navigatorView"
         name="New Navigator"
         restorable="true">
   </view>
</extension>

the class extend CNF the navigator


public class NewNavigator extends CommonNavigator implements CommandStackListener {
//...
}

Define Content

  • defining content and filter


<!-- NAVIGATOR CONTENT-->
<extension point="org.eclipse.ui.navigator.navigatorContent">
   <navigatorContent
         activeByDefault="true"
         contentProvider="francky.newproject.providers.NewProjectContentProvider"
         icon="icons/obj16/Project-nature.gif"
         id="francky.newproject.navigatorContent"
         labelProvider="francky.newproject.providers.NewProjectLabelProvider"
         name="New project content"
         priority="normal">
      <triggerPoints>
            <and>
               <instanceof value="org.eclipse.core.resources.IResource">
               </instanceof>
               <test forcePluginActivation="true"
                     property="org.eclipse.core.resources.extension"
                     value="frk">
               </test>
            </and>
      </triggerPoints>
      <possibleChildren>
         <or>
          <instanceof value="org.eclipse.emf.ecore.resource.Resource"/>
         <instanceof value="org.eclipse.emf.ecore.EObject"/>  
         </or>
      </possibleChildren>
   </navigatorContent>
</extension>
<!-- CONTENT FILTER -->
<extension point="org.eclipse.ui.navigator.navigatorContent">
 <commonFilter
        activeByDefault="true"
        id="francky.newproject.filters.hideNonNewProject"
        name="Hide Non New Project"
        visibleInUI="true">
     <filterExpression>
     <and>
     <not>
      <adapt
          type="org.eclipse.core.resources.IProject">
          <test
              property="org.eclipse.core.resources.projectNature"
              value="francky.newproject.NewNature">
          </test>
      </adapt>
     </not>
     <not>
        <instanceof
               value="org.eclipse.core.resources.IFolder">
        </instanceof>
        </not>
        <not>
   <and>
    <instanceof value="org.eclipse.core.resources.IResource">
    </instanceof>
    <!-- EMF instance file extension is frk -->
    <test forcePluginActivation="true"
       property="org.eclipse.core.resources.extension"
       value="frk">
    </test>
   </and>
         </not>
         <not>
         <instanceof value="org.eclipse.emf.ecore.resource.Resource"/>
         </not>
         <not>
         <instanceof value="org.eclipse.emf.ecore.EObject"/>  
         </not>
      </and>
      </filterExpression>
   </commonFilter>
</extension>
<!-- REGISTER CONTENT AND FILTER-->
<extension point="org.eclipse.ui.navigator.viewer">
     <viewer
           viewerId="francky.newproject.navigatorView">
   </viewer>
   <viewerContentBinding viewerId="francky.newproject.navigatorView">
      <includes>
         <contentExtension pattern="org.eclipse.ui.navigator.resourceContent"/>
         <contentExtension pattern="org.eclipse.ui.navigator.resources.filters.*"/>
         <contentExtension pattern="francky.newproject.filters.*"/>
         <contentExtension pattern="francky.newproject.navigatorContent"/>
      </includes>
   </viewerContentBinding>
   <viewerActionBinding viewerId="francky.newproject.navigatorView">
      <includes>
         <actionExtension pattern="org.eclipse.ui.navigator.resources.*"/>
      </includes>
   </viewerActionBinding>
</extension>


Define content and label provider

  • Defining content provider using adapterFactories

public class NewAdapterFactory
{
    private static ComposedAdapterFactory NewAdapterFactory;

    public final static ComposedAdapterFactory getAdapterFactory()
    {
        if (NewAdapterFactory == null)
         NewAdapterFactory = new ComposedAdapterFactory(createFactoryList());
        return NewAdapterFactory;
    }

   
    public final static ArrayList<AdapterFactory> createFactoryList()
    {
        ArrayList<AdapterFactory> factories = new ArrayList<AdapterFactory>();
        factories.add(new ResourceItemProviderAdapterFactory());
        //Add your AAAItemProviderAdapterFactory here....
        factories.add(new InfratestItemProviderAdapterFactory());
        factories.add(new ReflectiveItemProviderAdapterFactory());
        return factories;
    }
}

Label provider



public class NewProjectLabelProvider extends AdapterFactoryLabelProvider {
 public NewProjectLabelProvider() {
  super(NewAdapterFactory.getAdapterFactory());
 }
 public Image getImage(Object element) {
  return super.getImage(element);
 }
 public String getText(Object element) {
  return super.getText(element);
 }
}


Content provider



public class NewProjectContentProvider extends
  AdapterFactoryContentProvider implements IResourceChangeListener,
  IResourceDeltaVisitor {
 private static ResourceSetImpl resourceSet = new ResourceSetImpl();

 public NewProjectContentProvider() {
  super(NewAdapterFactory.getAdapterFactory());
  ResourcesPlugin.getWorkspace().addResourceChangeListener(this,
    IResourceChangeEvent.POST_CHANGE);
 }
...

No comments:

Post a Comment