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.samples.simple.ui;
017    
018    import java.awt.BorderLayout;
019    import java.io.IOException;
020    
021    import javax.swing.BorderFactory;
022    import javax.swing.JComponent;
023    import javax.swing.JLabel;
024    import javax.swing.JPanel;
025    import javax.swing.JScrollPane;
026    import javax.swing.JTextPane;
027    
028    import org.springframework.core.io.Resource;
029    import org.springframework.richclient.application.support.AbstractView;
030    import org.springframework.richclient.application.support.DefaultViewDescriptor;
031    
032    /**
033     * This class defines the initial view to be presented in the sample application. It is constructed automatically by the
034     * platform and configured according to the bean specification in the application context. Here's an example
035     * configuration:
036     * 
037     * <pre>
038     *       &lt;bean id=&quot;initialView&quot;
039     *           class=&quot;org.springframework.richclient.application.support.DefaultViewDescriptor&quot;&gt;
040     *           &lt;property name=&quot;viewClass&quot;&gt;
041     *               &lt;value&gt;org.springframework.richclient.samples.simple.ui.InitialView&lt;/value&gt;
042     *           &lt;/property&gt;
043     *           &lt;property name=&quot;viewProperties&quot;&gt;
044     *               &lt;map&gt;
045     *                   &lt;entry key=&quot;firstMessage&quot;&gt;
046     *                       &lt;value&gt;This is the first message!&lt;/value&gt;
047     *                   &lt;/entry&gt;
048     *                   &lt;entry key=&quot;descriptionTextPath&quot;&gt;
049     *                       &lt;value&gt;org/springframework/richclient/samples/simple/ui/initialViewText.html&lt;/value&gt;
050     *                   &lt;/entry&gt;
051     *               &lt;/map&gt;
052     *           &lt;/property&gt;
053     *       &lt;/bean&gt;
054     * </pre>
055     * 
056     * Note that the configuration specifies the properties to be set on this class indirectly. The property set on the
057     * {@link DefaultViewDescriptor} is called <code>viewProperties</code> and it takes a map of key/value pairs. Each key
058     * is the name of a property to be set on the actual view class (this class) and the value is the value to set for that
059     * property. So, two properties have been configured, <code>firstMessage</code> and <code>descriptionTextPath</code>.
060     * The <code>firstMessage</code> value specifies the key of a message to be displayed and the
061     * <code>descriptionTextPath</code> specifies the path to a file containing the text to place in the HTML panel that
062     * makes up the main body of this view.
063     * @author Larry Streepy
064     */
065    public class InitialView extends AbstractView {
066    
067            private String firstMessage;
068    
069            private Resource descriptionTextPath;
070    
071            /**
072             * @return the firstMessage
073             */
074            public String getFirstMessage() {
075                    return firstMessage;
076            }
077    
078            /**
079             * Set the key to the message to be displayed first in the view
080             * @param firstMessage the firstMessage to set
081             */
082            public void setFirstMessage(String firstMessage) {
083                    this.firstMessage = firstMessage;
084            }
085    
086            /**
087             * @return the descriptionTextPath
088             */
089            public Resource getDescriptionTextPath() {
090                    return descriptionTextPath;
091            }
092    
093            /**
094             * Set the resource that references the file containing the description text to place in the description areas of
095             * this view. Note that even though this property is of type Resource, the Spring platform will automatically
096             * convert a string path into a resource.
097             * @param descriptionTextPath the descriptionTextPath to set
098             */
099            public void setDescriptionTextPath(Resource descriptionTextPath) {
100                    this.descriptionTextPath = descriptionTextPath;
101            }
102            
103            /**
104             * Create the actual UI control for this view. It will be placed into the window according to the layout of the page
105             * holding this view.
106             */
107            protected JComponent createControl() {
108                    // In this view, we're just going to use standard Swing to place a
109                    // few controls.
110    
111                    // The location of the text to display has been set as a Resource in the
112                    // property descriptionTextPath. So, use that resource to obtain a URL
113                    // and set that as the page for the text pane.
114    
115                    JTextPane textPane = new JTextPane();
116                    JScrollPane spDescription = getComponentFactory().createScrollPane(textPane);
117                    try {
118                            textPane.setPage(getDescriptionTextPath().getURL());
119                    }
120                    catch (IOException e) {
121                            throw new RuntimeException("Unable to load description URL", e);
122                    }
123    
124                    JLabel lblMessage = getComponentFactory().createLabel(getFirstMessage());
125                    lblMessage.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0));
126    
127                    JPanel panel = getComponentFactory().createPanel(new BorderLayout());
128                    panel.add(spDescription);
129                    panel.add(lblMessage, BorderLayout.SOUTH);
130    
131                    return panel;
132            }
133    }