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 }