Index: route-converter/src/main/java/slash/navigation/converter/gui/RouteConverter.java =================================================================== @@ -801,6 +801,7 @@ + actionManager.register("print-positions", new PrintPositionsAction()); @@ -845,6 +846,16 @@ + private class PrintPositionsAction extends FrameAction { + private PrintPositionsAction(){ + + } + + public void run() { + getConvertPanel().print(); + } + } + Index: route-converter/src/main/java/slash/navigation/converter/gui/helper/FrameMenu.java =================================================================== @@ -42,6 +42,7 @@ + printMenu.add(JMenuHelper.createItem("print-positions")); @@ -83,6 +84,7 @@ + toolsMenu.add(JMenuHelper.createItem("print-positions")); Index: route-converter/src/main/java/slash/navigation/converter/gui/models/PositionsModelImpl.java =================================================================== @@ -50,7 +50,12 @@ + private PositionsTableColumnModel positionsTableColumnModel; + public void setPositionsTableColumnModel( PositionsTableColumnModel pmtcm) { + positionsTableColumnModel = pmtcm; + } + @@ -65,7 +70,10 @@ + if ( null != positionsTableColumnModel ) + return positionsTableColumnModel.getColumnCount(); + return 0; Index: route-converter/src/main/resources/slash/navigation/converter/gui/RouteConverter.properties =================================================================== @@ -114,6 +114,10 @@ +print-positions-action=Positions... +print-positions-action-mnemonic=P +print-positions-action-icon=slash/navigation/converter/gui/insert-positions-action.png @@ -328,6 +332,10 @@ +print-positions-title=Print positions +print-positions=Print positionlist +print-positions-error=error printing error list Index: route-converter/src/main/java/slash/navigation/converter/gui/models/FormatAndRoutesModel.java =================================================================== @@ -72,6 +72,14 @@ + public void setPositionsTableColumnModel( PositionsTableColumnModel ptcm ){ + if ( null != getPositionsModel() ) { + UndoPositionsModel upm = (UndoPositionsModel) getPositionsModel(); + if (null != upm) { + upm.setPositionsTableColumnModel( ptcm ); + } + } + } public List getRoutes() { return formatAndRoutes != null ? formatAndRoutes.getRoutes() : null; } Index: route-converter/src/main/java/slash/navigation/converter/gui/undo/UndoPositionsModel.java =================================================================== --- route-converter/src/main/java/slash/navigation/converter/gui/undo/UndoPositionsModel.java (revision 1891) +++ route-converter/src/main/java/slash/navigation/converter/gui/undo/UndoPositionsModel.java Wed Sep 01 22:39:24 CEST 2010 @@ -7,6 +7,7 @@ import slash.navigation.base.*; import slash.navigation.converter.gui.models.PositionsModel; import slash.navigation.converter.gui.models.PositionsModelImpl; +import slash.navigation.converter.gui.models.PositionsTableColumnModel; import slash.navigation.gui.UndoManager; import javax.swing.event.TableModelListener; @@ -29,6 +30,10 @@ this.undoManager = undoManager; } + public void setPositionsTableColumnModel( PositionsTableColumnModel pmtcm) { + delegate.setPositionsTableColumnModel(pmtcm); + } + // TableModel public int getRowCount() { Index: route-converter/src/main/resources/slash/navigation/converter/gui/RouteConverter_de.properties =================================================================== --- route-converter/src/main/resources/slash/navigation/converter/gui/RouteConverter_de.properties (revision 1930) +++ route-converter/src/main/resources/slash/navigation/converter/gui/RouteConverter_de.properties Fri Sep 03 18:57:36 CEST 2010 @@ -20,6 +20,7 @@ print-map-and-route-action-mnemonic=R print-elevation-profile-action=Höhenprofil... print-elevation-profile-action-mnemonic=H + exit-action=Beenden exit-action-mnemonic=B @@ -90,6 +91,9 @@ revert-positions-action=Kehre Positionsliste um revert-positions-action-mnemonic=K +print-positions-action=Positionsliste aus +print-positions-action-mnemonic=D + extras-menu=Extras extras-menu-mnemonic=E options-action=Optionen... @@ -278,6 +282,10 @@ insert-only-turnpoints-mnemonic=N insert-error=Fehler beim Geokodieren:\n{0} +print-positions-title=Drucke Positionen aus +print-positions=Positionsliste... +print-positions-error=Fehler beim drucken der Positionsliste + delete-positions-title=Lösche Positionen delete-select-by-distance=Markiere alle Positionen innerhalb einer Distanz von delete-select-by-distance-meter=Metern zu ihrem Vorgänger. Index: mapview/src/main/java/slash/navigation/converter/gui/models/PositionsModel.java =================================================================== --- mapview/src/main/java/slash/navigation/converter/gui/models/PositionsModel.java (revision 1885) +++ mapview/src/main/java/slash/navigation/converter/gui/models/PositionsModel.java Wed Sep 01 22:42:02 CEST 2010 @@ -64,4 +64,10 @@ void bottom(int[] rowIndices); void fireTableRowsUpdated(int firstIndex, int lastIndex, int columnIndex); + + public int getRowCount(); + public int getColumnCount(); + public String getColumnName( int columnIndex ); + public Class getColumnClass( int columnIndex ); + public Object getValueAt( int rowIndex, int columnIndex ); } Index: route-converter/src/main/java/slash/navigation/converter/gui/panels/ConvertPanel.java =================================================================== --- route-converter/src/main/java/slash/navigation/converter/gui/panels/ConvertPanel.java (revision 1932) +++ route-converter/src/main/java/slash/navigation/converter/gui/panels/ConvertPanel.java Fri Sep 03 18:44:15 CEST 2010 @@ -58,6 +58,7 @@ import slash.navigation.converter.gui.dialogs.RenameDialog; import slash.navigation.converter.gui.dialogs.UploadDialog; import slash.navigation.converter.gui.dnd.ClipboardInteractor; +import slash.navigation.converter.gui.dnd.DnDHelper; import slash.navigation.converter.gui.helper.AbstractDocumentListener; import slash.navigation.converter.gui.helper.AbstractListDataListener; import slash.navigation.converter.gui.helper.JMenuHelper; @@ -104,13 +105,16 @@ import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.filechooser.FileFilter; +import javax.swing.table.TableRowSorter; import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; +import java.awt.print.PrinterException; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; +import java.net.MalformedURLException; import java.net.URL; import java.text.MessageFormat; import java.util.ArrayList; @@ -141,6 +145,7 @@ private JLabel labelOverallAscend; private JLabel labelOverallDescend; protected JTable tablePositions; + private TableRowSorter sorter; private JComboBox comboBoxChoosePositionList; private JComboBox comboBoxChoosePositionListCharacteristics; private JButton buttonNewPositionList; @@ -194,7 +199,7 @@ buttonMovePositionToTop.addActionListener(new FrameAction() { public void run() { - int[] selectedRows = tablePositions.getSelectedRows(); + int[] selectedRows = retrieveSelectedRows(); if (selectedRows.length > 0) { getPositionsModel().top(selectedRows); reestablishPositionSelection(0); @@ -204,7 +209,7 @@ buttonMovePositionUp.addActionListener(new FrameAction() { public void run() { - int[] selectedRows = tablePositions.getSelectedRows(); + int[] selectedRows = retrieveSelectedRows(); if (selectedRows.length > 0) { getPositionsModel().up(selectedRows); reestablishPositionSelection(-1); @@ -217,7 +222,7 @@ buttonMovePositionDown.addActionListener(new FrameAction() { public void run() { - int[] selectedRows = tablePositions.getSelectedRows(); + int[] selectedRows = retrieveSelectedRows(); if (selectedRows.length > 0) { getPositionsModel().down(selectedRows); reestablishPositionSelection(+1); @@ -227,7 +232,7 @@ buttonMovePositionToBottom.addActionListener(new FrameAction() { public void run() { - int[] selectedRows = tablePositions.getSelectedRows(); + int[] selectedRows = retrieveSelectedRows(); if (selectedRows.length > 0) { getPositionsModel().bottom(selectedRows); reestablishPositionSelection(0); @@ -265,12 +270,16 @@ } }, KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + sorter = new TableRowSorter( getPositionsModel() ); + tablePositions.setRowSorter( sorter ); getPositionsModel().addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent e) { handlePositionsUpdate(); } }); + formatAndRoutesModel.setPositionsTableColumnModel( tableColumnModel ); + JMenuBar menuBar = Application.getInstance().getContext().getMenuBar(); new TableHeaderMenu(tablePositions.getTableHeader(), menuBar, tableColumnModel); JPopupMenu menu = new TablePopupMenu(tablePositions).createMenu(); @@ -321,6 +330,7 @@ }); handleUndoUpdate(); + handleFormatUpdate(); // TODO do we need this? handleRoutesUpdate(); handlePositionsUpdate(); @@ -362,6 +372,27 @@ // action methods + protected void handleDrop(List files) { + if (RouteConverter.getInstance().isConvertPanelSelected()) + openUrls(Files.toUrls(files.toArray(new File[files.size()]))); + else if (RouteConverter.getInstance().isBrowsePanelSelected()) + RouteConverter.getInstance().addFilesToCatalog(files); + } + + protected void handleDrop(String string) { + if (RouteConverter.getInstance().isConvertPanelSelected()) { + String url = DnDHelper.extractUrl(string); + try { + openPositionList(Arrays.asList(new URL(url))); + } + catch (MalformedURLException e) { + log.severe("Could not create URL from '" + url + "'"); + } + } else if (RouteConverter.getInstance().isBrowsePanelSelected()) { + RouteConverter.getInstance().addUrlToCatalog(string); + } + } + public void openUrls(List urls) { if (!confirmDiscard()) return; @@ -762,6 +793,18 @@ actionManager.enable("redo", undoManager.canRedo()); } + private void handleFormatUpdate() { + boolean supportsMultipleRoutes = formatAndRoutesModel.getFormat() instanceof MultipleRoutesFormat; + boolean existsMoreThanOneRoute = formatAndRoutesModel.getSize() > 1; + boolean existsMoreThanOnePosition = getPositionsModel().getRowCount() > 1; + + buttonNewPositionList.setEnabled(supportsMultipleRoutes); + buttonRemovePositionList.setEnabled(existsMoreThanOneRoute); + + ActionManager actionManager = RouteConverter.getInstance().getContext().getActionManager(); + actionManager.enable("split-positionlist", supportsMultipleRoutes && existsMoreThanOnePosition); + } + private void handleRoutesUpdate() { boolean supportsMultipleRoutes = formatAndRoutesModel.getFormat() instanceof MultipleRoutesFormat; boolean existsARoute = formatAndRoutesModel.getSize() > 0; @@ -780,7 +823,7 @@ private int[] selectedPositionIndices = new int[0]; private void handlePositionsUpdate() { - int[] selectedRows = tablePositions.getSelectedRows(); + int[] selectedRows = retrieveSelectedRows(); // avoid firing events of the selection hasn't changed if (Arrays.equals(this.selectedPositionIndices, selectedRows)) return; @@ -815,6 +858,7 @@ actionManager.enable("insert-positions", existsAPosition); actionManager.enable("delete-positions", existsAPosition); actionManager.enable("revert-positions", existsMoreThanOnePosition); + actionManager.enable("print-positions", existsAPosition); RouteConverter.getInstance().selectPositions(selectedRows); } @@ -1181,4 +1225,59 @@ public JComponent $$$getRootComponent$$$() { return convertPanel; } + + public void print() { + + RouteConverter r = RouteConverter.getInstance(); + + try { + getPositionsView().print(); + } catch (PrinterException e) { + log.severe("Print postionslist: " + e.getMessage()); + + JOptionPane.showMessageDialog(r.getFrame(), + RouteConverter.getBundle().getString("print-positions-error"), + r.getFrame().getTitle(), JOptionPane.ERROR_MESSAGE); + } finally { + Constants.stopWaitCursor(RouteConverter.getInstance().getFrame().getRootPane()); -} + } + } + + private int[] retrieveSelectedRows() { + + int[] selectedRows = tablePositions.getSelectedRows(); + + int[] convertedRows = new int[ selectedRows.length ]; + + int index; + + int count = 0; + + for (int i = 0; i < selectedRows.length; ++i){ + index = selectedRows[i]; + if ( 0 > index ) { + // we shouldn't get here!?! + convertedRows[i] = -1; + } else { + + index = tablePositions.convertRowIndexToModel( index ); + convertedRows[i] = index; + count++; + + } + } + + selectedRows = new int[count]; + + for (int k = 0, i= 0; k < count; ++k) { + if (0 <= convertedRows[k]) { + + selectedRows[i] = convertedRows[k]; + ++i; + } + } + + return selectedRows; + } +} +