/*
* (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.inspector.widget.propertylist;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
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.ImageIcon;
import javax.swing.JButton;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import org.openflexo.inspector.InspectableObject;
import org.openflexo.inspector.model.PropertyListAction;
import org.openflexo.inspector.model.PropertyListModel;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.toolbox.ImageIconResource;
import org.openflexo.toolbox.ToolBox;
public class PropertyListWidgetFooter extends JPanel {
protected static final Logger logger = Logger.getLogger(PropertyListWidgetFooter.class.getPackage().getName());
@Deprecated
public static final Color GUI_BACK_COLOR = ToolBox.getPLATFORM() == ToolBox.MACOS ? null : Color.WHITE;
// deprecated: will be removed while inspector project will disappear
// For now, icons are retrieved inside FIB project
public static final ImageIcon BROWSER_PLUS_ICON = new ImageIconResource("Icons/GUI/BrowserPlus.gif");
public static final ImageIcon BROWSER_PLUS_DISABLED_ICON = new ImageIconResource("Icons/GUI/BrowserPlusDisabled.gif");
public static final ImageIcon BROWSER_PLUS_SELECTED_ICON = new ImageIconResource("Icons/GUI/BrowserPlusSelected.gif");
public static final ImageIcon BROWSER_MINUS_ICON = new ImageIconResource("Icons/GUI/BrowserMinus.gif");
public static final ImageIcon BROWSER_MINUS_DISABLED_ICON = new ImageIconResource("Icons/GUI/BrowserMinusDisabled.gif");
public static final ImageIcon BROWSER_MINUS_SELECTED_ICON = new ImageIconResource("Icons/GUI/BrowserMinusSelected.gif");
public static final ImageIcon BROWSER_OPTIONS_ICON = new ImageIconResource("Icons/GUI/BrowserOptions.gif");
public static final ImageIcon BROWSER_OPTIONS_DISABLED_ICON = new ImageIconResource("Icons/GUI/BrowserOptionsDisabled.gif");
public static final ImageIcon BROWSER_OPTIONS_SELECTED_ICON = new ImageIconResource("Icons/GUI/BrowserOptionsSelected.gif");
public static final ImageIcon BROWSER_FILTERS_ICON = new ImageIconResource("Icons/GUI/BrowserFilters.gif");
public static final ImageIcon BROWSER_FILTERS_DISABLED_ICON = new ImageIconResource("Icons/GUI/BrowserFiltersDisabled.gif");
public static final ImageIcon BROWSER_FILTERS_SELECTED_ICON = new ImageIconResource("Icons/GUI/BrowserFiltersSelected.gif");
public static final int MINIMUM_BROWSER_VIEW_WIDTH = 200;
protected PropertyListWidget _widget;
protected PropertyListModel _propertyListModel;
protected PropertyListTableModel _tableModel;
protected JButton plusButton;
protected JButton minusButton;
protected JButton optionsButton;
protected JPopupMenu popupMenu = null;
/**
* Stores controls: key is the JButton and value the PropertyListActionListener
*/
// private Hashtable<JButton,PropertyListActionListener> _controls;
public PropertyListWidgetFooter(PropertyListModel propertyListModel, PropertyListTableModel tableModel, PropertyListWidget widget) {
super();
_widget = widget;
_tableModel = tableModel;
_propertyListModel = propertyListModel;
initializeActions(propertyListModel, tableModel);
setBorder(BorderFactory.createEmptyBorder());
setBackground(GUI_BACK_COLOR);
setLayout(new BorderLayout());
// setPreferredSize(new
// Dimension(FlexoCst.MINIMUM_BROWSER_VIEW_WIDTH,FlexoCst.MINIMUM_BROWSER_CONTROL_PANEL_HEIGHT));
setPreferredSize(new Dimension(MINIMUM_BROWSER_VIEW_WIDTH, 20));
JPanel plusMinusPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
plusMinusPanel.setBackground(GUI_BACK_COLOR);
plusMinusPanel.setBorder(BorderFactory.createEmptyBorder());
plusButton = new JButton(BROWSER_PLUS_ICON);
plusButton.setBackground(GUI_BACK_COLOR);
plusButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!hasMultiplePlusActions()) {
plusPressed();
plusButton.setIcon(BROWSER_PLUS_ICON);
}
}
});
plusButton.setBorder(BorderFactory.createEmptyBorder());
plusButton.setDisabledIcon(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(BROWSER_PLUS_SELECTED_ICON);
}
if (hasMultiplePlusActions()) {
getPlusActionMenu().show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY());
plusButton.setIcon(BROWSER_PLUS_ICON);
}
}
@Override
public void mouseReleased(MouseEvent mouseEvent) {
if (plusButton.isEnabled()) {
plusButton.setIcon(BROWSER_PLUS_ICON);
}
if (hasMultiplePlusActions()) {
getPlusActionMenu().show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY());
}
}
});
minusButton = new JButton(BROWSER_MINUS_ICON);
minusButton.setBackground(GUI_BACK_COLOR);
minusButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!hasMultipleMinusActions()) {
minusPressed();
minusButton.setIcon(BROWSER_MINUS_ICON);
}
}
});
minusButton.setBorder(BorderFactory.createEmptyBorder());
minusButton.setDisabledIcon(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(BROWSER_MINUS_SELECTED_ICON);
}
if (hasMultipleMinusActions()) {
getMinusActionMenu().show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY());
minusButton.setIcon(BROWSER_MINUS_ICON);
}
}
@Override
public void mouseReleased(MouseEvent mouseEvent) {
if (minusButton.isEnabled()) {
minusButton.setIcon(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(BROWSER_OPTIONS_ICON);
optionsButton.setBorder(BorderFactory.createEmptyBorder());
optionsButton.setDisabledIcon(BROWSER_OPTIONS_DISABLED_ICON);
add(optionsButton, BorderLayout.EAST);
optionsButton.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent mouseEvent) {
if (optionsButton.isEnabled()) {
optionsButton.setIcon(BROWSER_OPTIONS_SELECTED_ICON);
}
getOptionActionMenu().show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY());
}
@Override
public void mouseReleased(MouseEvent mouseEvent) {
if (optionsButton.isEnabled()) {
optionsButton.setIcon(BROWSER_OPTIONS_ICON);
}
getOptionActionMenu().show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY());
}
});
handleSelectionCleared();
validate();
}
protected void handleSelectionChanged() {
// System.out.println("handleSelectionChanged");
plusActionMenuNeedsRecomputed = true;
minusActionMenuNeedsRecomputed = true;
optionsActionMenuNeedsRecomputed = true;
if (hasMultiplePlusActions()) {
plusButton.setEnabled(true);
} else {
boolean isActive = false;
for (PropertyListAction action : _addActions.keySet()) {
PropertyListActionListener actionListener = _addActions.get(action);
if (actionListener.isActive(_tableModel.getSelectedObject())) {
isActive = true;
}
}
plusButton.setEnabled(isActive);
}
boolean isMinusActive = false;
for (PropertyListAction action : _removeActions.keySet()) {
PropertyListActionListener actionListener = _removeActions.get(action);
if (actionListener.isActive(_tableModel.getSelectedObject())) {
isMinusActive = true;
}
}
minusButton.setEnabled(isMinusActive);
optionsButton.setEnabled(_otherActions.size() > 0);
/*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 (PropertyListAction action : _addActions.keySet()) {
PropertyListActionListener actionListener = _addActions.get(action);
if (actionListener.isActive(_tableModel.getSelectedObject())) {
actionListener.performAction();
}
}
}
void minusPressed() {
for (PropertyListAction action : _removeActions.keySet()) {
PropertyListActionListener actionListener = _removeActions.get(action);
if (actionListener.isActive(_tableModel.getSelectedObject())) {
actionListener.performAction(_tableModel.getSelectedObject(), _tableModel.getSelectedObjects());
}
}
}
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 (PropertyListAction action : _addActions.keySet()) {
PropertyListActionListener actionListener = _addActions.get(action);
actionListener.setSelectedObject(_tableModel.getSelectedObject());
actionListener.setSelectedObjects(_tableModel.getSelectedObjects());
JMenuItem menuItem = new JMenuItem(FlexoLocalization.localizedForKey(action.name));
menuItem.addActionListener(actionListener);
plusActionMenu.add(menuItem);
menuItem.setEnabled(actionListener.isActive(_tableModel.getSelectedObject()));
}
plusActionMenuNeedsRecomputed = false;
}
return plusActionMenu;
}
private JPopupMenu getMinusActionMenu() {
if (minusActionMenuNeedsRecomputed) {
minusActionMenu = new JPopupMenu();
for (PropertyListAction action : _removeActions.keySet()) {
PropertyListActionListener actionListener = _removeActions.get(action);
actionListener.setSelectedObject(_tableModel.getSelectedObject());
actionListener.setSelectedObjects(_tableModel.getSelectedObjects());
JMenuItem menuItem = new JMenuItem(FlexoLocalization.localizedForKey(action.name));
menuItem.addActionListener(actionListener);
minusActionMenu.add(menuItem);
menuItem.setEnabled(actionListener.isActive(_tableModel.getSelectedObject()));
}
minusActionMenuNeedsRecomputed = false;
}
return minusActionMenu;
}
private JPopupMenu getOptionActionMenu() {
if (optionsActionMenuNeedsRecomputed) {
optionsActionMenu = new JPopupMenu();
if (logger.isLoggable(Level.FINE)) {
logger.fine("Build plus menu");
}
for (PropertyListAction action : _otherActions.keySet()) {
PropertyListActionListener actionListener = _otherActions.get(action);
actionListener.setSelectedObject(_tableModel.getSelectedObject());
actionListener.setSelectedObjects(_tableModel.getSelectedObjects());
JMenuItem menuItem = new JMenuItem(FlexoLocalization.localizedForKey(action.name));
menuItem.addActionListener(actionListener);
optionsActionMenu.add(menuItem);
menuItem.setEnabled(actionListener.isActive(_tableModel.getSelectedObject()));
}
optionsActionMenuNeedsRecomputed = false;
}
return optionsActionMenu;
}
private Hashtable<PropertyListAction, PropertyListActionListener> _addActions;
private Hashtable<PropertyListAction, PropertyListActionListener> _removeActions;
private Hashtable<PropertyListAction, PropertyListActionListener> _otherActions;
private void initializeActions(PropertyListModel propertyListModel, PropertyListTableModel tableModel) {
_addActions = new Hashtable<PropertyListAction, PropertyListActionListener>();
_removeActions = new Hashtable<PropertyListAction, PropertyListActionListener>();
_otherActions = new Hashtable<PropertyListAction, PropertyListActionListener>();
for (Enumeration en = propertyListModel.getActions().elements(); en.hasMoreElements();) {
PropertyListAction plAction = (PropertyListAction) en.nextElement();
PropertyListActionListener plActionListener = new PropertyListActionListener(plAction, tableModel);
if (plAction.type.equals("ADD")) {
_addActions.put(plAction, plActionListener);
} else if (plAction.type.equals("DELETE")) {
_removeActions.put(plAction, plActionListener);
} else if (plAction.type.equals("ACTION")) {
_otherActions.put(plAction, plActionListener);
} else if (plAction.type.equals("STATIC_ACTION")) {
_otherActions.put(plAction, plActionListener);
}
}
}
protected Enumeration<PropertyListActionListener> getAddActionListeners() {
return _addActions.elements();
}
protected void setModel(InspectableObject model) {
// logger.info("Set model with "+model);
for (PropertyListAction action : _addActions.keySet()) {
PropertyListActionListener actionListener = _addActions.get(action);
actionListener.setModel(model);
}
for (PropertyListAction action : _removeActions.keySet()) {
PropertyListActionListener actionListener = _removeActions.get(action);
actionListener.setModel(model);
}
for (PropertyListAction action : _otherActions.keySet()) {
PropertyListActionListener actionListener = _otherActions.get(action);
actionListener.setModel(model);
}
handleSelectionChanged();
/* for (Enumeration en = _controls.elements(); en.hasMoreElements();) {
PropertyListActionListener actionListener = (PropertyListActionListener) en.nextElement();
actionListener.setModel(model);
}
updateControls(null);*/
}
}