package agg.gui.parser; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.Ellipse2D; import java.util.Vector; import javax.swing.ScrollPaneConstants; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import agg.editor.impl.EdGraGra; import agg.gui.saveload.GraGraLoad; import agg.gui.treeview.GraGraTreeView; import agg.parser.CriticalPairOption; import agg.parser.LayerOption; import agg.parser.PairContainer; import agg.parser.LayeredPairContainer; import agg.parser.ParserFactory; import agg.parser.ParserOption; import agg.xt_basis.BaseFactory; import agg.xt_basis.GraGra; /** * This dialog guides the user thru all setting which must be done before the * parser can start. * * @version $Id: ParserDialog.java,v 1.11 2010/09/23 08:20:54 olga Exp $ * @author $Author: olga $ */ @SuppressWarnings("serial") public class ParserDialog extends JDialog implements ActionListener, ListSelectionListener { /** the tree view from the main AGG gui */ GraGraTreeView treeView; /** the gragra with layout for the host graph */ EdGraGra hostGraph; /** the gragra with layout for the stop graph */ EdGraGra stopGraph; /** the gragra with layout for the critical pairs */ EdGraGra criticalPairGraGra; /** the pairs its self */ PairContainer criticalPairs; /** the gui the dialog is child from */ Frame parent; /** this list holds all gragra names */ @SuppressWarnings("rawtypes") JList gragraNames; private Vector<String> gragraNamesVector; /** this JScrollPane is needed to scroll the gragra names */ JScrollPane scrollPane; /** click this button to get a load dialog */ JButton loadButton; /** this button cancels this dialog */ JButton cancel; /** click this button to go to the next step */ JButton nextButton; /** only a little panel where the state of the dialog is highlighted */ StepPanel stepPanel; /** shows if all question are answers */ boolean readyToParse; ParserOption pOption; CriticalPairOption cpOption; LayerOption lOption; /** * This panel shows at which step the process halts. There are three steps:<br> * 1) set the host graph<br> * 2) set the stop graph<br> * 3) set the critical pairs<br> * at last the user has to confirm all settings * * @version $Id: ParserDialog.java,v 1.11 2010/09/23 08:20:54 olga Exp $ * @author $Author: olga $ */ public class StepPanel extends JPanel implements Runnable { /** step 1 */ public final static int STEP_HOST_GRAPH = 1; /** step 2 */ public final static int STEP_STOP_GRAPH = 3; /** step 3 */ public final static int STEP_CRITICAL_PAIRS = 7; /** the finish */ public final static int STEP_FINISH = 15; /** this text is shown at the different steps */ String[] steps = { "Select Host Graph", "Select Stop Graph", "Select Critical Pairs" }; /** holds the step which is enabled */ int enabled = 0; /** just create a new panel */ public StepPanel() { setPreferredSize(new Dimension(100, 100)); } /** * this paints the different steps on the panel. Only the color is set * for the steps */ private void paintSteps(Graphics2D g2d, int startX, int startY, int stepNumber) { Color text, bullit; if (this.enabled > ((int) Math.pow(2, stepNumber + 1)) - 1) { /* eintrag ist visited */ // System.out.println(enabled+"Visited: "+stepNumber); bullit = Color.green; text = Color.darkGray; } else if (this.enabled == ((int) Math.pow(2, stepNumber + 1)) - 1) { /* eintrag ist active */ // System.out.println(enabled+"active: "+stepNumber); bullit = Color.red; text = Color.black; } else { /* eintrag ist inactive */ // System.out.println(enabled+"inactive: "+stepNumber); bullit = Color.gray; text = Color.gray; } paintSteps(g2d, startX, startY, stepNumber, bullit, text); } /** draws the little bullit and the text */ private void paintSteps(Graphics2D g2d, int startX, int startY, int stepNumber, Color bullit, Color text) { int x = startX; int y = startY; int ellipseSize = 5; y = y + stepNumber * 15; g2d.setColor(bullit); Ellipse2D.Float e = new Ellipse2D.Float(x, y, ellipseSize, ellipseSize); g2d.fillOval(x, y, ellipseSize, ellipseSize); g2d.draw(e); g2d.setColor(text); g2d.drawString(this.steps[stepNumber], x + 12, y + 7); } /** * paints the panel. That means the bullit and text is drawn * * @param g * The current graphics context. */ public void paint(Graphics g) { Dimension d = getSize(); Graphics2D g2d = (Graphics2D) g; g2d.setColor(Color.lightGray); g2d.fillRect(0, 0, d.width, d.height); g2d.setColor(Color.black); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); // g2d.setFont(new Font("Times New Roman", Font.PLAIN, 14)); g2d.setFont(new Font("Times New Roman", Font.BOLD, 14)); int[] xs = { 2, 5, 5, 2 }; int[] ys = { 5, 5, 69, 69 }; g2d.drawPolyline(xs, ys, 4); g2d.setColor(Color.blue); g2d.drawString("Start", xs[1] + 10, ys[1] + 7); g2d.setColor(Color.black); if (this.enabled == ((int) Math.pow(2, 4)) - 1) g2d.setColor(new Color(0, 127, 0)); g2d.setColor(Color.blue); g2d.drawString("Finish", xs[2] + 10, ys[2] + 3); g2d.setColor(Color.black); for (int i = 0; i < 3; i++) paintSteps(g2d, xs[1] - 2, ys[1] + 15, i); } /** * sets the Step which is enabled * * @param step * The step of the input process. */ public void setStep(int step) { this.enabled = step; repaint(); } /** * returns the step which is enabled * * @return The current step. */ public int getStep() { return this.enabled; } /** * sets the steps automatically * * @deprecated was used for simulation */ public void run() { for (int k = 0; k < 5; k++) { // System.out.println(""+k); try { Thread.sleep(1000); } catch (InterruptedException ie) { } } for (int i = 0; i <= 4; i++) { for (int j = 0; j < 1000000; j++) { } setStep((int) Math.pow(2, i) - 1); // enabled = i; repaint(); try { Thread.sleep(1000); } catch (InterruptedException ie) { } } // System.out.println("ENDE"); } } /** * The created dialog guides the user thru all the needed settings for the * parser. * * @param parent * The parent frame of this window. * @param treeView * The tree provides all current GraGras. * @param pOption * The option of the parser is necessary for the correct creation * and load of the parser. * @param cpOption * The critical pair option is needed for the correct pairs * (s.a.). * @param lOption * If there are layer the option is needed to choose the right * one. */ @SuppressWarnings({ "rawtypes", "unchecked" }) public ParserDialog(Frame parent, GraGraTreeView treeView, ParserOption pOption, CriticalPairOption cpOption, LayerOption lOption) { super(parent, "Starting Parser", true); this.treeView = treeView; this.hostGraph = null; this.stopGraph = null; this.criticalPairs = null; this.criticalPairGraGra = null; this.readyToParse = false; this.parent = parent; this.pOption = pOption; this.cpOption = cpOption; this.lOption = lOption; this.frame = parent; setLocation(200, 200); setSize(new Dimension(450, 300)); setDefaultCloseOperation(DISPOSE_ON_CLOSE); GridBagConstraints constraint = new GridBagConstraints(); // Container c = getContentPane(); JPanel c = new JPanel(); c.setLayout(new GridBagLayout()); c.setBackground(Color.lightGray); c.setSize(new Dimension(450, 300)); JPanel warningPanel = new JPanel(new GridLayout(0, 1)); warningPanel.setBackground(Color.lightGray); warningPanel.setPreferredSize(new Dimension(300, 60)); JLabel leer = new JLabel(" "); warningPanel.add(leer); JLabel warning = new JLabel("Parsing rules and stop graph have "); warning.setForeground(Color.red); warning.setFont(new Font("Times New Roman", Font.BOLD, 14)); warningPanel.add(warning); warning = new JLabel("to be located in the same grammar."); warning.setForeground(Color.red); warning.setFont(new Font("Times New Roman", Font.BOLD, 14)); warningPanel.add(warning); constraint.fill = GridBagConstraints.NONE; constraint.anchor = GridBagConstraints.CENTER; constraint.weighty = 0.0; constraint.weightx = 0.0; constraint.gridwidth = 0; constraint.gridheight = 2; constraint.weighty = 0.0; constraint.weightx = 1.0; c.add(warningPanel, constraint); this.stepPanel = new StepPanel(); this.stepPanel.setStep(StepPanel.STEP_HOST_GRAPH); this.stepPanel.setPreferredSize(new Dimension(170, 90)); constraint.fill = GridBagConstraints.NONE; constraint.anchor = GridBagConstraints.EAST; constraint.weighty = 0.0; constraint.weightx = 0.0; constraint.gridwidth = 1; constraint.gridheight = 1; constraint.insets = new Insets(10, 10, 0, 0); c.add(this.stepPanel, constraint); JPanel listPanel = new JPanel(); listPanel.setPreferredSize(new Dimension(150, 150)); listPanel.setBackground(Color.lightGray); listPanel.setLayout(new GridBagLayout()); listPanel.setSize(100, 200); constraint.fill = GridBagConstraints.BOTH; constraint.weighty = 0.1; constraint.weightx = 0.0; constraint.gridwidth = GridBagConstraints.REMAINDER; constraint.gridheight = 1; constraint.insets = new Insets(0, 0, 0, 0); c.add(listPanel, constraint); JPanel spaceDummy = new JPanel(); spaceDummy.setBackground(Color.lightGray); spaceDummy.setSize(100, 1); constraint.weighty = 1.0; constraint.weightx = 1.0; c.add(spaceDummy, constraint); JSeparator js = new JSeparator(); constraint.weighty = 0.0; constraint.weightx = 1.0; constraint.insets = new Insets(0, 0, 5, 0); c.add(js, constraint); JPanel buttonPanel = new JPanel(); buttonPanel.setPreferredSize(new Dimension(350, 30)); // 200,30)); buttonPanel.setBackground(Color.lightGray); buttonPanel.setLayout(new GridBagLayout()); constraint.insets = new Insets(0, 0, 0, 0); constraint.weighty = 0.0; constraint.weightx = 0.0; c.add(buttonPanel, constraint); /* gragra namen liste */ this.gragraNamesVector = treeView.getGraGraNames(); this.gragraNames = new JList(this.gragraNamesVector); // treeView.getGraGraNames()); this.gragraNames.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); this.gragraNames.addListSelectionListener(this); this.scrollPane = new JScrollPane(this.gragraNames, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); this.scrollPane.setPreferredSize(new Dimension(150, 150)); constraint.fill = GridBagConstraints.NONE; constraint.anchor = GridBagConstraints.CENTER; constraint.weighty = 0.0; constraint.weightx = 0.0; constraint.gridwidth = GridBagConstraints.REMAINDER; constraint.gridheight = 1; constraint.insets = new Insets(10, 0, 0, 10); JLabel topic = new JLabel("from GraGra..."); topic.setForeground(Color.black); // topic.setFont(new Font("Times New Roman", Font.PLAIN, 14)); topic.setFont(new Font("Times New Roman", Font.BOLD, 14)); listPanel.add(topic, constraint); constraint.fill = GridBagConstraints.BOTH; constraint.weighty = 1.0; constraint.weightx = 1.0; listPanel.add(this.scrollPane, constraint); this.loadButton = new JButton("Load..."); this.loadButton.addActionListener(this); constraint.fill = GridBagConstraints.NONE; constraint.weighty = 0.0; constraint.weightx = 0.0; constraint.anchor = GridBagConstraints.CENTER; constraint.gridwidth = GridBagConstraints.REMAINDER; listPanel.add(this.loadButton, constraint); constraint.insets = new Insets(0, 0, 0, 0); constraint.fill = GridBagConstraints.BOTH; constraint.weighty = 0.0; constraint.weightx = 0.0; constraint.gridwidth = GridBagConstraints.REMAINDER; constraint.gridheight = 1;// GridBagConstraints.RELATIVE; /* gragra namen liste */ /* next und cancel button */ this.nextButton = new JButton(); this.nextButton.setText("Next"); this.nextButton.addActionListener(this); this.cancel = new JButton("Cancel"); this.cancel.addActionListener(this); JPanel dragPanel = new JPanel(); dragPanel.setBackground(Color.lightGray); dragPanel.setPreferredSize(new Dimension(100, 1)); constraint.fill = GridBagConstraints.BOTH; constraint.weighty = 1.0; constraint.weightx = 1.0; constraint.gridwidth = 1; constraint.gridheight = 1; buttonPanel.add(dragPanel, constraint); constraint.fill = GridBagConstraints.NONE; constraint.weighty = 0.0; constraint.weightx = 0.0; constraint.gridwidth = 1; constraint.gridheight = 1; buttonPanel.add(this.nextButton, constraint); JPanel spaceDummy2 = new JPanel(); spaceDummy2.setBackground(Color.lightGray); spaceDummy2.setPreferredSize(new Dimension(50, 1)); constraint.weighty = 1.0; constraint.weightx = 0.0; buttonPanel.add(spaceDummy2, constraint); constraint.weighty = 0.0; constraint.weightx = 0.0; constraint.gridwidth = 1; constraint.gridheight = 1; // constraint.gridwidth = GridBagConstraints.REMAINDER; buttonPanel.add(this.cancel, constraint); JPanel spaceDummy3 = new JPanel(); spaceDummy3.setBackground(Color.lightGray); spaceDummy3.setPreferredSize(new Dimension(20, 1)); constraint.weighty = 1.0; constraint.weightx = 0.0; constraint.gridwidth = GridBagConstraints.REMAINDER; buttonPanel.add(spaceDummy3, constraint); /* ENDE next und cancel button */ c.revalidate(); JScrollPane scroll = new JScrollPane(c); scroll.setPreferredSize(new Dimension(450, 300)); getContentPane().setLayout(new BorderLayout()); getContentPane().add(scroll, BorderLayout.CENTER); validate(); pack(); } private Frame frame; public void showDialog() { setLocationRelativeTo(this.frame); super.setVisible(true); } /** checks if a host graph is selected and sets the next step */ public void checkHostGraphAndNextStep() { if (this.hostGraph != null) { this.stepPanel.setStep(StepPanel.STEP_STOP_GRAPH); this.gragraNames.setSelectedIndex(-1); } } /** checks if a stop graph is selected and sets the next step */ public void checkStopGraphAndNextStep() { if (this.stopGraph != null) this.stepPanel.setStep(StepPanel.STEP_CRITICAL_PAIRS); } /** checks if the critical pairs are selected and sets the next step */ public void checkPairsAndNextStep() { setPairs(); if (this.criticalPairs != null || this.criticalPairGraGra != null) { this.stepPanel.setStep(StepPanel.STEP_FINISH); this.nextButton.setText("Finish"); if (this.criticalPairs != null) { this.criticalPairGraGra = null; } } } /** * sets either the host graph or the stop graph * * @param step * choose from StepPanel which graph to set */ private void setGraph(int step) { if (this.gragraNames.getSelectedValue() == null) return; if (step == StepPanel.STEP_HOST_GRAPH || step == StepPanel.STEP_STOP_GRAPH) { String name = (String) this.gragraNames.getSelectedValue(); boolean found = false; for (int i = 0; i < this.treeView.getGraGras().size() && !found; i++) { EdGraGra gragra = this.treeView.getGraGras().elementAt(i); if (name.equals(gragra.getName())) { found = true; switch (step) { case StepPanel.STEP_HOST_GRAPH: this.hostGraph = gragra; break; case StepPanel.STEP_STOP_GRAPH: this.stopGraph = gragra; break; default: break; } } } } } /** sets the critical pairs */ private void setPairs() { if (this.gragraNames.getSelectedValue() != null) { String nameStr = (String) this.gragraNames.getSelectedValue(); boolean found = false; for (int i = 0; i < this.treeView.getGraGras().size() && !found; i++) { EdGraGra gragra = this.treeView.getGraGras().elementAt(i); String name = nameStr; int indx = nameStr.indexOf("("); if (indx != -1) name = nameStr.substring(0, indx); // System.out.println(nameStr+" "+name); if (name.equals(gragra.getName())) { this.criticalPairGraGra = gragra; } } if (this.criticalPairGraGra == null && this.stopGraph != null) this.criticalPairGraGra = this.stopGraph; } else if (this.stopGraph != null) { this.criticalPairGraGra = this.stopGraph; } } /** checks if all information for the parser are set */ private void checkIfReadyToParse() { if (this.hostGraph != null) if (this.stopGraph != null) if (this.criticalPairs != null || this.criticalPairGraGra != null) { this.readyToParse = true; } } /** * if this returns true all information are set to start the parser * * @return Hopefully returns <I>true</I>. */ public boolean isReadyToParse() { return this.readyToParse; } /** just close the window */ private void quitDialog() { dispose(); } /** checks in which state the dialog is */ private void checkState() { switch (this.stepPanel.getStep()) { case StepPanel.STEP_HOST_GRAPH: checkHostGraphAndNextStep(); break; case StepPanel.STEP_STOP_GRAPH: checkStopGraphAndNextStep(); break; case StepPanel.STEP_CRITICAL_PAIRS: checkPairsAndNextStep(); break; case StepPanel.STEP_FINISH: checkIfReadyToParse(); quitDialog(); break; default: break; } } /** * loads a graph * * @param step * choose from StepPanel which graph to set */ @SuppressWarnings("unchecked") private void loadGraph(int step) { if (step == StepPanel.STEP_HOST_GRAPH || step == StepPanel.STEP_STOP_GRAPH) { // String fileName = ""; // String dirName = ""; GraGraLoad gragraLoad = new GraGraLoad((JFrame) this.parent); gragraLoad.setDirName(this.treeView.getFileDirectory()); EdGraGra loadedGraGra = null; gragraLoad.load(); if (gragraLoad.getGraGra() != null) { // dirName = gragraLoad.getDirName(); // fileName = gragraLoad.getFileName(); loadedGraGra = gragraLoad.getGraGra(); BaseFactory.theFactory().notify(loadedGraGra.getBasisGraGra()); // System.out.println(loadedGraGra); // add loaded name to list of gragra names String str = loadedGraGra.getName() + "(" + loadedGraGra.getFileName() + ")"; this.gragraNamesVector.addElement(str); this.gragraNames.setListData(this.gragraNamesVector); this.gragraNames.setSelectedIndex(this.gragraNamesVector.size() - 1); } switch (step) { case StepPanel.STEP_HOST_GRAPH: this.hostGraph = loadedGraGra; break; case StepPanel.STEP_STOP_GRAPH: this.stopGraph = loadedGraGra; break; default: break; } } } /** load the critical pairs */ @SuppressWarnings("unchecked") private void loadPairs() { this.criticalPairs = null; PairContainer excludePairContainer = null; GraGra nullGraGra = BaseFactory.theFactory().createGraGra(); this.cpOption.enableLayered(true); excludePairContainer = ParserFactory.createEmptyCriticalPairs( nullGraGra, this.cpOption); PairIOGUI pairIOgui = new PairIOGUI((JFrame) this.parent, excludePairContainer); pairIOgui.setDirectoryName(this.treeView.getFileDirectory()); Object o = pairIOgui.load(); if (o == null) return; String fileName = pairIOgui.getFileName(); if (!(o instanceof LayeredPairContainer)) this.cpOption.enableLayered(false); // add loaded name to list of gragra names String str = excludePairContainer.getGrammar().getName() + "(" + fileName + ")"; this.gragraNamesVector.addElement(str); this.gragraNames.setListData(this.gragraNamesVector); this.gragraNames.setSelectedIndex(this.gragraNamesVector.size() - 1); // set critical pairs this.criticalPairs = excludePairContainer; } /** control which step will be loaded */ private void load() { switch (this.stepPanel.getStep()) { case StepPanel.STEP_HOST_GRAPH: loadGraph(StepPanel.STEP_HOST_GRAPH); break; case StepPanel.STEP_STOP_GRAPH: loadGraph(StepPanel.STEP_STOP_GRAPH); break; case StepPanel.STEP_CRITICAL_PAIRS: loadPairs(); break; case StepPanel.STEP_FINISH: break; default: break; } } /** * evaluates the different buttons * * @param e * The different events frim the buttons. */ public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source == this.nextButton) { checkState(); } else if (source == this.cancel) { quitDialog(); } else if (source == this.loadButton) { load(); } } /** * evaluates the list of gragra names * * @param e * The event from the gragra name list. */ public void valueChanged(ListSelectionEvent e) { Object source = e.getSource(); if (source == this.gragraNames) { switch (this.stepPanel.getStep()) { case StepPanel.STEP_HOST_GRAPH: setGraph(StepPanel.STEP_HOST_GRAPH); break; case StepPanel.STEP_STOP_GRAPH: setGraph(StepPanel.STEP_STOP_GRAPH); break; case StepPanel.STEP_CRITICAL_PAIRS: setPairs(); break; case StepPanel.STEP_FINISH: break; default: break; } } } /** * return the information for the parser: here the host graph * * @return The returned host graph is choosen from the list or loaded. */ public EdGraGra getHostGraphGrammar() { return this.hostGraph; } /** * return the information for the parser: here the stop graph * * @return The returned stop graph is choosen from the list or loaded. */ public EdGraGra getStopGraphGrammar() { return this.stopGraph; } /** * return the information for the parser: here the gragra of the critical * pairs. This method returns ony a gragra if the user selects one in the * list. * * @return The gragra from the list. */ public EdGraGra getCriticalPairGraGra() { return this.criticalPairGraGra; } /** * return the information for the parser: here the critical pairs This * method returns only the critical pairs if they are loaded. * * @return The loaded critical pairs. */ public PairContainer getCriticalPairs() { return this.criticalPairs; } /* * this method starts only the dialog * * @deprecated use the main AGG gui to launch the parser * @param args * The parameters. */ // public static void main(String[] args) { // ParserDialog theFrame = new ParserDialog(null, null, null, null, null); // theFrame.show(); // } } /** * $Log: ParserDialog.java,v $ * Revision 1.11 2010/09/23 08:20:54 olga * tuning * * Revision 1.10 2010/04/13 15:06:09 olga * dialog layout improved * * Revision 1.9 2008/10/29 09:04:12 olga * new sub packages of the package agg.gui: typeeditor, editor, trafo, cpa, options, treeview, popupmenu, saveload * * Revision 1.8 2007/11/05 09:18:21 olga * code tuning * * Revision 1.7 2007/09/10 13:05:45 olga * In this update: * - package xerces2.5.0 is not used anymore; * - class com.objectspace.jgl.Pair is replaced by the agg own generic class agg.util.Pair; * - bugs fixed in: usage of PACs in rules; match completion; * usage of static method calls in attr. conditions * - graph editing: added some new features * Revision 1.6 2007/06/13 08:33:07 olga Update: * V161 * * Revision 1.5 2006/12/13 13:33:04 enrico reimplemented code * * Revision 1.4 2006/04/10 09:19:30 olga Import Type Graph, Import Graph - * tuning. Attr. member type check: if class does not exist. Graph constraints * for a layer of layered grammar. * * Revision 1.3 2006/03/01 09:55:47 olga - new CPA algorithm, new CPA GUI * * Revision 1.2 2005/10/10 08:05:16 olga Critical Pair GUI and CPA graph * * Revision 1.1 2005/08/25 11:56:55 enrico *** empty log message *** * * Revision 1.3 2005/07/11 09:30:20 olga This is test version AGG V1.2.8alfa . * What is new: - saving rule option <disabled> - setting trigger rule for layer - * display attr. conditions in gragra tree view - CPA algorithm <dependencies> - * creating and display CPA graph with conflicts and/or dependencies based on * (.cpx) file * * Revision 1.2 2005/06/20 13:37:04 olga Up to now the version 1.2.8 will be * prepared. * * Revision 1.1 2005/05/30 12:58:03 olga Version with Eclipse * * Revision 1.4 2004/06/28 08:09:55 olga Folgefehler Besetigung nach der * Anpassung der Attributekomponente fuer CPs * * Revision 1.3 2004/01/22 17:50:52 olga tests * * Revision 1.2 2003/03/05 18:24:09 komm sorted/optimized import statements * * Revision 1.1.1.1 2002/07/11 12:17:19 olga Imported sources * * Revision 1.8 2001/07/19 15:19:05 olga Arbeit an GUI * * Revision 1.7 2001/07/09 13:12:44 olga Aenderungen an GUI. Version heisst ab * jetzt 1.1 * * Revision 1.6 2001/07/04 10:40:05 olga Kleine GUI Aenderungen * * Revision 1.5 2001/05/14 11:52:58 olga Parser GUI Optimierung * * Revision 1.4 2001/04/11 14:57:00 olga Arbeit an der GUI. * * Revision 1.3 2001/03/08 13:46:09 olga Wenn keine kritische Paaren geladen * wurden, dann wird die Stop GraGra als kritische GraGra gesetzt. * * Revision 1.2 2001/03/08 11:02:47 olga Parser Anbindung gemacht. Stand nach * AGG GUI Reimplementierung. Stand nach der AGG GUI Reimplementierung.Das ist * Stand nach der AGG GUI Reimplementierung und Parser Anbindung. * * Revision 1.1.2.8 2001/01/28 13:14:46 shultzke API fertig * * Revision 1.1.2.7 2001/01/11 14:11:06 shultzke Laden und speicher in Parser * eingearbeitet * * Revision 1.1.2.6 2001/01/03 09:44:55 shultzke TODO's bis auf laden und * speichern erledigt. Wann meldet sich endlich Michael? * * Revision 1.1.2.5 2000/11/08 14:58:02 shultzke parser erste stufe fertig * */