changeset 1299:02a031166d98

Overlay selection bars on Timeline Reviewed-by: vanaltj Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2013-November/008610.html
author Omair Majid <omajid@redhat.com>
date Mon, 04 Nov 2013 16:14:47 -0500
parents 906722e44c37
children e12ff00f2846
files client/swing/src/main/java/com/redhat/thermostat/client/swing/components/TimelineIntervalSelectorUIBasic.java client/swing/src/main/java/com/redhat/thermostat/client/swing/components/timeline/Timeline.java client/swing/src/test/java/com/redhat/thermostat/client/swing/components/TimelineIntervalSelectorTest.java
diffstat 3 files changed, 84 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/TimelineIntervalSelectorUIBasic.java	Mon Nov 04 16:11:51 2013 -0500
+++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/TimelineIntervalSelectorUIBasic.java	Mon Nov 04 16:14:47 2013 -0500
@@ -32,13 +32,15 @@
 
 package com.redhat.thermostat.client.swing.components;
 
+import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Component;
 import java.awt.Cursor;
 import java.awt.Dimension;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
-import java.awt.Paint;
+import java.awt.geom.Rectangle2D;
+import java.awt.geom.RoundRectangle2D;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 
@@ -47,16 +49,19 @@
 import javax.swing.JComponent;
 import javax.swing.JPanel;
 import javax.swing.border.EmptyBorder;
-import javax.swing.border.LineBorder;
 
 import com.redhat.thermostat.client.swing.components.TimelineIntervalMouseHandler.TimeIntervalSelectorTarget;
 import com.redhat.thermostat.client.swing.components.TimelineIntervalSelectorModel.ChangeListener;
 import com.redhat.thermostat.client.swing.components.timeline.Timeline;
+import com.redhat.thermostat.client.ui.Palette;
 import com.redhat.thermostat.common.model.Range;
 
 public class TimelineIntervalSelectorUIBasic extends TimelineIntervalSelectorUI implements TimeIntervalSelectorTarget {
 
-    private static final int PREF_HEIGHT = 20; /* pixels */
+    private static final int SIDE_PADDING = 10;
+
+    // the extra gap below the timeline header itself
+    private static final int GAP_BELOW = 15; /* pixels */
 
     private TimelineIntervalSelector component;
 
@@ -95,6 +100,11 @@
         }
     };
 
+    public TimelineIntervalSelectorUIBasic() {
+        customPaintingPanel.setLayout(new BorderLayout());
+        customPaintingPanel.setBorder(new EmptyBorder(0, SIDE_PADDING, 0, SIDE_PADDING));
+    }
+
     @Override
     public void installUI(JComponent c) {
         super.installUI(c);
@@ -109,7 +119,6 @@
 
     protected void installDefaults() {
         component.setLayout(new BoxLayout(component, BoxLayout.PAGE_AXIS));
-        component.setBorder(new EmptyBorder(5,5,5,5));
 
         component.setSelectionLinePaint(Color.BLACK);
     }
@@ -118,8 +127,9 @@
         topGlue = Box.createVerticalGlue();
         bottomGlue = Box.createVerticalGlue();
 
+        customPaintingPanel.add(timeline, BorderLayout.CENTER);
+
         component.add(topGlue);
-        component.add(timeline);
         component.add(customPaintingPanel);
         component.add(bottomGlue);
     }
@@ -145,9 +155,10 @@
     }
 
     protected void uninstallComponents() {
+        customPaintingPanel.remove(timeline);
+
         component.remove(bottomGlue);
         component.remove(customPaintingPanel);
-        component.remove(timeline);
         component.remove(topGlue);
     }
 
@@ -209,22 +220,22 @@
     private int domainToX(long domainValue) {
         long domainMin = component.getModel().getTotalMinimum();
         long domainMax = component.getModel().getTotalMaximum();
-        int width = component.getWidth();
-        return (int) (1.0 * (domainValue - domainMin) / (domainMax - domainMin) * width);
+        int width = timeline.getWidth();
+        return (int) (1.0 * (domainValue - domainMin) / (domainMax - domainMin) * (width - 1));
     }
 
     private long xToDomain(int x) {
         long domainMin = component.getModel().getTotalMinimum();
         long domainMax = component.getModel().getTotalMaximum();
-        int width = component.getWidth();
-        return (long) ((1.0 * x / (width) * (domainMax - domainMin)) + domainMin);
+        int width = timeline.getWidth();
+        return (long) ((1.0 * x / (width - 1) * (domainMax - domainMin)) + domainMin);
     }
 
     private class CustomPaintPanel extends JPanel {
 
         @Override
         public Dimension getPreferredSize() {
-            return new Dimension(super.getPreferredSize().height, PREF_HEIGHT);
+            return new Dimension(super.getPreferredSize().width, timeline.getPreferredSize().height + GAP_BELOW);
         }
 
         @Override
@@ -233,8 +244,10 @@
 
             Graphics2D g2 = (Graphics2D) g.create();
 
-            int startX = domainToX(component.getModel().getSelectedMinimum());
-            int endX = domainToX(component.getModel().getSelectedMaximum());
+            int left = domainToX(component.getModel().getSelectedMinimum()) + SIDE_PADDING ;
+            int right = domainToX(component.getModel().getSelectedMaximum()) + SIDE_PADDING;
+            int height = getHeight();
+            int width = getWidth() - 1;
 
             boolean enabled = component.isEnabled();
             if (enabled) {
@@ -243,16 +256,37 @@
                 g2.setPaint(Color.LIGHT_GRAY);
             }
 
-            // g2.fillRect(startX, 0, (endX - startX), getHeight());
+            int pinchHeight = getHeight() - (GAP_BELOW / 2);
+
+            g2.drawLine(0, height, 0, pinchHeight);
+            g2.drawLine(0, pinchHeight, left, pinchHeight);
+            g2.drawLine(left, pinchHeight, left, 0);
+            paintHandle(g2, left, pinchHeight/2);
+
+            g2.drawLine(width, height, width, pinchHeight);
+            g2.drawLine(width, pinchHeight, right, pinchHeight);
+            g2.drawLine(right, pinchHeight, right, 0);
+            paintHandle(g2, right, pinchHeight/2);
+
+            g2.dispose();
+        }
 
-            g2.drawLine(0, getHeight(), 0, getHeight()/2);
-            g2.drawLine(0, getHeight()/2, startX, getHeight()/2);
-            g2.drawLine(startX, getHeight()/2, startX, 0);
+        private void paintHandle(Graphics2D g, int x, int y) {
+            g = (Graphics2D) g.create();
+            g.translate(x, y);
+
+            g.setColor(Palette.LIGHT_GRAY.getColor());
+            g.fill(new RoundRectangle2D.Float(-2, -10, 4, 20, 2, 2));
 
-            g2.drawLine(getWidth()-1, getHeight(), getWidth()-1, getHeight()/2);
-            g2.drawLine(getWidth()-1, getHeight()/2, endX, getHeight()/2);
-            g2.drawLine(endX, getHeight()/2, endX, 0);
-            g2.dispose();
+            if (component.isEnabled()) {
+                g.setPaint(component.getSelectionLinePaint());
+            } else {
+                g.setPaint(Color.LIGHT_GRAY);
+            }
+
+            g.draw(new RoundRectangle2D.Float(-2, -10, 4, 20, 2, 2));
+
+            g.dispose();
         }
     }
 }
--- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/timeline/Timeline.java	Mon Nov 04 16:11:51 2013 -0500
+++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/timeline/Timeline.java	Mon Nov 04 16:14:47 2013 -0500
@@ -234,7 +234,7 @@
                     4);
 
             if (isEnabled()) {
-                graphics.setColor(Color.BLACK /* Palette.THERMOSTAT_BLU.getColor() */);
+                graphics.setColor(Palette.THERMOSTAT_BLU.getColor());
             } else {
                 graphics.setColor(Color.GRAY);
             }
--- a/client/swing/src/test/java/com/redhat/thermostat/client/swing/components/TimelineIntervalSelectorTest.java	Mon Nov 04 16:11:51 2013 -0500
+++ b/client/swing/src/test/java/com/redhat/thermostat/client/swing/components/TimelineIntervalSelectorTest.java	Mon Nov 04 16:14:47 2013 -0500
@@ -34,6 +34,10 @@
 
 import java.awt.BorderLayout;
 import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Insets;
+import java.awt.RenderingHints;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.concurrent.TimeUnit;
@@ -41,8 +45,10 @@
 import javax.swing.BorderFactory;
 import javax.swing.JCheckBox;
 import javax.swing.JFrame;
+import javax.swing.JPanel;
 import javax.swing.SwingUtilities;
 import javax.swing.WindowConstants;
+import javax.swing.border.EmptyBorder;
 
 import com.redhat.thermostat.client.swing.components.TimelineIntervalSelectorModel.ChangeListener;
 
@@ -84,8 +90,13 @@
                 });
                 enable.setSelected(true);
 
-                mainWindow.add(enable, BorderLayout.NORTH);
-                mainWindow.add(intervalSelector, BorderLayout.CENTER);
+                PlaceHolder actualComponent = new PlaceHolder();
+                actualComponent.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
+
+                mainWindow.getRootPane().setBorder(new EmptyBorder(new Insets(10,10,10,10)));
+                mainWindow.add(intervalSelector, BorderLayout.NORTH);
+                mainWindow.add(actualComponent, BorderLayout.CENTER);
+                mainWindow.add(enable, BorderLayout.SOUTH);
                 mainWindow.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
 
                 mainWindow.setVisible(true);
@@ -93,4 +104,19 @@
             }
         });
     }
+
+    private static class PlaceHolder extends JPanel {
+        @Override
+        protected void paintComponent(Graphics g) {
+            Graphics2D g2 = (Graphics2D) g.create();
+
+            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+            g2.setColor(Color.BLACK);
+
+            g2.drawLine(0, 0, getWidth(), getHeight());
+            g2.drawLine(getWidth(), 0, 0, getHeight());
+
+            g2.dispose();
+        }
+    }
 }