/************************************************************/ /* Dialoge.java Version 2003/03/28 */ /* */ /* Tom Fellmann, Christoph Weißenborn */ /* */ /************************************************************/ import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; import javax.swing.text.*; /********************************************************************/ /* Klasse NeuDialog -- Anlegen eines Netzes */ /********************************************************************/ class NeuDialog extends JDialog{ protected int FarbAnzahl = 0; private JPanel panel1; private JPanel inPanel1; private myJButton button1; private myJButton button2; private JPanel panel2; private JPanel inPanel2; private JSlider slider; private myJLabel number; /******************************/ /* Konstruktor */ /******************************/ public NeuDialog(Frame parent, String titel) { super(parent, titel, false); enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { init(); } catch (Exception e) { e.printStackTrace(); } }//NeuDialog-Konstruktor private void init() throws Exception { //Initialisierung der Komponenten setResizable(true); setModal(true); number = new myJLabel( "3"); slider = new JSlider(JSlider.HORIZONTAL, Netz.MIN_FARBANZAHL, Netz.MAX_FARBANZAHL, 3); slider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { number.setText( ""+ slider.getValue()); } }); slider.setPaintTrack( true); slider.setMajorTickSpacing( 2); slider.setPaintTicks( true); slider.setMinorTickSpacing( 1); slider.setSnapToTicks(true); panel2 = new JPanel(new BorderLayout()); panel2.setBorder(new EmptyBorder(10,10,10,10)); inPanel2 = new JPanel(new GridLayout(2,2,10,0)); inPanel2.setBorder(new EmptyBorder(10,10,10,10)); inPanel2.add(new myJLabel("Anzahl der Farben:")); inPanel2.add(number); //myJLabel("3") inPanel2.add(new myJLabel("(maximal "+ Netz.MAX_FARBENDARSTELLANZ+" darstellbar)")); //inPanel2.add(slider); //JSlider(horiz, min, max, 3) panel2.add(inPanel2, BorderLayout.NORTH); panel2.add(slider, BorderLayout.CENTER); button1 = new myJButton("OK", "neues Netz anlegen", new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getSource()==button1) ok(); } }); button2 = new myJButton("Abbrechen", new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getSource()==button2) cancel(); } }); panel1 = new JPanel(new BorderLayout()); inPanel1 = new JPanel(new FlowLayout()); inPanel1.add(button1); //OK-Button inPanel1.add(button2); //Abbrechen-Button panel1.add(inPanel1, BorderLayout.SOUTH); panel1.add(panel2, BorderLayout.CENTER); getContentPane().add(panel1); getRootPane().setDefaultButton( button1); }//init protected void processWindowEvent(WindowEvent e) { //überschrieben, damit ein Beenden beim Schließen des Fensters möglich ist. if (e.getID() == WindowEvent.WINDOW_CLOSING) cancel(); super.processWindowEvent(e); }//processWindowEvent public void show() { pack(); Rectangle r = new Rectangle( getSize()); r.add( 365, 175); //nach pack: 348, 167 if( new Rectangle( Petri.screenSize).contains( r) ) setSize( r.width, r.height); setLocation( Petri.calculateDimensions_getGlobalLocation( getSize(), getParent())); slider.setValue( 3); FarbAnzahl = -1; getRootPane().setDefaultButton( button1); super.show(); }//show private void ok() { FarbAnzahl = slider.getValue(); hide(); }//ok public void cancel() { FarbAnzahl = -1; hide(); }//cancel }//NeuDialog class PlatzDialog extends JDialog{ private int FarbAnzahl; private Platz bearbeitePlatz; private JPanel panel1; private JPanel inPanel1; private myJButton button1; private myJButton button2; private JPanel panel2; private JPanel inPanel21; private JPanel inPanel31; private JPanel inPanel32; private JTextField eingabeTF; private JTextField[] eingabeTFMarken; private JTextField[] eingabeTFKapazitaet; /******************************/ /* Konstruktor */ /******************************/ public PlatzDialog(Platz einstellPlatz) { super( Petri.frame, "Eigenschaften - Platz", false); bearbeitePlatz = einstellPlatz; enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { init(); } catch (Exception e) { e.printStackTrace(); } }//KanteDialog-Konstruktor private void init() throws Exception { //Initialisierung der Komponenten FocusListener TF_FocusListener = new TextFieldFocusListener(); FarbAnzahl = bearbeitePlatz.getKopieMarken().getAnz(); (eingabeTF = new JTextField( new String( bearbeitePlatz.getText()))).addFocusListener( TF_FocusListener); eingabeTFMarken = new JTextField[ FarbAnzahl]; eingabeTFKapazitaet = new JTextField[ FarbAnzahl]; setResizable(true); setModal(true); panel2 = new JPanel(new BorderLayout()); panel2.setBorder(new EmptyBorder(20,20,20,20)); inPanel21 = new JPanel(new GridLayout(1,2,10,0)); inPanel21.setBorder(new EmptyBorder(0,0,10,0)); inPanel21.add(new myJLabel("Beschriftung:")); inPanel21.add(eingabeTF); panel2.add(inPanel21, BorderLayout.NORTH); inPanel21 = new JPanel(new BorderLayout(10,0)); inPanel31 = new JPanel(new GridLayout(FarbAnzahl+1,1,0,2)); inPanel32 = new JPanel(new GridLayout(FarbAnzahl+1,2,10,2)); inPanel31.add(new myJLabel("Farbe"), null); inPanel32.add(new myJLabel("Marken"), null); inPanel32.add(new myJLabel("Kapazität"), null); Tupel Marken = bearbeitePlatz.getKopieMarken(); Tupel Kapaz = bearbeitePlatz.getKopieKapazitaetMarken(); for( int i=0; i0) ? Integer.parseInt( eingabeText): 0 ; eingabeText = eingabeTFKapazitaet[i].getText(); neueKapazitaet[i] = (eingabeText.length()>0) ? Integer.parseInt( eingabeText): 0 ; } neuMarkenTupel = new Tupel( neueMarken); neuKapazTupel = new Tupel( neueKapazitaet); if( !neuKapazTupel.ArgumentKleinerGleich( minWerte) || !maxKapaz.ArgumentKleinerGleich(neuKapazTupel) ){ PetriFrame.Mitteilung( "Die Kapazität muß im Bereich von 0 bis 99 liegen!", "Werte pruefen", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE); for( i=0; ineuKapazTupel.getWert(i)) || (neuKapazTupel.getWert(i)>maxKapaz.getWert(i)) ) break; eingabeTFKapazitaet[i].requestFocus(); return; } if( !neuMarkenTupel.ArgumentKleinerGleich( minWerte) || !neuKapazTupel.ArgumentKleinerGleich( neuMarkenTupel)) { PetriFrame.Mitteilung( "Die Marken müssen positiv sein und die Kapazitätsbeschränkung einhalten!", "Werte pruefen", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE); for( i=0; ineuMarkenTupel.getWert(i)) || (neuMarkenTupel.getWert(i)>neuKapazTupel.getWert(i)) ) break; eingabeTFMarken[i].requestFocus(); return; } /* erst alle Fehlermöglichkeiten ausschließen, danach (gültige) Werte eintragen */ bearbeitePlatz.TextAendern( eingabeTF.getText()); if( bearbeitePlatz.KapazitaetZuweisen( neuKapazTupel) && bearbeitePlatz.MarkenZuweisen( neuMarkenTupel)) { Petri.frame.jStatusBar.setText("Eigenschaften des Platzes <"+ bearbeitePlatz.getText()+ "> erfolgreich geändert."); Petri.frame.gefNetz.setVeraendert( true, false); hide(); } } catch(Exception e) { PetriFrame.Mitteilung( "Die Eingabewerte konnten nicht erfolgreich intepretiert werden!", "Werte pruefen", PetriFrame.WEITER_OPTION, JOptionPane.ERROR_MESSAGE); } }//ok public void cancel() { //Dialog schließen Petri.frame.jStatusBar.setText("Ändern der Eigenschaften des Platzes <"+ bearbeitePlatz.getText()+"> abgebrochen."); hide(); }//cancel }//PlatzDialog class TransDialog extends JDialog{ private Transition bearbeiteTrans; private JPanel panel1; private JPanel inPanel1; private myJButton button1; private myJButton button2; private JPanel panel2; private JPanel inPanel2; private JTextField eingabeTF; /******************************/ /* Konstruktor */ /******************************/ public TransDialog(Transition eineTrans) { super( Petri.frame, "Eigenschaften - Transition", false); bearbeiteTrans = eineTrans; enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { init(); } catch (Exception e) { e.printStackTrace(); } }//KanteDialog-Konstruktor private void init() throws Exception { //Initialisierung der Komponenten FocusListener TF_FocusListener = new TextFieldFocusListener(); (eingabeTF = new JTextField( new String( bearbeiteTrans.getText()))).addFocusListener( TF_FocusListener); setResizable( true); setModal(true); panel2 = new JPanel( new BorderLayout()); panel2.setBorder( new EmptyBorder(20,20,20,20)); inPanel2 = new JPanel( new GridLayout(1,2,10,0)); inPanel2.setBorder(new EmptyBorder(0,0,10,0)); inPanel2.add( new myJLabel("Beschriftung:")); inPanel2.add( eingabeTF); panel2.add( inPanel2, BorderLayout.NORTH); button1 = new myJButton( "OK", "Eigenschaften Übernehmen", new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getSource()==button1) ok(); } }); button2 = new myJButton( "Abbruch", new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getSource()==button2) cancel(); } }); panel1 = new JPanel( new BorderLayout()); inPanel1 = new JPanel( new FlowLayout()); inPanel1.add( button1); inPanel1.add( button2); panel1.add( inPanel1, BorderLayout.SOUTH); panel1.add( panel2, BorderLayout.CENTER); getContentPane().add(panel1, null); getRootPane().setDefaultButton( button1); }//init protected void processWindowEvent(WindowEvent e) { //überschrieben, damit ein Beenden beim Schließen des Fensters möglich ist. if (e.getID() == WindowEvent.WINDOW_CLOSING) cancel(); super.processWindowEvent(e); }//processWindowEvent public void show() { pack(); Rectangle r = new Rectangle( getSize()); r.add(275,145); //nach pack: 228, 142 if( new Rectangle( Petri.screenSize).contains( r) ) setSize( r.width, r.height); setLocation( Petri.calculateDimensions_getGlobalLocation( getSize(), getParent())); super.show(); }//show public void ok() { try{ bearbeiteTrans.TextAendern( eingabeTF.getText()); Petri.frame.jStatusBar.setText("Eigenschaften der Transition <"+ bearbeiteTrans.getText()+ "> erfolgreich geändert."); Petri.frame.gefNetz.setVeraendert( true, false); hide(); } catch(Exception e) { PetriFrame.Mitteilung( "Die Eingabewerte konnten nicht erfolgreich intepretiert werden!", "Werte pruefen", PetriFrame.WEITER_OPTION, JOptionPane.ERROR_MESSAGE); } }//ok public void cancel() { //Dialog schließen Petri.frame.jStatusBar.setText("Ändern der Eigenschaften der Transition <"+ bearbeiteTrans.getText()+"> abgebrochen."); hide(); }//cancel }//TransDialog class KanteDialog extends JDialog{ private int FarbAnzahl; private Kante bearbeiteKante; private JPanel panel1; private JPanel inPanel1; private myJButton button1; private myJButton button2; private JPanel panel2; private JPanel inPanel21; private JPanel inPanel31; private JPanel inPanel32; private JPanel inPanel22; private JPanel panel3; private JTextField eingabeTF; private JTextField[] eingabeTFwanderMarken; /******************************/ /* Konstruktor */ /******************************/ public KanteDialog(Kante eineKante) { super( Petri.frame, "Eigenschaften - Kante", false); bearbeiteKante = eineKante; enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { init(); } catch (Exception e) { e.printStackTrace(); } }//KanteDialog-Konstruktor private void init() throws Exception { //Initialisierung der Komponenten FocusListener TF_FocusListener = new TextFieldFocusListener(); FarbAnzahl = bearbeiteKante.getKopieMarkenFluss().getAnz(); (eingabeTF = new JTextField( new String( bearbeiteKante.getText()))).addFocusListener( TF_FocusListener); eingabeTFwanderMarken = new JTextField[Netz.MAX_FARBANZAHL]; setResizable(true); setModal(true); panel2 = new JPanel(new BorderLayout()); panel2.setBorder(new EmptyBorder(20,20,20,20)); inPanel21 = new JPanel(new GridLayout(1,2,10,0)); inPanel21.setBorder(new EmptyBorder(0,0,10,0)); inPanel21.add(new myJLabel("Beschriftung:")); inPanel21.add(eingabeTF); panel2.add(inPanel21, BorderLayout.NORTH); inPanel21 = new JPanel(new BorderLayout(10,0)); inPanel31 = new JPanel(new GridLayout(FarbAnzahl+1,1,0,2)); inPanel32 = new JPanel(new GridLayout(FarbAnzahl+1,1,0,2)); inPanel31.add(new myJLabel("Farbe")); inPanel32.add(new myJLabel("Marken")); Tupel Marken = bearbeiteKante.getKopieMarkenFluss(); for(int i=0; i0) ? Integer.parseInt( eingabeText): 0 ; } neuTupel = new Tupel( neueWerte); if( !neuTupel.ArgumentKleinerGleich( minWerte) || !maxKapaz.ArgumentKleinerGleich( neuTupel) ){ PetriFrame.Mitteilung( "Die Markenanzahl muß im Bereich von 0 bis 99 liegen!", "Werte pruefen", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE); for( i=0; ineuTupel.getWert(i)) || (neuTupel.getWert(i)>maxKapaz.getWert(i)) ) break; eingabeTFwanderMarken[i].requestFocus(); return; } if( bearbeiteKante.MarkenZuweisen( neuTupel) ){ Petri.frame.jStatusBar.setText("Eigenschaften der Kante <"+ bearbeiteKante.getText()+ "> erfolgreich geändert."); Petri.frame.gefNetz.setVeraendert( true, false); hide(); } } catch (Exception e) { PetriFrame.Mitteilung( "Die Eingabewerte konnten nicht erfolgreich intepretiert werden!", "Werte pruefen", PetriFrame.WEITER_OPTION, JOptionPane.ERROR_MESSAGE); } }//ok public void cancel() { //Dialog schließen Petri.frame.jStatusBar.setText("Ändern der Eigenschaften der Kante <"+ bearbeiteKante.getText()+"> abgebrochen."); hide(); }//cancel }//KanteDialogDialog class HilfeDialog extends JDialog{ private JPanel panel1; private JPanel inPanel1; private myJButton button1; private JEditorPane jEditorPane; private JScrollPane jScrollPane; private boolean zuerst = true; /******************************/ /* Konstruktor */ /******************************/ public HilfeDialog(Frame parent, String titel) { super(parent, titel, false); enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { init(); } catch (Exception e) { e.printStackTrace(); } }//HilfeDialog-Konstruktor private void init() throws Exception { //Initialisierung der Komponenten setResizable(true); setModal(false); jEditorPane = new JEditorPane( "text/html", ""); jEditorPane.setText( "

Menü

"+ "Unter Datei findet man die üblichen Funktionen zum Öffnen, Schließen, Speichern usw. einer Datei.
"+ "Bei Bearbeiten kann man die Auswahl treffen ob man Plätze, Transitionen und Kanten anlegen oder entfernen möchte.
"+ "Ansicht ermöglicht die Auswahl zwischen Kanten-Matrix bzw. Platz-Matrix An- und Auszuschalten. Dies soll einer besseren "+ "Übersicht dienen.
"+ "Unter Simulation kann man das Petri-Netz zum Schalten bringen und dies auch wieder beenden.


"+ "

Anlegen von Plätzen, Transitionen und Kanten

"+ "Um Plätze, Transitionen oder Kanten anzulegen, muss man zuerst im Menü auf 'Datei | Neu' gehen. Dann wählt "+ "man die Anzahl der zur Verfügung stehenden Farben (für die bunten Marken) aus. Und schon kann es losgehen!
"+ "Es gibt 2 Möglichkeiten Plätze, Transitionen und Kanten anzulegen. Entweder man geht im Menü auf 'Bearbeiten "+ "| Anlegen' oder man klickt mit der rechten Maustaste auf die "Zeichen"-fläche. Daraufhin erscheint in beiden "+ "Fällen ein (Kontekt)-Menü. Darin kann man 'Plätze', 'Transitionen' oder 'Kanten' auswählen. Im "+ "Anschluß daran können dann neue Exemplare der ausgewählten Art im Netz abgelegt werden.
"+ "Dazu wird der Mauszeiger zu einem Zielkreuz. So kann man feststellen, das man sich gerade im "Anlege"-Modus "+ "befindet. Im Zweifelsfall gibt die Statuszeile auch Auskunft darüber.
"+ "Das Anlegen der Kanten ist, im Gegensatz zu Plätzen und Transitionen, etwas komplizierter. Das liegt daran, daß eine "+ "Kante stets einen Start- und einen Endpunkt benötigt. Unter den beiden Punkten müssen genau ein Platz und genau "+ "eine Transition sein. Da Kanten eine Richtung haben, ist auch die Reihenfolge (Start -> Ende) wichtig. Die Kante macht das "+ "mit einem Pfeil deutlich.


"+ "

Entfernen von Plätzen, Transitionen und Kanten

"+ "Um Plätze, Transitionen oder Kanten zu entfernen, gibt es auch wieder zwei Möglichkeiten. Entweder man geht im "+ "Menü auf 'Bearbeiten | Entfernen' oder man klickt mit der rechten Maustaste auf die Oberfläche. Daraufhin "+ "erscheint, wie oben bereits erwähnt, das (Kontekt)-Menü. Dort wählt man zwischen 'Plätzen', "+ "'Transitionen' und 'Kanten' aus. Im Anschluß daran bleibt der Mauszeiger jedoch "normal". Ein folgendes "+ "Abfragefenster möchte vor versehentlichem Löschen schützen.


"+ "

Ändern der Eigenschaften von Plätzen, Transitionen und Kanten

"+ "Um die Eigenschaften von Plätzen, Transitionen oder Kanten ändern zu können, bedient man sich wieder dem "+ "(Kontekt)-Menü. Danach genügt ein Doppelklick auf die entsprechende Komponente des Petrinetzes. Was folgt, ist ein "+ "passender Dialog. Dort kann man alle änderbaren Eigenschaften der ausgewählten Komponente bearbeiten. Mit 'OK' "+ "bestätigt man die vorgenommenen Änderungen. Dabei gelten die folgenden:


"+ "

Regeln für die Marken und Kapazitäten

"+ "Marken sind kleine runde Scheiben, die hier eine Farbe annehmen können. Wieviele verschiedene Farben zur Auswahl stehen, "+ "wird beim Anlegen eines (neuen) Netzes festgelegt. Allen Plätzen und Kanten kann man solche bunten Marken zuordnen. Bei "+ "Plätzen zusätzlich auch noch eine Kapazität von Marken.
"+ "Man kann sich die Plätze als ein Lager für bunte Marken vorstellen. Wie in der realen Welt sind hier aber auch die "+ "Resourcen knapp. Also ist der "Speicherplatz" für jeden Platz durch seine Kapazität beschränkt. Die "+ "Kanten könnten auch als Transportbänder aufgefaßt werden (allerdings sind diese unendlich schnell). So "+ "können über eine Kante bestimmte Marken transportiert werden. Welche, das gibt das Marken-Tupel der Kante an. Wann "+ "etwas fließt/transportiert wird, wird bei der Erklärung der Simulation beschrieben.


"+ "

Verschieben von Plätzen und Transitionen

"+ "Um Plätze und Transitionen verschieben zu können, muß man im Eingabe-Modus sein. Während einer "+ "Simulation ist dies nicht möglich. Das Verschieben wird mit Niederdrücken der linken Maustaste gestartet. Mit noch "+ "gedrückter Maustaste wird das entsprechende Objekt an eine neue Position geführt. Dabei sollte die Nähe zu "+ "anderen Objekten beachtet werden.
"+ "Während dem Anlegen und Entfernen von Netz-Komponenten ist das Verschieben aus technischen Gründen nicht immer "+ "möglich. Beim Ändern der Eigenschaften ist es hingegen stets unproblematisch. Probieren Sie es aus! Die Benutzung "+ "ist ziemlich intuitiv.


"+ "

Simulation starten

"+ "Zum Start der Simulation muß ein neues Netz angelegt oder eines geladen sein. Danach wählt man im Menü "+ "'Simulation | Starten' aus. Daraufhin werden alle schaltfähigen Transitionen farbig dargestellt. Die Auswahl der zu "+ "schaltenden Transition erfolgt mit einem Klick der linken Maustaste.
"+ "Eine Transition ist schaltfähig, wenn zwei Bedingungen erfüllt sind. Die eine wird Vor- und die andere "+ "Nachbedingung genannt. Zur Vorbedingung muß jede Vorkante der Transition aus ihrem zugeordneten Platz genügend "+ "Marken entnehmen können. Welche Marken, das gibt das, der Kante zugeordnete, Marken-Tupel an. Als Vorkanten werden "+ "diejenigen Kanten bezeichnet, die von einem Platz zu einer Transition verlaufen. Die Nachkanten sind entsprechend die "+ "Kanten, die von einer Transition weg und hin zu einem Platz gehen. Die Nachbedingung umfaßt nun alle Nachkanten der "+ "Transition. Entsprechend der Marken, die zu einer Nachkante gehören, müssen am Platz der Nachkante noch "+ "ausreichend freie Kapazitäten vorhanden sein.
"+ "Nochmal, kurz zusammengefaßt: alle Kanten an einer Transition müssen entsprechende Marken holen bzw. wegbringen "+ "können.


"+ "

Petri-Netz Speichern

"+ "Um ein Petri-Netz zu speichern, geht man ganz einfach im Menü auf 'Datei | Speichern' bzw. 'Datei | Speichern unter'. "+ "Gegebenenfalls wählt man noch ein Verzeichnis und einen Namen für das Petri-Netz aus und drückt schließlich "+ "'Save'.


"+ "

Petri-Netz Öffnen

"+ "Zum Öffnen eines Petri-Netzes, wählt man im Menü 'Datei | Öffnen', sucht das Verzeichnis und den Namen "+ "des Petri-Netzes aus. Mit 'Open' wird dann das Lesen der Datei gestartet.


"+ "

Autoren: Chr. Weißenborn & Tom Fellmann"+ ""); jEditorPane.setEditable( false); jEditorPane.setEnabled( false); button1 = new myJButton("OK", "Schließen", new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getSource()==button1) cancel(); } }); panel1 = new JPanel(new BorderLayout()); panel1.setBorder( new EmptyBorder(5,5,5,5)); inPanel1 = new JPanel(new FlowLayout()); inPanel1.add(button1); //OK-Button panel1.add( inPanel1, BorderLayout.SOUTH); panel1.add( jScrollPane = new myJScrollPane(jEditorPane), BorderLayout.CENTER); Dimension altegroesse = getSize(); setSize( 0, 0); show(); hide(); setSize( altegroesse); getContentPane().add(panel1); getRootPane().setDefaultButton( button1); jScrollPane.requestDefaultFocus(); }//init protected void processWindowEvent(WindowEvent e) { //überschrieben, damit ein Beenden beim Schließen des Fensters möglich ist. if (e.getID() == WindowEvent.WINDOW_CLOSING) cancel(); super.processWindowEvent(e); }//processWindowEvent public void show() { if( !zuerst ){ Rectangle r = new Rectangle( getSize()); r.add( Petri.screenSize.width*3/5, Petri.screenSize.height*3/5); if( new Rectangle( Petri.screenSize).contains( r) ) setSize( r.width, r.height); setLocation( Petri.calculateDimensions_getGlobalLocation( getSize(), getParent())); } else zuerst = false; jScrollPane.getViewport().setViewPosition( new Point( 0, 0)); jScrollPane.requestFocus(); super.show(); }//show public void cancel() { hide(); }//cancel }//HilfeDialog class DefDialog extends JDialog{ private JPanel panel1; private JPanel inPanel1; private myJButton button1; private JEditorPane jEditorPane; private JScrollPane jScrollPane; private boolean zuerst = true; /******************************/ /* Konstruktor */ /******************************/ public DefDialog(Frame parent, String titel) { super(parent, titel, false); enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { init(); } catch (Exception e) { e.printStackTrace(); } }//DefDialog-Konstruktor private void init() throws Exception { //Initialisierung der Komponenten setResizable(true); setModal(false); jEditorPane = new JEditorPane("text/html", ""); jEditorPane.setText( "

Petri-Netze (mit gefärbten Marken)

"+ "

Formlos:

"+ "Bei gefärbten Petrinetzen wird jeder Marke ein Attribut zugeordnet, im allgemeinen Farbe genannt.
"+ "Hier wird davon ausgegangen, daß die Anzahl der benutzten, verschiedenen Farben mit n festgelegt ist. So läßt "+ "sich die Kapazität eines Platzes als ein n-Tupel angeben. In diesem n-Tupel wird für jede Farbe die Kapazität "+ "durch eine Zahl repräsentiert.
"+ "Eine Belegung von Marken für den Platz kann auch als n-Tupel angegeben werden. Ebenso gibt es für jede Kante ein "+ "n-Tupel. Dabei handelt es sich um die Marken, die beim Schalten/Feuern über diese Kante fließen.


"+ "

Definition:

"+ "Ein gefärbtes Petrinetz (CP-Netz) ist ein Tupel CPN = (n, P, T, B, F, K, S, I) mit folgenden Eigenschaften:
"+ "1) n ist eine positive Zahl (gibt Anzahl der Farben an);
"+ //TODO: ab hier die Sonderzeichen & Umlaute ändern! "2) Sigma sei die Menge aller n-Tupel von nichtnegativen Zahlen;
"+ "3) P ist eine endliche Menge von Stellen (auch Platz genannt);
"+ "4) T ist eine endliche Menge von Transitionen, T vereinigt P = Ø;
"+ "5) B ist eine endliche Menge von Kanten (auch Bogen genannt), B vereinigt T= B vereinigt T = Ø;
"+ "6) F: B -> (PxT) vereinigt (TxP) ist eine Flußrelation (beschreibt Kanten);
"+ "7) K: P -> Sigma ist eine Platz-Farb-Relation (gibt Platzkapazität an), Für alle p Element von P: Es gibt ein K(p);
"+ "8) S: B -> Sigma ist eine Kanten-Farb-Relation, (gibt Marken an, die beim Schalten über die Kante fließenden), Für alle b "+ "Element von B: Es gibt ein S(b);
"+ "9) I: P-> Sigma ist die Anfangsmarkierung, Für alle p Element von P: (Es gibt ein I(p) - I(p)<=K(p)#).


"+ "

Transitionsregel

"+ "

Formlos:

"+ "Wie bei ungefärbten Petrinetzen müssen für einen Schritt alle Vor- und Nachbedingungen der zu schaltenden Transition "+ "erfüllt sein. Bei einem gefärbten Petrinetz bedeutet das folgendes:
"+ "Ein Schritt wird in einem bestimmten Zustand genau dann möglich, wenn
"+ "(1): entlang aller Kanten, die zu einer Transition hinführen, entsprechend der Beschriftung ausreichend farbige "+ "Marken (von allen beteiligten Plätzen) abtransportiert/gelöscht werden können, und
"+ "(2): alle Plätze derjenigen Kanten, die von der Transition wegführen, entsprechend der jeweiligen Kantenbeschriftung, "+ "auch genügend freie Kapazitäten passender Farbe aufweisen.
"+ "In einem bestimmten Zustand können mehrere Schritte möglich sein.


"+ "

Definition:

"+ "Hierzu sind noch andere Begriffe notwendig.
"+ "1) Zustand
"+ "In jedem Zustand M: P -> Sigma gilt: Für alle p Element von P: (Es gibt ein M(p) - M(p)<=K(p)#).
"+ "2) Schritt
"+ "Ein Schritt Y stellt eine Transition t Element von T und einen Zustand m0 in Relation zu einem Folgezustand m1. (Er "+ "beschreibt also das Schalten von t im Zustand m0.)
"+ "3) Transitionsregel
"+ "Im Zustand m0 heißt ein Schritt Y mit der Transition t Element von T genau dann möglich, wenn
Für alle p Element von P: "+ "( Für alle b Element von B mit F(b)=(p,t)): S(b)<=m0(p) - (Für alle b Element von B mit F(b)=(t,p)): m0(p)+S(b)=K(p))##.
"+ "Man sagt dann auch, t ist in m0 möglich. Sind nun zwei Schritte in m0 mit Transition t1 bzw. t2 möglich, so heißen t1 und "+ "t2 gleichzeitig möglich.
"+ "Der Folgezustand m1 von einem möglichen Schritt Y mit m0 und t ergibt sich wie folgt:
Für alle p Element von P: ((Für "+ "alle bV Element von B mit F(bV)=(p,t)) - (Für alle bN Element von B mit F(bN)=(t,p)): m0(p)+S(bV)-S(bN)=m1(p))


"+ "

Autoren: Chr. Weißenborn & Tom Fellmann"+ ""); jEditorPane.setEditable( false); jEditorPane.setEnabled( false); button1 = new myJButton("OK", "Schließen", new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getSource()==button1) cancel(); } }); panel1 = new JPanel(new BorderLayout()); panel1.setBorder( new EmptyBorder(5,5,5,5)); inPanel1 = new JPanel(new FlowLayout()); inPanel1.add(button1); //OK-Button panel1.add(inPanel1, BorderLayout.SOUTH); panel1.add( jScrollPane = new myJScrollPane( jEditorPane), BorderLayout.CENTER); Dimension altegroesse = getSize(); setSize( 0, 0); show(); hide(); setSize( altegroesse); getContentPane().add(panel1); getRootPane().setDefaultButton( button1); jScrollPane.requestFocus(); }//init public boolean isFocusTraversable(){ return false; } protected void processWindowEvent(WindowEvent e) { //überschrieben, damit ein Beenden beim Schließen des Fensters möglich ist. if (e.getID() == WindowEvent.WINDOW_CLOSING) cancel(); super.processWindowEvent(e); }//processWindowEvent public void show() { if( !zuerst ){ Rectangle r = new Rectangle( getSize()); r.add( Petri.screenSize.width*3/5, Petri.screenSize.height*3/5); if( new Rectangle( Petri.screenSize).contains( r) ) setSize( r.width, r.height); setLocation( Petri.calculateDimensions_getGlobalLocation( getSize(), getParent())); } else zuerst = false; jScrollPane.getViewport().setViewPosition( new Point( 0, 0)); jScrollPane.requestFocus(); super.show(); }//show public void cancel() { //Dialog schließen hide(); }//cancel }//DefDialog class InfoDialog extends JDialog{ private JPanel panel1; private JPanel inPanel1; private myJButton button1; private JPanel panel2; private JPanel inPanel2; /******************************/ /* Konstruktor */ /******************************/ public InfoDialog(Frame parent, String titel) { super(parent, titel, false); enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { init(); } catch (Exception e) { e.printStackTrace(); } }//InfoDialog-Konstruktor private void init() throws Exception { //Initialisierung der Komponenten setResizable(true); setModal(true); panel2 = new JPanel(new BorderLayout()); panel2.setBorder(new EmptyBorder(15,20,15,20)); inPanel2 = new JPanel(new GridLayout(5,1)); inPanel2.add(new myJLabel("Petrinetze mit gefärbten Marken"), null); inPanel2.add(new myJLabel("von Chr. Weißenborn & Tom Fellmann"), null); inPanel2.add(new myJLabel("Version 1.0"), null); inPanel2.add(new myJLabel("Copyright (c) 2003"), null); inPanel2.add(new myJLabel("ein Projekt zur Vorlesung \"Petrinetze 1\" von Prof. Gerber"), null); panel2.add(inPanel2, BorderLayout.CENTER); button1 = new myJButton( "OK", "Schließen", new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getSource()==button1) cancel(); } }); panel1 = new JPanel(new BorderLayout()); inPanel1 = new JPanel(new FlowLayout()); inPanel1.add(button1); //OK-Button panel1.add(inPanel1, BorderLayout.SOUTH); panel1.add(panel2, BorderLayout.CENTER); getContentPane().add(panel1); getRootPane().setDefaultButton( button1); }//init protected void processWindowEvent(WindowEvent e) { //überschrieben, damit ein Beenden beim Schließen des Fensters möglich ist. if (e.getID() == WindowEvent.WINDOW_CLOSING) cancel(); super.processWindowEvent(e); }//processWindowEvent public void show() { pack(); Rectangle r = new Rectangle( getSize()); r.add(420,205); //nach pack: 410, 201 if( new Rectangle( Petri.screenSize).contains( r) ) setSize( r.width, r.height); setLocation( Petri.calculateDimensions_getGlobalLocation( getSize(), getParent())); getRootPane().setDefaultButton( button1); super.show(); }//show public void cancel() { //Dialog schließen hide(); }//cancel }//InfoDialog class myJMenuItem extends JMenuItem{ public myJMenuItem( String text){ super( ); char key = 0; int pos = text.indexOf('%'); if( (-1 < pos) && (pos < text.length()) ){ key = Character.toLowerCase( text.charAt( pos+1)); text = text.substring( 0, pos) + "" + text.charAt(pos+1) + "" + text.substring( pos+2); } setText( text); if( key != 0 ) setMnemonic( key); }//myJMenuItem-Konstruktor public myJMenuItem( String text, ActionListener ActList) { this( text); if (ActList != null) addActionListener(ActList); }//myJMenuItem-Konstruktor public myJMenuItem( String name, ActionListener ActList, boolean isEnabled) { this( name, ActList); setEnabled( isEnabled); }//myJMenuItem-Konstruktor public myJMenuItem( String text, ActionListener ActList, boolean isEnabled, boolean isVisible) { this( text, ActList, isEnabled); setVisible( isVisible); }//myJMenuItem-Konstruktor public void setText(String text){ if( !text.startsWith( "") ){ if( isEnabled() ) text = "" + text + ""; else text = "" + text + ""; } else { if( isEnabled() && !text.startsWith( "", 6) ) text = "" + text.substring( 6, text.length()-6) + ""; else if( !isEnabled() && text.startsWith( "", 6) ) text = "" + text.substring( 9, text.length()-10) + ""; } super.setText(text); }//setText public void setEnabled(boolean b){ super.setEnabled(b); setText( getText()); }//setEnabled }//myJMenuItem class myJMenu extends JMenu{ public myJMenu( String text){ super( ); char key = 0; int pos = text.indexOf('%'); if( (-1 < pos) && (pos < text.length()) ){ key = Character.toLowerCase( text.charAt(pos+1)); text = text.substring( 0, pos) + "" + text.charAt(pos+1) + "" + text.substring( pos+2); } setText( text); if( key != 0 ) setMnemonic( key); }//myJMenu-Konstruktor public myJMenu(String text, boolean isEnabled) { this( text); setEnabled( isEnabled); }//myJMenu-Konstruktor public void setText(String text){ if( !text.startsWith( "") ){ if( isEnabled() ) text = "" + text + ""; else text = "" + text + ""; } else { if( isEnabled() && !text.startsWith( "", 6) ) text = "" + text.substring( 6, text.length()-6) + ""; else if( !isEnabled() && text.startsWith( "", 6) ) text = "" + text.substring( 9, text.length()-10) + ""; } super.setText(text); }//setText public void setEnabled(boolean b){ super.setEnabled(b); setText( getText()); }//setEnabled }//myJMenu class myJLabel extends JLabel{ public myJLabel( String text){ super( "" + text + ""); }//myJLabel-Konstruktor public myJLabel( String text, Color col){ super( "" + text + ""); }//myJLabel-Konstruktor public myJLabel( String text, int horizontalAlignment){ super( "" + text + "", horizontalAlignment); }//myJLabel-Konstruktor public myJLabel( String text, Color col, int horizontalAlignment){ super( "" + text + "", horizontalAlignment); }//myJLabel-Konstruktor private static String ColToHex(Color col) { String red = Integer.toHexString( col.getRed()).toUpperCase(), green = Integer.toHexString( col.getGreen()).toUpperCase(), blue = Integer.toHexString( col.getBlue()).toUpperCase(); while( red.length() < 2 ) red = "0"+ red; while( green.length() < 2 ) green = "0"+ green; while( blue.length() < 2 ) blue = "0"+ blue; return red+ green+ blue; } }//myJLabel class myJButton extends JButton{ public myJButton( String text){ super( ""); char key = 0; int pos = text.indexOf('%'); if( (-1 < pos) && (pos < text.length()) ){ key = Character.toLowerCase( text.charAt( pos+1)); text = text.substring( 0, pos) + "" + text.charAt(pos+1) + "" + text.substring( pos+2); } this.setText( text); if( key != 0 ) this.setMnemonic( key); }//myJButton-Kontruktor public myJButton( String text, ActionListener ActList) { this( text); if( ActList != null ) addActionListener( ActList); }//myJButton-Konstruktor public myJButton( String text, String tooltip, ActionListener ActList) { this( text, ActList); setToolTipText( "" + tooltip + ""); }//myJButton-Konstruktor public myJButton( String text, String tooltip, ActionListener ActList, boolean isEnabled) { this( text, tooltip, ActList); setEnabled(isEnabled); }//myJButton-Konstruktor private myJButton( Icon icon){ super( "", icon); }//myJButton-Kontruktor public static myJButton createWithIcon( String text, String tooltip, String imageName, ActionListener ActList, boolean isEnabled) { if( imageName.compareTo("")==0 ) return new myJButton( text, tooltip, ActList, isEnabled); else return new myJButton( new ImageIcon(PetriFrame.class.getResource(imageName))); }//newJButton_addActionListener public void setText(String text){ if( !text.startsWith( "") ){ if( isEnabled() ) text = "" + text + ""; else text = "" + text + ""; } else { if( isEnabled() && !text.startsWith( "", 6) ) text = "" + text.substring( 6, text.length()-6) + ""; else if( !isEnabled() && text.startsWith( "", 6) ) text = "" + text.substring( 9, text.length()-10) + ""; } super.setText(text); }//setText public void setEnabled(boolean b){ super.setEnabled(b); setText( getText()); }//setEnabled }//myJButton class TextFieldFocusListener implements FocusListener { public void focusGained(FocusEvent e) { if( e.getComponent() instanceof JTextField ) ((JTextField)e.getComponent()).selectAll(); } public void focusLost(FocusEvent e) { if( e.getComponent() instanceof JTextField ) ((JTextField)e.getComponent()).select( 0, 0); } }//TextFieldFocusListener class myJScrollPane extends JScrollPane{ public myJScrollPane(JEditorPane jep){ super(jep); } public boolean isFocusTraversable(){ return true; } }//myScrollPane