YAV.java

  

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&uuml;rzester Wege mit Hilfe des ausgew&auml;hlten Algorithmus starten. <BR>"
                "Dabei wird der Algorithmus schrittweise durchlaufen. Um einen neuen<br>"
                "Schritt durchzuf&uuml;hren noch mal auf diese Schaltfl&auml;che klicken.</html>",
               "Ausgabe des Graphen auf dem Drucker",
               "Aufruf der YAV Hilfe"
               };

  // Tab Pane f&uuml;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(320181);
      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&uuml;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&uuml;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&auml;hlter Algorithmen zur\n"+
            "Bestimmung k&uuml;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&uuml;fen, ob eine Tollbar Aktion ausgel&ouml;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&uuml;rzesten Weg...");
           dijkstra.startDijkstra();
         else if (bellman_ford_moore.isShowing()) {
           status.setText("Bellman-Ford-Moore ermittelt den k&uuml;rzesten Weg...");
           bellman_ford_moore.startBellmanFordMoore();
         else if (floyd_warshall.isShowing()) {
           status.setText("Floyd-Warshall ermittelt den k&uuml;rzesten Weg...");
           floyd_warshall.startFloydWarshall();
         else {
           status.setText("Bitte erst zu einen Algorithmus wechseln...");
         }
    }

    // Kante l&ouml;schen
    if (quelle==toolbarButton[3]) { 
       graph.setDrawMode(4);
       status.setText("L&ouml;schmodus f&uuml;r Kanten (Graphische Ansicht)");
       toolbarButton[2].setBackground(null);
       toolbarButton[1].setBackground(null);
       toolbarButton[0].setBackground(null);
       toolbarButton[3].setBackground(Color.gray);
    }

    // Zeichenmodus f&uuml;r Kanten
    if (quelle==toolbarButton[2]) {
       graph.setDrawMode(3);
       status.setText("Zeichenmodus f&uuml;r Kanten (Graphische Ansicht)");
       toolbarButton[1].setBackground(null);
       toolbarButton[0].setBackground(null);
       toolbarButton[2].setBackground(Color.gray);
       toolbarButton[3].setBackground(null);
    }
  
    // L&ouml;schmodus f&uuml;r Knoten
    if (quelle==toolbarButton[1]) {
       graph.setDrawMode(2);
       status.setText("L&ouml;schmodus f&uuml;r Knoten (Graphische Ansicht)");
       toolbarButton[0].setBackground(null);
       toolbarButton[1].setBackground(Color.gray);
       toolbarButton[2].setBackground(null);
       toolbarButton[3].setBackground(null);
    }

    // Zeichenmodus f&uuml;r Knoten
    if (quelle==toolbarButton[0]) {
       graph.setDrawMode(1);
       status.setText("Zeichenmodus f&uuml;r Knoten (Graphische Ansicht)");
       toolbarButton[1].setBackground(null);
       toolbarButton[0].setBackground(Color.gray);
       toolbarButton[2].setBackground(null);
       toolbarButton[3].setBackground(null);
    }
    
  }

  /** Pr&uuml;fen, ob eine Look and Feel Action ausgel&ouml;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&uuml;fen, ob ein Menupunkt der Algorithmen ausgel&ouml;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&uuml;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&uuml;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&uuml;rzesten Weg...");
           floyd_warshall.startFloydWarshall();
         else {
           tabbedPane.setSelectedComponent(floyd_warshall);
           status.setText("Bitte erst Start- und Zielknoten festlegen...");
         }
    }

  }

  /** Pr&uuml;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)// &ouml;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 &uuml;berschrieben werden?",
              "Sicherheitsabfrage",
              JOptionPane.YES_NO_OPTION,
              JOptionPane.QUESTION_MESSAGE
            );
          if (ret==JOptionPane.YES_OPTIONspeichern=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;

    }

  /** &ouml;ffnen des Hilfefensters.
   */
  public void help() {
    JFrame help = new JFrame("YAV Hilfe");
      help.setLocation(200100);
      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&ouml;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 FileOutputStreamfilename );
      ObjectOutputStream o = new ObjectOutputStreamfile );  
      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&uuml;fung
    try {
          FileInputStream file = new FileInputStreamdateiname );
          ObjectInputStream o = new ObjectInputStreamfile );
          String dateiversion = (Stringo.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 SimpleDocgraph,flavor,null);
          if (dijkstra.isShowing()) doc = new SimpleDocdijkstra,flavor,null);
          if (datenansicht.isShowing()) doc = new SimpleDocadjazenzliste,flavor,null);          
          if (bellman_ford_moore.isShowing()) doc = new SimpleDocbellman_ford_moore,flavor,null);
          if (floyd_warshall.isShowing()) doc = new SimpleDocfloyd_warshall,flavor,null);
 
          if (doc!=nullpj.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(5050);
      frame.setSize(790,590);
      frame.setVisible(true);

    }
}