/* This file is part of RouteConverter. RouteConverter 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 2 of the License, or (at your option) any later version. RouteConverter 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 RouteConverter; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Copyright (C) 2007 Christian Pesch. All Rights Reserved. */ package slash.navigation.converter.gui.helpers; import slash.navigation.converter.gui.RouteConverter; import slash.navigation.converter.gui.actions.ToggleColumnVisibilityAction; import slash.navigation.converter.gui.models.AbstractTableColumnModel; import slash.navigation.converter.gui.models.PositionTableColumn; import slash.navigation.converter.gui.models.PositionTableColumnButtonModel; import slash.navigation.converter.gui.models.PositionsModel; import slash.navigation.gui.actions.ActionManager; import slash.navigation.gui.actions.FrameAction; import javax.swing.*; import javax.swing.table.JTableHeader; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.List; import static slash.navigation.converter.gui.models.PositionTableColumn.VISIBLE_PROPERTY_NAME; import static slash.navigation.gui.helpers.JMenuHelper.setMnemonic; /** * Helps to make popups for tables headers useable. * * @author Christian Pesch */ public abstract class AbstractTableHeaderMenu { private static final String SHOW_INFIX = "-show-"; private static final String SORT_INFIX = "-sort-"; private static final String MNEMONIC_SUFFIX = "-mnemonic"; private final AbstractTableColumnModel columnModel; private final ActionManager actionManager; private final String preferencesPrefix; private final JPopupMenu popupMenu = new JPopupMenu(); public AbstractTableHeaderMenu(AbstractTableColumnModel columnModel, ActionManager actionManager, String preferencesPrefix) { this.columnModel = columnModel; this.actionManager = actionManager; this.preferencesPrefix = preferencesPrefix; } private String createShowKey(String columnName) { return preferencesPrefix + SHOW_INFIX + columnName; } private String createSortKey(String columnName) { return preferencesPrefix + SORT_INFIX + columnName; } protected void initializeSortPositions(JMenu sortPositionListMenu, PositionsModel positionsModel) { for (PositionTableColumn column : columnModel.getPreparedColumns()) { if (column.getComparator() == null) continue; String menuItemText = RouteConverter.getBundle().getString(column.getName()); SortColumnAction action = new SortColumnAction(positionsModel, column); actionManager.register(createSortKey(column.getName()), action); JMenuItem menuBarItem = new JMenuItem(action); menuBarItem.setText(menuItemText); setMnemonic(menuBarItem, column.getName() + MNEMONIC_SUFFIX); sortPositionListMenu.add(menuBarItem); } } protected void initializeShowColumn(JMenu showColumnMenu) { VisibleListener visibleListener = new VisibleListener(); for (PositionTableColumn column : columnModel.getPreparedColumns()) { column.addPropertyChangeListener(visibleListener); String menuItemText = RouteConverter.getBundle().getString(column.getName()); ToggleColumnVisibilityAction action = new ToggleColumnVisibilityAction(column); actionManager.register(createShowKey(column.getName()), action); JCheckBoxMenuItem popupItem = new JCheckBoxMenuItem(menuItemText); popupItem.setModel(new PositionTableColumnButtonModel(column, action)); popupMenu.add(popupItem); if (showColumnMenu != null) { JCheckBoxMenuItem menuBarItem = new JCheckBoxMenuItem(menuItemText); menuBarItem.setModel(new PositionTableColumnButtonModel(column, action)); setMnemonic(menuBarItem, column.getName() + MNEMONIC_SUFFIX); showColumnMenu.add(menuBarItem); } } } protected void initializePopup(JTableHeader tableHeader) { tableHeader.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { showPopup(e); } public void mouseReleased(MouseEvent e) { showPopup(e); } }); } private void showPopup(MouseEvent e) { if (e.isPopupTrigger()) popupMenu.show(e.getComponent(), e.getX(), e.getY()); } private List<ToggleColumnVisibilityAction> getActions() { List<ToggleColumnVisibilityAction> result = new ArrayList<>(); for (PositionTableColumn column : columnModel.getPreparedColumns()) { result.add((ToggleColumnVisibilityAction) actionManager.get(createShowKey(column.getName()))); } return result; } private void enableAllActions() { for (ToggleColumnVisibilityAction action : getActions()) { if (!action.isEnabled()) action.setEnabled(true); } } private void disableLastSelectedAction() { for (ToggleColumnVisibilityAction action : getActions()) { if (action.isSelected()) action.setEnabled(false); } } public void enableSortActions(boolean enable) { for (PositionTableColumn column : columnModel.getPreparedColumns()) if (column.getComparator() != null) actionManager.enable(createSortKey(column.getName()), enable); } private void visibilityChanged() { if (columnModel.getVisibleColumnCount() > 1) enableAllActions(); else disableLastSelectedAction(); } private class VisibleListener implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals(VISIBLE_PROPERTY_NAME)) visibilityChanged(); } } private static class SortColumnAction extends FrameAction { private final PositionsModel positionsModel; private final PositionTableColumn column; public SortColumnAction(PositionsModel positionsModel, PositionTableColumn column) { this.positionsModel = positionsModel; this.column = column; } public void run() { positionsModel.sort(column.getComparator()); } } }