/************************************************************/
/* 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