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    }