// Medusa is a graph viewer which allows interactive editing of networks
// (edges and nodes) and also connects to databases.
//
// Copyright (C) 2006 Sean Hooper
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
// Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the
// Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330,
// Boston, MA 02111-1307 USA
package medusa;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JToggleButton;
import javax.swing.KeyStroke;
import javax.swing.border.Border;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.ProgressMonitor;
import javax.swing.Timer;
import java.awt.Cursor;
import java.util.Iterator;
import javax.swing.ButtonGroup;
import javax.swing.JRadioButton;
import medusa.dataio.DataLoader;
import medusa.display.EditableGraphPanel;
import medusa.georgios.Layouts.Layouts;
import medusa.graph.Graph;
import medusa.graph.Node;
import medusa.graphedit.EditGraphDialog;
import javax.swing.UIManager;
import javax.swing.UIManager.*;
/**
* The main holding and controlling frame for the graph displaying
* panels. For documentation on how to use Medusa, see the online
* manual {@link http://www.bork.embl.de/medusa}
* @author Sean Hooper
* @version 1.0
*/
public class MedusaFrame extends JFrame
implements
ItemListener,
ComponentListener,
ChangeListener {
// this class should not directly require StringletPanel...
// use reflection
public static EditableGraphPanel stringletPanel;
MedusaSettings stringSettings;
static final Color darkBackground = new Color(0.33f, 0.0f, 0.0f);
// static final Color foreground = new Color(1.0f, 1.0f, 1.0f);
static final Color foreground = new Color(0.0f, 0.0f, 0.0f);
public static final Color STRINGCOLOR = new Color(161, 173, 236);
Color background = STRINGCOLOR;
Border graphBorder = BorderFactory.createRaisedBevelBorder();
//scrollable panel
JScrollPane jScrollPane;
// a holder frame for dialogs etc
Frame f = new Frame();
// version number
public static final String version = "1.2";
public MedusaFrame() {
super("Medusa " + version);
//init();
}
protected void setScale(JSlider src) {
Dimension d = stringletPanel.getSize();
//Dimension d = jScrollPane.getSize();
double scale = (double) src.getValue() / 100;
stringletPanel.setScale(scale / oldScale);
//stringletPanel.setScale(scale);
stringletPanel.setTimeFrameXY(d);
oldScale = scale;
stringletPanel.repaint();
stringletPanel.revalidate();
}
protected void setScale(int scaleValue) {
Dimension d = stringletPanel.getSize();
//Dimension d = jScrollPane.getSize();
double scale = (double) scaleValue / 100;
stringletPanel.setScale(scale / oldScale);
//stringletPanel.setScale(scale);
stringletPanel.setTimeFrameXY(d);
oldScale = scale;
stringletPanel.repaint();
stringletPanel.revalidate();
}
/**
* Initializes the main panel
*/
private final void init() {
//setLnF();
stringSettings = new MedusaSettings();
//stringSettings.init();
stringletPanel = new EditableGraphPanel(stringSettings);
//Frame f = new Frame();
stringletPanel.setBasicEdgeColor(java.awt.Color.black);
stringletPanel.setTimeFrameXY(600, 600);
stringletPanel.setBorder(graphBorder);
stringletPanel.setShowBorder(false);
stringletPanel.setArrows(false);
stringletPanel.setCool(true);
jScrollPane = new JScrollPane(stringletPanel);
egd = new EditGraphDialog(this, true);
buildGUI();
}
protected void buildGUI() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addComponentListener(this);
Container content = getContentPane();
content.setLayout(new BorderLayout());
// add the menus
menuBar.setBackground(background);
populateFileMenu();
menuBar.add(fileMenu);
populateSelectMenu();
populatelayoutMenu();
menuBar.add(layoutMenu);
populateClusteringMenu();
menuBar.add(clusteringMenu);
menuBar.add(selectMenu);
populateOptionMenu();
menuBar.add(optionMenu);
populateManipulateMenu();
menuBar.add(manipulateMenu);
populateInteractionMenu();
menuBar.add(interactionMenu);
populateDisplayMenu();
menuBar.add(displayMenu);
populateHelpMenu();
menuBar.add(helpMenu);
setJMenuBar(menuBar);
// add the controls
controlPanel = new JPanel();
populateControlPanel();
// set borders
controlPanel.setBorder(graphBorder);
//scalerPanel.setBorder(graphBorder);
// add components
content.add("Center", jScrollPane); // added scrollpane instead of stringletPanel
content.add("South", controlPanel);
populateLegendPanel();
populateScalerPanel();
//content.add("East",scalerPanel);
//content.add("East", new RightControlPanel(this, stringSettings));
// add keyboard bindings
//addKeyBindings();
}
/**
* Loads a data file without threading. Useful for loading
* graphs before start-up
* @param data
* @throws java.io.IOException
* @throws medusa.DataFormatException
*/
public void loadData(String data, boolean medusa) throws IOException, DataFormatException {
System.out.println("Loading " + data + ". Please wait");
dl = new DataLoader();
Graph g = null;
if (medusa) {
g = dl.load(data);
} else {
g = dl.loadSimplest(data);
}
stringletPanel.setGraph(g);
}
private final void loadInteractionSettings(String interactionSettings) throws IOException {
stringSettings.load(interactionSettings);
updateLegend();
stringletPanel.updateStringSettings(stringSettings);
}
void initData() {
try {
boolean weng = loadSettings();
defaultNet();
if (stringletPanel == null) {
System.out.println("stringletPanel is null");
}
if (weng) {
//stringletPanel.loadingMessage();
//stringletPanel.loadGraph(lastDir);
waitForLoad(lastDir, DataLoader.LOAD_MEDUSA);
}
//else
// defaultNet();
//updateInfo();
} catch (IOException ie) {
defaultNet();
} catch (DataFormatException de) {
JOptionPane.showMessageDialog(this, de.getMessage(),
"Data Error", JOptionPane.ERROR_MESSAGE);
defaultNet();
}
}
public void defaultNet() {
}
/*public void addKeyBindings(){
System.out.println("key bindings added?");
InputMap im = stringletPanel.getInputMap();
ActionMap am = stringletPanel.getActionMap();
KeyStroke key = KeyStroke.getKeyStroke("r");
im.put(key,"toggleRelax");
am.put("toggleRelax",toggleRelax);
}*/
public static void main(String[] args) {
//Make sure we have nice window decorations.
MedusaFrame.setLnF();
//JFrame.setDefaultLookAndFeelDecorated(true);
MedusaFrame stringletFrame = new MedusaFrame();
stringletFrame.init();
try {
// do we have args?
stringletFrame.checkArgs(args);
} catch (DataFormatException ex) {
System.out.println("Data format error! Check your data.");
ex.printStackTrace();
System.exit(0);
} catch (IOException ex) {
System.out.println("File error! Check the integrity of your file.");
ex.printStackTrace();
System.exit(0);
}
//stringletFrame.init();
stringletFrame.pack();
centerWindow(stringletFrame);
stringletFrame.setVisible(true);
//stringletFrame.initData();
}
public void checkArgs(String[] args) throws IOException, DataFormatException {
// use the format
// f
// i
System.out.println("Checking arguments");
int ln = args.length;
//System.out.println(args.length);
// should be 0, 2 or 4
if (ln == 0) {
System.out.println("No arguments. Proceeding normally");
initData();
return;
}
if (ln == 2) {
checkArgPair(args);
return;
}
if (ln == 4) {
checkArgPair(new String[]{args[0], args[1]});
checkArgPair(new String[]{args[2], args[3]});
return;
}
}
private void checkArgPair(String[] args) throws IOException, DataFormatException {
if (args[0].compareTo("f") == 0) {
loadData(args[1], true);
}
if (args[0].compareTo("i") == 0) {
loadInteractionSettings(args[1]);
}
if (args[0].compareTo("t") == 0) {
loadData(args[1], false);
}
}
public static void setLnF() {
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
// If Nimbus is not available, fall back to cross-platform
try {
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception ex) {
// not worth my time
}
}
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
// Color silly = new Color(255, 255, 255);
// javax.swing.plaf.ColorUIResource weng = new javax.swing.plaf.ColorUIResource(silly);
/*UIManager.put("InternalFrame.activeTitleBackground", weng);
UIManager.put("MenuItem.background", STRINGCOLOR);
UIManager.put("MenuItem.foreground", weng);
UIManager.put("MenuItem.selectionBackground", STRINGCOLOR.darker());
UIManager.put("MenuItem.selectionForeground", weng);
UIManager.put("CheckBoxMenuItem.background", STRINGCOLOR);
UIManager.put("CheckBoxMenuItem.foreground", weng);
UIManager.put("CheckBoxMenuItem.selectionBackground", STRINGCOLOR.darker());
UIManager.put("CheckBoxMenuItem.selectionForeground", weng);
UIManager.put("Menu.background", STRINGCOLOR);
UIManager.put("Menu.foreground", weng);
UIManager.put("Menu.selectionBackground", STRINGCOLOR.darker());
UIManager.put("Menu.selectionForeground", weng);*/
//UIManager.put("Menu.background", background);
//UIManager.put("Menu.foreground", weng);
}
public static void centerWindow(java.awt.Window win) {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = win.getSize();
win.setLocation((screenSize.width - (frameSize.width)) / 2,
(screenSize.height - (frameSize.height)) / 2);
}
// FR button
JButton frButton = new JButton("Spring");
JButton stringButton = new JButton("Data");
// controlPanel
JPanel controlPanel;
JToggleButton relax = new JToggleButton("Relax", false);
JToggleButton temperatureButton = new JToggleButton("Cooling", true);
JLabel fileLabel = new JLabel("File: none");
JLabel infoLabel = new JLabel("nodes: 0
edges: 0");
JLabel emptyLabel = new JLabel(" ");
JButton recalcButton = new JButton("Recalculate");
private void populateControlPanel() {
controlPanel.add(fileLabel);
controlPanel.add(infoLabel);
controlPanel.add(emptyLabel);
controlPanel.add(relax);
relax.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent ex) {
if (relax.isSelected()) {
stringletPanel.start();
} else {
stringletPanel.stop();
}
}
});
controlPanel.add(temperatureButton);
temperatureButton.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent e) {
stringletPanel.setCool(temperatureButton.isSelected());
}
});
controlPanel.add(stringButton);
stringButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
stringConnection();
}
});
controlPanel.add(frButton);
frButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
stopRelax();
// disabled for now
stringletPanel.energy();
//stringletPanel.repaint();
}
});
controlPanel.add(recalcButton);
recalcButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
recalcEvent();
//stringletPanel.autoFixOrientation();
// disabled for now
//stringletPanel.repaint();
}
});
}
private Action toggleRelax = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
//System.out.println("action fired");
boolean relaxOn = relax.isSelected();
if (!relaxOn) {
stringletPanel.start();
} else {
stringletPanel.stop();
}
relax.setSelected(!relaxOn);
}
};
// update the info label
public void updateInfo() {
String[] result = stringletPanel.getGraphData();
String display = "nodes: " +
result[0] + "
edges: " + result[1] + "";
infoLabel.setText(display);
}
private void updateFileInfo() {
fileLabel.setText(lastFile);
//fileLabel.setToolTip(lastDir);
}
// Set up the legend and scaler panel
JPanel scalerPanel = new JPanel();
//Box scalerPanel = new Box(X_AXIS);
JLabel scalerLabel = new JLabel(" Scale");
JSlider scalerSlider = new JSlider(JSlider.VERTICAL, 100, 300, 100);
private void populateScalerPanel() {
scalerPanel.setLayout(new BoxLayout(scalerPanel, BoxLayout.Y_AXIS));
//scalerPanel.setLayout(new java.awt.GridLayout(0, 1, 5, 5));
scalerPanel.setOpaque(true);
scalerPanel.setBackground(background);
scalerSlider.setMajorTickSpacing(50);
scalerSlider.setMinorTickSpacing(10);
scalerSlider.setPaintTicks(true);
scalerSlider.setPaintLabels(true);
scalerSlider.setBackground(background);
scalerSlider.setForeground(foreground);
scalerPanel.setBackground(background);
scalerPanel.setForeground(foreground);
legendPanel.setAlignmentX(LEFT_ALIGNMENT);
scalerSlider.setAlignmentX(LEFT_ALIGNMENT);
scalerLabel.setAlignmentX(LEFT_ALIGNMENT);
scalerLabel.setForeground(foreground);
scalerPanel.add(legendPanel);
scalerPanel.add(scalerLabel);
scalerPanel.add(scalerSlider);
scalerSlider.addChangeListener(this);
}
//private void updateLegend(){
// Set up the Options menu
JMenu optionMenu = new JMenu("Options");
JMenu selectMenu = new JMenu("Select");
JMenu colorMenu = new JMenu("Color");
JMenu imageMenu = new JMenu("Image");
JMenu fontMenu = new JMenu("Font");
JMenuItem selectAllMenuItem = new JMenuItem("All");
JMenuItem selectNoneMenuItem = new JMenuItem("None");
JMenuItem searchMenuItem = new JMenuItem("Search");
JMenuItem selectNodeFromFileMenuItem = new JMenuItem("From file");
JMenuItem invertFixMenuItem = new JMenuItem("Invert");
JMenuItem selectGrowMenuItem = new JMenuItem("Grow selection");
//JMenuItem changeSizeMenuItem = new JMenuItem("Change panel Size");
JMenuItem changeColorMenuItem = new JMenuItem("Change node color");
JMenuItem switchColorMenuItem = new JMenuItem("Switch channels");
JMenuItem copyColorMenuItem = new JMenuItem("Copy channels");
JMenuItem xGradientColorMenuItem = new JMenuItem("X gradient");
JMenuItem changeNodeSizeMenuItem = new JMenuItem("Change node size");
JMenuItem selectNodeLabelByRegExpMenuItem = new JMenuItem("By label");
JMenuItem selectNodeAnnotationByRegExpMenuItem = new JMenuItem("By annotation");
JMenuItem addNodeMenuItem = new JMenuItem("Add nodes");
JMenuItem setLabelColorMenuItem = new JMenuItem("Label");
JMenuItem setBasicEdgeColorMenuItem = new JMenuItem("Base color");
JMenuItem loadImageMenuItem = new JMenuItem("Load");
JMenuItem setBackgroundColorMenuItem = new JMenuItem("Background");
JMenuItem changeFontSizeMenuItem = new JMenuItem("Font size");
JMenuItem clearImageMenuItem = new JMenuItem("Clear");
JMenuItem setEdgeLenMenuItem = new JMenuItem("Edge Length");
JMenu layoutMenu = new JMenu("Layout");
JMenuItem randomMenuItem = new JMenuItem("Random");
JMenuItem circularMenuItem = new JMenuItem("Circular");
JMenuItem gridMenuItem = new JMenuItem("Grid");
JMenuItem fruchtermanMenuItem = new JMenuItem("Fruchterman");
JMenuItem hierarchicalMenuItem = new JMenuItem("Hierarchical");
JMenuItem distanceGeometryMenuItem = new JMenuItem("Distance Geometry");
JMenu clusteringMenu = new JMenu("Clustering");
JMenuItem kmeansMenuItem = new JMenuItem("K-Means");
JMenuItem affinityMenuItem = new JMenuItem("Affinity Propagation");
JMenuItem mclMenuItem = new JMenuItem("Markov Clustering");
//-----------------------------------------------------
protected void populateClusteringMenu() {
clusteringMenu.setMnemonic(KeyEvent.VK_I);
kmeansMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
stopRelax();
System.out.println("K-Means");
Layouts layout = new Layouts();
Graph g = stringletPanel.getGraph();
layout.Apply_Kmeans_Clustering(g, stringletPanel);
}
});
affinityMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
stopRelax();
System.out.println("AFFINITY");
Layouts layout = new Layouts();
Graph g = stringletPanel.getGraph();
layout.Apply_Affinity_Propagation_Clustering(g, stringletPanel);
}
});
mclMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
stopRelax();
System.out.println("MCL");
Layouts layout = new Layouts();
Graph g = stringletPanel.getGraph();
layout.Apply_MCL_Propagation_Clustering(g, stringletPanel);
}
});
clusteringMenu.add(kmeansMenuItem);
clusteringMenu.add(affinityMenuItem);
clusteringMenu.add(mclMenuItem);
clusteringMenu.setBackground(background);
clusteringMenu.setForeground(foreground);
}
//------------------------------------------------------------------------------------
protected void populatelayoutMenu() {
layoutMenu.setMnemonic(KeyEvent.VK_I);
randomMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
System.out.println("RANDOM");
stopRelax();
Graph g = stringletPanel.getGraph();
for (Iterator it = g.nodesIterator(); it.hasNext();) {
Node node = (Node) it.next();
node.setX(Math.random() * stringletPanel.getWidth());
node.setY(Math.random() * stringletPanel.getHeight());
}
updateInfo();
stringletPanel.repaint();
}
});
circularMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
System.out.println("CIRCULAR");
stopRelax();
Layouts layout = new Layouts();
Graph g = stringletPanel.getGraph();
layout.Apply_Circular_Coordinates(g, stringletPanel);
}
});
gridMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
System.out.println("GRID");
stopRelax();
Layouts layout = new Layouts();
Graph g = stringletPanel.getGraph();
layout.Apply_Grid_Coordinates(g, stringletPanel);
}
});
fruchtermanMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
System.out.println("FRUCHTERMAN");
stopRelax();
// disabled for now
stringletPanel.energy();
}
});
hierarchicalMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
System.out.println("HIERARCHICAL");
stopRelax();
Layouts layout = new Layouts();
Graph g = stringletPanel.getGraph();
layout.Apply_GO_like_Coordinates(g, stringletPanel);
}
});
distanceGeometryMenuItem.addActionListener(
new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
System.out.println("DISTANCE GEOMETRY");
stopRelax();
Layouts layout = new Layouts();
Graph g = stringletPanel.getGraph();
layout.Apply_Distance_Geomretry_Coordinates(g, stringletPanel);
}
});
layoutMenu.add(randomMenuItem);
layoutMenu.add(circularMenuItem);
layoutMenu.add(gridMenuItem);
layoutMenu.add(fruchtermanMenuItem);
layoutMenu.add(hierarchicalMenuItem);
layoutMenu.add(distanceGeometryMenuItem);
layoutMenu.setBackground(background);
layoutMenu.setForeground(foreground);
}
//-------------------------------------------------------------------------------------
private void populateOptionMenu() {
optionMenu.setMnemonic(KeyEvent.VK_O);
colorMenu.setMnemonic(KeyEvent.VK_C);
fontMenu.setMnemonic(KeyEvent.VK_F);
// searchMenuItem.addActionListener(new java.awt.event.ActionListener() {
// public void actionPerformed(java.awt.event.ActionEvent e) {
// // searchNodeEvent();}
// } );
changeColorMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
changeColorEvent();
}
});
switchColorMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
switchColorEvent();
}
});
copyColorMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
copyColorEvent();
}
});
xGradientColorMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
stringletPanel.addGradientX(2);
}
});
changeNodeSizeMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
changeNodeSizeEvent();
}
});
/*addNodeMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
EditNodeDialog dialog = new EditNodeDialog();
dialog.showDialog();
if(dialog.getStatus() == EditNodeDialog.NET_CHANGED) {
stringletPanel.repaint();
}
}
});*/
setBasicEdgeColorMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
setBasicEdgeColorEvent();
}
});
setLabelColorMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
setLabelColorEvent();
}
});
setBackgroundColorMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
setBackgroundColorEvent();
}
});
loadImageMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
loadImageEvent();
}
});
clearImageMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
clearImageEvent();
}
});
changeFontSizeMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
changeFontSizeEvent();
}
});
setEdgeLenMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
setEdgeLenEvent();
}
});
colorMenu.add(changeColorMenuItem);
colorMenu.add(switchColorMenuItem);
colorMenu.add(copyColorMenuItem);
// colorMenu.add(xGradientColorMenuItem);
optionMenu.setBackground(background);
optionMenu.setForeground(foreground);
//optionMenu.add(searchMenuItem);
//optionMenu.add(changeSizeMenuItem);
optionMenu.add(changeNodeSizeMenuItem);
optionMenu.add(setEdgeLenMenuItem);
colorMenu.addSeparator();
colorMenu.add(setBasicEdgeColorMenuItem);
fontMenu.add(setLabelColorMenuItem);
colorMenu.add(setBackgroundColorMenuItem);
optionMenu.addSeparator();
//optionMenu.add(selectMenu);
optionMenu.add(colorMenu);
fontMenu.add(changeFontSizeMenuItem);
optionMenu.add(fontMenu);
optionMenu.addSeparator();
imageMenu.add(loadImageMenuItem);
imageMenu.add(clearImageMenuItem);
optionMenu.add(imageMenu);
}
//------------------------------------------------------------------------------------
private void populateSelectMenu() {
selectMenu.setBackground(background);
selectMenu.setForeground(foreground);
selectMenu.setMnemonic(KeyEvent.VK_S);
selectNodeLabelByRegExpMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
searchNodeEvent(true);
}
});
selectNodeAnnotationByRegExpMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
searchNodeEvent(false);
}
});
selectNodeFromFileMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
selectNodeFromFileEvent();
}
});
selectAllMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
stringletPanel.setFix(true);
}
});
selectNoneMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
stringletPanel.setFix(false);
}
});
invertFixMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
stringletPanel.invertFix();
}
});
selectGrowMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
stringletPanel.growSelection();
}
});
selectAllMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.ALT_MASK));
selectNoneMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.ALT_MASK));
selectMenu.add(selectAllMenuItem);
selectMenu.add(selectNoneMenuItem);
selectMenu.add(selectNodeLabelByRegExpMenuItem);
selectMenu.add(selectNodeAnnotationByRegExpMenuItem);
selectMenu.add(selectNodeFromFileMenuItem);
selectMenu.add(invertFixMenuItem);
selectMenu.add(selectGrowMenuItem);
}
// manipulate data menu
JMenu manipulateMenu = new JMenu("Manipulate");
JMenu rotateMenu = new JMenu("Rotate");
JMenu flipMenu = new JMenu("Flip");
JMenuItem rotateRightMenuItem = new JMenuItem("90d clockwise");
JMenuItem rotateLeftMenuItem = new JMenuItem("90d anti-clockwise");
JMenuItem flipXItem = new JMenuItem("Vertical");
JMenuItem flipYItem = new JMenuItem("Horizontal");
JMenuItem deleteNodeMenuItem = new JMenuItem("Delete nodes");
JMenuItem changeNodeShapeMenuItem = new JMenuItem("Change node shape");
JMenuItem cropMenuItem = new JMenuItem("Crop graph");
JMenuItem randomGraphMenuItem = new JMenuItem("Random graph");
JMenuItem clearGraphMenuItem = new JMenuItem("Clear graph");
JMenuItem editGraphMenuItem = new JMenuItem("Edit graph");
//------------------------------------------------------------------------------------
private void populateManipulateMenu() {
manipulateMenu.setMnemonic(KeyEvent.VK_M);
changeNodeShapeMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
setShapeEvent();
}
});
deleteNodeMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
stopRelax();
stringletPanel.removeFixedNodes();
//stringletPanel.updateNodes();
updateInfo();
stringletPanel.repaint();
}
});
cropMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
String confidence = (String) JOptionPane.showInputDialog("Choose minimum confidence level:" + "",
"1.0");
if (confidence != null) {
stringletPanel.crop(Double.parseDouble(confidence));
updateInfo();
stringletPanel.repaint();
}
}
});
randomGraphMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
getRandomGraphEvent();
}
});
clearGraphMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
clearGraphEvent();
}
});
rotateRightMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
rotateEvent(Math.PI / 2);
}
});
rotateLeftMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
rotateEvent(-Math.PI / 2);
}
});
flipXItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
flipX();
}
});
flipYItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
flipY();
}
});
editGraphMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
editGraph();
}
});
manipulateMenu.add(clearGraphMenuItem);
manipulateMenu.add(changeNodeShapeMenuItem);
manipulateMenu.add(deleteNodeMenuItem);
manipulateMenu.add(cropMenuItem);
manipulateMenu.add(randomGraphMenuItem);
manipulateMenu.setForeground(foreground);
manipulateMenu.setBackground(background);
rotateMenu.add(rotateRightMenuItem);
rotateMenu.add(rotateLeftMenuItem);
flipMenu.add(flipXItem);
flipMenu.add(flipYItem);
manipulateMenu.add(rotateMenu);
manipulateMenu.add(flipMenu);
manipulateMenu.addSeparator();
manipulateMenu.add(editGraphMenuItem);
}
// Set up the File menu
JMenu fileMenu = new JMenu("File");
JMenuBar menuBar = new JMenuBar();
JMenuItem openMenuItem = new JMenuItem("Open");
JMenu addSubractMenu = new JMenu("Add/Subtract");
JMenuItem addMenuItem = new JMenuItem("Add graph");
JMenuItem subtractMenuItem = new JMenuItem("Subtract graph");
JMenuItem copyMenuItem = new JMenuItem("Copy settings");
JMenu importMenu = new JMenu("Import");
JMenuItem importTabbedMenuItem = new JMenuItem("Simple tabbed");
JMenuItem saveMenuItem = new JMenuItem("Save");
JMenuItem saveHTMLParametersMenuItem = new JMenuItem("HTML Parameters");
JMenu exportMenu = new JMenu("Export");
JMenu exportImageMenu = new JMenu("Image");
JMenu exportPostscriptMenu = new JMenu("PostScript");
JMenuItem exportJPGMenuItem = new JMenuItem("JPG");
JMenuItem exportPNGMenuItem = new JMenuItem("PNG");
JMenuItem quitMenuItem = new JMenuItem("Quit");
JMenuItem exportPSMenuItem = new JMenuItem("PS");
JMenuItem exportEPSMenuItem = new JMenuItem("EPS");
JMenuItem exportPajekMenuItem = new JMenuItem("Pajek");
//------------------------------------------------------------------------------------
protected void populateFileMenu() {
fileMenu.setMnemonic(KeyEvent.VK_F);
quitMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
quitApplication();
}
});
openMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
loadEvent(DataLoader.LOAD_MEDUSA);
}
});
addMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
addGraphEvent();
}
});
subtractMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
subtractGraphEvent();
}
});
copyMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
copyGraphEvent();
}
});
saveMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
saveEvent();
}
});
saveHTMLParametersMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
saveHTMLParametersEvent();
}
});
exportJPGMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
exportImageEvent(false);
}
});
exportPNGMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
exportImageEvent(true);
}
});
exportPSMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
exportPSEvent();
}
});
exportEPSMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
exportEPSEvent();
}
});
exportPajekMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
exportPajekEvent();
}
});
importTabbedMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
copyGraphEvent();
}
});
fileMenu.setBackground(background);
fileMenu.setForeground(foreground);
fileMenu.add(openMenuItem);
fileMenu.add(addSubractMenu);
// build addSubtract
addSubractMenu.add(addMenuItem);
addSubractMenu.add(subtractMenuItem);
addSubractMenu.add(copyMenuItem);
fileMenu.add(importMenu);
fileMenu.add(saveMenuItem);
// the export submenu
exportImageMenu.add(exportJPGMenuItem);
exportImageMenu.add(exportPNGMenuItem);
exportPostscriptMenu.add(exportPSMenuItem);
exportPostscriptMenu.add(exportEPSMenuItem);
exportMenu.add(exportImageMenu);
exportMenu.add(exportPostscriptMenu);
exportMenu.add(exportPajekMenuItem);
exportMenu.add(saveHTMLParametersMenuItem);
importMenu.add(importTabbedMenuItem);
fileMenu.add(exportMenu);
fileMenu.addSeparator();
fileMenu.add(quitMenuItem);
}
// set up the interactions menu
JMenu interactionMenu = new JMenu("Interaction");
JMenuItem loadInteractionMenuItem = new JMenuItem("Load");
JMenu stringDefaultMenu = new JMenu("STRING default");
JMenuItem stringProteinInteractionMenuItem = new JMenuItem("Protein");
JMenuItem stringCOGInteractionMenuItem = new JMenuItem("COGS");
JMenuItem hideShowMenuItem = new JMenuItem("Hide");
//------------------------------------------------------------------------------------
protected void populateInteractionMenu() {
interactionMenu.setMnemonic(KeyEvent.VK_I);
loadInteractionMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
interactionEvent();
}
});
stringProteinInteractionMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
proteinInteractionEvent();
}
});
stringCOGInteractionMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
cogInteractionEvent();
}
});
hideShowMenuItem.addActionListener(
new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
hideShowInteractionsEvent();
}
});
interactionMenu.add(loadInteractionMenuItem);
stringDefaultMenu.add(stringProteinInteractionMenuItem);
stringDefaultMenu.add(stringCOGInteractionMenuItem);
interactionMenu.add(stringDefaultMenu);
interactionMenu.addSeparator();
interactionMenu.add(hideShowMenuItem);
interactionMenu.setBackground(background);
interactionMenu.setForeground(foreground);
}
// set up the display menu
JMenu displayMenu = new JMenu("Display");
JCheckBoxMenuItem confidenceCBMItem = new JCheckBoxMenuItem("Confidence", true);
JCheckBoxMenuItem prettyCBMItem = new JCheckBoxMenuItem("Interactions", false);
JCheckBoxMenuItem namesCBMItem = new JCheckBoxMenuItem("Labels", true);
JCheckBoxMenuItem showNamesCBMItem = new JCheckBoxMenuItem("Show names", true);
JCheckBoxMenuItem directedCBMItem = new JCheckBoxMenuItem("Directed", false);
JCheckBoxMenuItem hideWhenMoveCBMItem = new JCheckBoxMenuItem("Hide when move", false);
JCheckBoxMenuItem alphaCBMItem = new JCheckBoxMenuItem("Alpha conf", true);
JMenu nodeColorDisplayMenu = new JMenu("Node color set");
JMenu LegentDisplayMenu = new JMenu("Connections to display");
JRadioButton channel1MenuItem = new JRadioButton("1", true);
JRadioButton channel2MenuItem = new JRadioButton("2");
JRadioButton channel3MenuItem = new JRadioButton("3");
ButtonGroup nodeColorSetGroup = new ButtonGroup();
//------------------------------------------------------------------------------------
protected void populateDisplayMenu() {
displayMenu.setMnemonic(KeyEvent.VK_D);
prettyCBMItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, ActionEvent.ALT_MASK));
prettyCBMItem.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent e) {
stringletPanel.setPretty(prettyCBMItem.isSelected());
stringletPanel.repaint();
}
});
namesCBMItem.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent e) {
stringletPanel.setLabel(namesCBMItem.isSelected());
stringletPanel.repaint();
}
});
showNamesCBMItem.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent e) {
stringletPanel.setShowName(showNamesCBMItem.isSelected());
stringletPanel.repaint();
}
});
confidenceCBMItem.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent e) {
stringletPanel.setConfidence(confidenceCBMItem.isSelected());
stringletPanel.repaint();
}
});
directedCBMItem.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent e) {
stringletPanel.setArrows(directedCBMItem.isSelected());
stringletPanel.repaint();
}
});
hideWhenMoveCBMItem.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent e) {
stringletPanel.setHideWhenMove(hideWhenMoveCBMItem.isSelected());
stringletPanel.repaint();
}
});
alphaCBMItem.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent e) {
stringletPanel.setAlpha(alphaCBMItem.isSelected());
stringletPanel.repaint();
}
});
channel1MenuItem.addActionListener(
new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
setNodeColorSet(1);
}
});
channel2MenuItem.addActionListener(
new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
setNodeColorSet(2);
}
});
channel3MenuItem.addActionListener(
new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
setNodeColorSet(3);
}
});
displayMenu.setBackground(background);
displayMenu.setForeground(foreground);
displayMenu.add(prettyCBMItem);
displayMenu.add(namesCBMItem);
displayMenu.add(showNamesCBMItem);
displayMenu.add(directedCBMItem);
displayMenu.add(confidenceCBMItem);
displayMenu.add(alphaCBMItem);
displayMenu.addSeparator();
displayMenu.add(hideWhenMoveCBMItem);
displayMenu.addSeparator();
nodeColorDisplayMenu.add(channel1MenuItem);
nodeColorDisplayMenu.add(channel2MenuItem);
nodeColorDisplayMenu.add(channel3MenuItem);
nodeColorSetGroup.add(channel1MenuItem);
nodeColorSetGroup.add(channel2MenuItem);
nodeColorSetGroup.add(channel3MenuItem);
displayMenu.add(nodeColorDisplayMenu);
}
public EditableGraphPanel getStringletPanel() {
return stringletPanel;
}
public void setStringletPanel(EditableGraphPanel stringletPanel) {
this.stringletPanel = stringletPanel;
}
/* Set up the help menu
*/
JMenu helpMenu = new JMenu("Help");
JMenuItem aboutMenuItem = new JMenuItem("About Medusa");
protected void populateHelpMenu() {
aboutMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
aboutEvent();
}
});
helpMenu.add(aboutMenuItem);
helpMenu.setBackground(background);
helpMenu.setForeground(foreground);
}
/* legend panel will hold the interaction names and colors
*/
//JLabel legendTitle = new JLabel(" Interactions");
JPanel legendPanel = new JPanel();
JToggleButton[] toggleButton;
//------------------------------------------------------------------------------------
protected void populateLegendPanel() {
legendPanel.setLayout(new java.awt.GridLayout(4, 4, 0, 0));
// legendPanel.setLayout(new BoxLayout(legendPanel, BoxLayout.Y_AXIS));
legendPanel.setOpaque(true);
legendPanel.setBackground(background);
initLegendTitle();
legendPanel.add(legendTitlePanel);
initLegendScroller();
legendPanel.add(legendScroller);
}
public void updateLegend() {
//System.out.println("settings updated");
//scalerPanel.removeAll();
legendPanel.removeAll();
initLegendScroller();
legendPanel.add(legendTitlePanel);
legendPanel.add(legendScroller);
legendPanel.validate();
//legendScroller.validate();
//scalerPanel.add(legendTitlePanel);
//scalerPanel.add(legendScroller);
//scalerPanel.add(legendPanel);
//scalerPanel.add(scalerLabel);
//scalerPanel.add(scalerSlider);
scalerPanel.validate();
scalerPanel.repaint();
//populateScalerPanel();
//legendPanel.removeAll();
//initLegend();
//legendPanel.validate();
}
JLabel legendTitleLabel;
JPanel legendTitlePanel;
JLabel logoLabel;
private void initLegendTitle() {
legendTitlePanel = new JPanel();
legendTitlePanel.setLayout(new BoxLayout(legendTitlePanel, BoxLayout.Y_AXIS));
legendTitlePanel.setOpaque(true);
legendTitlePanel.setBackground(background);
logoLabel = new JLabel();
legendTitleLabel = new JLabel("Interactions");
legendTitleLabel.setBackground(background);
legendTitleLabel.setForeground(foreground);
java.net.URL imageURL = this.getClass().getResource("/medusa/images/medusa_logo_small.png");
logoLabel.setIcon(new javax.swing.ImageIcon(imageURL));
legendTitlePanel.add(logoLabel);
legendTitlePanel.add(legendTitleLabel);
}
JScrollPane legendScroller;
private void initLegendScroller() {
Dimension legendSize = new Dimension(150, 100);
//legendScrollPane.setPreferredSize(legendSize);
ShowEdgeMultiPanel sp = new ShowEdgeMultiPanel(this, stringSettings);
sp.setBackground(background);
legendScroller = new JScrollPane(sp);
legendScroller.setPreferredSize(legendSize);
legendScroller.revalidate();
}
// a yes/no dialogue
private int yes_no(String message) {
int s = JOptionPane.showConfirmDialog(this,
message,
"Confirm",
JOptionPane.YES_NO_OPTION);
return s;
}
private void clearGraphEvent() {
stopAllRelax();
if (yes_no("Your data will be lost. Are you sure?") == 0) {
stringletPanel.clearGraph();
stringletPanel.repaint();
updateInfo();
}
}
private void recalcEvent() {
stopAllRelax();
if (yes_no("This will return edge length \nand orientation to default values\n Are you sure you want to do this?") == 0) {
stringletPanel.autoFixOrientation();
stringletPanel.calculateEdgeLength();
stringletPanel.repaint();
}
}
private void rotateEvent(double degrees) {
stopAllRelax();
stringletPanel.rotate(degrees);
stringletPanel.repaint();
}
private void flipEvent(boolean x, boolean y) {
stopAllRelax();
stringletPanel.mirror(x, y);
stringletPanel.repaint();
}
private void flipX() {
flipEvent(true, false);
}
private void flipY() {
flipEvent(false, true);
}
EditGraphDialog egd;
private void editGraph() {
stopAllRelax();
egd = new EditGraphDialog(this, true);
egd.setGraph(stringletPanel.getGraph());
egd.setVisible(true);
Graph g = egd.getGraph();
if (g != null) {
stringletPanel.setGraph(g);
stringletPanel.repaint();
}
}
// allow for user defined data connections
// from pull-down menu
// TODO
// scan the plugin directory for suitable
// TODO
// default data connection
// MedusaDataConnection mc = new medusa.stringconnection.Main();
// private void stringConnection(){
// String nodes=getFixedNodesAsString();
// //System.out.println("debug 600> "+nodes);
// //AboutDialog.showDialog(this,null);
// Graph graph = mc.getGraph(nodes, this);
// stringletPanel.addGraph(graph);
// stringletPanel.copyNodeSettings(graph);
//
// //System.out.println(graph.report());
// //graph.printNodeAnnotation();
// stringletPanel.repaint();
// updateInfo();
// }
// for public version
private void stringConnection() {
JOptionPane.showConfirmDialog(this, "STRING requires a license and is not\navailable to open source",
"Disabled", JOptionPane.PLAIN_MESSAGE, JOptionPane.INFORMATION_MESSAGE);
}
// version number for medusa! remember to update it!
private void aboutEvent() {
AboutDialog.showDialog(this, null, version);
}
private void setShapeEvent() {
Object[] shapes = {"circle", "rectangle", "triangle", "diamond"};
int s = JOptionPane.showOptionDialog(this,
"Choose a node shape",
"Shape",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
shapes,
"circle");
// If a string was returned, say so.
stringletPanel.setShape(s);
//System.out.println("Green eggs and... " + s + "!");
return;
}
public void loadImageEvent() {
stringletPanel.stop();
relax.setSelected(false);
FileDialog fdLoad = new FileDialog(this, "Load image", FileDialog.LOAD);
fdLoad.setVisible(true);
String loadFile = fdLoad.getFile();
String dir = fdLoad.getDirectory();
if (loadFile != null) {
try {
stringletPanel.setImage(dir + loadFile);
} catch (IOException ie) {
JOptionPane.showMessageDialog(this, "The image could not be found or opened",
"Load Error", JOptionPane.ERROR_MESSAGE);
}
}
stringletPanel.repaint();
}
private void stopAllRelax() {
stringletPanel.stop();
relax.setSelected(false);
controlPanel.repaint();
}
public void clearImageEvent() {
stopAllRelax();
stringletPanel.clearImage();
stringletPanel.repaint();
}
public void quitApplication() {
stopAllRelax();
System.out.println("Closing application");
try {
saveSettings();
System.out.println("Current settings saved");
} catch (IOException ie) {
System.out.println("...settings not saved due to file problems");
}
remove(stringletPanel);
System.exit(0);
}
private void loadEvent(int loadType) {
stopAllRelax();
scaleOut();
FileDialog fdLoad = new FileDialog(this, "Load graph", FileDialog.LOAD);
if (lastDir != null) {
fdLoad.setDirectory(lastDir);
}
fdLoad.setFilenameFilter(new DataFileFilter());
fdLoad.setVisible(true);
String loadFile = fdLoad.getFile();
String dir = fdLoad.getDirectory();
if (loadFile != null) {
try {
//stringletPanel.loadGraph(dir+loadFile);
waitForLoad(dir + loadFile, loadType);
lastDir = dir;
lastFile = loadFile;
//System.out.println(lastFile);
} catch (IOException ie) {
ie.printStackTrace();
JOptionPane.showMessageDialog(this, "The file could not be found or opened",
"Load Error", JOptionPane.ERROR_MESSAGE);
} catch (DataFormatException dfe) {
JOptionPane.showMessageDialog(this, dfe.getMessage(),
"Data Error", JOptionPane.ERROR_MESSAGE);
//System.exit(0);
}
}
}
private void getRandomGraphEvent() {
int s = yes_no("This will generate a random graph. Are you sure?");
//System.out.println(s);
if (s == 0) {
stopAllRelax();
stringletPanel.randomGraph(30, 60);
updateInfo();
stringletPanel.repaint();
}
}
private void addGraphEvent() {
stopAllRelax();
scaleOut();
FileDialog fdLoad = new FileDialog(this, "Add graph", FileDialog.LOAD);
if (lastDir != null) {
fdLoad.setFile(lastDir + lastFile);
}
fdLoad.setFilenameFilter(new DataFileFilter());
fdLoad.setVisible(true);
String loadFile = fdLoad.getFile();
String dir = fdLoad.getDirectory();
if (loadFile != null) {
try {
stringletPanel.appendGraph(dir + loadFile);
lastDir = dir + loadFile;
lastFile = loadFile;
updateInfo();
stringletPanel.repaint();
} catch (IOException ie) {
//ie.printStackTrace();
JOptionPane.showMessageDialog(this, "The file could not be found or opened",
"Load Error", JOptionPane.ERROR_MESSAGE);
} catch (DataFormatException dfe) {
JOptionPane.showMessageDialog(this, dfe.getMessage(),
"Data Error", JOptionPane.ERROR_MESSAGE);
//System.exit(0);
}
}
}
private void subtractGraphEvent() {
stopAllRelax();
scaleOut();
FileDialog fdLoad = new FileDialog(this, "Add graph", FileDialog.LOAD);
if (lastDir != null) {
fdLoad.setFile(lastDir + lastFile);
}
fdLoad.setFilenameFilter(new DataFileFilter());
fdLoad.setVisible(true);
String loadFile = fdLoad.getFile();
String dir = fdLoad.getDirectory();
if (loadFile != null) {
try {
stringletPanel.subtractGraph(dir + loadFile);
lastDir = dir + loadFile;
lastFile = loadFile;
updateInfo();
stringletPanel.repaint();
} catch (IOException ie) {
//ie.printStackTrace();
JOptionPane.showMessageDialog(this, "The file could not be found or opened",
"Load Error", JOptionPane.ERROR_MESSAGE);
} catch (DataFormatException dfe) {
JOptionPane.showMessageDialog(this, dfe.getMessage(),
"Data Error", JOptionPane.ERROR_MESSAGE);
//System.exit(0);
}
}
}
private void copyGraphEvent() {
stopAllRelax();
scaleOut();
FileDialog fdLoad = new FileDialog(this, "Add graph", FileDialog.LOAD);
if (lastDir != null) {
fdLoad.setFile(lastDir + lastFile);
}
fdLoad.setFilenameFilter(new DataFileFilter());
fdLoad.setVisible(true);
String loadFile = fdLoad.getFile();
String dir = fdLoad.getDirectory();
if (loadFile != null) {
try {
stringletPanel.copyGraphSettings(dir + loadFile);
lastDir = dir + loadFile;
lastFile = loadFile;
updateInfo();
stringletPanel.repaint();
} catch (IOException ie) {
//ie.printStackTrace();
JOptionPane.showMessageDialog(this, "The file could not be found or opened",
"Load Error", JOptionPane.ERROR_MESSAGE);
} catch (DataFormatException dfe) {
JOptionPane.showMessageDialog(this, dfe.getMessage(),
"Data Error", JOptionPane.ERROR_MESSAGE);
//System.exit(0);
}
}
}
private void saveEvent() {
FileDialog fdSave = new FileDialog(this, "Save as", FileDialog.SAVE);
//fdSave.setDirectory(fdDirectory);
fdSave.setFilenameFilter(new DataFileFilter());
fdSave.setVisible(true);
String saveFile = fdSave.getFile();
String dir = fdSave.getDirectory();
if (saveFile != null) {
lastDir = dir;
lastFile = saveFile;
try {
stringletPanel.saveGraph(dir + saveFile);
} catch (IOException ie) {
JOptionPane.showMessageDialog(this, "Error saving file.",
"Save error", JOptionPane.ERROR_MESSAGE);
}
}
}
private void saveHTMLParametersEvent() {
FileDialog fdSave = new FileDialog(this, "Save applet parameters to", FileDialog.SAVE);
fdSave.setVisible(true);
String saveFile = fdSave.getFile();
dl = new DataLoader();
//System.out.println(stringletPanel.getGraph().report());
if (saveFile != null) {
try {
dl.saveHTMLParameters(stringletPanel.getGraph(), saveFile);
} catch (IOException ie) {
JOptionPane.showMessageDialog(this, "Error saving file.",
"Save error", JOptionPane.ERROR_MESSAGE);
}
}
}
private void exportEPSEvent() {
FileDialog fdSave = new FileDialog(this, "Save as EPS", FileDialog.SAVE);
//fdSave.setDirectory(fdDirectory);
//fdSave.setFilenameFilter(new CustomFileFilter("\\.ps"));
fdSave.setVisible(true);
String saveFile = fdSave.getFile();
String dir = fdSave.getDirectory();
if (saveFile != null) {
//lastDir=dir+saveFile;
try {
stringletPanel.writeEPS(dir + saveFile);
//System.out.println("weng MedusaFrame exportPSEvent");
JOptionPane.showMessageDialog(this, "Panel exported to " + saveFile,
"EPS saved", JOptionPane.INFORMATION_MESSAGE);
} catch (IOException ie) {
JOptionPane.showMessageDialog(this, "Error saving file.",
"Save error", JOptionPane.ERROR_MESSAGE);
}
}
}
private void exportPSEvent() {
FileDialog fdSave = new FileDialog(this, "Save as PS", FileDialog.SAVE);
//fdSave.setDirectory(fdDirectory);
//fdSave.setFilenameFilter(new CustomFileFilter("\\.ps"));
fdSave.setVisible(true);
String saveFile = fdSave.getFile();
String dir = fdSave.getDirectory();
if (saveFile != null) {
//lastDir=dir+saveFile;
try {
stringletPanel.writePS(dir + saveFile);
JOptionPane.showMessageDialog(this, "Panel exported to " + saveFile,
"PS saved", JOptionPane.INFORMATION_MESSAGE);
//System.out.println("weng MedusaFrame exportPSEvent");
} catch (IOException ie) {
JOptionPane.showMessageDialog(this, "Error saving file.",
"Save error", JOptionPane.ERROR_MESSAGE);
}
}
}
private void exportPajekEvent() {
FileDialog fdSave = new FileDialog(this, "Save as pajek", FileDialog.SAVE);
fdSave.setVisible(true);
String saveFile = fdSave.getFile();
String dir = fdSave.getDirectory();
if (saveFile != null) {
//lastDir=dir+saveFile;
try {
stringletPanel.writePajek(dir + saveFile);
JOptionPane.showMessageDialog(this, "Exported to pajek format " + saveFile,
"Pajek", JOptionPane.INFORMATION_MESSAGE);
//System.out.println("weng MedusaFrame exportPSEvent");
} catch (IOException ie) {
JOptionPane.showMessageDialog(this, "Error saving file.",
"Save error", JOptionPane.ERROR_MESSAGE);
}
}
}
private void interactionEvent() {
FileDialog fdInter = new FileDialog(this, "Load interaction file", FileDialog.LOAD);
fdInter.setVisible(true);
String loadFile = fdInter.getFile();
String dir = fdInter.getDirectory();
if (loadFile != null) {
try {
lastInter = dir + loadFile;
stringSettings.load(dir + loadFile);
updateLegend();
stringletPanel.updateStringSettings(stringSettings);
legendPanel.repaint();
//stringSettings.report();
} catch (IOException ie) {
//ie.printStackTrace();
JOptionPane.showMessageDialog(this, "Interaction settings could not be loaded.\n" +
"Check if the file is valid.",
"Load error", JOptionPane.ERROR_MESSAGE);
}
}
}
private void exportImageEvent(boolean png) {
String name = "network." + ((png) ? "png" : "jpg");
FileDialog fdSave = new FileDialog(this, "Save as" + ((png) ? "png" : "jpg"), FileDialog.SAVE);
fdSave.setFile(name);
//fdSave.setFilenameFilter(new CustomFileFilter("\\.ps"));
fdSave.setVisible(true);
String saveFile = fdSave.getFile();
String dir = fdSave.getDirectory();
int type = (png) ? 1 : 0;
stringletPanel.saveImage(dir + saveFile, type);
JOptionPane.showMessageDialog(this, "Panel exported to " + saveFile,
"Image saved", JOptionPane.INFORMATION_MESSAGE);
}
private void switchColorEvent() {
int[] colors = ColorJDialog.showDialog(f, null, "switch with");
stringletPanel.manipulateColor(colors[0], colors[1], true);
stringletPanel.repaint();
}
private void copyColorEvent() {
int[] colors = ColorJDialog.showDialog(f, null, "copy to");
stringletPanel.manipulateColor(colors[0], colors[1], false);
stringletPanel.repaint();
}
private void changeColorEvent() {
Color newColor = JColorChooser.showDialog(getRootPane(),
"Choose node color",
Color.red);
if (newColor != null) {
stringletPanel.changeNodeColor(newColor);
stringletPanel.repaint();
}
}
private void setLabelColorEvent() {
Color newColor = JColorChooser.showDialog(getRootPane(),
"Choose label color",
Color.black);
if (newColor != null) {
stringletPanel.setFontColor(newColor);
stringletPanel.repaint();
}
}
private void setBackgroundColorEvent() {
Color newColor = JColorChooser.showDialog(getRootPane(),
"Choose label color",
Color.white);
if (newColor != null) {
stringletPanel.setBackgroundColor(newColor);
stringletPanel.repaint();
}
}
private void setBasicEdgeColorEvent() {
Color newColor = JColorChooser.showDialog(getRootPane(),
"Choose label color",
Color.gray);
if (newColor != null) {
stringletPanel.setBasicEdgeColor(newColor);
stringletPanel.repaint();
}
}
private void changeNodeSizeEvent() {
String s = (String) JOptionPane.showInputDialog("Enter node size in pixels:\n" + "Default value is 10",
"");
int newSize = -1; // default if something goes wrong
if ((s != null) && (s.length() > 0)) {
try {
newSize = Integer.parseInt(s);
stringletPanel.setNodeSize(newSize);
} catch (NumberFormatException ne) {
JOptionPane.showMessageDialog(this, "Incorrect input",
"An integer is required for this action",
JOptionPane.ERROR_MESSAGE);
}
}
stringletPanel.repaint();
}
private void changeFontSizeEvent() {
String s = (String) JOptionPane.showInputDialog("Enter font size:\n" + "Default value is 10",
"");
if ((s != null) && (s.length() > 0)) {
try {
int newSize = Integer.parseInt(s);
stringletPanel.changeFont(newSize);
} catch (NumberFormatException ne) {
JOptionPane.showMessageDialog(this, "Incorrect input",
"An integer is required for this action",
JOptionPane.ERROR_MESSAGE);
}
}
stringletPanel.repaint();
}
private void searchNodeEvent(boolean label) {
String s = (String) JOptionPane.showInputDialog("Mark node matching regular expression:\n" + "e.g. \"mito.*\"",
"");
//stringletPanel.findLabel
if (s != null) {
if (stringletPanel.selectNodeByRegExp(s, label) == 0) {
JOptionPane.showMessageDialog(this, "No match found",
"No nodes matching your pattern were found",
JOptionPane.ERROR_MESSAGE);
}
}
stringletPanel.repaint();
}
private void selectNodeFromFileEvent() {
FileDialog fdSelect = new FileDialog(this, "Load node list", FileDialog.LOAD);
if (lastDir != null) {
fdSelect.setDirectory(lastDir);
}
fdSelect.setVisible(true);
String loadFile = fdSelect.getFile();
String dir = fdSelect.getDirectory();
//lastDir=dir;
try {
int c = stringletPanel.selectNodeFromFile(dir + loadFile);
stringletPanel.repaint();
} catch (IOException sNFFe) {
JOptionPane.showMessageDialog(this, sNFFe.getMessage(),
"Load Error", JOptionPane.ERROR_MESSAGE);
}
}
/* // Handle the menu events specific to this class ----------------------------------
public void handleClassEvent(ActionEvent e) {
Object source = e.getSource();
}*/
// a stopper method, if we need to turn off relax
public void stopRelax() {
stringletPanel.stop();
if (relax.isSelected()) {
relax.setSelected(false);
}
}
// add listeners, that set parameters for the StringletPanel object
public void itemStateChanged(ItemEvent e) {
//handleClassStateChange(e);
}
public void handleClassStateChange(ItemEvent e) {
Object src = e.getSource();
handleToggle(src);
}
public void handleToggle(Object src) {
System.out.println("debug line 1522 event handled");
ShowEdgePanel se = (ShowEdgePanel) src;
System.out.println(se.getNumber());
/*
for (int i=0; i 0)) {
try {
int newSize = Integer.parseInt(s);
stringletPanel.setEdgeLen(newSize);
} catch (NumberFormatException ne) {
JOptionPane.showMessageDialog(this, "Incorrect input",
"An integer is required for this action",
JOptionPane.ERROR_MESSAGE);
}
}
}
// testing here
ProgressMonitor loader;
Timer timer;
DataLoader dl;
public void waitForLoad(String fileName, int loadType)
throws IOException, DataFormatException {
dl = new DataLoader(600, 600, fileName);
dl.setLoadType(loadType);
timer = new javax.swing.Timer(500, runLoad);
dl.start();
timer.start();
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
}
private ActionListener runLoad = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
infoLabel.setText(dl.getStatus() + " " + dl.getProgress());
//loader.setProgress(0);
//System.out.println(dl.getProgress());
if (dl.isDone()) {
timer.stop();
dl.stop();
//loader.close();
//loader.setProgress(0);
infoLabel.setText("Cleaning graph");
setCursor(null);
stringletPanel.setGraph(dl.getGraph());
updateInfo();
updateFileInfo();
stringletPanel.repaint();
}
}
};
private boolean hideInteractions = false;
private void hideShowInteractionsEvent() {
Container content = getContentPane();
if (!hideInteractions) {
content.remove(scalerPanel);
hideShowMenuItem.setText("Show");
hideInteractions = true;
} else {
content.add("East", scalerPanel);
hideShowMenuItem.setText("Hide");
hideInteractions = false;
}
validate();
}
private void setNodeColorSet(int i) {
// stringletPanel.setNodeColorSet(i);
}
}
Ads help maintain this website.