import java.awt.*;
import java.awt.event.*;
import java.awt.color.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import java.net.*;
import java.io.*;
import javax.swing.plaf.basic.BasicArrowButton;
import java.awt.print.PrinterJob;
import java.awt.print.*;
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import javax.swing.text.html.*;
import javax.swing.filechooser.*;
/*
* YAV (Yet another Visualiser)
* (c) 2004 by Robin Quast
* Version 1.0 (04.03.2004)
*
* erstellt im Rahmen der Diplomarbeit
* "Theorie und Java- Realisierung
* ausgewählter Algorithmen zur
* Bestimmung kürzester Wege in Graphen"
*
* betreut durch Prof. Dr. Lenze
* an der Fachhochschule Dortmund
* im SS 2003/ WS 2003/2004
*
* @(#)YAV.java 1.0 04/03/09
*/
/** Diese Klasse stellt die Hauptklasse dar. Das Programm YAV dient zur
* Erstellung von Graphen und führt bereits implementierte Algorithmen zur
* Bestimmung kürzester Wege in Graphen aus.
*/
public class YAV
extends JFrame
implements ActionListener,ChangeListener
{
String version="1.00";
JTabbedPane tabbedPane = null;
JToolBar toolbar = null;
String[] toolImages = { "/resources/node.gif",
"/resources/nonode.gif",
"/resources/line.gif",
"/resources/noline.gif",
"/resources/start.gif",
"/resources/step.gif",
"/resources/printer.gif",
"/resources/help.gif"
};
JButton[] toolbarButton = new JButton[toolImages.length];
String[] toolTipText = { "Zeichenmodus für Knoten (nur in der Graphischen Ansicht)",
"Löschmodus für Knoten (nur in der Graphischen Ansicht)",
"Zeichenmodus für Kanten (nur in der Graphischen Ansicht)",
"Löschmodus für Kanten (nur in der Graphischen Ansicht)",
"Berechnung kürzester Wege mit Hilfe des ausgewählten Algorithmus starten",
"<html>Berechnung kürzester Wege mit Hilfe des ausgewählten Algorithmus starten. <BR>"
+ "Dabei wird der Algorithmus schrittweise durchlaufen. Um einen neuen<br>"
+ "Schritt durchzuführen noch mal auf diese Schaltfläche klicken.</html>",
"Ausgabe des Graphen auf dem Drucker",
"Aufruf der YAV Hilfe"
};
// Tab Pane für den Adjazenzlistenviewer
Daten datenansicht = null;
AdjazenzlistenViewer adjazenzliste = null;
AdjazenzmatrixTable adjazenzmatrix = null;
AdjazenzmatrixTableModel adjazenzmatrix_tm = null;
DijkstraViewer dijkstra = null;
BellmanFordMooreViewer bellman_ford_moore = null;
FloydWarshallViewer floyd_warshall = null;
static String metal = "javax.swing." +
"plaf.metal.MetalLookAndFeel";
static String windows = "com.sun.java." +
"swing.plaf.windows.WindowsLookAndFeel";
static String motif = "com.sun.java.swing."+
"plaf.motif.MotifLookAndFeel";
static String mac = "javax.swing.plaf.mac.MacLookAndFeel";
JMenuBar mb = null;
// Menu und MenuItems
JMenu m_datei = null;
JMenu m_hilfe = null;
JMenu m_laf = null;
JMenu m_algorithmen = null;
// Items von m_datei
JMenuItem mi_neu = null;
JMenuItem mi_laden = null;
JMenuItem mi_speichern_als = null;
JMenuItem mi_drucken = null;
JMenuItem mi_beenden = null;
// Items von m_algorithmen
JMenu m_dijkstra = null;
JMenuItem mi_start = null;
JMenuItem mi_step = null;
JMenu m_fordmoore = null;
JMenuItem mi_bfm_start = null;
JMenuItem mi_bfm_step = null;
JMenu m_floydwarshall = null;
JMenuItem mi_fw_start = null;
JMenuItem mi_fw_step = null;
// Items von laf
JMenuItem mi_mac = null;
JMenuItem mi_metal = null;
JMenuItem mi_motif = null;
JMenuItem mi_windows = null;
// Items von m_hilfe
JMenuItem mi_hilfe = null;
JMenuItem mi_about = null;
public static Graph graph = new Graph();
public static JTextField status = null;
JFileChooser chooser;
ExampleFileFilter yavfilefilter;
/** Konstuktor
* erstellen der Frameinhalte, Menuleiste, Toolbar ...
*/
public YAV()
{
super("Yet another Visualisier");
JWindow titel = new JWindow();
String titelpath = new String("/resources/titel.jpg");
ImageIcon titelicon = new ImageIcon(getClass().getResource(titelpath));
JLabel titelbild = new JLabel(titelicon);
titel.getContentPane().add(titelbild);
titel.setLocation(320, 181);
titel.setSize(302,156);
titel.setVisible(true);
addWindowListener(new WindowClosingAdapter(true));
createYavMenu();
testAndSetLookAndFeel();
getContentPane().add("West",createToolbar());
createTabbedPanes();
// erzeuge Statuszeile
status = new JTextField("Zeichenmodus für Knoten");
status.setEditable(false);
getContentPane().add("South",status);
init();
repaint();
titel.setVisible(false);
}
/** Erzeugen des Menus
*/
private void createYavMenu() {
mb=new JMenuBar();
m_datei = new JMenu("Datei"); m_datei.setMnemonic('D');
m_algorithmen = new JMenu("Algorithmen"); m_algorithmen.setMnemonic('G');
m_laf = new JMenu("Look&Feel"); m_laf.setMnemonic('L');
m_hilfe = new JMenu("Hilfe"); m_hilfe.setMnemonic('H');
// Datei
mi_neu = new JMenuItem("Neu",KeyEvent.VK_N);
mi_laden = new JMenuItem("Laden",KeyEvent.VK_L);
mi_speichern_als = new JMenuItem("Speichern",KeyEvent.VK_A);
mi_drucken = new JMenuItem("Drucken",KeyEvent.VK_D);
mi_beenden = new JMenuItem("Beenden",KeyEvent.VK_B);
mi_neu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
mi_laden.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L, ActionEvent.CTRL_MASK));
mi_speichern_als.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
mi_drucken.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, ActionEvent.CTRL_MASK));
mi_beenden.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, ActionEvent.ALT_MASK));
m_datei.add(mi_neu);
m_datei.add(mi_laden);
m_datei.add(mi_speichern_als);
m_datei.addSeparator();
m_datei.add(mi_drucken);
m_datei.addSeparator();
m_datei.add(mi_beenden);
mi_neu.addActionListener(this);
mi_laden.addActionListener(this);
mi_speichern_als.addActionListener(this);
mi_drucken.addActionListener(this);
mi_beenden.addActionListener(this);
// Algorithmen menu
// Dijkstra
m_dijkstra = new JMenu("Dijkstra"); m_dijkstra.setMnemonic('D');
mi_start = new JMenuItem("Start",KeyEvent.VK_S);
mi_step = new JMenuItem("Step",KeyEvent.VK_P);
mi_start.addActionListener(this);
mi_step.addActionListener(this);
mi_start.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5, ActionEvent.CTRL_MASK));
mi_step.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F6, ActionEvent.CTRL_MASK));
// Ford Moore
m_fordmoore = new JMenu("Bellman-Ford-Moore"); m_fordmoore.setMnemonic('F');
mi_bfm_start = new JMenuItem("Start",KeyEvent.VK_S);
mi_bfm_step = new JMenuItem("Step",KeyEvent.VK_P);
mi_bfm_start.addActionListener(this);
mi_bfm_step.addActionListener(this);
mi_bfm_start.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F7, ActionEvent.CTRL_MASK));
mi_bfm_step.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F8, ActionEvent.CTRL_MASK));
// Floyd Warshall
m_floydwarshall = new JMenu("Floyd-Warshall"); m_floydwarshall.setMnemonic('W');
mi_fw_start = new JMenuItem("Start",KeyEvent.VK_S);
mi_fw_step = new JMenuItem("Step",KeyEvent.VK_P);
mi_fw_start.addActionListener(this);
mi_fw_step.addActionListener(this);
mi_fw_start.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F9, ActionEvent.CTRL_MASK));
mi_fw_step.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F10, ActionEvent.CTRL_MASK));
m_algorithmen.add(m_dijkstra);
m_algorithmen.add(m_fordmoore);
m_algorithmen.add(m_floydwarshall);
m_dijkstra.add(mi_start);
m_dijkstra.add(mi_step);
m_fordmoore.add(mi_bfm_start);
m_fordmoore.add(mi_bfm_step);
m_floydwarshall.add(mi_fw_start);
m_floydwarshall.add(mi_fw_step);
// Look and Feel
mi_mac = new JRadioButtonMenuItem("Macintosh");
mi_metal = new JRadioButtonMenuItem("Java",true);
mi_motif = new JRadioButtonMenuItem("Motif");
mi_windows = new JRadioButtonMenuItem("Windows");
mi_mac.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F9, ActionEvent.ALT_MASK));
mi_metal.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F10, ActionEvent.ALT_MASK));
mi_motif.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F11, ActionEvent.ALT_MASK));
mi_windows.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F12, ActionEvent.ALT_MASK));
ButtonGroup bg_laf = new ButtonGroup();
bg_laf.add(mi_mac);
bg_laf.add(mi_metal);
bg_laf.add(mi_motif);
bg_laf.add(mi_windows);
m_laf.add(mi_mac);
m_laf.add(mi_metal);
m_laf.add(mi_motif);
m_laf.add(mi_windows);
mi_mac.addActionListener(this);
mi_metal.addActionListener(this);
mi_motif.addActionListener(this);
mi_windows.addActionListener(this);
// Hilfe
mi_hilfe = new JMenuItem("Hilfe",KeyEvent.VK_I);
mi_hilfe.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0));
mi_about = new JMenuItem("About",KeyEvent.VK_A);
m_hilfe.add(mi_hilfe);
m_hilfe.addSeparator();
m_hilfe.add(mi_about);
mi_hilfe.addActionListener(this);
mi_about.addActionListener(this);
// Menus der MenuBar hinzufuegen
mb.add(m_datei);
mb.add(m_algorithmen);
mb.add(m_laf);
mb.add(m_hilfe);
m_datei.addActionListener(this);
m_algorithmen.addActionListener(this);
m_dijkstra.addActionListener(this);
m_laf.addActionListener(this);
m_hilfe.addActionListener(this);
setJMenuBar(mb);
}
/** Look and feel testen und setzen.
*/
public void testAndSetLookAndFeel() {
try {
UIManager.setLookAndFeel(windows);
} catch (Exception ex) {
mi_windows.setEnabled(false);
}
try {
UIManager.setLookAndFeel(mac);
} catch (Exception ex) {
mi_mac.setEnabled(false);
}
try
{
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) {}
}
/** Eventroutinen für ActionEvent.
*/
public void actionPerformed(ActionEvent ae) {
Object quelle = ae.getSource();
checkToolbarAction(quelle);
checkLookAndFeelMenuAction(quelle);
checkDateiMenuAction(quelle);
checkAlgorithmusMenuAction(quelle);
if (quelle == mi_about) {
Object[] button ={"Ok"};
JOptionPane.showOptionDialog(getContentPane(),
"YAV (Yet another Visualsier)\n"+
"(c) 2004 by Robin Quast\n\n"+
"erstellt im Rahmen der Diplomarbeit\n"+
"'Theorie und JAVA Realisierung\n"+
"ausgewählter Algorithmen zur\n"+
"Bestimmung kürzester Wege in Graphen\n\n"+
"betreut durch Prof. Dr. Lenze\n" +
"an der Fachhochschule Dortmund\n"+
"im WS 2003/2004 \n",
"Yet another Visualisier (c) 2004 by Robin Quast",
JOptionPane.YES_OPTION,
JOptionPane.QUESTION_MESSAGE,
new ImageIcon(getClass().getResource("/resources/about.gif")),
button,"Ok");
}
}
/** Prüfen, ob eine Tollbar Aktion ausgelöst wurde.
*/
public void checkToolbarAction(Object quelle) {
// Hilfe
if ((quelle == mi_hilfe)||(quelle == toolbarButton[7]) ){
help();
}
// Drucken
if (quelle==toolbarButton[6] || quelle==mi_drucken) {
print();
}
// Dijkstra Step Modus
// StarteStep Modus des aktuellen Algorithmusses
if (quelle==toolbarButton[5]) {
if (dijkstra.isShowing()) {
status.setText("Dijkstra wird im Step Modus gestartet...");
if (dijkstra.heapIsEmpty()) dijkstra.startDijkstraStepMode();
else dijkstra.nextDijkstraStep();
} else if (bellman_ford_moore.isShowing()) {
status.setText("Bellman-Ford-Moore wird im Step Modus gestartet...");
if (bellman_ford_moore.heapIsEmpty()) bellman_ford_moore.startBellmanFordMooreStepMode();
else bellman_ford_moore.nextBellmanFordMooreStep();
} else if (floyd_warshall.isShowing()) {
status.setText("Floyd-Warshall wird im Step Modus gestartet...");
if (floyd_warshall.reachedEnd()) floyd_warshall.startFloydWarshallStepMode();
else floyd_warshall.nextFloydWarshallStep();
} else {
status.setText("Bitte erst zu einen Algorithmus wechseln...");
}
}
// Dijkstra/ BellmanFordMoore Starten
if (quelle==toolbarButton[4] || quelle==mi_start) {
if (dijkstra.isShowing()) {
status.setText("Dijkstra ermittelt den kürzesten Weg...");
dijkstra.startDijkstra();
} else if (bellman_ford_moore.isShowing()) {
status.setText("Bellman-Ford-Moore ermittelt den kürzesten Weg...");
bellman_ford_moore.startBellmanFordMoore();
} else if (floyd_warshall.isShowing()) {
status.setText("Floyd-Warshall ermittelt den kürzesten Weg...");
floyd_warshall.startFloydWarshall();
} else {
status.setText("Bitte erst zu einen Algorithmus wechseln...");
}
}
// Kante löschen
if (quelle==toolbarButton[3]) {
graph.setDrawMode(4);
status.setText("Löschmodus für Kanten (Graphische Ansicht)");
toolbarButton[2].setBackground(null);
toolbarButton[1].setBackground(null);
toolbarButton[0].setBackground(null);
toolbarButton[3].setBackground(Color.gray);
}
// Zeichenmodus für Kanten
if (quelle==toolbarButton[2]) {
graph.setDrawMode(3);
status.setText("Zeichenmodus für Kanten (Graphische Ansicht)");
toolbarButton[1].setBackground(null);
toolbarButton[0].setBackground(null);
toolbarButton[2].setBackground(Color.gray);
toolbarButton[3].setBackground(null);
}
// Löschmodus für Knoten
if (quelle==toolbarButton[1]) {
graph.setDrawMode(2);
status.setText("Löschmodus für Knoten (Graphische Ansicht)");
toolbarButton[0].setBackground(null);
toolbarButton[1].setBackground(Color.gray);
toolbarButton[2].setBackground(null);
toolbarButton[3].setBackground(null);
}
// Zeichenmodus für Knoten
if (quelle==toolbarButton[0]) {
graph.setDrawMode(1);
status.setText("Zeichenmodus für Knoten (Graphische Ansicht)");
toolbarButton[1].setBackground(null);
toolbarButton[0].setBackground(Color.gray);
toolbarButton[2].setBackground(null);
toolbarButton[3].setBackground(null);
}
}
/** Prüfen, ob eine Look and Feel Action ausgelöst wurde.
*/
public void checkLookAndFeelMenuAction(Object quelle) {
if ((quelle == mi_mac) || (quelle == mi_metal) ||
(quelle == mi_motif) || (quelle == mi_windows)) {
// setze look and feel
if (quelle == mi_mac) {
try {
UIManager.setLookAndFeel(mac);
} catch (Exception ex) {
}
}
if (quelle == mi_metal)
{
try {
UIManager.setLookAndFeel(metal);
} catch (Exception ex) {
}
}
if (quelle == mi_motif) {
try {
UIManager.setLookAndFeel(motif);
} catch (Exception ex) {
}
}
if (quelle == mi_windows) {
try {
UIManager.setLookAndFeel(windows);
} catch (Exception ex) {
}
}
SwingUtilities.updateComponentTreeUI(this.getContentPane());
SwingUtilities.updateComponentTreeUI(this);
SwingUtilities.updateComponentTreeUI(chooser);
}
}
/** Alles YAV Variablen auf den Urpsrungszustand setzen.
*/
public void init() {
chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
chooser.setMultiSelectionEnabled(false);
yavfilefilter = new ExampleFileFilter("yav", "YAV Projektfile");
yavfilefilter.setExtensionListInDescription(true);
chooser.addChoosableFileFilter(yavfilefilter);
chooser.setAcceptAllFileFilterUsed(false);
}
/** Prüfen, ob ein Menupunkt der Algorithmen ausgelöst wurde.
*/
public void checkAlgorithmusMenuAction(Object quelle) {
// Dijkstra
if (quelle==mi_step) {
if (dijkstra.isShowing()) {
status.setText("Dijkstra wird im Step Modus gestartet...");
if (dijkstra.heapIsEmpty()) dijkstra.startDijkstraStepMode();
else dijkstra.nextDijkstraStep();
} else {
tabbedPane.setSelectedComponent(dijkstra);
status.setText("Bitte erst Start- und Zielknoten festlegen...");
}
}
if (quelle==mi_start) {
if (dijkstra.isShowing()) {
status.setText("Dijkstra ermittelt den kürzesten Weg...");
dijkstra.startDijkstra();
} else {
tabbedPane.setSelectedComponent(dijkstra);
status.setText("Bitte erst Start- und Zielknoten festlegen...");
}
}
// BellmanFordMoore
if (quelle==mi_bfm_step) {
if (bellman_ford_moore.isShowing()) {
status.setText("Bellman-Ford-Moore wird im Step Modus gestartet...");
if (bellman_ford_moore.heapIsEmpty()) bellman_ford_moore.startBellmanFordMooreStepMode();
else bellman_ford_moore.nextBellmanFordMooreStep();
} else {
tabbedPane.setSelectedComponent(bellman_ford_moore);
status.setText("Bitte erst Start- und Zielknoten festlegen...");
}
}
if (quelle==mi_bfm_start) {
if (bellman_ford_moore.isShowing()) {
status.setText("Bellman-Ford-Moore ermittelt den kürzesten Weg...");
bellman_ford_moore.startBellmanFordMoore();
} else {
tabbedPane.setSelectedComponent(bellman_ford_moore);
status.setText("Bitte erst Start- und Zielknoten festlegen...");
}
}
// FloydWarshall
if (quelle==mi_fw_step) {
if (!floyd_warshall.isShowing()) tabbedPane.setSelectedComponent(floyd_warshall);
status.setText("Floyd-Warshall wird im Step Modus gestartet...");
if (floyd_warshall.reachedEnd()) floyd_warshall.startFloydWarshallStepMode();
else floyd_warshall.nextFloydWarshallStep();
}
if (quelle==mi_fw_start) {
if (floyd_warshall.isShowing()) {
status.setText("Floyd-Warshall ermittelt den kürzesten Weg...");
floyd_warshall.startFloydWarshall();
} else {
tabbedPane.setSelectedComponent(floyd_warshall);
status.setText("Bitte erst Start- und Zielknoten festlegen...");
}
}
}
/** Prüfen, ob ein Dateimenupunkt selektiert wurde.
*/
public void checkDateiMenuAction(Object quelle) {
if (quelle == mi_neu) {
init();
graph.init();
graph.repaint();
dijkstra.init();
dijkstra.setAdjazenzliste(graph.adlist);
dijkstra.setGraphNodeList(graph.graphDaten);
dijkstra.initHeapPredecessorTable();
dijkstra.repaint();
bellman_ford_moore.init();
bellman_ford_moore.setAdjazenzliste(graph.adlist);
bellman_ford_moore.setGraphNodeList(graph.graphDaten);
bellman_ford_moore.initHeapPredecessorTable();
bellman_ford_moore.repaint();
updateFloydWarshall();
datenansicht.setAdjazenzlistenText(graph.adlist.toHtml());
datenansicht.setAdjazenzmatrix(graph.adlist);
status.setText("Daten wurden initialisiert...");
}
if (quelle == mi_laden) {
chooser.setDialogType(JFileChooser.OPEN_DIALOG); // öffnen eines Files
int retval = chooser.showDialog(this, null);
if (retval == JFileChooser.APPROVE_OPTION) {
File datei = chooser.getSelectedFile();
if ((datei.getPath().toLowerCase()).endsWith(".yav")) {
String dateiname=readFrom(datei);
if (!(dateiname=="")) {
graph.readGraphDatenFromFile(dateiname);
status.setText("Die Datei '"+datei.getPath()+"' wurde gelesen!");
}
} else {
status.setText("Die Datei '"+datei.getPath()+"' ist keine YAV Datei!");
}
}
dijkstra.setAdjazenzliste(graph.adlist);
dijkstra.setGraphNodeList(graph.graphDaten);
bellman_ford_moore.setAdjazenzliste(graph.adlist);
bellman_ford_moore.setGraphNodeList(graph.graphDaten);
updateFloydWarshall();
datenansicht.setAdjazenzlistenText(graph.adlist.toHtml());
datenansicht.setAdjazenzmatrix(graph.adlist);
graph.repaint();
datenansicht.repaint();
repaint();
}
if (quelle == mi_speichern_als) {
chooser.setDialogType(JFileChooser.SAVE_DIALOG); // speichern Dialog
int retval = chooser.showDialog(this, null);
if (retval == JFileChooser.APPROVE_OPTION) {
File datei = chooser.getSelectedFile();
boolean speichern=false;
if (datei.exists()) {
int ret = JOptionPane.showConfirmDialog(
getContentPane(),
"Die Datei '"+datei.getPath()+"' existiert. Soll Sie überschrieben werden?",
"Sicherheitsabfrage",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE
);
if (ret==JOptionPane.YES_OPTION) speichern=true;
} else {
speichern=true;
}
if (speichern) {
String dateiname=writeTo(datei);
if (!(dateiname=="")) {
graph.writeGraphDatenToFile(dateiname);
status.setText("Die Daten wurden in der Datei '"+datei.getPath()+"' gespeichert!");
}
}
}
}
//if (quelle == mi_drucken) { ... => siehe checkToolbarAction
if (quelle == mi_beenden) {
System.exit(0);
}
}
/** Erzeugen der TabbedPanes.
*/
private void createTabbedPanes() {
tabbedPane = new JTabbedPane();
tabbedPane.addTab("Graphische Ansicht", graph.getSplitPane());
datenansicht = new Daten(graph.adlist);
tabbedPane.addTab("Daten Ansicht", datenansicht);
dijkstra = new DijkstraViewer(graph.adlist,graph.graphDaten);
tabbedPane.addTab("Dijkstra", dijkstra.getSplitPane());
bellman_ford_moore = new BellmanFordMooreViewer(graph.adlist,graph.graphDaten);
tabbedPane.addTab("Bellman-Ford-Moore", bellman_ford_moore.getSplitPane());
floyd_warshall = new FloydWarshallViewer(graph.adlist,graph.graphDaten);
tabbedPane.addTab("Floyd-Warshall", floyd_warshall.getSplitPane());
/* JScrollPane sourcePane1 = createSourceCodePane("Adjazenzliste.java");
tabbedPane.addTab("Adjazenzliste Quellcode", sourcePane1);
JScrollPane sourcePane2 = createSourceCodePane("Dijkstra.java");
tabbedPane.addTab("Dijkstra Quellcode", sourcePane2);
*/
tabbedPane.addChangeListener(this);
//Add tabbedPane to this frame.
getContentPane().add(tabbedPane, BorderLayout.CENTER);
}
/** Toolbar erzeugen.
*/
private Component createToolbar() {
toolbar = new JToolBar(JToolBar.VERTICAL);
for (int i = 0; i < toolImages.length; i++) {
toolbarButton[i]=new JButton(new ImageIcon(getClass().getResource(toolImages[i])));
toolbarButton[i].setToolTipText(toolTipText[i]);
toolbarButton[i].addActionListener(this);
toolbar.add(toolbarButton[i]);
}
toolbarButton[0].setBackground(Color.gray);
toolbar.add(Box.createVerticalGlue());
return toolbar;
}
/** SourceCode Pane erzeugen. (Ist zur Zeit deaktiviert. Der Source Code
* ist in der Hilfe zu finden, oder im Unterverzeichnis src.
*/
protected JScrollPane createSourceCodePane(String filename) {
JEditorPane srcPane = null;
// Add html src code viewer
String sourceCode=loadSourceCode(filename);
srcPane = new JEditorPane("text/html", sourceCode);
srcPane.setEditable(false);
JScrollPane scroller = new JScrollPane();
scroller.getViewport().add(srcPane);
return scroller;
}
/** öffnen des Hilfefensters.
*/
public void help() {
JFrame help = new JFrame("YAV Hilfe");
help.setLocation(200, 100);
help.setSize(600,500);
YAVHelp htmlhelp = new YAVHelp();
help.setContentPane(htmlhelp);
help.setVisible(true);
}
/** SourceCode formattiert laden.
*/
public String loadSourceCode(String filename) {
String sourceCode="";
sourceCode = new String("<html><body bgcolor=\"#ffffff\"><pre>");
char[] buff = new char[50000];
InputStream is;
InputStreamReader isr;
CodeViewer cv = new CodeViewer();
URL url;
try {
url = getClass().getResource(filename);
is = url.openStream();
isr = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(isr);
// Read one line at a time, htmlize using super-spiffy
// html java code formating utility from www.CoolServlets.com
String line = reader.readLine();
while(line != null) {
sourceCode += cv.syntaxHighlight(line) + " \n ";
line = reader.readLine();
}
sourceCode += new String("</pre></body></html>");
} catch (Exception ex) {
sourceCode = "Could not load file: " + filename;
}
return sourceCode;
}
/** Hier hat ein Wechsel der TabPanes stattgefunden und dieses Ereignis
* ausgelöst.
*/
public void stateChanged (ChangeEvent e) {
graph.adlist.sortEdgeLists();
datenansicht.setAdjazenzlistenText(graph.adlist.toHtml());
datenansicht.setAdjazenzmatrix(graph.adlist);
graph.repaint();
datenansicht.repaint();
updateFloydWarshall();
}
/** Daten speichern.
*/
public String writeTo(File datei) {
String filename = datei.getPath();
if (!(filename.toLowerCase()).endsWith(".yav")) filename+=".yav";
try {
FileOutputStream file = new FileOutputStream( filename );
ObjectOutputStream o = new ObjectOutputStream( file );
o.writeObject(version);
} catch (IOException e) {
YAV.status.setText(e.getMessage());
}
String rc=filename.substring(0,(filename.toLowerCase()).lastIndexOf(".yav"));
return rc;
}
/** Daten laden.
*/
public String readFrom(File datei) {
String dateiname=datei.getPath();
if (!((datei.getPath().toLowerCase()).endsWith(".yav"))) {
dateiname+=".yav";
}
String rc=dateiname.substring(0,(dateiname.toLowerCase()).lastIndexOf(".yav"));
// routine zur Versionsprüfung
try {
FileInputStream file = new FileInputStream( dateiname );
ObjectInputStream o = new ObjectInputStream( file );
String dateiversion = (String) o.readObject();
if (!(dateiversion.compareTo(version)==0)) {
status.setText("Datei "+dateiname+" nicht gelesen! Versionskonflikt!");
rc="";
}
} catch ( IOException e ) {
YAV.status.setText(e.getMessage());
rc="";
} catch (ClassNotFoundException e) {
YAV.status.setText(e.getMessage());
rc="";
}
return rc;
}
/** Ausgabe auf den Drucker einleiten.
*/
public void print() {
// Drucken mit java 1.4
DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(MediaSizeName.ISO_A4);
try {
PrintService prservDflt = PrintServiceLookup.lookupDefaultPrintService();
PrintService[] prservices = PrintServiceLookup.lookupPrintServices(flavor,aset);
if (null== prservices || 0>= prservices.length) { // default printer oder kein printer
status.setText("Daten werden an den Drucker geschickt...");
} else { // drucken
PrintService prserv = null;
prserv=ServiceUI.printDialog(null,50,50,prservices,prservDflt,null,aset);
if (prserv!=null) {
DocPrintJob pj = prserv.createPrintJob();
Doc doc = null;
if (graph.isShowing()) doc = new SimpleDoc( graph,flavor,null);
if (dijkstra.isShowing()) doc = new SimpleDoc( dijkstra,flavor,null);
if (datenansicht.isShowing()) doc = new SimpleDoc( adjazenzliste,flavor,null);
if (bellman_ford_moore.isShowing()) doc = new SimpleDoc( bellman_ford_moore,flavor,null);
if (floyd_warshall.isShowing()) doc = new SimpleDoc( floyd_warshall,flavor,null);
if (doc!=null) pj.print(doc,aset);
/* if (datenansicht.isShowing()) {
doc = new SimpleDoc( adjazenzmatrix,flavor,null);
if (doc!=null) pj.print(doc,aset);
}
*/
}
}
} catch (PrintException pe) {
System.err.println(pe);
} /*catch (IOException ie) {
System.out.println(ie);
}*/
status.setText("Druckausgabe beendet.");
}
/** Floyd Warshall erneut initialisieren.
*/
public void updateFloydWarshall() {
floyd_warshall.init();
floyd_warshall.setAdjazenzliste(graph.adlist);
floyd_warshall.setAdjazenzPredecessorMatrix(graph.adlist);
floyd_warshall.setGraphNodeList(graph.graphDaten);
floyd_warshall.repaint();
}
/** Startmethode.
*/
public static void main(String[] args)
{
YAV frame = new YAV();
frame.setLocation(50, 50);
frame.setSize(790,590);
frame.setVisible(true);
}
}
|