package agg.gui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.Vector; import javax.swing.DefaultListModel; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListCellRenderer; import javax.swing.ScrollPaneConstants; import javax.swing.border.TitledBorder; import agg.gui.event.EditEvent; import agg.gui.event.EditEventListener; import agg.gui.event.LoadEvent; import agg.gui.event.LoadEventListener; import agg.gui.event.SaveEvent; import agg.gui.event.SaveEventListener; import agg.gui.event.TreeViewEvent; import agg.gui.event.TreeViewEventListener; import agg.gui.event.TypeEvent; import agg.gui.event.TypeEventListener; import agg.gui.icons.MatchIcon; import agg.gui.icons.TextIcon; import agg.gui.parser.AGGParser; import agg.gui.parser.event.StatusMessageEvent; import agg.gui.parser.event.StatusMessageListener; import agg.gui.typeeditor.ArcTypePropertyEditor; import agg.gui.typeeditor.NodeTypePropertyEditor; import agg.parser.ParserEvent; import agg.parser.ParserEventListener; /** * * @author $Author: olga $ */ @SuppressWarnings("serial") public class StatusBar extends JPanel implements SaveEventListener, LoadEventListener, TreeViewEventListener, EditEventListener, StatusMessageListener, ParserEventListener, TypeEventListener { @SuppressWarnings({ "rawtypes", "unchecked" }) public StatusBar() { super(new BorderLayout(), true); setBackground(new Color(102, 200, 155)); this.mode = new JLabel(""); final JPanel modePanel = new JPanel(new BorderLayout()); modePanel.setBackground(new Color(102, 200, 155)); modePanel.setPreferredSize(new Dimension(40, 40)); modePanel.add(new JLabel(" "), BorderLayout.WEST); modePanel.add(this.mode, BorderLayout.CENTER); add(modePanel, BorderLayout.WEST); this.content = new JPanel(new BorderLayout()); this.content.setPreferredSize(new Dimension(550, 40)); this.content.setBackground(new Color(102, 200, 155)); this.statusJSP = new JScrollPane( ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); this.status = new JLabel(this.msg); this.status.setForeground(Color.blue); this.status.setIcon(new TextIcon(" ", true)); this.statusJSP.setViewportView(this.status); this.content.add(this.statusJSP, BorderLayout.CENTER); this.typePanel = new JPanel(); this.typePanel.setBorder(new TitledBorder("")); this.typeList = new JList(); this.typeList.setEnabled(true); this.typeList.setModel(new DefaultListModel()); this.typeList.setCellRenderer(new MyCellRenderer()); this.typePanel.add(this.typeList); this.types = new Vector<JLabel>(2); this.types.add(new JLabel(" ")); this.types.add(new JLabel(" ")); ((DefaultListModel) this.typeList.getModel()).add(0, ""); ((DefaultListModel) this.typeList.getModel()).add(1, ""); this.add(this.content, BorderLayout.CENTER); this.add(this.typePanel, BorderLayout.EAST); this.modeStr = ""; this.msg = ""; this.lastModeStr = this.modeStr; this.lastMsg = this.msg; final MouseListener ml = new MouseAdapter() { public void mouseEntered(MouseEvent e) { setMsg(StatusBar.this.mode.getToolTipText()); } }; this.mode.addMouseListener(ml); welcome(); } /** Gets my minimum dimension */ public Dimension getMinimumSize() { return new Dimension(0, 0); } /** Gets my preferred dimension */ public Dimension getPreferredSize() { return new Dimension(600, 50); } /** Removes the content of my status panel */ public void removeContent() { this.content.removeAll(); } /** Sets the content of my status panel */ public void setContent(Component comp) { // System.out.println("StatusBar.setContentOfStatus "); this.content.removeAll(); this.content.add(comp, BorderLayout.CENTER); } /** Resets the content of my main panel */ public void resetContent() { // System.out.println("StatusBar.resetContentOfStatus "); this.content.removeAll(); this.content.add(this.statusJSP, BorderLayout.CENTER); } /** Returns my status message */ public String getMsg() { return this.msg; } /** Returns my mode */ public String getMode() { return this.modeStr; } /* private void doResize(String s) { // System.out.println("StatusBar.doResize "); if (s == null) return; int l = s.length() * 6; if (status.getFontMetrics(status.getFont()) != null) l = status.getFontMetrics(status.getFont()).stringWidth(s); if (l > content.getWidth()) { status.setSize(new Dimension(l, getHeight())); } } */ /** Sets mode */ public void setMode(String aMode) { synchronized (this) { this.modeStr = aMode; Icon icon = getImageIcon(this.modeStr); if (icon != null) this.mode.setIcon(icon); else this.mode.setIcon(new TextIcon(this.modeStr, true)); this.mode.setToolTipText(""); } } /** Sets mode */ public void setMode(String aMode, String aToolTipText) { setMode(aMode); this.mode.setToolTipText(aToolTipText); } /** Sets mode */ public void setMode(Icon modeIcon, String aToolTipText) { this.mode.setIcon(modeIcon); this.mode.setToolTipText(aToolTipText); } /** Sets mode */ public void setMode(int modekey, String aToolTipText) { Icon icon = getImageIcon(modekey); if (icon != null) setMode(icon, aToolTipText); } /** Sets mode */ public void setMode(Object obj) { if (obj instanceof String) setMode((String) obj, ""); else if (obj instanceof Icon) setMode((Icon) obj, ""); } /** Sets status message */ public void setMsg(String aMessage) { if (this.msg == null || aMessage == null) return; if (!this.msg.equals(aMessage)) { this.msg = aMessage; this.status.setText(this.msg); // doResize(this.msg); // status.invalidate(); // status.repaint(); } } /** Sets mode */ public void set(String aMode, String aMessage, String aToolTipText) { this.modeStr = aMode; setMode(this.modeStr, aToolTipText); this.msg = aMessage; this.status.setText(this.msg); // doResize(this.msg); } /** Adds String aMessage to the status message */ public void addMsg(String aMessage) { String s = this.msg.concat(" / " + aMessage); this.msg = s; this.status.setText(this.msg); // doResize(this.msg); } public void reset() { if (this.lastModeStr.equals("Hi!")) { this.lastModeStr = ""; this.lastMsg = ""; } setMode(this.lastModeStr); setMsg(this.lastMsg); } public void setFrame(JFrame f) { // frame = f; } /* Implements agg.gui.event.SaveEventListener */ public void saveEventOccurred(SaveEvent e) { // System.out.println("StatusBar.saveEventOccurred " +e.getMsg()); int msgkey = e.getMsg(); if (msgkey == SaveEvent.SAVE) { if (!this.modeStr.equals("Save")) { setMode(new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/save.gif")), ""); this.lastModeStr = this.modeStr; this.lastMsg = this.msg; this.modeStr = "Save"; } setMsg(e.getMessage()); revalidate(); } else if (msgkey == SaveEvent.PROGRESS_BEGIN) { if (e.getUsedComponent() != null) { removeContent(); setContent(e.getUsedComponent()); } return; } else if (msgkey == SaveEvent.PROGRESS_FINISHED) { if (e.getUsedComponent() != null) { removeContent(); resetContent(); } return; } setMsg(e.getMessage()); } /* Implements agg.gui.event.LoadEventListener */ public void loadEventOccurred(LoadEvent e) { // System.out.println("StatusBar.loadEventOccurred " +e.getMsg()); int msgkey = e.getMsg(); if (msgkey == LoadEvent.LOAD) { this.lastModeStr = this.modeStr; this.lastMsg =this. msg; this.modeStr = "Load"; setMode(new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/open.gif")), ""); setMsg(e.getMessage()); } else if (msgkey == LoadEvent.PROGRESS_BEGIN) { if (e.getUsedComponent() != null) { removeContent(); setContent(e.getUsedComponent()); } return; } else if (msgkey == LoadEvent.PROGRESS_FINISHED) { removeContent(); resetContent(); return; } setMsg(e.getMessage()); } /* Implements agg.gui.event.TreeViewEventListener */ public void treeViewEventOccurred(TreeViewEvent e) { // System.out.println("StatusBar.treeViewEventOccurred "+e.getMsg()); int msgkey = e.getMsg(); if (msgkey == TreeViewEvent.CONVERT_STEP) { setMsg(e.getMessage()); } else if (msgkey == TreeViewEvent.CONVERTED) { setMsg(e.getMessage()); } else if (msgkey == TreeViewEvent.RULE_COPY) { setMsg(e.getMessage()); } } /* Implements agg.gui.event.EditEventListener */ public void editEventOccurred(EditEvent e) { // System.out.println("StatusBar.editEventOccurred: "+e.getSource().getClass().getName()+" :: "+e.getMsg()); int msgkey = e.getMsg(); if (msgkey == agg.gui.editor.EditorConstants.DRAW || msgkey == agg.gui.editor.EditorConstants.SELECT || msgkey == agg.gui.editor.EditorConstants.MOVE || msgkey == agg.gui.editor.EditorConstants.ATTRIBUTES || msgkey == agg.gui.editor.EditorConstants.MAP || msgkey == agg.gui.editor.EditorConstants.UNMAP || msgkey == agg.gui.editor.EditorConstants.INTERACT_MATCH || msgkey == agg.gui.editor.EditorConstants.VIEW) { // setMode(e.getMode(), e.getMessage()); this.modeStr = e.getMode(); setMode(msgkey, e.getMessage()); setMsg(e.getMessage()); } else if (msgkey == EditEvent.EDIT_PROCEDURE) { setMsg(e.getMessage()); // System.out.println("StatusBar: "+status.getText()); } else if (msgkey == EditEvent.NO_EDIT_PROCEDURE) { this.modeStr = ""; setMode("", ""); setMsg(e.getMessage()); } } /* Implements agg.gui.parser.event.StatusMessageListener */ public void newMessage(StatusMessageEvent e) { // System.out.println("StatusBar.StatusMessageEvent "); // System.out.println("von: "+e.getSource()); // System.out.println("Msg: "+e.getMessage()); // System.out.println("AGG mode: "+modeStr); if ((e.getSource() instanceof agg.gui.cpa.CriticalPairAnalysisGUI) || (e.getSource() instanceof agg.gui.cpa.CriticalPairAnalysis)) { if (!this.modeStr.equals("CriticPairs")) { this.lastModeStr = this.modeStr; this.lastMsg = this.msg; } this.modeStr = "CriticPairs"; setMode(new TextIcon("CP", true), ""); String s = ""; if (e.getMessage().indexOf("finished") != -1) { if (e.getMessage().indexOf("Critical") != -1) { s = " You can select rule pairs on the left to see results."; System.out.println(s); } } else if (e.getMessage().indexOf("back") != -1) { this.lastMsg = ""; reset(); } if (e.getMessage() != "") setMsg(e.getMessage() + s); } else if (e.getSource() instanceof AGGParser) { if (!this.modeStr.equals("Parser")) { this.lastModeStr = this.modeStr; this.lastMsg = this.msg; } this.modeStr = "Parser"; setMode(new TextIcon("P", true), ""); String s = ""; if (e.getMessage().indexOf("finished") != -1) { if (e.getMessage().indexOf("Critical") != -1) { s = " Please choice menu - Parser / Start - to start parsing."; System.out.println(s); } } else if (e.getMessage().indexOf("back") != -1) { this.lastMsg = ""; reset(); } if (e.getMessage() != "") setMsg(e.getMessage() + s); } // System.out.println("AGG mode: "+modeStr); } /* Implements agg.parser.ParserEventListener */ public void parserEventOccured(ParserEvent e) { // System.out.println("StatusBar.parserEventOccured "+e.getMessage()); // System.out.println("von: "+e.getSource()); // System.out.println("Msg: "+e.getMessage()); if (e.getMessage() != null) { String s = ""; if (e.getMessage().indexOf("Starting") != -1) { if (!this.modeStr.equals("Parser") && !this.modeStr.equals("CriticPairs")) { this.lastModeStr = this.modeStr; this.lastMsg = this.msg; } } else if (e.getMessage().indexOf("Generate") != -1) { if (!this.modeStr.equals("Parser") && !this.modeStr.equals("CriticPairs")) { this.lastModeStr = this.modeStr; this.lastMsg = this.msg; } } else if (e.getMessage().indexOf("loaded") != -1) { if (!this.modeStr.equals("Parser") && !this.modeStr.equals("CriticPairs")) { this.lastModeStr = this.modeStr; this.lastMsg = this.msg; } } else if (e.getMessage().indexOf("finished") != -1) { if (this.modeStr.equals("Parser") && (e.getMessage().indexOf("Critical") != -1)) { s = " Please choice menu - Parser / Start - to start parsing."; } // else if( modeStr.equals("CriticPairs") ) // s = " You can select rule pairs to see results."; else s = ""; } if (!s.equals("")) setMsg(s); else setMsg(e.getMessage()); } } public void welcome() { setMode("Hi !", ""); setMsg(" Welcome to AGG - The Attributed Graph Grammar System."); } private Icon getImageIcon(int modekey) { Icon image = null; if (modekey == agg.gui.editor.EditorConstants.DRAW) image = new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/draw_mode.gif")); else if (modekey == agg.gui.editor.EditorConstants.SELECT) image = new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/select_mode.gif")); else if (modekey == agg.gui.editor.EditorConstants.MOVE) image = new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/move_mode.gif")); else if (modekey == agg.gui.editor.EditorConstants.ATTRIBUTES) image = new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/attributes_mode.gif")); else if (modekey == agg.gui.editor.EditorConstants.MAP) image = new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/map_mode.gif")); else if (modekey == agg.gui.editor.EditorConstants.UNMAP) image = new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/unmap_mode.gif")); else if (modekey == agg.gui.editor.EditorConstants.INTERACT_MATCH) { MatchIcon matchIcon = new MatchIcon(Color.black); matchIcon.setEnabled(true); image = matchIcon; } // else if(modekey == agg.editor.impl.EditorConstants.VIEW) // image = new TextIcon("V", true); return image; } private Icon getImageIcon(String modestr) { Icon image = null; if (modestr.equals("Draw")) image = new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/draw_mode.gif")); else if (modestr.equals("Select")) image = new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/select_mode.gif")); else if (modestr.equals("Move")) image = new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/move_mode.gif")); else if (modestr.equals("Attributes")) image = new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/attributes_mode.gif")); else if (modestr.equals("Map")) image = new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/map_mode.gif")); else if (modestr.equals("Unmap")) image = new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/unmap_mode.gif")); else if (modestr.equals("Match")) { MatchIcon matchIcon = new MatchIcon(Color.black); matchIcon.setEnabled(true); image = matchIcon; } else if (modestr.equals("Load")) { image = new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/open.gif")); } else if (modestr.equals("Save")) { image = new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/save.gif")); } else if (modestr.equals("Print")) { image = new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/print.gif")); } else if (modestr.equals("Parser")) { image = new ImageIcon(ClassLoader .getSystemResource("agg/lib/icons/Baustelle.gif")); } // else if(modestr.equals("View")) // image = new TextIcon("V", true); return image; } /** Implements TypeEventListener.typeEventOccurred */ public void typeEventOccurred(TypeEvent e) { // System.out.println("StatusBar.typeEventOccurred:: "+e.getSource()); if (e.getMsg() == TypeEvent.SELECTED_NODE_TYPE) updateTypes(0, (JLabel) e.getUsedObject()); else if (e.getMsg() == TypeEvent.SELECTED_ARC_TYPE) updateTypes(1, (JLabel) e.getUsedObject()); else if (e.getMsg() == TypeEvent.SELECTED) { updateTypes(e.getIndexOfObject(), (JLabel) e.getUsedObject()); } else if (e.getMsg() == TypeEvent.MODIFIED_CHANGED) { if (e.getSource() instanceof NodeTypePropertyEditor) { updateTypes(0, ((NodeTypePropertyEditor)e.getSource()). getTypeEditor().getTypePalette().getSelectedNodeTypeLabel()); } else if (e.getSource() instanceof ArcTypePropertyEditor) { updateTypes(1, ((ArcTypePropertyEditor)e.getSource()). getTypeEditor().getTypePalette().getSelectedArcTypeLabel()); } } } @SuppressWarnings({ "rawtypes", "unchecked" }) public void updateTypes(int index, JLabel typeLabel) { this.types.remove(index); if (typeLabel == null) this.types.add(index, new JLabel("")); else this.types.add(index, typeLabel); String typeName = ""; if (typeLabel != null) typeName = typeLabel.getText(); ((DefaultListModel) this.typeList.getModel()).remove(index); ((DefaultListModel) this.typeList.getModel()).add(index, typeName); } // Display an icon and a string for each object in the list. @SuppressWarnings("rawtypes") class MyCellRenderer extends JLabel implements ListCellRenderer { // This is the only method defined by ListCellRenderer. // We just reconfigure the JLabel each time we're called. public Component getListCellRendererComponent(JList list, Object value, // value to display int index, // cell index boolean isSelected, // is the cell selected boolean cellHasFocus) // the list and the cell have the focus { String str = ""; if (value.toString().length()>0) str = value.toString()+" "; if (list == StatusBar.this.typeList && !StatusBar.this.types.isEmpty()) { Icon icon = StatusBar.this.types.get(index).getIcon(); setIcon(icon); setForeground(StatusBar.this.types.get(index).getForeground()); } setText(str); setBackground(list.getBackground()); setEnabled(list.isEnabled()); setFont(list.getFont()); setOpaque(true); return this; } } // private JFrame frame; private final JPanel typePanel; @SuppressWarnings("rawtypes") final JList typeList; final Vector<JLabel> types; final JLabel mode; private final JPanel content; private final JScrollPane statusJSP; private final JLabel status; private String msg = ""; private String modeStr = ""; private String lastModeStr = ""; private String lastMsg = ""; }