package net.osmand.swing; import java.awt.BorderLayout; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.lang.Thread.UncaughtExceptionHandler; import java.lang.reflect.InvocationTargetException; import java.sql.SQLException; import java.text.MessageFormat; import javax.swing.AbstractAction; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTree; import javax.swing.UIManager; import javax.swing.filechooser.FileFilter; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.xml.stream.XMLStreamException; import net.osmand.ExceptionHandler; import net.osmand.Version; import net.osmand.data.preparation.IndexCreator; import net.osmand.map.IMapLocationListener; import net.osmand.map.ITileSource; import net.osmand.osm.MapRenderingTypes; import net.osmand.osm.io.IOsmStorageFilter; import net.osmand.osm.io.OsmBaseStorage; import net.osmand.osm.io.OsmBoundsFilter; import net.osmand.osm.io.OsmStorageWriter; import net.osmand.swing.MapPanel.MapSelectionArea; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.tools.bzip2.CBZip2OutputStream; import org.xml.sax.SAXException; import rtree.RTree; public class OsmExtractionUI implements IMapLocationListener { private static final Log log = LogFactory.getLog(OsmExtractionUI.class); public static final String LOG_PATH = getUserLogDirectoryPath() + "/Osmand/osmand.log"; //$NON-NLS-1$ //$NON-NLS-2$ public static OsmExtractionUI MAIN_APP; public static String getUserLogDirectoryPath() { String path = null; if (System.getProperty("os.name").startsWith("Windows")) { path = System.getenv("APPDATA").replaceAll("\\\\", "/"); } else if (System.getProperty("os.name").startsWith("Mac")) { path = System.getProperty("user.home") + "/Library/Logs"; } else if (System.getenv("XDG_CACHE_HOME") != null) { path = System.getenv("XDG_CACHE_HOME"); } else { path = System.getProperty("user.home") + "/.cache"; } return path; } public static void main(String[] args) { // first of all config log new File(LOG_PATH).getParentFile().mkdirs(); final UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler(){ @Override public void uncaughtException(Thread t, Throwable e) { if(!(e instanceof ThreadDeath)){ ExceptionHandler.handle("Error in thread " + t.getName(), e); //$NON-NLS-1$ } defaultHandler.uncaughtException(t, e); } }); MAIN_APP = new OsmExtractionUI(); MAIN_APP.frame.setBounds(DataExtractionSettings.getSettings().getWindowBounds()); MAIN_APP.frame.setVisible(true); } private JTree treePlaces; // private DataExtractionTreeNode amenitiesTree; // private TreeModelListener treeModelListener; private MapPanel mapPanel; private JFrame frame; private JLabel statusBarLabel; private JCheckBox buildPoiIndex; private JCheckBox buildAddressIndex; private JCheckBox buildMapIndex; private JCheckBox buildTransportIndex; private JCheckBox normalizingStreets; private String regionName; public OsmExtractionUI(){ createUI(); } public void createUI(){ frame = new JFrame(Messages.getString("OsmExtractionUI.OSMAND_MAP_CREATOR")); //$NON-NLS-1$ try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { log.error("Can't set look and feel", e); //$NON-NLS-1$ } frame.addWindowListener(new ExitListener()); Container content = frame.getContentPane(); frame.setFocusable(true); mapPanel = new MapPanel(DataExtractionSettings.getSettings().getTilesDirectory()); mapPanel.setFocusable(true); mapPanel.addMapLocationListener(this); statusBarLabel = new JLabel(); content.add(statusBarLabel, BorderLayout.SOUTH); File workingDir = DataExtractionSettings.getSettings().getDefaultWorkingDir(); statusBarLabel.setText(workingDir == null ? Messages.getString("OsmExtractionUI.WORKING_DIR_UNSPECIFIED") : Messages.getString("OsmExtractionUI.WORKING_DIRECTORY") + workingDir.getAbsolutePath()); //$NON-NLS-1$ //$NON-NLS-2$ treePlaces = new JTree(); treePlaces.setModel(new DefaultTreeModel(new DefaultMutableTreeNode(Messages.getString("OsmExtractionUI.REGION")), false)); //$NON-NLS-1$ JSplitPane panelForTreeAndMap = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(treePlaces), mapPanel); panelForTreeAndMap.setResizeWeight(0.2); content.add(panelForTreeAndMap, BorderLayout.CENTER); createButtonsBar(content); JMenuBar bar = new JMenuBar(); fillMenuWithActions(bar); frame.setJMenuBar(bar); } public void createButtonsBar(Container content){ JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); content.add(panel, BorderLayout.NORTH); buildMapIndex = new JCheckBox(); buildMapIndex.setText(Messages.getString("OsmExtractionUI.BUILD_MAP")); //$NON-NLS-1$ panel.add(buildMapIndex); buildMapIndex.setSelected(true); buildPoiIndex = new JCheckBox(); buildPoiIndex.setText(Messages.getString("OsmExtractionUI.BUILD_POI")); //$NON-NLS-1$ panel.add(buildPoiIndex); buildPoiIndex.setSelected(true); buildAddressIndex = new JCheckBox(); buildAddressIndex.setText(Messages.getString("OsmExtractionUI.BUILD_ADDRESS")); //$NON-NLS-1$ panel.add(buildAddressIndex); buildAddressIndex.setSelected(true); normalizingStreets = new JCheckBox(); normalizingStreets.setText(Messages.getString("OsmExtractionUI.NORMALIZE_STREETS")); //$NON-NLS-1$ panel.add(normalizingStreets); normalizingStreets.setSelected(true); buildTransportIndex = new JCheckBox(); buildTransportIndex.setText(Messages.getString("OsmExtractionUI.BUILD_TRANSPORT")); //$NON-NLS-1$ panel.add(buildTransportIndex); buildTransportIndex.setSelected(true); } public void fillMenuWithActions(final JMenuBar bar){ JMenu menu = new JMenu(Messages.getString("OsmExtractionUI.MENU_FILE")); //$NON-NLS-1$ bar.add(menu); JMenuItem loadFile = new JMenuItem(Messages.getString("OsmExtractionUI.MENU_SELECT_FILE")); //$NON-NLS-1$ menu.add(loadFile); JMenuItem loadSpecifiedAreaFile = new JMenuItem(Messages.getString("OsmExtractionUI.MENU_SELECT_OSM_FILE_AREA")); //$NON-NLS-1$ menu.add(loadSpecifiedAreaFile); JMenuItem specifyWorkingDir = new JMenuItem(Messages.getString("OsmExtractionUI.SPECIFY_WORKING_DIR")); //$NON-NLS-1$ menu.add(specifyWorkingDir); menu.addSeparator(); JMenuItem exitMenu= new JMenuItem(Messages.getString("OsmExtractionUI.MENU_EXIT")); //$NON-NLS-1$ menu.add(exitMenu); JMenu tileSource = MapPanel.getMenuToChooseSource(mapPanel); final JMenuItem sqliteDB = new JMenuItem(Messages.getString("OsmExtractionUI.MENU_CREATE_SQLITE")); //$NON-NLS-1$ tileSource.addSeparator(); tileSource.add(sqliteDB); bar.add(tileSource); menu = new JMenu(Messages.getString("OsmExtractionUI.MENU_WINDOW")); //$NON-NLS-1$ bar.add(menu); JMenuItem settings = new JMenuItem(Messages.getString("OsmExtractionUI.MENU_SETTINGS")); //$NON-NLS-1$ menu.add(settings); menu.addSeparator(); JMenuItem openLogFile = new JMenuItem(Messages.getString("OsmExtractionUI.MENU_OPEN_LOG")); //$NON-NLS-1$ menu.add(openLogFile); menu = new JMenu(Messages.getString("OsmExtractionUI.MENU_ABOUT")); //$NON-NLS-1$ bar.add(menu); JMenuItem aboutApplication = new JMenuItem(Messages.getString("OsmExtractionUI.MENU_ABOUT_2")); //$NON-NLS-1$ menu.add(aboutApplication); aboutApplication.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(frame, Version.APP_MAP_CREATOR_FULL_NAME); } }); openLogFile.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { File file = new File(OsmExtractionUI.LOG_PATH); if (file != null && file.exists()) { if (System.getProperty("os.name").startsWith("Windows")) { //$NON-NLS-1$ //$NON-NLS-2$ try { Runtime.getRuntime().exec(new String[] { "notepad.exe", file.getAbsolutePath() }); //$NON-NLS-1$ } catch (IOException es) { ExceptionHandler.handle(Messages.getString("OsmExtractionUI.UNABLE_OPEN_FILE"), es); //$NON-NLS-1$ } } else { JOptionPane.showMessageDialog(frame, Messages.getString("OsmExtractionUI.OPEN_LOG_FILE_MANUALLY") + LOG_PATH); //$NON-NLS-1$ } } else { ExceptionHandler.handle(Messages.getString("OsmExtractionUI.LOG_FILE_NOT_FOUND")); //$NON-NLS-1$ } } }); sqliteDB.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { final String regionName = OsmExtractionUI.this.regionName == null ? Messages.getString("OsmExtractionUI.REGION") : OsmExtractionUI.this.regionName; //$NON-NLS-1$ final ITileSource map = mapPanel.getMap(); if(map != null){ try { final ProgressDialog dlg = new ProgressDialog(frame, Messages.getString("OsmExtractionUI.CREATING_INDEX")); //$NON-NLS-1$ dlg.setRunnable(new Runnable(){ @Override public void run() { try { SQLiteBigPlanetIndex.createSQLiteDatabase(DataExtractionSettings.getSettings().getTilesDirectory(), regionName, map); } catch (SQLException e1) { throw new IllegalArgumentException(e1); } catch (IOException e1) { throw new IllegalArgumentException(e1); } } }); dlg.run(); } catch (InterruptedException e1) { log.error("Interrupted", e1); //$NON-NLS-1$ } catch (InvocationTargetException e1) { ExceptionHandler.handle("Can't create big planet sqlite index", (Exception) e1.getCause()); //$NON-NLS-1$ } } } }); exitMenu.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { frame.setVisible(false); exit(); } }); settings.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { OsmExtractionPreferencesDialog dlg = new OsmExtractionPreferencesDialog(frame); dlg.showDialog(); } }); specifyWorkingDir.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { JFileChooser fc = new JFileChooser(); fc.setDialogTitle(Messages.getString("OsmExtractionUI.CHOOSE_WORKING_DIR")); //$NON-NLS-1$ fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); File workingDir = DataExtractionSettings.getSettings().getDefaultWorkingDir(); if(workingDir != null){ fc.setCurrentDirectory(workingDir); } if(fc.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION && fc.getSelectedFile() != null && fc.getSelectedFile().isDirectory()){ DataExtractionSettings.getSettings().saveDefaultWorkingDir(fc.getSelectedFile()); mapPanel.setTilesLocation(DataExtractionSettings.getSettings().getTilesDirectory()); statusBarLabel.setText(Messages.getString("OsmExtractionUI.WORKING_DIR") + fc.getSelectedFile().getAbsolutePath()); //$NON-NLS-1$ JMenu tileSource = MapPanel.getMenuToChooseSource(mapPanel); tileSource.add(sqliteDB); bar.remove(1); bar.add(tileSource, 1); } } }); loadSpecifiedAreaFile.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { JFileChooser fc = getOsmFileChooser(); int answer = fc.showOpenDialog(frame) ; if (answer == JFileChooser.APPROVE_OPTION && fc.getSelectedFile() != null){ final JDialog dlg = new JDialog(frame, true); dlg.setTitle(Messages.getString("OsmExtractionUI.SELECT_AREA_TO_FILTER")); //$NON-NLS-1$ MapPanel panel = new MapPanel(DataExtractionSettings.getSettings().getTilesDirectory()); panel.setLatLon(mapPanel.getLatitude(), mapPanel.getLongitude()); panel.setZoom(mapPanel.getZoom()); final StringBuilder res = new StringBuilder(); panel.getLayer(MapInformationLayer.class).setAreaActionHandler(new AbstractAction(Messages.getString("OsmExtractionUI.SELECT_AREA")){ //$NON-NLS-1$ private static final long serialVersionUID = -3452957517341961969L; @Override public void actionPerformed(ActionEvent e) { res.append(true); dlg.setVisible(false); } }); dlg.add(panel); JMenuBar bar = new JMenuBar(); bar.add(MapPanel.getMenuToChooseSource(panel)); dlg.setJMenuBar(bar); dlg.setSize(512, 512); double x = frame.getBounds().getCenterX(); double y = frame.getBounds().getCenterY(); dlg.setLocation((int) x - dlg.getWidth() / 2, (int) y - dlg.getHeight() / 2); dlg.setVisible(true); if(res.length() > 0 && panel.getSelectionArea().isVisible()){ MapSelectionArea area = panel.getSelectionArea(); IOsmStorageFilter filter = new OsmBoundsFilter(area.getLat1(), area.getLon1(), area.getLat2(), area.getLon2()); loadCountry(fc.getSelectedFile(), filter); } } } }); loadFile.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { JFileChooser fc = getOsmFileChooser(); int answer = fc.showOpenDialog(frame) ; if (answer == JFileChooser.APPROVE_OPTION && fc.getSelectedFile() != null){ loadCountry(fc.getSelectedFile(), null); } } }); } public JFileChooser getOsmFileChooser(){ JFileChooser fc = new JFileChooser(); fc.setDialogTitle(Messages.getString("OsmExtractionUI.CHOOSE_OSM_FILE")); //$NON-NLS-1$ fc.setFileSelectionMode(JFileChooser.FILES_ONLY); fc.setAcceptAllFileFilterUsed(true); fc.setCurrentDirectory(DataExtractionSettings.getSettings().getDefaultWorkingDir().getParentFile()); fc.setFileFilter(new FileFilter(){ @Override public boolean accept(File f) { return f.isDirectory() || f.getName().endsWith(".bz2") || f.getName().endsWith(".osm") || f.getName().endsWith(".pbf"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } @Override public String getDescription() { return Messages.getString("OsmExtractionUI.OSM_FILES"); //$NON-NLS-1$ } }); return fc; } public JFrame getFrame() { return frame; } public void loadCountry(final File f, final IOsmStorageFilter filter){ try { final ProgressDialog dlg = new ProgressDialog(frame, Messages.getString("OsmExtractionUI.LOADING_OSM_FILE")); //$NON-NLS-1$ dlg.setRunnable(new Runnable(){ @Override public void run() { File dir = DataExtractionSettings.getSettings().getDefaultWorkingDir(); IndexCreator creator = new IndexCreator(dir); try { creator.setIndexAddress(buildAddressIndex.isSelected()); creator.setIndexPOI(buildPoiIndex.isSelected()); creator.setNormalizeStreets(normalizingStreets.isSelected()); creator.setIndexTransport(buildTransportIndex.isSelected()); creator.setIndexMap(buildMapIndex.isSelected()); String fn = DataExtractionSettings.getSettings().getMapRenderingTypesFile(); MapRenderingTypes types; if(fn == null || fn.length() == 0){ types = MapRenderingTypes.getDefault(); } else { types = new MapRenderingTypes(fn); } RTree.clearCache(); creator.generateIndexes(f, dlg, filter, DataExtractionSettings.getSettings().getMapZooms(), types); } catch (IOException e) { throw new IllegalArgumentException(e); } catch (SAXException e) { throw new IllegalStateException(e); } catch (SQLException e) { throw new IllegalStateException(e); } regionName = creator.getRegionName(); StringBuilder msg = new StringBuilder(); msg.append(Messages.getString("OsmExtractionUI.INDEXES_FOR")).append(regionName).append(" : "); //$NON-NLS-1$ //$NON-NLS-2$ boolean comma = false; if (buildMapIndex.isSelected()) { if(comma) msg.append(", "); //$NON-NLS-1$ comma = true; msg.append(Messages.getString("OsmExtractionUI.MAP")); //$NON-NLS-1$ } if (buildPoiIndex.isSelected()) { if(comma) msg.append(", "); //$NON-NLS-1$ comma = true; msg.append(Messages.getString("OsmExtractionUI.POI")); //$NON-NLS-1$ } if (buildAddressIndex.isSelected()) { if(comma) msg.append(", "); //$NON-NLS-1$ comma = true; msg.append(Messages.getString("OsmExtractionUI.ADDRESS")); //$NON-NLS-1$ } if (buildTransportIndex.isSelected()) { if(comma) msg.append(", "); //$NON-NLS-1$ comma = true; msg.append(Messages.getString("OsmExtractionUI.TRANSPORT")); //$NON-NLS-1$ } msg.append(MessageFormat.format(Messages.getString("OsmExtractionUI.WERE_SUCCESFULLY_CREATED"), dir.getAbsolutePath())); //$NON-NLS-1$ JOptionPane pane = new JOptionPane(msg); JDialog dialog = pane.createDialog(frame, Messages.getString("OsmExtractionUI.GENERATION_DATA")); //$NON-NLS-1$ dialog.setVisible(true); } }); dlg.run(); frame.setTitle(Messages.getString("OsmExtractionUI.OSMAND_MAP_CREATOR_FILE") + f.getName()); //$NON-NLS-1$ } catch (InterruptedException e1) { log.error("Interrupted", e1); //$NON-NLS-1$ } catch (InvocationTargetException e1) { ExceptionHandler.handle("Exception during operation", e1.getCause()); //$NON-NLS-1$ } } public void saveCountry(final File f, final OsmBaseStorage storage){ final OsmStorageWriter writer = new OsmStorageWriter(); try { final ProgressDialog dlg = new ProgressDialog(frame, Messages.getString("OsmExtractionUI.SAVING_OSM_FILE")); //$NON-NLS-1$ dlg.setRunnable(new Runnable() { @Override public void run() { try { OutputStream output = new FileOutputStream(f); try { if (f.getName().endsWith(".bz2")) { //$NON-NLS-1$ output.write('B'); output.write('Z'); output = new CBZip2OutputStream(output); } writer.saveStorage(output, storage, null, false); } finally { output.close(); } } catch (IOException e) { throw new IllegalArgumentException(e); } catch (XMLStreamException e) { throw new IllegalArgumentException(e); } } }); dlg.run(); } catch (InterruptedException e1) { log.error("Interrupted", e1); //$NON-NLS-1$ } catch (InvocationTargetException e1) { ExceptionHandler.handle("Log file is not found", e1.getCause()); //$NON-NLS-1$ } } @Override public void locationChanged(final double newLatitude, final double newLongitude, Object source){ // recalculateAmenities(newLatitude, newLongitude); } public class ExitListener extends WindowAdapter { public void windowClosing(WindowEvent event) { exit(); } } public void exit(){ // save preferences DataExtractionSettings settings = DataExtractionSettings.getSettings(); settings.saveDefaultLocation(mapPanel.getLatitude(), mapPanel.getLongitude()); settings.saveDefaultZoom(mapPanel.getZoom()); settings.saveWindowBounds(frame.getBounds()); System.exit(0); } // OLD CODE /* public JTree createTree(Container content) { treePlaces.setEditable(true); treePlaces.setCellEditor(new RegionCellEditor(treePlaces, (DefaultTreeCellRenderer) treePlaces.getCellRenderer())); treePlaces.addTreeSelectionListener(new TreeSelectionListener() { @Override public void valueChanged(TreeSelectionEvent e) { if (e.getPath() != null) { if (e.getPath().getLastPathComponent() instanceof DataExtractionTreeNode) { Object o = ((DataExtractionTreeNode) e.getPath().getLastPathComponent()).getModelObject(); if (o instanceof MapObject) { MapObject c = (MapObject) o; LatLon location = c.getLocation(); if (location != null) { if (o instanceof Street) { DataTileManager<Way> ways = new DataTileManager<Way>(); for (Way w : ((Street) o).getWayNodes()) { LatLon l = w.getLatLon(); ways.registerObject(l.getLatitude(), l.getLongitude(), w); } mapPanel.setPoints(ways); mapPanel.requestFocus(); } mapPanel.setLatLon(location.getLatitude(), location.getLongitude()); mapPanel.requestFocus(); } if (o instanceof TransportRoute) { DataTileManager<Entity> ways = new DataTileManager<Entity>(); for (Way w : ((TransportRoute) o).getWays()) { LatLon l = w.getLatLon(); ways.registerObject(l.getLatitude(), l.getLongitude(), w); } for (TransportStop w : ((TransportRoute) o).getBackwardStops()) { LatLon l = w.getLocation(); ways.registerObject(l.getLatitude(), l.getLongitude(), new Node(l.getLatitude(), l.getLongitude(), w .getId())); } for (TransportStop w : ((TransportRoute) o).getForwardStops()) { LatLon l = w.getLocation(); ways.registerObject(l.getLatitude(), l.getLongitude(), new Node(l.getLatitude(), l.getLongitude(), w .getId())); } mapPanel.setPoints(ways); mapPanel.requestFocus(); } } else if (o instanceof Entity) { Entity c = (Entity) o; LatLon latLon = c.getLatLon(); if (latLon != null) { mapPanel.setLatLon(latLon.getLatitude(), latLon.getLongitude()); mapPanel.requestFocus(); } } } } } }); treeModelListener = new TreeModelListener() { public void treeNodesChanged(TreeModelEvent e) { Object node = e.getTreePath().getLastPathComponent(); if (e.getChildren() != null && e.getChildren().length > 0) { node = e.getChildren()[0]; } if (node instanceof DataExtractionTreeNode) { DataExtractionTreeNode n = ((DataExtractionTreeNode) node); if (n.getModelObject() instanceof MapObject) { MapObject r = (MapObject) n.getModelObject(); String newName = n.getUserObject().toString(); if (!r.getName().equals(newName)) { r.setName(n.getUserObject().toString()); } if (r instanceof Street && !((Street) r).isRegisteredInCity()) { DefaultMutableTreeNode parent = ((DefaultMutableTreeNode) n.getParent()); parent.remove(n); ((DefaultTreeModel) treePlaces.getModel()).nodeStructureChanged(parent); } } } } public void treeNodesInserted(TreeModelEvent e) { } public void treeNodesRemoved(TreeModelEvent e) { } public void treeStructureChanged(TreeModelEvent e) { } }; treePlaces.getModel().addTreeModelListener(treeModelListener); return treePlaces; } public void fillPopupMenuWithActions(JPopupMenu menu) { Action delete = new AbstractAction("Delete") { private static final long serialVersionUID = 7476603434847164396L; public void actionPerformed(ActionEvent e) { TreePath[] p = treePlaces.getSelectionPaths(); if(p != null && JOptionPane.OK_OPTION == JOptionPane.showConfirmDialog(frame, "Are you sure about deleting " +p.length + " resources ? ")){ for(TreePath path : treePlaces.getSelectionPaths()){ Object node = path.getLastPathComponent(); if (node instanceof DataExtractionTreeNode) { DataExtractionTreeNode n = ((DataExtractionTreeNode) node); if(n.getParent() instanceof DataExtractionTreeNode){ DataExtractionTreeNode parent = ((DataExtractionTreeNode) n.getParent()); boolean remove = false; if (n.getModelObject() instanceof Street) { ((City)parent.getModelObject()).unregisterStreet(((Street)n.getModelObject()).getName()); remove = true; } else if (n.getModelObject() instanceof Building) { ((Street)parent.getModelObject()).getBuildings().remove(n.getModelObject()); remove = true; } else if (n.getModelObject() instanceof City) { Region r = (Region) ((DataExtractionTreeNode)parent.getParent()).getModelObject(); r.unregisterCity((City) n.getModelObject()); remove = true; } else if (n.getModelObject() instanceof Amenity) { Region r = (Region) ((DataExtractionTreeNode)parent.getParent().getParent()).getModelObject(); Amenity am = (Amenity) n.getModelObject(); r.getAmenityManager().unregisterObject(am.getLocation().getLatitude(), am.getLocation().getLongitude(), am); remove = true; } if(remove){ parent.remove(n); ((DefaultTreeModel) treePlaces.getModel()).nodeStructureChanged(parent); } } } } } } }; menu.add(delete); Action rename= new AbstractAction("Rename") { private static final long serialVersionUID = -8257594433235073767L; public void actionPerformed(ActionEvent e) { TreePath path = treePlaces.getSelectionPath(); if(path != null){ treePlaces.startEditingAtPath(path); } } }; menu.add(rename); } public void setRegion(Region region, String name){ if (this.region == region) { return; } this.region = region; DefaultMutableTreeNode root = new DataExtractionTreeNode(name, region); if (region != null) { amenitiesTree = new DataExtractionTreeNode("Amenities", region); amenitiesTree.add(new DataExtractionTreeNode("First 15", region)); for (AmenityType type : AmenityType.values()) { amenitiesTree.add(new DataExtractionTreeNode(Algoritms.capitalizeFirstLetterAndLowercase(type.toString()), type)); } root.add(amenitiesTree); DataExtractionTreeNode transport = new DataExtractionTreeNode("Transport", region); root.add(transport); for(String s : region.getTransportRoutes().keySet()){ DataExtractionTreeNode trRoute = new DataExtractionTreeNode(s, s); transport.add(trRoute); List<TransportRoute> list = region.getTransportRoutes().get(s); for(TransportRoute r : list){ DataExtractionTreeNode route = new DataExtractionTreeNode(r.getRef(), r); trRoute.add(route); } } for (CityType t : CityType.values()) { DefaultMutableTreeNode cityTree = new DataExtractionTreeNode(Algoritms.capitalizeFirstLetterAndLowercase(t.toString()), t); root.add(cityTree); for (City ct : region.getCitiesByType(t)) { DefaultMutableTreeNode cityNodeTree = new DataExtractionTreeNode(ct.getName(), ct); cityTree.add(cityNodeTree); for (Street str : ct.getStreets()) { DefaultMutableTreeNode strTree = new DataExtractionTreeNode(str.getName(), str); cityNodeTree.add(strTree); for (Building b : str.getBuildings()) { DefaultMutableTreeNode building = new DataExtractionTreeNode(b.getName(), b); strTree.add(building); } } } } } if (searchList != null) { updateListCities(region, searchTextField.getText(), searchList); } mapPanel.repaint(); DefaultTreeModel newModel = new DefaultTreeModel(root, false); newModel.addTreeModelListener(treeModelListener); treePlaces.setModel(newModel); updateButtonsBar(); locationChanged(mapPanel.getLatitude(), mapPanel.getLongitude(), this); } public static class DataExtractionTreeNode extends DefaultMutableTreeNode { private static final long serialVersionUID = 1L; private final Object modelObject; public DataExtractionTreeNode(String name, Object modelObject){ super(name); this.modelObject = modelObject; } public Object getModelObject(){ return modelObject; } } private void recalculateAmenities(final double newLatitude, final double newLongitude) { if (amenitiesTree != null) { Region reg = (Region) amenitiesTree.getModelObject(); List<Amenity> closestAmenities = reg.getAmenityManager().getClosestObjects(newLatitude, newLongitude, 0, 5); MapUtils.sortListOfMapObject(closestAmenities, newLatitude, newLongitude); Map<AmenityType, List<Amenity>> filter = new HashMap<AmenityType, List<Amenity>>(); for (Amenity n : closestAmenities) { AmenityType type = n.getType(); if (!filter.containsKey(type)) { filter.put(type, new ArrayList<Amenity>()); } filter.get(type).add(n); } for (int i = 1; i < amenitiesTree.getChildCount(); i++) { AmenityType type = (AmenityType) ((DataExtractionTreeNode) amenitiesTree.getChildAt(i)).getModelObject(); ((DefaultMutableTreeNode) amenitiesTree.getChildAt(i)).removeAllChildren(); if (filter.get(type) != null) { for (Amenity n : filter.get(type)) { int dist = (int) (MapUtils.getDistance(n.getLocation(), newLatitude, newLongitude)); String str = n.getStringWithoutType(false) + " [" + dist + " m ]"; DataExtractionTreeNode node = new DataExtractionTreeNode(str, n); ((DefaultMutableTreeNode) amenitiesTree.getChildAt(i)).add(node); } } ((DefaultTreeModel)treePlaces.getModel()).nodeStructureChanged(amenitiesTree.getChildAt(i)); } ((DefaultMutableTreeNode) amenitiesTree.getChildAt(0)).removeAllChildren(); for (int i = 0; i < 15 && i < closestAmenities.size(); i++) { Amenity n = closestAmenities.get(i); int dist = (int) (MapUtils.getDistance(n.getLocation(), newLatitude, newLongitude)); String str = n.getSimpleFormat(false) + " [" + dist + " m ]"; ((DefaultMutableTreeNode) amenitiesTree.getChildAt(0)).add(new DataExtractionTreeNode(str, n)); ((DefaultTreeModel)treePlaces.getModel()).nodeStructureChanged(amenitiesTree.getChildAt(0)); } } } public void updateListCities(Region r, String text, JList jList) { Collection<City> city; if (r == null) { city = Collections.emptyList(); } else { city = r.getSuggestedCities(text, 100); } City[] names = new City[city.size()]; int i = 0; for (City c : city) { names[i++] = c; } jList.setListData(names); } public static class RegionCellEditor extends DefaultTreeCellEditor { public RegionCellEditor(JTree tree, DefaultTreeCellRenderer renderer) { super(tree, renderer); } public RegionCellEditor(JTree tree, DefaultTreeCellRenderer renderer, TreeCellEditor editor) { super(tree, renderer, editor); } public boolean isCellEditable(EventObject event) { boolean returnValue = super.isCellEditable(event); if (returnValue) { Object node = tree.getLastSelectedPathComponent(); if (node instanceof DataExtractionTreeNode) { DataExtractionTreeNode treeNode = (DataExtractionTreeNode) node; if (treeNode.getModelObject() instanceof Region || treeNode.getModelObject() instanceof MapObject) { return true; } } } return returnValue; } } private class PopupTrigger extends MouseAdapter { private final JPopupMenu popupMenu; public PopupTrigger(JPopupMenu popupMenu) { this.popupMenu = popupMenu; } public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { int x = e.getX(); int y = e.getY(); TreePath path = treePlaces.getPathForLocation(x, y); if (path != null) { if(!treePlaces.getSelectionModel().isPathSelected(path)){ treePlaces.setSelectionPath(path); } popupMenu.show(treePlaces, x, y); } } } } */ }