001 package org.pbjar.jxlayer.demo.sbarlow;
002
003 import java.awt.*;
004 import java.awt.event.*;
005 import java.awt.geom.RoundRectangle2D;
006 import java.util.Calendar;
007 import java.util.HashMap;
008
009 // import javax.swing.RepaintManager;
010
011 import javax.swing.SwingUtilities;
012 import javax.swing.Timer;
013 import javax.swing.UIManager;
014 import javax.swing.border.*;
015 import org.jdesktop.swingx.*;
016 import org.jdesktop.swingx.JXBusyLabel.Direction;
017 import org.jdesktop.swingx.border.DropShadowBorder;
018 import org.jdesktop.swingx.painter.BusyPainter;
019 import org.jdesktop.jxlayer.JXLayer;
020 import org.pbjar.jxlayer.demo.TransformUtils;
021
022 /**
023 * A SwingX and TransformUI demo by <b>s_barlow</b>.
024 * <p>
025 * Run a web start demo: <a
026 * href="http://www.pbjar.org/blogs/jxlayer/version_2/SBarlowDemo.jnlp">
027 * <IMG style="CLEAR: right" alt="Web Start Shared JXLayer"
028 * src="http://javadesktop.org/javanet_images/webstart.small2.gif"
029 * align="middle" border="1" /> </a>
030 * </p>
031 *
032 */
033 public class TestTransformerUI extends JXFrame {
034
035 class ReLocator extends MouseAdapter {
036 private Point offset;
037 private final JXPanel myComp;
038
039 public ReLocator(JXPanel myComp) {
040 this.myComp = myComp;
041 }
042
043 public void mouseClicked(MouseEvent e) {
044 JXPanel panel = (JXPanel) myComp.getParent();
045
046 float alpha = myComp.getAlpha();
047 if (alpha < 1f) {
048 alpha = 1f;
049 panel.setComponentZOrder(myComp, 0); // moveToFront
050 myComp.setBorder(createBorder(true));
051 } else {
052 alpha = 0.7f;
053 panel.setComponentZOrder(myComp, panel.getComponentCount() - 1); // moveToBack
054 myComp.setBorder(createBorder(false));
055 }
056
057 myComp.setAlpha(alpha);
058 panel.revalidate();
059 panel.repaint();
060 }
061
062 public void mouseDragged(MouseEvent e) {
063 Dimension size = myComp.getSize();
064 Dimension pSize = myComp.getParent().getSize();
065
066 Point location = e.getPoint();
067 location = SwingUtilities.convertPoint(myComp, location, myComp
068 .getParent());
069 location.translate(offset.x, offset.y);
070
071 if (location.x < 0)
072 location.x = 0;
073 else if (location.x + size.width > pSize.width)
074 location.x = pSize.width - size.width;
075 if (location.y < 0)
076 location.y = 0;
077 else if (location.y + size.height > pSize.height)
078 location.y = pSize.height - size.height;
079
080 myComp.setLocation(location);
081 myComp.setAlpha(1.0f);
082 myComp.setBorder(createBorder(true));
083
084 JXPanel panel = (JXPanel) myComp.getParent();
085 panel.setComponentZOrder(myComp, 0); // moveToFront
086 }
087
088 public void mousePressed(MouseEvent e) {
089 System.out.println("pressed: " + myComp.getName());
090 offset = e.getPoint();
091 offset.x = -offset.x;
092 offset.y = -offset.y;
093 }
094
095 public void mouseReleased(MouseEvent e) {
096 System.out.println("released: " + myComp.getName());
097 offset = null;
098 }
099 }
100
101 private static final long serialVersionUID = 1L;
102
103 public static void main(String[] args) {
104 try {
105 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
106 } catch (Exception e) {
107 e.printStackTrace();
108 }
109 SwingUtilities.invokeLater(new Runnable() {
110 public void run() {
111 new TestTransformerUI().setVisible(true);
112 }
113 });
114 }
115
116 private static Border createBorder(boolean active) {
117 Color baseColor = Color.LIGHT_GRAY;
118 Color shadowColor = Color.DARK_GRAY;
119 Border inner = new LineBorder(active ? shadowColor : baseColor);
120 Border outer = new DropShadowBorder(shadowColor, 20, .7f, 15, false,
121 false, active, active);
122 return new CompoundBorder(outer, inner);
123 }
124
125 private static Color setAlpha(Color color, double alpha) {
126 int alphaInt = (int) (alpha * 255);
127 return new Color(color.getRed(), color.getGreen(), color.getBlue(),
128 alphaInt);
129 }
130
131 private static void setUpBackground(JXLabel comp, Color bg,
132 boolean translucent) {
133 if (translucent)
134 bg = setAlpha(bg, 0.25);
135 comp.setBackground(bg);
136 }
137
138 public TestTransformerUI() {
139 super("TestFrame", true);
140
141 JXPanel contentPane = new JXPanel(new BorderLayout());
142 contentPane.add(createTaskPanel(), BorderLayout.WEST);
143 contentPane.add(createContent(), BorderLayout.CENTER);
144 setContentPane(wrapLayer(contentPane));
145 pack();
146 setLocationRelativeTo(null);
147 }
148
149 private Container createContent() {
150 JXPanel panel = new JXPanel(new GridLayout(3, 3));
151 Component note;
152 Color[] color = { Color.YELLOW, Color.ORANGE, Color.RED, Color.GREEN,
153 Color.MAGENTA, Color.GRAY, Color.LIGHT_GRAY, Color.PINK };
154 for (int i = 1; i <= color.length; i++) {
155 note = createNote("note number " + i, color[i - 1]);
156 panel.add(note);
157 }
158 return panel;
159 }
160
161 private Component createNote(String title, Color color) {
162 JXPanel note = new JXPanel(new BorderLayout());
163 note.setName(title);
164 note.setOpaque(false);
165 note.setBorder(createBorder(true));
166
167 JXLabel header = new JXLabel();
168 setUpBackground(header, color, false);
169 header.setOpaque(true);
170 header.setPreferredSize(new Dimension(0, 24));
171 note.add(header, BorderLayout.NORTH);
172
173 JXLabel label = new JXLabel("<html><i>" + title + "</i></html>");
174 label.setBorder(new EmptyBorder(5, 10, 10, 10));
175 label.setOpaque(true);
176 setUpBackground(label, color, true);
177 note.add(label, BorderLayout.CENTER);
178
179 ReLocator listener = new ReLocator(note);
180
181 note.addMouseMotionListener(listener);
182 note.addMouseListener(listener);
183
184 // label.addMouseMotionListener(listener); // PB
185 // label.addMouseListener(listener); // PB
186
187 return note;
188 }
189
190 private Component createTaskPanel() {
191 JXTaskPaneContainer container = new JXTaskPaneContainer();
192
193 /*
194 * some buttons
195 */
196 JXTaskPane task1 = new JXTaskPane();
197 task1.setTitle("buttons");
198 task1.setSpecial(true);
199
200 JXButton button1 = new JXButton("first button");
201 button1.addActionListener(new ActionListener() {
202 public void actionPerformed(ActionEvent e) {
203 System.out.println("action 1");
204 }
205 });
206 task1.add(button1);
207
208 JXButton button2 = new JXButton("2nd button");
209 button2.addActionListener(new ActionListener() {
210 public void actionPerformed(ActionEvent e) {
211 System.out.println("action 2");
212 }
213 });
214 task1.add(button2);
215 container.add(task1);
216
217 /*
218 * a clock (or two)
219 */
220 JXTaskPane task2 = new JXTaskPane();
221 task2.setTitle("the time");
222
223 final JXLabel timeLabel = new JXLabel();
224 timeLabel.setBorder(new LineBorder(Color.DARK_GRAY));
225 timeLabel.setHorizontalAlignment(JXLabel.CENTER);
226 task2.add(timeLabel);
227
228 final JXBusyLabel busyLabel = new JXBusyLabel();
229 busyLabel.setBorder(new LineBorder(Color.DARK_GRAY));
230 busyLabel.setHorizontalAlignment(JXLabel.CENTER);
231 busyLabel.setDelay(1000);
232
233 /*
234 * PB
235 *
236 * final BusyPainter<JXBusyLabel> busyPainter = new
237 * BusyPainter<JXBusyLabel>();
238 *
239 * In SwingX 0.9.6 BusyPainter is not generic anymore.
240 */
241 final BusyPainter busyPainter = new BusyPainter();
242 busyPainter.setDirection(Direction.RIGHT);
243 busyPainter.setBaseColor(setAlpha(Color.BLACK, 0.15f));
244 busyPainter.setHighlightColor(Color.BLACK);
245 busyPainter.setAntialiasing(true);
246 busyPainter.setPaintCentered(true);
247 busyPainter.setPoints(60);
248 busyPainter.setTrailLength(15);
249 busyPainter.setPointShape(new RoundRectangle2D.Float(2f, 2f, 10f, 1f,
250 2f, 2f));
251
252 busyLabel.setBusyPainter(busyPainter);
253
254 Dimension size = busyPainter.getTrajectory().getBounds().getSize();
255 Rectangle shapeBounds = busyPainter.getPointShape().getBounds();
256 size.height += (shapeBounds.width * 2 + shapeBounds.x * 2 + 4);
257
258 busyLabel.setPreferredSize(size);
259 busyLabel.setBusy(false);
260
261 task2.add(busyLabel);
262 container.add(task2);
263
264 // update the clocks...
265 Timer clock = new Timer(1, null);
266 clock.setRepeats(true);
267 clock.setDelay(1000);
268 clock.addActionListener(new ActionListener() {
269 String timeFormat = "%02d:%02d:%02d";
270
271 public void actionPerformed(ActionEvent e) {
272 Calendar cal = Calendar.getInstance();
273 int hour = cal.get(Calendar.HOUR_OF_DAY);
274 int min = cal.get(Calendar.MINUTE);
275 int sec = cal.get(Calendar.SECOND);
276 int length = busyPainter.getPoints();
277
278 int frame = (sec % length) - (length / 4);
279 if (frame < 0)
280 frame += length;
281
282 busyPainter.setFrame(frame);
283 busyLabel.repaint();
284
285 timeLabel.setText(String.format(timeFormat, hour, min, sec));
286 }
287 });
288 clock.start();
289 return container;
290 }
291
292 private JXLayer<?> wrapLayer(JXPanel content) {
293 HashMap<RenderingHints.Key, Object> hints = new HashMap<RenderingHints.Key, Object>();
294 hints.put(RenderingHints.KEY_RENDERING,
295 RenderingHints.VALUE_RENDER_QUALITY);
296 hints.put(RenderingHints.KEY_ANTIALIASING,
297 RenderingHints.VALUE_ANTIALIAS_ON);
298
299 /*
300 * PB Wrap the content in a panel that displays the current
301 * RepaintManager.
302 */
303 JXPanel debugPanel = new JXPanel(new BorderLayout()) {
304
305 private static final long serialVersionUID = 1L;
306
307 @Override
308 public void paint(Graphics g) {
309 super.paint(g);
310 // System.out.println(RepaintManager.currentManager(this)
311 // .getClass().getName());
312 }
313 };
314 debugPanel.add(content);
315
316 // TransformPort transformPort = new TransformPort(debugPanel);
317 // transformPort.setOpaque(true);
318 // transformPort.setBackground(Color.ORANGE);
319
320 // TransformUI zoomUI = new TransformUI();
321 // DefaultTransformModel transformer = new DefaultTransformModel();
322 // transformer.setPreferredScale(2.0);
323 // zoomUI.setModel(transformer);
324 // zoomUI.setRenderingHints(hints);
325
326 return TransformUtils.createTransformJXLayer(debugPanel, 2.0,hints);
327
328 // return new JXLayer<TransformPort>(transformPort, zoomUI);
329 }
330 }