import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JMenuItem;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JSlider;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JSlider;
import tim.prune.I18nManager;
import tim.prune.data.DoubleRange;
import tim.prune.data.Selection;
import tim.prune.I18nManager;
import tim.prune.data.DoubleRange;
import tim.prune.data.Selection;
private static final Color COLOR_CURR_RANGE = Color.GREEN;
private static final Color COLOR_CROSSHAIRS = Color.RED;
private static final Color COLOR_WAYPT_NAME = Color.BLACK;
private static final Color COLOR_CURR_RANGE = Color.GREEN;
private static final Color COLOR_CROSSHAIRS = Color.RED;
private static final Color COLOR_WAYPT_NAME = Color.BLACK;
+ _popup.addSeparator();
+ // Set background
+ JMenuItem setMapBgItem = new JMenuItem(
+ I18nManager.getText(FunctionLibrary.FUNCTION_SET_MAP_BG.getNameKey()));
+ setMapBgItem.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e)
+ {
+ FunctionLibrary.FUNCTION_SET_MAP_BG.begin();
+ }});
+ _popup.add(setMapBgItem);
// new point option
JMenuItem newPointItem = new JMenuItem(I18nManager.getText("menu.map.newpoint"));
newPointItem.addActionListener(new ActionListener() {
// new point option
JMenuItem newPointItem = new JMenuItem(I18nManager.getText("menu.map.newpoint"));
newPointItem.addActionListener(new ActionListener() {
- int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getXNew(selectedPoint));
- int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getYNew(selectedPoint));
+ int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getX(selectedPoint));
+ int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getY(selectedPoint));
{
inG.setColor(COLOR_BG);
inG.fillRect(0, 0, getWidth(), getHeight());
{
inG.setColor(COLOR_BG);
inG.fillRect(0, 0, getWidth(), getHeight());
inG.drawString(I18nManager.getText("display.nodata"), 50, getHeight()/2);
}
// Draw slider etc on top
inG.drawString(I18nManager.getText("display.nodata"), 50, getHeight()/2);
}
// Draw slider etc on top
- // Loop over tiles drawing each one
- int[] tileIndices = _mapPosition.getTileIndices(getWidth(), getHeight());
- int[] pixelOffsets = _mapPosition.getDisplayOffsets(getWidth(), getHeight());
- for (int tileX = tileIndices[0]; tileX <= tileIndices[1] && !loadingFailed; tileX++)
+ if (_tileCacher.isOverzoomed())
- int x = (tileX - tileIndices[0]) * 256 - pixelOffsets[0];
- for (int tileY = tileIndices[2]; tileY <= tileIndices[3]; tileY++)
+ // display overzoom message
+ g.setColor(COLOR_MESSAGES);
+ g.drawString(I18nManager.getText("map.overzoom"), 50, getHeight()/2);
+ }
+ else
+ {
+ // Loop over tiles drawing each one
+ int[] tileIndices = _mapPosition.getTileIndices(getWidth(), getHeight());
+ int[] pixelOffsets = _mapPosition.getDisplayOffsets(getWidth(), getHeight());
+ for (int tileX = tileIndices[0]; tileX <= tileIndices[1] && !loadingFailed; tileX++)
- int y = (tileY - tileIndices[2]) * 256 - pixelOffsets[1];
- Image image = _tileCacher.getTile(tileX, tileY);
- if (image != null) {
- g.drawImage(image, x, y, 256, 256, null);
+ int x = (tileX - tileIndices[0]) * 256 - pixelOffsets[0];
+ for (int tileY = tileIndices[2]; tileY <= tileIndices[3]; tileY++)
+ {
+ int y = (tileY - tileIndices[2]) * 256 - pixelOffsets[1];
+ Image image = _tileCacher.getTile(tileX, tileY);
+ if (image != null) {
+ g.drawImage(image, x, y, 256, 256, null);
+ }
- // Make maps brighter / fainter
- float[] scaleFactors = {1.0f, 1.05f, 1.1f, 1.2f, 1.6f, 2.0f};
- float scaleFactor = scaleFactors[_transparencySlider.getValue()];
- if (scaleFactor > 1.0f) {
- RenderingHints hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
- hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
- RescaleOp op = new RescaleOp(scaleFactor, 0, hints);
- op.filter(_mapImage, _mapImage);
+ // Make maps brighter / fainter
+ float[] scaleFactors = {1.0f, 1.05f, 1.1f, 1.2f, 1.6f, 2.0f};
+ float scaleFactor = scaleFactors[_transparencySlider.getValue()];
+ if (scaleFactor > 1.0f) {
+ RenderingHints hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
+ hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
+ RescaleOp op = new RescaleOp(scaleFactor, 0, hints);
+ op.filter(_mapImage, _mapImage);
+ }
+ // Paint the track points on top
+ int pointsPainted = 1;
+ try
+ {
+ pointsPainted = paintPoints(g);
+ }
+ catch (NullPointerException npe) { // ignore, probably due to data being changed during drawing
+ }
+
+ // free g
+ g.dispose();
+
+ _recalculate = false;
+ // Zoom to fit if no points found
+ if (pointsPainted <= 0 && _checkBounds) {
+ zoomToFit();
+ _recalculate = true;
+ repaint();
+ }
+ _checkBounds = false;
+ // enable / disable transparency slider
+ _transparencySlider.setEnabled(_mapCheckBox.isSelected());
+ }
+
+
+ /**
+ * Paint the points using the given graphics object
+ * @param inG Graphics object to use for painting
+ * @return number of points painted, if any
+ */
+ private int paintPoints(Graphics inG)
+ {
int prevX = -1, prevY = -1;
boolean connectPoints = _connectCheckBox.isSelected();
int prevX = -1, prevY = -1;
boolean connectPoints = _connectCheckBox.isSelected();
- int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getXNew(i));
- int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getYNew(i));
- if (px >= 0 && px < getWidth() && py >= 0 && py < getHeight())
+ int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getX(i));
+ int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getY(i));
+ currPointVisible = px >= 0 && px < getWidth() && py >= 0 && py < getHeight();
+ if (currPointVisible)
- g.drawRect(px-2, py-2, 3, 3);
- // Connect track points
- if (connectPoints && prevX != -1 && prevY != -1 && !_track.getPoint(i).getSegmentStart()) {
- g.drawLine(prevX, prevY, px, py);
+ // Draw rectangle for track point
+ if (_track.getPoint(i).getDeleteFlag()) {
+ inG.setColor(COLOR_POINT_DELETED);
- else {
- prevX = -1; prevY = -1;
+ if (!_track.getPoint(i).isWaypoint())
+ {
+ // Connect track points if either of them are visible
+ if (connectPoints && (currPointVisible || prevPointVisible)
+ && !(prevX == -1 && prevY == -1)
+ && !_track.getPoint(i).getSegmentStart())
+ {
+ inG.drawLine(prevX, prevY, px, py);
+ }
+ prevX = px; prevY = py;
- int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getXNew(i));
- int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getYNew(i));
+ int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getX(i));
+ int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getY(i));
- g.fillRect(px-3, py-3, 6, 6);
+ inG.fillRect(px-3, py-3, 6, 6);
- int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getXNew(i));
- int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getYNew(i));
+ int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getX(i));
+ int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getY(i));
if (px >= 0 && px < getWidth() && py >= 0 && py < getHeight())
{
// Figure out where to draw waypoint name so it doesn't obscure track
if (px >= 0 && px < getWidth() && py >= 0 && py < getHeight())
{
// Figure out where to draw waypoint name so it doesn't obscure track
&& !overlapsPoints(nameXs[a], nameYs[a], nameWidth, nameHeight))
{
// Found a rectangle to fit - draw name here and quit
&& !overlapsPoints(nameXs[a], nameYs[a], nameWidth, nameHeight))
{
// Found a rectangle to fit - draw name here and quit
- int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getXNew(i));
- int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getYNew(i));
+ int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getX(i));
+ int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getY(i));
- g.drawRect(px-1, py-1, 2, 2);
- g.drawRect(px-2, py-2, 4, 4);
+ inG.drawRect(px-1, py-1, 2, 2);
+ inG.drawRect(px-2, py-2, 4, 4);
- int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getXNew(i));
- int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getYNew(i));
- g.drawRect(px-1, py-1, 2, 2);
+ int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getX(i));
+ int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getY(i));
+ inG.drawRect(px-1, py-1, 2, 2);
- int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getXNew(selectedPoint));
- int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getYNew(selectedPoint));
- g.setColor(COLOR_CROSSHAIRS);
+ int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getX(selectedPoint));
+ int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getY(selectedPoint));
+ inG.setColor(COLOR_CROSSHAIRS);
- g.drawLine(px, 0, px, getHeight());
- g.drawLine(0, py, getWidth(), py);
+ inG.drawLine(px, 0, px, getHeight());
+ inG.drawLine(0, py, getWidth(), py);
- g.drawOval(px - 2, py - 2, 4, 4);
- g.drawOval(px - 3, py - 3, 6, 6);
- }
-
- // free g
- g.dispose();
-
- _recalculate = false;
- // Zoom to fit if no points found
- if (pointsPainted <= 0 && _checkBounds) {
- zoomToFit();
- _recalculate = true;
- repaint();
+ inG.drawOval(px - 2, py - 2, 4, 4);
+ inG.drawOval(px - 3, py - 3, 6, 6);
*/
public synchronized void tilesUpdated(boolean inIsOk)
{
// Show message if loading failed (but not too many times)
*/
public synchronized void tilesUpdated(boolean inIsOk)
{
// Show message if loading failed (but not too many times)
{
_shownOsmErrorAlready = true;
// use separate thread to show message about failing to load osm images
new Thread(new Runnable() {
public void run() {
try {Thread.sleep(500);} catch (InterruptedException ie) {}
{
_shownOsmErrorAlready = true;
// use separate thread to show message about failing to load osm images
new Thread(new Runnable() {
public void run() {
try {Thread.sleep(500);} catch (InterruptedException ie) {}
- JOptionPane.showMessageDialog(MapCanvas.this,
- I18nManager.getText("error.osmimage.failed"),
- I18nManager.getText("error.osmimage.dialogtitle"),
- JOptionPane.ERROR_MESSAGE);
+ _app.showErrorMessage("error.osmimage.dialogtitle", "error.osmimage.failed");
_mapPosition.getXFromPixels(inE.getX(), getWidth()),
_mapPosition.getYFromPixels(inE.getY(), getHeight()),
_mapPosition.getBoundsFromPixels(CLICK_SENSITIVITY), false);
_mapPosition.getXFromPixels(inE.getX(), getWidth()),
_mapPosition.getYFromPixels(inE.getY(), getHeight()),
_mapPosition.getBoundsFromPixels(CLICK_SENSITIVITY), false);