/* *****************************************************************************
* JFire - it's hot - Free ERP System - http://jfire.org *
* Copyright (C) 2004-2005 NightLabs - http://NightLabs.org *
* *
* This library 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 2.1 of the License, or (at your option) any later version. *
* *
* 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 *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this library; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin St, Fifth Floor, *
* Boston, MA 02110-1301 USA *
* *
* Or get it online : *
* http://opensource.org/licenses/lgpl-license.php *
* *
* *
******************************************************************************/
package org.nightlabs.jfire.trade.admin.ui.gridpriceconfig;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.jfire.trade.admin.ui.resource.Messages;
/**
* @author Marco Schulze - marco at nightlabs dot de
*/
public class DimensionXYSelectorComboImpl extends XComposite
implements DimensionXYSelector
{
private Label gridDimensionXLabel;
private Label gridDimensionYLabel;
private Combo gridDimensionXCombo;
private Combo gridDimensionYCombo;
private DimensionValueSelector dimensionValueSelector;
private Dimension[] dimensions;
private Dimension gridDimensionX;
private Dimension gridDimensionY;
/**
* @return Returns the dimensions.
*/
public Dimension[] getDimensions()
{
return dimensions;
}
/**
* @param parent
* @param style
* @param setLayoutData
*/
public DimensionXYSelectorComboImpl(Composite parent, int style, DimensionValueSelector dimensionValueSelector)
{
super(parent, style, LayoutMode.TIGHT_WRAPPER);
getGridLayout().numColumns = 2;
getGridData().grabExcessVerticalSpace = false;
this.dimensionValueSelector = dimensionValueSelector;
this.dimensions = dimensionValueSelector.getDimensions();
gridDimensionYLabel = new Label(this, SWT.NONE);
gridDimensionYLabel.setText(Messages.getString("org.nightlabs.jfire.trade.admin.ui.gridpriceconfig.DimensionXYSelectorComboImpl.gridDimensionYLabel.text")); //$NON-NLS-1$
gridDimensionXLabel = new Label(this, SWT.NONE);
gridDimensionXLabel.setText(Messages.getString("org.nightlabs.jfire.trade.admin.ui.gridpriceconfig.DimensionXYSelectorComboImpl.gridDimensionXLabel.text")); //$NON-NLS-1$
gridDimensionYCombo = new Combo(this, SWT.READ_ONLY);
gridDimensionXCombo = new Combo(this, SWT.READ_ONLY);
int xidx = -1;
int yidx = -1;
Dimension dimX = getDefaultDimensionX();
Dimension dimY = getDefaultDimensionY();
for (int i = 0; i < dimensions.length; ++i) {
Dimension dimension = dimensions[i];
if (dimension == dimX)
xidx = i;
if (dimension == dimY)
yidx = i;
gridDimensionXCombo.add(dimension.getName());
gridDimensionYCombo.add(dimension.getName());
}
gridDimensionXCombo.select(xidx);
gridDimensionYCombo.select(yidx);
gridDimensionsChanged();
gridDimensionXCombo.addSelectionListener(gridComboSelectionListener);
gridDimensionYCombo.addSelectionListener(gridComboSelectionListener);
}
protected Dimension getDefaultDimensionX()
{
return dimensions[3];
}
protected Dimension getDefaultDimensionY()
{
return dimensions[1];
}
private SelectionListener gridComboSelectionListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
gridDimensionsChanged();
}
};
private void gridDimensionsChanged()
{
if (gridDimensionXCombo.getSelectionIndex() < 0)
throw new IllegalStateException("gridDimensionXCombo.getSelectionIndex() < 0!"); //$NON-NLS-1$
if (gridDimensionYCombo.getSelectionIndex() < 0)
throw new IllegalStateException("gridDimensionYCombo.getSelectionIndex() < 0!"); //$NON-NLS-1$
// If both select the same dimension, reset and return.
if (gridDimensionXCombo.getSelectionIndex() == gridDimensionYCombo.getSelectionIndex()) {
for (int dimensionIdx = 0; dimensionIdx < dimensions.length; ++dimensionIdx) {
Dimension dim = dimensions[dimensionIdx];
if (gridDimensionX == dim)
gridDimensionXCombo.select(dimensionIdx);
if (gridDimensionY == dim)
gridDimensionYCombo.select(dimensionIdx);
}
return;
}
gridDimensionX = dimensions[gridDimensionXCombo.getSelectionIndex()];
gridDimensionY = dimensions[gridDimensionYCombo.getSelectionIndex()];
for (int dimensionIdx = 0; dimensionIdx < dimensions.length; ++dimensionIdx) {
Dimension dim = dimensions[dimensionIdx];
dimensionValueSelector.setDimensionEnabled(
dimensionIdx,
dim != gridDimensionX && dim != gridDimensionY);
}
fireSelectionChangedEvent();
}
/**
* @see org.nightlabs.jfire.ticketing.admin.priceconfig.DimensionXYSelector#getDimensionX()
*/
public Dimension getDimensionX()
{
return gridDimensionX;
}
/**
* @see org.nightlabs.jfire.ticketing.admin.priceconfig.DimensionXYSelector#getDimensionY()
*/
public Dimension getDimensionY()
{
return gridDimensionY;
}
private List selectionChangedListeners = new LinkedList();
protected void fireSelectionChangedEvent()
{
SelectionChangedEvent e = new SelectionChangedEvent(this, getSelection());
for (Iterator it = selectionChangedListeners.iterator(); it.hasNext(); ) {
ISelectionChangedListener l = (ISelectionChangedListener)it.next();
l.selectionChanged(e);
}
}
/**
* @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
*/
public void addSelectionChangedListener(ISelectionChangedListener listener)
{
selectionChangedListeners.add(listener);
}
/**
* @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
*/
public ISelection getSelection()
{
return new DimensionXYSelection(gridDimensionX, gridDimensionY);
}
/**
* @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
*/
public void removeSelectionChangedListener(ISelectionChangedListener listener)
{
selectionChangedListeners.remove(listener);
}
/**
* @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
*/
public void setSelection(ISelection selection)
{
throw new UnsupportedOperationException("NYI"); //$NON-NLS-1$
}
}