1 package org.columba.calendar.ui.dialog; 19 20 import java.awt.BorderLayout ; 21 import java.awt.GridLayout ; 22 import java.awt.event.ActionEvent ; 23 import java.awt.event.ActionListener ; 24 import java.awt.event.KeyEvent ; 25 import java.util.Calendar ; 26 27 import javax.swing.BorderFactory ; 28 import javax.swing.JButton ; 29 import javax.swing.JCheckBox ; 30 import javax.swing.JComboBox ; 31 import javax.swing.JComponent ; 32 import javax.swing.JDialog ; 33 import javax.swing.JFrame ; 34 import javax.swing.JLabel ; 35 import javax.swing.JPanel ; 36 import javax.swing.JScrollPane ; 37 import javax.swing.JTextArea ; 38 import javax.swing.JTextField ; 39 import javax.swing.KeyStroke ; 40 import javax.swing.SwingConstants ; 41 42 import org.columba.calendar.base.CalendarItem; 43 import org.columba.calendar.model.api.IEventInfo; 44 import org.columba.calendar.model.api.IRecurrence; 45 import org.columba.calendar.ui.comp.CalendarPicker; 46 import org.columba.calendar.ui.comp.DatePicker; 47 import org.columba.calendar.ui.comp.TimePicker; 48 import org.columba.core.gui.base.ButtonWithMnemonic; 49 import org.columba.core.gui.base.SingleSideEtchedBorder; 50 import org.columba.core.gui.util.DialogHeaderPanel; 51 import org.columba.core.help.HelpManager; 52 import org.columba.core.resourceloader.IconKeys; 53 import org.columba.core.resourceloader.ImageLoader; 54 import org.columba.mail.util.MailResourceLoader; 55 56 import com.jgoodies.forms.builder.PanelBuilder; 57 import com.jgoodies.forms.layout.CellConstraints; 58 import com.jgoodies.forms.layout.FormLayout; 59 60 61 public class EditEventDialog extends JDialog implements ActionListener { 62 63 JTextField summaryTextField = new JTextField (); 64 65 JTextField locationTextField = new JTextField (); 66 67 JTextArea descriptionTextArea = new JTextArea (3, 40); 68 69 JComboBox classComboBox = new JComboBox (); 70 71 CalendarPicker calendarPicker = new CalendarPicker(); 72 73 JTextField categoriesTextField = new JTextField (); 74 75 JButton categoriesButton = new JButton (); 76 77 JCheckBox allDayCheckBox = new JCheckBox (); 78 79 TimePicker startTimePicker = new TimePicker(); 80 81 TimePicker endTimePicker = new TimePicker(); 82 83 JCheckBox alarmCheckBox = new JCheckBox (); 84 85 JComboBox alarmComboBox = new JComboBox (); 86 87 JButton alarmButton = new JButton (); 88 89 JButton recurrenceButton = new JButton (); 91 JCheckBox recurrenceCheckBox = new JCheckBox (); 92 93 DatePicker startDayDatePicker; 94 95 DatePicker endDayDatePicker; 96 97 boolean success = false; 98 99 private IEventInfo model; 100 101 public EditEventDialog(JFrame parentFrame, IEventInfo model) { 102 super(parentFrame, true); 103 104 this.model = model; 105 106 startDayDatePicker = new DatePicker(); 107 108 endDayDatePicker = new DatePicker(); 109 110 alarmComboBox.addItem("15 minutes before"); 111 alarmComboBox.addItem("1 hour before"); 112 alarmComboBox.addItem("1 day before"); 113 114 classComboBox.addItem("Private"); 115 classComboBox.addItem("Public"); 116 classComboBox.addItem("Confidential"); 117 118 descriptionTextArea.setEnabled(true); 119 categoriesButton.setEnabled(false); 120 categoriesTextField.setEnabled(false); 121 allDayCheckBox.setEnabled(true); 122 classComboBox.setEnabled(false); 123 124 categoriesButton.setEnabled(false); 125 alarmButton.setEnabled(false); 126 alarmCheckBox.setEnabled(false); 127 alarmComboBox.setEnabled(false); 128 recurrenceButton.setEnabled(false); 129 130 setLayout(new BorderLayout ()); 131 getContentPane().add( 132 new DialogHeaderPanel("New Appointment", 133 "Edit Appointment Properties", ImageLoader 134 .getIcon(IconKeys.USER)), 135 BorderLayout.NORTH); 136 getContentPane().add(createPanel(), BorderLayout.CENTER); 137 getContentPane().add(createButtonPanel(), BorderLayout.SOUTH); 138 139 getRootPane().registerKeyboardAction(this, "CANCEL", 140 KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), 141 JComponent.WHEN_IN_FOCUSED_WINDOW); 142 143 updateComponents(true); 144 145 pack(); 146 setLocationRelativeTo(null); 147 setVisible(true); 148 149 } 150 151 private JPanel createButtonPanel() { 152 JPanel bottom = new JPanel (); 153 bottom.setLayout(new BorderLayout ()); 154 bottom.setBorder(new SingleSideEtchedBorder(SwingConstants.TOP)); 155 156 ButtonWithMnemonic cancelButton = new ButtonWithMnemonic( 157 MailResourceLoader.getString("global", "cancel")); 158 159 cancelButton.addActionListener(this); 161 cancelButton.setActionCommand("CANCEL"); 163 ButtonWithMnemonic okButton = new ButtonWithMnemonic(MailResourceLoader 164 .getString("global", "ok")); 165 166 okButton.addActionListener(this); 168 okButton.setActionCommand("OK"); okButton.setDefaultCapable(true); 170 getRootPane().setDefaultButton(okButton); 171 172 ButtonWithMnemonic helpButton = new ButtonWithMnemonic( 173 MailResourceLoader.getString("global", "help")); 174 175 HelpManager.getInstance().enableHelpOnButton(helpButton, 177 "configuring_columba"); 178 179 JPanel buttonPanel = new JPanel (); 180 buttonPanel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12)); 181 buttonPanel.setLayout(new GridLayout (1, 3, 6, 0)); 182 buttonPanel.add(okButton); 183 buttonPanel.add(cancelButton); 184 buttonPanel.add(helpButton); 185 186 bottom.add(buttonPanel, BorderLayout.EAST); 187 188 return bottom; 189 } 190 191 private JPanel createPanel() { 192 JPanel jpanel1 = new JPanel (); 193 FormLayout formlayout1 = new FormLayout( 194 "FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:DEFAULT:NONE,FILL:DEFAULT:NONE", 195 "3dlu,CENTER:DEFAULT:NONE,3dlu,FILL:DEFAULT:GROW(1.0),6dlu,CENTER:DEFAULT:NONE,3dlu,CENTER:DEFAULT:NONE,3dlu"); 196 CellConstraints cc = new CellConstraints(); 197 jpanel1.setLayout(formlayout1); 198 199 PanelBuilder b = new PanelBuilder(formlayout1); 200 b.setDefaultDialogBorder(); 201 202 b.addSeparator("General Information", cc.xywh(2, 2, 2, 1)); 203 204 b.add(createPanel1(), cc.xy(3, 4)); 205 206 b.addSeparator("Date and Time", cc.xywh(2, 6, 2, 1)); 207 208 b.add(createPanel2(), cc.xy(3, 8)); 209 210 return b.getPanel(); 211 } 212 213 private JPanel createPanel1() { 214 JPanel jpanel1 = new JPanel (); 215 FormLayout formlayout1 = new FormLayout( 216 "3dlu,FILL:DEFAULT:NONE,3dlu,FILL:DEFAULT:GROW(1.0),3dlu,FILL:DEFAULT:NONE,3dlu,FILL:DEFAULT:NONE", 217 "3dlu,CENTER:DEFAULT:NONE,3dlu,CENTER:DEFAULT:NONE,3dlu,CENTER:DEFAULT:NONE,3dlu,CENTER:DEFAULT:NONE,3dlu,FILL:DEFAULT:GROW(1.0)"); 218 CellConstraints cc = new CellConstraints(); 219 jpanel1.setLayout(formlayout1); 220 221 JLabel jlabel1 = new JLabel (); 222 jlabel1.setText("Summary:"); 223 jpanel1.add(jlabel1, new CellConstraints(2, 2, CellConstraints.RIGHT, 224 CellConstraints.DEFAULT)); 225 226 JLabel jlabel2 = new JLabel (); 227 jlabel2.setText("Location:"); 228 jpanel1.add(jlabel2, new CellConstraints(2, 4, CellConstraints.RIGHT, 229 CellConstraints.DEFAULT)); 230 231 JLabel jlabel3 = new JLabel (); 232 jlabel3.setText("Description:"); 233 jpanel1.add(jlabel3, new CellConstraints(2, 10, 1, 1, 234 CellConstraints.DEFAULT, CellConstraints.TOP)); 235 236 JLabel jlabel4 = new JLabel (); 237 jlabel4.setText("Class:"); 238 jpanel1.add(jlabel4, new CellConstraints(2, 6, CellConstraints.RIGHT, 239 CellConstraints.DEFAULT)); 240 241 jpanel1.add(summaryTextField, cc.xywh(4, 2, 5, 1)); 242 243 jpanel1.add(locationTextField, cc.xywh(4, 4, 5, 1)); 244 245 JScrollPane jscrollpane1 = new JScrollPane (); 246 jscrollpane1.setViewportView(descriptionTextArea); 247 jscrollpane1 248 .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 249 jscrollpane1 250 .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 251 jpanel1.add(jscrollpane1, cc.xywh(4, 10, 5, 1)); 252 253 jpanel1.add(classComboBox, cc.xy(4, 6)); 254 255 JLabel jlabel5 = new JLabel (); 256 jlabel5.setText("Calendar:"); 257 jpanel1.add(jlabel5, new CellConstraints(6, 6, CellConstraints.RIGHT, 258 CellConstraints.DEFAULT)); 259 260 jpanel1.add(calendarPicker, cc.xy(8, 6)); 261 262 jpanel1.add(new JLabel ("Categories:"), new CellConstraints(2, 8, 263 CellConstraints.RIGHT, CellConstraints.DEFAULT)); 264 265 jpanel1.add(categoriesTextField, cc.xywh(4, 8, 3, 1)); 266 267 categoriesButton.setActionCommand("Categories..."); 268 categoriesButton.setText("Select ..."); 269 jpanel1.add(categoriesButton, cc.xy(8, 8)); 270 271 return jpanel1; 272 } 273 274 private JPanel createPanel2() { 275 JPanel jpanel1 = new JPanel (); 276 FormLayout formlayout1 = new FormLayout( 277 "3dlu,FILL:DEFAULT:NONE,3dlu,FILL:DEFAULT:GROW(1.0),3dlu,FILL:DEFAULT:GROW(1.0),3dlu,FILL:DEFAULT:NONE", 278 "3dlu,FILL:DEFAULT:NONE,3dlu,FILL:DEFAULT:NONE,3dlu,FILL:DEFAULT:NONE,3dlu,FILL:DEFAULT:NONE,3dlu"); 279 CellConstraints cc = new CellConstraints(); 280 jpanel1.setLayout(formlayout1); 281 282 JLabel jlabel1 = new JLabel (); 283 jlabel1.setText("Start Time:"); 284 jpanel1.add(jlabel1, new CellConstraints(2, 2, 1, 1, 285 CellConstraints.RIGHT, CellConstraints.DEFAULT)); 286 287 allDayCheckBox.setActionCommand("All Day"); 288 allDayCheckBox.addActionListener(this); 289 allDayCheckBox.setText("All Day"); 290 jpanel1.add(allDayCheckBox, cc.xy(8, 2)); 291 292 JLabel jlabel2 = new JLabel (); 293 jlabel2.setText("End Time:"); 294 jpanel1.add(jlabel2, new CellConstraints(2, 4, 1, 1, 295 CellConstraints.RIGHT, CellConstraints.DEFAULT)); 296 297 jpanel1.add(startDayDatePicker, cc.xy(4, 2)); 298 299 jpanel1.add(endDayDatePicker, cc.xy(4, 4)); 300 301 jpanel1.add(startTimePicker, cc.xy(6, 2)); 302 303 jpanel1.add(endTimePicker, cc.xy(6, 4)); 304 305 alarmCheckBox.setActionCommand("Alarm"); 306 alarmCheckBox.setText("Alarm"); 307 jpanel1.add(alarmCheckBox, new CellConstraints(2, 6, 1, 1, 308 CellConstraints.RIGHT, CellConstraints.DEFAULT)); 309 310 jpanel1.add(createPanel3(), cc.xywh(4, 6, 3, 1)); 311 312 recurrenceCheckBox.setText("Recurrence"); 313 recurrenceCheckBox.setActionCommand("Recurrence"); 314 recurrenceCheckBox.addActionListener(this); 315 jpanel1.add(recurrenceCheckBox, new CellConstraints(2, 8, 1, 1, 316 CellConstraints.RIGHT, CellConstraints.DEFAULT)); 317 318 jpanel1.add(createPanel4(), cc.xywh(4, 8, 3, 1)); 319 320 return jpanel1; 321 } 322 323 private JPanel createPanel3() { 324 JPanel jpanel1 = new JPanel (); 325 FormLayout formlayout1 = new FormLayout( 326 "FILL:DEFAULT:GROW(1.0),3dlu,FILL:DEFAULT:NONE", 327 "CENTER:DEFAULT:NONE"); 328 CellConstraints cc = new CellConstraints(); 329 jpanel1.setLayout(formlayout1); 330 331 jpanel1.add(alarmComboBox, cc.xy(1, 1)); 332 333 alarmButton.setActionCommand("Customize..."); 334 alarmButton.setText("Customize..."); 335 jpanel1.add(alarmButton, cc.xy(3, 1)); 336 337 return jpanel1; 338 } 339 340 private JPanel createPanel4() { 341 JPanel jpanel4 = new JPanel (); 342 343 FormLayout formlayout1 = new FormLayout( 344 "CENTER:DEFAULT:NONE,3dlu,FILL:DEFAULT:NONE", 345 "CENTER:DEFAULT:NONE"); 346 CellConstraints cc = new CellConstraints(); 347 jpanel4.setLayout(formlayout1); 348 349 recurrenceButton.setActionCommand("RecurrenceDialog"); 350 recurrenceButton.setText("Recurrence..."); 351 recurrenceButton.addActionListener(this); 352 353 jpanel4.add(recurrenceButton, cc.xy(1, 1)); 354 return jpanel4; 355 } 356 357 public boolean success() { 358 return success; 359 } 360 361 public void updateComponents(boolean b) { 362 if (b) { 363 summaryTextField.setText(model.getEvent().getSummary()); 364 locationTextField.setText(model.getEvent().getLocation()); 365 categoriesTextField.setText(model.getEvent().getCategories()); 366 descriptionTextArea.setText(model.getEvent().getDescription()); 367 368 if (model.getEvent().isAllDayEvent()) { 369 startTimePicker.setEnabled(false); 371 endTimePicker.setEnabled(false); 372 } else { 373 startTimePicker.setEnabled(true); 375 endTimePicker.setEnabled(true); 376 } 377 378 Calendar start = model.getEvent().getDtStart(); 379 startDayDatePicker.setDate(start); 380 startTimePicker.setTime(start.get(Calendar.HOUR_OF_DAY), start.get(Calendar.MINUTE)); 381 Calendar end = model.getEvent().getDtEnd(); 382 endDayDatePicker.setDate(end); 383 endTimePicker.setTime(end.get(Calendar.HOUR_OF_DAY), end.get(Calendar.MINUTE)); 384 385 allDayCheckBox.setSelected(model.getEvent().isAllDayEvent()); 386 387 String calendar = model.getCalendar(); 388 if ( calendar != null ) 389 calendarPicker.setSelectedItem(model.getCalendar()); 390 else 391 calendarPicker.setSelectedIndex(0); 392 393 if (model.getEvent().getRecurrence() != null && model.getEvent().getRecurrence().getType() != IRecurrence.RECURRENCE_NONE) { 394 recurrenceCheckBox.setSelected(true); 395 recurrenceButton.setEnabled(true); 396 } 397 398 categoriesTextField.setText(model.getEvent().getCategories()); 399 400 } else { 401 model.getEvent().setSummary(summaryTextField.getText()); 402 model.getEvent().setLocation(locationTextField.getText()); 403 model.getEvent().setCategories(categoriesTextField.getText()); 404 model.getEvent().setDescription(descriptionTextArea.getText()); 405 406 Calendar start = startDayDatePicker.getDate(); 407 Calendar end = endDayDatePicker.getDate(); 408 int startHour = 0; 409 int startMinutes = 0; 410 int endHour = 0; 411 int endMinutes = 0; 412 413 if (allDayCheckBox.isSelected()) { 414 415 startTimePicker.setEnabled(false); 417 endTimePicker.setEnabled(false); 418 419 startHour = 0; 420 startMinutes = 0; 421 start.set(Calendar.HOUR_OF_DAY, startHour); 422 start.set(Calendar.MINUTE, startMinutes); 423 424 endHour = 0; 425 endMinutes = 0; 426 end.set(Calendar.HOUR_OF_DAY, endHour); 427 end.set(Calendar.MINUTE, endMinutes); 428 429 } else { 430 startTimePicker.setEnabled(true); 432 endTimePicker.setEnabled(true); 433 434 startHour = startTimePicker.getHour(); 435 startMinutes = startTimePicker.getMinutes(); 436 start.set(Calendar.HOUR_OF_DAY, startHour); 437 start.set(Calendar.MINUTE, startMinutes); 438 439 endHour = endTimePicker.getHour(); 440 endMinutes = endTimePicker.getMinutes(); 441 end.set(Calendar.HOUR_OF_DAY, endHour); 442 end.set(Calendar.MINUTE, endMinutes); 443 } 444 445 model.getEvent().setDtStart(start); 446 447 model.getEvent().setAllDayEvent(allDayCheckBox.isSelected()); 448 449 model.getEvent().setDtEnd(end); 450 451 CalendarItem calendar = (CalendarItem) calendarPicker.getSelectedItem(); 452 model.setCalendar(calendar.getId()); 453 454 model.getEvent().setDtStamp(Calendar.getInstance()); 456 457 model.getEvent().setCategories(categoriesTextField.getText()); 458 459 if (!recurrenceCheckBox.isSelected()) { 460 if (model.getEvent().getRecurrence() != null) 461 model.getEvent().setRecurrence(null); 462 } 463 } 464 } 465 466 public void actionPerformed(ActionEvent e) { 467 String action = e.getActionCommand(); 468 469 if (action.equals("OK")) { 471 success = true; 473 474 updateComponents(false); 475 476 setVisible(false); 477 } else if (action.equals("CANCEL")) { 478 success = false; 479 setVisible(false); 480 } else if (action.equals("All Day")) { 481 if (allDayCheckBox.isSelected()) { 482 startTimePicker.setEnabled(false); 484 endTimePicker.setEnabled(false); 485 } else { 486 startTimePicker.setEnabled(true); 488 endTimePicker.setEnabled(true); 489 } 490 } else if (action.equals("RecurrenceDialog")) { 491 RecurrenceDialog r = new RecurrenceDialog(null, model); 492 if (r.success()) { 493 model = r.getModel(); 494 } 495 } else if (action.equals("Recurrence")) { 496 if (recurrenceCheckBox.isSelected()) { 497 recurrenceButton.setEnabled(true); 499 } else { 500 recurrenceButton.setEnabled(false); 502 } 503 } 504 } 505 506 509 public IEventInfo getModel() { 510 return model; 511 } 512 513 } 514 | Popular Tags |