001 /*
002 * Copyright 2002-2004 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.Dimension;
019 import java.beans.PropertyChangeEvent;
020 import java.beans.PropertyChangeListener;
021
022 import javax.swing.Icon;
023 import javax.swing.JComponent;
024 import javax.swing.JLabel;
025 import javax.swing.SwingConstants;
026
027 import org.springframework.richclient.core.Message;
028 import org.springframework.richclient.factory.AbstractControlFactory;
029 import org.springframework.richclient.image.EmptyIcon;
030 import org.springframework.util.StringUtils;
031
032 import com.jgoodies.forms.layout.Sizes;
033
034 /**
035 * @author Keith Donald
036 * @author Oliver Hutchison
037 */
038 public class DefaultMessageAreaPane extends AbstractControlFactory implements MessagePane, PropertyChangeListener {
039 private static final int ONE_LINE_IN_DLU = 10;
040
041 public static final int DEFAULT_LINES_TO_DISPLAY = 2;
042
043 private int linesToDisplay;
044
045 private JLabel messageLabel;
046
047 private Icon defaultIcon = EmptyIcon.SMALL;
048
049 private DefaultMessageAreaModel messageAreaModel;
050
051 public DefaultMessageAreaPane() {
052 this(DEFAULT_LINES_TO_DISPLAY);
053 }
054
055 public DefaultMessageAreaPane(int linesToDisplay) {
056 init(linesToDisplay, this);
057 }
058
059 public DefaultMessageAreaPane(Messagable delegateFor) {
060 this(DEFAULT_LINES_TO_DISPLAY, delegateFor);
061 }
062
063 public DefaultMessageAreaPane(int linesToDisplay, Messagable delegateFor) {
064 init(linesToDisplay, delegateFor);
065 }
066
067 private void init(int linesToDisplay, Messagable delegateFor) {
068 this.linesToDisplay = linesToDisplay;
069 this.messageAreaModel = new DefaultMessageAreaModel(delegateFor);
070 this.messageAreaModel.addPropertyChangeListener(this);
071 }
072
073 public void setDefaultIcon(Icon defaultIcon) {
074 this.defaultIcon = defaultIcon;
075 }
076
077 protected JComponent createControl() {
078 if (messageLabel == null) {
079 this.messageLabel = new JLabel();
080 this.messageAreaModel.renderMessage(messageLabel);
081 }
082 int prefWidth = messageLabel.getPreferredSize().width;
083 int prefHeight = Sizes.dialogUnitYAsPixel(linesToDisplay * ONE_LINE_IN_DLU, messageLabel);
084
085 int iconHeight = getDefaultIcon().getIconHeight() + messageLabel.getIconTextGap() * 2;
086 prefHeight = Math.max(iconHeight, prefHeight);
087
088 messageLabel.setPreferredSize(new Dimension(prefWidth, prefHeight));
089 messageLabel.setOpaque(false);
090 messageLabel.setVerticalAlignment(SwingConstants.TOP);
091 messageLabel.setVerticalTextPosition(SwingConstants.TOP);
092 messageLabel.setIcon(getDefaultIcon());
093 return messageLabel;
094 }
095
096 private Icon getDefaultIcon() {
097 return defaultIcon;
098 }
099
100 public Message getMessage() {
101 return messageAreaModel.getMessage();
102 }
103
104 public void setMessage(Message message) {
105 messageAreaModel.setMessage(message);
106 if (messageLabel != null) {
107 messageAreaModel.renderMessage(messageLabel);
108 }
109 }
110
111 public void clearMessage() {
112 messageAreaModel.setMessage(null);
113 }
114
115 public boolean isMessageShowing() {
116 if (messageLabel == null) {
117 return false;
118 }
119 return StringUtils.hasText(messageLabel.getText()) && messageLabel.isVisible();
120 }
121
122 public void addPropertyChangeListener(PropertyChangeListener listener) {
123 messageAreaModel.addPropertyChangeListener(listener);
124 }
125
126 public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
127 messageAreaModel.addPropertyChangeListener(propertyName, listener);
128 }
129
130 public void removePropertyChangeListener(PropertyChangeListener listener) {
131 messageAreaModel.removePropertyChangeListener(listener);
132 }
133
134 public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
135 messageAreaModel.removePropertyChangeListener(propertyName, listener);
136 }
137
138 public void propertyChange(PropertyChangeEvent evt) {
139 if (messageLabel == null) {
140 this.messageLabel = new JLabel();
141 }
142 messageAreaModel.getMessage().renderMessage(messageLabel);
143 }
144 }