/*
* 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 utils.sdm;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyEditor;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.JTree;
import javax.swing.table.JTableHeader;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellRenderer;
import ilog.views.IlvApplyObject;
import ilog.views.IlvGraphic;
import ilog.views.IlvPoint;
import ilog.views.IlvRect;
import ilog.views.applications.util.beans.editor.StrokeEditor;
import ilog.views.beans.editor.IlvPointEditor;
import ilog.views.beans.editor.IlvRectEditor;
import ilog.views.io.IlvInputStream;
import ilog.views.io.IlvOutputStream;
import ilog.views.io.IlvPersistentObject;
import ilog.views.io.IlvReadFileException;
import ilog.views.maps.IlvMapUtil;
import ilog.views.maps.beans.editor.IlvSymbolLocationEditor;
import ilog.views.maps.format.IlvMapDataPathManager;
import ilog.views.maps.symbology.swing.IlvAbstractGroupTreeViewActions;
import ilog.views.maps.symbology.swing.IlvSymbologyTreeView;
import ilog.views.sdm.IlvSDMEngine;
import ilog.views.sdm.IlvSDMModel;
import ilog.views.sdm.model.IlvDefaultSDMNode;
import ilog.views.sdm.model.IlvSDMNode;
import ilog.views.sdm.renderer.maps.IlvMapRenderer;
import ilog.views.symbology.palettes.IlvPalette;
import ilog.views.symbology.palettes.IlvPaletteManager;
import ilog.views.symbology.palettes.IlvPaletteObject;
import ilog.views.symbology.palettes.IlvPaletteSymbol;
import ilog.views.symbology.palettes.IlvPaletteSymbolParameter;
import ilog.views.symbology.palettes.event.PaletteViewerEvent;
import ilog.views.symbology.palettes.event.PaletteViewerListener;
import ilog.views.symbology.palettes.swing.IlvPaletteDragAndDropData;
import ilog.views.symbology.palettes.swing.IlvPaletteManagerComboboxViewer;
import ilog.views.symbology.palettes.swing.action.IlvPaletteLoadAction;
import ilog.views.util.IlvImageUtil;
import ilog.views.util.beans.IlvPropertyEditorManager;
import ilog.views.util.beans.editor.IlvDoubleArrayPropertyEditor;
import ilog.views.util.beans.editor.IlvFloatArrayPropertyEditor;
import ilog.views.util.beans.editor.IlvIntegerArrayPropertyEditor;
import ilog.views.util.beans.editor.IlvLongArrayPropertyEditor;
import ilog.views.util.beans.editor.IlvStringArrayPropertyEditor;
import ilog.views.util.convert.IlvConvert;
import ilog.views.util.internal.IlvReflection;
import ilog.views.util.psheet.IlvPropertyDescriptor;
import ilog.views.util.psheet.IlvPropertyDescriptorWithEditor;
import ilog.views.util.psheet.IlvPropertySheet;
/**
* The symbol actions in the symbology tree panel to deal with symbols in a
* palette.
*/
public class PaletteSymbologyTreeViewActions extends IlvAbstractGroupTreeViewActions {
static {
// Register property editor for some of the symbol properties.
IlvPropertyEditorManager.registerEditor(IlvRect.class, IlvRectEditor.class);
IlvPropertyEditorManager.registerEditor(IlvPoint.class, IlvPointEditor.class);
IlvPropertyEditorManager.registerEditor(IlvReflection.arrayType(String.class), IlvStringArrayPropertyEditor.class);
IlvPropertyEditorManager.registerEditor(IlvReflection.arrayType(Double.class), IlvDoubleArrayPropertyEditor.class);
IlvPropertyEditorManager.registerEditor(IlvReflection.arrayType(Float.class), IlvFloatArrayPropertyEditor.class);
IlvPropertyEditorManager.registerEditor(IlvReflection.arrayType(Long.class), IlvLongArrayPropertyEditor.class);
IlvPropertyEditorManager.registerEditor(IlvReflection.arrayType(Integer.class),
IlvIntegerArrayPropertyEditor.class);
IlvPropertyEditorManager.registerEditor(java.awt.Stroke.class, StrokeEditor.class);
// add additional converters for arrays (useful for chart symbols)
// JV-4318
IlvConvert.addConverter(new IlvDoubleArrayPropertyEditor(), IlvReflection.arrayType(double.class));
IlvConvert.addConverter(new IlvIntegerArrayPropertyEditor(), IlvReflection.arrayType(int.class));
IlvConvert.addConverter(new IlvFloatArrayPropertyEditor(), IlvReflection.arrayType(float.class));
IlvConvert.addConverter(new IlvStringArrayPropertyEditor(), IlvReflection.arrayType(String.class));
}
/**
* Class used to store and retrieve the persistent context . This class saves
* and reloads the palette urls that are currently accessible in the palette
* manager.
*/
static public class PaletteContext implements IlvPersistentObject {
private final String[] paletteURLs;
private PaletteContext(String[] paletteURLs) {
this.paletteURLs = paletteURLs;
}
/**
* Reads a list of palette urls from a stream to create a
* <code>PaletteContext</code>.
*
* @param stream
* stream to read from.
* @throws IlvReadFileException
*/
public PaletteContext(IlvInputStream stream) throws IlvReadFileException {
paletteURLs = stream.readStringArray("URLs");//$NON-NLS-1$
}
/**
* Write the list of palettes. {@inheritDoc}
*
* @see ilog.views.io.IlvPersistentObject#write(ilog.views.io.IlvOutputStream)
*/
Override
public void write(IlvOutputStream stream) throws IOException {
stream.write("URLs", paletteURLs); //$NON-NLS-1$
}
}
// some specific SDM property names
final static String TAG_PROPERTY_NAME = "tag"; //$NON-NLS-1$
final static String SYMBOLINFO_PROPERTY_NAME = "symbolInfo"; //$NON-NLS-1$
final static String ID_PROPERTY_NAME = "id";//$NON-NLS-1$
final static String VISIBLE_PROPERTY_NAME = "visible";//$NON-NLS-1$
final static String LATITUDE_PROPERTY_NAME = IlvMapRenderer.LATITUDE_PROPERTY;
final static String LONGITUDE_PROPERTY_NAME = IlvMapRenderer.LONGITUDE_PROPERTY;
/**
* Specific tree cell renderer that displays the symbol icon.
*/
private static final class PaletteCellRenderer implements TreeCellRenderer {
// delegate renderer. Note: we expect it to be a DefaultTreeCellRenderer
private final TreeCellRenderer delegate;
private PaletteCellRenderer(TreeCellRenderer or) {
this.delegate = or;
}
Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
Component c = delegate.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
if (leaf && value instanceof IlvSDMNode) {
IlvSDMNode node = ((IlvSDMNode) value);
// retrieve the symbol definition
Object v = node.getProperty(SYMBOLINFO_PROPERTY_NAME);
if (v instanceof IlvPaletteSymbol) {
// retrieve the symbol icon
IlvPaletteSymbol symb = (IlvPaletteSymbol) v;
ImageIcon ic = symb.getSmallIcon();
if (c instanceof DefaultTreeCellRenderer) {
// set the icon on the renderer
((DefaultTreeCellRenderer) c).setIcon(ic);
}
// change the text to only display the id (a bit terser than default)
String n = node.getID();
if (n == null) {
n = node.toString();
}
((DefaultTreeCellRenderer) c).setText(n);
}
}
return c;
}
}
/**
* Property descriptor used to edit the symbol properties
*/
private static class SymbolPropertyDescriptor implements IlvPropertyDescriptorWithEditor {
private final IlvSDMModel model;
private final Object target;
private final String name;
// symbol parameter associated with the property.
private IlvPaletteSymbolParameter _param;
/**
* Creates a new <code>SymbolPropertyDescriptor</code>.
*
* @param model
* model used to retrieve properties
* @param target
* the target symbol
* @param name
* the name of the property
*/
public SymbolPropertyDescriptor(IlvSDMModel model, Object target, String name) {
this.model = model;
this.target = target;
this.name = name;
}
/**
* Returns <code>true</code> if the property is public.
*/
Override
public boolean isPublic() {
return true;
}
/**
* Returns the name of the property.
*/
Override
public String getName() {
return name;
}
/**
* Returns the name that will be displayed in the property sheet.
*/
Override
public String getDisplayName() {
return name;
}
/**
* Returns the description shown in the tool-tip.
*/
Override
public String getShortDescription() {
IlvPaletteSymbolParameter param = getParam();
if (param != null) {
return param.getShortDescription();
}
return null;
}
private IlvPaletteSymbolParameter getParam() {
if (_param == null) {
// retrieve additional information.
Object v = model.getObjectProperty(target, SYMBOLINFO_PROPERTY_NAME);
if (v instanceof IlvPaletteSymbol) {
_param = ((IlvPaletteSymbol) v).getParameter(name);
}
}
return _param;
}
/**
* Returns the class of the property value.
*/
Override
public Class<?> getPropertyType() {
try {
Object v = get(target);
if (v != null) {
return v.getClass();
}
} catch (Exception ex) {
ex.printStackTrace();
}
return String.class;
}
/**
* Returns the the editor of the property.
*/
Override
public PropertyEditor getPropertyEditor() {
IlvPaletteSymbolParameter param = getParam();
if (param != null) {
return param.getPropertyEditor();
}
return null;
}
/**
* Returns the value of the property for the target object.
*/
Override
public Object get(Object target1) throws Exception {
if (name == TAG_PROPERTY_NAME) {
return model.getTag(target1);
} else if (name == ID_PROPERTY_NAME) {
return model.getID(target1);
} else {
Object v = model.getObjectProperty(target1, name);
return v;
}
}
/**
* Sets the value of the property for the target object.
*/
Override
public void set(Object target, Object value) throws Exception {
if (name == ID_PROPERTY_NAME && value != null)
model.setID(target, value.toString());
else if (name != TAG_PROPERTY_NAME) {
model.setObjectProperty(target, name, value);
}
}
/**
* Returns a <code>String</code> representing a URL where the HTML
* documentation of the <code>get</code> method of the property is.
*/
Override
public String getGetDocumentation() {
return null;
}
/**
* Returns a <code>String</code> representing a URL where the HTML
* documentation of the <code>set</code> method of the property is.
*/
Override
public String getSetDocumentation() {
return null;
}
Override
public Class<?> getPropertyEditorClass() {
return null;
}
Override
SuppressWarnings("rawtypes")
public void setPropertyEditorClass(Class editorClass) {
throw new IllegalArgumentException("Cannot set editor for this class"); //$NON-NLS-1$
}
}
/**
* Property sheet to edit symbol parameters
*/
static class PropertySheet extends IlvPropertySheet implements PropertyChangeListener {
private IlvSDMModel model;
private IlvSymbolLocationEditor locator;
/**
* Creates a new <code>PropertySheet</code>.
*
* @param locator
* GUI used to pick coordinates on the map.
*/
PropertySheet(IlvSymbolLocationEditor locator) {
super(null);
this.locator = locator;
JTable table = getTable();
// Re-set a default table header of the table, this was set to
// null by the super class constructor.
JTableHeader header = new JTableHeader(table.getColumnModel());
table.setTableHeader(header);
// Do not allow the column rearrangement.
header.setReorderingAllowed(false);
}
/**
* Sets the SDM model targeted.
*
* @param model
* the SDM model
*/
void setModel(IlvSDMModel model) {
this.model = model;
}
/**
* Initializes the <code>IlvPropertySheet</code> to edit the specified
* target.
*/
Override
public void setTarget(Object newTarget) {
super.setTarget(newTarget);
if (locator != null && model != null) {
if (target instanceof IlvSDMNode) {
locator.removePropertyChangeListener(this);
Double latr = (Double) model.getObjectProperty(target, LATITUDE_PROPERTY_NAME);
Double lonr = (Double) model.getObjectProperty(target, LONGITUDE_PROPERTY_NAME);
locator.setLatLon(latr.doubleValue(), lonr.doubleValue());
locator.addPropertyChangeListener(this);
}
add(locator.getComponent(), BorderLayout.SOUTH);
}
}
/**
* This method gets called when a the location is changed through the
* locator.
*/
Override
public void propertyChange(PropertyChangeEvent e) {
if (locator != null && model != null) {
model.setObjectProperty(target, LONGITUDE_PROPERTY_NAME, new Double(locator.getLon()));
model.setObjectProperty(target, LATITUDE_PROPERTY_NAME, new Double(locator.getLat()));
}
}
/**
* This method is overridden to create property descriptors for the symbol
*
* @param target1
* The selected symbol.
*/
Override
public IlvPropertyDescriptor[] getPropertyDescriptors(Object target1) {
if (target1 instanceof IlvSDMNode) {
List<IlvPropertyDescriptor> list = new ArrayList<IlvPropertyDescriptor>();
// list.add(new SDMPropertyDescriptor(model, target1,
// TAG_PROPERTY_NAME));
// list.add(new SDMPropertyDescriptor(model, target1,
// VISIBLE_PROPERTY_NAME));
list.add(new SymbolPropertyDescriptor(model, target1, ID_PROPERTY_NAME));
String[] properties = model.getObjectPropertyNames(target1);
for (int i = 0; i < properties.length; i++) {
String property = properties[i];
if (!property.equals(ID_PROPERTY_NAME) && !property.equals(TAG_PROPERTY_NAME)
&& !property.equals(SYMBOLINFO_PROPERTY_NAME) && !property.equals(VISIBLE_PROPERTY_NAME)
&& !property.equals(LONGITUDE_PROPERTY_NAME) && !property.equals(LATITUDE_PROPERTY_NAME)) {
IlvPropertyDescriptor desc = new SymbolPropertyDescriptor(model, target1, property);
list.add(desc);
}
}
return list.toArray(new SymbolPropertyDescriptor[0]);
}
return super.getPropertyDescriptors(target1);
}
}
/**
* GUI to create and edit symbols from a set of palettes.
*/
static class PaletteSymbologyEditPanel {
// symbol property sheet for edition
private final PropertySheet editSheet;
// SDM Engine
private final IlvSDMEngine engine;
// current symbol beeing edited/created
private Object currentNode;
// main panel
private JPanel _mainPanel;
// palette manager that loads & manages palettes
private final IlvPaletteManager paletteManager;
// GUI to select symbol definitions in the various palettes
private IlvPaletteManagerComboboxViewer _paletteViewer;
// factory for the palette selection dialog
private JOptionPane _paletteDialogPane;
// factory for the symbol property sheet dialog
private JOptionPane _editSheetDialogPane;
// the palette selection dialog
private JDialog _paletteDialog;
// the symbol property sheet dialog
private JDialog _editSheetDialog;
/**
* Creates a new <code>PaletteSymbologyEditPanel</code>.
*
* @param engine
* SDM Engine
* @param paletteManager
* palette Manager
* @param locator
* lat/lon picker
*/
PaletteSymbologyEditPanel(IlvSDMEngine engine, IlvPaletteManager paletteManager, IlvSymbolLocationEditor locator) {
this.editSheet = new PropertySheet(locator);
this.engine = engine;
this.paletteManager = paletteManager;
}
/**
* Create the various GUIs
*/
private void createGUI() {
_paletteViewer = new IlvPaletteManagerComboboxViewer(paletteManager);
_paletteViewer.setSearchToolVisisble(false);
_mainPanel = new JPanel(new BorderLayout());
_mainPanel.add(_paletteViewer.getComponent(), BorderLayout.CENTER);
_paletteDialogPane = new JOptionPane(_mainPanel, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
_editSheetDialogPane = new JOptionPane(editSheet, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION);
}
/**
* Sets the target node to be created/edited
*
* @param symbol
*/
void setSymbol(Object node) {
this.currentNode = node;
}
/**
* @return The main palette selection panel
*/
JPanel getMainPanel() {
if (_mainPanel == null) {
createGUI();
}
return _mainPanel;
}
/**
* @return the palette selection pane
*/
private JOptionPane getSelectionOptionPane() {
if (_paletteDialogPane == null) {
createGUI();
}
return _paletteDialogPane;
}
/**
* @return the property edition pane
*/
private JOptionPane getPropertyOptionPane() {
if (_editSheetDialogPane == null) {
createGUI();
}
return _editSheetDialogPane;
}
/**
* @return the palette viewer
*/
IlvPaletteManagerComboboxViewer getSelectionPaletteViewer() {
if (_paletteViewer == null) {
createGUI();
}
return _paletteViewer;
}
/**
* Shows a palette selection dialog
*
* @param view
* @param applier
*/
void showDialog(final IlvSymbologyTreeView view, final IlvApplyObject applier) {
if (currentNode == null) {// creation
if (_paletteDialog == null) {
_paletteDialog = getSelectionOptionPane().createDialog(view, IlvMapUtil
.getString(PaletteSymbologyTreeViewActions.class, "PaletteSymbologyTreeViewActions.selectionTitle")); //$NON-NLS-1$
_paletteDialog.setModal(false);
_paletteDialog.addComponentListener(new ComponentAdapter() {
Override
public void componentHidden(ComponentEvent e) {
Object ans = getSelectionOptionPane().getValue();
if (new Integer(JOptionPane.OK_OPTION).equals(ans)) {
createSelectedSymbol(view, applier);
}
}
});
}
_paletteDialog.setVisible(true);
} else {
// edition
editSheet.setModel(engine.getModel());
editSheet.setTarget(null);
editSheet.setTarget(currentNode);
if (_editSheetDialog == null) {
_editSheetDialog = getPropertyOptionPane().createDialog(view, IlvMapUtil
.getString(PaletteSymbologyTreeViewActions.class, "PaletteSymbologyTreeViewActions.editionTitle")); //$NON-NLS-1$
_editSheetDialog.setModal(false);
// JV-3575
_editSheetDialog.addComponentListener(new ComponentAdapter() {
Override
public void componentHidden(ComponentEvent e) {
applier.apply(null, currentNode);
}
});
}
_editSheetDialog.setVisible(true);
}
}
/**
* Creates a new symbol and initializes its properties
*
* @param view
* @param applier
*/
private void createSelectedSymbol(final IlvSymbologyTreeView view, final IlvApplyObject applier) {
IlvPaletteSymbol paletteSymbol = getSelectionPaletteViewer().getSelectedSymbol();
if (paletteSymbol != null) {
engine.setAdjusting(true);
currentNode = view.getSymbologyTreeViewActions().newSymbol(paletteSymbol.getFullID());
if (applier != null) {
applier.apply(null, currentNode);
}
SDMPaletteSymbolCreator.setupSymbol(currentNode, engine.getModel(), paletteSymbol, new Double(0),
new Double(0));
engine.setAdjusting(false);
}
}
}
/**
* Indicates whether the palette selection should be embedded in the tree view
* or shown as a new dialog
*/
static public boolean useDialog = false;
/**
* The object in charge of symbol creation and edition
*/
private PaletteSymbologyEditPanel customAddPanel;
/**
* The object managing the list of current loaded palettes
*/
private IlvPaletteManager _paletteManager;
private IlvPaletteManager getPaletteManager() {
if (_paletteManager == null) {
_paletteManager = new IlvPaletteManager();
if (getView() != null) {
_paletteManager.attach(getView().getSymbologyEngine());
try {
_paletteManager.load("ilog/views/palettes/shared/"); //$NON-NLS-1$
} catch (IOException e) {
e.printStackTrace();
}
}
}
return _paletteManager;
}
private boolean hasPaletteManager() {
return _paletteManager != null;
}
/**
* lat/lon picker
*/
private IlvSymbolLocationEditor locator;
/**
* {@inheritDoc}
*/
Override
public Object newSymbol(String tag) {
IlvSDMEngine eng = getView().getSymbologyEngine();
IlvPaletteManager pm = getPaletteManager();
for (int i = 0; i < pm.getPaletteCount(); i++) {
IlvPalette p = pm.getPalette(i);
// finds the palette which contains the right tag.
IlvPaletteSymbol paletteSymbol = p.getSymbol(tag);
if (paletteSymbol != null) {
// creates the symbol
SDMPaletteSymbolCreator creator = new SDMPaletteSymbolCreator(eng, paletteSymbol);
return creator.createSymbol();
}
}
return new IlvDefaultSDMNode(tag);
}
/**
* Creates actions to manage symbol tree.
*/
public PaletteSymbologyTreeViewActions() {
// nothing to do
}
/**
* Not implemented
*
* @see ilog.views.maps.symbology.swing.IlvSymbologyTreeViewActions#editSymbology(IlvSDMModel,
* ilog.views.IlvApplyObject)
*/
Override
public void editSymbology(IlvSDMModel model, IlvApplyObject applier) {
// not implemented
}
/**
* Returns false
*
* @see ilog.views.maps.symbology.swing.IlvSymbologyTreeViewActions#isEditSymbologyEnabled(IlvSDMModel)
*/
Override
public boolean isEditSymbologyEnabled(IlvSDMModel model) {
return false;
}
/**
* The Symbology is not supposed to change on the fly. This method does
* nothing.
*
* @see ilog.views.maps.symbology.swing.IlvSymbologyTreeViewActions#actOnSymbologyChanged()
*/
Override
public void actOnSymbologyChanged() {
// this should not happen
}
/**
* The view changed, we need to attach the palette manager {@inheritDoc}
*
* @see ilog.views.maps.symbology.swing.IlvAbstractGroupTreeViewActions#setView(ilog.views.maps.symbology.swing.IlvSymbologyTreeView)
*/
Override
public void setView(IlvSymbologyTreeView treeView) {
super.setView(treeView);
treeView.getTree().setCellRenderer(new PaletteCellRenderer(treeView.getTree().getCellRenderer()));
if (hasPaletteManager()) {
getPaletteManager().attach(treeView.getSymbologyEngine());
try {
if (getPaletteManager().getPaletteCount() == 0) {
getPaletteManager().load("ilog/views/palettes/shared/"); //$NON-NLS-1$
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* Displays a symbol creation dialog. Adds the symbol in the tree if validated
* by the user.
*
* @see ilog.views.maps.symbology.swing.IlvSymbologyTreeViewActions#createSymbol(IlvSDMModel,
* java.lang.Object, ilog.views.IlvApplyObject)
*/
Override
public void createSymbol(final IlvSDMModel model, final Object group, final IlvApplyObject applier) {
// add the object in the model once the add dialog has finished.
final IlvApplyObject applier2 = new IlvApplyObject() {
Override
public void apply(IlvGraphic obj, Object node) {
model.addObject(node, group, null);
model.getID(node);
applier.apply(obj, node);
}
};
if (customAddPanel == null) {
// create the component to manage symbol edition/creation GUI
customAddPanel = new PaletteSymbologyEditPanel(getView().getSymbologyEngine(), getPaletteManager(),
getLatLonPicker());
JComponent palettePanel = customAddPanel.getMainPanel();
if (!useDialog) {
// create a palette selection panel
JToolBar buttonPanel = new JToolBar();
// close panel button
JButton close = new JButton(
IlvMapUtil.getString(PaletteSymbologyTreeViewActions.class, "PaletteSymbologyTreeViewActions.closeLabel")); //$NON-NLS-1$
close.setToolTipText(
IlvMapUtil.getString(PaletteSymbologyTreeViewActions.class, "PaletteSymbologyTreeViewActions.closeTip")); //$NON-NLS-1$
try {
Image image = IlvImageUtil.getImageFromFile(PaletteSymbologyTreeViewActions.class, "/icons/close_icon.gif"); //$NON-NLS-1$
close.setIcon(new ImageIcon(image));
} catch (IOException e1) {
// ignore
}
close.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
customAddPanel.getMainPanel().setVisible(false);
}
});
// add symbol button
final JButton add = new JButton(
IlvMapUtil.getString(PaletteSymbologyTreeViewActions.class, "PaletteSymbologyTreeViewActions.addLabel")); //$NON-NLS-1$
add.setToolTipText(
IlvMapUtil.getString(PaletteSymbologyTreeViewActions.class, "PaletteSymbologyTreeViewActions.addTip")); //$NON-NLS-1$
try {
Image image = IlvImageUtil.getImageFromFile(PaletteSymbologyTreeViewActions.class,
"/ilog/views/maps/symbology/swing/images/add.gif"); //$NON-NLS-1$
add.setIcon(new ImageIcon(image));
} catch (IOException e1) {
// ignore
}
add.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
customAddPanel.createSelectedSymbol(getView(), applier2);
}
});
add.setEnabled(false);
// Palette unload button
/*
* Uncomment this if you want to provide an unload palette button. final
* JButton pbb = new
* JButton(IlvMapUtil.getString(PaletteSymbologyTreeViewActions.class,
* "PaletteSymbologyTreeViewActions.removePalette")); //$NON-NLS-1$
* pbb.setToolTipText(IlvMapUtil.getString(
* PaletteSymbologyTreeViewActions.class,
* "PaletteSymbologyTreeViewActions.removePaletteTip")); //$NON-NLS-1$
* try { Image image =
* IlvImageUtil.getImageFromFile(PaletteSymbologyTreeViewActions.class,
* "/icons/removepalette.gif"); //$NON-NLS-1$ pbb.setIcon(new
* ImageIcon(image)); } catch (IOException e1) { // ignore }
* pbb.addActionListener(new ActionListener() { public void
* actionPerformed(ActionEvent e) { IlvPalette
* palette=customAddPanel.getSelectionPaletteViewer().getSelectedPalette
* (); if(palette!=null) { // TODO we should test here that the palette
* is no longer used or this may cause problem at reload time
* paletteManager.remove(palette); } } });
*
*/
// manage palette selection to enable/disable add button
customAddPanel.getSelectionPaletteViewer().addPropertyChangeListener("current_palette", //$NON-NLS-1$
new PropertyChangeListener() {
Override
public void propertyChange(PropertyChangeEvent evt) {
// pbb.setEnabled(evt.getNewValue()!=null);
add.setEnabled(false);
}
});
// manage symbol/group selection to enable/disable add button
customAddPanel.getSelectionPaletteViewer().addPaletteViewerListener(new PaletteViewerListener() {
Override
public void categoryDeselected(PaletteViewerEvent evt) {
add.setEnabled(false);
}
Override
public void categorySelected(PaletteViewerEvent evt) {
add.setEnabled(false);
}
Override
public void symbolDeselected(PaletteViewerEvent evt) {
add.setEnabled(false);
}
Override
public void symbolSelected(PaletteViewerEvent evt) {
add.setEnabled(true);
}
});
// Palette load button
JButton pba = new JButton(new IlvPaletteLoadAction(palettePanel, getPaletteManager()));
Insets insets = new Insets(0, 0, 0, 0);
close.setMargin(insets);
add.setMargin(insets);
pba.setMargin(insets);
// pbb.setMargin(insets);
buttonPanel.add(add);
buttonPanel.add(pba);
// buttonPanel.add(pbb);
buttonPanel.add(new JComponent() {/* empty separator */
});
buttonPanel.add(close);
buttonPanel.setFloatable(false);
palettePanel.add(buttonPanel, BorderLayout.SOUTH);
palettePanel.setBorder(BorderFactory.createLoweredBevelBorder());
// add the panel in the tree view.
getView().add(palettePanel, new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0, GridBagConstraints.WEST,
GridBagConstraints.BOTH, insets, 0, 0));
getView().updateUI();
} else {
// add the load palette button to the dialog
JButton pb = new JButton(new IlvPaletteLoadAction(palettePanel, getPaletteManager()));
palettePanel.add(pb, BorderLayout.SOUTH);
}
}
// we are creating a new symbol
customAddPanel.setSymbol(null);
if (useDialog) {
// show the dialog
customAddPanel.showDialog(getView(), applier2);
} else {
// make the panel visible
customAddPanel.getMainPanel().setVisible(true);
}
}
/**
* Returns true
*
* @see ilog.views.maps.symbology.swing.IlvSymbologyTreeViewActions#isCreateSymbolEnabled(IlvSDMModel)
*/
Override
public boolean isCreateSymbolEnabled(IlvSDMModel model) {
return true;
}
/**
* Shows an symbol edition dialog
*
* @see ilog.views.maps.symbology.swing.IlvSymbologyTreeViewActions#editSymbol(IlvSDMModel,
* java.lang.Object, ilog.views.IlvApplyObject)
*/
Override
public void editSymbol(IlvSDMModel model, Object node, IlvApplyObject applier) {
if (customAddPanel == null) {
customAddPanel = new PaletteSymbologyEditPanel(getView().getSymbologyEngine(), getPaletteManager(),
getLatLonPicker());
}
customAddPanel.setSymbol(node);
customAddPanel.showDialog(getView(), applier);
}
/**
* Returns true
*
* @see ilog.views.maps.symbology.swing.IlvSymbologyTreeViewActions#isEditSymbolEnabled(IlvSDMModel)
*/
Override
public boolean isEditSymbolEnabled(IlvSDMModel model) {
return true;
}
/**
* Duplicates the symbol
*
* @see ilog.views.maps.symbology.swing.IlvSymbologyTreeViewActions#duplicateSymbol(IlvSDMModel,
* java.lang.Object)
*/
Override
public Object duplicateSymbol(IlvSDMModel model, Object node) {
IlvSDMNode src = (IlvSDMNode) node;
// create a new symbol with the same tag
IlvSDMNode rtn = (IlvSDMNode) model.createNode(src.getTag());
String[] names = src.getPropertyNames();
// add the object in the model
model.addObject(rtn, model.getParent(src), null);
// copy all the properties
for (int i = 0; i < names.length; i++) {
model.setObjectProperty(rtn, names[i], src.getProperty(names[i]));
}
model.getID(rtn);
return rtn;
}
/**
* {@inheritDoc} This method expects dropped data that is an instance of
* {link IlvPaletteDragAndDropData}.
*/
Override
public Object dropSymbolAt(IlvSDMModel model, Object data, Double lonRad, Double latRad) {
if (data instanceof IlvPaletteDragAndDropData) {
IlvPaletteDragAndDropData pdd = (IlvPaletteDragAndDropData) data;
// get the symbol definition
IlvPaletteObject po = pdd.getPaletteObject();
if (po instanceof IlvPaletteSymbol) {
IlvPaletteSymbol paletteSymbol = (IlvPaletteSymbol) po;
model.setAdjusting(true);
// create a new symbol
Object currentNode = newSymbol(paletteSymbol.getFullID());
// add it into the model
model.addObject(currentNode, null, null);
model.getID(currentNode);
// set its default properties
SDMPaletteSymbolCreator.setupSymbol(currentNode, model, paletteSymbol, lonRad, latRad);
model.setAdjusting(false);
if (customAddPanel != null && customAddPanel._paletteDialog != null) {
customAddPanel._paletteDialog.setVisible(false);
}
return currentNode;
}
}
return null;
}
/**
* Returns true
*
* @see ilog.views.maps.symbology.swing.IlvSymbologyTreeViewActions#isDuplicateSymbolEnabled(IlvSDMModel)
*/
Override
public boolean isDuplicateSymbolEnabled(IlvSDMModel model) {
return true;
}
/**
* Sets the locator to use to pick a point interactively.
*
* @param locator
* locator to use.
*/
public void setLatLonPicker(IlvSymbolLocationEditor locator) {
this.locator = locator;
}
/**
* Returns the locator used.
*
* @return the locator used.
*/
public IlvSymbolLocationEditor getLatLonPicker() {
return locator;
}
/**
* The string displayed in the menu
*
* @see CombinedTreeViewActions {@inheritDoc}
* @see java.lang.Object#toString()
*/
Override
public String toString() {
return IlvMapUtil.getString(PaletteSymbologyTreeViewActions.class, "PaletteSymbologyTreeViewActions.symbolType"); //$NON-NLS-1$
}
/**
* Retrieve the persistent context attached to these actions {@inheritDoc}
*
* @see ilog.views.maps.symbology.swing.IlvPersistentSDMNodeFactory#getPersistentContext()
*/
Override
public IlvPersistentObject getPersistentContext() {
if (!hasPaletteManager() || getPaletteManager().getPaletteCount() == 0) {
return null;
}
String urls[] = new String[getPaletteManager().getPaletteCount() - 1];
if (urls.length == 0)
return null;
for (int i = 0; i < urls.length; i++) {
IlvPalette palette = getPaletteManager().getPalette(i + 1);
urls[i] = palette.getJarURL().toExternalForm();
}
return new PaletteContext(urls);
}
/**
* Sets the persistent context for these actions: this means loading the saved
* palettes. {@inheritDoc}
*
* @see ilog.views.maps.symbology.swing.IlvPersistentSDMNodeFactory#setPersistentContext(ilog.views.io.IlvPersistentObject)
*/
Override
public void setPersistentContext(IlvPersistentObject context) {
if (context instanceof PaletteContext) {
PaletteContext paletteContext = (PaletteContext) context;
for (int i = 0; i < paletteContext.paletteURLs.length; i++) {
try {
URL url = IlvMapDataPathManager.ResolveURL(paletteContext.paletteURLs[i]);
getPaletteManager().load(url);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* At read time, we do not want the saved property information (a string) to
* replace the symbol definition set in {@link #newSymbol(String)}
* {@inheritDoc}
*
* @see ilog.views.maps.symbology.swing.IlvPersistentSDMNodeFactory#isPropertyIgnored(ilog.views.sdm.IlvSDMModel,
* java.lang.Object, java.lang.String)
*/
Override
public boolean isPropertyIgnored(IlvSDMModel model, Object node, String propertyName) {
if (SYMBOLINFO_PROPERTY_NAME.equals(propertyName))
return true;
return false;
}
}