001    package org.springframework.richclient.widget;
002    
003    import org.springframework.richclient.util.GuiStandardUtils;
004    import org.springframework.richclient.util.RcpSupport;
005    import org.springframework.richclient.dialog.TitlePane;
006    import org.springframework.richclient.dialog.Messagable;
007    import org.springframework.richclient.core.DefaultMessage;
008    import org.springframework.richclient.core.Message;
009    import org.springframework.richclient.core.Severity;
010    import org.springframework.richclient.form.ValidationResultsReporter;
011    
012    import javax.swing.*;
013    import java.awt.*;
014    import java.beans.PropertyChangeListener;
015    
016    public abstract class AbstractTitledWidget extends AbstractWidget implements TitledWidget
017    {
018    
019        private Message description = new DefaultMessage(RcpSupport.getMessage(
020                "titledWidget", "defaultMessage", RcpSupport.TEXT), Severity.INFO);
021        private TitlePane titlePane = new TitlePane(1);
022    
023        private JComponent component;
024    
025        private String id;
026    
027        public void setId(String id)
028        {
029            this.id = id;
030        }
031    
032        public String getId()
033        {
034            return this.id;
035        }
036    
037        public void setBeanName(String beanName)
038        {
039            setId(beanName);
040        }
041    
042        public boolean isEnabled()
043        {
044            return false;
045        }
046    
047        public void setEnabled(boolean enabled)
048        {
049        }
050    
051        public void setTitle(String title)
052        {
053            this.titlePane.setTitle(title);
054        }
055    
056        public void setImage(Image image)
057        {
058            this.titlePane.setImage(image);
059        }
060    
061        public void setMessage(Message message)
062        {
063            if (message != null)
064                titlePane.setMessage(message);
065            else
066                titlePane.setMessage(getDescription());
067        }
068    
069        public ValidationResultsReporter newSingleLineResultsReporter(Messagable messagable)
070        {
071            return null;
072        }
073    
074        protected Message getDescription()
075        {
076            return description;
077        }
078    
079        public void setDescription(String longDescription)
080        {
081            this.description = new DefaultMessage(longDescription);
082            setMessage(this.description);
083        }
084    
085        public void setCaption(String shortDescription)
086        {
087            // TODO needed to comply to interface DescriptionConfigurable where will this end up?
088        }
089    
090        /**
091         * Lazy creation of component
092         * <p/>
093         * {@inheritDoc}
094         */
095        public final JComponent getComponent()
096        {
097            if (component == null)
098                component = createComponent();
099    
100            return component;
101        }
102    
103        /**
104         * @return JComponent with titlePane, widgetContent and border.
105         */
106        private JComponent createComponent()
107        {
108            JPanel titlePaneContainer = new JPanel(new BorderLayout());
109            titlePaneContainer.add(titlePane.getControl());
110            titlePaneContainer.add(new JSeparator(), BorderLayout.SOUTH);
111    
112            JPanel pageControl = new JPanel(new BorderLayout());
113            pageControl.add(titlePaneContainer, BorderLayout.NORTH);
114            JComponent content = createWidgetContent();
115            GuiStandardUtils.attachDialogBorder(content);
116            pageControl.add(content);
117    
118            return pageControl;
119        }
120    
121        public abstract JComponent createWidgetContent();
122    
123        public void addPropertyChangeListener(PropertyChangeListener listener)
124        {
125            this.titlePane.addPropertyChangeListener(listener);
126        }
127    
128        public void addPropertyChangeListener(String txt, PropertyChangeListener listener)
129        {
130            this.titlePane.addPropertyChangeListener(txt, listener);
131        }
132    
133        public void removePropertyChangeListener(PropertyChangeListener listener)
134        {
135            this.titlePane.removePropertyChangeListener(listener);
136        }
137    
138        public void removePropertyChangeListener(String txt, PropertyChangeListener listener)
139        {
140            this.titlePane.removePropertyChangeListener(txt, listener);
141        }
142    }