/*
* Datei: SteuerFenster.java
* Autor(en): Lukas K�nig
* Java-Version: 6.0
* Erstellt (vor): 19.12.2008
*
* (c) Lukas K�nig, die Datei unterliegt der LGPL
* -> http://www.gnu.de/lgpl-ger.html
*/
package fmg.fmg8.pfeilGUI;
import fmg.fmg8.graphVis.zeichenModi.AusgMerkm;
import fmg.fmg8.sonstiges.DateiFilter;
import fmg.fmg8.statistik.Parametersatz;
import javax.swing.JColorChooser;
import java.awt.Button;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Klasse zur Repr�sentation eines Steuerfensters.
*
* @author Lukas K�nig
*/
public class PfeilController extends Frame
implements ActionListener,
ItemListener {
/**
* Die Versions-ID.
*/
private static final long serialVersionUID = 1L;
/**
* Die Parameter f�r den Lauf.
*/
private Parametersatz pars;
/**
* Die Zeichenfenster.
*/
private ArrayList<ZeichFen> graphen;
/**
* Der aktuell ausgew�hlte Graph.
*/
private ZeichFen aktGrph;
/**
* Eine Textfeld, in dem der Zustandsname steht.
*/
private TextField sonst;
/**
* Eine Textfeld, in dem die Aktion steht.
*/
private TextField farbeA1;
/**
* Eine Textfeld, in dem der Parameter steht.
*/
private TextField farbeA2;
/**
* Eine Textfeld, in dem das Alter des Zustands steht.
*/
private TextField farbeA3;
/**
* Eine Textfeld, in dem die Aktion steht.
*/
private TextField farbeB1;
/**
* Eine Textfeld, in dem der Parameter steht.
*/
private TextField farbeB2;
/**
* Eine Textfeld, in dem das Alter des Zustands steht.
*/
private TextField farbeB3;
/**
* Die Auswahl der Graphen als Auswahlfeld.
*/
private Choice grAuswahl;
/**
* Graphfensterz�hler.
*/
private int graphZaehl;
/**
* Aktuelle Ausgabemerkmale.
*/
private AusgMerkm aktAusg;
/**
* Der Konstruktor.
*
* @param parameter Der Parametersatz f�r den Lauf.
*/
public PfeilController(final Parametersatz parameter) {
super(Konstanten.PROG_NAME_PFEILE
+ " V "
+ Konstanten.PROG_VERSION_PFEILE);
this.pars = parameter;
this.aktAusg = null;
this.reset();
}
/**
* Setzt das Steuerfenster zur�ck.
*/
public void reset() {
this.removeAll();
this.graphen = new ArrayList<ZeichFen>();
this.aktGrph = null;
this.graphZaehl = 0;
this.setLocation(800, 0);
this.setSize(300, 700);
this.setzeSteuerelemente();
this.ladeGraphen();
this.setVisible(true);
}
/**
* L�dt gespeicherte Graphen aus dem im Parameterobjekt angegebenen
* Verzeichnis.
*/
private void ladeGraphen() {
File verz = new File(this.pars.getStdPfad());
String endung = Konstanten.PFEIL_ENDUNG;
String[] gespGr = verz.list(new DateiFilter(endung));
String graphName;
ZeichFen graphFenster;
if (gespGr != null) {
for (int i = 0; i < gespGr.length; i++) {
graphName = gespGr[i].substring(
0,
gespGr[i].length() - endung.length() - 1);
graphFenster = new ZeichFen(
Konstanten.ZEICHNUNG_NAME + i,
Konstanten.ZEICHNUNG_NAME + i,
this.pars,
i);
this.grAuswahl.add(graphName);
this.graphen.add(graphFenster);
this.graphZaehl++;
}
}
if (this.graphen.size() <= 0
|| this.grAuswahl.getItemCount() <= 0) {
graphFenster = new ZeichFen(
Konstanten.ZEICHNUNG_NAME + 0,
Konstanten.ZEICHNUNG_NAME + 0,
this.pars,
0);
this.grAuswahl.add(Konstanten.ZEICHNUNG_NAME + 0);
this.graphen.add(graphFenster);
this.graphZaehl++;
}
this.waehleGraph(0);
}
/**
* W�hlt einen Graphen f�r die Darstellung aus.
*
* @param nummer Die Nummer des zu w�hlenden Graphen.
*/
private void waehleGraph(final int nummer) {
int altX = 0;
int altY = 0;
if (this.aktGrph != null) {
altX = this.aktGrph.getLocation().x;
altY = this.aktGrph.getLocation().y;
}
this.aktGrph = (ZeichFen) this.graphen.get(nummer);
this.aktGrph.setLocation(altX, altY);
this.aktGrph.setVisible(true);
this.grAuswahl.select(nummer);
for (int i = 0; i < this.graphen.size(); i++) {
if (i != nummer) {
((ZeichFen) this.graphen.get(i)).setVisible(false);
}
}
}
/**
* Setzt alle Steuerelemente und Fenstereigenschaften.
*/
private void setzeSteuerelemente() {
this.setBackground(Color.lightGray);
this.setLayout(new GridLayout(1, 1));
Button b;
Panel buttonPanel = new Panel();
Panel buttonPanel2 = new Panel();
Panel buttonPanel3 = new Panel();
Panel buttonPanel4 = new Panel();
Panel listPanel = new Panel();
Panel editPanel = new Panel();
Panel labelPanel = new Panel();
listPanel.setLayout(new GridLayout(0, 1));
editPanel.setLayout(new GridLayout(8, 1));
labelPanel.setLayout(new GridLayout(4, 1));
buttonPanel2.setLayout(new GridLayout(4, 2));
buttonPanel3.setLayout(new GridLayout(6, 3));
buttonPanel4.setLayout(new GridLayout(2, 1));
Panel choiPan = new Panel(new GridLayout(1, 1));
Panel p = new Panel();
b = new Button("Beenden");
b.addActionListener(this);
buttonPanel.add(b);
b = new Button("Modus");
b.addActionListener(this);
buttonPanel.add(b);
b = new Button("Dicke");
b.addActionListener(this);
buttonPanel2.add(b);
b = new Button("Normal");
b.addActionListener(this);
buttonPanel2.add(b);
b = new Button("Speichern...");
b.addActionListener(this);
buttonPanel2.add(b);
b = new Button("Bezier");
b.addActionListener(this);
buttonPanel2.add(b);
b = new Button("Farbwahl...");
b.addActionListener(this);
buttonPanel2.add(b);
b = new Button("8");
b.addActionListener(this);
buttonPanel2.add(b);
b = new Button("9");
b.addActionListener(this);
buttonPanel2.add(b);
b = new Button("10");
b.addActionListener(this);
buttonPanel2.add(b);
this.farbeA1 = new TextField("", 5);
this.farbeA2 = new TextField("", 5);
this.farbeA3 = new TextField("", 5);
this.farbeB1 = new TextField("", 5);
this.farbeB2 = new TextField("", 5);
this.farbeB3 = new TextField("", 5);
this.sonst = new TextField("", 5);
this.sonst.setEditable(false);
labelPanel.add(new Label("L1", Label.LEFT));
labelPanel.add(new Label("L2", Label.LEFT));
labelPanel.add(new Label("L3", Label.LEFT));
labelPanel.add(new Label("L4", Label.LEFT));
editPanel.add(this.sonst);
editPanel.add(this.farbeA1);
editPanel.add(this.farbeA2);
editPanel.add(this.farbeA3);
editPanel.add(new Label("-----"));
editPanel.add(this.farbeB1);
editPanel.add(this.farbeB2);
editPanel.add(this.farbeB3);
this.grAuswahl = new Choice();
choiPan.add(this.grAuswahl);
this.grAuswahl.addItemListener(this);
b = new Button("11");
b.addActionListener(this);
buttonPanel3.add(b);
b = new Button("12");
b.addActionListener(this);
buttonPanel3.add(b);
b = new Button("13");
b.addActionListener(this);
buttonPanel3.add(b);
b = new Button("14");
b.addActionListener(this);
buttonPanel3.add(b);
b = new Button("15");
b.addActionListener(this);
buttonPanel3.add(b);
b = new Button("16");
b.addActionListener(this);
buttonPanel3.add(b);
b = new Button("17");
b.addActionListener(this);
buttonPanel3.add(b);
b = new Button("18");
b.addActionListener(this);
buttonPanel3.add(b);
b = new Button("19");
b.addActionListener(this);
buttonPanel3.add(b);
b = new Button("20");
b.addActionListener(this);
buttonPanel3.add(b);
b = new Button("21");
b.addActionListener(this);
buttonPanel3.add(b);
p.add(buttonPanel);
p.add(listPanel);
p.add(labelPanel);
p.add(editPanel);
p.add(buttonPanel2);
p.add(choiPan);
p.add(buttonPanel3);
p.add(buttonPanel4);
this.add(p);
this.setResizable(true);
}
/**
* Behandelt die �nderung des Listenelements.
*
* @param event Das Event.
*/
public void itemStateChanged(final ItemEvent event) {
System.out.println("Item state changed.");
}
/**
* Die actionPerformed Methode.
*
* @param event Das Event.
*/
public void actionPerformed(final ActionEvent event) {
Object obj = event.getSource();
String cmd = event.getActionCommand();
Iterator<ZeichFen> itG;
int fehler = 0;
this.setCursor(new Cursor(Cursor.WAIT_CURSOR));
itG = this.graphen.iterator();
while (itG.hasNext()) {
((ZeichFen) itG.next()).setCursor(new Cursor(Cursor.WAIT_CURSOR));
}
try {
if (obj instanceof Button) {
if (cmd.equals("Beenden")) {
WindowClosingAdapter ende
= new WindowClosingAdapter(true);
ende.schliesseExt(this);
} else if (cmd.equals("Modus")) {
boolean b1;
boolean b2;
b1 = this.aktGrph.isMarkiereEcken();
b2 = this.aktGrph.isZeichneGrundPfeil();
if (!b1 && !b2) { // 00
b1 = true;
b2 = false;
} else if (!b1 && b2) { // 01
b1 = false;
b2 = false;
} else if (b1 && !b2) { // 10
b1 = true;
b2 = true;
} else if (b1 && b2) { // 11
b1 = false;
b2 = true;
}
this.aktGrph.setMarkiereEcken(b1);
this.aktGrph.setZeichneGrundPfeil(b2);
} else if (cmd.equals("Dicke")) {
double dicke = Double.parseDouble(this.farbeA1.getText());
this.aktGrph.setAktDicke(dicke);
} else if (cmd.equals("Normal")) {
this.aktGrph.normalisiere();
} else if (cmd.equals("Bezier")) {
double bK = 2;
if (!this.farbeA1.getText().equals("")) {
bK = Double.parseDouble(this.farbeA1.getText());
}
this.aktGrph.bezier(bK);
} else if (cmd.equals("Farbwahl...")) {
Color ausg1 = null;
Color ausg2 = null;
if (this.aktAusg != null) {
ausg1 = this.aktAusg.getRahmenFarbe();
ausg2 = this.aktAusg.getFuellFarbe();
}
ausg1 = JColorChooser.showDialog(
this,
"Rahmenfarbe w�hlen",
ausg1);
ausg2 = JColorChooser.showDialog(
this,
"F�llfarbe w�hlen",
ausg2);
this.aktAusg = new AusgMerkm(
ausg1,
ausg2,
ausg1 != null,
ausg2 != null);
this.aktGrph.setzeAktSegAusg(this.aktAusg);
} else if (cmd.equals("Speichern...")) {
FileDialog dia;
String oldVerz;
dia = new FileDialog(this,
"Pfeil als PNG speichern",
FileDialog.SAVE);
dia.setFilenameFilter(new DateiFilter("png"));
dia.setVisible(true);
if (!(dia.getDirectory() == null)
&& !(dia.getFile() == null)) {
oldVerz = this.pars.getStdPfad();
this.pars.setStdPfad(dia.getDirectory());
this.aktGrph.savePNG(dia.getFile());
this.pars.setStdPfad(oldVerz);
}
}
}
} catch (Exception e) {
fehler = 2;
e.printStackTrace();
} finally {
this.aktGrph.neuZeichnen(fehler);
itG = this.graphen.iterator();
while (itG.hasNext()) {
((ZeichFen) itG.next()).setCursor(
new Cursor(Cursor.DEFAULT_CURSOR));
}
this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
}
/**
* Erzeugt einen neuen Graphen mit dem ersten freien Standardnamen.
*
* @return Der neue Graph.
*/
public ZeichFen neuerGraph() {
String graphName = "";
int graphNummer = 0;
ZeichFen graphFenster;
boolean ok = false;
while (!ok) {
graphName = "graph" + graphNummer;
Iterator<ZeichFen> it = this.graphen.iterator();
ok = true;
while (it.hasNext()) {
if (((ZeichFen)
it.next()).toString().equals(graphName)) {
ok = false;
}
}
graphNummer++;
}
graphFenster = new ZeichFen(
Konstanten.ZEICHNUNG_NAME + this.kleinsteFreieID(),
Konstanten.ZEICHNUNG_NAME + this.kleinsteFreieID(),
this.pars,
this.kleinsteFreieID());
this.grAuswahl.add(graphName);
this.graphen.add(graphFenster);
this.graphZaehl++;
return graphFenster;
}
/**
* Aktuellen Graphen setzen.
*
* @param aktGr The aktGraph to set.
*/
public void setAktGraph(final ZeichFen aktGr) {
this.aktGrph = aktGr;
}
/**
* Selektiert das angegebene Graphfenster (macht es sichtbar, etc).
*
* @param graph Das zu selektierende Graphfenster.
*/
public void selGraph(final ZeichFen graph) {
int i = 0;
while (this.graphen.get(i) != graph) {
i++;
}
this.waehleGraph(i);
this.aktGrph.neuZeichnen();
}
/**
* Gibt die kleinste noch nicht von einem der aktuellen Graphen verwendete
* ID zur�ck.
*
* @return Die kleinste noch nicht verwendete ID.
*/
public int kleinsteFreieID() {
int kleinste = 0;
Iterator<ZeichFen> it = this.graphen.iterator();
ZeichFen aktGr;
while (it.hasNext()) {
aktGr = (ZeichFen) it.next();
if (kleinste <= aktGr.getId()) {
kleinste = aktGr.getId() + 1;
}
}
return kleinste;
}
/**
* Zeichnet alle Vis-Fenster neu.
*/
public void repaintAll() {
Iterator<ZeichFen> it = this.graphen.iterator();
while (it.hasNext()) {
((ZeichFen) it.next()).neuZeichnen();
}
}
/**
* Die Startmethode des Frames.
*
* @param args Die Parameter f�r das Parameterobjekt. Sie werden direkt
* an die Klasse Parametersatz weitergegeben. Zur Formatierung
* der Parameter siehe diese Klasse sowie die Klasse
* Konstanten des Pakets statistik.
*/
public static void main(final String[] args) {
Parametersatz pr = new Parametersatz(args);
pr.ergaenze();
if (pr.getGraphisch().booleanValue()) {
PfeilController steuer = new PfeilController(pr);
// SonstMeth.log(SonstMeth.LOG_DEBUG, pr.toString(), pr, "plain");
steuer.setVisible(true);
}
}
}