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 }