Index: mapview/src/main/java/slash/navigation/converter/gui/models/PositionsModel.java =================================================================== --- mapview/src/main/java/slash/navigation/converter/gui/models/PositionsModel.java (revision 1985) +++ mapview/src/main/java/slash/navigation/converter/gui/models/PositionsModel.java (working copy) @@ -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/helper/FrameMenu.java =================================================================== --- route-converter/src/main/java/slash/navigation/converter/gui/helper/FrameMenu.java (revision 1985) +++ route-converter/src/main/java/slash/navigation/converter/gui/helper/FrameMenu.java (working copy) @@ -42,6 +42,7 @@ printMenu.add(JMenuHelper.createItem("print-map")); printMenu.add(JMenuHelper.createItem("print-map-and-route")); printMenu.add(JMenuHelper.createItem("print-elevation-profile")); + printMenu.add(JMenuHelper.createItem("print-positions")); fileMenu.add(printMenu); fileMenu.addSeparator(); fileMenu.add(JMenuHelper.createItem("exit")); @@ -83,6 +84,7 @@ toolsMenu.add(JMenuHelper.createItem("insert-positions")); toolsMenu.add(JMenuHelper.createItem("delete-positions")); toolsMenu.add(JMenuHelper.createItem("revert-positions")); + toolsMenu.add(JMenuHelper.createItem("print-positions")); JMenu extrasMenu = JMenuHelper.createMenu("extras"); extrasMenu.add(JMenuHelper.createItem("options")); Index: route-converter/src/main/java/slash/navigation/converter/gui/models/FormatAndRoutesModel.java =================================================================== --- route-converter/src/main/java/slash/navigation/converter/gui/models/FormatAndRoutesModel.java (revision 1985) +++ route-converter/src/main/java/slash/navigation/converter/gui/models/FormatAndRoutesModel.java (working copy) @@ -72,7 +72,14 @@ }); } - @SuppressWarnings("unchecked") + 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/models/PositionsModelImpl.java =================================================================== --- route-converter/src/main/java/slash/navigation/converter/gui/models/PositionsModelImpl.java (revision 1985) +++ route-converter/src/main/java/slash/navigation/converter/gui/models/PositionsModelImpl.java (working copy) @@ -50,7 +50,12 @@ public class PositionsModelImpl extends AbstractTableModel implements PositionsModel { private static final DateFormat TIME_FORMAT = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM); private BaseRoute route; + private PositionsTableColumnModel positionsTableColumnModel; + public void setPositionsTableColumnModel( PositionsTableColumnModel pmtcm) { + positionsTableColumnModel = pmtcm; + } + public BaseRoute getRoute() { return route; } @@ -65,7 +70,9 @@ } public int getColumnCount() { - throw new IllegalArgumentException("This is determined by the PositionsTableColumnModel"); + if ( null != positionsTableColumnModel ) + return positionsTableColumnModel.getColumnCount(); + return 0; } private String formatElevation(Double elevation) { 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 1985) +++ route-converter/src/main/java/slash/navigation/converter/gui/panels/ConvertPanel.java (working copy) @@ -104,10 +104,12 @@ 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; @@ -142,6 +144,7 @@ private JLabel labelOverallAscend; private JLabel labelOverallDescend; protected JTable tablePositions; + private TableRowSorter sorter; private JComboBox comboBoxChoosePositionList; private JComboBox comboBoxChoosePositionListCharacteristics; private JButton buttonNewPositionList; @@ -210,7 +213,7 @@ buttonMovePositionToTop.addActionListener(new FrameAction() { public void run() { - int[] selectedRows = tablePositions.getSelectedRows(); + int[] selectedRows = retrieveSelectedRows(); if (selectedRows.length > 0) { getPositionsModel().top(selectedRows); reestablishPositionSelection(0); @@ -220,7 +223,7 @@ buttonMovePositionUp.addActionListener(new FrameAction() { public void run() { - int[] selectedRows = tablePositions.getSelectedRows(); + int[] selectedRows = retrieveSelectedRows(); if (selectedRows.length > 0) { getPositionsModel().up(selectedRows); reestablishPositionSelection(-1); @@ -233,7 +236,7 @@ buttonMovePositionDown.addActionListener(new FrameAction() { public void run() { - int[] selectedRows = tablePositions.getSelectedRows(); + int[] selectedRows = retrieveSelectedRows(); if (selectedRows.length > 0) { getPositionsModel().down(selectedRows); reestablishPositionSelection(+1); @@ -243,7 +246,7 @@ buttonMovePositionToBottom.addActionListener(new FrameAction() { public void run() { - int[] selectedRows = tablePositions.getSelectedRows(); + int[] selectedRows = retrieveSelectedRows(); if (selectedRows.length > 0) { getPositionsModel().bottom(selectedRows); reestablishPositionSelection(0); @@ -281,12 +284,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(); @@ -792,7 +799,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; @@ -827,6 +834,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); } @@ -1176,4 +1184,58 @@ 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; + } } Index: route-converter/src/main/java/slash/navigation/converter/gui/RouteConverter.java =================================================================== --- route-converter/src/main/java/slash/navigation/converter/gui/RouteConverter.java (revision 1985) +++ route-converter/src/main/java/slash/navigation/converter/gui/RouteConverter.java (working copy) @@ -797,6 +797,7 @@ actionManager.register("print-map", new PrintMapAction(false)); actionManager.register("print-map-and-route", new PrintMapAction(true)); actionManager.register("print-elevation-profile", new PrintElevationProfileAction()); + actionManager.register("print-positions", new PrintPositionsAction()); actionManager.register("find-place", new FindPlaceAction()); actionManager.register("show-map-and-positionlist", new ShowMapAndPositionListAction()); actionManager.register("show-elevation-profile", new ShowElevationProfileAction()); @@ -841,6 +842,16 @@ } } + private class PrintPositionsAction extends FrameAction { + private PrintPositionsAction(){ + + } + + public void run() { + getConvertPanel().print(); + } + } + private class ShowMapAndPositionListAction extends ShowElevationProfileAction { public void run() { mapSplitPane.setDividerLocation(getConvertPanel().getRootComponent().getMinimumSize().width); 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 1985) +++ route-converter/src/main/java/slash/navigation/converter/gui/undo/UndoPositionsModel.java (working copy) @@ -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.properties =================================================================== --- route-converter/src/main/resources/slash/navigation/converter/gui/RouteConverter.properties (revision 1985) +++ route-converter/src/main/resources/slash/navigation/converter/gui/RouteConverter.properties (working copy) @@ -114,6 +114,9 @@ revert-positions-action=Reverse Position List revert-positions-action-mnemonic=R +print-positions-action=Positions list... +print-positions-action-mnemonic=P + extras-menu=Extras extras-menu-mnemonic=x options-action=Options... @@ -328,6 +331,10 @@ delete-selected-positions=Delete selected positions delete-selected-positions-mnemonic=D +print-positions-title=Print positions list +print-positions=Print positions list +print-positions-error=error printing positions list + rename-title=Rename position list rename-route-name-too-long=The ''{0}'' format allows just {1} characters. 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 1985) +++ route-converter/src/main/resources/slash/navigation/converter/gui/RouteConverter_de.properties (working copy) @@ -90,6 +90,9 @@ revert-positions-action=Kehre Positionsliste um revert-positions-action-mnemonic=K +print-positions-action=Positionsliste... +print-positions-action-mnemonic=D + extras-menu=Extras extras-menu-mnemonic=E options-action=Optionen... @@ -278,6 +281,10 @@ insert-only-turnpoints-mnemonic=N insert-error=Fehler beim Geokodieren:\n{0} +print-positions-title=Drucke Positionsliste 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.