2 * (C) Copyright IBM Corp. 1998-2007. All Rights Reserved.
\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
13 package com.ibm.richtext.swingui;
\r
15 import java.util.Hashtable;
\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
28 import javax.swing.event.ListSelectionEvent;
\r
29 import javax.swing.event.ListSelectionListener;
\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
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
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
50 import com.ibm.richtext.uiimpl.resources.FrameResources;
\r
51 import com.ibm.richtext.uiimpl.ResourceUtils;
\r
54 * Simple dialog that sets an attribute.
\r
56 final class JObjectDialog extends JDialog {
\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
65 private final MTextPanel fTextPanel;
\r
66 private final Object fKey;
\r
67 private boolean fCharacter;
\r
68 private Hashtable fNameToValueMap;
\r
70 private final JButton fOKButton;
\r
71 private final JButton fCancelButton;
\r
72 private final JList fItems;
\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
80 JObjectDialog(Frame parent,
\r
83 MTextPanel textPanel,
\r
89 super(parent, title, false);
\r
91 setupMap(names, values);
\r
93 Dimension size = new Dimension(250, 200);
\r
95 fTextPanel = textPanel;
\r
97 fCharacter = character;
\r
99 fItems = new JList(names);
\r
100 fItems.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
\r
102 fItems.addMouseListener(new MouseAdapter() {
\r
103 public void mouseClicked(MouseEvent e) {
\r
104 if (e.getClickCount() == 2) {
\r
110 JScrollPane listScroller = new JScrollPane(fItems);
\r
111 listScroller.setPreferredSize(size);
\r
112 listScroller.setPreferredSize(size);
\r
113 listScroller.setAlignmentX(LEFT_ALIGNMENT);
\r
115 JLabel label = new JLabel(message);
\r
116 label.setLabelFor(fItems);
\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
124 itemPanel.setLayout(new BoxLayout(itemPanel, BoxLayout.Y_AXIS));
\r
126 fCancelButton = new JButton(ResourceUtils.getResourceString(FrameResources.CANCEL));
\r
127 fOKButton = new JButton(ResourceUtils.getResourceString(FrameResources.OK));
\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
134 Container content = getContentPane();
\r
135 content.add(itemPanel, BorderLayout.CENTER);
\r
136 content.add(buttonPanel, BorderLayout.SOUTH);
\r
140 addWindowListener(new WindowAdapter() {
\r
141 public void windowClosing(WindowEvent e) {
\r
142 closeWindow(false);
\r
146 ActionListener listener = new ActionListener() {
\r
147 public void actionPerformed(ActionEvent e) {
\r
149 Object source = e.getSource();
\r
150 if (source == fOKButton) {
\r
153 else if (source == fCancelButton) {
\r
154 closeWindow(false);
\r
159 fOKButton.addActionListener(listener);
\r
160 fCancelButton.addActionListener(listener);
\r
162 selectStyles(values);
\r
165 private void setupMap(String[] names, Object[] values) {
\r
167 if (names.length != values.length) {
\r
168 throw new IllegalArgumentException("Must have same number of names and values.");
\r
171 fNameToValueMap = new Hashtable(names.length);
\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
181 private void closeWindow(boolean sendAction) {
\r
185 if (sendAction && fItems.getMinSelectionIndex() != fItems.getMaxSelectionIndex()) {
\r
186 sendAction = false;
\r
190 Object value = fNameToValueMap.get(fItems.getSelectedValue());
\r
197 * Handle the user input
\r
198 * @param value The value object
\r
200 private void sendAction(Object value) {
\r
202 StyleModifier modifier;
\r
203 if (value != null) {
\r
204 modifier = StyleModifier.createAddModifier(fKey, value);
\r
207 AttributeSet set = new AttributeSet(fKey);
\r
208 modifier = StyleModifier.createRemoveModifier(set);
\r
211 if (fCharacter == MenuItemSet.CHARACTER) {
\r
212 fTextPanel.modifyCharacterStyleOnSelection(modifier);
\r
215 fTextPanel.modifyParagraphStyleOnSelection(modifier);
\r
219 private void selectValue(Object value, Object[] values) {
\r
221 for (int i=0; i < values.length; i++) {
\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
231 private void selectStyles(Object[] values) {
\r
236 value = fTextPanel.getCharacterStyleOverSelection(fKey);
\r
239 value = fTextPanel.getParagraphStyleOverSelection(fKey);
\r
242 if (value != MTextPanel.MULTIPLE_VALUES) {
\r
243 selectValue(value, values);
\r
246 fOKButton.setEnabled(false);
\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
256 runVal = text.characterStyleAt(runStart).get(fKey);
\r
259 runVal = text.paragraphStyleAt(runStart).get(fKey);
\r
261 if (runVal == null) {
\r
262 runVal = fTextPanel.getDefaultValues().get(fKey);
\r
265 selectValue(runVal, values);
\r
266 if (runStart == text.length()) {
\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