All Downloads are FREE. Search and download functionalities are using the official Maven repository.

xdev.ui.XdevRadioButton Maven / Gradle / Ivy

package xdev.ui;

/*-
 * #%L
 * XDEV Application Framework
 * %%
 * Copyright (C) 2003 - 2020 XDEV Software
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 * 
 * This program 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 Lesser Public License for more details.
 * 
 * You should have received a copy of the GNU General Lesser Public
 * License along with this program.  If not, see
 * .
 * #L%
 */


import java.awt.Container;
import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import java.beans.Beans;
import java.util.Enumeration;
import java.util.Map;
import java.util.StringTokenizer;

import javax.swing.Action;
import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;
import javax.swing.DefaultButtonModel;
import javax.swing.Icon;
import javax.swing.JRadioButton;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import xdev.db.Operator;
import xdev.util.ObjectUtils;
import xdev.vt.VirtualTable;


/**
 * The radio button in XDEV. Based on {@link JRadioButton}.
 * 
 * @see JRadioButton
 * 
 * @author XDEV Software
 * 
 * @since 2.0
 */
@BeanSettings(useXdevCustomizer = true)
public class XdevRadioButton extends JRadioButton implements FormularComponent,
		XdevFocusCycleComponent
{
	private String											dataField;
	private boolean											savedValue			= false;
	private String											returnValue			= "";
	private String											formularValueList	= "";
	/**
	 * tabIndex is used to store the index for {@link XdevFocusCycleComponent}
	 * functionality.
	 */
	private int												tabIndex			= -1;
	
	private final FormularComponentSupport	support				= new FormularComponentSupport(
																						this);
	
	
	public XdevRadioButton()
	{
		super();
	}
	
	
	public XdevRadioButton(Action a)
	{
		super(a);
	}
	
	
	public XdevRadioButton(Icon icon, boolean selected)
	{
		super(icon,selected);
	}
	
	
	public XdevRadioButton(Icon icon)
	{
		super(icon);
	}
	
	
	public XdevRadioButton(String text, boolean selected)
	{
		super(text,selected);
	}
	
	
	public XdevRadioButton(String text, Icon icon, boolean selected)
	{
		super(text,icon,selected);
	}
	
	
	public XdevRadioButton(String text, Icon icon)
	{
		super(text,icon);
	}
	
	
	public XdevRadioButton(String text)
	{
		super(text);
	}
	
	/*
	 * Workaround for #13521
	 */
	{
		if(!Beans.isDesignTime())
		{
			addHierarchyListener(new HierarchyListener()
			{
				@Override
				public void hierarchyChanged(HierarchyEvent e)
				{
					Container parent = getParent();
					if(parent != null)
					{
						removeHierarchyListener(this);
						if(parent.getLayout() == null)
						{
							setSize(getPreferredSize());
						}
					}
				}
			});
		}
	}
	
	
	/**
	 * @deprecated use {@link #setDataField(String)}
	 */
	@Deprecated
	public void setRadioGroup(String radioGroup)
	{
		setDataField(radioGroup);
	}
	
	
	/**
	 * @deprecated user {@link #getDataField()}
	 */
	@Deprecated
	public String getRadioGroup()
	{
		return getDataField();
	}
	
	
	/**
	 * Returns the group that the button belongs to.
	 * 
	 * @return the group that the button belongs to
	 */
	public ButtonGroup getButtonGroup()
	{
		ButtonModel model = getModel();
		if(model instanceof DefaultButtonModel)
		{
			return ((DefaultButtonModel)model).getGroup();
		}
		
		return null;
	}
	
	
	/**
	 * {@inheritDoc}
	 */
	public String getFormularName()
	{
		return dataField;
	}
	
	
	/**
	 * {@inheritDoc}
	 * 
	 * @since 3.1
	 */
	@Override
	public void setDataField(String dataField)
	{
		this.dataField = dataField;
	}
	
	
	/**
	 * {@inheritDoc}
	 * 
	 * @since 3.1
	 */
	@Override
	public String getDataField()
	{
		return dataField;
	}
	
	
	/**
	 * 
	 * @param formularValueList
	 *            comma separated values e.g. "true,1,yes"
	 */
	@BeanProperty(category = DefaultBeanCategories.DATA)
	public void setFormularValueList(String formularValueList)
	{
		this.formularValueList = formularValueList;
	}
	
	
	public String getFormularValueList()
	{
		return formularValueList;
	}
	
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	@Deprecated
	public final void setFormularValue(VirtualTable vt, int col, Object value)
	{
		support.setFormularValue(vt,col,value);
	}
	
	
	/**
	 * {@inheritDoc}
	 * 
	 * @since 3.2
	 */
	@Override
	public void setFormularValue(VirtualTable vt, Map record)
	{
		if(!support.hasDataField())
		{
			return;
		}
		
		boolean b = false;
		
		Object value = support.getSingleValue(vt,record);
		if(value != null)
		{
			String str = value.toString();
			
			if(formularValueList != null && formularValueList.length() > 0)
			{
				b = contains(formularValueList,",",str);
			}
			else
			{
				if(returnValue != null && returnValue.length() > 0)
				{
					b = returnValue.equalsIgnoreCase(str);
				}
				else
				{
					b = Boolean.valueOf(str);
				}
			}
		}
		
		setSelected(b);
	}
	
	
	private boolean contains(String list, String separator, String val)
	{
		StringTokenizer st = new StringTokenizer(list,separator);
		while(st.hasMoreTokens())
		{
			if(st.nextToken().equalsIgnoreCase(val))
			{
				return true;
			}
		}
		
		return false;
	}
	
	
	/**
	 * {@inheritDoc}
	 */
	public Object getFormularValue()
	{
		return getSelectedRadioButtonValue();
	}
	
	
	private Object getFormularValue0()
	{
		return returnValue;
	}
	
	
	public String getReturnValue()
	{
		return returnValue;
	}
	
	
	@BeanProperty(category = DefaultBeanCategories.DATA)
	public void setReturnValue(String returnValue)
	{
		this.returnValue = returnValue;
	}
	
	
	/**
	 * {@inheritDoc}
	 */
	public void saveState()
	{
		savedValue = isSelected();
	}
	
	
	/**
	 * {@inheritDoc}
	 */
	public void restoreState()
	{
		setSelected(savedValue);
	}
	
	
	/**
	 * {@inheritDoc}
	 * 
	 * @since 3.1
	 */
	@Override
	public boolean hasStateChanged()
	{
		return !ObjectUtils.equals(savedValue,getFormularValue());
	}
	
	
	/**
	 * {@inheritDoc}
	 * 
	 * @since 3.1
	 */
	@Override
	public void addValueChangeListener(final ValueChangeListener l)
	{
		addChangeListener(new ChangeListener()
		{
			@Override
			public void stateChanged(ChangeEvent e)
			{
				l.valueChanged(e);
			}
		});
	}
	
	
	/**
	 * {@inheritDoc}
	 */
	public boolean isMultiSelect()
	{
		return false;
	}
	
	
	/**
	 * {@inheritDoc}
	 */
	public boolean verify()
	{
		return support.verify();
	}
	
	
	/**
	 * {@inheritDoc}
	 * 
	 * @since 3.1
	 */
	@Override
	public void addValidator(Validator validator)
	{
		support.addValidator(validator);
	}
	
	
	/**
	 * {@inheritDoc}
	 * 
	 * @since 3.1
	 */
	@Override
	public void removeValidator(Validator validator)
	{
		support.removeValidator(validator);
	}
	
	
	/**
	 * {@inheritDoc}
	 * 
	 * @since 3.1
	 */
	@Override
	public Validator[] getValidators()
	{
		return support.getValidators();
	}
	
	
	/**
	 * {@inheritDoc}
	 * 
	 * @since 3.1
	 */
	@Override
	public void validateState() throws ValidationException
	{
		support.validateState();
	}
	
	
	/**
	 * {@inheritDoc}
	 * 
	 * @since 3.1
	 */
	@Override
	public void validateState(Validation validation) throws ValidationException
	{
		support.validateState(validation);
	}
	
	
	/**
	 * {@inheritDoc}
	 * 
	 * @since 3.1
	 */
	@Override
	public void setFilterOperator(Operator filterOperator)
	{
		support.setFilterOperator(filterOperator);
	}
	
	
	/**
	 * {@inheritDoc}
	 * 
	 * @since 3.1
	 */
	@Override
	public Operator getFilterOperator()
	{
		return support.getFilterOperator();
	}
	
	
	/**
	 * {@inheritDoc}
	 * 
	 * @since 3.2
	 */
	@Override
	public void setReadOnly(boolean readOnly)
	{
		support.setReadOnly(readOnly);
	}
	
	
	/**
	 * {@inheritDoc}
	 * 
	 * @since 3.2
	 */
	@Override
	public boolean isReadOnly()
	{
		return support.isReadOnly();
	}
	
	
	public void selectRadioButtonInGroup(Object value)
	{
		ButtonGroup buttonGroup = getButtonGroup();
		if(buttonGroup != null)
		{
			Enumeration e = buttonGroup.getElements();
			while(e.hasMoreElements())
			{
				Object o = e.nextElement();
				if(o instanceof XdevRadioButton)
				{
					XdevRadioButton radio = (XdevRadioButton)o;
					if(value.equals(radio.getFormularValue0()))
					{
						radio.setSelected(true);
						break;
					}
				}
			}
		}
	}
	
	
	public XdevRadioButton getSelectedRadioButtonInGroup()
	{
		ButtonGroup buttonGroup = getButtonGroup();
		if(buttonGroup != null)
		{
			Enumeration e = buttonGroup.getElements();
			while(e.hasMoreElements())
			{
				Object o = e.nextElement();
				if(o instanceof XdevRadioButton)
				{
					XdevRadioButton button = (XdevRadioButton)o;
					if(button.isSelected())
					{
						return button;
					}
				}
			}
		}
		
		return null;
	}
	
	
	public Object getSelectedRadioButtonValue()
	{
		XdevRadioButton button = getSelectedRadioButtonInGroup();
		if(button != null)
		{
			return button.getFormularValue0();
		}
		
		return null;
	}
	
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	public String toString()
	{
		String toString = UIUtils.toString(this);
		if(toString != null)
		{
			return toString;
		}
		
		return super.toString();
	}
	
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	public int getTabIndex()
	{
		return tabIndex;
	}
	
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	public void setTabIndex(int tabIndex)
	{
		if(this.tabIndex != tabIndex)
		{
			int oldValue = this.tabIndex;
			this.tabIndex = tabIndex;
			firePropertyChange(TAB_INDEX_PROPERTY,oldValue,tabIndex);
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy