Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

zoom based on property change #78

Merged
merged 12 commits into from
Nov 23, 2013
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,11 @@ src/main/java/Demo.java
/nbbuild/
/dist/
nbproject
build.xml
build.xml
.DS_Store
/_lib
/gradlew_release.cmd
/gradle_localOverride.cmd
/gradlew_updateWrapper.cmd
/gradlew_repairHeaders.cmd
/.nb-gradle/profiles/private/
8 changes: 6 additions & 2 deletions src/main/java/jfxtras/labs/map/CoordinatesConverter.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,9 @@ private static int getZoom(Zoomable zoomable){

public static Coordinate toCoordinate(Point mapPoint, Moveable controller) {
Dimension dim = new Dimension(controller.getMapWidth(), controller.getMapHeight());
return toCoordinate(mapPoint, controller.getCenter(), dim, getZoom(controller));
Point center = controller.getCenter();
int zoom = getZoom(controller);
return toCoordinate(mapPoint, center, dim, zoom);
}

/**
Expand All @@ -76,7 +78,9 @@ public static Coordinate toCoordinate(Point mapPoint, Point center,

public static Point toMapPoint(Coordinate coordinate, Moveable controller){
Dimension dim = new Dimension(controller.getMapWidth(), controller.getMapHeight());
return toMapPoint(coordinate, controller.getCenter(), dim, getZoom(controller));
Point center = controller.getCenter();
int zoom = getZoom(controller);
return toMapPoint(coordinate, center, dim, zoom);
}

/**
Expand Down
109 changes: 72 additions & 37 deletions src/main/java/jfxtras/labs/map/MapPane.java
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,10 @@ public final class MapPane extends Pane implements MapTilesourceable {
private CoordinateStringFormater formater;

private boolean tilesPrepared;

private Coordinate zoomCoordinate;

private ZoomCoordinateCache zoomCoordinateCache = new ZoomCoordinateCache();

private ZoomChangeListener zoomChangeListener = new ZoomChangeListener();

public MapPane(TileSource ts) {
this(ts, SIZE, SIZE, INITIAL_ZOOM);
Expand Down Expand Up @@ -164,6 +166,8 @@ public MapPane(TileSource tileSource, int width, int height, int zoom) {

clipMask.setWidth(Double.MAX_VALUE);
clipMask.setHeight(Double.MAX_VALUE);

this.zoom.addListener(zoomChangeListener);
}

public final void setTilesMouseHandler(TilesMouseHandler handler) {
Expand Down Expand Up @@ -234,33 +238,29 @@ public void adjustCursorLocationText() {
}

public void setDisplayPositionByLatLon(double lat, double lon) {
setDisplayPositionByLatLon(lat, lon, zoom.get());
}

public void setDisplayPositionByLatLon(double lat, double lon, int zoom) {
setDisplayPositionByLatLon(createMapCenterPoint(), lat, lon, zoom);
}

private void setDisplayPosition(int x, int y, int zoom) {
setDisplayPosition(createMapCenterPoint(), x, y, zoom);
setDisplayPositionByLatLon(createMapCenterPoint(), lat, lon, zoom.get());
}

private Point createMapCenterPoint() {
return new Point((int) (getMapWidth() / 2), (int) (getMapHeight() / 2));
}

public void setDisplayPositionByLatLon(Point mapPoint, double lat,
private void setDisplayPositionByLatLon(Point mapPoint, double lat,
double lon, int zoom) {
int x = Mercator.lonToX(lon, zoom);
int y = Mercator.latToY(lat, zoom);
setDisplayPosition(mapPoint, x, y, zoom);
}

private void setDisplayPosition(int x, int y, int zoom) {
setDisplayPosition(createMapCenterPoint(), x, y, zoom);
}

private void setDisplayPosition(Point mapPoint, int x, int y, int zoom) {
if (isValidZoom(zoom)) {
// Get the plain tile number
moveCenter(mapPoint, x, y);
this.zoom.set(zoom);
// this.zoom.set(zoom);
renderControl();
}
}
Expand Down Expand Up @@ -347,7 +347,8 @@ public void setDisplayToFitMapRectangle() {

@Override
public void moveMap(int x, int y) {
zoomCoordinate = null;
zoomCoordinateCache.clear();

Point previous = new Point(center);
center.x += x;
center.y += y;
Expand All @@ -373,60 +374,46 @@ private boolean isOnEdge() {
@Override
public final void centerMap() {
setDisplayPositionByLatLon(START, START);
zoomCoordinateCache.clear();
}

@Override
public SimpleIntegerProperty zoomProperty() {
return zoom;
}

@Override
public void zoomIn() {
updateZoom(zoom.get() + 1);
}

@Override
public void zoomIn(Point mapPoint) {
updateZoom(zoom.get() + 1, mapPoint);
}

@Override
public void zoomOut() {
updateZoom(zoom.get() - 1);
}

@Override
public void zoomOut(Point mapPoint) {
updateZoom(zoom.get() - 1, mapPoint);
}

@Override
public void setZoom(int nextZoom) {
Point mapPoint = createMapCenterPoint();
updateZoom(nextZoom, mapPoint);
private void setZoom(int nextZoom) {
zoom.set(nextZoom);
}

private void updateZoom(int nextZoom) {
Point mapPoint = createMapCenterPoint();
if (zoomCoordinate == null) {
zoomCoordinate = getCoordinate(mapPoint);
}
updateZoom(nextZoom, mapPoint, zoomCoordinate);
updateZoom(nextZoom, mapPoint, zoomCoordinateCache.getZoomCoordinate());
}

private void updateZoom(int nextZoom, Point mapPoint) {
zoomCoordinate = null;
zoomCoordinateCache.clear();
Coordinate zoomPos = getCoordinate(mapPoint);
updateZoom(nextZoom, mapPoint, zoomPos);
}

private void updateZoom(int nextZoom, Point mapPoint, Coordinate zoomPos) {
if (isValidZoom(nextZoom)) {
setDisplayPositionByLatLon(mapPoint, zoomPos.getLatitude(),
zoomPos.getLongitude(), nextZoom);

if (isEdgeVisible()) {
centerMap();
// centerMap();
}
}
}
Expand All @@ -443,6 +430,11 @@ private boolean isEdgeVisible() {
private Coordinate getCoordinate(Point p) {
return toCoordinate(p, this);
}

private Coordinate getCoordinate(Point p, int zoom) {
Dimension dim = new Dimension(getMapWidth(), getMapHeight());
return toCoordinate(p, center, dim, zoom);
}

public void setMapMarkerVisible(boolean mapMarkersVisible) {
this.mapMarkersVisible.set(mapMarkersVisible);
Expand All @@ -467,9 +459,13 @@ public void setTileSource(TileSource tileSource) {
}
tilesProvider.setTileSource(tileSource);
setZoomBounds(tileSource);
if (zoom.get() > tileSource.getMaxZoom()) {
setZoom(tileSource.getMaxZoom());
//set zoom according to max or min available zoom
if (zoom.get() > maxZoom) {
setZoom(maxZoom);
}else if(zoom.get() < minZoom){
setZoom(minZoom);
}
zoomCoordinateCache.clear();

renderControl();
}
Expand Down Expand Up @@ -643,4 +639,43 @@ public void changed(ObservableValue<? extends Boolean> observable,
renderControl();
}
}

//store the coordinate where the zoom started
private class ZoomCoordinateCache{

private Coordinate zoomCoordinate;

Coordinate getZoomCoordinate(){
if (zoomCoordinate == null) {
Point p = createMapCenterPoint();
zoomCoordinate = getCoordinate(p);
}
return zoomCoordinate;
}

void setZoomCoordinate(Coordinate coordinate){
this.zoomCoordinate = coordinate;
}

void clear() {
zoomCoordinate = null;
}

}

private class ZoomChangeListener implements ChangeListener<Number>{

@Override
public void changed(ObservableValue<? extends Number> ov,
Number oldVal, Number newVal) {
if(oldVal != null){
int oldZoomVal = oldVal.intValue();
Coordinate c = getCoordinate(createMapCenterPoint(), oldZoomVal);
zoomCoordinateCache.setZoomCoordinate(c);
int newZoomVal = newVal.intValue();
updateZoom(newZoomVal);
}
}

}
}
27 changes: 18 additions & 9 deletions src/main/java/jfxtras/labs/map/ZoomControlFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.Button;
import javafx.scene.control.Slider;
import javafx.scene.control.Tooltip;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
Expand All @@ -46,11 +45,13 @@
*/
public class ZoomControlFactory {

private static final int GAP = 5;

private static final String ZOOM_LEVEL = "Zoom to level ";

protected Zoomable zoomable;

private Slider zoomSlider;
private ZoomSlider zoomSlider;

private Button zoomInButton;

Expand All @@ -62,8 +63,7 @@ public Pane create(Zoomable zoomable) {

this.zoomable = zoomable;

ZoomSliderFactory zoomSliderFactory = new ZoomSliderFactory(zoomable);
zoomSlider = zoomSliderFactory.create();
zoomSlider = new ZoomSlider(zoomable);

zoomSlider.valueProperty().addListener(new ZoomSliderChangeListener(zoomable));

Expand All @@ -81,7 +81,7 @@ public Pane create(Zoomable zoomable) {

zoomable.zoomProperty().addListener(new ZoomChangeListener());

Pane pane = new VBox();
Pane pane = new VBox(GAP);
pane.getChildren().add(zoomInButton);
pane.getChildren().add(zoomSlider);
pane.getChildren().add(zoomOutButton);
Expand Down Expand Up @@ -129,7 +129,11 @@ private class ZoomMinChangeListener implements ChangeListener<Number> {
@Override
public void changed(ObservableValue<? extends Number> ov,
Number oldVal, Number newVal) {
zoomSlider.setMin(newVal.doubleValue());
ignore = true;
double min = newVal.doubleValue();
zoomSlider.adjustScale(min, zoomSlider.getMax());
zoomSlider.setMin(min);
ignore = false;
}
}

Expand All @@ -138,7 +142,11 @@ private class ZoomMaxChangeListener implements ChangeListener<Number> {
@Override
public void changed(ObservableValue<? extends Number> ov,
Number oldVal, Number newVal) {
zoomSlider.setMax(newVal.doubleValue());
ignore = true;
double max = newVal.doubleValue();
zoomSlider.adjustScale(zoomSlider.getMin(), max);
zoomSlider.setMax(max);
ignore = false;
}
}

Expand All @@ -151,9 +159,10 @@ public ZoomSliderChangeListener(Zoomable zoomable) {
}

@Override
public void changed(ObservableValue<? extends Number> ov, Number old_val, Number new_val) {
public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newVal) {
if(!ignore){
zoomable.setZoom(new_val.intValue());
int newZoom = newVal.intValue();
zoomable.zoomProperty().set(newZoom);
}
}
}
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/jfxtras/labs/map/ZoomInButtonFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,15 @@ protected String getId() {
protected String getImagePath() {
return "plus.png";
}

@Override
protected EventHandler<ActionEvent> getEventHandler() {
return new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
zoomable.zoomIn();
int val = zoomable.zoomProperty().get();
//zoomable.updateZoom(val + 1);
zoomable.zoomProperty().set(val + 1);
}
};
}
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/jfxtras/labs/map/ZoomOutButtonFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@ protected EventHandler<ActionEvent> getEventHandler() {
return new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
zoomable.zoomOut();
int val = zoomable.zoomProperty().get();
// zoomable.updateZoom(val - 1);
zoomable.zoomProperty().set(val - 1);
}
};
}
Expand Down
Loading