Drag and Drop Layers
The INTViewer API allows programmers to implement drag and drop capabilities. You can drag a 2D or 3D layer from one viewer window to another one. You can also drag an object in the File Explorer top component to a viewer window.
The main interface used in Drag and Drop operations is the com.interactive.intviewerapi.IDataImporter interface. The implementation of a Drag and Drop is in two steps:
- Create an importer object
- Register that object in the layers.xml file
Drag and Drop of a Visual
The following importer class imports any visual using ITriangleMeshData and coming from a map window:
THREEDMAPTRIANGLEMESHIMPORTER.JAVA
package com.interactive.intviewer.tmesh.importers;
import com.interactive.intviewer.layer2d.AbstractVisualNamer;
import com.interactive.intviewer.tmesh.util.TriangleMeshObject3DImportUtil;
import com.interactive.intviewer.util.VisualImportUtil;
import com.interactive.intviewer.view2d.AbstractSelfHandleException;
import com.interactive.intviewerapi.IDataImporter;
import com.interactive.intviewerapi.IVisual;
import com.interactive.intviewerapi.data.IData;
import com.interactive.intviewerapi.data.tmesh.ITriangleMeshData;
import com.interactive.intviewerapi.objects3d.IObject3D;
import com.interactive.intviewerapi.objects3d.IObject3DFactory;
import com.interactive.intviewerapi.objects3d.ITriangleMeshObject3D;
import com.interactive.intviewerapi.windows.ICRSProvider;
import com.interactive.intviewerapi.windows.IWindow3D;
import java.util.logging.Logger;
public class ThreeDMapTriangleMeshImporter implements IDataImporter<IVisual, IWindow3D> {
private static final Logger logger = Logger.getLogger(ThreeDMapTriangleMeshImporter.class.getName());
@Override
public Class<IVisual> getSupportedClass() {
return IVisual.class;
}
@Override
public boolean importData(IWindow3D window, IVisual provider) {
IObject3DFactory<ITriangleMeshObject3D, IData, IWindow3D> lf = ITriangleMeshObject3D.factory;
try {
IObject3D object3D = lf.createObject3D(window, provider.getData(), provider.getProperties(), false);
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
return true;
}
@Override
public boolean canImport(IVisual provider) {
return !(provider instanceof IObject3D) && (provider.getData() != null) && (provider.getData() instanceof ITriangleMeshData) && (provider.getViewerWindow() instanceof ICRSProvider);
}
}
Register this importer in the layer.xml file for each window type that should use it. In this example below, we register this importer for 3D windows (<folder name="Viewer3D">):
LAYER.XML
<folder name="DnDImporters">
<folder name="Viewer3D">
<file name="com-interactive-intviewer-tmesh-importers-ThreeDMapTriangleMeshImporter.instance"/>
</folder>
A window can have several importers registered. Upon the detection of a drag and drop operation, all importers for that window will be tried using the getSupportedClass and canImport methods. The first importer matching the class and returning true to a canImport call will be used. If two importers match, only the first one will be used.
Drag and Drop of a Data Object
The following importer class imports any data object using ITriangleMeshData and coming from the "Data" and "File Explorer" top components:
MVTRIANGLEMESHDATANODEIMPORTER.JAVA
package com.interactive.intviewer.tmesh.importers;
import com.interactive.intviewer.seismic.SeismicLayerRequiredException;
import com.interactive.intviewerapi.data.DataNode;
import com.interactive.intviewer.seismic.util.SeismicLayer2DImportUtil;
import com.interactive.intviewer.tmesh.layer2d.MapTriangleMeshLayer;
import com.interactive.intviewer.util.DataNodeUtil;
import com.interactive.intviewer.util.VisualImportUtil;
import com.interactive.intviewer.view2d.AbstractSelfHandleException;
import com.interactive.intviewer.view2d.MVDesktopDataImporterAdapter;
import com.interactive.intviewerapi.IDataImporter;
import com.interactive.intviewerapi.data.tmesh.ITriangleMeshData;
import com.interactive.intviewerapi.layers.NamedProps;
import com.interactive.intviewerapi.windows.IMapWindow;
import java.util.logging.Logger;
public class MVTriangleMeshDataNodeImporter implements IDataImporter<DataNode, IMapWindow> {
private static final Logger logger = Logger.getLogger(MVTriangleMeshDataNodeImporter.class.getName());
@Override
public Class<DataNode> getSupportedClass() {
return DataNode.class;
}
@Override
public boolean canImport(DataNode dob) {
ITriangleMeshData hd = dob.getLookup().lookup(ITriangleMeshData.class);
if (hd != null) {
return true;
}
return false;
}
@Override
public boolean importData(IMapWindow parentWindow, DataNode dob) {
ITriangleMeshData foundData = dob.getLookup().lookup(ITriangleMeshData.class);
try {
IMapTriangleMeshLayer.factory.createLayer(parentWindow, foundData, new NamedProps(), true);
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
return true;
}
}
The registration is identical to the registration for visuals. In this case, the destination window is a Map window:
LAYER.XML
<folder name="ViewerPlotMV">
<file name="com-interactive-intviewer-tmesh-importers-MVTriangleMeshDataNodeImporter.instance"/>
</folder>
Handling errors
There are many cases where a layer cannot be dropped to a window. For example, a triangle mesh layer cannot be created in a XSection window unless there is already a seismic layer in that window.
You can handle by displaying a dialog if the drag and drop failed.