/******************************************************************************* * Copyright (c) 2008, 2012 Stepan Rutz. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Stepan Rutz - initial implementation *******************************************************************************/ package org.eclipse.nebula.widgets.geomap.internal.geomapbrowser; import java.text.NumberFormat; import java.util.logging.Logger; import org.eclipse.nebula.widgets.geomap.GeoMap; import org.eclipse.nebula.widgets.geomap.GeoMapUtil; import org.eclipse.nebula.widgets.geomap.internal.InternalGeoMapListener; import org.eclipse.nebula.widgets.geomap.internal.TileRef; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; /** * @author stepan.rutz@gmx.de * @version $Revision$ */ public class InfoPage extends AbstractPage implements Page, InternalGeoMapListener { private static final Logger log = Logger.getLogger(InfoPage.class.getName()); private abstract class Spec { final String key; final GeoMap geoMap; abstract String computeValue(); Spec(String key) { this.key = key; this.geoMap = mapBrowser.getGeoMap(); } } private final GeoMapBrowser mapBrowser; private Table table; private Spec[] specs; public InfoPage(GeoMapBrowser mapBrowser) { this.mapBrowser = mapBrowser; specs = new Spec[] { new Spec("Zoom") { public String computeValue() { return Integer.toString(geoMap.getZoom()); }}, new Spec("Map Size") { public String computeValue() { Point size = geoMap.getSize(); return size.x + ", " + size.y; }}, new Spec("Map Position") { public String computeValue() { Point position = geoMap.getMapPosition(); return position.x + ", " + position.y; }}, new Spec("Center Position") { public String computeValue() { Point position = geoMap.getCenterPosition(); return position.x + ", " + position.y; }}, new Spec("Paint time") { public String computeValue() { return controlPaintTime + " ms"; }}, new Spec("Number painted tiles") { public String computeValue() { return tilePaintCount + " of " + NumberFormat.getIntegerInstance().format((long) (1 << geoMap.getZoom()) * (1 << geoMap.getZoom())); } }, new Spec("Tile cache usage") { public String computeValue() { return String.format("Usage: %3d / %3d ", tileCacheUsed, tileCacheSize); } }, new Spec("Longitude/Latitude") { public String computeValue() { Point p = geoMap.getCursorPosition(); int zoom = geoMap.getZoom(); return format(GeoMapUtil.position2lon(p.x, zoom)) + ", " + format(GeoMapUtil.position2lat(p.y, zoom)); } }, }; } private static String format(double d) { return String.format("%.5f", d); } public void updateInfos() { if (table == null) return; for (int i = 0; i < specs.length; ++i) { Spec spec = specs[i]; TableItem item = table.getItem(i); item.setText(1, spec.computeValue()); } } protected void initContent(final PageContainer container, Composite composite) { mapBrowser.getGeoMap().addInternalGeoMapListener(this); addHeaderRow(container, composite, "Actions"); addActionLink(container, composite, "<a>Back to main menu</a>", new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { container.showPage(0); } }); addHeaderRow(container, composite, "Infos"); addInfoText(container, composite, "The following search results were retrieved from openstreetmap.org. " + "Double-click to open a location."); table = new Table(composite, SWT.FULL_SELECTION | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); table.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true, 2 , 1)); table.setHeaderVisible(true); table.setLinesVisible(true); TableColumn column1 = new TableColumn(table, SWT.NONE); column1.setText("Place"); column1.setWidth(120); TableColumn column2 = new TableColumn(table, SWT.NONE); column2.setText("Place"); column2.setWidth(160); for (Spec spec : specs) { TableItem item = new TableItem(table, SWT.NONE); item.setText(0, spec.key); } addHeaderRow(container, composite, "Authors Remarks"); addInfoText(container, composite, "The number of image fetcher threads determines how many background tasks are " + "run simultaneously to fetch tiles. The search is also performed in the background. " + "The tilecache fill never drops below its maximum size once its filled, but the eldest " + "entries are discarded on a LRU (Least-Recently-Used) basis."); addInfoText(container, composite, "The MapWidget can be used without all of this quite useless showcase application. Its " + "main purpose is to showcase the MapWidget."); addHeaderRow(container, composite, "Quick Help"); addInfoText(container, composite, "Use the mouse wheel to zoom in and zoom out. Drag the mouse to change " + "your position on the map"); updateInfos(); } protected void widgetDisposed(DisposeEvent e) { mapBrowser.getGeoMap().removeInternalGeoMapListener(this); } /* (non-Javadoc) * @see org.eclipse.nebula.widgets.geomap.internal.InternalGeoMapListener#tilePainted(org.eclipse.nebula.widgets.geomap.internal.TileRef) */ public void tilePainted(TileRef tileRef) { // ignore } private int tilePaintCount; private long controlPaintTime; /* (non-Javadoc) * @see org.eclipse.nebula.widgets.geomap.internal.InternalGeoMapListener#controlPainted(int, long) */ public void mapPainted(int tileCount, long time) { tilePaintCount = tileCount; controlPaintTime = time; } private int tileCacheUsed, tileCacheSize; /* (non-Javadoc) * @see org.eclipse.nebula.widgets.geomap.internal.InternalGeoMapListener#tileCacheUpdated(int, int) */ public void tileCacheUpdated(int used, int size) { tileCacheUsed = used; tileCacheSize = size; } }