www.pudn.com > JAVIS-0.3.zip > SwingInterface.java
package iface;
import iface.UserInterface;
import iface.SwingPanel;
import iface.SwingSplash;
import iface.SwingPreferences;
import iface.SwingDebug;
import iface.SwingAbout;
import animation.Animation;
import animation.Scheduler;
import util.Preferences;
import util.Debug;
//import com.sun.java.swing.*;
//import com.sun.java.swing.event.*;
//import com.sun.java.swing.preview.*;
//import com.sun.java.swing.text.*;
//import com.sun.java.swing.preview.filechooser.*;
import javax.swing.*;
import javax.swing.event.*;
//import javax.swing.preview.*;
import javax.swing.text.*;
import javax.swing.filechooser.*;
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.event.*;
import java.util.Hashtable;
public class SwingInterface extends JFrame implements UserInterface,
ActionListener, ChangeListener, DocumentListener {
private JToolBar m_buttonbar,m_layoutbar;
private JButton b_play,b_stop,b_fastfwd,b_relayout,b_seek;
private JButton b_shake;
private JLabel m_time;
private JSlider m_timeinc;
private JTextField m_tension,m_iterations;
private SwingPanel m_drawpanel;
private Animation m_animation;
private SwingDebug m_debug;
private JCheckBoxMenuItem c_debug;
public SwingInterface() {
// Set title and size
super("Javis 0.2");
setSize(Preferences.window_width,Preferences.window_height);
// Build interface
buildMenuBar();
buildInterface();
setVisible(true);
// Create animation object
m_animation=new Scheduler(this);
m_drawpanel.attach(m_animation);
m_animation.setTimeInc(0.001);
if (Preferences.splash_delay>0) {
// Display our nice splash screen
// Wait a few milliseconds to make sure we get the right window
// position
try {
Thread.sleep(300);
} catch (InterruptedException e) {}
// Start splashscreen thread
Thread m_thread=new Thread(new SwingSplash(Preferences.splash_delay,
getLocationOnScreen()));
m_thread.start();
try {
m_thread.join();
}
catch (InterruptedException e) {}
}
m_debug=new SwingDebug(this);
Debug.out.attach(m_debug);
}
public void setTimeBar(double time) {
m_time.setText((new Double(time)).toString());
}
public void hideDebugConsole() {
c_debug.setState(false);
m_debug.hideme();
}
public void showDebugConsole() {
c_debug.setState(true);
m_debug.showme();
}
private void buildMenuBar() {
JMenuBar m_bar=new JMenuBar();
// "File" menu
JMenu m_file=new JMenu("File");
m_file.setMnemonic('F');
JMenuItem m_open=new JMenuItem("Open...",new ImageIcon("resources/open.gif"));
JMenuItem m_quit=new JMenuItem("Quit");
m_open.setMnemonic('O');
m_quit.setMnemonic('Q');
m_open.addActionListener(this);
m_quit.addActionListener(this);
m_file.add(m_open);
m_file.add(new JSeparator());
m_file.add(m_quit);
// "Options" menu
JMenu m_options=new JMenu("Options");
m_options.setMnemonic('O');
JMenuItem m_pref=new JMenuItem("Preferences...");
m_pref.setMnemonic('P');
m_pref.addActionListener(this);
m_options.add(m_pref);
// "View" menu
JMenu m_view=new JMenu("Window");
m_view.setMnemonic('W');
c_debug=new JCheckBoxMenuItem("Debug Console");
c_debug.addActionListener(this);
m_view.add(c_debug);
// "Help" menu
JMenu m_help=new JMenu("Help");
JMenuItem m_about=new JMenuItem("About...");
m_about.addActionListener(this);
m_help.add(m_about);
m_bar.add(m_file);
m_bar.add(m_options);
m_bar.add(m_view);
m_bar.add(m_help);
setJMenuBar(m_bar);
}
private void buildInterface() {
getContentPane().setLayout(new BorderLayout());
// Create components
m_buttonbar=buildToolBar();
m_layoutbar=buildLayoutBar();
m_drawpanel=new SwingPanel();
m_drawpanel.setBorder(BorderFactory.createLoweredBevelBorder());
// Compose the whole screen: toolbars and drawing panel
getContentPane().add(m_buttonbar,BorderLayout.NORTH);
getContentPane().add(m_layoutbar,BorderLayout.SOUTH);
getContentPane().add(m_drawpanel,BorderLayout.CENTER);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
dispose();
System.exit(0);
}});
}
private JToolBar buildToolBar() {
// Make a toolbar to add things to
JToolBar toolbar=new JToolBar();
toolbar.setFloatable(false);
toolbar.setLayout(new FlowLayout(FlowLayout.LEFT));
// Add buttons
b_play=new JButton(new ImageIcon("resources/play.gif"));
b_stop=new JButton(new ImageIcon("resources/stop.gif"));
b_fastfwd=new JButton(new ImageIcon("resources/ff.gif"));
b_seek=new JButton(new ImageIcon("resources/seek.gif"));
b_seek.setEnabled(false);
b_play.setToolTipText("Play forward");
b_stop.setToolTipText("Stop playing");
b_fastfwd.setToolTipText("Fast forward");
b_seek.setToolTipText("Seek to next event");
b_play.setMargin(new Insets(2,2,2,2));
b_stop.setMargin(new Insets(2,2,2,2));
b_fastfwd.setMargin(new Insets(2,2,2,2));
b_seek.setMargin(new Insets(2,2,2,2));
b_play.addActionListener(this);
b_stop.addActionListener(this);
b_fastfwd.addActionListener(this);
b_seek.addActionListener(this);
JPanel bpanel=new JPanel();
bpanel.setLayout(new BoxLayout(bpanel,BoxLayout.X_AXIS));
bpanel.add(b_stop);
bpanel.add(b_play);
//bpanel.add(b_fastfwd);
bpanel.add(b_seek);
bpanel.setBorder(BorderFactory.createEtchedBorder());
// Time counter
JPanel timepanel=new JPanel();
timepanel.setLayout(new BorderLayout());
m_time=new JLabel("0.0000");
m_time.setToolTipText("Current time");
timepanel.add(m_time,BorderLayout.CENTER);
timepanel.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEtchedBorder(),
BorderFactory.createEmptyBorder(0,10,0,10)));
// Time increment slider
m_timeinc=new JSlider(JSlider.HORIZONTAL,100,700,400);
m_timeinc.setPaintTicks(true);
m_timeinc.setMajorTickSpacing(100);
m_timeinc.setMinorTickSpacing(50);
m_timeinc.setPaintLabels(true);
Hashtable slidevalues=new Hashtable();
slidevalues.put(new Integer(100),new JLabel("1us"));
slidevalues.put(new Integer(400),new JLabel(".1ms"));
slidevalues.put(new Integer(700),new JLabel("1s"));
m_timeinc.setLabelTable(slidevalues);
m_timeinc.setBorder(BorderFactory.createEtchedBorder());
m_timeinc.setToolTipText("Time increment");
m_timeinc.addChangeListener(this);
// Add everything to the toolbar
toolbar.add(bpanel);
timepanel.setPreferredSize(new Dimension(125,54));
toolbar.add(timepanel);
toolbar.add(m_timeinc);
toolbar.add(Box.createGlue());
return toolbar;
}
private JToolBar buildLayoutBar() {
// Create a toolbar
JToolBar toolbar=new JToolBar();
toolbar.setLayout(new FlowLayout(FlowLayout.LEFT));
toolbar.setFloatable(false);
// Add autolayout picture
toolbar.add(new JLabel(new ImageIcon("resources/autolayout.gif")));
// Box of buttons
JPanel layoutButtonBox=new JPanel();
layoutButtonBox.setBorder(BorderFactory.createEtchedBorder());
b_relayout=new JButton("Redo");
b_shake=new JButton("Shake");
b_relayout.setToolTipText("Repeat autolayout");
b_shake.setToolTipText("Shake the network a bit");
b_relayout.addActionListener(this);
b_shake.addActionListener(this);
layoutButtonBox.add(b_relayout);
layoutButtonBox.add(b_shake);
toolbar.add(layoutButtonBox);
// Box of parameters (Force, tension)
JPanel parameterBox=new JPanel();
parameterBox.setBorder(BorderFactory.createEtchedBorder());
m_tension=new JTextField("20",4);
m_iterations=new JTextField("10",4);
m_tension.getDocument().addDocumentListener(this);
m_iterations.getDocument().addDocumentListener(this);
m_tension.setToolTipText("Contracting force on edges");
m_iterations.setToolTipText("Number of times to layout");
parameterBox.add(new JLabel("Tension"));
parameterBox.add(m_tension);
parameterBox.add(new JLabel("Iterations"));
parameterBox.add(m_iterations);
toolbar.add(parameterBox);
return toolbar;
}
public void stateChanged(ChangeEvent ce) {
JSlider source=(JSlider)ce.getSource();
if (source.getValueIsAdjusting()==false) {
double value=(double)source.getValue();
Debug.out.println("Slider value: "+value);
/*
if (value<=500000.0) {
value=(value*2.0)/1001.0+1.0;
value=value/1000000.0;
}
else {
value=value-500000.0;
value=(value*999.0)/500.0+1000.0;
value=value/1000000.0;
}*/
value=value/100.0-1;
value=Math.pow(10,value)/1000000.0;
Debug.out.println("Increment: "+value*1000000.0+" usec");
m_animation.setTimeInc(value);
}
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource()==b_play) {
m_animation.startPlaying();
b_seek.setEnabled(true);
b_relayout.setEnabled(false);
b_shake.setEnabled(false);
return;
}
else
if (ae.getSource()==b_relayout) {
m_animation.reLayout();
}
if (ae.getSource()==b_shake) {
m_animation.shake();
}
else
if (ae.getSource()==b_seek) {
m_animation.seekNext();
}
else
if (ae.getSource()==b_stop) {
m_animation.stopPlaying();
b_seek.setEnabled(false);
b_relayout.setEnabled(true);
b_shake.setEnabled(true);
return;
}
else
if (ae.getSource()==c_debug) {
if (c_debug.getState()==true)
m_debug.showme();
else
m_debug.hideme();
}
else
if (ae.getSource()==m_tension) {
System.err.println("Testio!");
}
else
if (ae.getActionCommand().equals("Quit")) {
dispose();
System.exit(0);
}
else
if (ae.getActionCommand().equals("Preferences...")) {
SwingPreferences sp=new SwingPreferences(this);
sp.show();
}
else
if (ae.getActionCommand().equals("About...")) {
SwingAbout sa=new SwingAbout(this);
sa.show();
}
else
if (ae.getActionCommand().equals("Open...")) {
JFileChooser jfc=new JFileChooser(".");
class JavisFilter extends FileFilter {
public boolean accept(java.io.File f) {
return f.isDirectory() || f.getName().endsWith(".jvs") ||
f.getName().endsWith(".nam") ||
f.getName().endsWith(".jvs.gz") ||
f.getName().endsWith(".nam.gz");
}
public String getDescription() {
return "Javis/NAM trace file";
}
}
jfc.setFileFilter(new JavisFilter());
int res=jfc.showOpenDialog(this);
if (res==0 && jfc.getSelectedFile()!=null) {
m_animation.loadFile(jfc.getSelectedFile().getAbsolutePath());
}
}
}
public void changedUpdate(DocumentEvent e) {}
public void insertUpdate(DocumentEvent e) {
removeUpdate(e);
}
public void removeUpdate(DocumentEvent e) {
// Tension parameter has been changed
if (e.getDocument()==m_tension.getDocument()) {
try {
String str=m_tension.getDocument().getText(0,
m_tension.getDocument().getLength());
int newtension=Integer.parseInt(str);
Preferences.force_tension=newtension;
Debug.out.println("New tension: "+newtension);
}
catch (Exception exc) {}
}
// Iterations parameter has been changed
if (e.getDocument()==m_iterations.getDocument()) {
try {
String str=m_iterations.getDocument().getText(0,
m_iterations.getDocument().getLength());
int newiter=Integer.parseInt(str);
Preferences.layout_iteration=newiter;
Debug.out.println("New iterations: "+newiter);
}
catch (Exception exc) {}
}
}
}
/*
class LookAndFeelListener implements ActionListener {
private JFrame m_frame;
public LookAndFeelListener(JFrame frame) {
m_frame=frame;
}
public void actionPerformed(ActionEvent ae) {
UIManager.LookAndFeelInfo[] lfInf=UIManager.getInstalledLookAndFeels();
for (int i=0;i