package org.openswing.swing.client; import java.util.*; import java.util.List; import java.awt.*; import java.awt.event.*; import javax.swing.*; import org.openswing.swing.util.client.*; import org.openswing.swing.util.java.Consts; /** * <p>Title: OpenSwing Framework</p> * <p>Description: Based button, derived by insert/edit/reload/save/delete buttons.</p> * <p>Copyright: Copyright (C) 2006 Mauro Carniel</p> * * <p> This file is part of OpenSwing Framework. * This library is free software; you can redistribute it and/or * modify it under the terms of the (LGPL) Lesser General Public * License as published by the Free Software Foundation; * * GNU LESSER GENERAL PUBLIC LICENSE * Version 2.1, February 1999 * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * The author may be contacted at: * maurocarniel@tin.it</p> * * @author Mauro Carniel * @version 1.0 */ public class GenericButton extends JButton { /** data controllers linked to this button*/ protected List dataControllerList = new ArrayList(3); /** flag used to execute the action event in a separated thread (useful for heavy server executions); default value: false */ private boolean executeAsThread = ClientSettings.BUTTONS_EXECUTE_AS_THREAD; /** define whether showing image/text on default buttons (insert, edit, ...); allowed values: Consts.BUTTON_IMAGE_ONLY, Consts.BUTTON_TEXT_ONLY, Consts.BUTTON_IMAGE_AND_TEXT; default value: ClientSettings.BUTTON_BEHAVIOR */ private int buttonBehavior = ClientSettings.BUTTON_BEHAVIOR; /** attribute name linked to the button (optional), used to bind this link to a Form's value object */ public String attributeName = null; /** optional button identifier; when setted, it is used to enable/disable button according to ButtonsAuthorizations content */ private String buttonId; public GenericButton() { this.setHorizontalTextPosition(ClientSettings.BUTTON_HORIZONTAL_TEXT_POSITION); this.setVerticalTextPosition(ClientSettings.BUTTON_VERTICAL_TEXT_POSITION); super.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (!executeAsThread) execute(); else SwingUtilities.invokeLater(new Runnable() { public void run() { try { execute(); } catch (Throwable ex) { ex.printStackTrace(); } } }); } }); this.setFocusable(ClientSettings.GENERIC_BUTTON_FOCUSABLE); } public GenericButton(ImageIcon imageIcon) { this(); init(imageIcon); } private void init(Icon imageIcon) { if (buttonBehavior==Consts.BUTTON_IMAGE_ONLY) { super.setIcon(imageIcon); setPreferredSize(new Dimension(32,32)); } else { boolean defaultButton = true; if (this instanceof InsertButton) super.setText(ClientSettings.getInstance().getResources().getResource("Insert")); else if (this instanceof EditButton) super.setText(ClientSettings.getInstance().getResources().getResource("Edit")); else if (this instanceof CopyButton) super.setText(ClientSettings.getInstance().getResources().getResource("Copy")); else if (this instanceof DeleteButton) super.setText(ClientSettings.getInstance().getResources().getResource("Delete")); else if (this instanceof ReloadButton) super.setText(ClientSettings.getInstance().getResources().getResource("Reload")); else if (this instanceof SaveButton) super.setText(ClientSettings.getInstance().getResources().getResource("Save")); else if (this instanceof FilterButton) super.setText(ClientSettings.getInstance().getResources().getResource("Filter")); else if (this instanceof ExportButton) super.setText(ClientSettings.getInstance().getResources().getResource("Export")); else defaultButton = false; int w = this.getFontMetrics(this.getFont()).stringWidth(getText()); if (defaultButton) { w = Math.max(w,this.getFontMetrics(this.getFont()).stringWidth(ClientSettings.getInstance().getResources().getResource("Insert"))); w = Math.max(w,this.getFontMetrics(this.getFont()).stringWidth(ClientSettings.getInstance().getResources().getResource("Edit"))); w = Math.max(w,this.getFontMetrics(this.getFont()).stringWidth(ClientSettings.getInstance().getResources().getResource("Copy"))); w = Math.max(w,this.getFontMetrics(this.getFont()).stringWidth(ClientSettings.getInstance().getResources().getResource("Delete"))); w = Math.max(w,this.getFontMetrics(this.getFont()).stringWidth(ClientSettings.getInstance().getResources().getResource("Save"))); w = Math.max(w,this.getFontMetrics(this.getFont()).stringWidth(ClientSettings.getInstance().getResources().getResource("Reload"))); w = Math.max(w,this.getFontMetrics(this.getFont()).stringWidth(ClientSettings.getInstance().getResources().getResource("Export"))); w = Math.max(w,this.getFontMetrics(this.getFont()).stringWidth(ClientSettings.getInstance().getResources().getResource("Filter"))); } w += this.getMargin().left+this.getMargin().right+6; if (buttonBehavior==Consts.BUTTON_TEXT_ONLY) { setPreferredSize(new Dimension(w,32)); } else { // setHorizontalTextPosition(CENTER); // setVerticalTextPosition(BOTTOM); super.setIcon(imageIcon); if (getHorizontalTextPosition() == SwingConstants.LEADING || getHorizontalTextPosition() == SwingConstants.TRAILING) { setPreferredSize(new Dimension(w+32, 32)); } else if (getVerticalTextPosition() == SwingConstants.BOTTOM || getVerticalTextPosition() == SwingConstants.TOP) { setPreferredSize(new Dimension( w, this.getFontMetrics(this.getFont()).getHeight() + this.getMargin().top + this.getMargin().bottom + 32) ); } } } } public void setText(String t) { if (buttonBehavior!=Consts.BUTTON_IMAGE_ONLY) super.setText(ClientSettings.getInstance().getResources().getResource(t)); init(super.getIcon()); } /** * Fire event for all data controller listeners. */ public final void execute() { try { for (int i = 0; i < dataControllerList.size(); i++) { executeOperation( (DataController) dataControllerList.get(i)); } } catch (Exception ex) { ex.printStackTrace(); } } /** * Add a listener to the button. * @param dataController data controller that listens the button press event */ public final void addDataController(DataController dataController) { if (dataController!=null) { this.dataControllerList.add(dataController); } } /** * Remove a listener from the button. * @param dataController data controller */ public final void removeDataController(DataController dataController) { if (dataController!=null) { dataControllerList.remove(dataController); } } /** * @return <code>true</code> if the specified listener is already added to this, <code>false</code> otherwise */ public final boolean containsDataController(DataController dataController) { for (int i = 0; i < dataControllerList.size(); i++) if (dataControllerList.get(i).equals(dataController)) return true; return false; } /** * Remove all listeners from the button. */ public final void removeAllDataControllers() { dataControllerList.clear(); } /** * Operation to execute when the button is pressed. * The method must be overridden by the subclass button. * @param controller data controller that contains the execute operation logic */ protected void executeOperation(DataController controller) throws Exception { throw(new Exception("The method must be overridden in the subclass")); } /** * Method used to change button state (enabled/disabled). * @param enabled <code>true</code> enable the button, <code>false</code> disable the button */ public final void setEnabled(boolean enabled) { String functionId = null; DataController dataController = null; for(int i=0;i<dataControllerList.size();i++) { dataController = (DataController)dataControllerList.get(i); // check if there exists a button disabilitation policy for this button... if (dataController.isButtonDisabled(this)) { super.setEnabled(false); return; } functionId = dataController.getFunctionId(); boolean buttonAuthorized = true; if (this instanceof InsertButton || this instanceof CopyButton) buttonAuthorized = ClientSettings.getInstance().getButtonsAuthorizations().isInsertEnabled(functionId); else if (this instanceof EditButton) buttonAuthorized = ClientSettings.getInstance().getButtonsAuthorizations().isEditEnabled(functionId); else if (this instanceof DeleteButton) buttonAuthorized = ClientSettings.getInstance().getButtonsAuthorizations().isDeleteEnabled(functionId); else if (buttonId!=null && !buttonId.equals("")) buttonAuthorized = ClientSettings.getInstance().getButtonsAuthorizations().isEnabled(functionId,buttonId); if (!buttonAuthorized && enabled) { enabled = false; break; } dataController.setCurrentValue(this,enabled); } super.setEnabled(enabled); } /** * @param button generic button * @return current enabled value for the specified button */ public final boolean getOldValue() { DataController dataController = null; for(int i=0;i<dataControllerList.size();i++) { dataController = (DataController) dataControllerList.get(i); return dataController.getCurrentValue(this); } return false; } /** * @return flag used to execute the action event in a separated thread */ public final boolean isExecuteAsThread() { return executeAsThread; } /** * Set to true to execute the action event in a separated thread. * @param executeAsThread flag used to execute the action event in a separated thread */ public final void setExecuteAsThread(boolean executeAsThread) { this.executeAsThread = executeAsThread; } /** * @return define whether showing image/text on default buttons (insert, edit, ...); allowed values: Consts.BUTTON_IMAGE_ONLY, Consts.BUTTON_TEXT_ONLY, Consts.BUTTON_IMAGE_AND_TEXT */ public final int getButtonBehavior() { return buttonBehavior; } /** * Define whether showing image/text on default buttons (insert, edit, etc.) * @param buttonBehavior allowed values: Consts.BUTTON_IMAGE_ONLY, Consts.BUTTON_TEXT_ONLY, Consts.BUTTON_IMAGE_AND_TEXT */ public final void setButtonBehavior(int buttonBehavior) { this.buttonBehavior = buttonBehavior; } /** * Link the button to the form which contains it and with the specified the attribute. * @param attributeName attribute name linked to the button */ public final void setAttributeName(String attributeName) { this.attributeName = attributeName; } /** * @return attributeName attribute name linked to this button */ public final String getAttributeName() { return attributeName; } /** * @return optional button identifier; when setted, it is used to enable/disable button according to ButtonsAuthorizations content */ public final String getButtonId() { return buttonId; } /** * Set button identifier; when setted, it is used to enable/disable button according to ButtonsAuthorizations content * @param buttonId button identifier */ public final void setButtonId(String buttonId) { this.buttonId = buttonId; } }