]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_2_1-src/src/com/ibm/richtext/swingui/JObjectDialog.java
go
[Dictionary.git] / jars / icu4j-4_2_1-src / src / com / ibm / richtext / swingui / JObjectDialog.java
1 /*\r
2  * (C) Copyright IBM Corp. 1998-2007.  All Rights Reserved.\r
3  *\r
4  * The program is provided "as is" without any warranty express or\r
5  * implied, including the warranty of non-infringement and the implied\r
6  * warranties of merchantibility and fitness for a particular purpose.\r
7  * IBM will not be liable for any damages suffered by you as a result\r
8  * of using the Program. In no event will IBM be liable for any\r
9  * special, indirect or consequential damages or lost profits even if\r
10  * IBM has been advised of the possibility of their occurrence. IBM\r
11  * will not be liable for any third party claims against you.\r
12  */\r
13 package com.ibm.richtext.swingui;\r
14 \r
15 import java.util.Hashtable;\r
16 \r
17 import javax.swing.Box;\r
18 import javax.swing.BorderFactory;\r
19 import javax.swing.BoxLayout;\r
20 import javax.swing.JDialog;\r
21 import javax.swing.JPanel;\r
22 import javax.swing.JScrollPane;\r
23 import javax.swing.JButton;\r
24 import javax.swing.JList;\r
25 import javax.swing.JLabel;\r
26 import javax.swing.ListSelectionModel;\r
27 \r
28 import javax.swing.event.ListSelectionEvent;\r
29 import javax.swing.event.ListSelectionListener;\r
30 \r
31 import java.awt.BorderLayout;\r
32 import java.awt.Container;\r
33 import java.awt.Dimension;\r
34 import java.awt.Frame;\r
35 import java.awt.FlowLayout;\r
36 \r
37 import java.awt.event.ActionEvent;\r
38 import java.awt.event.ActionListener;\r
39 import java.awt.event.MouseEvent;\r
40 import java.awt.event.MouseAdapter;\r
41 import java.awt.event.WindowEvent;\r
42 import java.awt.event.WindowAdapter;\r
43 \r
44 import com.ibm.richtext.textlayout.attributes.AttributeSet;\r
45 import com.ibm.richtext.styledtext.MConstText;\r
46 import com.ibm.richtext.styledtext.StyleModifier;\r
47 import com.ibm.richtext.textpanel.MTextPanel;\r
48 import com.ibm.richtext.uiimpl.MenuItemSet;\r
49 \r
50 import com.ibm.richtext.uiimpl.resources.FrameResources;\r
51 import com.ibm.richtext.uiimpl.ResourceUtils;\r
52 \r
53 /**\r
54 * Simple dialog that sets an attribute.\r
55 */\r
56 final class JObjectDialog extends JDialog {\r
57 \r
58     /**\r
59      * For serialization\r
60      */\r
61     private static final long serialVersionUID = -9183651131772308979L;\r
62     //static final String COPYRIGHT =\r
63     //            "(C) Copyright IBM Corp. 1998-1999 - All Rights Reserved";\r
64 \r
65     private final MTextPanel fTextPanel;\r
66     private final Object fKey;\r
67     private boolean fCharacter;\r
68     private Hashtable fNameToValueMap;\r
69     \r
70     private final JButton fOKButton;\r
71     private final JButton fCancelButton;\r
72     private final JList fItems;\r
73     \r
74     /**\r
75     * Construct a new JObjectDialog.\r
76     * @param parent the dialog's parent frame\r
77     * @param title the dialogs title\r
78     * @param message the message displayed next to the input box\r
79     */\r
80     JObjectDialog(Frame parent,\r
81                   String title, \r
82                   String message, \r
83                   MTextPanel textPanel,\r
84                   Object key,\r
85                   boolean character,\r
86                   String[] names,\r
87                   Object[] values) {\r
88                     \r
89         super(parent, title, false);\r
90 \r
91         setupMap(names, values);\r
92         \r
93         Dimension size = new Dimension(250, 200);\r
94         \r
95         fTextPanel = textPanel;\r
96         fKey = key;\r
97         fCharacter = character;\r
98         \r
99         fItems = new JList(names);\r
100         fItems.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);\r
101         \r
102         fItems.addMouseListener(new MouseAdapter() {\r
103             public void mouseClicked(MouseEvent e) {\r
104                 if (e.getClickCount() == 2) {\r
105                     closeWindow(true);\r
106                 }\r
107             }\r
108         });\r
109         \r
110         JScrollPane listScroller = new JScrollPane(fItems);\r
111         listScroller.setPreferredSize(size);\r
112         listScroller.setPreferredSize(size);\r
113         listScroller.setAlignmentX(LEFT_ALIGNMENT);\r
114 \r
115         JLabel label = new JLabel(message);\r
116         label.setLabelFor(fItems);\r
117         \r
118         JPanel itemPanel = new JPanel();\r
119         itemPanel.add(label);\r
120         itemPanel.add(Box.createRigidArea(new Dimension(0,5)));\r
121         itemPanel.add(listScroller);\r
122         itemPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));\r
123         \r
124         itemPanel.setLayout(new BoxLayout(itemPanel, BoxLayout.Y_AXIS));\r
125         \r
126         fCancelButton = new JButton(ResourceUtils.getResourceString(FrameResources.CANCEL));\r
127         fOKButton = new JButton(ResourceUtils.getResourceString(FrameResources.OK));\r
128         \r
129         JPanel buttonPanel = new JPanel();\r
130         buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));\r
131         buttonPanel.add(fCancelButton);\r
132         buttonPanel.add(fOKButton);\r
133         \r
134         Container content = getContentPane();\r
135         content.add(itemPanel, BorderLayout.CENTER);\r
136         content.add(buttonPanel, BorderLayout.SOUTH);\r
137 \r
138         pack();\r
139 \r
140         addWindowListener(new WindowAdapter() {\r
141             public void windowClosing(WindowEvent e) {\r
142                 closeWindow(false);\r
143             }\r
144         });\r
145         \r
146         ActionListener listener = new ActionListener() {\r
147             public void actionPerformed(ActionEvent e) {\r
148             \r
149                 Object source = e.getSource();\r
150                 if (source == fOKButton) {\r
151                     closeWindow(true);\r
152                 }\r
153                 else if (source == fCancelButton) {\r
154                     closeWindow(false);\r
155                 }\r
156             }\r
157         };\r
158         \r
159         fOKButton.addActionListener(listener);\r
160         fCancelButton.addActionListener(listener);\r
161         \r
162         selectStyles(values);\r
163     }\r
164     \r
165     private void setupMap(String[] names, Object[] values) {\r
166     \r
167         if (names.length != values.length) {\r
168             throw new IllegalArgumentException("Must have same number of names and values.");\r
169         }\r
170         \r
171         fNameToValueMap = new Hashtable(names.length);\r
172         \r
173         for (int i=0; i < names.length; i++) {\r
174             if (values[i] != null) {\r
175                 fNameToValueMap.put(names[i], values[i]);\r
176             }\r
177         }\r
178 \r
179     }\r
180 \r
181     private void closeWindow(boolean sendAction) {\r
182 \r
183         setVisible(false);\r
184         \r
185         if (sendAction && fItems.getMinSelectionIndex() != fItems.getMaxSelectionIndex()) {\r
186             sendAction = false;\r
187         }\r
188         \r
189         if (sendAction) {\r
190             Object value = fNameToValueMap.get(fItems.getSelectedValue());\r
191             sendAction(value);\r
192         }\r
193         dispose();\r
194     }\r
195 \r
196     /**\r
197     * Handle the user input\r
198     * @param value The value object\r
199     */\r
200     private void sendAction(Object value) {\r
201 \r
202         StyleModifier modifier;\r
203         if (value != null) {\r
204             modifier = StyleModifier.createAddModifier(fKey, value);\r
205         }\r
206         else {\r
207             AttributeSet set = new AttributeSet(fKey);\r
208             modifier = StyleModifier.createRemoveModifier(set);\r
209         }\r
210 \r
211         if (fCharacter == MenuItemSet.CHARACTER) {\r
212             fTextPanel.modifyCharacterStyleOnSelection(modifier);\r
213         }\r
214         else {\r
215             fTextPanel.modifyParagraphStyleOnSelection(modifier);\r
216         }\r
217     }\r
218     \r
219     private void selectValue(Object value, Object[] values) {\r
220     \r
221         for (int i=0; i < values.length; i++) {\r
222         \r
223             if ((value != null && value.equals(values[i])) || (value == null && values[i] == null)) {\r
224                 fItems.addSelectionInterval(i, i);\r
225                 fItems.ensureIndexIsVisible(i);\r
226                 return;\r
227             }\r
228         }\r
229     }\r
230     \r
231     private void selectStyles(Object[] values) {\r
232     \r
233         Object value;\r
234  \r
235         if (fCharacter) {\r
236             value = fTextPanel.getCharacterStyleOverSelection(fKey);\r
237         }\r
238         else {\r
239             value = fTextPanel.getParagraphStyleOverSelection(fKey);\r
240         }\r
241         \r
242         if (value != MTextPanel.MULTIPLE_VALUES) {\r
243             selectValue(value, values);\r
244         }\r
245         else {\r
246             fOKButton.setEnabled(false);\r
247             \r
248             int selLimit = fTextPanel.getSelectionEnd();\r
249             MConstText text = fTextPanel.getText();\r
250             for (int runStart = fTextPanel.getSelectionStart(); runStart <= selLimit;\r
251                     runStart = fCharacter? text.characterStyleLimit(runStart) : \r
252                                            text.paragraphLimit(runStart)) {\r
253             \r
254                 Object runVal;\r
255                 if (fCharacter) {\r
256                     runVal = text.characterStyleAt(runStart).get(fKey);\r
257                 }\r
258                 else {\r
259                     runVal = text.paragraphStyleAt(runStart).get(fKey);\r
260                 }\r
261                 if (runVal == null) {\r
262                     runVal = fTextPanel.getDefaultValues().get(fKey);\r
263                 }\r
264                 \r
265                 selectValue(runVal, values);\r
266                 if (runStart == text.length()) {\r
267                     break;\r
268                 }\r
269             }\r
270         }\r
271         \r
272         fItems.addListSelectionListener(new ListSelectionListener() {\r
273             public void valueChanged(ListSelectionEvent e) {\r
274                 fItems.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
275                 fOKButton.setEnabled(true);\r
276                 fItems.removeListSelectionListener(this);\r
277             }\r
278         });\r
279     }\r
280 }\r