/*
* 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.statistik.startSetup;
import fmg.fmg8.graphVis.SteuerFenster;
import fmg.fmg8.pfeilGUI.PfeilController;
import fmg.fmg8.sonstiges.SonstMeth;
import fmg.fmg8.statistik.Konstanten;
import fmg.fmg8.statistik.Parametersatz;
import fmg.fmg8.statistik.SinglePar;
import fmg.fmg8.statistik.TraceBetrachter;
import java.awt.Color;
import java.awt.Component;
import java.awt.FileDialog;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Random;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/**
* Klasse zur Repr�sentation eines Steuerfensters.
*
* @author Lukas K�nig
*/
public class Starter extends JFrame implements
ListSelectionListener,
ActionListener,
MouseListener,
KeyListener {
/**
* Die Versions-ID.
*/
private static final long serialVersionUID = 1L;
/**
* Die Parameterliste.
*/
private JList paramListe;
/**
* Parameter.
*/
private Parametersatz pars;
/**
* Felder.
*/
private JTextArea[] parFelder;
/**
* Ob die Felder fest sein sollen.
*/
private JCheckBox[] checkBoxen;
/**
* Die ScrollPane des Parameter-Text-Objekts.
*/
private JScrollPane scroll;
/**
* Textfelderpanel.
*/
private Panel textFelder;
/**
* Sie Ausgabe.
*/
private JTextArea ausgabe;
/**
* Der Konstruktor.
*
* @param parameter Der Parametersatz f�r den Lauf.
*/
public Starter(final Parametersatz parameter) {
super("JoSchKa-Parameter-Generator");
this.pars = parameter;
this.reset();
}
/**
* Setzt das Steuerfenster zur�ck.
*/
public void reset() {
this.setLocation(0, 0);
this.setSize(800, 700);
this.setzeSteuerelemente();
this.setVisible(true);
this.getContentPane().setVisible(true);
}
/**
* Setzt die Parameter in die Parameterliste.
*
* @return Die Anzahl der gesetzten Parameter.
*/
private int setzeParameterListe() {
ArrayList<SinglePar> liste = this.pars.getAllPars();
// Collections.sort(liste, new AlphaSort());
Component[] s = new Component[liste.size()];
for (int i = 0; i < liste.size(); i++) {
s[i] = liste.get(i);
}
this.paramListe.setListData(s);
return s.length;
}
/**
* Setzt alle Steuerelemente und Fenstereigenschaften.
*/
private void setzeSteuerelemente() {
ArrayList<SinglePar> liste = this.pars.getAllPars();
this.getContentPane().setBackground(Color.white);
this.getContentPane().setLayout(new GridLayout(2, 1));
Panel p = new Panel();
p.setLayout(new GridLayout(1, 1));
this.paramListe = new JList(new DefaultListModel());
this.paramListe.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane scrollPane = new JScrollPane(this.paramListe);
int size = this.setzeParameterListe();
this.paramListe.addListSelectionListener(this);
p.add(scrollPane);
this.ausgabe = new JTextArea();
this.ausgabe.setEditable(true);
JScrollPane scrollPane2 = new JScrollPane(this.ausgabe);
this.getContentPane().add(p);
Panel buttons = new Panel();
JButton generiere = new JButton("Generiere Parameter");
JButton simStart = new JButton("Starte Sim (Cmd)...");
JButton simStartGraph = new JButton("Starte Sim (Grafik)...");
JButton traceStart = new JButton("Starte Tracebetrachter...");
JButton pfeilStart = new JButton("Starte Pfeilmaster...");
Panel pButtons = new Panel(new GridLayout(2, 1));
pButtons.add(scrollPane2);
this.textFelder = new Panel(new GridLayout(1, 2));
buttons.add(generiere);
buttons.add(simStart);
buttons.add(simStartGraph);
buttons.add(traceStart);
buttons.add(pfeilStart);
pButtons.add(buttons);
this.textFelder.add(pButtons);
this.parFelder = new JTextArea[size];
this.checkBoxen = new JCheckBox[size];
for (int i = 0; i < size; i++) {
this.parFelder[i] = new JTextArea("" + liste.get(i).getStdValue());
this.parFelder[i].setVisible(true);
this.checkBoxen[i] = new JCheckBox("Fest");
this.checkBoxen[i].setVisible(true);
this.parFelder[i].setBackground(Color.yellow);
this.parFelder[i].setCaretColor(Color.red);
this.parFelder[i].setForeground(Color.black);
this.parFelder[i].addMouseListener(this);
this.parFelder[i].addKeyListener(this);
}
this.getContentPane().add(this.textFelder);
this.paramListe.addMouseListener(this);
generiere.addActionListener(this);
simStart.addActionListener(this);
traceStart.addActionListener(this);
pfeilStart.addActionListener(this);
simStartGraph.addActionListener(this);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* Listenlistener.
*
* @param e Das Event.
*/
@Override
public void valueChanged(final ListSelectionEvent e) {
if (this.paramListe.getSelectedIndex() < 0) {
return;
}
for (int i = 0; i < this.parFelder.length; i++) {
this.textFelder.remove(this.parFelder[i]);
this.textFelder.remove(this.checkBoxen[i]);
this.parFelder[i].setVisible(false);
this.checkBoxen[i].setVisible(false);
}
if (this.scroll != null) {
this.textFelder.remove(this.scroll);
}
this.scroll = new JScrollPane(
this.parFelder[this.paramListe.getSelectedIndex()]);
// this.textFelder.add(
// this.parFelder[this.paramListe.getSelectedIndex()]);
this.textFelder.add(this.scroll);
this.textFelder.add(
this.checkBoxen[this.paramListe.getSelectedIndex()]);
this.parFelder[this.paramListe.getSelectedIndex()].setVisible(true);
this.checkBoxen[this.paramListe.getSelectedIndex()].setVisible(true);
}
/**
* Erzeugt den Parameterarray als Textparameter (keine JoSchKa-Zus�tze).
*
* @return Der Parameterarray.
*/
private ArrayList<String> erzeugeParArray() {
ArrayList<SinglePar> liste = this.pars.getAllPars();
JoSchKa joschka = new JoSchKa();
ArrayList<String> stzP
= new ArrayList<String>(this.parFelder.length);
ArrayList<String[]> werte
= new ArrayList<String[]>(this.parFelder.length);
String[] zwischWert;
ArrayList<String> festePar = new ArrayList<String>();
ArrayList<String[]> festeWerte = new ArrayList<String[]>();
// Erzeuge Listen mit festen Werten und zu kombinierenden Werten.
for (int i = 0; i < this.parFelder.length; i++) {
String[] zwisch = this.parFelder[i].getText().split("\n");
zwischWert = new String[zwisch.length];
for (int j = 0; j < zwisch.length; j++) {
zwischWert[j] = zwisch[j];
}
if (this.checkBoxen[i].isSelected()) {
festePar.add(liste.get(i).getParNam());
festeWerte.add(zwischWert);
} else {
stzP.add(liste.get(i).getParNam());
werte.add(zwischWert);
}
}
// Parameters�tze erzeugen.
try {
ArrayList<String> ausgaben
= joschka.erzeuge(
this.pars,
stzP,
werte,
festePar,
festeWerte);
this.paramListe.setBackground(Color.white);
return ausgaben;
} catch (Exception e) {
this.paramListe.setBackground(Color.red);
this.ausgabe.setText(e.getMessage());
return new ArrayList<String>();
}
}
/**
* Generiert die Parameter.
*/
private void generiere() {
ArrayList<String> ausgaben;
JoSchKa joschka;
// Array erzeugen:
ausgaben = this.erzeugeParArray();
joschka = new JoSchKa();
// Darstellung der Parameters�tze in GUI:
this.ausgabe.setText("");
if (ausgaben.size() <= 100) {
for (String s : ausgaben) {
this.ausgabe.setText(this.ausgabe.getText() + s + "\n");
}
}
// JoSchKa-Ausgaben erzeugen:
ausgaben = joschka.erzeugeJoSchKaStd(
this.pars.getJoschkaUser() + "_" + this.pars.getJoschkaVerz(),
"java " + this.pars.getJoschkaVMpar()
+ " -jar " + this.pars.getJoschkaJAR(),
ausgaben,
this.pars);
// JoSchKa-Verzeichnis erzeugen:
String ergebnis = this.erzeugeJoSchKaVerz(ausgaben, this.pars);
if (ergebnis == null) {
// JoSchKa-Ausgaben speichern:
SonstMeth.speichereTextAusArray(
this.pars.getStarterQuellPfad()
+ File.separatorChar
+ this.pars.getJoschkaVerz(),
"JoSchKa.txt",
ausgaben,
this.pars);
this.ausgabe.setText(
this.ausgabe.getText()
+ "\nGespeichert in "
+ this.pars.getStarterQuellPfad()
+ File.separatorChar
+ this.pars.getJoschkaVerz()
+ File.separatorChar
+ "JoSchKa.txt");
} else {
this.ausgabe.setText(
"JoSchKa-Ausgaben nicht erzeugt."
+ "\nFehler: " + ergebnis);
}
}
/**
* Erzeugt das JoSchKa-Verzeichnis und kopiert die notwendigen Dateien
* hinein.
*
* @param ausgaben Die Ausgabes�tze.
* @param params Der Parametersatz.
*
* @return Ob die Aktion durchgef�hrt werden konnte. null bedeutet
* fehlerfrei - sonst wird ein String mit der Beschreibung
* des Fehlers zur�ckgegeben.
*/
private String erzeugeJoSchKaVerz(
final ArrayList<String> ausgaben,
final Parametersatz params) {
File quellVerz = new File(
params.getStarterQuellPfad() + File.separatorChar);
File zielVerz = new File(
params.getStarterQuellPfad()
+ File.separatorChar
+ params.getJoschkaVerz());
FileCopy kopieren = new FileCopy();
File[] zwisch;
boolean enthaelt = false;
// Alte Dateien l�schen.
this.deleteVerz(zielVerz);
zielVerz.mkdir();
// Automaten kopieren.
zwisch = quellVerz.listFiles(new AutomatenFilter());
for (File f : zwisch) {
enthaelt = true;
File f2 = new File(
zielVerz.getAbsolutePath()
+ File.separatorChar
+ f.getName());
kopieren.copy(f, f2);
}
// Falls sich keine Automaten im Verzeichnis befinden.
if (!enthaelt) {
this.paramListe.setBackground(Color.red);
this.deleteVerz(zielVerz);
return "Keine Roboter in " + quellVerz.getAbsolutePath() + ".";
}
// Umgebungsdateien kopieren.
for (String ausg : ausgaben) {
Parametersatz paramsZwisch = new Parametersatz(ausg.split(" "));
paramsZwisch.ergaenze();
File umgebungQuell = new File(
quellVerz.getAbsolutePath()
+ File.separatorChar
+ paramsZwisch.getUmgebungDatname());
File umgebungZiel = new File(
zielVerz.getAbsolutePath()
+ File.separatorChar
+ paramsZwisch.getUmgebungDatname());
if (umgebungQuell.exists()) {
kopieren.copy(umgebungQuell, umgebungZiel);
} else {
this.paramListe.setBackground(Color.red);
this.deleteVerz(zielVerz);
return "Umgebungsdatei nicht gefunden: "
+ umgebungQuell.getAbsolutePath() + ".";
}
}
return null;
// JAR-Datei erzeugen und kopieren (noch nicht implementiert).
}
/**
* L�scht ein flaches Verzeichnis mit allen Dateien.
*
* @param verz Das Verzeichnis.
*/
private void deleteVerz(final File verz) {
if (verz == null) {
return;
}
File[] zwisch = verz.listFiles();
if (zwisch != null) {
for (File f : zwisch) {
f.delete();
}
}
verz.delete();
}
private boolean contains(final String[] array, final String s) {
for (String s2 : array) {
if (s.equals(s2)) {
return true;
}
}
return false;
}
/**
* Der Listener.
*
* @param arg0 Das Event.
*/
@Override
public void actionPerformed(final ActionEvent arg0) {
LinkedList<Integer> markierte = new LinkedList<Integer>();
String hervorString = this.pars.hervorString();
String[] hervorPar = new String[2];
int hervorNum = -1;
for (int i = 0; i < this.paramListe.getModel().getSize(); i++) {
if (((SinglePar) this.paramListe.getModel().getElementAt(i))
.isChanged()) {
markierte.add(i);
}
}
// Eintragen der weiteren hervorgehobenen Parameter:
for (int i = 0; i < this.paramListe.getModel().getSize(); i++) {
SinglePar sPar
= (SinglePar) this.paramListe.getModel().getElementAt(i);
if (sPar.isChanged() && !this.contains(
this.pars.getHervorPar(),
sPar.getParNam())) {
hervorString += "," + sPar.getParNam();
}
if (sPar.getParNam().equalsIgnoreCase(Konstanten.HERVOR_PAR_ATT)) {
hervorNum = i;
}
}
if (hervorNum >= 0) {
this.parFelder[hervorNum].setText(hervorString);
} else {
SonstMeth.log(
SonstMeth.LOG_WARNING,
"Hervorgehobene Parameter nicht gesetzt: " + hervorString,
this.pars);
}
hervorPar[0] = Konstanten.HERVOR_PAR_ATT;
hervorPar[1] = hervorString;
this.pars.neuePars(hervorPar);
try {
this.pars = new Parametersatz(
this.erzeugeParArray().get(0).split(" "));
this.pars.ergaenze();
this.setzeParameterListe();
for (int i = 0; i < markierte.size(); i++) {
this.setzeChanged(markierte.get(i));
}
} catch (Exception e2) {
return;
}
this.generiere();
String[] params = this.ausgabe.getText().split("\n")[0].split(" ");
String[] paramsTrace;
String filename;
if (arg0.getActionCommand().equals("Generiere Parameter")) {
params = null;
} else if (arg0.getActionCommand().equals("Starte Sim (Cmd)...")) {
Parametersatz parsNeu = new Parametersatz(params);
parsNeu.ergaenze();
parsNeu.setGraphisch(false);
this.dispose();
SteuerFenster.main(
parsNeu.parStrPlain().replace('\n', ' ').split(" "));
} else if (arg0.getActionCommand().equals("Starte Sim (Grafik)...")) {
Parametersatz parsNeu = new Parametersatz(params);
parsNeu.ergaenze();
parsNeu.setGraphisch(true);
this.dispose();
SteuerFenster.main(
parsNeu.parStrPlain().replace('\n', ' ').split(" "));
} else if (
arg0.getActionCommand().equals("Starte Tracebetrachter...")) {
FileDialog dia = new FileDialog(
this,
"Tracedatei zum Betrachten ausw�hlen",
FileDialog.LOAD);
dia.setFile("*.dat.gz");
dia.setDirectory(this.pars.getStdPfad());
dia.setVisible(true);
if (dia.getFile() == null) {
return;
}
filename = dia.getDirectory() + dia.getFile();
filename = filename.substring(0, filename.length() - 3);
paramsTrace = new String[params.length + 2];
paramsTrace[0] = filename;
paramsTrace[1] = "dummy";
for (int i = 0; i < params.length; i++) {
paramsTrace[i + 2] = params[i];
}
this.dispose();
TraceBetrachter.main(paramsTrace);
} else if (arg0.getActionCommand().equals("Starte Pfeilmaster...")) {
this.dispose();
PfeilController.main(params);
}
}
/**
* Listener.
*
* @param arg0 Event.
*/
@Override
public void mouseClicked(final MouseEvent arg0) {
JTextArea aktText = null;
String rnd = "";
int gesNum = 1;
String textV, textN, neuText = "";
int carPos;
if (arg0.getSource().getClass().equals(JList.class)) {
if (arg0.getButton() == 3) {
this.invertiereAlleKat();
}
return;
}
if (arg0.getButton() == 3 && arg0.getClickCount() >= 2) {
for (int i = 0; i < this.parFelder.length; i++) {
if (!this.parFelder[i].isVisible()
&& !this.checkBoxen[i].isSelected()) {
gesNum *= this.parFelder[i].getText().split("\n").length;
}
if (this.parFelder[i].isVisible()) {
this.setzeAktChanged();
this.checkBoxen[i].setSelected(true);
aktText = this.parFelder[i];
}
}
if (arg0.getClickCount() == 2) {
try {
carPos = aktText.getCaretPosition();
textV = aktText.getText().substring(0, carPos);
textN = aktText.getText().split("\n")[0].substring(carPos);
if (textV.split("\n").length == 1) {
for (int i = 0; i < gesNum; i++) {
neuText +=
textV
+ this.normZahl(i, gesNum - 1)
+ textN
+ "\n";
}
aktText.setText(neuText);
}
} catch (final Exception e) {
SonstMeth.log(
SonstMeth.LOG_OUTPUT,
"Nummerierung nicht erfolgreich.",
this.pars);
}
}
if (arg0.getClickCount() >= 3) {
for (int i = 0; i < gesNum; i++) {
rnd += "" + (new Random()).nextLong() + "\n";
}
aktText.setText(rnd);
}
}
}
/**
* @param i Der aktuelle Wert.
* @param max Der maximale Wert.
*
* @return normZahl(3, 100) ==> 003
*/
private String normZahl(final int i, final int max) {
String strI = "" + i, strMax = "" + max;
String nullen = "";
for (int j = 0; j < strMax.length() - strI.length(); j++) {
nullen += "0";
}
return nullen + i;
}
/**
* Listener.
*
* @param arg0 Event.
*/
@Override
public void mouseEntered(final MouseEvent arg0) {
}
/**
* Listener.
*
* @param arg0 Event.
*/
@Override
public void mouseExited(final MouseEvent arg0) {
}
/**
* Listener.
*
* @param arg0 Event.
*/
@Override
public void mousePressed(final MouseEvent arg0) {
}
/**
* Listener.
*
* @param arg0 Event.
*/
@Override
public void mouseReleased(final MouseEvent arg0) {
}
/**
* @param e Das Event.
*/
@Override
public void keyPressed(final KeyEvent e) {
}
/**
* @param e Das Event.
*/
@Override
public void keyReleased(final KeyEvent e) {
}
/**
* Setzte den num-ten Listeneintrag auf "checked".
*
* @param num Der zu markierende Eintrag.
*/
private void setzeChanged(final int num) {
if (num < 0) {
return;
}
SinglePar p = (SinglePar) this.paramListe.getModel().getElementAt(num);
p.setChanged();
this.paramListe.repaint();
}
/**
* Setzt, dass das aktuelle Element ver�ndert wurde.
*/
private void setzeAktChanged() {
this.setzeChanged(this.paramListe.getSelectedIndex());
}
/**
* Setzt, dass alle Elemente die Kategorieanzeige umschalten.
*/
private void invertiereAlleKat() {
SinglePar p;
for (int i = 0; i < this.paramListe.getModel().getSize(); i++) {
p = (SinglePar) this.paramListe.getModel().getElementAt(i);
p.setKategorieAnzeigen((p.isKategorieAnzeigen() + 1) % 4);
}
this.paramListe.repaint();
}
/**
* @param e Das Event.
*/
@Override
public void keyTyped(final KeyEvent e) {
this.setzeAktChanged();
}
/**
* GUI zur Erzeugung von Startkonfiguration, u.a. f�r JoSchKa.
*
* @param args Nicht benutzt.
*/
public static void main(final String[] args) {
Parametersatz params = new Parametersatz(args);
params.ergaenze();
Starter josch = new Starter(params);
josch.pars.getAllPars();
}
}