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    }