Mercurial > hg > release > thermostat-1.0
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(); + } + } }