Select Git revision
YoshikoCluster.java
-
Philipp Spohr authoredPhilipp Spohr authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
YoshikoCluster.java 5.61 KiB
/*******************************************************************************
* Copyright (C) 2017 Philipp Spohr
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
******************************************************************************/
package de.hhu.ba.yoshikoWrapper.graphModel;
import java.awt.Image;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import org.cytoscape.model.CyEdge;
import org.cytoscape.model.CyNetwork;
import org.cytoscape.model.CyNode;
import org.cytoscape.model.CyRow;
import org.cytoscape.model.subnetwork.CyRootNetwork;
import org.cytoscape.model.subnetwork.CySubNetwork;
import org.cytoscape.view.layout.CyLayoutAlgorithm;
import org.cytoscape.view.model.CyNetworkView;
import org.cytoscape.view.presentation.RenderingEngine;
import org.cytoscape.view.vizmap.VisualStyle;
import org.cytoscape.work.Task;
import org.cytoscape.work.TaskIterator;
import org.cytoscape.work.TaskMonitor;
import de.hhu.ba.yoshikoWrapper.core.CyCore;
import de.hhu.ba.yoshikoWrapper.core.LocalizationManager;
import static org.cytoscape.view.presentation.property.BasicVisualLexicon.NETWORK_HEIGHT;
import static org.cytoscape.view.presentation.property.BasicVisualLexicon.NETWORK_WIDTH;
public class YoshikoCluster {
private final long id;
private ArrayList<CyNode> nodes;
private CySubNetwork net;
//SYMBOLIC LINKS
private final CyNetwork originalGraph;
public YoshikoCluster(long id, CyNetwork originalGraph) {
this.id = id;
this.originalGraph = originalGraph;
this.nodes = new ArrayList<CyNode>();
}
private void createSubNetwork() {
CyRootNetwork originalGraphAsRoot = CyCore.rootNetworkManager.getRootNetwork(originalGraph);
//Create nested graph and cluster subnet
ArrayList<CyEdge> inducedEdges = new ArrayList<CyEdge>();
for (CyNode n: nodes) {
//Sadly Cytoscape doesnt provide a comfort function here
List<CyEdge> adjacentEdges = originalGraph.getAdjacentEdgeList(n, CyEdge.Type.ANY);
for (CyEdge e: adjacentEdges) {
if (nodes.contains(e.getSource()) && nodes.contains(e.getTarget())) {
inducedEdges.add(e);
}
}
}
CySubNetwork subnet = originalGraphAsRoot.addSubNetwork(nodes ,inducedEdges);
subnet.getRow(subnet).set(CyNetwork.NAME, LocalizationManager.get("cluster")+" "+(id+1));
net = subnet; //Save for further reference
}
public void select() {
List<CyRow> allRows = originalGraph.getDefaultNodeTable().getAllRows();
for (CyRow r: allRows) {
r.set("selected", false);
}
//Select nodes corresponding to the cluster
for (CyNode n : nodes) {
originalGraph.getRow(n).set("selected", true);
}
}
public void generateImage(JLabel label, int width, int height) {
if (net == null) {
createSubNetwork();
}
CyNetworkView view = CyCore.networkViewFactory.createNetworkView(net);
//layout cluster
CyLayoutAlgorithm layout = CyCore.layoutAlgorithmManager.getDefaultLayout();
TaskIterator createLayout = layout.createTaskIterator(
view,
layout.getDefaultLayoutContext(),
CyLayoutAlgorithm.ALL_NODE_VIEWS,
null
);
createLayout.append(
new Task() {
@Override
public void run(TaskMonitor taskMonitor) throws Exception {
taskMonitor.setStatusMessage("Generating cluster view for C:"+id);
VisualStyle vs= CyCore.visualStyleFactory.createVisualStyle(CyCore.visualMappingManager.getCurrentVisualStyle());
CyCore.visualMappingManager.setVisualStyle(vs, view);
vs.apply(view);
view.setVisualProperty(NETWORK_WIDTH, new Double(width));
view.setVisualProperty(NETWORK_HEIGHT, new Double(height));
view.fitContent();
view.updateView();
RenderingEngine<CyNetwork> renderingEngine = CyCore.renderingEngineFactory.createRenderingEngine(label, view);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Image img = renderingEngine.createImage(width,height);
label.setIcon(new ImageIcon(img));
renderingEngine.dispose();
view.dispose();
}
});
}
@Override
public void cancel() {
// TODO Auto-generated method stub
}
}
);
CyCore.dialogTaskManager.execute(
createLayout
);
}
public int getSize() {
return nodes.size();
}
public long getID() {
return id;
}
public CySubNetwork getSubNetwork() {
if (net == null) {
createSubNetwork();
}
return net;
}
public void addNode(CyNode node) {
nodes.add(node);
}
public String getNodeName(CyNode n) {
return originalGraph.getRow(n).get("name", String.class);
}
}