From b85df38b5611e45cb9296df07b720badf74ac26e Mon Sep 17 00:00:00 2001 From: Anthony Towns Date: Mon, 22 Nov 2010 05:22:17 +1000 Subject: [PATCH] altosui: improve sitemap scrolling behaviour --- ao-tools/altosui/AltosSiteMap.java | 53 +++++++++++++++++--------- ao-tools/altosui/AltosSiteMapTile.java | 21 ---------- ao-tools/altosui/GrabNDrag.java | 35 +++++++++-------- 3 files changed, 55 insertions(+), 54 deletions(-) diff --git a/ao-tools/altosui/AltosSiteMap.java b/ao-tools/altosui/AltosSiteMap.java index 802eb68c..2477e4f8 100644 --- a/ao-tools/altosui/AltosSiteMap.java +++ b/ao-tools/altosui/AltosSiteMap.java @@ -273,6 +273,8 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay { finishTileLater(tile, offset); } + scrollRocketToVisible(pt); + if (offset != tileOffset(last_pt)) { ensureTilesAround(offset); } @@ -281,8 +283,8 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay { last_state = state.state; } - private AltosSiteMapTile createTile(final Point offset) { - final AltosSiteMapTile tile = new AltosSiteMapTile(px_size); + private AltosSiteMapTile createTile(Point offset) { + AltosSiteMapTile tile = new AltosSiteMapTile(px_size); mapTiles.put(offset, tile); return tile; } @@ -292,7 +294,6 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay { SwingUtilities.invokeLater( new Runnable() { public void run() { addTileAt(tile, offset); - tile.setScrollable(); } } ); } @@ -310,6 +311,18 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay { } } + private Point topleft = new Point(0,0); + private void scrollRocketToVisible(Point2D.Double pt) { + Rectangle r = comp.getVisibleRect(); + Point2D.Double copt = translatePoint(pt, tileCoordOffset(topleft)); + int dx = (int)copt.x - r.width/2 - r.x; + int dy = (int)copt.y - r.height/2 - r.y; + if (Math.abs(dx) > r.width/3 || Math.abs(dy) > r.height/3) { + r.x += dx; + r.y += dy; + comp.scrollRectToVisible(r); + } + } private void addTileAt(AltosSiteMapTile tile, Point offset) { if (Math.abs(offset.x) >= MAX_TILE_DELTA || @@ -320,6 +333,18 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay { return; } + boolean review = false; + Rectangle r = comp.getVisibleRect(); + if (offset.x < topleft.x) { + r.x += (topleft.x - offset.x) * px_size; + topleft.x = offset.x; + review = true; + } + if (offset.y < topleft.y) { + r.y += (topleft.y - offset.y) * px_size; + topleft.y = offset.y; + review = true; + } GridBagConstraints c = new GridBagConstraints(); c.anchor = GridBagConstraints.CENTER; c.fill = GridBagConstraints.BOTH; @@ -329,7 +354,11 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay { c.gridx = offset.x + MAX_TILE_DELTA; c.gridy = offset.y + MAX_TILE_DELTA; layout.setConstraints(tile, c); + comp.add(tile); + if (review) { + comp.scrollRectToVisible(r); + } } private AltosSiteMap(boolean knowWhatYouAreDoing) { @@ -338,29 +367,19 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay { } } - JComponent comp; - private GridBagLayout layout; + JComponent comp = new JComponent() { }; + private GridBagLayout layout = new GridBagLayout(); public AltosSiteMap() { - comp = new JComponent() { - GrabNDrag scroller = new GrabNDrag(this); - { - addMouseMotionListener(scroller); - addMouseListener(scroller); - setAutoscrolls(true); - } - }; + GrabNDrag scroller = new GrabNDrag(comp); - layout = new GridBagLayout(); comp.setLayout(layout); for (int x = -1; x <= 1; x++) { for (int y = -1; y <= 1; y++) { Point offset = new Point(x, y); - AltosSiteMapTile t = new AltosSiteMapTile(px_size); - mapTiles.put(offset, t); + AltosSiteMapTile t = createTile(offset); addTileAt(t, offset); - t.setScrollable(); } } setViewportView(comp); diff --git a/ao-tools/altosui/AltosSiteMapTile.java b/ao-tools/altosui/AltosSiteMapTile.java index e0942986..8301f42b 100644 --- a/ao-tools/altosui/AltosSiteMapTile.java +++ b/ao-tools/altosui/AltosSiteMapTile.java @@ -54,13 +54,6 @@ public class AltosSiteMapTile extends JLayeredPane { private boolean drawn_landed_circle = false; private boolean drawn_boost_circle = false; - private boolean scrollable = false; - public synchronized void setScrollable() { - scrollable = true; - } - public synchronized boolean isScrollable() { - return scrollable; - } public synchronized void show(AltosState state, int crc_errors, Point2D.Double last_pt, Point2D.Double pt) { @@ -69,20 +62,6 @@ public class AltosSiteMapTile extends JLayeredPane { } g2d.draw(new Line2D.Double(last_pt, pt)); - int px_size = getWidth(); - if (isScrollable() && 0 <= pt.x && pt.x < px_size) { - if (0 <= pt.y && pt.y < px_size) { - int dx = 500, dy = 250; - if (state.state > 2) { - dx = Math.min(200, 20 + (int) Math.abs(last_pt.x - pt.x)); - dy = Math.min(100, 10 + (int) Math.abs(last_pt.y - pt.y)); - } - Rectangle r = new Rectangle((int)pt.x-dx, (int)pt.y-dy, - dx*2, dy*2); - scrollRectToVisible(r); - } - } - if (state.state == 3 && !drawn_boost_circle) { drawn_boost_circle = true; g2d.setColor(Color.RED); diff --git a/ao-tools/altosui/GrabNDrag.java b/ao-tools/altosui/GrabNDrag.java index b44f3fe2..e6b87b58 100644 --- a/ao-tools/altosui/GrabNDrag.java +++ b/ao-tools/altosui/GrabNDrag.java @@ -29,23 +29,26 @@ import java.util.*; import java.text.*; class GrabNDrag extends MouseInputAdapter { - private JComponent scroll; - private Point startPt = new Point(); + private JComponent scroll; + private Point startPt = new Point(); - public GrabNDrag(JComponent parent) { - scroll = parent; - } + public GrabNDrag(JComponent scroll) { + this.scroll = scroll; + scroll.addMouseMotionListener(this); + scroll.addMouseListener(this); + scroll.setAutoscrolls(true); + } - public void mousePressed(MouseEvent e) { - startPt.setLocation(e.getPoint()); - } - public void mouseDragged(MouseEvent e) { - int xd = e.getX() - startPt.x; - int yd = e.getY() - startPt.y; + public void mousePressed(MouseEvent e) { + startPt.setLocation(e.getPoint()); + } + public void mouseDragged(MouseEvent e) { + int xd = e.getX() - startPt.x; + int yd = e.getY() - startPt.y; - Rectangle r = scroll.getVisibleRect(); - r.x -= xd; - r.y -= yd; - scroll.scrollRectToVisible(r); - } + Rectangle r = scroll.getVisibleRect(); + r.x -= xd; + r.y -= yd; + scroll.scrollRectToVisible(r); + } } -- 2.30.2