/*
* 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.
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.tree.DefaultMutableTreeNode;
import ilog.views.IlvGrapher;
import ilog.views.IlvManager;
import ilog.views.IlvManagerLayer;
import ilog.views.IlvManagerView;
import ilog.views.IlvRect;
import ilog.views.maps.IlvAreaOfInterest;
import ilog.views.maps.IlvCoordinateSystemProperty;
import ilog.views.maps.IlvMapLayerTreeProperty;
import ilog.views.maps.IlvMapScaleLimiter;
import ilog.views.maps.beans.IlvJAreaOfInterestPanel;
import ilog.views.maps.beans.IlvJCoordinateSystemEditorPanel;
import ilog.views.maps.beans.IlvJMapsManagerViewControlBar;
import ilog.views.maps.beans.IlvJMouseCoordinateViewer;
import ilog.views.maps.beans.IlvLayerTreePanel;
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.datasource.IlvShapeDataSource;
import ilog.views.maps.graphic.style.IlvPolylineStyle;
import ilog.views.maps.label.IlvMapLabelStyle;
import ilog.views.maps.label.IlvMapLabeler;
import ilog.views.maps.label.IlvMapLabelerProperty;
import ilog.views.maps.srs.coordsys.IlvCoordinateSystem;
import ilog.views.maps.srs.coordsys.IlvGeographicCoordinateSystem;
import ilog.views.maps.srs.coordsys.IlvProjectedCoordinateSystem;
import ilog.views.swing.IlvJScrollManagerView;
import ilog.views.tiling.IlvTiledLayer;
import ilog.views.util.IlvProductUtil;
/**
* A demo that present shape file loading with load on demand and reprojection.
*/
SuppressWarnings("serial")
public class LabelDemo extends JRootPane {
static
{
// This sample uses JViews Maps features. When deploying an
// application that includes this code, you need to be in possession
// of a Rogue Wave JViews Maps Deployment license.
IlvProductUtil.DeploymentLicenseRequired(IlvProductUtil.JViews_Maps_Deployment);
}
private IlvManagerView view;// map view
private IlvJScrollManagerView viewScroll;// scroll arond the map view
private IlvJMapsManagerViewControlBar viewToolbar; // zoom & selection toolbar
private IlvLayerTreePanel layerTreePanel = new IlvLayerTreePanel(); // layer
// visibility
// and
// props.
// control
private IlvJCoordinateSystemEditorPanel csPanel;// coordinate system choice.
private IlvJMouseCoordinateViewer locator;// coordinate information
private JTabbedPane tabPane;
private IlvMapLayer shpLayer;
private IlvAreaOfInterest areaOfInterest;
private IlvJAreaOfInterestPanel areaPanel;
private IlvMapLabeler labeler;
/**
* Constructs a Label Demo.
*/
public LabelDemo() {
super();
// Make sure the swing construction is called in Swing event thread.
ilog.views.util.swing.IlvSwingUtil.invokeAndWait(new Runnable() {
Override
public void run() {
// create the main components
// The view to display the maps.
view = new IlvManagerView();
view.setManager(new IlvGrapher());
viewScroll = new IlvJScrollManagerView(view);
// A control bar with commonly used interactors.
viewToolbar = new IlvJMapsManagerViewControlBar();
// A coordinate system editor panel to reproject the map.
csPanel = new IlvJCoordinateSystemEditorPanel();
// Setup the components
viewToolbar.setView(view);
locator = new IlvJMouseCoordinateViewer();
locator.setView(view);
viewToolbar.add(locator);
view.setKeepingAspectRatio(true);
view.setBackground(new Color(80, 180, 240));
view.setAntialiasing(false);
view.setSize(new Dimension(900, 450));
viewScroll.setPreferredSize(view.getSize());
layerTreePanel.setView(view);
// geo reference the view
view.getManager().setNamedProperty(new IlvCoordinateSystemProperty(IlvGeographicCoordinateSystem.WGS84));
// limit the zoom to correct scales.
IlvMapScaleLimiter limiter = new IlvMapScaleLimiter(1f / 1000f, (float) (1 / 1E5));
limiter.setView(view);
// setup coordinate system panel to change projection.
csPanel.setCoordinateSystem(IlvCoordinateSystemProperty.GetCoordinateSystem(view.getManager()));
// Add a listener on the coordinate system panel.
// When the coordinate system changes, set the coordinate system
// property
// of the manager accordingly, remove all objects in the manager,
// restart the data source and starts a new labeling.
csPanel.addCoordinateSystemChangeListener(new PropertyChangeListener() {
Override
public void propertyChange(PropertyChangeEvent evt) {
IlvCoordinateSystem system = (IlvCoordinateSystem) evt.getNewValue();
if (system instanceof IlvProjectedCoordinateSystem) {// JV-4401 and
// JV-4510 -
// change
// center of
// projection
// to the
// correct area
IlvProjectedCoordinateSystem pcs = (IlvProjectedCoordinateSystem) system;
boolean change = false;
if (pcs.getProjection().getCentralMeridian() == 0) {
pcs.getProjection().setCentralMeridian(Math.toRadians(-122));
change = true;
}
if (pcs.getProjection().getCentralParallel() == 0) {
pcs.getProjection().setCentralParallel(Math.toRadians(37));
change = true;
}
if (change) {
csPanel.setCoordinateSystem(pcs);
return;
}
}
// change coordinate system of the map according to panel's
// selection
getView().getManager().setNamedProperty(new IlvCoordinateSystemProperty(system));
// erase existing data in manager, and reload sources.
removeAllObjects();
try {
fit();
reloadData();
} catch (Exception e) {
e.printStackTrace();
}
performLabeling();
}
});
// build map.
JSplitPane splitPane = new JSplitPane();
Container contentPane = getContentPane();
// configure the main window
contentPane.add(viewToolbar, BorderLayout.NORTH);
tabPane = new JTabbedPane();
csPanel.setAdvancedPanelsVisible(false);
tabPane.addTab("Map Layers", layerTreePanel); //$NON-NLS-1$ // should
// be I18N
tabPane.addTab("Coordinate System", csPanel);//$NON-NLS-1$ // should be
// I18N
areaPanel = new IlvJAreaOfInterestPanel(getView(), true, true, true);
tabPane.addTab("Areas", new JScrollPane(areaPanel));//$NON-NLS-1$ //
// should be I18N
splitPane.setLeftComponent(tabPane);
splitPane.setRightComponent(viewScroll);
contentPane.add(splitPane, BorderLayout.CENTER);
contentPane.add(locator, BorderLayout.SOUTH);
IlvRect sf = new IlvRect(-2.137448f, 0.6585128f, 0.0009102f, 0.00039473f);
areaOfInterest = new IlvAreaOfInterest("SF", sf, 0, null);//$NON-NLS-1$ //
// should be
// I18N
loadData();
shpLayer.getStyle().setLabelAttribute(shpLayer.getStyle().getAttributeInfo().getAttributeName(0));
layerTreePanel.getLayerTree().setAllowDelete(false);
}
});
}
IlvManagerView getView() {
return view;
}
/**
* Reloads the data after a coordinate system change. The data sources are
* reset and reloaded.
*
* @throws Exception
*/
void reloadData() throws Exception {
IlvManager manager = getView().getManager();
IlvMapDataSourceModel dsm = IlvMapDataSourceProperty.GetMapDataSourceModel(manager);
DefaultMutableTreeNode root = (DefaultMutableTreeNode) dsm.getRoot();
int count = root.getChildCount();
for (int i = 0; i < count; i++) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) root.getChildAt(i);
IlvMapDataSource source = (IlvMapDataSource) node.getUserObject();
IlvMapLayer layer = source.getInsertionLayer();
if (layer.getManager() == manager) { // need bug fix in framework for that
// to work
source.reset();
source.start();
IlvManagerLayer layers[] = layer.getManagerLayers();
for (int l = 0; l < layers.length; l++) {
if (layers[l] instanceof IlvTiledLayer) {
((IlvTiledLayer) layers[l]).getTileController().updateView(getView());
}
}
}
}
}
/**
* Creates a map. All map creation steps are performed here.
*/
void loadData() {
String file = "data/roads.shp";//$NON-NLS-1$
URL shpFile = LabelDemo.class.getResource(file);
// file = new File(file).getAbsolutePath();
try {
// create a data source for the shape file
IlvShapeDataSource shpDataSource = new IlvShapeDataSource(shpFile, true);
shpDataSource.setCoordinateSystem(IlvGeographicCoordinateSystem.WGS84);
shpDataSource.setManager(view.getManager());
// insert it in the manager's data source tree
IlvMapDataSourceModel dataSourceModel = IlvMapDataSourceProperty.GetMapDataSourceModel(view.getManager());
dataSourceModel.insert(shpDataSource);
// start reading (recusively start all data sources of this model)
dataSourceModel.start();
// get the shape maplayer used to display that data source
shpLayer = shpDataSource.getInsertionLayer();
shpLayer.setName("Shape Layer (roads.shp)");//$NON-NLS-1$ // should be
// I18N
// insert it on the manager's map layer tree
IlvMapLayerTreeModel ltm = IlvMapLayerTreeProperty.GetMapLayerTreeModel(view.getManager());
ltm.addChild(null, shpLayer);
// setup the shape layer style
shpLayer.getStyle().setAttribute(IlvPolylineStyle.FOREGROUND, Color.blue);
getLabeler().addLayer(shpLayer);
fit();
} catch (Exception e1) {
e1.printStackTrace();
}
view.repaint();
}
void performLabeling() {
getLabeler().performLabeling();
}
IlvMapLabeler getLabeler() {
if (labeler == null) {
labeler = IlvMapLabelerProperty.GetMapLabeler(getView().getManager());
labeler.setView(getView());
}
return labeler;
}
IlvMapLabelStyle getLabelStyle() {
return (IlvMapLabelStyle) getLabeler().getLabelLayer(null).getStyle();
}
void fit() {
areaOfInterest.zoomTo(getView());
}
/**
* Main method
*
* @param args
* ignored parameter.
*/
public static void main(String[] args) {
// Sun recommends that to put the entire GUI initialization into the
// AWT thread
javax.swing.SwingUtilities.invokeLater(new Runnable() {
Override
public void run() {
final JFrame frame = new JFrame("Label sample");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
LabelDemo demo = new LabelDemo();
frame.getContentPane().add(demo);
frame.pack();
frame.setVisible(true);
}
});
}
void removeAllObjects() {
IlvMapLayerTreeModel model = IlvMapLayerTreeProperty.GetMapLayerTreeModel(getView().getManager());
model.clearAllObjects();
}
}