/*
* Licensed Materials - Property of Rogue Wave Software, Inc.
* © Copyright Rogue Wave Software, Inc. 2014, 2017
* © Copyright IBM Corp. 2009, 2014
* © Copyright ILOG 1996, 2009
* All Rights Reserved.
*
* Note to U.S. Government Users Restricted Rights:
* The Software and Documentation were developed at private expense and
* are "Commercial Items" as that term is defined at 48 CFR 2.101,
* consisting of "Commercial Computer Software" and
* "Commercial Computer Software Documentation", as such terms are
* used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
* as applicable.
*/
package plugins;
import java.net.URL;
import java.util.Enumeration;
import javax.swing.SwingUtilities;
import ilog.views.IlvManagerLayer;
import ilog.views.maps.IlvMapLayerTreeProperty;
import ilog.views.maps.IlvMapUtil;
import ilog.views.maps.beans.IlvExceptionMessage;
import ilog.views.maps.beans.IlvMapLayer;
import ilog.views.maps.beans.IlvMapLayerTreeModel;
import ilog.views.maps.datasource.IlvMapDataSource;
import ilog.views.maps.datasource.IlvMapDataSourceModel;
import ilog.views.maps.datasource.IlvMapDataSourceProperty;
import ilog.views.maps.graphic.style.IlvMapCompositeStyle;
import ilog.views.maps.graphic.style.IlvMapStyle;
import ilog.views.maps.theme.IlvMapDynamicStyle;
import ilog.views.maps.theme.IlvMapStyleController;
import ilog.views.maps.theme.IlvMapStyleControllerProperty;
import ilog.views.tiling.IlvTiledLayer;
/**
* Thread loading files in background.
*/
public class LoadDataRunnable extends Thread {
private final String[] fileNames;
private final URL[] url;
IlvMapLayerTreeModel ltm;
IlvMapDataSourceModel model;
private boolean interrupted = false;
private final ImportAction importer;
/**
*
* @param importer
* @param fileNames
*/
public LoadDataRunnable(ImportAction importer, String[] fileNames) {
super();
if (importer instanceof LoadAnythingAction) {
LoadAnythingAction ls = (LoadAnythingAction) importer;
this.importer = ls.getSelectedAction();
} else {
this.importer = importer;
}
if (importer.getStopButton() != null) {
importer.getStopButton().addThread(this);
}
ltm = IlvMapLayerTreeProperty.GetMapLayerTreeModel(importer.getView().getManager());
model = IlvMapDataSourceProperty.GetMapDataSourceModel(importer.getView().getManager());
setName("LoadInBackround"); //$NON-NLS-1$
setPriority(Thread.MIN_PRIORITY);
this.fileNames = fileNames;
this.url = null;
}
/**
* Creates a loading thread for the import action.
*
* @param importer
* @param url
*/
public LoadDataRunnable(ImportAction importer, URL[] url) {
super();
fileNames = null;
this.url = url;
if (importer instanceof LoadAnythingAction) {
LoadAnythingAction ls = (LoadAnythingAction) importer;
this.importer = ls.getSelectedAction();
} else {
this.importer = importer;
}
if (importer.getStopButton() != null) {
importer.getStopButton().addThread(this);
}
ltm = IlvMapLayerTreeProperty.GetMapLayerTreeModel(importer.getView().getManager());
model = IlvMapDataSourceProperty.GetMapDataSourceModel(importer.getView().getManager());
setName("LoadInBackround"); //$NON-NLS-1$
setPriority(Thread.MIN_PRIORITY);
}
void stopCleanly() {
interrupted = true;
interrupt();
}
void insertDataSource(IlvMapLayer parent, IlvMapDataSource d) {
if (d == null) {
return;
}
IlvMapLayer layer = d.getInsertionLayer();
layer.setName(d.getName());
IlvMapStyleController themeControl = IlvMapStyleControllerProperty
.GetMapStyleController(importer.getView().getManager());
IlvMapStyle childStyle = layer.getStyle();
if (parent != null) {
IlvMapDynamicStyle[] t = themeControl.getThemes(layer);
for (int i = 0; i < t.length; i++) {
t[i].getStyle().setParent(parent.getStyle());
}
if (childStyle != null) {
childStyle.setParent(parent.getStyle());
}
}
if (layer.getParent() == null) {
ltm.addChild(parent, layer);
}
model.insert(d);
}
void refreshTiles() {
int nl = importer.getView().getManager().getLayersCount();
for (int i = 0; i < nl; i++) {
IlvManagerLayer l = importer.getView().getManager().getManagerLayer(i);
if (l instanceof IlvTiledLayer) {
((IlvTiledLayer) l).getTileController().updateView(importer.getView());
}
}
}
/**
* Main thread running method. Will go through all datasources returned by
* {@link ImportAction#getDataSources(String[])} and add them, and their
* layers, to the different tree models.
*/
Override
public void run() {
try {
IlvMapStyleController themeController = IlvMapStyleControllerProperty
.GetMapStyleController(importer.getView().getManager());
IlvMapLayer parent = ltm.findChildLayer(null, importer.getFormatName());
if (parent == null) {
parent = new IlvMapLayer();
parent.setName(importer.getFormatName());
IlvMapCompositeStyle parentStyle = new IlvMapCompositeStyle();
// parentStyle.addStyle(new IlvRasterStyle());
parent.setStyle(parentStyle);
ltm.addChild(null, parent);
}
if (interrupted) {
end();
return;
}
Enumeration<?> e = null;
if (fileNames != null)
e = importer.getDataSources(fileNames);
else if (url != null)
e = importer.getDataSources(url);
Object o = fileNames;
if (o == null)
o = url;
importer.setAdvancement(ImportAction.LOADING, o, 100);
importer.setAdvancement(ImportAction.RENDERING, o, 1);
if (e == null) {
end();
return;
}
while (e.hasMoreElements()) {
if (interrupted) {
end();
return;
}
IlvMapDataSource d = (IlvMapDataSource) e.nextElement();
if (d != null && !interrupted) {
insertDataSource(parent, d);
themeController.updateTheme(importer.getView(), d.getInsertionLayer());
d.start();
} else {
end();
return;
}
if (interrupted) {
end();
return;
}
}
} catch (Throwable th) {
new IlvExceptionMessage(th, IlvMapUtil.getString(ImportAction.class, "ImportAction.Error")); //$NON-NLS-1$
}
end();
}
/**
* Called after the run, wether of not it has been interrupted, to refresh the
* tiles and the views.
*/
public void end() {
SwingUtilities.invokeLater(new Runnable() {
Override
public void run() {
ltm.arrangeLayers();
IlvMapStyleController themeController = IlvMapStyleControllerProperty
.GetMapStyleController(importer.getView().getManager());
themeController.updateCurrentTheme();
refreshTiles();
importer.getView().getManager().reDraw();
Object o = fileNames;
if (o == null)
o = url;
importer.setAdvancement(ImportAction.RENDERING, o, 100);
if (importer.getStopButton() != null) {
importer.getStopButton().removeThread(LoadDataRunnable.this);
}
}
});
}
/**
* @return Returns the interrupted.
*/
public boolean wasStoppedCleanly() {
return interrupted;
}
}