source: trunk/gli/src/org/greenstone/gatherer/gui/WarningDialog.java@ 9888

Last change on this file since 9888 was 9864, checked in by mdewsnip, 19 years ago

Changed WarningDialog to take the direct message text, rather than the message text key. This makes it more flexible, allowing arguments in the message text (eg. used by PluginManager).

  • Property svn:keywords set to Author Date Id Revision
File size: 8.5 KB
Line 
1/**
2 *#########################################################################
3 *
4 * A component of the Gatherer application, part of the Greenstone digital
5 * library suite from the New Zealand Digital Library Project at the
6 * University of Waikato, New Zealand.
7 *
8 * Author: John Thompson, Greenstone Project, NZDL, University of Waikato
9 *
10 * Copyright (C) 2003 New Zealand Digital Library Project
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 *########################################################################
26 */
27package org.greenstone.gatherer.gui;
28
29import java.awt.*;
30import java.awt.event.*;
31import javax.swing.*;
32import org.greenstone.gatherer.Configuration;
33import org.greenstone.gatherer.Dictionary;
34import org.greenstone.gatherer.Gatherer;
35import org.greenstone.gatherer.util.Utility;
36
37
38/** A dialog that warns about something, and allows the user to turn off the warning in the future. */
39public class WarningDialog
40 extends ModalDialog
41 implements ActionListener, KeyListener
42{
43 static final private Dimension NORMAL_SIZE = new Dimension(450, 160);
44 static final private Dimension SETTING_SIZE = new Dimension(450, 200);
45
46 private int result = JOptionPane.CANCEL_OPTION;
47 private JButton cancel_button;
48 private JButton ok_button;
49 private JCheckBox show_check;
50 private JTextField value_field;
51 private JPanel value_panel;
52 private String affected_property;
53 private String full_property;
54
55
56 public WarningDialog(String warning_name, String warning_title_key, String warning_message, String affected_property, boolean can_cancel)
57 {
58 super(Gatherer.g_man, "Warning", true);
59
60 // Determine the name of this prompt.
61 this.affected_property = affected_property;
62 this.full_property = warning_name;
63
64 // Now build dialog.
65 if (affected_property != null) {
66 setSize(SETTING_SIZE);
67 }
68 else {
69 setSize(NORMAL_SIZE);
70 }
71 Dictionary.setText(this, warning_title_key);
72
73 // Creation
74 JPanel content_pane = (JPanel) getContentPane();
75 JPanel text_pane = new JPanel();
76 JLabel icon_label = new JLabel(Utility.getImage("gatherer_medium.gif"));
77
78 JTextArea text_area = new JTextArea();
79 text_area.setCaretPosition(0);
80 text_area.setEditable(false);
81 text_area.setLineWrap(true);
82 text_area.setText(warning_message);
83 text_area.setWrapStyleWord(true);
84
85 value_panel = new JPanel();
86 JLabel value_label = new JLabel();
87 Dictionary.setText(value_label, "WarningDialog.Value");
88
89 value_field = new JTextField();
90 JPanel bottom_pane = new JPanel();
91 show_check = new JCheckBox();
92 Dictionary.setText(show_check, "WarningDialog.Dont_Show_Again");
93 JPanel control_pane = new JPanel();
94 ok_button = new GLIButton();
95 ok_button.setMnemonic(KeyEvent.VK_O);
96 Dictionary.setBoth(ok_button, "General.OK", "General.OK_Tooltip");
97 cancel_button = new GLIButton();
98 cancel_button.setMnemonic(KeyEvent.VK_C);
99 Dictionary.setBoth(cancel_button, "General.Cancel", "General.Pure_Cancel_Tooltip");
100
101 // Connection
102 ok_button.addActionListener(this);
103 cancel_button.addActionListener(this);
104 ok_button.addKeyListener(this);
105 cancel_button.addKeyListener(this);
106 getRootPane().setDefaultButton(ok_button);
107
108 // Layout
109 icon_label.setBorder(BorderFactory.createEmptyBorder(0,0,0,5));
110
111 value_label.setBorder(BorderFactory.createEmptyBorder(0, icon_label.getPreferredSize().width, 0, 0));
112
113 value_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
114 value_panel.setLayout(new BorderLayout(5,0));
115 value_panel.add(value_label, BorderLayout.WEST);
116 value_panel.add(value_field, BorderLayout.CENTER);
117
118 text_pane.setLayout(new BorderLayout());
119 text_pane.add(icon_label, BorderLayout.WEST);
120 text_pane.add(new JScrollPane(text_area), BorderLayout.CENTER);
121 if(affected_property != null) {
122 text_pane.add(value_panel, BorderLayout.SOUTH);
123 }
124
125 if(can_cancel) {
126 control_pane.setLayout(new GridLayout(1,2,5,0));
127 control_pane.add(ok_button);
128 control_pane.add(cancel_button);
129 }
130 else {
131 control_pane.setLayout(new BorderLayout());
132 control_pane.add(ok_button, BorderLayout.EAST);
133 }
134
135 bottom_pane.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
136 bottom_pane.setLayout(new BorderLayout());
137 bottom_pane.add(show_check, BorderLayout.CENTER);
138 bottom_pane.add(control_pane, BorderLayout.EAST);
139
140 content_pane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
141 content_pane.setLayout(new BorderLayout());
142 content_pane.add(text_pane, BorderLayout.CENTER);
143 content_pane.add(bottom_pane, BorderLayout.SOUTH);
144
145 // Position
146 Dimension size = getSize();
147 if (Gatherer.g_man != null) {
148 Rectangle frame_bounds = Gatherer.g_man.getBounds();
149 setLocation(frame_bounds.x + (frame_bounds.width - size.width) / 2, frame_bounds.y + (frame_bounds.height - size.height) / 2);
150 }
151 else {
152 Dimension screen_size = Toolkit.getDefaultToolkit().getScreenSize();
153 setLocation((screen_size.width - size.width) / 2, (screen_size.height - size.height) / 2);
154 }
155 }
156
157 public void actionPerformed(ActionEvent event) {
158 boolean bad_value = false;
159 if(event.getSource() == ok_button) {
160 if(affected_property != null && Configuration.self != null) {
161 String value = value_field.getText();
162 if(value.length() > 0) {
163 if(value_field instanceof URLField) {
164 bad_value = !((URLField)value_field).validateURL();
165 }
166 if(!bad_value) {
167 // Store the value of the property
168 Configuration.setString(affected_property, true, value_field.getText());
169 }
170 }
171 }
172 if(!bad_value) {
173 result = JOptionPane.OK_OPTION;
174 }
175 }
176 if(!bad_value) {
177 if (Configuration.self != null) {
178 // Store the state of the show message checkbox.
179 Configuration.set(full_property, true, !show_check.isSelected());
180 }
181 // Done.
182 setVisible(false);
183 }
184 else {
185 JOptionPane.showMessageDialog(Gatherer.g_man, Dictionary.get("WarningDialog.Invalid_Value"), Dictionary.get("General.Error"), JOptionPane.ERROR_MESSAGE);
186 }
187 }
188
189 /** Gives notification of key events on the buttons */
190 public void keyPressed(KeyEvent e) {
191 if (e.getKeyCode() == KeyEvent.VK_ENTER) {
192 // Enter: Click the button in focus
193 Object source = e.getSource();
194 if (source instanceof AbstractButton) {
195 ((AbstractButton) source).doClick();
196 }
197 }
198 }
199
200 public void keyReleased(KeyEvent e) { }
201
202 public void keyTyped(KeyEvent e) { }
203
204
205 public int display() {
206 if (Configuration.self == null || Configuration.get(full_property, false)) {
207 setVisible(true);
208 }
209 // We are no longer showing this dialog, so result must always be true.
210 else {
211 result = JOptionPane.OK_OPTION;
212 }
213 // Ask the parent to repaint, just to be sure
214 if(Gatherer.g_man != null) {
215 Gatherer.g_man.repaint();
216 }
217 return result;
218 }
219
220 /** Allows you to specify whether this dialog is a warning dialog, or only a message dialog.
221 * @param message_only true if this dialog shows a message, false for a warning
222 */
223 public void setMessageOnly(boolean message_only) {
224 // If this is a message then change the checkbox
225 if(message_only) {
226 Dictionary.setText(show_check, "WarningDialog.Dont_Show_Again_Message");
227 }
228 // And if its a warning, change them back
229 else {
230 Dictionary.setText(show_check, "WarningDialog.Dont_Show_Again");
231 }
232 }
233
234 /** Allows you to replace the generic text field control with a JTextField subclass with further functionality. For instance you might provide a URLField to allow only valid URLs to be accepted.
235 * @param control the JTextField subclass you want to use for the control
236 */
237 public void setValueField(JTextField control) {
238 // Remove the current control
239 value_panel.remove(value_field);
240 // Replace with the new one
241 value_field = control;
242 // Re-add
243 value_panel.add(value_field, BorderLayout.CENTER);
244 }
245
246 protected void processWindowEvent(WindowEvent event) {
247 if(event.getID() == WindowEvent.WINDOW_ACTIVATED) {
248 if(affected_property != null) {
249 value_field.requestFocus();
250 }
251 else {
252 ok_button.requestFocus();
253 }
254 }
255 else {
256 super.processWindowEvent(event);
257 }
258 }
259}
Note: See TracBrowser for help on using the repository browser.