/* SignalPlotOptionsPopupDialog.java created 2007-11-22 * */ package org.signalml.app.view.signal.popup; import static org.signalml.app.util.i18n.SvarogI18n._; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.LinkedList; import java.util.List; import javax.swing.Box; import javax.swing.DefaultComboBoxModel; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JToggleButton; import javax.swing.SwingConstants; import javax.swing.border.EmptyBorder; import org.signalml.app.util.IconUtils; import org.signalml.app.view.common.components.ResolvableComboBox; import org.signalml.app.view.common.components.TitledCrossBorder; import org.signalml.app.view.signal.SignalColor; import org.signalml.app.view.signal.SignalPlot; import org.signalml.app.view.signal.SignalView; import org.signalml.app.view.tag.TagPaintMode; import org.signalml.plugin.export.SignalMLException; import org.signalml.plugin.export.view.AbstractPopupDialog; /** SignalPlotOptionsPopupDialog * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o. */ public class SignalPlotOptionsPopupDialog extends AbstractPopupDialog { private static final long serialVersionUID = 1L; private SignalView signalView; private List<Component> buttonPanelComponents = new LinkedList<Component>(); private JComboBox tagPaintModeComboBox; private JComboBox signalColorComboBox; private JCheckBox signalXORCheckBox; public SignalPlotOptionsPopupDialog(Window w, boolean isModal) { super(w, isModal); } public SignalView getSignalView() { return signalView; } public void setSignalView(SignalView view) { this.signalView = view; } @Override public JComponent createInterface() { createButtons(); JPanel interfacePanel = new JPanel(new BorderLayout()); interfacePanel.setBorder(new TitledCrossBorder(_("Plot options"), true)); JPanel buttonPanel = new JPanel(); buttonPanel.setBorder(new EmptyBorder(3,3,3,3)); buttonPanel.setLayout(new GridLayout(buttonPanelComponents.size(), 1, 3, 3)); for (Component c : buttonPanelComponents) { if (c instanceof JComponent) { ((JComponent) c).setAlignmentX(Component.CENTER_ALIGNMENT); } buttonPanel.add(c); } interfacePanel.add(buttonPanel, BorderLayout.WEST); interfacePanel.add(createSettingPanel(), BorderLayout.CENTER); return interfacePanel; } private JPanel createSettingPanel() { JPanel settingPanel = new JPanel(); settingPanel.setBorder(new EmptyBorder(3,3,3,3)); GroupLayout layout = new GroupLayout(settingPanel); settingPanel.setLayout(layout); layout.setAutoCreateContainerGaps(false); layout.setAutoCreateGaps(true); JLabel tagPaintModeLabel = new JLabel(_("Tag mode")); JLabel signalColorLabel = new JLabel(_("Signal color")); JLabel signalXORLabel = new JLabel(""); GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup(); hGroup.addGroup( layout.createParallelGroup(Alignment.LEADING) .addComponent(tagPaintModeLabel) .addComponent(signalColorLabel) .addComponent(signalXORLabel) ); hGroup.addGroup( layout.createParallelGroup(Alignment.TRAILING) .addComponent(getTagPaintModeComboBox()) .addComponent(getSignalColorComboBox()) .addComponent(getSignalXORCheckBox()) ); layout.setHorizontalGroup(hGroup); GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup(); vGroup.addGroup( layout.createParallelGroup(Alignment.BASELINE) .addComponent(tagPaintModeLabel) .addComponent(getTagPaintModeComboBox()) ); vGroup.addGroup( layout.createParallelGroup(Alignment.BASELINE) .addComponent(signalColorLabel) .addComponent(getSignalColorComboBox()) ); vGroup.addGroup( layout.createParallelGroup(Alignment.BASELINE) .addComponent(signalXORLabel) .addComponent(getSignalXORCheckBox()) ); layout.setVerticalGroup(vGroup); return settingPanel; } public JComboBox getTagPaintModeComboBox() { if (tagPaintModeComboBox == null) { tagPaintModeComboBox = new ResolvableComboBox(); tagPaintModeComboBox.setModel(new DefaultComboBoxModel(TagPaintMode.values())); tagPaintModeComboBox.setSelectedItem(signalView.getMasterPlot().getTagPaintMode()); tagPaintModeComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (SignalPlot plot : signalView.getPlots()) { plot.setTagPaintMode((TagPaintMode) tagPaintModeComboBox.getSelectedItem()); } } }); } return tagPaintModeComboBox; } public JComboBox getSignalColorComboBox() { if (signalColorComboBox == null) { signalColorComboBox = new ResolvableComboBox(); signalColorComboBox.setModel(new DefaultComboBoxModel(SignalColor.values())); signalColorComboBox.setSelectedItem(signalView.getMasterPlot().getSignalColor()); signalColorComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (SignalPlot plot : signalView.getPlots()) { plot.setSignalColor((SignalColor) signalColorComboBox.getSelectedItem()); } } }); } return signalColorComboBox; } public JCheckBox getSignalXORCheckBox() { if (signalXORCheckBox == null) { signalXORCheckBox = new JCheckBox(_("XOR")); signalXORCheckBox.setHorizontalTextPosition(SwingConstants.LEFT); signalXORCheckBox.setSelected(signalView.getMasterPlot().isSignalXOR()); signalXORCheckBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { for (SignalPlot plot : signalView.getPlots()) { plot.setSignalXOR(signalXORCheckBox.isSelected()); } } }); } return signalXORCheckBox; } private void createButtons() { SignalPlot plot = signalView.getMasterPlot(); final JToggleButton antialiasButton = new JToggleButton(_("Antialiasing"), IconUtils.loadClassPathIcon("org/signalml/app/icon/antialias.png")); antialiasButton.setToolTipText(_("Toggle plot antialiasing")); antialiasButton.setSelected(plot.isAntialiased()); final JToggleButton clampButton = new JToggleButton(_("Clamp values"), IconUtils.loadClassPathIcon("org/signalml/app/icon/clamp.png")); clampButton.setToolTipText(_("Toggle value clamping (causes faster drawing)")); clampButton.setSelected(plot.isClamped()); final JToggleButton offscreenChannelsDrawnButton = new JToggleButton(_("Draw offscreen channels")); offscreenChannelsDrawnButton.setIcon(IconUtils.loadClassPathIcon("org/signalml/app/icon/drawoffscreen.png")); offscreenChannelsDrawnButton.setToolTipText(_("Toggle drawing of channels whose normal drawing area is completely outside the window (causes slower drawing)")); offscreenChannelsDrawnButton.setSelected(plot.isOffscreenChannelsDrawn()); final JToggleButton pageLinesVisibleButton = new JToggleButton(_("Page lines")); pageLinesVisibleButton.setIcon(IconUtils.loadClassPathIcon("org/signalml/app/icon/pagelines.png")); pageLinesVisibleButton.setToolTipText(_("Show page boundaries (only if not too dense)")); pageLinesVisibleButton.setSelected(plot.isPageLinesVisible()); final JToggleButton blockLinesVisibleButton = new JToggleButton(_("Block lines")); blockLinesVisibleButton.setIcon(IconUtils.loadClassPathIcon("org/signalml/app/icon/blocklines.png")); blockLinesVisibleButton.setToolTipText(_("Show block boundaries (only if not too dense)")); blockLinesVisibleButton.setSelected(plot.isBlockLinesVisible()); final JToggleButton channelLinesVisibleButton = new JToggleButton(_("Channel lines")); channelLinesVisibleButton.setIcon(IconUtils.loadClassPathIcon("org/signalml/app/icon/channellines.png")); channelLinesVisibleButton.setToolTipText(_("Show channel center zero levels (only if not too dense)")); channelLinesVisibleButton.setSelected(plot.isChannelLinesVisible()); final JToggleButton tagToolTipsVisibleButton = new JToggleButton(_("Tag tool tips")); tagToolTipsVisibleButton.setIcon(IconUtils.loadClassPathIcon("org/signalml/app/icon/tagtooltips.png")); tagToolTipsVisibleButton.setToolTipText(_("Show tool tips when mouse hovers over a tag")); tagToolTipsVisibleButton.setSelected(plot.isTagToolTipsVisible()); final JToggleButton optimizeDisplayingButton = new JToggleButton(_("Optimize signal displaying")); optimizeDisplayingButton.setIcon(IconUtils.loadClassPathIcon("org/signalml/app/icon/waiting.png")); optimizeDisplayingButton.setToolTipText(_("Does not draw all of the signal samples")); optimizeDisplayingButton.setSelected(plot.isOptimizeSignalDisplaying()); antialiasButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (SignalPlot plot : signalView.getPlots()) { plot.setAntialiased(antialiasButton.isSelected()); } } }); clampButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (SignalPlot plot : signalView.getPlots()) { plot.setClamped(clampButton.isSelected()); } } }); offscreenChannelsDrawnButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (SignalPlot plot : signalView.getPlots()) { plot.setOffscreenChannelsDrawn(offscreenChannelsDrawnButton.isSelected()); } } }); pageLinesVisibleButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (SignalPlot plot : signalView.getPlots()) { plot.setPageLinesVisible(pageLinesVisibleButton.isSelected()); } } }); blockLinesVisibleButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (SignalPlot plot : signalView.getPlots()) { plot.setBlockLinesVisible(blockLinesVisibleButton.isSelected()); } } }); channelLinesVisibleButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (SignalPlot plot : signalView.getPlots()) { plot.setChannelLinesVisible(channelLinesVisibleButton.isSelected()); } } }); tagToolTipsVisibleButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (SignalPlot plot : signalView.getPlots()) { plot.setTagToolTipsVisible(tagToolTipsVisibleButton.isSelected()); } } }); optimizeDisplayingButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (SignalPlot plot : signalView.getPlots()) { plot.setOptimizeSignalDisplaying(optimizeDisplayingButton.isSelected()); } } }); buttonPanelComponents.add(pageLinesVisibleButton); buttonPanelComponents.add(blockLinesVisibleButton); buttonPanelComponents.add(channelLinesVisibleButton); buttonPanelComponents.add(tagToolTipsVisibleButton); buttonPanelComponents.add(Box.createRigidArea(new Dimension(1,1))); buttonPanelComponents.add(antialiasButton); buttonPanelComponents.add(clampButton); buttonPanelComponents.add(offscreenChannelsDrawnButton); buttonPanelComponents.add(optimizeDisplayingButton); } @Override public void fillDialogFromModel(Object model) throws SignalMLException { // XXX nothing to do but should fill dialog from signalView if plot options can change // from anywhere else but here (some kind of load defaults perhaps) } @Override public void fillModelFromDialog(Object model) throws SignalMLException { // nothing to do } @Override public boolean supportsModelClass(Class<?> clazz) { return (clazz == null); } @Override public boolean isCancellable() { return false; } @Override public boolean isFormClickApproving() { return true; } @Override public boolean isControlPanelEquipped() { return false; } }