/*
* Copyright (C) 2014 Alec Dhuse
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package co.foldingmap;
import co.foldingmap.map.MapObject;
import co.foldingmap.map.MapPanel;
import co.foldingmap.map.DigitalMap;
import co.foldingmap.map.MapAccepter;
import co.foldingmap.map.Layer;
import co.foldingmap.map.vector.NetworkLayer;
import co.foldingmap.map.vector.VectorLayer;
import co.foldingmap.map.vector.PhotoPoint;
import co.foldingmap.map.vector.VectorObjectList;
import co.foldingmap.map.vector.VectorObject;
import co.foldingmap.actions.ExportLayer;
import co.foldingmap.actions.Actions;
import co.foldingmap.actions.AddGroundOverlay;
import co.foldingmap.actions.AddNetworkLayer;
import co.foldingmap.actions.MergeToPolygon;
import co.foldingmap.actions.MergeToMultiGeometry;
import co.foldingmap.actions.ChangeObjectZOrder;
import co.foldingmap.actions.MergeToLineString;
import co.foldingmap.actions.MergeToLinearRing;
import co.foldingmap.actions.AddVectorLayer;
import co.foldingmap.GUISupport.HeatMapProperties;
import co.foldingmap.GUISupport.DataSheetPanel;
import co.foldingmap.GUISupport.TileLayerProperties;
import co.foldingmap.GUISupport.Updateable;
import co.foldingmap.GUISupport.ProgressBarPanel;
import co.foldingmap.GUISupport.LayerMenuItem;
import co.foldingmap.GUISupport.ObjectDetailsToolBar;
import co.foldingmap.GUISupport.panels.MapPropertiesPanel;
import co.foldingmap.GUISupport.panels.VectorLayerPropertiesPanel;
import co.foldingmap.GUISupport.panels.PhotoExtendedOptionsPanel;
import co.foldingmap.GUISupport.panels.DefaultExtendedOptionsPanel;
import co.foldingmap.GUISupport.panels.ExtendedOptionsPanel;
import co.foldingmap.GUISupport.panels.NetworkLayerPropertiesPanel;
import co.foldingmap.GUISupport.panels.BubbleChartProperties;
import co.foldingmap.GUISupport.components.PopupMenuButton;
import co.foldingmap.GUISupport.components.checkBoxTree.CheckedTreeNode;
import co.foldingmap.GUISupport.components.checkBoxTree.LayersTree;
import co.foldingmap.map.tile.TileLayer;
import co.foldingmap.map.tile.TileMath;
import co.foldingmap.map.visualization.HeatMap;
import co.foldingmap.mapImportExport.FmXmlImporter;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.text.DecimalFormat;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
/**
* This class is the main program window the user interacts with.
*
* @author Alec
*/
public class MainWindow extends JFrame
implements ActionListener,
MapAccepter,
MenuListener,
MouseListener,
MouseMotionListener,
MouseWheelListener,
Updateable,
WindowListener {
private Actions actions;
private ButtonGroup buttonGroupMapTools;
private LayersTree treeLayers;
private CheckedTreeNode rootLayerNode;
private DataSheetPanel dataSheetPanel;
private DecimalFormat decimalFormat, zoomFormat;
private DefaultTreeModel layersDefaultTreeModel;
private ExtendedOptionsPanel extendedOptionsPanel;
private JButton buttonCloseLayerToolbar, buttonCloseOptionToolbar, buttonRemoveLayer;
private JButton buttonConnectObject, buttonUnmerge;
private JCheckBoxMenuItem menuItemHelpLanguageEnglish, menuItemHelpLanguageFrench;
private JCheckBoxMenuItem menuItemViewMapTools, menuItemViewLayers, menuItemViewMapOverview;
private JCheckBoxMenuItem menuItemViewObjectData, menuItemViewObjectDetails, menuItemViewStatusBar;
private JCheckBoxMenuItem menuItemLayersLockLayer;
private JLabel labelLayersCaption, labelMouseCoordinates, labelExtendedOptions;
private JMenu menuEdit, menuFile, menuHelp, menuMap, menuTools, menuView;
private JMenu menuFileImport, menuFileExport, menuHelpLanguage;
private JMenu menuLayersMergeLayer;
private JMenu menuMapAddObject, menuMapOrder;
private JMenu menuMapModifyOrder, menuMapModifyMoveToLayer;
private JMenuBar mainMenuBar;
private JMenuItem menuItemAddNetworkLayer, menuItemAddVectorLayer;
private JMenuItem menuItemFileOpen, menuItemFileNew, menuItemFileQuit, menuItemFileSave, menuItemFileSaveAs, menuItemFilePrint;
private JMenuItem menuItemFileImportData, menuItemFileImportMap, menuItemFileImportGeotaggedPhotos;
private JMenuItem menuItemFileExportImage, menuItemFileExportTiles, menuItemFileExportMap;
private JMenuItem menuItemEditRedo, menuItemEditUndo, menuItemEditCopy, menuItemEditCut, menuItemEditPaste, menuItemEditDelete;
private JMenuItem menuItemEditFind, menuItemEditDeselect;
private JMenuItem menuItemMapAddImageOverlay, menuItemMapAddLinearObject, menuItemMapAddPoint, menuItemMapAddPolygon;
private JMenuItem menuItemMapCrop, menuItemMapProperties;
private JMenuItem menuItemMapOrderMoveToFront, menuItemMapOrderMoveToBack, menuItemMapOrderMoveForward, menuItemMapOrderMoveBackward;
private JMenuItem menuItemToolsCreateBubbleChart, menuItemToolsCreateHeatMap, menuItemToolsDataCatalog, menuItemToolsGPS;
private JMenuItem menuItemHelpAbout;
private JMenuItem menuItemMapModifyAddMapPoint, menuItemMapModifyAddObjectPoint, menuItemMapModifyDeleteObjectPoint, menuItemMapModifySplitObject;
private JMenuItem menuItemMapModifyCopy, menuItemMapModifyPaste, menuItemMapModifyDelete, menuItemMapModifyProperties;
private JMenuItem menuItemMapModifyOrderToFront, menuItemMapModifyOrderToBack, menuItemMapModifyOrderForward, menuItemMapModifyOrderBackward;
private JMenuItem menuItemMapNormalCut, menuItemMapNormalCopy, menuItemMapNormalPaste, menuItemMapNormalDelete, menuItemMapNormalNewPoint, menuItemMapNormalProperties;
private JMenuItem menuItemMergeLineString, menuItemMergeLinearRing, menuItemMergePolygon, menuItemMergeLogicalGroup;
private JMenuItem menuItemLayersDeleteLayers, menuItemLayersLayerProperties, menuItemMoveToLayerNewLayer, menuItemLayersMoveUp, menuItemLayersMoveDown, menuItemLayersSaveLayer;
private JMenuItem menuItemLayerItemCopy, menuItemLayerItemCut, menuItemLayerDelete, menuItemLayerProperties;
private JPanel panelMeasure, panelMouseCoordinates, panelRightDoc, panelStatusBar;
private JPanel panelLayerButtons, panelLayerCenter, panelLayerNorth;
private JPanel panelMainCenter, panelExtendedOptionsNorth;
private JPopupMenu popupMenuLayers, popupMenuLayerItem, popupMenuMapNormal, popupMenuMapModifyPoints;
private JScrollPane spaneLayers;
private JToggleButton tbuttonArrowTool, tbuttonModifyPoints, tbuttonSelectTool, tbuttonTrace;
private JToolBar mapToolsBar, toolbarExtendedOptions, toolbarLayers;
private MapPanel mapPanel;
private MapPropertiesPanel mapPropertiesPanel;
private ObjectDetailsToolBar objectDetailsToolBar;
private Popup visibilityPopup;
private PopupMenuButton buttonAddLayer, buttonMergeObjects;
private ProgressBarPanel panelProgressBar;
private ResourceHelper helper;
private Toolkit awtToolKit;
private UserConfig config;
public MainWindow(UserConfig config) {
super("Folding Map");
try {
init();
setupToolbar();
addListeners();
this.setIconImage(helper.getBufferedImage("folding_map-32.png"));
this.config = config;
if (System.getProperty("os.name").equalsIgnoreCase("Mac OS X")) {
// com.apple.eawt.Application macApp = com.apple.eawt.Application.getApplication();
// macApp.setDockIconImage(helper.getBufferedImage("folding_map-32.png"));
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setExtendedState(this.getExtendedState()|JFrame.MAXIMIZED_BOTH);
this.setVisible(true);
tbuttonArrowTool.requestFocus();
this.repaint();
openDefaulMap();
WelcomeDialog welcomeDialog = new WelcomeDialog(this, config);
updateExtendedOptions();
} catch (Exception e) {
System.err.println("Error in MainWindow Constructor(UserConfig) - " + e);
}
}
@Override
public void actionPerformed(ActionEvent ae) {
try {
if (ae.getSource() == null) {
} else if (ae.getSource() == buttonAddLayer) {
} else if (ae.getSource() == buttonCloseLayerToolbar) {
} else if (ae.getSource() == buttonCloseOptionToolbar) {
} else if (ae.getSource() == buttonConnectObject) {
actions.connectLinearObject(mapPanel.getMap());
} else if (ae.getSource() == buttonRemoveLayer) {
} else if (ae.getSource() == buttonUnmerge) {
actions.Unmerge(mapPanel.getMap());
} else if (ae.getSource() == menuItemEditCopy) {
ClipboardOperations.copyMapObjects(mapPanel.getMap(), new VectorObjectList<VectorObject>(mapPanel.getMap().getSelectedObjects()));
} else if (ae.getSource() == menuItemEditCut) {
actions.cutSelectedObjects(mapPanel.getMap());
} else if (ae.getSource() == menuItemEditDelete) {
actions.deleteSelectedObjects(mapPanel.getMap());
updateObjectDetailsToolBar();
updateExtendedOptions();
} else if (ae.getSource() == menuItemEditDeselect) {
mapPanel.getMap().deselectObjects();
objectDetailsToolBar.update();
updateExtendedOptions();
} else if (ae.getSource() == menuItemEditFind) {
} else if (ae.getSource() == menuItemEditPaste) {
actions.paste(this, mapPanel.getMap());
} else if (ae.getSource() == menuItemEditRedo) {
actions.redo();
} else if (ae.getSource() == menuItemEditUndo) {
actions.undo();
} else if (ae.getSource() == menuItemFileExportImage) {
ExportImageDialog eid = new ExportImageDialog(this,mapPanel.getMap());
} else if (ae.getSource() == menuItemFileExportMap) {
actions.saveMapAs(this, mapPanel.getMap(), this.panelProgressBar);
} else if (ae.getSource() == menuItemFileExportTiles) {
TileExportDialog tileDialog = new TileExportDialog(this, mapPanel.getMap());
} else if (ae.getSource() == menuItemFileImportGeotaggedPhotos) {
actions.importGeotaggedPhotos(this, mapPanel.getMap());
} else if (ae.getSource() == menuItemFileImportData) {
DataImportWizardDialog dWiz = new DataImportWizardDialog(this, mapPanel.getMap());
} else if (ae.getSource() == menuItemFileImportMap) {
actions.importMap(this, mapPanel.getMap());
this.update();
} else if (ae.getSource() == menuItemFileNew) {
openDefaulMap();
} else if (ae.getSource() == menuItemFileOpen) {
actions.openMap(this, mapPanel);
} else if (ae.getSource() == menuItemFileQuit) {
//TODO: Add code to see if the map has changes and ask ot save
this.dispose();
} else if (ae.getSource() == menuItemFilePrint) {
} else if (ae.getSource() == menuItemFileSave) {
actions.saveMap(this, mapPanel.getMap(), this.panelProgressBar);
} else if (ae.getSource() == menuItemFileSaveAs) {
actions.saveMapAs(this, mapPanel.getMap(), this.panelProgressBar);
} else if (ae.getSource() == menuItemHelpLanguageEnglish) {
} else if (ae.getSource() == menuItemHelpLanguageFrench) {
} else if (ae.getSource() == menuItemLayerProperties) {
//Get the selected object and show correct properties for it
Object o = treeLayers.getSelectedNodeObject();
if (o instanceof VectorObject)
new MapObjectPropertiesWindow(this, (VectorObject) o);
} else if (ae.getSource() == menuItemLayersDeleteLayers) {
actions.deleteSelectedLayer(this, mapPanel.getMap());
this.updateLayersTree();
} else if (ae.getSource() == menuItemLayersLayerProperties) {
Layer selectedLayer = mapPanel.getMap().getSelectedLayer();
if (selectedLayer instanceof HeatMap) {
LayerProperties lp = new LayerProperties(this, new HeatMapProperties(mapPanel.getMap(), (HeatMap) selectedLayer));
} else if (selectedLayer instanceof NetworkLayer) {
LayerProperties layerPropDialog = new LayerProperties(this);
NetworkLayerPropertiesPanel netLayerProps = new NetworkLayerPropertiesPanel(this, layerPropDialog, (NetworkLayer) selectedLayer);
layerPropDialog.setLayerPanel(netLayerProps);
layerPropDialog.setVisible(true);
} else if (selectedLayer instanceof TileLayer) {
LayerProperties lp = new LayerProperties(this, new TileLayerProperties(mapPanel.getMap(), (TileLayer) selectedLayer));
} else if (selectedLayer instanceof VectorLayer) {
LayerProperties lp = new LayerProperties(this, new VectorLayerPropertiesPanel((VectorLayer) selectedLayer));
}
} else if (ae.getSource() == menuItemLayersLockLayer) {
Layer layer = mapPanel.getMap().getSelectedLayer();
layer.setLocked(!layer.isLocked());
} else if (ae.getSource() == menuItemMapModifyProperties) {
VectorObjectList<VectorObject> objects = new VectorObjectList<VectorObject>(mapPanel.getMap().getSelectedObjects());
if (objects.size() == 0) {
MapPropertiesWindow pw = new MapPropertiesWindow(this, mapPanel.getMap());
} else if (objects.size() == 1) {
MapObjectPropertiesWindow mopw = new MapObjectPropertiesWindow(this, objects.get(0));
}
} else if (ae.getSource() == menuItemMoveToLayerNewLayer) {
} else if (ae.getSource() instanceof LayerMenuItem) {
LayerMenuItem layerMenuItem = (LayerMenuItem) ae.getSource();
if (layerMenuItem.getActionString().equals("Merge")) {
//Merging one layer to another.
actions.mergeLayer(mapPanel.getMap(), mapPanel.getMap().getSelectedLayer(), layerMenuItem.getLayer());
} else if (layerMenuItem.getActionString().equals("Change Layer")) {
//TODO: Finish this part
}
this.update();
} else if (ae.getSource() == menuItemLayersMoveUp) {
/* Move the selected layer in the map up a level, and call and
* call an upadateable (this) when finished. */
actions.moveLayerUp(mapPanel.getMap(), this);
} else if (ae.getSource() == menuItemLayersMoveDown) {
/* Move the selected layer in the map down a level, and call and
* call an upadateable (this) when finished. */
actions.moveLayerDown(mapPanel.getMap(), this);
} else if (ae.getSource() == menuItemLayersSaveLayer) {
Layer layer = mapPanel.getMap().getSelectedLayer();
ExportLayer.export(this, mapPanel.getMapView().getMapProjection(), layer);
} else if (ae.getSource() == menuItemMapAddImageOverlay) {
AddGroundOverlay addGroundOverlay;
addGroundOverlay = new AddGroundOverlay(this, mapPanel.getMap(), mapPanel.getMapView());
actions.performAction(addGroundOverlay);
} else if (ae.getSource() == menuItemMapAddLinearObject) {
} else if (ae.getSource() == menuItemMapAddPoint) {
} else if (ae.getSource() == menuItemMapAddPolygon) {
} else if (ae.getSource() == menuItemMapCrop) {
actions.cropMap(mapPanel.getMap(), (mapPanel.getMap().getLastMapView().getViewBounds()));
} else if (ae.getSource() == menuItemMapModifyAddMapPoint) {
actions.addMapPoint(mapPanel.getMap());
} else if (ae.getSource() == menuItemMapModifyAddObjectPoint) {
actions.addPointToObject(mapPanel.getMap(), mapPanel.getCoordinateAtMouseLocation());
} else if (ae.getSource() == menuItemMapModifyCopy) {
ClipboardOperations.copyMapObjects(mapPanel.getMap(), new VectorObjectList<VectorObject>(mapPanel.getMap().getSelectedObjects()));
} else if (ae.getSource() == menuItemMapModifyDelete) {
actions.deleteSelectedObjects(mapPanel.getMap());
updateObjectDetailsToolBar();
updateExtendedOptions();
} else if (ae.getSource() == menuItemMapModifyDeleteObjectPoint) {
actions.deletePointFromObject(mapPanel.getMap());
} else if (ae.getSource() == menuItemMapModifyOrderBackward) {
actions.changeObjectZOrder(mapPanel.getMap(), ChangeObjectZOrder.BACKWARD);
} else if (ae.getSource() == menuItemMapModifyOrderForward) {
actions.changeObjectZOrder(mapPanel.getMap(), ChangeObjectZOrder.FORWARD);
} else if (ae.getSource() == menuItemMapModifyOrderToBack) {
actions.changeObjectZOrder(mapPanel.getMap(), ChangeObjectZOrder.TO_BACK);
} else if (ae.getSource() == menuItemMapModifyOrderToFront) {
actions.changeObjectZOrder(mapPanel.getMap(), ChangeObjectZOrder.TO_FRONT);
} else if (ae.getSource() == menuItemMapModifyPaste) {
actions.paste(this, mapPanel.getMap());
} else if (ae.getSource() == menuItemMapModifySplitObject) {
VectorObject object = (VectorObject) mapPanel.getMap().getSelectedObjects().get(0);
actions.splitObject(mapPanel.getMap(), object, object.getSelectedCoordinate());
} else if (ae.getSource() == menuItemMapNormalCopy) {
ClipboardOperations.copyMapObjects(mapPanel.getMap(), new VectorObjectList<VectorObject>(mapPanel.getMap().getSelectedObjects()));
} else if (ae.getSource() == menuItemMapNormalDelete) {
actions.deleteSelectedObjects(mapPanel.getMap());
updateObjectDetailsToolBar();
updateExtendedOptions();
} else if (ae.getSource() == menuItemMapNormalPaste) {
actions.paste(this, mapPanel.getMap());
} else if (ae.getSource() == menuItemMapOrderMoveBackward) {
actions.changeObjectZOrder(mapPanel.getMap(), ChangeObjectZOrder.BACKWARD);
} else if (ae.getSource() == menuItemMapOrderMoveForward) {
actions.changeObjectZOrder(mapPanel.getMap(), ChangeObjectZOrder.FORWARD);
} else if (ae.getSource() == menuItemMapProperties) {
new MapPropertiesWindow(this, mapPanel.getMap());
} else if (ae.getSource() == menuItemMapOrderMoveToBack) {
actions.changeObjectZOrder(mapPanel.getMap(), ChangeObjectZOrder.TO_BACK);
} else if (ae.getSource() == menuItemMapOrderMoveToFront) {
actions.changeObjectZOrder(mapPanel.getMap(), ChangeObjectZOrder.TO_FRONT);
} else if (ae.getSource() == menuItemMapNormalNewPoint) {
actions.addMapPoint(mapPanel.getMap());
} else if (ae.getSource() == menuItemMapNormalProperties) {
VectorObjectList<VectorObject> objects = new VectorObjectList<VectorObject>(mapPanel.getMap().getSelectedObjects());
if (objects.size() == 0) {
new MapPropertiesWindow(this, mapPanel.getMap());
} else if (objects.size() == 1) {
new MapObjectPropertiesWindow(this, objects.get(0));
}
} else if (ae.getSource() == menuItemToolsCreateBubbleChart) {
VectorLayer vectorLayer = new VectorLayer("Bubble Chart");
new LayerProperties(this, new BubbleChartProperties(actions, mapPanel.getMap(), vectorLayer));
} else if (ae.getSource() == menuItemToolsCreateHeatMap) {
new LayerProperties(this, new HeatMapProperties(mapPanel.getMap(), actions));
} else if (ae.getSource() == menuItemToolsDataCatalog) {
MapCatalogDialog mapCatalog = new MapCatalogDialog(this, mapPanel.getMap());
} else if (ae.getSource() == menuItemToolsGPS) {
} else if (ae.getSource() == menuItemViewLayers) {
} else if (ae.getSource() == menuItemViewMapOverview) {
} else if (ae.getSource() == menuItemViewMapTools) {
} else if (ae.getSource() == menuItemViewObjectData) {
if (menuItemViewObjectData.isSelected()) {
dataSheetPanel = new DataSheetPanel(mapPanel.getMap());
dataSheetPanel.setPreferredSize(new Dimension(this.getWidth(), (this.getHeight() / 5)));
dataSheetPanel.addUpdateable(objectDetailsToolBar);
dataSheetPanel.addUpdateable(mapPanel);
panelMainCenter.add(dataSheetPanel, BorderLayout.SOUTH);
} else {
panelMainCenter.remove(dataSheetPanel);
}
this.repaint();
} else if (ae.getSource() == menuItemViewObjectDetails) {
} else if (ae.getSource() == menuItemViewStatusBar) {
} else if (ae.getSource() == tbuttonArrowTool) {
mapPanel.setDragMode(MapPanel.DRAG_PAN);
} else if (ae.getSource() == tbuttonModifyPoints) {
mapPanel.setDragMode(MapPanel.MODIFY);
} else if (ae.getSource() == tbuttonSelectTool) {
mapPanel.setDragMode(MapPanel.DRAG_SELECT);
} else if (ae.getSource() == tbuttonTrace) {
mapPanel.setDragMode(MapPanel.TRACE);
} else if (ae.getActionCommand().equals("Move To Layer")) {
JMenuItem menuItem = (JMenuItem) ae.getSource();
actions.moveObjectsToLayer(mapPanel.getMap(), menuItem.getText(), new VectorObjectList<VectorObject>(mapPanel.getMap().getSelectedObjects()));
}
mapPanel.repaint();
} catch (Exception e) {
Logger.log(Logger.ERR, "Error in MainWindow.actionPerformed(ActionEvent) - " + e);
}
}
/**
* Adds a new layer to the layer sidebar
*
* @param newLayer The new layer to be added.
* @param newLayerNumber A reference to the layer's position in the digital map's layer vector.
*/
public void addLayer(Layer newLayer, int newLayerNumber) {
CheckedTreeNode newNode;
newNode = new CheckedTreeNode(newLayer);
newNode.setSelected(newLayer.isVisible());
newNode.setLayerNumber(newLayerNumber);
rootLayerNode.add(newNode);
layersDefaultTreeModel.reload(rootLayerNode);
this.repaint();
}
/**
* Adds all layers contained in the supplied vector to the layer sidebar
*
* @param layers A Vector containing one or more Layer objects.
*/
public void addLayers(ArrayList<Layer> layers) {
CheckedTreeNode newNode;
Layer currentLayer;
if (layers.size() > 0) {
for (int i = 0; i < layers.size(); i++) {
currentLayer = layers.get(i);
newNode = new CheckedTreeNode(currentLayer);
newNode.setSelected(currentLayer.isVisible());
newNode.setLayerNumber(i);
rootLayerNode.add(newNode);
}
treeLayers.expandRow(0);
treeLayers.setSelectionRow(1);
treeLayers.setRootVisible(false);
layersDefaultTreeModel.reload(rootLayerNode);
this.repaint();
} else {
ArrayList<Layer> defaultLayers = new ArrayList<Layer>();
defaultLayers.add(new VectorLayer("Default"));
addLayers(defaultLayers);
}
}
/**
* Add action listeners to all components that have actions
*
*/
private void addListeners() {
try {
this.addWindowListener(this);
mapPanel.addMouseWheelListener(this);
mapPanel.addMouseListener(this);
mapPanel.addMouseMotionListener(this);
//
objectDetailsToolBar.addKeyListener(mapPanel);
//objectDetailsToolBar.addUpdateable(dataSheetPanel);
//File Menu
menuItemFileNew.addActionListener(this);
menuItemFileOpen.addActionListener(this);
menuItemFilePrint.addActionListener(this);
menuItemFileQuit.addActionListener(this);
menuItemFileSave.addActionListener(this);
menuItemFileSaveAs.addActionListener(this);
menuItemFileExportImage.addActionListener(this);
menuItemFileExportTiles.addActionListener(this);
menuItemFileImportData.addActionListener(this);
menuItemFileImportGeotaggedPhotos.addActionListener(this);
menuItemFileImportMap.addActionListener(this);
menuItemFileExportMap.addActionListener(this);
//Edit Menu
menuEdit.addMenuListener(this);
menuItemEditUndo.addActionListener(this);
menuItemEditRedo.addActionListener(this);
menuItemEditCopy.addActionListener(this);
menuItemEditCut.addActionListener(this);
menuItemEditPaste.addActionListener(this);
menuItemEditDelete.addActionListener(this);
menuItemEditFind.addActionListener(this);
menuItemEditDeselect.addActionListener(this);
//Map Menu
menuItemMapAddImageOverlay.addActionListener(this);
menuItemMapAddPoint.addActionListener(this);
menuItemMapAddLinearObject.addActionListener(this);
menuItemMapAddPolygon.addActionListener(this);
menuItemMapProperties.addActionListener(this);
menuItemMapCrop.addActionListener(this);
menuItemMapOrderMoveToFront.addActionListener(this);
menuItemMapOrderMoveToBack.addActionListener(this);
menuItemMapOrderMoveForward.addActionListener(this);
menuItemMapOrderMoveBackward.addActionListener(this);
//Tools Menu
menuItemToolsDataCatalog.addActionListener(this);
menuItemToolsCreateBubbleChart.addActionListener(this);
menuItemToolsCreateHeatMap.addActionListener(this);
menuItemToolsGPS.addActionListener(this);
//View Menu
menuItemViewMapTools.addActionListener(this);
menuItemViewLayers.addActionListener(this);
menuItemViewMapOverview.addActionListener(this);
menuItemViewObjectData.addActionListener(this);
menuItemViewObjectDetails.addActionListener(this);
menuItemViewStatusBar.addActionListener(this);
//help menu
menuItemHelpLanguageEnglish.addActionListener(this);
menuItemHelpLanguageFrench.addActionListener(this);
menuItemHelpAbout.addActionListener(this);
//Toolbar
tbuttonArrowTool.addActionListener(this);
tbuttonModifyPoints.addActionListener(this);
tbuttonSelectTool.addActionListener(this);
tbuttonTrace.addActionListener(this);
buttonConnectObject.addActionListener(this);
buttonUnmerge.addActionListener(this);
tbuttonArrowTool.addKeyListener(mapPanel);
tbuttonModifyPoints.addKeyListener(mapPanel);
tbuttonSelectTool.addKeyListener(mapPanel);
buttonMergeObjects.addKeyListener(mapPanel);
buttonConnectObject.addKeyListener(mapPanel);
buttonMergeObjects.addUpdate(mapPanel);
buttonMergeObjects.addUpdate(objectDetailsToolBar);
//Modify Points Popup Menu
menuItemMapModifyAddMapPoint.addActionListener(this);
menuItemMapModifyOrderToFront.addActionListener(this);
menuItemMapModifyOrderForward.addActionListener(this);
menuItemMapModifyOrderBackward.addActionListener(this);
menuItemMapModifyOrderToBack.addActionListener(this);
menuItemMapModifyAddObjectPoint.addActionListener(this);
menuItemMapModifyDeleteObjectPoint.addActionListener(this);
menuItemMapModifySplitObject.addActionListener(this);
menuItemMapModifyCopy.addActionListener(this);
menuItemMapModifyPaste.addActionListener(this);
menuItemMapModifyDelete.addActionListener(this);
menuItemMapModifyProperties.addActionListener(this);
//Normal Map Popup Menu
menuItemMapNormalCut.addActionListener(this);
menuItemMapNormalCopy.addActionListener(this);
menuItemMapNormalPaste.addActionListener(this);
menuItemMapNormalDelete.addActionListener(this);
menuItemMapNormalNewPoint.addActionListener(this);
menuItemMapNormalProperties.addActionListener(this);
//Layers Tree
buttonAddLayer.addActionListener(this);
buttonRemoveLayer.addActionListener(this);
//Layers Popup Menu
treeLayers.addMouseListener(this);
menuItemLayersDeleteLayers.addActionListener(this);
menuItemLayersLayerProperties.addActionListener(this);
menuItemMoveToLayerNewLayer.addActionListener(this);
menuItemLayersMoveUp.addActionListener(this);
menuItemLayersMoveDown.addActionListener(this);
menuItemLayersSaveLayer.addActionListener(this);
menuItemLayersLockLayer.addActionListener(this);
//Layers Vector Object
menuItemLayerItemCopy.addActionListener(this);
menuItemLayerItemCut.addActionListener(this);
menuItemLayerDelete.addActionListener(this);
menuItemLayerProperties.addActionListener(this);
//Misc
buttonCloseLayerToolbar.addActionListener(this);
buttonCloseOptionToolbar.addActionListener(this);
mapPanel.addUpdateable(objectDetailsToolBar);
mapPanel.addUpdateable(dataSheetPanel);
} catch (Exception e) {
System.err.println("Error in MainWindow.addActionListener() - " + e);
}
}
/**
* Returns the MapPanel Used by this Window.
*
* @return
*/
public MapPanel getMapPanel() {
return this.mapPanel;
}
/**
* Returns the ProgressBarPanel, this is to be used for any task that takes
* more than a second to execute.
*
* @return
*/
public ProgressBarPanel getProgressBarPanel() {
return this.panelProgressBar;
}
/**
* Returns the user config object.
*
*/
public UserConfig getUserConfig() {
return config;
}
/**
* Hides all popups for this window.
*/
public void hideAllPopups() {
popupMenuMapNormal.setVisible(false);
popupMenuMapModifyPoints.setVisible(false);
popupMenuLayers.setVisible(false);
popupMenuLayerItem.setVisible(false);
buttonMergeObjects.hidePopup();
hideVisibilityPopup();
}
/**
* Hide the object visibility options popup panel.
*/
public void hideVisibilityPopup() {
if (visibilityPopup != null) {
visibilityPopup.hide();
visibilityPopup = null;
}
}
private void init() {
try {
helper = ResourceHelper.getInstance();
//init objects
rootLayerNode = new CheckedTreeNode("Layers");
awtToolKit = Toolkit.getDefaultToolkit();
buttonAddLayer = new PopupMenuButton(helper.getImage("add.png"), this.actions, PopupMenuButton.LEFT_CLICK);
buttonCloseLayerToolbar = new JButton(helper.getImage("x.png"));
buttonCloseOptionToolbar = new JButton(helper.getImage("x.png"));
buttonConnectObject = new JButton(helper.getImage("connect.png"));
buttonGroupMapTools = new ButtonGroup();
buttonMergeObjects = new PopupMenuButton(helper.getImage("shape_group.png"), this.actions, PopupMenuButton.LEFT_CLICK);
buttonRemoveLayer = new JButton(helper.getImage("delete.png"));
buttonUnmerge = new JButton(helper.getImage("shape_ungroup.png"));
decimalFormat = new DecimalFormat("#0.00000");
labelExtendedOptions = new JLabel("Options", SwingConstants.CENTER);
labelLayersCaption = new JLabel("Layers", SwingConstants.CENTER);
labelMouseCoordinates = new JLabel("Latitude: 0.0000 - Longitude: 0.0000");
layersDefaultTreeModel = new DefaultTreeModel(rootLayerNode);
mainMenuBar = new JMenuBar();
menuEdit = new JMenu("Edit");
menuFile = new JMenu("File");
menuFileImport = new JMenu("Import");
menuFileExport = new JMenu("Export");
menuHelp = new JMenu("Help");
menuHelpLanguage = new JMenu("Language");
menuItemAddNetworkLayer = new JMenuItem("Add Network Layer");
menuItemAddVectorLayer = new JMenuItem("Add Vector Layer");
menuItemEditRedo = new JMenuItem("Redo", helper.getImage("redo.png"));
menuItemEditUndo = new JMenuItem("Undo", helper.getImage("undo.png"));
menuItemEditCopy = new JMenuItem("Copy");
menuItemEditCut = new JMenuItem("Cut");
menuItemEditPaste = new JMenuItem("Paste");
menuItemEditFind = new JMenuItem("Find", helper.getImage("find.png"));
menuItemEditDelete = new JMenuItem("Delete");
menuItemEditDeselect = new JMenuItem("Deselect");
menuItemFileImportData = new JMenuItem("Data");
menuItemFileImportGeotaggedPhotos = new JMenuItem("Photos");
menuItemFileImportMap = new JMenuItem("Map");
menuItemFileExportImage = new JMenuItem("Image");
menuItemFileExportMap = new JMenuItem("Map");
menuItemFileExportTiles = new JMenuItem("Tiles");
menuItemFileNew = new JMenuItem("New", helper.getImage("new_map.png"));
menuItemFileOpen = new JMenuItem("Open", helper.getImage("open_map.png"));
menuItemFileQuit = new JMenuItem("Exit", helper.getImage("exit.png"));
menuItemFilePrint = new JMenuItem("Print", helper.getImage("print.png"));
menuItemFileSave = new JMenuItem("Save", helper.getImage("save.png"));
menuItemFileSaveAs = new JMenuItem("Save As", helper.getImage("save_as.png"));
menuItemHelpAbout = new JMenuItem("About");
menuItemHelpLanguageEnglish = new JCheckBoxMenuItem("English");
menuItemHelpLanguageFrench = new JCheckBoxMenuItem("Français");
menuItemMapCrop = new JMenuItem("Crop Map");
menuLayersMergeLayer = new JMenu("Merge Layer To");
menuMap = new JMenu("Map");
menuMapAddObject = new JMenu("Add Object");
menuMapModifyOrder = new JMenu("Order");
menuMapModifyMoveToLayer = new JMenu("Move To Layer");
menuItemMapAddLinearObject = new JMenuItem("Add Linear Object", helper.getImage("polyline.png"));
menuMapOrder = new JMenu("Object Order");
menuItemLayersDeleteLayers = new JMenuItem("Delete Layer");
menuItemLayersMoveDown = new JMenuItem("Move Down");
menuItemLayersMoveUp = new JMenuItem("Move Up");
menuItemMoveToLayerNewLayer = new JMenuItem("New Layer");
menuItemLayersLockLayer = new JCheckBoxMenuItem("Lock Layer");
menuItemLayersLayerProperties = new JMenuItem("Properties");
menuItemLayersSaveLayer = new JMenuItem("Save As");
menuItemLayerItemCopy = new JMenuItem("Copy");
menuItemLayerItemCut = new JMenuItem("Cut");
menuItemLayerDelete = new JMenuItem("Delete");
menuItemLayerProperties = new JMenuItem("Properties");
menuItemMapAddImageOverlay = new JMenuItem("Add Image Overlay", helper.getImage("image.png"));
menuItemMapAddPoint = new JMenuItem("Add Point", helper.getImage("marker.png"));
menuItemMapAddPolygon = new JMenuItem("Add Polygon", helper.getImage("polygon.png"));
menuItemMapOrderMoveToFront = new JMenuItem("Move To Front");
menuItemMapOrderMoveToBack = new JMenuItem("Move To Back");
menuItemMapOrderMoveForward = new JMenuItem("Move Forward");
menuItemMapOrderMoveBackward = new JMenuItem("Move Backward");
menuItemMapProperties = new JMenuItem("Map Properties", helper.getImage("map_edit.png"));
menuItemMapModifyAddMapPoint = new JMenuItem("Add New Point To Map");
menuItemMapModifyAddObjectPoint = new JMenuItem("Add New Point To Object");
menuItemMapModifyDeleteObjectPoint = new JMenuItem("Delete Point From Object");
menuItemMapModifySplitObject = new JMenuItem("Split Object At Point");
menuItemMapModifyCopy = new JMenuItem("Copy");
menuItemMapModifyPaste = new JMenuItem("Paste");
menuItemMapModifyDelete = new JMenuItem("Delete");
menuItemMapModifyProperties = new JMenuItem("Properties");
menuItemMapModifyOrderToFront = new JMenuItem("Move To Front");
menuItemMapModifyOrderToBack = new JMenuItem("Move To Back");
menuItemMapModifyOrderForward = new JMenuItem("Move Forward");
menuItemMapModifyOrderBackward = new JMenuItem("Move Backward");
menuItemMapNormalCut = new JMenuItem("Cut");
menuItemMapNormalCopy = new JMenuItem("Copy");
menuItemMapNormalPaste = new JMenuItem("Paste");
menuItemMapNormalDelete = new JMenuItem("Delete");
menuItemMapNormalNewPoint = new JMenuItem("New Point");
menuItemMapNormalProperties = new JMenuItem("Properties");
menuItemMergeLineString = new JMenuItem("Merge into Linear Object", helper.getImage("polyline.png"));
menuItemMergeLinearRing = new JMenuItem("Merge into Linear Ring", helper.getImage("linear_ring.png"));
menuItemMergePolygon = new JMenuItem("Merge into Polygon", helper.getImage("polygon.png"));
menuItemMergeLogicalGroup = new JMenuItem("Merge into Logical Group", helper.getImage("multi-geometry.png"));
menuItemToolsCreateBubbleChart = new JMenuItem("Create Bubble Chart");
menuItemToolsCreateHeatMap = new JMenuItem("Create Heat Map");
menuItemToolsDataCatalog = new JMenuItem("Map Catalog");
menuItemToolsGPS = new JMenuItem("GPS");
menuItemViewMapTools = new JCheckBoxMenuItem("Map Tools");
menuItemViewLayers = new JCheckBoxMenuItem("Layers");
menuItemViewMapOverview = new JCheckBoxMenuItem("Map Overview");
menuItemViewObjectData = new JCheckBoxMenuItem("Object Data");
menuItemViewObjectDetails = new JCheckBoxMenuItem("Object Details");
menuItemViewStatusBar = new JCheckBoxMenuItem("Status Bar");
menuLayersMergeLayer = new JMenu("Merge Layer To");
menuTools = new JMenu("Tools");
menuView = new JMenu("View");
mapPanel = new MapPanel();
mapPropertiesPanel = new MapPropertiesPanel(mapPanel.getMap());
mapToolsBar = new JToolBar("Map Tools", JToolBar.VERTICAL);
panelExtendedOptionsNorth = new JPanel(new BorderLayout());
panelLayerButtons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
panelLayerCenter = new JPanel(new BorderLayout());
panelLayerNorth = new JPanel(new BorderLayout());
panelMainCenter = new JPanel(new BorderLayout());
panelMeasure = new JPanel();
panelMouseCoordinates = new JPanel(new FlowLayout(FlowLayout.CENTER));
panelProgressBar = new ProgressBarPanel();
panelRightDoc = new JPanel(new GridLayout(2,1));
panelStatusBar = new JPanel(new GridLayout(1,3));
popupMenuLayers = new JPopupMenu();
popupMenuLayerItem = new JPopupMenu();
popupMenuMapNormal = new JPopupMenu();
popupMenuMapModifyPoints = new JPopupMenu();
objectDetailsToolBar = new ObjectDetailsToolBar(this);
tbuttonArrowTool = new JToggleButton(helper.getImage("cursor.png"), true);
tbuttonModifyPoints = new JToggleButton(helper.getImage("mod_points.png"));
tbuttonSelectTool = new JToggleButton(helper.getImage("select.png"));
tbuttonTrace = new JToggleButton(helper.getImage("trace_merge.png"));
toolbarExtendedOptions = new JToolBar("Extended Options", JToolBar.VERTICAL);
toolbarLayers = new JToolBar("Layers", JToolBar.VERTICAL);
treeLayers = new LayersTree(layersDefaultTreeModel);
spaneLayers = new JScrollPane(treeLayers);
zoomFormat = new DecimalFormat("#0.0");
buttonCloseLayerToolbar.setBorder(null);
buttonCloseOptionToolbar.setBorder(null);
//Setup Menu Bar
this.setJMenuBar(mainMenuBar);
//Object Layout
this.getContentPane().setLayout(new BorderLayout());
this.add(objectDetailsToolBar, BorderLayout.NORTH);
this.add(panelStatusBar, BorderLayout.SOUTH);
this.add(panelRightDoc, BorderLayout.EAST);
this.add(mapToolsBar, BorderLayout.WEST);
this.add(panelMainCenter, BorderLayout.CENTER);
//Main Center Panel
panelMainCenter.add(mapPanel, BorderLayout.CENTER);
//Layers Tree
panelRightDoc.add(toolbarLayers);
panelRightDoc.add(toolbarExtendedOptions);
treeLayers.setRootVisible(false);
buttonAddLayer.setBorder(null);
buttonRemoveLayer.setBorder(null);
treeLayers.addUpdateable(objectDetailsToolBar);
//Satatus Bar
panelMouseCoordinates.add(labelMouseCoordinates);
panelStatusBar.add(panelProgressBar);
panelStatusBar.add(panelMouseCoordinates);
panelStatusBar.add(panelMeasure);
//MapTools toolbar
mapToolsBar.add(tbuttonArrowTool);
mapToolsBar.add(tbuttonModifyPoints);
mapToolsBar.add(tbuttonSelectTool);
mapToolsBar.add(tbuttonTrace);
mapToolsBar.addSeparator();
mapToolsBar.add(buttonConnectObject);
mapToolsBar.addSeparator();
mapToolsBar.add(buttonMergeObjects);
mapToolsBar.addSeparator();
mapToolsBar.add(buttonUnmerge);
buttonGroupMapTools.add(tbuttonArrowTool);
buttonGroupMapTools.add(tbuttonModifyPoints);
buttonGroupMapTools.add(tbuttonSelectTool);
buttonGroupMapTools.add(tbuttonTrace);
//layers toolbar
toolbarLayers.setLayout(new BorderLayout());
toolbarLayers.add(panelLayerNorth, BorderLayout.NORTH);
toolbarLayers.add(panelLayerCenter, BorderLayout.CENTER);
panelLayerNorth.add(labelLayersCaption, BorderLayout.CENTER);
panelLayerNorth.add(buttonCloseLayerToolbar, BorderLayout.EAST);
panelLayerCenter.add(spaneLayers, BorderLayout.CENTER);
panelLayerCenter.add(panelLayerButtons, BorderLayout.SOUTH);
panelLayerButtons.add(buttonAddLayer);
panelLayerButtons.add(buttonRemoveLayer);
JPanel tempPanel = new JPanel();
toolbarExtendedOptions.setLayout(new BorderLayout());
panelExtendedOptionsNorth.add(labelExtendedOptions, BorderLayout.CENTER);
panelExtendedOptionsNorth.add(buttonCloseOptionToolbar, BorderLayout.EAST);
toolbarExtendedOptions.add(panelExtendedOptionsNorth, BorderLayout.NORTH);
toolbarExtendedOptions.add(tempPanel, BorderLayout.CENTER);
tempPanel.setPreferredSize(new Dimension(200, 400));
} catch (Exception e) {
System.err.println("Error in MainWindow.init() - " + e);
}
}
/**
* Operations for when the Layers Tree is clicked.
*
* @param me
*/
public void layersTreeClicked(MouseEvent me) {
CheckedTreeNode selectedCheckedTreeNode;
Layer selectedLayer;
Object selectedObject;
Object[] pathObjects;
TreePath tPath;
try {
tPath = treeLayers.getSelectionPath();
pathObjects = tPath.getPath();
selectedObject = pathObjects[pathObjects.length - 1];
//right click menu
if ((me.getButton() == MouseEvent.BUTTON3)) {
if (treeLayers.getSelectedNodeObject() instanceof Layer) {
showLayersPopupMenu(mapPanel, me.getX(), me.getY());
} else if (treeLayers.getSelectedNodeObject() instanceof VectorObject) {
popupMenuLayerItem.show(treeLayers, me.getX(), me.getY());
}
}
if (selectedObject instanceof CheckedTreeNode) {
selectedCheckedTreeNode = (CheckedTreeNode) pathObjects[pathObjects.length - 1];
selectedLayer = (Layer) selectedCheckedTreeNode.getUserObject();
if (selectedLayer != null) {
selectedLayer.setVisible(selectedCheckedTreeNode.isSelected());
mapPanel.getMap().setSelectedLayer(selectedLayer);
}
}
} catch (Exception e) {
System.err.println("Error in MainWindow.layersTreeClicked(MouseEvent) - " + e);
}
mapPanel.repaint();
}
@Override
public void menuSelected(MenuEvent me) {
if (me.getSource() == menuEdit) {
//Update Undo and Redu MenuItems to include the action description.
updateEditMenu();
}
}
@Override
public void menuDeselected(MenuEvent me) {
}
@Override
public void menuCanceled(MenuEvent me) {
}
@Override
public void mouseClicked(MouseEvent me) {
hideAllPopups();
if (me.getSource() == mapPanel) {
objectDetailsToolBar.update();
updateExtendedOptions();
} else if (me.getSource() == this.treeLayers) {
this.layersTreeClicked(me);
return;
}
if (me.getButton() == MouseEvent.BUTTON3) {
if (ClipboardOperations.getPasteDataType() != ClipboardOperations.UNKNOWN) {
menuItemMapModifyPaste.setEnabled(true);
menuItemMapNormalPaste.setEnabled(true);
} else {
menuItemMapModifyPaste.setEnabled(false);
menuItemMapNormalPaste.setEnabled(false);
}
if (mapPanel.getMap().getSelectedObjects().size() == 0) {
menuItemMapModifyDelete.setEnabled(false);
menuItemMapNormalDelete.setEnabled(false);
menuItemMapNormalCut.setEnabled(false);
menuItemMapModifyCopy.setEnabled(false);
menuMapModifyOrder.setEnabled(false);
menuMapModifyMoveToLayer.setEnabled(false);
menuItemMapModifyAddObjectPoint.setEnabled(false);
menuItemMapModifyDeleteObjectPoint.setEnabled(false);
menuItemMapModifySplitObject.setEnabled(false);
} else {
menuItemMapModifyDelete.setEnabled(true);
menuItemMapModifyCopy.setEnabled(true);
menuItemMapNormalDelete.setEnabled(true);
menuItemMapNormalCut.setEnabled(true);
menuMapModifyOrder.setEnabled(true);
menuMapModifyMoveToLayer.setEnabled(true);
menuItemMapModifyAddObjectPoint.setEnabled(true);
menuItemMapModifyDeleteObjectPoint.setEnabled(true);
menuItemMapModifySplitObject.setEnabled(true);
//Update menuMapModifyMoveToLayer to have current layers
menuMapModifyMoveToLayer.removeAll();
for (Layer l: mapPanel.getMap().getLayers()) {
if (l instanceof VectorLayer) {
JMenuItem menuItem = new JMenuItem(l.getName());
menuItem.setActionCommand("Move To Layer");
menuItem.addActionListener(this);
menuMapModifyMoveToLayer.add(menuItem);
}
}
}
if (mapPanel.getDragMode() == MapPanel.DRAG_PAN) {
popupMenuMapNormal.show(mapPanel, me.getX(), me.getY());
} else if (mapPanel.getDragMode() == MapPanel.MODIFY) {
popupMenuMapModifyPoints.show(mapPanel, me.getX(), me.getY());
} else if (mapPanel.getDragMode() == MapPanel.DRAG_SELECT) {
popupMenuMapNormal.show(mapPanel, me.getX(), me.getY());
}
}
updateMouseLocationBar(me);
}
@Override
public void mouseDragged(MouseEvent me) {
}
@Override
public void mouseEntered(MouseEvent me) {
}
@Override
public void mouseExited(MouseEvent me) {
}
@Override
public void mouseMoved(MouseEvent me) {
updateMouseLocationBar(me);
}
@Override
public void mousePressed(MouseEvent me) {}
@Override
public void mouseReleased(MouseEvent me) {}
/**
* Listens for mouse wheel moment in over this window.
*
* @param mwe
*/
@Override
public void mouseWheelMoved(MouseWheelEvent mwe) {
updateMouseLocationBar(mwe);
}
/**
* Opens the default map, used when first starting the program.
*
*/
private void openDefaulMap() {
File defaultMapFile = new File("blankmap.fmxml");
setMap(FmXmlImporter.openFile(defaultMapFile, panelProgressBar));
objectDetailsToolBar.update();
}
private void populateLayersPopupMenu() {
Layer selectedLayer;
popupMenuLayers.removeAll();
selectedLayer = mapPanel.getMap().getSelectedLayer();
//Add MenuItems specific to this layer
for (JMenuItem menuItem: selectedLayer.getContextMenuItems())
popupMenuLayers.add(menuItem);
//if we actualy added some, put a seperator in.
if (selectedLayer.getContextMenuItems().length > 0)
popupMenuLayers.addSeparator();
//Layers popup menu
popupMenuLayers.add(menuItemLayersSaveLayer);
popupMenuLayers.add(menuLayersMergeLayer);
popupMenuLayers.addSeparator();
popupMenuLayers.add(menuItemLayersMoveUp);
popupMenuLayers.add(menuItemLayersMoveDown);
popupMenuLayers.addSeparator();
popupMenuLayers.add(menuItemLayersDeleteLayers);
popupMenuLayers.add(menuItemLayersLockLayer);
popupMenuLayers.addSeparator();
popupMenuLayers.add(menuItemLayersLayerProperties);
popupMenuLayers.setInvoker(treeLayers);
}
/**
* Sets the map to be displayed in the MapPanel.
*
* @param mapData
*/
@Override
public void setMap(DigitalMap mapData) {
getMapPanel().getMap().closeMap();
mapPanel.setMap(mapData);
objectDetailsToolBar.setMap(mapData);
this.actions = mapData.getActions();
buttonMergeObjects.setActions(actions);
buttonMergeObjects.removeAllMenuItems();
buttonMergeObjects.add(menuItemMergeLineString, new MergeToLineString(mapPanel.getMap(), objectDetailsToolBar));
buttonMergeObjects.add(menuItemMergeLinearRing, new MergeToLinearRing(mapPanel.getMap(), objectDetailsToolBar));
buttonMergeObjects.add(menuItemMergePolygon, new MergeToPolygon(mapPanel.getMap(), objectDetailsToolBar));
buttonMergeObjects.add(menuItemMergeLogicalGroup, new MergeToMultiGeometry(mapPanel.getMap(), objectDetailsToolBar));
buttonAddLayer.setActions(actions);
buttonAddLayer.removeAllMenuItems();
buttonAddLayer.add(menuItemAddNetworkLayer, new AddNetworkLayer(this, mapPanel.getMap()));
buttonAddLayer.add(menuItemAddVectorLayer, new AddVectorLayer(this, mapPanel.getMap()));
mapPropertiesPanel.setMap(mapPanel.getMap());
mapData.addUpdateable(this);
update();
}
/**
* Sets up main tool bar.
*/
private void setupToolbar() {
try {
//File Menu
menuFile.setMnemonic(KeyEvent.VK_F);
menuItemFileSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, awtToolKit.getMenuShortcutKeyMask()));
mainMenuBar.add(menuFile);
menuFile.add(menuItemFileNew);
menuFile.add(menuItemFileOpen);
menuFile.add(menuItemFileSave);
menuFile.add(menuItemFileSaveAs);
menuFile.addSeparator();
menuFile.add(menuItemFilePrint);
menuFile.addSeparator();
menuFile.add(menuFileImport);
menuFileImport.add(menuItemFileImportMap);
menuFileImport.add(menuItemFileImportGeotaggedPhotos);
menuFileImport.add(menuItemFileImportData);
menuFile.add(menuFileExport);
menuFileExport.add(menuItemFileExportMap);
menuFileExport.add(menuItemFileExportImage);
menuFileExport.add(menuItemFileExportTiles);
menuFile.addSeparator();
menuFile.add(menuItemFileQuit);
menuItemFilePrint.setEnabled(false);
//Edit menu
menuEdit.setMnemonic(KeyEvent.VK_E);
menuItemEditUndo.setAccelerator (KeyStroke.getKeyStroke(KeyEvent.VK_Z, awtToolKit.getMenuShortcutKeyMask()));
menuItemEditCut.setAccelerator (KeyStroke.getKeyStroke(KeyEvent.VK_X, awtToolKit.getMenuShortcutKeyMask()));
menuItemEditCopy.setAccelerator (KeyStroke.getKeyStroke(KeyEvent.VK_C, awtToolKit.getMenuShortcutKeyMask()));
menuItemEditPaste.setAccelerator (KeyStroke.getKeyStroke(KeyEvent.VK_V, awtToolKit.getMenuShortcutKeyMask()));
menuItemEditFind.setAccelerator (KeyStroke.getKeyStroke(KeyEvent.VK_F, awtToolKit.getMenuShortcutKeyMask()));
menuItemEditDelete.setAccelerator (KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
menuItemEditDeselect.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, awtToolKit.getMenuShortcutKeyMask()));
menuItemEditUndo.setEnabled(false);
menuItemEditRedo.setEnabled(false);
mainMenuBar.add(menuEdit);
menuEdit.add(menuItemEditUndo);
menuEdit.add(menuItemEditRedo);
menuEdit.addSeparator();
menuEdit.add(menuItemEditCut);
menuEdit.add(menuItemEditCopy);
menuEdit.add(menuItemEditPaste);
menuEdit.add(menuItemEditDelete);
menuEdit.addSeparator();
menuEdit.add(menuItemEditFind);
menuEdit.addSeparator();
menuEdit.add(menuItemEditDeselect);
//View menu
menuView.setMnemonic(KeyEvent.VK_V);
menuItemViewMapTools.setState(true);
menuItemViewObjectDetails.setState(true);
menuItemViewStatusBar.setState(true);
menuItemViewLayers.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L, awtToolKit.getMenuShortcutKeyMask()));
mainMenuBar.add(menuView);
menuView.add(menuItemViewMapTools);
menuView.add(menuItemViewLayers);
menuView.add(menuItemViewObjectData);
menuView.add(menuItemViewObjectDetails);
menuView.add(menuItemViewStatusBar);
//Map menu
menuItemMapOrderMoveToFront.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_CLOSE_BRACKET, awtToolKit.getMenuShortcutKeyMask() + InputEvent.SHIFT_MASK));
menuItemMapOrderMoveToBack.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_OPEN_BRACKET, awtToolKit.getMenuShortcutKeyMask() + InputEvent.SHIFT_MASK));
menuItemMapOrderMoveForward.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_CLOSE_BRACKET, awtToolKit.getMenuShortcutKeyMask()));
menuItemMapOrderMoveBackward.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_OPEN_BRACKET, awtToolKit.getMenuShortcutKeyMask()));
menuMap.setMnemonic(KeyEvent.VK_M);
mainMenuBar.add(menuMap);
menuMap.add(menuMapAddObject);
menuMapAddObject.add(menuItemMapAddPoint);
menuMapAddObject.add(menuItemMapAddLinearObject);
menuMapAddObject.add(menuItemMapAddPolygon);
menuMapAddObject.add(menuItemMapAddImageOverlay);
menuMap.add(menuMapOrder);
menuMapOrder.add(menuItemMapOrderMoveToFront);
menuMapOrder.add(menuItemMapOrderMoveForward);
menuMapOrder.add(menuItemMapOrderMoveBackward);
menuMapOrder.add(menuItemMapOrderMoveToBack);
menuMap.add(menuItemMapCrop);
menuMap.addSeparator();
menuMap.add(menuItemMapProperties);
//tools Menu
menuItemToolsGPS.setEnabled(false); //just until the functionality is created
mainMenuBar.add(menuTools);
menuTools.add(menuItemToolsCreateBubbleChart);
menuTools.add(menuItemToolsCreateHeatMap);
menuTools.addSeparator();
menuTools.add(menuItemToolsDataCatalog);
//help menu
menuItemHelpLanguageEnglish.setSelected(true); //this eventualy needs to determined from the settings file
menuHelp.setMnemonic(KeyEvent.VK_H);
mainMenuBar.add(menuHelp);
menuHelp.add(menuItemHelpAbout);
menuHelp.add(menuHelpLanguage);
menuHelpLanguage.add(menuItemHelpLanguageEnglish);
menuHelpLanguage.add(menuItemHelpLanguageFrench);
//Modify Points Popup Menu
popupMenuMapModifyPoints.setInvoker(mapPanel);
popupMenuMapModifyPoints.add(menuItemMapModifyAddMapPoint);
popupMenuMapModifyPoints.addSeparator();
popupMenuMapModifyPoints.add(menuMapModifyOrder);
menuMapModifyOrder.add(menuItemMapModifyOrderToFront);
menuMapModifyOrder.add(menuItemMapModifyOrderForward);
menuMapModifyOrder.add(menuItemMapModifyOrderBackward);
menuMapModifyOrder.add(menuItemMapModifyOrderToBack);
popupMenuMapModifyPoints.add(menuMapModifyMoveToLayer);
popupMenuMapModifyPoints.addSeparator();
popupMenuMapModifyPoints.add(menuItemMapModifyAddObjectPoint);
popupMenuMapModifyPoints.add(menuItemMapModifyDeleteObjectPoint);
popupMenuMapModifyPoints.add(menuItemMapModifySplitObject);
popupMenuMapModifyPoints.addSeparator();
popupMenuMapModifyPoints.add(menuItemMapModifyCopy);
popupMenuMapModifyPoints.add(menuItemMapModifyPaste);
popupMenuMapModifyPoints.add(menuItemMapModifyDelete);
popupMenuMapModifyPoints.addSeparator();
popupMenuMapModifyPoints.add(menuItemMapModifyProperties);
//Normal Map Popup Menu
popupMenuMapNormal.setInvoker(mapPanel);
popupMenuMapNormal.add(menuItemMapNormalCut);
popupMenuMapNormal.add(menuItemMapNormalCopy);
popupMenuMapNormal.add(menuItemMapNormalPaste);
popupMenuMapNormal.add(menuItemMapNormalDelete);
popupMenuMapNormal.addSeparator();
popupMenuMapNormal.add(menuItemMapNormalNewPoint);
popupMenuMapNormal.addSeparator();
popupMenuMapNormal.add(menuItemMapNormalProperties);
//Layers Item Popup Menu
popupMenuLayerItem.add(menuItemLayerItemCopy);
popupMenuLayerItem.add(menuItemLayerItemCut);
popupMenuLayerItem.add(menuItemLayerDelete);
popupMenuLayerItem.addSeparator();
popupMenuLayerItem.add(menuItemLayerProperties);
} catch (Exception e) {
System.err.print("Error in MainWindow.setupToolbar() - " + e);
}
}
/**
* Shows the context menu for the LAyers Tree.
*
* @param invoker
* @param x
* @param y
*/
public void showLayersPopupMenu(Component invoker, int x, int y) {
DigitalMap mapData = mapPanel.getMap();
Layer selectedLayer = mapData.getSelectedLayer();
ArrayList<Layer> layers = mapData.getLayers();
//remove current menu Items
menuLayersMergeLayer.removeAll();
//add layers to the merge sub-menu
for (Layer currentLayer: layers) {
//make sure layers are of the same type and not the same layer
if ((currentLayer != selectedLayer) && (selectedLayer.getClass() == currentLayer.getClass())) {
LayerMenuItem currentLayerMenuItem = new LayerMenuItem(currentLayer, "Merge");
menuLayersMergeLayer.add(currentLayerMenuItem);
currentLayerMenuItem.addActionListener(this);
}
}
if (menuLayersMergeLayer.getItemCount() == 0) {
menuLayersMergeLayer.setEnabled(false);
} else {
menuLayersMergeLayer.setEnabled(true);
}
if (layers.get(0) == selectedLayer) {
menuItemLayersMoveUp.setEnabled(false);
menuItemLayersMoveDown.setEnabled(true);
} else if (layers.get(layers.size() - 1) == selectedLayer) {
menuItemLayersMoveUp.setEnabled(true);
menuItemLayersMoveDown.setEnabled(false);
} else {
menuItemLayersMoveUp.setEnabled(true);
menuItemLayersMoveDown.setEnabled(true);
}
//set Layer Locked value
menuItemLayersLockLayer.setState(mapData.getSelectedLayer().isLocked());
populateLayersPopupMenu();
popupMenuLayers.setLocation(y, y);
popupMenuLayers.show(treeLayers, x, y);
}
/**
* Runs update commands for the MainWindow.
*
*/
@Override
public void update() {
if (dataSheetPanel != null) {
panelMainCenter.remove(dataSheetPanel);
dataSheetPanel = new DataSheetPanel(mapPanel.getMap());
dataSheetPanel.setPreferredSize(new Dimension(this.getWidth(), (this.getHeight() / 5)));
panelMainCenter.add(dataSheetPanel, BorderLayout.SOUTH);
}
updateLayersTree();
this.objectDetailsToolBar.update();
this.repaint();
}
/**
* Updates the undo and redo menu descriptions to include the actions that
* would be undone or redone.
*
*/
private void updateEditMenu() {
co.foldingmap.actions.Action undo;
co.foldingmap.actions.Action redo;
try {
undo = actions.getUndoAction();
redo = actions.getRedoAction();
if (undo != null) {
menuItemEditUndo.setEnabled(true);
menuItemEditUndo.setText("Undo " + undo.getCommandDescription());
} else {
menuItemEditUndo.setEnabled(false);
menuItemEditUndo.setText("Undo");
}
if (redo != null) {
menuItemEditRedo.setEnabled(true);
menuItemEditRedo.setText("Redo " + redo.getCommandDescription());
} else {
menuItemEditRedo.setEnabled(false);
menuItemEditRedo.setText("Redo");
}
if (ClipboardOperations.getPasteDataType() != ClipboardOperations.UNKNOWN) {
menuItemEditPaste.setEnabled(true);
} else {
menuItemEditPaste.setEnabled(false);
}
} catch (Exception e) {
Logger.log(Logger.ERR, "Error in MainWindow.updateEditMenu() - " + e);
}
}
/**
* Updates the panel showing object's extended options.
*/
public final void updateExtendedOptions() {
MapObject selectedObject;
VectorObject object;
toolbarExtendedOptions.removeAll();
//save changes to the extended options panel
if (extendedOptionsPanel != null) extendedOptionsPanel.save();
if (mapPanel.getMap().getSelectedObjects().size() == 1) {
selectedObject = mapPanel.getMap().getSelectedObjects().get(0);
if (selectedObject instanceof PhotoPoint) {
PhotoPoint photoPoint = (PhotoPoint) selectedObject;
extendedOptionsPanel = new PhotoExtendedOptionsPanel(photoPoint.getPhotoFile());
toolbarExtendedOptions.add(panelExtendedOptionsNorth, BorderLayout.NORTH);
toolbarExtendedOptions.add(extendedOptionsPanel, BorderLayout.CENTER);
extendedOptionsPanel.setPreferredSize(new Dimension(200, 400));
} else if (selectedObject instanceof VectorObject) {
object = (VectorObject) mapPanel.getMap().getSelectedObjects().get(0);
extendedOptionsPanel = new DefaultExtendedOptionsPanel(object);
toolbarExtendedOptions.add(panelExtendedOptionsNorth, BorderLayout.NORTH);
toolbarExtendedOptions.add(extendedOptionsPanel, BorderLayout.CENTER);
extendedOptionsPanel.setPreferredSize(new Dimension(200, 400));
} else {
}
} else if (mapPanel.getMap().getSelectedObjects().size() == 0) {
mapPropertiesPanel.setMap(mapPanel.getMap());
toolbarExtendedOptions.add(panelExtendedOptionsNorth, BorderLayout.NORTH);
toolbarExtendedOptions.add(mapPropertiesPanel, BorderLayout.CENTER);
mapPropertiesPanel.setPreferredSize(new Dimension(200, 400));
} else {
JPanel tempPanel = new JPanel();
toolbarExtendedOptions.setLayout(new BorderLayout());
panelExtendedOptionsNorth.add(labelExtendedOptions, BorderLayout.CENTER);
panelExtendedOptionsNorth.add(buttonCloseOptionToolbar, BorderLayout.EAST);
toolbarExtendedOptions.add(panelExtendedOptionsNorth, BorderLayout.NORTH);
toolbarExtendedOptions.add(tempPanel, BorderLayout.CENTER);
tempPanel.setPreferredSize(new Dimension(200, 400));
}
toolbarExtendedOptions.revalidate();
}
/**
* Updates the Layers Tree to all the layers in this map.
*/
public void updateLayersTree() {
DigitalMap mapData = mapPanel.getMap();
try {
//remove current tree nodes
layersDefaultTreeModel.setRoot(null);
rootLayerNode = new CheckedTreeNode("Layers");
layersDefaultTreeModel.setRoot(rootLayerNode);
this.addLayers(mapData.getLayers());
layersDefaultTreeModel.reload();
} catch (Exception e) {
Logger.log(Logger.ERR, "Error in MainWindow.updateLayersTree() - " + e);
}
}
/**
* Updates the text in the mouse location bar.
*
* @param me
*/
private void updateMouseLocationBar(MouseEvent me) {
if (me.getSource() == mapPanel) {
float latitude, longitude, zoom;
String mouseLocationText;
latitude = mapPanel.getMapView().getLatitude(me.getX(), me.getY());
longitude = mapPanel.getMapView().getLongitude(me.getX(), me.getY());
zoom = TileMath.getTileMapZoom(mapPanel.getMapView().getZoomLevel());
mouseLocationText = "Latitude: " + decimalFormat.format(latitude) + " - Longitude: " + decimalFormat.format(longitude) + " Zoom: " + zoomFormat.format(zoom);
this.labelMouseCoordinates.setText(mouseLocationText);
}
}
/**
* Method for updating the object details toolbar.
*
*/
public void updateObjectDetailsToolBar() {
objectDetailsToolBar.update();
}
@Override
public void windowOpened(WindowEvent we) {
}
@Override
public void windowClosing(WindowEvent we) {
}
@Override
public void windowClosed(WindowEvent we) {
}
@Override
public void windowIconified(WindowEvent we) {
this.hideAllPopups();
}
@Override
public void windowDeiconified(WindowEvent we) {
}
@Override
public void windowActivated(WindowEvent we) {
}
@Override
public void windowDeactivated(WindowEvent we) {
this.hideAllPopups();
}
}