package org.openswing.swing.table.columns.client; import java.util.*; import java.awt.event.*; import javax.swing.table.*; import org.openswing.swing.domains.java.*; import org.openswing.swing.logger.client.*; import org.openswing.swing.table.client.*; import org.openswing.swing.table.editors.client.*; import org.openswing.swing.table.renderers.client.*; import org.openswing.swing.util.client.*; import java.awt.ComponentOrientation; /** * <p>Title: OpenSwing Framework</p> * <p>Description: Column of type combo-box: * it contains a combo box with a domain linked to it.</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 ComboColumn extends Column { /** domain ID */ private String domainId; /** domain */ private Domain domain; /** combo item listeners */ private ArrayList itemListeners = new ArrayList(); /** define if in insert mode combo box has no item selected; default value: <code>false</code> i.e. the first item is pre-selected */ private boolean nullAsDefaultValue = false; /** component left margin, with respect to component container; defaut value: 2 */ private int leftMargin = 2; /** component right margin, with respect to component container; defaut value: 0 */ private int rightMargin = 0; /** component top margin, with respect to component container; defaut value: 0 */ private int topMargin = 0; /** component bottom margin, with respect to component container; defaut value: 0 */ private int bottomMargin = 0; /** define if description in combo items must be translated; default value: <code>true</code> */ private boolean translateItemDescriptions = true; /** component orientation */ private ComponentOrientation orientation = ClientSettings.TEXT_ORIENTATION; /** DomainTableCellRenderer (cell renderer), one for each grid controller (top locked rows, bottom locked rows, etc.) */ private HashMap renderers = new HashMap(); /** DomainCellEditor (cell editor), one for each grid controller (top locked rows, bottom locked rows, etc.) */ private HashMap editors = new HashMap(); public ComboColumn() { } /** * @return column type */ public int getColumnType() { return TYPE_COMBO; } /** * @return domain ID */ public String getDomainId() { return domainId; } /** * Set domain ID. * @param domainId domain ID */ public void setDomainId(String domainId) { this.domainId = domainId; DomainTableCellRenderer renderer = null; DomainCellEditor editor = null; Iterator it = renderers.values().iterator(); while(it.hasNext()) { renderer = (DomainTableCellRenderer)it.next(); renderer.setDomain(getDomain()); } it = editors.values().iterator(); while(it.hasNext()) { editor = (DomainCellEditor)it.next(); editor.setDomain(getDomain()); } } /** * @return domain */ public Domain getDomain() { if (domain==null && domainId!=null) domain = ClientSettings.getInstance().getDomain( domainId ); return domain; } /** * Set the domain. * @param domain domain */ public void setDomain(Domain domain) { this.domain = domain; DomainTableCellRenderer renderer = null; DomainCellEditor editor = null; Iterator it = renderers.values().iterator(); while(it.hasNext()) { renderer = (DomainTableCellRenderer)it.next(); renderer.setDomain(domain); } it = editors.values().iterator(); while(it.hasNext()) { editor = (DomainCellEditor)it.next(); editor.setDomain(domain); } } /** * Add an ItemListener to the combo. * @param listener ItemListener to add */ public final void addItemListener(ItemListener listener) { itemListeners.add(listener); } /** * Remove an ItemListener from the combo. * @param listener ItemListener to remove */ public final void removeItemListener(ItemListener listener) { itemListeners.remove(listener); } /** * @return ItemListener objects */ public final ArrayList getItemListeners() { return itemListeners; } /** * @return define if in insert mode combo box has no item selected */ public final boolean isNullAsDefaultValue() { return nullAsDefaultValue; } /** * Define if in insert mode combo box has no item selected. * @param nullAsDefaultValue define if in insert mode combo box has no item selected */ public final void setNullAsDefaultValue(boolean nullAsDefaultValue) { this.nullAsDefaultValue = nullAsDefaultValue; } /** * @return component bottom margin, with respect to component container */ public final int getBottomMargin() { return bottomMargin; } /** * @return component left margin, with respect to component container */ public final int getLeftMargin() { return leftMargin; } /** * @return component right margin, with respect to component container */ public final int getRightMargin() { return rightMargin; } /** * @return component top margin, with respect to component container */ public final int getTopMargin() { return topMargin; } /** * Set component top margin, with respect to component container. * @param topMargin component top margin */ public final void setTopMargin(int topMargin) { this.topMargin = topMargin; } /** * Set component right margin, with respect to component container. * @param rightMargin component right margin */ public final void setRightMargin(int rightMargin) { this.rightMargin = rightMargin; } /** * Set component left margin, with respect to component container. * @param leftMargin component left margin */ public final void setLeftMargin(int leftMargin) { this.leftMargin = leftMargin; } /** * Set component bottom margin, with respect to component container. * @param bottomMargin component bottom margin */ public final void setBottomMargin(int bottomMargin) { this.bottomMargin = bottomMargin; } /** * @return define if description in combo items must be translated */ public final boolean isTranslateItemDescriptions() { return translateItemDescriptions; } /** * Define if description in combo items must be translated; default value: <code>true</code>. * @param translateItemDescriptions flag used to define if description in combo items must be translated */ public final void setTranslateItemDescriptions(boolean translateItemDescriptions) { this.translateItemDescriptions = translateItemDescriptions; } /** * Set the component orientation: from left to right or from right to left. * @param orientation component orientation */ public final void setTextOrientation(ComponentOrientation orientation) { this.orientation = orientation; } /** * @return component orientation */ public final ComponentOrientation getTextOrientation() { return orientation; } /** * @return TableCellRenderer for this column */ public final TableCellRenderer getCellRenderer(GridController tableContainer,Grids grids) { if (getDomainId()==null && getDomain()==null) { Logger.error(this.getClass().getName(),"getCellRenderer","You must set the 'domainId' property for the column '"+getColumnName()+"'.",null); return null; } Domain domain = getDomain(); if (domain==null) domain = ClientSettings.getInstance().getDomain( getDomainId() ); if (domain!=null) { DomainTableCellRenderer renderer = (DomainTableCellRenderer)renderers.get(tableContainer.toString()); if (renderer==null) { renderer = new DomainTableCellRenderer( domain, translateItemDescriptions, tableContainer, getTextAlignment(), getLeftMargin(), getRightMargin(), getTopMargin(), getBottomMargin(), getTextOrientation(), getColumnName() ); renderers.put(tableContainer.toString(),renderer); } return renderer; } else { Logger.error(this.getClass().getName(),"getCellRenderer","The domainId '"+getDomainId()+"' for the column '"+getColumnName()+"' "+" doesn't exist.",null); return null; } } /** * @return TableCellEditor for this column */ public final TableCellEditor getCellEditor(GridController tableContainer,Grids grids) { if (getDomainId()==null && getDomain()==null) { Logger.error(this.getClass().getName(),"getCellEditor","You must set the 'domainId' property for the column '"+getColumnName()+"'.",null); return null; } Domain domain = getDomain(); if (domain==null) domain = ClientSettings.getInstance().getDomain( getDomainId() ); if (domain!=null) { DomainCellEditor editor = (DomainCellEditor)editors.get(tableContainer.toString()); if (editor==null) { editor = new DomainCellEditor( domain, translateItemDescriptions, isColumnRequired(), getTextOrientation(), getItemListeners() ); editors.put(tableContainer.toString(),editor); } return editor; } else { Logger.error(this.getClass().getName(),"getCellEditor","The domainId '"+getDomainId()+"' for the column '"+getColumnName()+"' doesn't exist.",null); return null; } } }