/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo 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. * * OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.openflexo.fib.view.widget.table; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Enumeration; import java.util.Hashtable; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import org.openflexo.fib.controller.FIBController; import org.openflexo.fib.model.FIBTable; import org.openflexo.fib.model.FIBTableAction; import org.openflexo.fib.utils.FIBIconLibrary; import org.openflexo.fib.view.widget.FIBTableWidget; import org.openflexo.localization.FlexoLocalization; public class FIBTableWidgetFooter extends JPanel { protected static final Logger logger = Logger.getLogger(FIBTableWidgetFooter.class.getPackage().getName()); public static final int MINIMUM_BROWSER_VIEW_WIDTH = 200; protected FIBTableWidget _widget; protected FIBTable _fibTable; protected JButton plusButton; protected JButton minusButton; protected JButton optionsButton; protected JPopupMenu popupMenu = null; /** * Stores controls: key is the JButton and value the FIBTableActionListener */ // private Hashtable<JButton,FIBTableActionListener> _controls; public FIBTableWidgetFooter(FIBTableWidget widget) { super(); _widget = widget; initializeActions(widget); setOpaque(false); setBorder(BorderFactory.createEmptyBorder()); setLayout(new BorderLayout()); JPanel plusMinusPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); plusMinusPanel.setBorder(BorderFactory.createEmptyBorder()); plusMinusPanel.setOpaque(false); plusButton = new JButton(FIBIconLibrary.BROWSER_PLUS_ICON); plusButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (!hasMultiplePlusActions()) { plusPressed(); plusButton.setIcon(FIBIconLibrary.BROWSER_PLUS_ICON); } } }); plusButton.setBorder(BorderFactory.createEmptyBorder()); plusButton.setDisabledIcon(FIBIconLibrary.BROWSER_PLUS_DISABLED_ICON); // plusButton.setSelectedIcon(FlexoCst.BROWSER_PLUS_SELECTED_ICON); plusButton.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent mouseEvent) { if (plusButton.isEnabled()) { plusButton.setIcon(FIBIconLibrary.BROWSER_PLUS_SELECTED_ICON); } if (hasMultiplePlusActions()) { getPlusActionMenu().show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY()); plusButton.setIcon(FIBIconLibrary.BROWSER_PLUS_ICON); } } @Override public void mouseReleased(MouseEvent mouseEvent) { if (plusButton.isEnabled()) { plusButton.setIcon(FIBIconLibrary.BROWSER_PLUS_ICON); } if (hasMultiplePlusActions()) { getPlusActionMenu().show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY()); } } }); minusButton = new JButton(FIBIconLibrary.BROWSER_MINUS_ICON); minusButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (!hasMultipleMinusActions()) { minusPressed(); minusButton.setIcon(FIBIconLibrary.BROWSER_MINUS_ICON); } } }); minusButton.setBorder(BorderFactory.createEmptyBorder()); minusButton.setDisabledIcon(FIBIconLibrary.BROWSER_MINUS_DISABLED_ICON); // minusButton.setSelectedIcon(FlexoCst.BROWSER_MINUS_SELECTED_ICON); minusButton.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent mouseEvent) { if (minusButton.isEnabled()) { minusButton.setIcon(FIBIconLibrary.BROWSER_MINUS_SELECTED_ICON); } if (hasMultipleMinusActions()) { getMinusActionMenu().show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY()); minusButton.setIcon(FIBIconLibrary.BROWSER_MINUS_ICON); } } @Override public void mouseReleased(MouseEvent mouseEvent) { if (minusButton.isEnabled()) { minusButton.setIcon(FIBIconLibrary.BROWSER_MINUS_ICON); } if (hasMultipleMinusActions()) { getMinusActionMenu().show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY()); } } }); plusMinusPanel.add(plusButton); plusMinusPanel.add(minusButton); add(plusMinusPanel, BorderLayout.WEST); optionsButton = new JButton(FIBIconLibrary.BROWSER_OPTIONS_ICON); optionsButton.setBorder(BorderFactory.createEmptyBorder()); optionsButton.setDisabledIcon(FIBIconLibrary.BROWSER_OPTIONS_DISABLED_ICON); add(optionsButton, BorderLayout.EAST); optionsButton.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent mouseEvent) { if (optionsButton.isEnabled()) { optionsButton.setIcon(FIBIconLibrary.BROWSER_OPTIONS_SELECTED_ICON); } getOptionActionMenu().show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY()); } @Override public void mouseReleased(MouseEvent mouseEvent) { if (optionsButton.isEnabled()) { optionsButton.setIcon(FIBIconLibrary.BROWSER_OPTIONS_ICON); } getOptionActionMenu().show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY()); } }); handleSelectionCleared(); revalidate(); } public void handleSelectionChanged() { // System.out.println("handleSelectionChanged"); plusActionMenuNeedsRecomputed = true; minusActionMenuNeedsRecomputed = true; optionsActionMenuNeedsRecomputed = true; if (hasMultiplePlusActions()) { plusButton.setEnabled(true && _widget.isEnabled()); } else { boolean isActive = false; for (FIBTableAction action : _addActions.keySet()) { FIBTableActionListener actionListener = _addActions.get(action); if (actionListener.isActive(_widget.getSelectedObject())) { isActive = true; } } plusButton.setEnabled(isActive && _widget.isEnabled()); } boolean isMinusActive = false; for (FIBTableAction action : _removeActions.keySet()) { FIBTableActionListener actionListener = _removeActions.get(action); if (actionListener.isActive(_widget.getSelectedObject())) { isMinusActive = true; } } minusButton.setEnabled(isMinusActive && _widget.isEnabled()); optionsButton.setEnabled(_otherActions.size() > 0 && _widget.isEnabled()); /*FlexoModelObject focusedObject = getFocusedObject(); Vector<FlexoModelObject> globalSelection = buildGlobalSelection(); plusButton.setEnabled((focusedObject != null) && (getActionTypesWithAddType(focusedObject).size() > 0)); minusButton.setEnabled((focusedObject != null) && (getActionTypesWithDeleteType(focusedObject, globalSelection).size() > 0)); plusActionMenuNeedsRecomputed = true;*/ } protected void handleSelectionCleared() { handleSelectionChanged(); /*System.out.println("handleSelectionCleared"); plusButton.setEnabled(false); minusButton.setEnabled(false); plusActionMenuNeedsRecomputed = true; minusActionMenuNeedsRecomputed = true; optionsActionMenuNeedsRecomputed = true; */ } void plusPressed() { for (FIBTableAction action : _addActions.keySet()) { FIBTableActionListener actionListener = _addActions.get(action); if (actionListener.isActive(_widget.getSelectedObject())) { actionListener.performAction(_widget.getSelectedObject()); } } } void minusPressed() { for (FIBTableAction action : _removeActions.keySet()) { FIBTableActionListener actionListener = _removeActions.get(action); if (actionListener.isActive(_widget.getSelectedObject())) { // actionListener.performAction(_tableModel.getSelectedObject(), _tableModel.getSelectedObjects()); actionListener.performAction(_widget.getSelectedObject()); } } } boolean hasMultiplePlusActions() { return _addActions.size() > 1; } boolean hasMultipleMinusActions() { return _removeActions.size() > 1; } private JPopupMenu plusActionMenu = null; private JPopupMenu minusActionMenu = null; private JPopupMenu optionsActionMenu = null; private boolean plusActionMenuNeedsRecomputed = true; private boolean minusActionMenuNeedsRecomputed = true; private boolean optionsActionMenuNeedsRecomputed = true; private JPopupMenu getPlusActionMenu() { if (plusActionMenuNeedsRecomputed) { plusActionMenu = new JPopupMenu(); if (logger.isLoggable(Level.FINE)) { logger.fine("Build plus menu"); } for (FIBTableAction action : _addActions.keySet()) { FIBTableActionListener actionListener = _addActions.get(action); actionListener.setSelectedObject(_widget.getSelectedObject()); // actionListener.setSelectedObjects(_tableModel.getSelectedObjects()); JMenuItem menuItem = new JMenuItem(getLocalized(action.getName())); menuItem.addActionListener(actionListener); plusActionMenu.add(menuItem); menuItem.setEnabled(actionListener.isActive(_widget.getSelectedObject())); } plusActionMenuNeedsRecomputed = false; } return plusActionMenu; } private JPopupMenu getMinusActionMenu() { if (minusActionMenuNeedsRecomputed) { minusActionMenu = new JPopupMenu(); for (FIBTableAction action : _removeActions.keySet()) { FIBTableActionListener actionListener = _removeActions.get(action); actionListener.setSelectedObject(_widget.getSelectedObject()); // actionListener.setSelectedObjects(_tableModel.getSelectedObjects()); JMenuItem menuItem = new JMenuItem(getLocalized(action.getName())); menuItem.addActionListener(actionListener); minusActionMenu.add(menuItem); menuItem.setEnabled(actionListener.isActive(_widget.getSelectedObject())); } minusActionMenuNeedsRecomputed = false; } return minusActionMenu; } private JPopupMenu getOptionActionMenu() { if (optionsActionMenuNeedsRecomputed) { optionsActionMenu = new JPopupMenu(); if (logger.isLoggable(Level.FINE)) { logger.fine("Build plus menu"); } for (FIBTableAction action : _otherActions.keySet()) { FIBTableActionListener actionListener = _otherActions.get(action); actionListener.setSelectedObject(_widget.getSelectedObject()); // actionListener.setSelectedObjects(_tableModel.getSelectedObjects()); JMenuItem menuItem = new JMenuItem(getLocalized(action.getName())); menuItem.addActionListener(actionListener); optionsActionMenu.add(menuItem); menuItem.setEnabled(actionListener.isActive(_widget.getSelectedObject())); } optionsActionMenuNeedsRecomputed = false; } return optionsActionMenu; } private Hashtable<FIBTableAction, FIBTableActionListener> _addActions; private Hashtable<FIBTableAction, FIBTableActionListener> _removeActions; private Hashtable<FIBTableAction, FIBTableActionListener> _otherActions; private void initializeActions(FIBTableWidget tableWidget) { _addActions = new Hashtable<FIBTableAction, FIBTableActionListener>(); _removeActions = new Hashtable<FIBTableAction, FIBTableActionListener>(); _otherActions = new Hashtable<FIBTableAction, FIBTableActionListener>(); for (FIBTableAction plAction : tableWidget.getComponent().getActions()) { FIBTableActionListener plActionListener = new FIBTableActionListener(plAction, tableWidget); if (plActionListener.isAddAction()) { _addActions.put(plAction, plActionListener); } else if (plActionListener.isRemoveAction()) { _removeActions.put(plAction, plActionListener); } else if (plActionListener.isCustomAction()) { _otherActions.put(plAction, plActionListener); } } } public void delete() { for (FIBTableAction a : _addActions.keySet()) { _addActions.get(a).delete(); } for (FIBTableAction a : _removeActions.keySet()) { _removeActions.get(a).delete(); } for (FIBTableAction a : _otherActions.keySet()) { _otherActions.get(a).delete(); } _widget = null; _fibTable = null; } public Enumeration<FIBTableActionListener> getAddActionListeners() { return _addActions.elements(); } public void setModel(Object model) { // logger.info("Set model with "+model); for (FIBTableAction action : _addActions.keySet()) { FIBTableActionListener actionListener = _addActions.get(action); actionListener.setModel(model); } for (FIBTableAction action : _removeActions.keySet()) { FIBTableActionListener actionListener = _removeActions.get(action); actionListener.setModel(model); } for (FIBTableAction action : _otherActions.keySet()) { FIBTableActionListener actionListener = _otherActions.get(action); actionListener.setModel(model); } handleSelectionChanged(); /* for (Enumeration en = _controls.elements(); en.hasMoreElements();) { FIBTableActionListener actionListener = (FIBTableActionListener) en.nextElement(); actionListener.setModel(model); } updateControls(null);*/ } public FIBController getController() { return _widget.getController(); } public String getLocalized(String key) { return FlexoLocalization.localizedForKey(getController().getLocalizerForComponent(_fibTable), key); } }