kopia lustrzana https://github.com/JOSM/MapWithAI
Initial implementation for setting sources in download
* Add checkbox to main UI download panel * For more information, see JOSM-18340 * There have been some modifications so that both JOSM UI panel download methods use the same class to download. * Reuse panel from preferences for setting sources Signed-off-by: Taylor Smock <taylor.smock@kaart.com>pull/1/head
rodzic
94414ea1b6
commit
d7fe108f1f
|
@ -23,6 +23,7 @@ import org.openstreetmap.josm.gui.MainApplication;
|
||||||
import org.openstreetmap.josm.gui.MainMenu;
|
import org.openstreetmap.josm.gui.MainMenu;
|
||||||
import org.openstreetmap.josm.gui.MapFrame;
|
import org.openstreetmap.josm.gui.MapFrame;
|
||||||
import org.openstreetmap.josm.gui.download.DownloadDialog;
|
import org.openstreetmap.josm.gui.download.DownloadDialog;
|
||||||
|
import org.openstreetmap.josm.gui.download.OSMDownloadSource;
|
||||||
import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
|
import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
|
||||||
import org.openstreetmap.josm.io.remotecontrol.RequestProcessor;
|
import org.openstreetmap.josm.io.remotecontrol.RequestProcessor;
|
||||||
import org.openstreetmap.josm.plugins.Plugin;
|
import org.openstreetmap.josm.plugins.Plugin;
|
||||||
|
@ -41,7 +42,9 @@ import org.openstreetmap.josm.plugins.mapwithai.data.validation.tests.RoutingIsl
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.data.validation.tests.StreetAddressOrder;
|
import org.openstreetmap.josm.plugins.mapwithai.data.validation.tests.StreetAddressOrder;
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.data.validation.tests.StreetAddressTest;
|
import org.openstreetmap.josm.plugins.mapwithai.data.validation.tests.StreetAddressTest;
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.data.validation.tests.StubEndsTest;
|
import org.openstreetmap.josm.plugins.mapwithai.data.validation.tests.StubEndsTest;
|
||||||
|
import org.openstreetmap.josm.plugins.mapwithai.gui.download.MapWithAIDownloadOptions;
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.gui.download.MapWithAIDownloadReader;
|
import org.openstreetmap.josm.plugins.mapwithai.gui.download.MapWithAIDownloadReader;
|
||||||
|
import org.openstreetmap.josm.plugins.mapwithai.gui.download.MapWithAIDownloadSourceType;
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.gui.preferences.MapWithAIPreferences;
|
import org.openstreetmap.josm.plugins.mapwithai.gui.preferences.MapWithAIPreferences;
|
||||||
import org.openstreetmap.josm.spi.preferences.Config;
|
import org.openstreetmap.josm.spi.preferences.Config;
|
||||||
import org.openstreetmap.josm.tools.Destroyable;
|
import org.openstreetmap.josm.tools.Destroyable;
|
||||||
|
@ -101,14 +104,19 @@ public final class MapWithAIPlugin extends Plugin implements Destroyable {
|
||||||
|
|
||||||
MapWithAIDataUtils.addMapWithAIPaintStyles();
|
MapWithAIDataUtils.addMapWithAIPaintStyles();
|
||||||
|
|
||||||
|
destroyables = new ArrayList<>();
|
||||||
|
MapWithAIDownloadOptions mapWithAIDownloadOptions = new MapWithAIDownloadOptions();
|
||||||
|
mapWithAIDownloadOptions.addGui(DownloadDialog.getInstance());
|
||||||
|
destroyables.add(mapWithAIDownloadOptions);
|
||||||
|
|
||||||
setVersionInfo(info.localversion);
|
setVersionInfo(info.localversion);
|
||||||
RequestProcessor.addRequestHandlerClass("mapwithai", MapWithAIRemoteControl.class);
|
RequestProcessor.addRequestHandlerClass("mapwithai", MapWithAIRemoteControl.class);
|
||||||
new MapWithAIRemoteControl(); // instantiate to get action into Remote Control Preferences
|
new MapWithAIRemoteControl(); // instantiate to get action into Remote Control Preferences
|
||||||
destroyables = new ArrayList<>();
|
|
||||||
destroyables.add(new MapWithAIUploadHook(info));
|
destroyables.add(new MapWithAIUploadHook(info));
|
||||||
mapFrameInitialized(null, MainApplication.getMap());
|
mapFrameInitialized(null, MainApplication.getMap());
|
||||||
mapWithAIDownloadReader = new MapWithAIDownloadReader();
|
mapWithAIDownloadReader = new MapWithAIDownloadReader();
|
||||||
DownloadDialog.addDownloadSource(mapWithAIDownloadReader);
|
DownloadDialog.addDownloadSource(mapWithAIDownloadReader);
|
||||||
|
OSMDownloadSource.addDownloadType(new MapWithAIDownloadSourceType());
|
||||||
MainApplication.worker.execute(() -> UpdateProd.doProd(info.mainversion));
|
MainApplication.worker.execute(() -> UpdateProd.doProd(info.mainversion));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,6 +179,7 @@ public final class MapWithAIPlugin extends Plugin implements Destroyable {
|
||||||
|
|
||||||
destroyables.forEach(Destroyable::destroy);
|
destroyables.forEach(Destroyable::destroy);
|
||||||
DownloadDialog.removeDownloadSource(mapWithAIDownloadReader);
|
DownloadDialog.removeDownloadSource(mapWithAIDownloadReader);
|
||||||
|
OSMDownloadSource.removeDownloadType(OSMDownloadSource.getDownloadType(MapWithAIDownloadSourceType.class));
|
||||||
VALIDATORS.forEach(OsmValidator::removeTest);
|
VALIDATORS.forEach(OsmValidator::removeTest);
|
||||||
DownloadListener.destroyAll();
|
DownloadListener.destroyAll();
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,28 +3,41 @@ package org.openstreetmap.josm.plugins.mapwithai.backend;
|
||||||
|
|
||||||
import static org.openstreetmap.josm.tools.I18n.tr;
|
import static org.openstreetmap.josm.tools.I18n.tr;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
|
import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
|
||||||
import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
|
import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
|
||||||
import org.openstreetmap.josm.data.Bounds;
|
import org.openstreetmap.josm.data.Bounds;
|
||||||
import org.openstreetmap.josm.data.ViewportData;
|
import org.openstreetmap.josm.data.osm.DataSet;
|
||||||
import org.openstreetmap.josm.data.osm.OsmPrimitive;
|
|
||||||
import org.openstreetmap.josm.gui.MainApplication;
|
import org.openstreetmap.josm.gui.MainApplication;
|
||||||
import org.openstreetmap.josm.gui.MapFrame;
|
import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
|
||||||
import org.openstreetmap.josm.gui.io.UpdatePrimitivesTask;
|
|
||||||
import org.openstreetmap.josm.gui.progress.ProgressMonitor;
|
import org.openstreetmap.josm.gui.progress.ProgressMonitor;
|
||||||
import org.openstreetmap.josm.io.OsmServerReader;
|
import org.openstreetmap.josm.io.OsmServerReader;
|
||||||
|
import org.openstreetmap.josm.io.OsmTransferException;
|
||||||
|
import org.openstreetmap.josm.plugins.mapwithai.data.mapwithai.MapWithAIInfo;
|
||||||
|
import org.openstreetmap.josm.plugins.mapwithai.data.mapwithai.MapWithAILayerInfo;
|
||||||
import org.openstreetmap.josm.tools.Utils;
|
import org.openstreetmap.josm.tools.Utils;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
public class DownloadMapWithAITask extends DownloadOsmTask {
|
public class DownloadMapWithAITask extends DownloadOsmTask {
|
||||||
|
private List<MapWithAIInfo> urls;
|
||||||
|
|
||||||
|
public DownloadMapWithAITask() {
|
||||||
|
urls = MapWithAILayerInfo.getInstance().getLayers();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Future<?> download(OsmServerReader reader, DownloadParams settings, Bounds downloadArea,
|
public Future<?> download(OsmServerReader reader, DownloadParams settings, Bounds downloadArea,
|
||||||
ProgressMonitor progressMonitor) {
|
ProgressMonitor progressMonitor) {
|
||||||
return download(new MapWithAIDownloadTask(settings, reader, progressMonitor, zoomAfterDownload), downloadArea);
|
DownloadTask task = new DownloadTask(settings, tr("MapWithAI Download"), progressMonitor, false, false,
|
||||||
|
downloadArea);
|
||||||
|
return MainApplication.worker.submit(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -41,49 +54,58 @@ public class DownloadMapWithAITask extends DownloadOsmTask {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected class MapWithAIDownloadTask extends DownloadOsmTask.DownloadTask {
|
protected class DownloadTask extends AbstractInternalTask {
|
||||||
|
BoundingBoxMapWithAIDownloader downloader;
|
||||||
|
final Bounds bounds;
|
||||||
|
|
||||||
/**
|
public DownloadTask(DownloadParams settings, String title, boolean ignoreException, boolean zoomAfterDownload,
|
||||||
* Constructs a new {@code DownloadTask}.
|
Bounds bounds) {
|
||||||
*
|
this(settings, title, NullProgressMonitor.INSTANCE, ignoreException, zoomAfterDownload, bounds);
|
||||||
* @param settings download settings
|
|
||||||
* @param reader OSM data reader
|
|
||||||
* @param progressMonitor progress monitor
|
|
||||||
*/
|
|
||||||
public MapWithAIDownloadTask(DownloadParams settings, OsmServerReader reader, ProgressMonitor progressMonitor) {
|
|
||||||
this(settings, reader, progressMonitor, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public DownloadTask(DownloadParams settings, String title, ProgressMonitor progressMonitor,
|
||||||
* Constructs a new {@code DownloadTask}.
|
boolean ignoreException, boolean zoomAfterDownload, Bounds bounds) {
|
||||||
*
|
super(settings, title, progressMonitor, ignoreException, zoomAfterDownload);
|
||||||
* @param settings download settings
|
this.bounds = bounds;
|
||||||
* @param reader OSM data reader
|
|
||||||
* @param progressMonitor progress monitor
|
|
||||||
* @param zoomAfterDownload If true, the map view will zoom to download area
|
|
||||||
* after download
|
|
||||||
*/
|
|
||||||
public MapWithAIDownloadTask(DownloadParams settings, OsmServerReader reader, ProgressMonitor progressMonitor,
|
|
||||||
boolean zoomAfterDownload) {
|
|
||||||
super(settings, reader, progressMonitor, zoomAfterDownload);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void loadData(String newLayerName, Bounds bounds) {
|
protected void cancel() {
|
||||||
MapWithAILayer layer = MapWithAIDataUtils.getLayer(true);
|
setCanceled(true);
|
||||||
Collection<OsmPrimitive> primitivesToUpdate = searchPrimitivesToUpdate(bounds, layer.getDataSet());
|
if (downloader != null) {
|
||||||
layer.mergeFrom(dataSet);
|
downloader.cancel();
|
||||||
MapFrame map = MainApplication.getMap();
|
|
||||||
if (map != null && (zoomAfterDownload
|
|
||||||
|| MainApplication.getLayerManager().getLayers().parallelStream().allMatch(layer::equals))) {
|
|
||||||
computeBbox(bounds).map(ViewportData::new).ifPresent(map.mapView::zoomTo);
|
|
||||||
}
|
}
|
||||||
if (!primitivesToUpdate.isEmpty()) {
|
}
|
||||||
MainApplication.worker.execute(new UpdatePrimitivesTask(layer, primitivesToUpdate));
|
|
||||||
|
@Override
|
||||||
|
protected void realRun() throws SAXException, IOException, OsmTransferException {
|
||||||
|
Collection<MapWithAIInfo> relevantUrls = urls.stream()
|
||||||
|
.filter(i -> i.getBounds() == null || i.getBounds().intersects(bounds))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
ProgressMonitor monitor = getProgressMonitor();
|
||||||
|
if (relevantUrls.size() < 5) {
|
||||||
|
monitor.indeterminateSubTask(tr("MapWithAI Download"));
|
||||||
|
} else {
|
||||||
|
monitor.setTicksCount(relevantUrls.size());
|
||||||
|
}
|
||||||
|
for (MapWithAIInfo info : relevantUrls) {
|
||||||
|
if (isCanceled()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
downloader = new BoundingBoxMapWithAIDownloader(bounds, info, false);
|
||||||
|
DataSet ds = downloader.parseOsm(monitor.createSubTaskMonitor(1, true));
|
||||||
|
synchronized (DownloadMapWithAITask.DownloadTask.class) {
|
||||||
|
MapWithAIDataUtils.getLayer(true).getDataSet().mergeFrom(ds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finish() {
|
||||||
|
if (!isCanceled() && !isFailed()) {
|
||||||
|
GetDataRunnable.cleanup(MapWithAIDataUtils.getLayer(true).getDataSet(), null);
|
||||||
}
|
}
|
||||||
layer.onPostDownloadFromServer(bounds);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,10 @@ public class MapWithAILayerInfo {
|
||||||
/** Unique instance -- MUST be after DEFAULT_LAYER_SITES */
|
/** Unique instance -- MUST be after DEFAULT_LAYER_SITES */
|
||||||
public static final MapWithAILayerInfo instance = new MapWithAILayerInfo();
|
public static final MapWithAILayerInfo instance = new MapWithAILayerInfo();
|
||||||
|
|
||||||
|
public static MapWithAILayerInfo getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the list of source layers sites.
|
* Returns the list of source layers sites.
|
||||||
*
|
*
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
// License: GPL. For details, see LICENSE file.
|
||||||
|
package org.openstreetmap.josm.plugins.mapwithai.gui.download;
|
||||||
|
|
||||||
|
import static org.openstreetmap.josm.tools.I18n.tr;
|
||||||
|
|
||||||
|
import java.awt.GridBagLayout;
|
||||||
|
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
|
||||||
|
import org.openstreetmap.josm.data.Bounds;
|
||||||
|
import org.openstreetmap.josm.gui.bbox.JosmMapViewer;
|
||||||
|
import org.openstreetmap.josm.gui.download.DownloadDialog;
|
||||||
|
import org.openstreetmap.josm.gui.download.DownloadSelection;
|
||||||
|
import org.openstreetmap.josm.plugins.mapwithai.data.mapwithai.MapWithAILayerInfo;
|
||||||
|
import org.openstreetmap.josm.plugins.mapwithai.gui.preferences.mapwithai.MapWithAIProvidersPanel;
|
||||||
|
import org.openstreetmap.josm.tools.Destroyable;
|
||||||
|
import org.openstreetmap.josm.tools.GBC;
|
||||||
|
|
||||||
|
public class MapWithAIDownloadOptions extends JPanel implements DownloadSelection, Destroyable {
|
||||||
|
private final JPanel optionPanel;
|
||||||
|
private DownloadDialog iGui;
|
||||||
|
private JosmMapViewer defaultMap;
|
||||||
|
private MapWithAIProvidersPanel mapwithaiProvidersPanel;
|
||||||
|
|
||||||
|
public MapWithAIDownloadOptions() {
|
||||||
|
optionPanel = new JPanel(new GridBagLayout());
|
||||||
|
JPanel favorites = new JPanel();
|
||||||
|
favorites.add(new JLabel("TODO: Favorites go here!")); // TODO
|
||||||
|
optionPanel.add(favorites, GBC.eol().fill(GBC.HORIZONTAL).anchor(GBC.NORTH));
|
||||||
|
mapwithaiProvidersPanel = new MapWithAIProvidersPanel(this, MapWithAILayerInfo.getInstance());
|
||||||
|
optionPanel.add(mapwithaiProvidersPanel);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addGui(DownloadDialog gui) {
|
||||||
|
iGui = gui;
|
||||||
|
iGui.addDownloadAreaSelector(optionPanel, tr("Browse Data Sources"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setDownloadArea(Bounds area) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void destroy() {
|
||||||
|
if (this.iGui != null) {
|
||||||
|
this.iGui.remove(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -10,7 +10,6 @@ import java.awt.GridBagConstraints;
|
||||||
import java.awt.GridBagLayout;
|
import java.awt.GridBagLayout;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.Future;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
import javax.swing.Icon;
|
import javax.swing.Icon;
|
||||||
|
@ -18,17 +17,13 @@ import javax.swing.JLabel;
|
||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
|
|
||||||
import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
|
import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
|
||||||
import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
|
|
||||||
import org.openstreetmap.josm.data.Bounds;
|
import org.openstreetmap.josm.data.Bounds;
|
||||||
import org.openstreetmap.josm.data.coor.LatLon;
|
import org.openstreetmap.josm.data.coor.LatLon;
|
||||||
import org.openstreetmap.josm.gui.MainApplication;
|
|
||||||
import org.openstreetmap.josm.gui.download.AbstractDownloadSourcePanel;
|
import org.openstreetmap.josm.gui.download.AbstractDownloadSourcePanel;
|
||||||
import org.openstreetmap.josm.gui.download.DownloadDialog;
|
import org.openstreetmap.josm.gui.download.DownloadDialog;
|
||||||
import org.openstreetmap.josm.gui.download.DownloadSettings;
|
import org.openstreetmap.josm.gui.download.DownloadSettings;
|
||||||
import org.openstreetmap.josm.gui.download.DownloadSource;
|
import org.openstreetmap.josm.gui.download.DownloadSource;
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.MapWithAIPlugin;
|
import org.openstreetmap.josm.plugins.mapwithai.MapWithAIPlugin;
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.backend.BoundingBoxMapWithAIDownloader;
|
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.backend.DetectTaskingManagerUtils;
|
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.backend.DownloadMapWithAITask;
|
import org.openstreetmap.josm.plugins.mapwithai.backend.DownloadMapWithAITask;
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.backend.MapWithAIDataUtils;
|
import org.openstreetmap.josm.plugins.mapwithai.backend.MapWithAIDataUtils;
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.backend.MapWithAIPreferenceHelper;
|
import org.openstreetmap.josm.plugins.mapwithai.backend.MapWithAIPreferenceHelper;
|
||||||
|
@ -48,12 +43,9 @@ public class MapWithAIDownloadReader implements DownloadSource<MapWithAIDownload
|
||||||
Bounds area = settings.getDownloadBounds().orElse(new Bounds(0, 0, 0, 0));
|
Bounds area = settings.getDownloadBounds().orElse(new Bounds(0, 0, 0, 0));
|
||||||
DownloadMapWithAITask task = new DownloadMapWithAITask();
|
DownloadMapWithAITask task = new DownloadMapWithAITask();
|
||||||
task.setZoomAfterDownload(settings.zoomToData());
|
task.setZoomAfterDownload(settings.zoomToData());
|
||||||
data.getUrls().stream().filter(i -> i.getBounds() == null || i.getBounds().intersects(area)).forEach(url -> {
|
DownloadParams params = new DownloadParams();
|
||||||
Future<?> future = task.download(
|
params.withNewLayer(settings.asNewLayer());
|
||||||
new BoundingBoxMapWithAIDownloader(area, url, DetectTaskingManagerUtils.hasTaskingManagerLayer()),
|
task.download(params, area, null);
|
||||||
new DownloadParams(), area, null);
|
|
||||||
MainApplication.worker.execute(new PostDownloadHandler(task, future, data.getErrorReporter()));
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -151,12 +143,24 @@ public class MapWithAIDownloadReader implements DownloadSource<MapWithAIDownload
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
double width = Math.max(bbox.getMin().greatCircleDistance(new LatLon(bbox.getMinLat(), bbox.getMaxLon())),
|
displaySizeCheckResult(isDownloadAreaTooLarge(bbox));
|
||||||
bbox.getMax().greatCircleDistance(new LatLon(bbox.getMaxLat(), bbox.getMinLon())));
|
}
|
||||||
double height = Math.max(bbox.getMin().greatCircleDistance(new LatLon(bbox.getMaxLat(), bbox.getMinLon())),
|
|
||||||
bbox.getMax().greatCircleDistance(new LatLon(bbox.getMinLat(), bbox.getMaxLon())));
|
/**
|
||||||
displaySizeCheckResult(height > MapWithAIDataUtils.MAXIMUM_SIDE_DIMENSIONS
|
* Check if the download area is too large
|
||||||
|| width > MapWithAIDataUtils.MAXIMUM_SIDE_DIMENSIONS);
|
*
|
||||||
|
* @param bound The bound to check
|
||||||
|
* @return {@code true} if the area is too large
|
||||||
|
*/
|
||||||
|
public static boolean isDownloadAreaTooLarge(Bounds bound) {
|
||||||
|
double width = Math.max(
|
||||||
|
bound.getMin().greatCircleDistance(new LatLon(bound.getMinLat(), bound.getMaxLon())),
|
||||||
|
bound.getMax().greatCircleDistance(new LatLon(bound.getMaxLat(), bound.getMinLon())));
|
||||||
|
double height = Math.max(
|
||||||
|
bound.getMin().greatCircleDistance(new LatLon(bound.getMaxLat(), bound.getMinLon())),
|
||||||
|
bound.getMax().greatCircleDistance(new LatLon(bound.getMinLat(), bound.getMaxLon())));
|
||||||
|
return height > MapWithAIDataUtils.MAXIMUM_SIDE_DIMENSIONS
|
||||||
|
|| width > MapWithAIDataUtils.MAXIMUM_SIDE_DIMENSIONS;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void displaySizeCheckResult(boolean isAreaTooLarge) {
|
private void displaySizeCheckResult(boolean isAreaTooLarge) {
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
// License: GPL. For details, see LICENSE file.
|
||||||
|
package org.openstreetmap.josm.plugins.mapwithai.gui.download;
|
||||||
|
|
||||||
|
import static org.openstreetmap.josm.tools.I18n.tr;
|
||||||
|
|
||||||
|
import javax.swing.JCheckBox;
|
||||||
|
import javax.swing.event.ChangeListener;
|
||||||
|
|
||||||
|
import org.openstreetmap.josm.actions.downloadtasks.AbstractDownloadTask;
|
||||||
|
import org.openstreetmap.josm.data.Bounds;
|
||||||
|
import org.openstreetmap.josm.data.preferences.BooleanProperty;
|
||||||
|
import org.openstreetmap.josm.gui.download.IDownloadSourceType;
|
||||||
|
import org.openstreetmap.josm.plugins.mapwithai.backend.DownloadMapWithAITask;
|
||||||
|
|
||||||
|
public class MapWithAIDownloadSourceType implements IDownloadSourceType {
|
||||||
|
static final BooleanProperty IS_ENABLED = new BooleanProperty("download.mapwithai.data", false);
|
||||||
|
JCheckBox cbDownloadMapWithAIData;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JCheckBox getCheckBox(ChangeListener checkboxChangeListener) {
|
||||||
|
if (cbDownloadMapWithAIData == null) {
|
||||||
|
cbDownloadMapWithAIData = new JCheckBox(tr("MapWithAI data"), true);
|
||||||
|
cbDownloadMapWithAIData
|
||||||
|
.setToolTipText(tr("Select to download MapWithAI data in the selected download area."));
|
||||||
|
cbDownloadMapWithAIData.getModel().addChangeListener(checkboxChangeListener);
|
||||||
|
}
|
||||||
|
if (checkboxChangeListener != null) {
|
||||||
|
cbDownloadMapWithAIData.getModel().addChangeListener(checkboxChangeListener);
|
||||||
|
}
|
||||||
|
return cbDownloadMapWithAIData;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<? extends AbstractDownloadTask<?>> getDownloadClass() {
|
||||||
|
return DownloadMapWithAITask.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BooleanProperty getBooleanProperty() {
|
||||||
|
return IS_ENABLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isDownloadAreaTooLarge(Bounds bound) {
|
||||||
|
return MapWithAIDownloadReader.MapWithAIDownloadPanel.isDownloadAreaTooLarge(bound);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -29,6 +29,7 @@ import java.util.function.Function;
|
||||||
import javax.swing.AbstractAction;
|
import javax.swing.AbstractAction;
|
||||||
import javax.swing.Box;
|
import javax.swing.Box;
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
|
import javax.swing.JComponent;
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
@ -107,7 +108,7 @@ public class MapWithAIProvidersPanel extends JPanel {
|
||||||
public final JToolBar defaultToolbar;
|
public final JToolBar defaultToolbar;
|
||||||
|
|
||||||
// Private members
|
// Private members
|
||||||
private final PreferenceTabbedPane gui;
|
private final JComponent gui;
|
||||||
private final transient MapWithAILayerInfo layerInfo;
|
private final transient MapWithAILayerInfo layerInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -227,7 +228,7 @@ public class MapWithAIProvidersPanel extends JPanel {
|
||||||
* @param gui The parent preference tab pane
|
* @param gui The parent preference tab pane
|
||||||
* @param layerInfoArg The list of imagery entries to display
|
* @param layerInfoArg The list of imagery entries to display
|
||||||
*/
|
*/
|
||||||
public MapWithAIProvidersPanel(final PreferenceTabbedPane gui, MapWithAILayerInfo layerInfoArg) {
|
public MapWithAIProvidersPanel(final JComponent gui, MapWithAILayerInfo layerInfoArg) {
|
||||||
super(new GridBagLayout());
|
super(new GridBagLayout());
|
||||||
this.gui = gui;
|
this.gui = gui;
|
||||||
this.layerInfo = layerInfoArg;
|
this.layerInfo = layerInfoArg;
|
||||||
|
@ -474,7 +475,14 @@ public class MapWithAIProvidersPanel extends JPanel {
|
||||||
|
|
||||||
if (addDialog.getValue() == 1) {
|
if (addDialog.getValue() == 1) {
|
||||||
try {
|
try {
|
||||||
activeModel.addRow(p.getSourceInfo());
|
MapWithAIInfo info = p.getSourceInfo();
|
||||||
|
if (MapWithAIInfo.MapWithAIType.ESRI.equals(info.getSourceType())) {
|
||||||
|
for (MapWithAIInfo i : MapWithAILayerInfo.addEsriLayer(info)) {
|
||||||
|
activeModel.addRow(i);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
activeModel.addRow(info);
|
||||||
|
}
|
||||||
} catch (IllegalArgumentException ex) {
|
} catch (IllegalArgumentException ex) {
|
||||||
if (ex.getMessage() == null || ex.getMessage().isEmpty()) {
|
if (ex.getMessage() == null || ex.getMessage().isEmpty()) {
|
||||||
throw ex;
|
throw ex;
|
||||||
|
|
|
@ -23,7 +23,6 @@ import org.openstreetmap.josm.plugins.mapwithai.MapWithAIPlugin;
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.backend.MapWithAIDataUtils;
|
import org.openstreetmap.josm.plugins.mapwithai.backend.MapWithAIDataUtils;
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.backend.MapWithAIDataUtilsTest;
|
import org.openstreetmap.josm.plugins.mapwithai.backend.MapWithAIDataUtilsTest;
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.backend.MapWithAIPreferenceHelper;
|
import org.openstreetmap.josm.plugins.mapwithai.backend.MapWithAIPreferenceHelper;
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.gui.download.MapWithAIDownloadReader;
|
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.gui.download.MapWithAIDownloadReader.MapWithAIDownloadData;
|
import org.openstreetmap.josm.plugins.mapwithai.gui.download.MapWithAIDownloadReader.MapWithAIDownloadData;
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.testutils.MapWithAITestRules;
|
import org.openstreetmap.josm.plugins.mapwithai.testutils.MapWithAITestRules;
|
||||||
import org.openstreetmap.josm.testutils.JOSMTestRules;
|
import org.openstreetmap.josm.testutils.JOSMTestRules;
|
||||||
|
|
Ładowanie…
Reference in New Issue