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.BorderLayout; 019 import java.awt.Image; 020 import java.awt.Window; 021 import java.beans.PropertyChangeListener; 022 023 import javax.swing.JComponent; 024 import javax.swing.JPanel; 025 import javax.swing.JSeparator; 026 027 import org.springframework.richclient.core.DefaultMessage; 028 import org.springframework.richclient.core.DescriptionConfigurable; 029 import org.springframework.richclient.core.Message; 030 import org.springframework.richclient.image.config.ImageConfigurable; 031 import org.springframework.richclient.util.GuiStandardUtils; 032 033 public abstract class TitledApplicationDialog extends ApplicationDialog implements Messagable, ImageConfigurable, 034 DescriptionConfigurable { 035 private TitlePane titlePane = new TitlePane(); 036 037 private Message description = new DefaultMessage("Title pane description"); 038 039 private JComponent pageControl; 040 041 private JComponent contentPane; 042 043 public TitledApplicationDialog() { 044 super(); 045 } 046 047 public TitledApplicationDialog(String title, Window parent) { 048 super(title, parent); 049 } 050 051 public TitledApplicationDialog(String title, Window parent, CloseAction closeAction) { 052 super(title, parent, closeAction); 053 } 054 055 public void setCaption(String shortDescription) { 056 throw new UnsupportedOperationException("What can I do with a caption?"); 057 } 058 059 public void setDescription(String description) { 060 this.description = new DefaultMessage(description); 061 setMessage(this.description); 062 } 063 064 public void setTitlePaneTitle(String titleAreaText) { 065 titlePane.setTitle(titleAreaText); 066 } 067 068 protected String getTitlePaneTitle() { 069 return titlePane.getTitle(); 070 } 071 072 public void setTitlePaneImage(Image image) { 073 titlePane.setImage(image); 074 } 075 076 protected Image getTitlePaneImage() { 077 return titlePane.getImage(); 078 } 079 080 public void setImage(Image image) { 081 setTitlePaneImage(image); 082 } 083 084 public Message getMessage() { 085 return titlePane.getMessage(); 086 } 087 088 public void setMessage(Message message) { 089 if (message == null || DefaultMessage.EMPTY_MESSAGE.equals(message)) { 090 titlePane.setMessage(getDescription()); 091 } 092 else { 093 titlePane.setMessage(message); 094 } 095 } 096 097 public boolean isMessageShowing() { 098 return titlePane.isMessageShowing(); 099 } 100 101 protected Message getDescription() { 102 return description; 103 } 104 105 protected void setContentPane(JComponent c) { 106 if (isControlCreated()) { 107 pageControl.remove(contentPane); 108 contentPane = c; 109 pageControl.add(contentPane); 110 pageControl.revalidate(); 111 pageControl.repaint(); 112 } 113 else { 114 throw new IllegalStateException("Cannot set content pane until control is created"); 115 } 116 } 117 118 protected void addDialogComponents() { 119 JComponent dialogContentPane = createDialogContentPane(); 120 getDialog().getContentPane().add(dialogContentPane, BorderLayout.CENTER); 121 getDialog().getContentPane().add(createButtonBar(), BorderLayout.SOUTH); 122 } 123 124 /** 125 * {@inheritDoc} 126 * 127 * Creates an additional panel at the top containing a title/message area. 128 * This can be used in conjunction with validation reporters to show the 129 * most recent error or to simply show a title and a description of the 130 * current Dialog. 131 * 132 * Use {@link #createTitledDialogContentPane()} to add your custom components. 133 */ 134 protected JComponent createDialogContentPane() { 135 pageControl = new JPanel(new BorderLayout()); 136 JPanel titlePaneContainer = new JPanel(new BorderLayout()); 137 setMessage(getDescription()); 138 titlePaneContainer.add(titlePane.getControl()); 139 titlePaneContainer.add(new JSeparator(), BorderLayout.SOUTH); 140 pageControl.add(titlePaneContainer, BorderLayout.NORTH); 141 contentPane = createTitledDialogContentPane(); 142 if (getPreferredSize() != null) { 143 contentPane.setPreferredSize(getPreferredSize()); 144 } 145 GuiStandardUtils.attachDialogBorder(contentPane); 146 pageControl.add(contentPane); 147 return pageControl; 148 } 149 150 /** 151 * 152 * @return a component that will be added as the content of the Titled Dialog. 153 */ 154 protected abstract JComponent createTitledDialogContentPane(); 155 156 /** 157 * Dispose of the dialog content. 158 */ 159 protected void disposeDialogContentPane() { 160 contentPane = null; 161 pageControl = null; 162 } 163 164 public void addPropertyChangeListener(PropertyChangeListener listener) { 165 titlePane.addPropertyChangeListener(listener); 166 } 167 168 public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { 169 titlePane.addPropertyChangeListener(propertyName, listener); 170 } 171 172 public void removePropertyChangeListener(PropertyChangeListener listener) { 173 titlePane.removePropertyChangeListener(listener); 174 } 175 176 public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { 177 titlePane.removePropertyChangeListener(propertyName, listener); 178 } 179 }