/*******************************************************************************
* 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.util.logging.Logger;
import org.eclipse.nebula.widgets.geomap.GeoMap;
import org.eclipse.nebula.widgets.geomap.GeoMapUtil;
import org.eclipse.nebula.widgets.geomap.PointD;
import org.eclipse.nebula.widgets.geomap.internal.geomapbrowser.SearchPage.SearchResult;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
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.Event;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Listener;
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 ResultsPage extends AbstractPage implements Page {
private static final Logger log = Logger.getLogger(ResultsPage.class.getName());
private final GeoMapBrowser mapBrowser;
private Table table;
private String search = "";
private SearchResult[] results = new SearchResult[0];
private ScrolledComposite sc;
private Link descriptionText;
public ResultsPage(GeoMapBrowser mapBrowser) {
this.mapBrowser = mapBrowser;
}
public String getSearch() {
return search;
}
public void setSearch(String search) {
this.search = search;
}
public SearchResult[] getResults() {
return results.clone();
}
public void setResults(SearchResult[] results) {
this.results = results.clone();
table.removeAll();
for (SearchResult result : results) {
String shortName = result.getName();
shortName = shortName.replaceAll("\\s(.*)$", "");
String linkBody = shortName;
if (result.getType() != null && result.getType().length() > 0)
linkBody += " [" + result.getType() + "]";
TableItem item = new TableItem(table, SWT.NONE);
item.setText(0, linkBody);
}
}
protected void initContent(final PageContainer container, Composite composite) {
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, "Results");
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(260);
addHeaderRow(container, composite, "Description");
descriptionText = addInfoText(container, composite, "");
GridData layoutData = (GridData) descriptionText.getLayoutData();
layoutData.minimumHeight = 100;
layoutData.grabExcessVerticalSpace = false;
layoutData.heightHint = 160;
table.addListener (SWT.Selection, new Listener () {
public void handleEvent (Event event) {
if (event.detail == SWT.CHECK)
return;
TableItem item = (TableItem) event.item;
int index = table.indexOf(item);
if (index >= 0 && index < results.length) {
SearchResult result = results[index];
String name = result.getName();
name = name.replaceAll("\\[.*?\\]", "");
name = name.replaceAll("<.*?>", "");
if (result.getCategory() != null)
name += " " + result.getCategory();
descriptionText.setText(name);
descriptionText.getParent().layout();
}
}
});
table.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent e) {
Point point = new Point(e.x, e.y);
TableItem item = table.getItem(point);
if (item == null)
return;
int index = table.indexOf(item);
if (index >= 0 && index < results.length) {
SearchResult result = results[index];
GeoMap geoMap = mapBrowser.getGeoMap();
//geoMap.setZoom(result.getZoom() < 1 || result.getZoom() > mapWidget.getTileServer().getMaxZoom() ? 8 : result.getZoom());
Point position = GeoMapUtil.computePosition(new PointD(result.getLon(), result.getLat()), geoMap.getZoom());
geoMap.setCenterPosition(position);
geoMap.redraw();
}
}
});
}
protected void widgetDisposed(DisposeEvent e) {
}
}