001    package org.springframework.richclient.widget;
002    
003    import org.springframework.core.io.Resource;
004    import org.springframework.util.FileCopyUtils;
005    
006    import javax.swing.*;
007    import javax.swing.text.html.HTMLEditorKit;
008    import java.awt.*;
009    import java.io.BufferedReader;
010    import java.io.IOException;
011    import java.io.InputStreamReader;
012    
013    /**
014     * HTMLViewingWidget generates a component to view HTML data
015     *
016     * {@inheritDoc}
017     *
018     * @see #setContent(org.springframework.core.io.Resource)
019     * @see #setContent(String)
020     */
021    public class HTMLViewWidget extends AbstractWidget
022    {
023        /** Pane in which the HTML will be shown. */
024        private JTextPane textPane;
025    
026        /** Complete component with scrollbars and html pane. */
027        private JComponent mainComponent;
028    
029        private boolean hasContent;
030    
031        public HTMLViewWidget()
032        {
033            this(false);
034        }
035    
036        public HTMLViewWidget(boolean readOnly)
037        {
038            this.textPane = new JTextPane();
039            this.textPane.setEditorKit(new HTMLEditorKit());
040            this.textPane.setEditable(!readOnly);
041    
042            JScrollPane scrollPane = new JScrollPane(this.textPane);
043            scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
044            scrollPane.setPreferredSize(new Dimension(250, 155));
045    
046            // below is a small lie to make sure we provide a blank control in case
047            // people create us without ready content
048            this.hasContent = true;
049    
050            this.mainComponent = scrollPane;
051        }
052    
053        public HTMLViewWidget(Resource resource)
054        {
055            this();
056            setContent(resource);
057        }
058    
059        public HTMLViewWidget(Resource resource, boolean readOnly)
060        {
061            this(readOnly);
062            setContent(resource);
063        }
064    
065        public HTMLViewWidget(String htmlText)
066        {
067            this();
068            setContent(htmlText);
069        }
070    
071        public HTMLViewWidget(String htmlText, boolean readOnly)
072        {
073            this(readOnly);
074            setContent(htmlText);
075        }
076    
077        public void setContent(Resource resource)
078        {
079    
080            String text = null;
081            try
082            {
083                if (resource != null && resource.exists())
084                {
085                    text = FileCopyUtils.copyToString(new BufferedReader(new InputStreamReader(resource
086                            .getInputStream())));
087                }
088            }
089            catch (IOException e)
090            {
091                logger.warn("Error reading resource: " + resource, e);
092                throw new RuntimeException("Error reading resource " + resource, e);
093            }
094            finally
095            {
096                setContent(text);
097            }
098        }
099    
100        public void setContent(String htmlText)
101        {
102            this.textPane.setText(htmlText);
103            this.hasContent = (htmlText != null && htmlText.length() > 0);
104        }
105    
106        public JComponent getComponent()
107        {
108            return this.hasContent ? this.mainComponent : new JPanel();
109        }
110    }
111