/* TagStyleToolBar.java created 2007-10-13 * */ package org.signalml.app.view.tag; import java.awt.Container; import java.awt.Dimension; import java.awt.Point; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.swing.Box; import javax.swing.ButtonGroup; import javax.swing.ButtonModel; import javax.swing.JButton; import javax.swing.JToolBar; import javax.swing.SwingUtilities; import org.apache.log4j.Logger; import org.signalml.app.action.tag.TagSelectionAction; import org.signalml.app.view.signal.popup.TagStylesPopupDialog; import org.signalml.domain.tag.StyledTagSet; import org.signalml.domain.tag.TagStyleEvent; import org.signalml.domain.tag.TagStyleListener; import org.signalml.plugin.export.signal.SignalSelectionType; import org.signalml.plugin.export.signal.TagStyle; import org.signalml.plugin.export.view.AbstractSignalMLAction; /** TagStyleToolBar * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o. */ public class TagStyleToolBar extends JToolBar implements TagStyleListener { private static final long serialVersionUID = 1L; protected static final Logger logger = Logger.getLogger(TagStyleToolBar.class); private StyledTagSet tagSet; private SignalSelectionType type; private ButtonGroup buttonGroup; private List<TagStyleToggleButton> buttonList; private Map<TagStyle,TagStyleToggleButton> styleToButtonMap; private Map<ButtonModel,TagStyle> buttonToStyleMap; private TagEraserToggleButton tagEraserToggleButton; private JButton showAllButton; private TagStylesPopupDialog tagStylesPopupDialog = null; private TagIconProducer tagIconProducer; private TagSelectionAction tagSelectionAction; private boolean tagSelectionOnButtonClick = false; private ActionListener buttonClickListener; public TagStyleToolBar(StyledTagSet tagSet, SignalSelectionType type, TagIconProducer tagIconProducer, TagSelectionAction tagSelectionAction) { super(JToolBar.VERTICAL); setFloatable(false); setBorder(null); this.tagSelectionAction = tagSelectionAction; this.tagSet = tagSet; this.type = type; this.tagIconProducer = tagIconProducer; buttonClickListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (tagSelectionOnButtonClick) { TagStyleToolBar.this.tagSelectionAction.actionPerformed(e); buttonGroup.clearSelection(); } } }; buttonGroup = new ButtonGroup(); buttonList = new LinkedList<TagStyleToggleButton>(); styleToButtonMap = new HashMap<TagStyle, TagStyleToggleButton>(); buttonToStyleMap = new HashMap<ButtonModel, TagStyle>(); tagEraserToggleButton = new TagEraserToggleButton(); tagEraserToggleButton.addActionListener(buttonClickListener); buttonGroup.add(tagEraserToggleButton); add(tagEraserToggleButton); add(Box.createVerticalStrut(3)); showAllButton = new JButton(new ShowAllAction()); add(Box.createVerticalStrut(5)); add(Box.createVerticalGlue()); add(showAllButton); Collection<TagStyle> styles; if (type == null) { styles = tagSet.getListOfStyles(); } else { styles = tagSet.getStyles(type); } for (TagStyle style : styles) { addTagStyle(style); } addComponentListener(new ToolBarListener()); tagSet.addTagStyleListener(this); if (styles.size() > 0) { buttonList.get(0).setSelected(true); } } public void close() { tagSet.removeTagStyleListener(this); tagStylesPopupDialog = null; removeAll(); tagSet = null; } public void clearSelection() { buttonGroup.clearSelection(); } public void assertAnySelection() { if (buttonGroup.getSelection() == null) { if (!buttonList.isEmpty()) { buttonGroup.setSelected(buttonList.get(0).getModel(), true); } else { buttonGroup.setSelected(tagEraserToggleButton.getModel(), true); } } } public StyledTagSet getTagSet() { return tagSet; } public SignalSelectionType getType() { return type; } public boolean isTagSelectionOnButtonClick() { return tagSelectionOnButtonClick; } public void setTagSelectionOnButtonClick(boolean tagSelectionOnButtonClick) { this.tagSelectionOnButtonClick = tagSelectionOnButtonClick; } public TagSelectionAction getTagSelectionAction() { return tagSelectionAction; } public TagStyle getSelectedStyle() { ButtonModel model = buttonGroup.getSelection(); if (model != null) { return buttonToStyleMap.get(model); } return null; } public void setSelectedStyle(TagStyle style) { if (style != null) { TagStyleToggleButton toolButton = styleToButtonMap.get(style); if (toolButton != null) { buttonGroup.setSelected(toolButton.getModel(), true); } } else { buttonGroup.setSelected(tagEraserToggleButton.getModel(), true); } } public TagIconProducer getTagIconProducer() { return tagIconProducer; } private void addTagStyle(TagStyle style) { TagStyleToggleButton toolButton = new TagStyleToggleButton(style, tagIconProducer); toolButton.addActionListener(buttonClickListener); buttonGroup.add(toolButton); buttonList.add(toolButton); styleToButtonMap.put(style, toolButton); buttonToStyleMap.put(toolButton.getModel(), style); this.add(toolButton,getComponentCount()-3); // insert before the spacer, glue and show all button resetVisibility(); tagStylesPopupDialog = null; } private void removeTagStyle(TagStyle style) { TagStyleToggleButton toolButton = styleToButtonMap.get(style); if (toolButton != null) { buttonGroup.remove(toolButton); buttonList.remove(toolButton); styleToButtonMap.remove(style); buttonToStyleMap.remove(toolButton.getModel()); this.remove(toolButton); resetVisibility(); tagStylesPopupDialog = null; } } private void resetVisibility() { if (isDisplayable()) { int minHeight = getMinimumSize().height; Dimension size = getSize(); int usedHeight = minHeight; int reqHeight; Iterator<TagStyleToggleButton> it = buttonList.iterator(); TagStyleToggleButton toolButton; boolean somethingHidden = false; while (it.hasNext()) { toolButton = it.next(); reqHeight = toolButton.getPreferredSize().height + 1; if ((usedHeight + reqHeight) > size.height) { toolButton.setVisible(false); somethingHidden = true; break; } toolButton.setVisible(true); usedHeight += reqHeight; } showAllButton.setEnabled(somethingHidden); while (it.hasNext()) { it.next().setVisible(false); } } } @Override public void tagStyleAdded(TagStyleEvent e) { TagStyle style = e.getTagStyle(); if (type == null || type.equals(style.getType())) { addTagStyle(style); } } @Override public void tagStyleChanged(TagStyleEvent e) { TagStyle style = e.getTagStyle(); if (type == null || type.equals(style.getType())) { TagStyleToggleButton toolButton = styleToButtonMap.get(style); if (toolButton != null) { tagStylesPopupDialog = null; toolButton.reset(); } tagIconProducer.reset(style); } } @Override public void tagStyleRemoved(TagStyleEvent e) { TagStyle style = e.getTagStyle(); if (type == null || type.equals(style.getType())) { removeTagStyle(style); tagIconProducer.reset(style); } } @Override public Dimension getMinimumSize() { return new Dimension(28, tagEraserToggleButton.getSize().height + 3 + 5 + 1 + showAllButton.getSize().height); } private class ToolBarListener extends ComponentAdapter { @Override public void componentResized(ComponentEvent e) { resetVisibility(); } } private class ShowAllAction extends AbstractSignalMLAction { private static final long serialVersionUID = 1L; public ShowAllAction() { super(); setIconPath("org/signalml/app/icon/showallstyles.png"); setToolTip("action.showAllTagStylesToolTip"); } @Override public void actionPerformed(ActionEvent e) { Container ancestor = getTopLevelAncestor(); if (tagStylesPopupDialog == null) { tagStylesPopupDialog = new TagStylesPopupDialog(TagStyleToolBar.this, (Window) ancestor, true); tagStylesPopupDialog.initializeNow(); } Point containerLocation = ancestor.getLocation(); Point location = SwingUtilities.convertPoint(showAllButton, new Point(0,0), ancestor); Dimension size = tagStylesPopupDialog.getSize(); location.translate(containerLocation.x, containerLocation.y+showAllButton.getSize().height-size.height); tagStylesPopupDialog.setLocation(location); tagStylesPopupDialog.showDialog(null); } } }