Package org.gvt.action

Source Code of org.gvt.action.HighlightPathsBetweenSelectedAction$Runner

package org.gvt.action;


import org.eclipse.gef.EditPart;
import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.gvt.ChisioMain;
import org.gvt.inspector.ItemSelectionDialog;
import org.gvt.inspector.ItemSelectionRunnable;
import org.gvt.model.biopaxl2.BioPAXGraph;
import org.patika.mada.algorithm.AlgoRunner;
import org.patika.mada.graph.Node;
import org.patika.mada.util.Path;

import java.util.*;

/**
* @author Ozgun Babur
*
* Copyright: Bilkent Center for Bioinformatics, 2007 - present
*/
public class HighlightPathsBetweenSelectedAction extends Action
{
  private ChisioMain main;

  /**
   * Path ids to real paths.
   */
  private Map<String, Path> idMap;

  /**
   * Constructor
   */
  public HighlightPathsBetweenSelectedAction(ChisioMain main)
  {
    super("Highlight Paths Between Selected");
    setToolTipText(getText());
    this.main = main;
  }

  public void run()
  {
    if (main.getViewer() == null)
    {
      return;
    }

    BioPAXGraph graph = main.getPathwayGraph();

    if (graph == null)
    {
      MessageDialog.openError(main.getShell(), "Not applicable!",
        "This feature works only for process views.");

      return;
    }

    List<Node> selectedNodes = new ArrayList<Node>();

    ScrollingGraphicalViewer viewer = main.getViewer();

    if (viewer == null) return;

    // Iterates selected objects
    Iterator selectedObjects = ((IStructuredSelection) viewer.getSelection()).iterator();

    while (selectedObjects.hasNext())
    {
      Object model = ((EditPart)selectedObjects.next()).getModel();

      if (model instanceof Node)
      {
        selectedNodes.add((Node) model);
      }
    }

    // Prepare and run the algorithm

    int limit = 10;

    Map<Node, Map<Integer, List<Path>>> allMap =
      AlgoRunner.searchPathsBetween(graph, selectedNodes, limit);

    // Search the paths map for each target and
    // prepare the result paths to visualize

    List<String> pathIDs = new ArrayList<String>();
    idMap = new HashMap<String, Path>();

    for (Node target : allMap.keySet())
    {
      Map<Integer, List<Path>> pathsMap = allMap.get(target);

      if (pathsMap != null)
      {
        for (int i = 1; i <= limit; i++)
        {
          List<Path> pathList = pathsMap.get(i);

          if (pathList != null)
          {
            for (Path path : pathList)
            {
              String id = path.toString();

              if (pathIDs.contains(id))
              {
                int j = 2;
                String nextID;
                do
                {
                  nextID = id + " (" + (j++) + ")";
                }
                while (pathIDs.contains(nextID));
                id = nextID;
              }

              pathIDs.add(id);
              idMap.put(id, path);
            }
          }
        }
      }
    }

    if (!pathIDs.isEmpty())
    {
      // Open a dialog so that user selected the specific path to visualize

      ItemSelectionDialog dialog = new ItemSelectionDialog(main.getShell(),
        250,
        "Path Selection Dialog",
        "Select path to visualize",
        pathIDs, new ArrayList<String>(), false, false, new Runner());

      dialog.setUpdateUponSelection(true);
      String lastItem = dialog.open();

      // Below lines are responsible for clearing any highlighting after closing the dialog.
      // But we do not want it to disappear. So this is disabled.
//      if (!lastItem.equals(ItemSelectionDialog.NONE))
//      {
//        dialog.runAsIfSelected(ItemSelectionDialog.NONE);
//      }
    }
    else
    {
      MessageDialog.openInformation(main.getShell(), "No results!",
        "No directed paths found between selected nodes.");
    }
  }

  private class Runner implements ItemSelectionRunnable
  {
    private String lastID;

    public void run(Collection<String> selectedTerms)
    {
      if (selectedTerms.isEmpty())
      {
        return;
      }

      String id = selectedTerms.iterator().next();

      run(id);
    }

    public void run(String id)
    {
      if (id.equals(lastID))
      {
        return;
      }

      if (lastID != null)
      {
        idMap.get(lastID).highlight(false);
      }

      if (id.equals(ItemSelectionDialog.NONE))
      {
        lastID = null;
        return;
      }

      idMap.get(id).highlight(true);

      lastID = id;
    }
  }
}
TOP

Related Classes of org.gvt.action.HighlightPathsBetweenSelectedAction$Runner

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.