EMMA Coverage Report (generated Sun Apr 20 22:38:01 CEST 2008)
[all classes][net.sf.jomic.ui]

COVERAGE SUMMARY FOR SOURCE FILE [ColorSettingMenuItem.java]

nameclass, %method, %block, %line, %
ColorSettingMenuItem.java67%  (2/3)46%  (6/13)45%  (153/337)43%  (29.1/68)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class ColorSettingMenuItem$CancelActionListener100% (1/1)50%  (2/4)36%  (14/39)39%  (3.5/9)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/6)0%   (0/2)
setOldColor (Color): void 0%   (0/1)0%   (0/12)0%   (0/3)
<static initializer> 100% (1/1)53%  (8/15)53%  (0.5/1)
ColorSettingMenuItem$CancelActionListener (ColorSettingMenuItem): void 100% (1/1)100% (6/6)100% (3/3)
     
class ColorSettingMenuItem100% (1/1)44%  (4/9)47%  (139/298)43%  (25.5/59)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/42)0%   (0/10)
dispose (): void 0%   (0/1)0%   (0/13)0%   (0/4)
propertyChange (PropertyChangeEvent): void 0%   (0/1)0%   (0/65)0%   (0/12)
setColor (Color): void 0%   (0/1)0%   (0/7)0%   (0/2)
stateChanged (ChangeEvent): void 0%   (0/1)0%   (0/16)0%   (0/4)
<static initializer> 100% (1/1)68%  (17/25)70%  (1.4/2)
ColorSettingMenuItem (String, String): void 100% (1/1)90%  (73/81)95%  (16.1/17)
getColor (): Color 100% (1/1)100% (6/6)100% (1/1)
updateColorIcon (): void 100% (1/1)100% (43/43)100% (7/7)
     
class ColorSettingMenuItem$10%   (0/1)100% (0/0)100% (0/0)100% (0/0)

1// Jomic - a viewer for comic book archives.
2// Copyright (C) 2004-2008 Thomas Aglassinger
3//
4// This program is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// This program is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with this program.  If not, see <http://www.gnu.org/licenses/>.
16package net.sf.jomic.ui;
17 
18import java.awt.Color;
19import java.awt.event.ActionEvent;
20import java.awt.event.ActionListener;
21import java.awt.image.BufferedImage;
22import java.beans.PropertyChangeEvent;
23import java.beans.PropertyChangeListener;
24 
25import javax.swing.ImageIcon;
26import javax.swing.JColorChooser;
27import javax.swing.JDialog;
28import javax.swing.JMenuItem;
29import javax.swing.colorchooser.ColorSelectionModel;
30import javax.swing.event.ChangeEvent;
31import javax.swing.event.ChangeListener;
32 
33import net.sf.jomic.common.JomicTools;
34import net.sf.jomic.common.Settings;
35import net.sf.jomic.tools.ImageTools;
36import net.sf.jomic.tools.StringTools;
37import net.sf.wraplog.Logger;
38 
39/**
40 *  JMenuItem to change a setting of type <code>Color</code>. The current color is shown as icon
41 *  next to the menu label. When selecting the item, a JColorChooser allows to change the value.
42 *
43 * @see       net.sf.jomic.common.Settings
44 * @see       javax.swing.JColorChooser
45 * @author    Thomas Aglassinger
46 */
47public class ColorSettingMenuItem extends JMenuItem implements ActionListener, ChangeListener, PropertyChangeListener
48{
49    private static final int COLOR_ICON_INSET = 3;
50    private static final int MIN_COLOR_ICON_SIZE = 4;
51    private static Logger logger = Logger.getLogger(ColorSettingMenuItem.class);
52    private CancelActionListener cancelListener;
53    private JColorChooser chooser;
54    private ColorSelectionModel colorSelectionModel;
55    private JDialog dialog;
56    private ImageTools imageTools;
57    private JomicTools jomicTools;
58    private String label;
59    private String propertyName;
60    private Settings settings;
61 
62    /**
63     *  Create a new ColorSettingMenuItem labeled <code>newLabel</code> with its value obtained from
64     *  property <code>newPropertyName</code>.
65     *
66     * @see                     Settings
67     * @param  newLabel         label for the menu item
68     * @param  newPropertyName  name of the property that stores the value of the color
69     */
70    public ColorSettingMenuItem(String newLabel, String newPropertyName) {
71        super(newLabel);
72        assert newLabel != null;
73        assert newPropertyName != null;
74        imageTools = ImageTools.instance();
75        jomicTools = JomicTools.instance();
76        settings = Settings.instance();
77        label = newLabel;
78        propertyName = newPropertyName;
79        // initialize color icon
80        updateColorIcon();
81        chooser = new JColorChooser(getColor());
82        colorSelectionModel = chooser.getSelectionModel();
83        colorSelectionModel.addChangeListener(this);
84        cancelListener = new CancelActionListener();
85        dialog = JColorChooser.createDialog(null, label, false, chooser, null, cancelListener);
86        addActionListener(this);
87        settings.addPropertyChangeListener(propertyName, this);
88    }
89 
90    /**
91     *  Set color property to <code>newColor</code>.
92     */
93    public void setColor(Color newColor) {
94        settings.setColorProperty(propertyName, newColor);
95    }
96 
97    public Color getColor() {
98        return settings.getColorProperty(propertyName);
99    }
100 
101    /**
102     *  Open JColorChooser to let user adjust the color.
103     *
104     * @see    JColorChooser
105     */
106    public void actionPerformed(ActionEvent event) {
107        try {
108            assert event != null;
109            Object source = event.getSource();
110 
111            assert source == this;
112 
113            if (!dialog.isVisible()) {
114                cancelListener.setOldColor(getColor());
115            }
116            dialog.setVisible(true);
117        } catch (Throwable error) {
118            jomicTools.showError(null, "errors.cannotShowDialogToChangeBackgroundColor", error);
119        }
120    }
121 
122    public void dispose() {
123        settings.removePropertyChangeListener(propertyName, this);
124        removeActionListener(this);
125        dialog.dispose();
126    }
127 
128    public void propertyChange(PropertyChangeEvent event) {
129        try {
130            assert event != null;
131            assert event.getSource() == settings;
132            String oldColorText = (String) event.getOldValue();
133            String newColorText = (String) event.getNewValue();
134 
135            if (logger.isInfoEnabled()) {
136                logger.info("property " + propertyName + " changed from " + oldColorText + " to " + newColorText);
137            }
138            if ((newColorText != null) && !newColorText.equals(oldColorText)) {
139                updateColorIcon();
140            }
141        } catch (Throwable error) {
142            jomicTools.showError(event, error);
143        }
144    }
145 
146    /**
147     *  Update color property on change in JColorChooser.
148     */
149    public void stateChanged(ChangeEvent event) {
150        assert event != null;
151        Color newColor = chooser.getColor();
152 
153        setColor(newColor);
154    }
155 
156    private void updateColorIcon() {
157        int iconSize = Math.max(MIN_COLOR_ICON_SIZE, getPreferredSize().height - 2 * COLOR_ICON_INSET);
158        Color newColor = settings.getColorProperty(propertyName);
159        BufferedImage image = imageTools.createColorBox(iconSize, iconSize, newColor);
160 
161        if (logger.isInfoEnabled()) {
162            logger.info("set color to " + StringTools.instance().colorString(newColor));
163        }
164 
165        setIcon(new ImageIcon(image));
166    }
167 
168    /**
169     *  Action listener called when JColorChooser is cancelled.
170     *
171     * @author    Thomas Aglassinger
172     */
173    private final class CancelActionListener implements ActionListener
174    {
175        private Color oldColor;
176 
177        private CancelActionListener() {
178            super();
179        }
180 
181        /**
182         *  Set the color to revert to when JColorChooser gets cancelled.
183         */
184        private void setOldColor(Color newOldColor) {
185            assert newOldColor != null;
186            oldColor = newOldColor;
187        }
188 
189        /**
190         *  Restore background color to value before JColorChooser was opened, and enable this
191         *  JMenuItem again.
192         *
193         * @see    java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
194         */
195        public void actionPerformed(ActionEvent event) {
196            setColor(oldColor);
197        }
198    }
199}

[all classes][net.sf.jomic.ui]
EMMA 2.0.4217 (C) Vladimir Roubtsov