From 2fd07e680db477e9c6fc8d7348ee29aeb6937e48 Mon Sep 17 00:00:00 2001 From: ermismd Date: Thu, 7 Sep 2023 21:59:44 +0200 Subject: [PATCH] added cytopanel and showresults panel --- .../mgG/internal/model/MGGManager.java | 31 +++ .../mgG/internal/tasks/ImportFileTask.java | 16 +- .../internal/tasks/ShowResultsPanelTask.java | 72 ++++++ .../tasks/ShowResultsPanelTaskFactory.java | 58 +++++ .../mgG/internal/view/AbstractMggPanel.java | 133 +++++++++++ .../kuleuven/mgG/internal/view/EasyGBC.java | 134 +++++++++++ .../mgG/internal/view/JsonResultPanel.java | 161 +++++++++++++ .../mgG/internal/view/MGGCytoPanel.java | 63 +++-- .../mgG/internal/view/MGGEdgePanel.java | 220 ++++++++++++++++++ 9 files changed, 863 insertions(+), 25 deletions(-) create mode 100644 src/main/java/be/kuleuven/mgG/internal/tasks/ShowResultsPanelTask.java create mode 100644 src/main/java/be/kuleuven/mgG/internal/tasks/ShowResultsPanelTaskFactory.java create mode 100644 src/main/java/be/kuleuven/mgG/internal/view/AbstractMggPanel.java create mode 100644 src/main/java/be/kuleuven/mgG/internal/view/EasyGBC.java create mode 100644 src/main/java/be/kuleuven/mgG/internal/view/JsonResultPanel.java create mode 100644 src/main/java/be/kuleuven/mgG/internal/view/MGGEdgePanel.java diff --git a/src/main/java/be/kuleuven/mgG/internal/model/MGGManager.java b/src/main/java/be/kuleuven/mgG/internal/model/MGGManager.java index 05a3332..3ae94bb 100644 --- a/src/main/java/be/kuleuven/mgG/internal/model/MGGManager.java +++ b/src/main/java/be/kuleuven/mgG/internal/model/MGGManager.java @@ -50,6 +50,7 @@ import org.cytoscape.session.events.SessionAboutToBeSavedListener; import org.cytoscape.session.events.SessionLoadedEvent; import org.cytoscape.session.events.SessionLoadedListener; +import org.cytoscape.view.model.CyNetworkView; import org.cytoscape.work.SynchronousTaskManager; import org.cytoscape.work.Task; import org.cytoscape.work.TaskFactory; @@ -74,6 +75,12 @@ public class MGGManager implements SessionAboutToBeSavedListener, SessionLoadedL public final static String APP_NAME = "be.kuleuven.mgG"; public final static String SERVER_RESPONSE_FILE = "Response.json"; + //----------------------------------------------------------- + final CommandExecutorTaskFactory commandExecutorTaskFactory; + final SynchronousTaskManager synchronousTaskManager; + final TaskManager dialogTaskManager; + + //---------------------------------------------------------------- final TaskManager taskManager; final SynchronousTaskManager syncTaskManager; @@ -114,6 +121,9 @@ public MGGManager(final CyServiceRegistrar cyRegistrar) { cyRegistrar.registerService(this, SessionAboutToBeSavedListener.class, new Properties()); cyRegistrar.registerService(this, SessionLoadedListener.class, new Properties()); + synchronousTaskManager = cyRegistrar.getService(SynchronousTaskManager.class); + commandExecutorTaskFactory = cyRegistrar.getService(CommandExecutorTaskFactory.class); + dialogTaskManager = cyRegistrar.getService(TaskManager.class); //MGGicon = new ImageIcon(getClass().getResource("/images/scNetViz.png")); } @@ -177,6 +187,27 @@ public CyNetwork getCurrentNetwork() { //------------------------------------------------SErvice Register and execute Tasks----------------------------------------------------------------------------------------------- + + + + public void executeCommand(String namespace, String command, + Map args, TaskObserver observer) { +TaskIterator ti = commandExecutorTaskFactory.createTaskIterator(namespace, command, args, observer); +execute(ti, true); +} + + public void execute(TaskIterator iterator, boolean synchronous) { + if (synchronous) { + synchronousTaskManager.execute(iterator); + } else { + dialogTaskManager.execute(iterator); + } + } + + public CyNetworkView getCurrentNetworkView() { + return cyRegistrar.getService(CyApplicationManager.class).getCurrentNetworkView(); + } + /** * Executes a set of tasks. * This method is used to execute a set of tasks using the task manager. diff --git a/src/main/java/be/kuleuven/mgG/internal/tasks/ImportFileTask.java b/src/main/java/be/kuleuven/mgG/internal/tasks/ImportFileTask.java index c51ff2b..49a108d 100644 --- a/src/main/java/be/kuleuven/mgG/internal/tasks/ImportFileTask.java +++ b/src/main/java/be/kuleuven/mgG/internal/tasks/ImportFileTask.java @@ -39,6 +39,7 @@ import be.kuleuven.mgG.internal.utils.CSVReader; import be.kuleuven.mgG.internal.utils.HTTPUtils; import be.kuleuven.mgG.internal.view.JSONDisplayPanel; +import be.kuleuven.mgG.internal.view.JsonResultPanel; @@ -245,14 +246,15 @@ public void run(TaskMonitor taskMonitor) { private void showDataInPanel(JSONObject jsonObject) { - JSONDisplayPanel panel = new JSONDisplayPanel(mggManager, jsonObject); - + //JSONDisplayPanel panel = new JSONDisplayPanel(mggManager, jsonObject); + JsonResultPanel panel = new JsonResultPanel(mggManager, jsonObject); + mggManager.registerService(panel, CytoPanelComponent.class, new Properties()); - JFrame frame = new JFrame("OTU/ASV Data"); - frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - frame.getContentPane().add(panel); - frame.pack(); - frame.setVisible(true); + /* + * JFrame frame = new JFrame("OTU/ASV Data"); + * frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + * frame.getContentPane().add(panel); frame.pack(); frame.setVisible(true); + */ } diff --git a/src/main/java/be/kuleuven/mgG/internal/tasks/ShowResultsPanelTask.java b/src/main/java/be/kuleuven/mgG/internal/tasks/ShowResultsPanelTask.java new file mode 100644 index 0000000..7db6573 --- /dev/null +++ b/src/main/java/be/kuleuven/mgG/internal/tasks/ShowResultsPanelTask.java @@ -0,0 +1,72 @@ +package be.kuleuven.mgG.internal.tasks; + +import java.awt.Component; +import java.util.Properties; + +import org.cytoscape.application.swing.CySwingApplication; +import org.cytoscape.application.swing.CytoPanel; +import org.cytoscape.application.swing.CytoPanelComponent; +import org.cytoscape.application.swing.CytoPanelComponent2; +import org.cytoscape.application.swing.CytoPanelName; +import org.cytoscape.application.swing.CytoPanelState; +import org.cytoscape.model.events.RowsSetListener; +import org.cytoscape.work.AbstractTask; +import org.cytoscape.work.ProvidesTitle; +import org.cytoscape.work.TaskMonitor; + +import be.kuleuven.mgG.internal.model.MGGManager; +import be.kuleuven.mgG.internal.view.MGGCytoPanel; + + + +public class ShowResultsPanelTask extends AbstractTask { + final MGGManager manager; + final ShowResultsPanelTaskFactory factory; + final boolean show; + + public ShowResultsPanelTask(final MGGManager manager, + final ShowResultsPanelTaskFactory factory, boolean show) { + this.manager = manager; + this.factory = factory; + this.show = show; + } + + public void run(TaskMonitor monitor) { + monitor.setTitle("Show/hide results panel"); + + CySwingApplication swingApplication = manager.getService(CySwingApplication.class); + CytoPanel cytoPanel = swingApplication.getCytoPanel(CytoPanelName.EAST); + + // If the panel is not already registered, create it + if (cytoPanel.indexOfComponent("be.kuleuven.mgG.internal.MGG") < 0) { + CytoPanelComponent2 panel = new MGGCytoPanel(manager); + + // Register it + manager.registerService(panel, CytoPanelComponent.class, new Properties()); + + if (cytoPanel.getState() == CytoPanelState.HIDE) + cytoPanel.setState(CytoPanelState.DOCK); + + } else { + int compIndex = cytoPanel.indexOfComponent("be.kuleuven.mgG.internal.MGG"); + Component panel = cytoPanel.getComponentAt(compIndex); + if (panel instanceof CytoPanelComponent2) { + // Unregister it + manager.unregisterService(panel, CytoPanelComponent.class); + manager.setCytoPanel(null); + } + } + + // factory.reregister(); + } + + public static boolean isPanelRegistered(MGGManager manager) { + CySwingApplication swingApplication = manager.getService(CySwingApplication.class); + CytoPanel cytoPanel = swingApplication.getCytoPanel(CytoPanelName.EAST); + + if (cytoPanel.indexOfComponent("be.kuleuven.mgG.internal.MGG") >= 0) + return true; + + return false; + } +} diff --git a/src/main/java/be/kuleuven/mgG/internal/tasks/ShowResultsPanelTaskFactory.java b/src/main/java/be/kuleuven/mgG/internal/tasks/ShowResultsPanelTaskFactory.java new file mode 100644 index 0000000..17903d4 --- /dev/null +++ b/src/main/java/be/kuleuven/mgG/internal/tasks/ShowResultsPanelTaskFactory.java @@ -0,0 +1,58 @@ +package be.kuleuven.mgG.internal.tasks; + +import java.util.Properties; + +import static org.cytoscape.work.ServiceProperties.COMMAND; +import static org.cytoscape.work.ServiceProperties.COMMAND_DESCRIPTION; +import static org.cytoscape.work.ServiceProperties.COMMAND_NAMESPACE; +import static org.cytoscape.work.ServiceProperties.ENABLE_FOR; +import static org.cytoscape.work.ServiceProperties.INSERT_SEPARATOR_BEFORE; +import static org.cytoscape.work.ServiceProperties.IN_MENU_BAR; +import static org.cytoscape.work.ServiceProperties.MENU_GRAVITY; +import static org.cytoscape.work.ServiceProperties.PREFERRED_MENU; +import static org.cytoscape.work.ServiceProperties.TITLE; + +import org.cytoscape.model.CyNetwork; +import org.cytoscape.view.model.CyNetworkView; +import org.cytoscape.work.AbstractTaskFactory; +import org.cytoscape.work.TaskFactory; +import org.cytoscape.work.TaskIterator; + +import be.kuleuven.mgG.internal.model.MGGManager; + + +public class ShowResultsPanelTaskFactory extends AbstractTaskFactory { + final MGGManager manager; + boolean show = false; + + public ShowResultsPanelTaskFactory(final MGGManager manager) { + this.manager = manager; + } + + public TaskIterator createTaskIterator() { + return new TaskIterator(new ShowResultsPanelTask(manager, this, show)); + } + + + public boolean isReady() { + // We always want to be able to shut it off + if (!show) return true; + + CyNetwork net = manager.getCurrentNetwork(); + if (net == null) return false; + + //* Check for the existence of the 'flashweave-score' column in the edge table + boolean hasFlashweaveScore = net.getRow(net).get("flashweave-score",Double.class) != null; + + // Implement other checks if necessary + // boolean hasIdColumn = net.getDefaultNodeTable().getColumn("@id") != null; + // boolean hasScoreColumn = net.getDefaultEdgeTable().getColumn("score") != null; + + //* Return true if the column exists, otherwise return false + return hasFlashweaveScore; + + + + } +} + diff --git a/src/main/java/be/kuleuven/mgG/internal/view/AbstractMggPanel.java b/src/main/java/be/kuleuven/mgG/internal/view/AbstractMggPanel.java new file mode 100644 index 0000000..12cb47a --- /dev/null +++ b/src/main/java/be/kuleuven/mgG/internal/view/AbstractMggPanel.java @@ -0,0 +1,133 @@ +package be.kuleuven.mgG.internal.view; + + + +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JSlider; +import javax.swing.JTextField; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import org.cytoscape.model.CyNetwork; +import org.cytoscape.util.swing.IconManager; +import org.cytoscape.util.swing.OpenBrowser; + +import be.kuleuven.mgG.internal.model.MGGManager; + + + +public abstract class AbstractMggPanel extends JPanel { + + protected final MGGManager manager; + protected final OpenBrowser openBrowser; + protected final Font iconFont; + protected final Font labelFont; + protected final Font textFont; + protected CyNetwork currentNetwork; + protected Map>> filters; + + public AbstractMggPanel(final MGGManager manager) { + this.manager = manager; + this.openBrowser = manager.getService(OpenBrowser.class); + this.currentNetwork = manager.getCurrentNetwork(); + IconManager iconManager = manager.getService(IconManager.class); + iconFont = iconManager.getIconFont(17.0f); + labelFont = new Font("SansSerif", Font.BOLD, 10); + textFont = new Font("SansSerif", Font.PLAIN, 10); + filters = new HashMap<>(); + filters.put(currentNetwork, new HashMap<>()); + } + + abstract void doFilter(String type); + + abstract void undoFilters(); + + abstract double initFilter(String type, String text); + + protected JComponent createFilterSlider(String type, String text, CyNetwork network, boolean labels, double max) { + double value = 0.0; + if (filters.containsKey(network) && + filters.get(network).containsKey(type) && + filters.get(network).get(type).containsKey(text)) { + value = filters.get(network).get(type).get(text); + // System.out.println("value = "+value); + } else { + value = initFilter(type, text); + } + Box box = Box.createHorizontalBox(); + if (labels) { + JLabel label = new JLabel(text); + label.setFont(labelFont); + label.setPreferredSize(new Dimension(100,20)); + box.add(Box.createRigidArea(new Dimension(10,0))); + box.add(label); + box.add(Box.createHorizontalGlue()); + } + JSlider slider; + slider = new JSlider(0,(int)max,(int)(value*100)); + slider.setToolTipText("Filter ranges between 0.0 and " + max/100); + slider.setPreferredSize(new Dimension(150,20)); + box.add(slider); + // box.add(Box.createHorizontalGlue()); + JTextField textField; + textField = new JTextField(String.format("%.2f",value),4); + textField.setPreferredSize(new Dimension(30,20)); + textField.setMaximumSize(new Dimension(30,20)); + textField.setFont(textFont); + box.add(textField); + // Hook it up + addChangeListeners(type, text, slider, textField, max); + box.setAlignmentX(Component.LEFT_ALIGNMENT); + return box; + } + + protected void addChangeListeners(String type, String label, JSlider slider, + JTextField textField, double max) { + slider.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) { + JSlider sl = (JSlider)e.getSource(); + int value = sl.getValue(); + double v = ((double)value)/100.0; + textField.setText(String.format("%.2f",v)); + addFilter(type, label, v); + doFilter(type); + } + }); + + textField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + JTextField field = (JTextField)e.getSource(); + String text = field.getText(); + slider.setValue((int)(Double.parseDouble(text)*100.0)); + } + }); + } + + protected void addFilter(String type, String label, double value) { + Map filter = filters.get(currentNetwork).get(type); + filter.put(label, value); + + if (value == 0) + filter.remove(label); + } + + protected void removeFilters(CyNetwork network) { + if (network != null && filters.containsKey(network)) + filters.remove(network); + } + +} diff --git a/src/main/java/be/kuleuven/mgG/internal/view/EasyGBC.java b/src/main/java/be/kuleuven/mgG/internal/view/EasyGBC.java new file mode 100644 index 0000000..d6493f0 --- /dev/null +++ b/src/main/java/be/kuleuven/mgG/internal/view/EasyGBC.java @@ -0,0 +1,134 @@ +// WikiPathways App for Cytoscape +// +// Copyright 2013-2014 WikiPathways +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package be.kuleuven.mgG.internal.view; + +import java.awt.GridBagConstraints; +import java.util.Map; +import java.util.HashMap; + +/** + * Uses the builder pattern for filling fields of a {@link GridBagConstraints}. + */ +public class EasyGBC extends GridBagConstraints { + static final Map anchors = new HashMap(); + static { + anchors.put("north", NORTH); + anchors.put("northwest", NORTHWEST); + anchors.put("northeast", NORTHEAST); + anchors.put("west", WEST); + anchors.put("south", SOUTH); + anchors.put("southwest", SOUTHWEST); + anchors.put("southeast", SOUTHEAST); + anchors.put("east", EAST); + } + + public EasyGBC() { + reset(); + } + + public EasyGBC reset() { + gridx = 0; gridy = 0; + gridwidth = 1; gridheight = 1; + weightx = 0.0; weighty = 0.0; + fill = GridBagConstraints.NONE; + insets.set(0, 0, 0, 0); + return this; + } + + public EasyGBC noExpand() { + weightx = 0.0; + weighty = 0.0; + fill = GridBagConstraints.NONE; + return this; + } + + public EasyGBC expandVert() { + weightx = 0.0; + weighty = 1.0; + fill = GridBagConstraints.VERTICAL; + return this; + } + + public EasyGBC expandHoriz() { + weightx = 1.0; + weighty = 0.0; + fill = GridBagConstraints.HORIZONTAL; + return this; + } + + public EasyGBC expandBoth() { + weightx = 1.0; + weighty = 1.0; + fill = GridBagConstraints.BOTH; + return this; + } + + public EasyGBC right() { + gridx++; + return this; + } + + public EasyGBC left() { + gridx--; + return this; + } + + public EasyGBC down() { + gridx = 0; + gridy++; + return this; + } + + public EasyGBC up() { + gridx = 0; + gridy--; + return this; + } + + public EasyGBC position(int x, int y) { + gridx = x; + gridy = y; + return this; + } + + public EasyGBC noSpan() { + gridwidth = 1; + gridheight = 1; + return this; + } + + public EasyGBC spanHoriz(int n) { + gridwidth = n; + gridheight = 1; + return this; + } + + public EasyGBC insets(int t, int l, int b, int r) { + insets.set(t, l, b, r); + return this; + } + + public EasyGBC noInsets() { + insets.set(0, 0, 0, 0); + return this; + } + + public EasyGBC anchor(String str) { + anchor = anchors.get(str); + return this; + } +} diff --git a/src/main/java/be/kuleuven/mgG/internal/view/JsonResultPanel.java b/src/main/java/be/kuleuven/mgG/internal/view/JsonResultPanel.java new file mode 100644 index 0000000..07743b2 --- /dev/null +++ b/src/main/java/be/kuleuven/mgG/internal/view/JsonResultPanel.java @@ -0,0 +1,161 @@ +package be.kuleuven.mgG.internal.view; + +import org.cytoscape.application.swing.CySwingApplication; +import org.cytoscape.application.swing.CytoPanel; +import org.cytoscape.application.swing.CytoPanelComponent; +import org.cytoscape.application.swing.CytoPanelName; +import org.cytoscape.application.swing.CytoPanelState; +import org.cytoscape.work.TaskIterator; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import be.kuleuven.mgG.internal.model.MGGManager; +import be.kuleuven.mgG.internal.tasks.SendDataToServerTaskFactory; +import be.kuleuven.mgG.internal.tasks.ShowResultsPanelTaskFactory; + +import javax.swing.BorderFactory; +import javax.swing.Icon; +import javax.swing.JButton; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Properties; + +public class JsonResultPanel extends JPanel implements CytoPanelComponent { + private JTable table; + final MGGManager manager; + private boolean registered = false; + + public JsonResultPanel(final MGGManager manager,JSONObject jsonObject) { + super(new BorderLayout()); + + + CySwingApplication swingApplication = manager.getService(CySwingApplication.class); + CytoPanel cytoPanel = swingApplication.getCytoPanel(CytoPanelName.EAST); + if (!registered) { + manager.registerService(this, CytoPanelComponent.class, new Properties()); + registered = true; + } + if (cytoPanel.getState() == CytoPanelState.HIDE) + cytoPanel.setState(CytoPanelState.DOCK); + + // Extract the JSONArray from the JSONObject + JSONArray jsonArray = (JSONArray) jsonObject.get("data"); + + createTable(jsonArray); + + JScrollPane scrollPane = new JScrollPane(table); + + this.manager = manager; + + // Set the scroll bar policies + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + + // Set the preferred size of the scroll pane + scrollPane.setPreferredSize(new Dimension(800, 600)); + + // Add the scroll pane to the center of the JSONDisplayPanel + add(scrollPane, BorderLayout.CENTER); + + + // Add the button that will execute the SendDataToServerTask when clicked + JButton sendButton = new JButton("Get Annotated Network "); + sendButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + + TaskIterator taskIterator = new SendDataToServerTaskFactory(jsonObject, manager).createTaskIterator(); + manager.executeTasks(taskIterator); + + //added this to start the factory for showResultsPaneltaskFactory + TaskIterator taskIterator1 = new ShowResultsPanelTaskFactory( manager).createTaskIterator(); + manager.executeTasks(taskIterator1); + } + + + }); + // Set button appearance + sendButton.setForeground(Color.BLACK); // Set the text color of the button + sendButton.setFont(sendButton.getFont().deriveFont(Font.BOLD, 14f)); // Set the font style and size of the button text + sendButton.setBackground(new Color(144, 238, 144)); // Set the background color of the button + sendButton.setFocusPainted(false); // Remove the focus border around the button + sendButton.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10)); // Add padding to the button + + // Create a rounded border for the button + int borderRadius = 20; + int borderThickness = 2; + sendButton.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createLineBorder(Color.WHITE, borderThickness), + BorderFactory.createEmptyBorder(borderRadius, borderRadius, borderRadius, borderRadius))); + + // Add hover effect for the button + sendButton.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseEntered(java.awt.event.MouseEvent evt) { + sendButton.setBackground(Color.GREEN); // Set the background color when mouse enters the button + } + + public void mouseExited(java.awt.event.MouseEvent evt) { + sendButton.setBackground(new Color(144, 238, 144)); // Set the background color when mouse exits the button + } + }); + + // Add the button to the JSONDisplayPanel + add(sendButton, BorderLayout.NORTH); + + } + + private void createTable(JSONArray jsonArray) { + DefaultTableModel tableModel = new DefaultTableModel(); + table = new JTable(tableModel); + + // Set the column names + JSONArray headers = (JSONArray) jsonArray.get(0); + for (Object header : headers) { + tableModel.addColumn(header.toString()); + } + + // Add the data to the table model + for (int i = 1; i < jsonArray.size(); i++) { + JSONArray row = (JSONArray) jsonArray.get(i); + Object[] rowData = new Object[row.size()]; + for (int j = 0; j < row.size(); j++) { + rowData[j] = row.get(j); + } + tableModel.addRow(rowData); + } + } + + public void hideCytoPanel() { + manager.unregisterService(this, CytoPanelComponent.class); + registered = false; + } + + @Override + public Component getComponent() { + return this; + } + + @Override + public CytoPanelName getCytoPanelName() { + return CytoPanelName.EAST; // Or where you would like to dock this panel + } + + @Override + public String getTitle() { + return "JSON Display"; + } + + @Override + public Icon getIcon() { + return null; // Optionally, return an Icon to be displayed + } +} \ No newline at end of file diff --git a/src/main/java/be/kuleuven/mgG/internal/view/MGGCytoPanel.java b/src/main/java/be/kuleuven/mgG/internal/view/MGGCytoPanel.java index fe2049a..1ae3519 100644 --- a/src/main/java/be/kuleuven/mgG/internal/view/MGGCytoPanel.java +++ b/src/main/java/be/kuleuven/mgG/internal/view/MGGCytoPanel.java @@ -6,7 +6,9 @@ import java.awt.Color; import java.awt.Component; import java.awt.Font; +import java.util.HashSet; import java.util.Properties; +import java.util.Set; import javax.swing.Icon; import javax.swing.JPanel; @@ -20,6 +22,7 @@ import org.cytoscape.application.swing.CytoPanelComponent2; import org.cytoscape.application.swing.CytoPanelName; import org.cytoscape.application.swing.CytoPanelState; +import org.cytoscape.model.CyEdge; import org.cytoscape.model.CyNetwork; import org.cytoscape.model.events.SelectedNodesAndEdgesEvent; import org.cytoscape.model.events.SelectedNodesAndEdgesListener; @@ -42,7 +45,7 @@ public class MGGCytoPanel extends JPanel implements CytoPanelComponent2, SetCu private JTabbedPane tabs; //private StringNodePanel nodePanel; - //private StringEdgePanel edgePanel; + private MGGEdgePanel edgePanel; private boolean registered = false; private static final Icon icon = new TextIcon(new String[] { "MGG" }, new Font[] { myFont }, MY_COLORS, 16, 16); @@ -52,8 +55,8 @@ public MGGCytoPanel(final MGGManager manager) { tabs = new JTabbedPane(JTabbedPane.BOTTOM); //nodePanel = new StringNodePanel(manager); //tabs.add("Nodes", nodePanel); - //edgePanel = new StringEdgePanel(manager); - //tabs.add("Edges", edgePanel); + edgePanel = new MGGEdgePanel(manager); + tabs.add("Edges", edgePanel); this.add(tabs, BorderLayout.CENTER); manager.setCytoPanel(this); manager.registerService(this, SetCurrentNetworkListener.class, new Properties()); @@ -77,7 +80,7 @@ public void showCytoPanel() { // Tell tabs //nodePanel.networkChanged(manager.getCurrentNetwork()); - //edgePanel.networkChanged(manager.getCurrentNetwork()); + edgePanel.networkChanged(manager.getCurrentNetwork()); } public void reinitCytoPanel() { @@ -95,9 +98,9 @@ public void reinitCytoPanel() { //nodePanel.removeFilters(current); //nodePanel.undoFilters(); //nodePanel.networkChanged(current); - //edgePanel.removeFilters(current); - //edgePanel.undoFilters(); - //edgePanel.networkChanged(current); + edgePanel.removeFilters(current); + edgePanel.undoFilters(); + edgePanel.networkChanged(current); } public void hideCytoPanel() { @@ -129,7 +132,7 @@ public String getTitle() { public void updateControls() { //nodePanel.updateControls(); - //edgePanel.updateScore(); + edgePanel.updateScore(); //edgePanel.updateSubPanel(); } @@ -139,19 +142,43 @@ public void handleEvent(SelectedNodesAndEdgesEvent event) { // Pass selected nodes to nodeTab //nodePanel.selectedNodes(event.getSelectedNodes()); // Pass selected edges to edgeTab - //edgePanel.selectedEdges(event.getSelectedEdges()); + edgePanel.selectedEdges(event.getSelectedEdges()); } @Override public void handleEvent(SetCurrentNetworkEvent event) { - /* - * CyNetwork network = event.getNetwork(); if - * (ModelUtils.ifHaveStringNS(network)) { if (!registered) { showCytoPanel(); } - * - * // Tell tabs //nodePanel.networkChanged(network); - * //edgePanel.networkChanged(network); } else { hideCytoPanel(); } - */ - } + CyNetwork network = event.getNetwork(); + + if (network == null) { + hideCytoPanel(); + return; + } + + // Check for the existence of the "flashweave-score" attribute on edges + boolean hasFlashweaveScore = network.getRow(network).get("flashweave-score",Double.class) != null; + + /* + * // Further checks can be added to see if the flashweave-scores are unique, + * different, etc. // For example: Set uniqueScores = new HashSet<>(); + * boolean hasDifferentScores = false; if (hasFlashweaveScore) { for (CyEdge + * edge : network.getEdgeList()) { Double score = + * network.getRow(edge).get("flashweave-score", Double.class); if (score != + * null) { if (uniqueScores.contains(score)) { hasDifferentScores = true; break; + * } uniqueScores.add(score); } } } + */ + + // Based on the above checks, decide whether to show the CytoPanel + if (hasFlashweaveScore) { + if (!registered) { + showCytoPanel(); + } + + // Inform the tabs + // nodePanel.networkChanged(network); + edgePanel.networkChanged(network); + } else { + hideCytoPanel(); + } -} +}} diff --git a/src/main/java/be/kuleuven/mgG/internal/view/MGGEdgePanel.java b/src/main/java/be/kuleuven/mgG/internal/view/MGGEdgePanel.java new file mode 100644 index 0000000..1e0cec9 --- /dev/null +++ b/src/main/java/be/kuleuven/mgG/internal/view/MGGEdgePanel.java @@ -0,0 +1,220 @@ +package be.kuleuven.mgG.internal.view; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JSlider; + +import org.cytoscape.model.CyEdge; +import org.cytoscape.model.CyNetwork; +import org.cytoscape.view.model.CyNetworkView; +import org.cytoscape.view.model.View; +import org.cytoscape.view.presentation.property.BasicVisualLexicon; + +import be.kuleuven.mgG.internal.model.MGGManager; + + + +public class MGGEdgePanel extends AbstractMggPanel { + + JButton fetchEdges; + JPanel subScorePanel; + JPanel scorePanel; + JButton deleteEdges; + private Map> colors; + private JSlider scoreSlider; + + public MGGEdgePanel(final MGGManager manager) { + super(manager); + filters.get(currentNetwork).put("flashweave-score", new HashMap<>()); + + colors = new HashMap<>(); + colors.put(currentNetwork, new HashMap<>()); + + init(); + revalidate(); + repaint(); + } + + private void init() { + setLayout(new GridBagLayout()); + { + EasyGBC c = new EasyGBC(); + + JComponent scoreSlider = createFilterSlider("flashweave-score", "flashweave-score", currentNetwork, true, 100.0); + { + scorePanel = new JPanel(); + scorePanel.setLayout(new GridBagLayout()); + EasyGBC d = new EasyGBC(); + scorePanel.add(scoreSlider, d.anchor("northwest").expandHoriz()); + + JPanel controlPanel = createControlPanel(); + controlPanel.setBorder(BorderFactory.createEmptyBorder(0,10,0,0)); + scorePanel.add(controlPanel, d.anchor("west").down().noExpand()); + } + add(scorePanel, c.down().anchor("west").expandHoriz()); + + /* + * { subScorePanel = new JPanel(); subScorePanel.setLayout(new GridBagLayout()); + * EasyGBC d = new EasyGBC(); subScorePanel.add(createSubScorePanel(), + * d.anchor("west").expandHoriz()); subScorePanel.add(new JPanel(), + * d.down().anchor("west").expandBoth()); } + * + * JScrollPane scrollPane = new JScrollPane(subScorePanel, + * JScrollPane.VERTICAL_SCROLLBAR_NEVER, + * JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + * + * add(scrollPane, c.down().anchor("west").expandBoth()); // add(new JPanel(), + * c.down().anchor("west").expandBoth()); + */ } + + } + + private JPanel createControlPanel() { + JPanel controlPanel = new JPanel(); + GridLayout layout = new GridLayout(2,2); + //layout.setVgap(0); + controlPanel.setLayout(layout); + { + fetchEdges = new JButton("Fetch extra edges"); + fetchEdges.setToolTipText("Decrease the network score to the chosen ."); + fetchEdges.setFont(labelFont); + fetchEdges.setEnabled(false); + controlPanel.add(fetchEdges); + fetchEdges.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (filters.containsKey(currentNetwork) + && filters.get(currentNetwork).containsKey("flashweave-score") + && filters.get(currentNetwork).get("flashweave-score").containsKey("flashweave-score")) { + Map args = new HashMap<>(); + args.put("network", "current"); + args.put("flashweave-score", String.valueOf(filters.get(currentNetwork).get("flashweave-score").get("flashweave-score").doubleValue())); + manager.executeCommand("string", "change flashweave-score", args, null); + fetchEdges.setEnabled(false); + } + } + }); + } + { + deleteEdges = new JButton("Delete hidden edges"); + deleteEdges.setToolTipText("Increase the network confidence to the chosen score."); + deleteEdges.setFont(labelFont); + deleteEdges.setEnabled(false); + controlPanel.add(deleteEdges); + deleteEdges.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + //ChangeConfidenceTaskFactory tf = new ChangeConfidenceTaskFactory(manager); + if (filters.containsKey(currentNetwork) + && filters.get(currentNetwork).containsKey("flashweave-score") + && filters.get(currentNetwork).get("flashweave-score").containsKey("flashweave-score")) { + Map args = new HashMap<>(); + args.put("network", "current"); + args.put("flashweave-score", String.valueOf(filters.get(currentNetwork).get("flashweave-score").get("flashweave-score").doubleValue())); + manager.executeCommand("string", "change flashweave-score", args, null); + deleteEdges.setEnabled(false); + } + } + }); + } + controlPanel.setAlignmentX(Component.LEFT_ALIGNMENT); + controlPanel.setMaximumSize(new Dimension(100,100)); + return controlPanel; + } + + void undoFilters() { + CyNetworkView view = manager.getCurrentNetworkView(); + if (view != null) { + for (View edge: view.getEdgeViews()) { + edge.clearValueLock(BasicVisualLexicon.EDGE_VISIBLE); + } + + } +} + + @Override + void doFilter(String type) { + if ("flashweave-score".equals(type)) { + CyNetworkView networkView = manager.getCurrentNetworkView(); + if (networkView != null) { + CyNetwork network = networkView.getModel(); + double minScore = (double) scoreSlider.getValue(); + + for (CyEdge edge : network.getEdgeList()) { + View edgeView = networkView.getEdgeView(edge); + + if (edgeView != null) { + Double edgeScore = network.getRow(edge).get("flashweave-score", Double.class); + + if (edgeScore != null && edgeScore < minScore) { + edgeView.setLockedValue(BasicVisualLexicon.EDGE_VISIBLE, false); + } else { + edgeView.setLockedValue(BasicVisualLexicon.EDGE_VISIBLE, true); + } + } + } + + networkView.updateView(); + } + } + + } + + @Override + double initFilter(String type, String text) { + if ("flashweave-score".equals(type)) { + try { + double initialScore = Double.parseDouble(text); + scoreSlider.setValue((int) initialScore); + doFilter("flashweave-score"); + return initialScore; + } catch (NumberFormatException e) { + // Handle invalid input + } + } + return 0; + } + + + public void updateScore() { + scorePanel.removeAll(); + EasyGBC d = new EasyGBC(); + JComponent scoreSlider = createFilterSlider("flashweave-score", "flashweave-score", currentNetwork, true, 100.0); + scorePanel.add(scoreSlider, d.anchor("northwest").expandHoriz()); + + JPanel controlPanel = createControlPanel(); + controlPanel.setBorder(BorderFactory.createEmptyBorder(0,10,0,0)); + scorePanel.add(controlPanel, d.anchor("west").down().noExpand()); + + } + + public void networkChanged(CyNetwork newNetwork) { + this.currentNetwork = newNetwork; + if (!filters.containsKey(currentNetwork)) { + filters.put(currentNetwork, new HashMap<>()); + filters.get(currentNetwork).put("flashweave-score", new HashMap<>()); + } + if (!colors.containsKey(currentNetwork)) { + colors.put(currentNetwork, new HashMap<>()); + } + + + updateScore(); + } + + public void selectedEdges(Collection edges) { + } + +}