001    /*
002     * Copyright 2002-2006 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.components;
017    
018    import javax.swing.JLabel;
019    
020    import org.springframework.richclient.application.ApplicationServices;
021    import org.springframework.richclient.application.ApplicationServicesLocator;
022    import org.springframework.richclient.core.DefaultMessage;
023    import org.springframework.richclient.core.Guarded;
024    import org.springframework.richclient.core.Message;
025    import org.springframework.richclient.core.Severity;
026    import org.springframework.richclient.dialog.Messagable;
027    import org.springframework.richclient.image.IconSource;
028    import org.springframework.richclient.util.OverlayHelper;
029    
030    /**
031     * Component which can be used as an overlay for an other component to the content of a message. The severity of the
032     * message will be used to retrive an icon by using the key <code>severity.{severity.label}.overlay</code> where
033     * {severity.label} the content of {@link Severity#getLabel()} is.
034     * <p>
035     * Use {@link OverlayHelper#attachOverlay(javax.swing.JComponent, javax.swing.JComponent, int, int, int)} to put this
036     * component as an overlay of an other component
037     * 
038     * @author Oliver Hutchison
039     * @author Mathias Broekelmann
040     */
041    public class MessageReportingOverlay extends JLabel implements Messagable, Guarded {
042        private IconSource iconSource;
043    
044        /**
045         * Return the used icon source
046         * 
047         * @return the icon source, must not null
048         */
049        public IconSource getIconSource() {
050            if (iconSource == null) {
051                iconSource = (IconSource) ApplicationServicesLocator.services().getService(IconSource.class);
052            }
053            return iconSource;
054        }
055    
056        /**
057         * Define the iconsource for getting the icon of the overlay
058         * 
059         * @param iconSource
060         *            the icon source, if null the default icon source from {@link ApplicationServices} will be used
061         */
062        public void setIconSource(IconSource iconSource) {
063            this.iconSource = iconSource;
064        }
065    
066        /**
067         * Returns whether this overlay is enabled (=visible) or not
068         */
069        public boolean isEnabled() {
070            return isVisible();
071        }
072    
073        /**
074         * Defines whether this overlay is enabled (=visible) or not
075         */
076        public void setEnabled(boolean enabled) {
077            setVisible(enabled);
078        }
079    
080        /**
081         * set the message wich will be used as the content of the overlay. The message text will be used as tooltip and the
082         * severity is used to determine which icon should be shown
083         * 
084         * @param message
085         *            the message, if null tooltip will be empty and icon will be null
086         */
087        public void setMessage(Message message) {
088            if (message == null) {
089                message = DefaultMessage.EMPTY_MESSAGE;
090            }
091            setToolTipText(message.getMessage());
092            Severity severity = message.getSeverity();
093    
094            if (severity != null) {
095                setIcon(getIconSource().getIcon("severity." + severity.getLabel() + ".overlay"));
096            } else {
097                setIcon(null);
098            }
099        }
100    }