001 /*
002 * Copyright 2002-2006 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.richclient.samples.simple.ui;
017
018 import org.springframework.richclient.application.event.LifecycleApplicationEvent;
019 import org.springframework.richclient.dialog.CloseAction;
020 import org.springframework.richclient.dialog.ConfirmationDialog;
021 import org.springframework.richclient.dialog.FormBackedDialogPage;
022 import org.springframework.richclient.dialog.TitledPageApplicationDialog;
023 import org.springframework.richclient.form.Form;
024 import org.springframework.richclient.samples.simple.domain.Contact;
025 import org.springframework.richclient.samples.simple.domain.ContactDataStore;
026 import org.springframework.util.Assert;
027
028 /**
029 * This is a dialog for editing the properties of a Contact object. It is a simple "form backed" dialog, meaning that
030 * the body of the dialog is provided from a "form backed" dialog page. The Ok (finish) button will be wired into the
031 * "page complete" state of the dialog page, which in turn gets its state from the automatic validation of the
032 * properties on the form.
033 * @author Larry Streepy
034 * @see FormBackedDialogPage
035 * @see ContactForm
036 */
037 public class ContactPropertiesDialog extends TitledPageApplicationDialog {
038
039 /** The form that allows for editing the contact. */
040 private Form form;
041
042 /** Are we creating a new Contact or editing an existing one? */
043 private boolean creatingNew = false;
044
045 /** The data store holding all our contacts, used to add a new contact. */
046 private ContactDataStore dataStore;
047
048 public ContactPropertiesDialog(ContactDataStore dataStore) {
049 this(null, dataStore);
050 }
051
052 public ContactPropertiesDialog(Contact contact, ContactDataStore dataStore) {
053 Assert.notNull(dataStore, "The data store is required to edit a contact");
054 if (contact == null) {
055 creatingNew = true;
056 contact = new Contact();
057 }
058 setCloseAction(CloseAction.DISPOSE);
059 form = new ContactForm(contact);
060 setDialogPage(new FormBackedDialogPage(form));
061 this.dataStore = dataStore;
062 }
063
064 private Contact getEditingContact() {
065 return (Contact) form.getFormModel().getFormObject();
066 }
067
068 protected void onAboutToShow() {
069 if (creatingNew) {
070 getMessage("contactProperties.new.title");
071 setTitle(getMessage("contactProperties.new.title"));
072 }
073 else {
074 Contact contact = getEditingContact();
075 String title = getMessage("contactProperties.edit.title", new Object[] { contact.getFirstName(),
076 contact.getLastName() });
077 setTitle(title);
078 }
079 }
080
081 protected boolean onFinish() {
082 // commit any buffered edits to the model
083 form.getFormModel().commit();
084 // Update the persistent store with the new/modified object.
085 String eventType;
086 if (creatingNew) {
087 eventType = LifecycleApplicationEvent.CREATED;
088 dataStore.add(getEditingContact());
089 }
090 else {
091 eventType = LifecycleApplicationEvent.MODIFIED;
092 }
093 // And notify the rest of the application of the change
094 getApplicationContext().publishEvent(new LifecycleApplicationEvent(eventType, getEditingContact()));
095 return true;
096 }
097
098 protected void onCancel() {
099 // Warn the user if they are about to discard their changes
100 if (form.getFormModel().isDirty()) {
101 String msg = getMessage("contactProperties.dirtyCancelMessage");
102 String title = getMessage("contactProperties.dirtyCancelTitle");
103 ConfirmationDialog dlg = new ConfirmationDialog(title, msg) {
104 protected void onConfirm() {
105 ContactPropertiesDialog.super.onCancel();
106 }
107 };
108 dlg.showDialog();
109 }
110 else {
111 super.onCancel();
112 }
113 }
114 }