001    /**
002     * Copyright (c) 2008-2009, Piet Blok
003     * All rights reserved.
004     *
005     * Redistribution and use in source and binary forms, with or without
006     * modification, are permitted provided that the following conditions
007     * are met:
008     *
009     *   * Redistributions of source code must retain the above copyright
010     *     notice, this list of conditions and the following disclaimer.
011     *   * Redistributions in binary form must reproduce the above
012     *     copyright notice, this list of conditions and the following
013     *     disclaimer in the documentation and/or other materials provided
014     *     with the distribution.
015     *   * Neither the name of the copyright holder nor the names of the
016     *     contributors may be used to endorse or promote products derived
017     *     from this software without specific prior written permission.
018     *
019     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
020     * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
021     * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
022     * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
023     * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
024     * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
025     * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
026     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
027     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
028     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
029     * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
030     */
031    
032    package org.pbjar.jxlayer.demo;
033    
034    import java.awt.BorderLayout;
035    import java.awt.Dimension;
036    import java.awt.GridLayout;
037    import java.awt.Rectangle;
038    import java.awt.event.ActionEvent;
039    
040    import javax.swing.AbstractAction;
041    import javax.swing.Icon;
042    import javax.swing.JButton;
043    import javax.swing.JComponent;
044    import javax.swing.JDialog;
045    import javax.swing.JFrame;
046    import javax.swing.JLabel;
047    import javax.swing.JMenu;
048    import javax.swing.JMenuBar;
049    import javax.swing.JMenuItem;
050    import javax.swing.JPanel;
051    import javax.swing.JScrollPane;
052    import javax.swing.JTextField;
053    import javax.swing.JTextPane;
054    import javax.swing.SwingUtilities;
055    import javax.swing.border.BevelBorder;
056    import javax.swing.border.CompoundBorder;
057    import javax.swing.border.TitledBorder;
058    
059    import org.jdesktop.jxlayer.JXLayer;
060    import org.pbjar.jxlayer.plaf.ext.TransformUI;
061    import org.pbjar.jxlayer.repaint.RepaintManagerUtils;
062    
063    /**
064     * Test the {@link TransformUI}.
065     * 
066     * <p>
067     * Run a web start demo: <a
068     * href="http://www.pbjar.org/blogs/jxlayer/version_2/TransformDemo.jnlp"> <IMG
069     * style="CLEAR: right" alt="Web Start Transformations"
070     * src="http://javadesktop.org/javanet_images/webstart.small2.gif"
071     * align="middle" border="1" /> </a>
072     * </p>
073     */
074    public class TestTransform implements TestGUI {
075    
076        private class ReferenceGUI {
077    
078            private final JDialog referenceDialog = new JDialog((JFrame) null,
079                    "Reference");
080    
081            private final JComponent referenceContent = createContent();
082    
083            private final JScrollPane referenceScrollPane = new JScrollPane();
084    
085            public ReferenceGUI() {
086                referenceDialog.setJMenuBar(new JMenuBar());
087                referenceDialog.getJMenuBar().add(
088                        new JMenuItem(new AbstractAction("Pack") {
089    
090                            private static final long serialVersionUID = 1L;
091    
092                            @Override
093                            public void actionPerformed(ActionEvent e) {
094                                referenceDialog.pack();
095                            }
096                        }));
097                referenceScrollPane.setViewportView(referenceContent);
098                referenceDialog.add(referenceScrollPane);
099                referenceDialog.pack();
100            }
101    
102            public void removeScroll() {
103                referenceDialog.remove(referenceScrollPane);
104                referenceDialog.add(referenceContent);
105                pack();
106            }
107    
108            public void setVisible(boolean visible) {
109                referenceDialog.setVisible(visible);
110            }
111    
112            public void setVisible(Rectangle bounds) {
113                referenceDialog.setLocation(bounds.x + bounds.width + 5, bounds.y);
114                setVisible(true);
115            }
116    
117            public void wrapIntoScroll() {
118                referenceDialog.remove(referenceContent);
119                referenceDialog.add(referenceScrollPane);
120                referenceScrollPane.setViewportView(referenceContent);
121                pack();
122            }
123    
124            private void pack() {
125                referenceDialog.pack();
126            }
127        }
128    
129        /**
130         * Run the program.
131         * 
132         * @param args
133         *            not used
134         */
135        public static void main(String[] args) {
136            try {
137                TransformUI.prepareForJTextComponent();
138            } catch (Throwable t) {
139                while (t != null) {
140                    t.printStackTrace();
141                    t = t.getCause();
142                }
143                System.exit(0);
144            }
145            SwingUtilities.invokeLater(new Runnable() {
146    
147                @Override
148                public void run() {
149                    new TestTransform().createGUI();
150                }
151            });
152        }
153    
154        private final JFrame testframe;
155    
156        private final JScrollPane testScrollPane;
157    
158        private final JXLayer<?> layer;
159    
160        private final JDialog controlDialog;
161    
162        private final ReferenceGUI referenceGUI;
163    
164        private static final Icon animatedIcon = new AnimatedIcon();
165    
166        private static void setBorderTitle(JComponent component, String title) {
167            component.setBorder(new TitledBorder(new CompoundBorder(
168                    new BevelBorder(BevelBorder.RAISED), new BevelBorder(
169                            BevelBorder.LOWERED)), title));
170        }
171    
172        private TestTransform() {
173            testframe = new JFrame("SwingX & TransformUI");
174            testScrollPane = new JScrollPane();
175            layer = TransformUtils.createTransformJXLayer(createContent(), 2,
176                    new QualityHints());
177            /*
178             * Using the JXLayer insets is problematic
179             */
180            // setBorderTitle(layer, " The JXLayer ");
181            controlDialog = new ControlDialog(layer, this);
182            referenceGUI = new ReferenceGUI();
183        }
184    
185        @Override
186        public void repaintGUI(boolean force) {
187            if (force) {
188                testframe.pack();
189                testframe.setLocationRelativeTo(null);
190                testframe.setVisible(true);
191            }
192        }
193    
194        @Override
195        public void setScroller(boolean value) {
196            if (value) {
197                testframe.remove(layer);
198                testframe.add(testScrollPane);
199                testScrollPane.setViewportView(layer);
200    
201                referenceGUI.wrapIntoScroll();
202            } else {
203                testframe.remove(testScrollPane);
204                testframe.add(layer);
205    
206                referenceGUI.removeScroll();
207            }
208            testframe.invalidate();
209            testframe.validate();
210            testframe.repaint();
211    
212            layer.repaint();
213        }
214    
215        private JComponent createContent() {
216            JPanel demoContent = new JPanel(new BorderLayout());
217            JTextPane textPane = new JTextPane();
218            textPane.setContentType("text/html");
219            StringBuilder sb = new StringBuilder();
220            sb.append("<html><h1>Demo</h1>");
221            for (int index = 0; index < 36; index++) {
222                sb.append("<p>");
223                sb.append("Paragraph " + index + ": aaa bbb ccc ddd eee fff.");
224                sb.append("</p>");
225            }
226            sb.append("</html>");
227            textPane.setText(sb.toString());
228            JScrollPane textScroller = new JScrollPane(textPane);
229            textScroller.setPreferredSize(new Dimension(100, 80));
230            demoContent.add(textScroller, BorderLayout.CENTER);
231            JPanel someTextPanel = new JPanel(new BorderLayout());
232            demoContent.add(someTextPanel, BorderLayout.PAGE_START);
233            JTextField someText = new JTextField("Some text");
234            someTextPanel.add(someText, BorderLayout.CENTER);
235            someTextPanel.add(new JLabel(animatedIcon), BorderLayout.LINE_START);
236            final JTextField message = new JTextField("Message area", JLabel.CENTER);
237            demoContent.add(message, BorderLayout.PAGE_END);
238            JPanel buttonPanel = new JPanel(new GridLayout(0, 4));
239            demoContent.add(buttonPanel, BorderLayout.LINE_START);
240            for (int index = 1; index < 17; index++) {
241                buttonPanel.add(new JButton(new AbstractAction(String
242                        .valueOf(index)) {
243    
244                    private static final long serialVersionUID = 1L;
245    
246                    @Override
247                    public void actionPerformed(ActionEvent e) {
248                        message.setText("Button "
249                                + ((JButton) e.getSource()).getText() + " pressed");
250                    }
251                }));
252            }
253            setBorderTitle(demoContent, " Demo content ");
254            return demoContent;
255        }
256    
257        private void createGUI() {
258            createTestFrame();
259            controlDialog.pack();
260            controlDialog.setVisible(true);
261            Rectangle bounds = controlDialog.getBounds();
262            referenceGUI.setVisible(bounds);
263    
264            repaintGUI(true);
265        }
266    
267        private void createTestFrame() {
268            testframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
269            testScrollPane.setViewportView(layer);
270            testframe.add(testScrollPane);
271            testframe.setJMenuBar(new JMenuBar());
272            JMenu menu = new JMenu("Options");
273            testframe.getJMenuBar().add(menu);
274    
275            populateMenu(menu);
276        }
277    
278        private void populateMenu(JMenu menu) {
279    
280            menu.add(new JMenuItem(new AbstractAction(
281                    "Show SimpleBufferedLayerUI control panel") {
282    
283                private static final long serialVersionUID = 1L;
284    
285                @Override
286                public void actionPerformed(ActionEvent e) {
287                    controlDialog.setVisible(true);
288                }
289            }));
290    
291            menu.add(new JMenuItem(new AbstractAction("Show reference frame") {
292    
293                private static final long serialVersionUID = 1L;
294    
295                @Override
296                public void actionPerformed(ActionEvent e) {
297                    referenceGUI.setVisible(true);
298                }
299            }));
300    
301            menu.add(RepaintManagerUtils.createRPDisplayAction());
302        }
303    
304    }