001 /* 002 * Copyright 2002-2007 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.dialog; 017 018 import java.awt.Image; 019 import java.awt.Window; 020 import java.beans.PropertyChangeEvent; 021 import java.beans.PropertyChangeListener; 022 023 import javax.swing.JComponent; 024 025 import org.springframework.richclient.core.DefaultMessage; 026 import org.springframework.richclient.core.Message; 027 import org.springframework.richclient.form.Form; 028 import org.springframework.util.Assert; 029 import org.springframework.util.StringUtils; 030 031 /** 032 * A TitledApplicationDialog that delegates to a single DialogPage for its 033 * title, content and messages. 034 * 035 * @author oliverh 036 */ 037 public abstract class TitledPageApplicationDialog extends TitledApplicationDialog { 038 039 private DialogPage dialogPage; 040 041 private PropertyChangeListener dialogPagePropertyChangeHandler = new PropertyChangeListener() { 042 public void propertyChange(PropertyChangeEvent evt) { 043 if (Messagable.MESSAGE_PROPERTY.equals(evt.getPropertyName())) { 044 update(); 045 } 046 else if (DialogPage.PAGE_COMPLETE_PROPERTY.equals(evt.getPropertyName())) { 047 setEnabled(dialogPage.isPageComplete()); 048 } 049 else { 050 update(); 051 } 052 } 053 }; 054 055 private Image titlePaneImage; 056 057 private String titlePaneTitle; 058 059 /** 060 * Default constructor. Make sure to call {@link #setDialogPage(DialogPage)} 061 * prior to using this dialog. 062 */ 063 public TitledPageApplicationDialog() { 064 super(); 065 } 066 067 public TitledPageApplicationDialog(DialogPage dialogPage) { 068 super(); 069 setDialogPage(dialogPage); 070 } 071 072 public TitledPageApplicationDialog(Form form, Window parent) { 073 this(new FormBackedDialogPage(form), parent); 074 } 075 076 public TitledPageApplicationDialog(DialogPage dialogPage, Window parent) { 077 super(dialogPage.getTitle(), parent); 078 setDialogPage(dialogPage); 079 } 080 081 public TitledPageApplicationDialog(DialogPage dialogPage, Window parent, CloseAction closeAction) { 082 super(dialogPage.getTitle(), parent, closeAction); 083 setDialogPage(dialogPage); 084 } 085 086 protected void setDialogPage(DialogPage dialogPage) { 087 Assert.notNull(dialogPage, "The single dialog page to display is required"); 088 this.dialogPage = dialogPage; 089 } 090 091 protected DialogPage getDialogPage() { 092 return dialogPage; 093 } 094 095 protected JComponent createTitledDialogContentPane() { 096 dialogPage.addPropertyChangeListener(dialogPagePropertyChangeHandler); 097 update(); 098 return dialogPage.getControl(); 099 } 100 101 protected Message getDescription() { 102 return new DefaultMessage(dialogPage.getDescription()); 103 } 104 105 protected void update() { 106 if (!StringUtils.hasText(getTitle())) { 107 setTitle(dialogPage.getTitle()); 108 } 109 updateTitlePane(); 110 updateMessagePane(); 111 } 112 113 protected void updateTitlePane() { 114 super.setTitlePaneTitle(titlePaneTitle != null ? titlePaneTitle : dialogPage.getTitle()); 115 super.setTitlePaneImage(titlePaneImage != null ? titlePaneImage : dialogPage.getImage()); 116 setDescription(dialogPage.getDescription()); 117 } 118 119 protected void updateMessagePane() { 120 setMessage(dialogPage.getMessage()); 121 } 122 123 /** 124 * Sets the image to use in the title pane. Normally the image is provided 125 * by the current dialog page, but this method allows for overriding this. 126 * <p> 127 * If the image passed is null, the image of the dialog page will be used. 128 * @param image the image 129 * @see TitledApplicationDialog#setTitlePaneImage(Image) 130 */ 131 public void setTitlePaneImage(Image image) { 132 titlePaneImage = image; 133 super.setTitlePaneImage(image); 134 } 135 136 /** 137 * Sets the title to use in the title pane. Normally the title is provided 138 * by the current dialog page, but this method allows for overriding this. 139 * <p> 140 * If the title passed is null, the title of the dialog page will be used. 141 * @param title the title 142 * @see TitledApplicationDialog#setTitlePaneTitle(String) 143 */ 144 public void setTitlePaneTitle(String title) { 145 titlePaneTitle = title; 146 super.setTitlePaneTitle(title); 147 } 148 }