/* ========================
* JSynoptic : a free Synoptic editor
* ========================
*
* Project Info: http://jsynoptic.sourceforge.net/index.html
*
* 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 2.1 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*
* (C) Copyright 2001-2004, by :
* Corporate:
* Astrium SAS
* Individual:
* Claude Cazenave
*
* $Id: TransformDataUI.java,v 1.15 2006/06/08 09:50:21 ogor Exp $
*
* Changes
* -------
* 3-Mar-2004 : Creation date (CC);
*
*/
package syn3d.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;
import syn3d.base.ActiveNode;
import syn3d.data.SceneGraphData;
import syn3d.data.TransformData;
/**
* Class description ...
*
* @author Claude CAZENAVE
*
*/
public class TransformDataUI extends SceneGraphDataUI implements ItemListener {
static final Object[] items=new Object[TransformData.FULL];
static final HashMap itemsId=new HashMap();
static {
for(int i=0;i<TransformData.FULL;i++){
items[i]=resources.getString("transformDataKind"+(i+1));
itemsId.put(items[i],new Integer(i+1));
}
}
// Manage several transformations
protected JPanel composedTransformPanel;
protected ArrayList transformCombos;
protected ArrayList transformTables;
protected ArrayList transformTablesPanels;
protected JButton bAdd, bRemove;
public TransformDataUI(ActiveNode node, TransformData d, boolean transformAvailable){
super(node, d, transformAvailable);
this.transformAvailable = transformAvailable;
}
protected JPanel createDataPanel(){
return createTransformDataPanel();
}
protected JPanel createTransformDataPanel(){
JPanel p=new JPanel(new BorderLayout());
JPanel p1=new JPanel(new BorderLayout());
bedit=resources.getCheckBox("editable",this);
p1.add(bedit, BorderLayout.WEST);
p1.add(new JLabel("Transformation"), BorderLayout.CENTER);
JPanel p2=new JPanel(new GridLayout(1,0));
bAdd = resources.getButton("addTransform", this);
p2.add(bAdd);
bRemove = resources.getButton("removeTransform", this);
p2.add(bRemove);
p1.add(p2, BorderLayout.EAST);
composedTransformPanel = new JPanel();
composedTransformPanel.setLayout(new BoxLayout(composedTransformPanel, BoxLayout.Y_AXIS));
// Make panel for all composed transformations
transformCombos = new ArrayList(((TransformData)dataCopy).getTransformChildren().size() +1);
transformTables = new ArrayList(((TransformData)dataCopy).getTransformChildren().size() +1);
// First the root transformation
transformTablesPanels = new ArrayList();
JPanel mtransformPanel = new JPanel(new BorderLayout());
transformTablesPanels.add(mtransformPanel);
JComboBox mcombo = new JComboBox();
transformCombos.add(mcombo);
mtransformPanel.add(mcombo, BorderLayout.NORTH);
for(int j=0;j<TransformData.FULL;j++){
mcombo.addItem(items[j]);
}
mcombo.addItemListener(this);
mcombo.setSelectedItem(items[((TransformData)dataCopy).getKind()-1]);
JTable mtable = createTableDataPanel(dataCopy);
transformTables.add(mtable);
mtransformPanel.add(mtable, BorderLayout.CENTER);
composedTransformPanel.add(mtransformPanel);
// Then the sub transformations
for(int i=0;i< ((TransformData)dataCopy).getTransformChildren().size(); i++){
TransformData composedDataCopy = ((TransformData)((TransformData)dataCopy).getTransformChildren().get(i));
JPanel transformPanel = new JPanel(new BorderLayout());
transformTablesPanels.add(transformPanel);
JComboBox combo = new JComboBox();
transformCombos.add(combo);
transformPanel.add(combo, BorderLayout.NORTH);
for(int j=0;j<TransformData.FULL;j++){
combo.addItem(items[j]);
}
combo.addItemListener(this);
combo.setSelectedItem(items[composedDataCopy.getKind()-1]);
JTable table = createTableDataPanel(composedDataCopy);
transformTables.add(table);
transformPanel.add(table, BorderLayout.CENTER);
composedTransformPanel.add(transformPanel);
}
if (transformAvailable){
p.add(p1, BorderLayout.NORTH);
p.add(composedTransformPanel,BorderLayout.CENTER);
}
return p;
}
protected JTable createTableDataPanel(SceneGraphData dataCopy){
TransformTableModel transformTableModel = new TransformTableModel(dstree, (TransformData)dataCopy);
JTable table=new JTable(transformTableModel);
TableColumn c;
c=table.getColumn("2");
c.setPreferredWidth(10);
c=table.getColumn("3");
return table;
}
/* (non-Javadoc)
* @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
*/
public void itemStateChanged(ItemEvent e) {
TransformData composedDataCopy = null;
int index=0;
if (e.getSource() == (JComboBox)transformCombos.get(0)){
composedDataCopy = (TransformData)dataCopy;
}
else for(int i=0; i<((TransformData)dataCopy).getTransformChildren().size();i++){
if (e.getSource() == ( (JComboBox)transformCombos.get(i+1))){
composedDataCopy = ((TransformData)((TransformData)dataCopy).getTransformChildren().get(i));
index = i+1;
break;
}
}
if (composedDataCopy!=null){
int newKind=((Integer)itemsId.get(e.getItem())).intValue();
if ((e.getStateChange() == ItemEvent.SELECTED)
&& (newKind != composedDataCopy.getKind())) {
composedDataCopy.setKind(newKind);
((JPanel)transformTablesPanels.get(index)).remove((JTable)transformTables.get(index));
((JPanel)transformTablesPanels.get(index)).add((JTable)transformTables.get(index));
dialog.pack();
dialog.repaint();
}
}
}
public void actionPerformed(ActionEvent e) {
super.actionPerformed(e);
if(e.getSource()==bAdd){
// Add a new transformation
TransformData newTransform = ((TransformData)dataCopy).addComposedTransformation();
newTransform.setEditable(dataCopy.isEditable());
JPanel mtransformPanel = new JPanel(new BorderLayout());
transformTablesPanels.add(mtransformPanel);
JComboBox mcombo = new JComboBox();
mcombo.addItemListener(this);
transformCombos.add(mcombo);
mtransformPanel.add(mcombo, BorderLayout.NORTH);
for(int j=0;j<TransformData.FULL;j++){
mcombo.addItem(items[j]);
}
mcombo.setSelectedItem(items[newTransform.getKind()-1]);
JTable mtable = createTableDataPanel(newTransform);
transformTables.add(mtable);
mtransformPanel.add(mtable, BorderLayout.CENTER);
composedTransformPanel.add(mtransformPanel);
updateEditable();
dialog.pack();
dialog.repaint();
}else if (e.getSource()==bRemove){
// Remove last transformation
if ( ((TransformData)dataCopy).getTransformChildren().size() > 0){
transformCombos.remove(transformCombos.size()-1);
transformTables.remove(transformTables.size()-1);
composedTransformPanel.remove(composedTransformPanel.getComponentCount()-1);
((TransformData)dataCopy).removeLastComposedTransformation();
transformTablesPanels.remove(transformTablesPanels.size()-1);
}
dialog.pack();
dialog.repaint();
}
}
public void setEditable(boolean b){
super.setEditable(b);
for(int i=0;i< ((TransformData)dataCopy).getTransformChildren().size(); i++){
((TransformData)((TransformData)dataCopy).getTransformChildren().get(i)).setEditable(b);
}
}
public void updateEditable(){
super.updateEditable();
if (transformAvailable){
for(int i=0; i<transformCombos.size();i++)
( (JComboBox)transformCombos.get(i)).setEnabled(dataCopy.isEditable());
for(int i=0; i<transformTables.size();i++){
((JTable)transformTables.get(i)).setGridColor(dataCopy.isEditable()? Color.BLACK : Color.GRAY);
((JTable)transformTables.get(i)).setForeground(dataCopy.isEditable()? Color.BLACK : Color.GRAY);
}
}
}
public void synchronizeDataPanel(){
if (transformAvailable){
for(int i=0; i<transformTables.size();i++){
TableCellEditor tce=( ( (JTable)transformTables.get(i)).getCellEditor());
if(tce!=null){
tce.stopCellEditing();
}
}
}
}
}