Package org.eclipse.sapphire.ui.diagram.actions

Source Code of org.eclipse.sapphire.ui.diagram.actions.DiagramDeleteActionHandler

/******************************************************************************
* Copyright (c) 2014 Oracle
* 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:
*    Shenxue Zhou - initial implementation and ongoing maintenance
*    Konstantin Komissarchik - [348811] Eliminate separate Sapphire.Diagram.Part.Delete action
*    Konstantin Komissarchik - [381794] Cleanup needed in presentation code for diagram context menu
******************************************************************************/

package org.eclipse.sapphire.ui.diagram.actions;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.sapphire.Element;
import org.eclipse.sapphire.ElementList;
import org.eclipse.sapphire.FilteredListener;
import org.eclipse.sapphire.ui.ISapphirePart;
import org.eclipse.sapphire.ui.Presentation;
import org.eclipse.sapphire.ui.SapphireAction;
import org.eclipse.sapphire.ui.SapphireActionHandler;
import org.eclipse.sapphire.ui.SapphireEditorPagePart.SelectionChangedEvent;
import org.eclipse.sapphire.ui.def.ActionHandlerDef;
import org.eclipse.sapphire.ui.diagram.ConnectionService;
import org.eclipse.sapphire.ui.diagram.DiagramConnectionPart;
import org.eclipse.sapphire.ui.diagram.editor.DiagramNodePart;
import org.eclipse.sapphire.ui.diagram.editor.SapphireDiagramEditorPagePart;
import org.eclipse.sapphire.ui.diagram.editor.ShapePart;

/**
* @author <a href="mailto:shenxue.zhou@oracle.com">Shenxue Zhou</a>
* @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
*/

public class DiagramDeleteActionHandler extends SapphireActionHandler
{
    @Override
    public void init( final SapphireAction action,
                      final ActionHandlerDef def )
    {
        super.init( action, def );
       
        final ISapphirePart part = getPart();
       
        if( part instanceof SapphireDiagramEditorPagePart )
        {
            ( (SapphireDiagramEditorPagePart) part ).attach
            (
                new FilteredListener<SelectionChangedEvent>()
                {
                    @Override
                    protected void handleTypedEvent( final SelectionChangedEvent event )
                    {
                        refreshEnablement();
                    }
                }
            );
        }
        
        refreshEnablement();
    }
   
    private void refreshEnablement()
    {
        final ISapphirePart part = getPart();
      boolean enabled = false;
     
      if( part instanceof DiagramNodePart || part instanceof ShapePart ||
          (part instanceof DiagramConnectionPart && ((DiagramConnectionPart)part).removable()))
      {
        enabled = true;
      }
      else
      {
        SapphireDiagramEditorPagePart diagramPart = part.nearest(SapphireDiagramEditorPagePart.class);
        List<ISapphirePart> selectedParts = diagramPart.getSelections();
        for (ISapphirePart selectedPart : selectedParts)
        {
          if (selectedPart instanceof DiagramNodePart || selectedPart instanceof ShapePart ||
              (selectedPart instanceof DiagramConnectionPart && ((DiagramConnectionPart)selectedPart).removable()))
          {
            enabled = true;
          }
        }
      }
     
      setEnabled( enabled );
    }
   
    @Override
    protected Object run(Presentation context)
    {
        ISapphirePart part = context.part();
        if (part instanceof DiagramConnectionPart)
        {
            DiagramConnectionPart connPart = (DiagramConnectionPart)part;
            connPart.remove();  
        }
        else if (part instanceof DiagramNodePart)
        {
            DiagramNodePart nodePart = (DiagramNodePart)part;
            deleteNode(nodePart);
        }
        else if (part instanceof ShapePart)
        {
            ShapePart shapePart = (ShapePart)part;
            deleteShapePart(shapePart);
        }
        else if (part instanceof SapphireDiagramEditorPagePart)
        {
          SapphireDiagramEditorPagePart pagePart = (SapphireDiagramEditorPagePart)part;
          List<ISapphirePart> parts = new ArrayList<ISapphirePart>();
          parts.addAll(pagePart.getSelections());
          for (ISapphirePart selectedPart : parts)
          {
            if (selectedPart instanceof DiagramConnectionPart)
            {
                    DiagramConnectionPart connPart = (DiagramConnectionPart)selectedPart;
                    connPart.remove();               
            }
                else if (selectedPart instanceof DiagramNodePart)
                {
                    DiagramNodePart nodePart = (DiagramNodePart)selectedPart;
                    deleteNode(nodePart);
                }
                else if (selectedPart instanceof ShapePart)
                {
                    ShapePart shapePart = (ShapePart)selectedPart;
                    deleteShapePart(shapePart);                 
                }
          }
        }
        return null;
    }

    private void deleteNodeConnections(DiagramNodePart nodePart)
    {
      Element nodeElement = nodePart.getLocalModelElement();
      SapphireDiagramEditorPagePart diagramPart = nodePart.getDiagramNodeTemplate().getDiagramEditorPart();
      ConnectionService connService = diagramPart.service(ConnectionService.class);
      for (DiagramConnectionPart connPart : connService.list())
      {
       if (connPart.removable() &&
           ((connPart.getEndpoint1() != null && connPart.getEndpoint1() == nodeElement) ||
               connPart.getEndpoint2() != null && connPart.getEndpoint2() == nodeElement))
       {
         connPart.remove();
       }
       
      }
    }
   
    private void deleteNode(DiagramNodePart nodePart)
    {
        // Need to remove connection parts that are associated with this node
        deleteNodeConnections(nodePart);
       
        nodePart.getDiagramNodeTemplate().deleteNode(nodePart);
    }
   
    private void deleteShapePart(ShapePart shapePart)
    {
      Element shapeModel = shapePart.getLocalModelElement();
      ElementList<?> list = (ElementList<?>) shapeModel.parent();
      if (!list.disposed())
      {
        list.remove(shapeModel);
      }
    }
}
TOP

Related Classes of org.eclipse.sapphire.ui.diagram.actions.DiagramDeleteActionHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.