/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo 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 Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.foundation.ie.widget;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openflexo.foundation.ie.IEObject;
import org.openflexo.foundation.ie.IEWOComponent;
import org.openflexo.foundation.ie.SingleWidgetComponent;
import org.openflexo.foundation.ie.dm.TDInserted;
import org.openflexo.foundation.ie.dm.TDRemoved;
import org.openflexo.foundation.rm.FlexoProject;
import org.openflexo.foundation.xml.FlexoComponentBuilder;
import org.openflexo.logging.FlexoLogger;
public class IESequenceTD extends IESequence<ITableData> implements ITableData {
private static final Logger logger = FlexoLogger.getLogger(IESequenceTD.class.getPackage().getName());
public IESequenceTDConstraints constraints;
public IESequenceTD(FlexoComponentBuilder builder) {
this(builder.woComponent, null, builder.getProject());
initializeDeserialization(builder);
}
public IESequenceTD(IEWOComponent woComponent, IEObject parent, FlexoProject prj) {
super(woComponent, parent, prj);
constraints = new IESequenceTDConstraints();
constraints.gridy = getIndex();
constraints.gridx = 0;
constraints.gridwidth = getColSpan();
}
@Override
public void addToInnerWidgets(ITableData w) {
if (isDeserializing() && w instanceof IESpanTDWidget) {
if (logger.isLoggable(Level.SEVERE)) {
logger.severe("Tried to deserialize an IESpanTDWidget: not adding it. A new one should automatically be created");
}
return;
}
super.addToInnerWidgets(w);
}
@Override
public void removeFromInnerWidgets(ITableData td) {
super.removeFromInnerWidgets(td);
refreshIndexes();
setChanged();
if (td instanceof IETDWidget) {
notifyObservers(new TDRemoved((IETDWidget) td));
}
if (!isDeserializing() && !isCreatedByCloning() && getParent() == tr()) {
tr().notifyTDRemoved(td);
}
}
@Override
public void insertElementAt(ITableData td, int i) {
super.insertElementAt(td, i);
if (td.getClass() == IETDWidget.class) {
notifyObservers(new TDInserted((IETDWidget) td));
}
refreshIndexes();
if (!isDeserializing() && !isCreatedByCloning() && getParent() == tr() && tr() != null) {
tr().notifyTDAdded(td);
}
}
@Override
public int getColSpan() {
int reply = 0;
Enumeration en = elements();
while (en.hasMoreElements()) {
reply = reply + ((ITableData) en.nextElement()).getColSpan();
}
return reply;
}
@Override
public IEHTMLTableConstraints getConstraints() {
return null;
}
@Override
public IETRWidget tr() {
if (getParent() == null) {
return null;
}
if (getParent() instanceof IETRWidget) {
return (IETRWidget) getParent();
}
return ((IESequenceTD) getParent()).tr();
}
@Override
public IETDWidget getFirstTD() {
Enumeration<ITableData> en = elements();
while (en.hasMoreElements()) {
ITableData td = en.nextElement();
return td.getFirstTD();
}
return null;
}
@Override
public void deleteCol() {
if (htmlTable() != null) {
htmlTable().deleteCol(getFirstTD().getXLocation());
}
return;
}
@Override
public void deleteRow() {
if (htmlTable() != null) {
htmlTable().deleteRow(tr());
}
return;
}
public IEHTMLTableWidget htmlTable() {
IEWidget o = (IEWidget) getParent();
while (!(o instanceof IEHTMLTableWidget) && o != null) {
if (o.getParent() instanceof SingleWidgetComponent) {
return null;
}
o = (IEWidget) o.getParent();
}
if (o instanceof IEHTMLTableWidget) {
return (IEHTMLTableWidget) o;
}
return null;
}
public class IESequenceTDConstraints extends IEHTMLTableConstraints {
public IESequenceTDConstraints() {
super();
fill = BOTH;
anchor = NORTHWEST;
weightx = 1.0;
weighty = 1.0;
}
}
@Override
public boolean isSubsequence() {
return getParent() instanceof IESequenceTD;
}
@Override
protected void refreshIndexes() {
Enumeration en = elements();
int i = 0;
while (en.hasMoreElements()) {
((IEWidget) en.nextElement()).setIndex(i);
i++;
}
}
@Override
public double getPourcentage() {
if (!isSubsequence()) {
return 1.0d;
}
logger.warning("TODO pourcentage pour subsequences");
return 0.25d;
}
/**
* Overrides insertSpannedTD
*
* @see org.openflexo.foundation.ie.widget.ITableData#insertSpannedTD()
*/
@Override
public void insertSpannedTD() {
Enumeration<ITableData> en = elements();
while (en.hasMoreElements()) {
ITableData td = en.nextElement();
td.insertSpannedTD();
}
}
/**
*
* @param col
* @return
*/
public IETDWidget getTDAtCol(int col) {
IETDWidget retval = null;
Enumeration<ITableData> en = elements();
while (en.hasMoreElements()) {
ITableData td = en.nextElement();
if (td instanceof IESequenceTD) {
retval = ((IESequenceTD) td).getTDAtCol(col);
if (retval != null) {
return retval;
}
} else {
if (((IETDWidget) td).getXLocation() == col) {
return (IETDWidget) td;
}
}
}
return null;
}
/**
* @param col
*/
public IETDWidget getCellAtIndex(int col) {
if (col < 0) {
return null;
}
Enumeration<ITableData> en = elements();
while (en.hasMoreElements()) {
ITableData td = en.nextElement();
if (td instanceof IETDWidget) {
if (((IETDWidget) td).getXLocation() == col) {
return (IETDWidget) td;
}
} else {
IETDWidget retval = ((IESequenceTD) td).getCellAtIndex(col);
if (retval != null) {
return retval;
}
}
}
return null;
}
/**
* This methods returns all the TD's located in this sequence.
*
* @return all the TD's located in this sequence (and its subsequence) ordered by the column (xLocation)
*/
@Override
public Vector<IETDWidget> getAllTD() {
Vector<IETDWidget> v = new Vector<IETDWidget>();
Enumeration<ITableData> en = elements();
ITableData td = null;
IESequenceTD std = null;
while (en.hasMoreElements()) {
td = en.nextElement();
if (td instanceof IESequenceTD) {
std = (IESequenceTD) td;
v.addAll(std.getAllTD());
} else if (td instanceof IETDWidget) {
v.add((IETDWidget) td);
}
}
return v;
}
/**
* @param widget
*/
public void replaceByNormalTD(IESpanTDWidget widget) {
int index = indexOf(widget);
removeFromInnerWidgets(widget);
IETDWidget td = new IETDWidget(getWOComponent(), this, getProject());
td.setXLocation(widget.getXLocation());
insertElementAt(td, index);
}
/**
* Overrides makeRealDelete
*
* @see org.openflexo.foundation.ie.widget.ITableData#makeRealDelete(boolean)
*/
@Override
public void makeRealDelete(boolean b) {
Enumeration<ITableData> en = elements();
while (en.hasMoreElements()) {
ITableData td = en.nextElement();
td.makeRealDelete(b);
}
this.delete();
}
/**
* Replace a normal TD by a SpanTD
*
* @param tdToReplace
* - the TD to replace in this sequence
* @param spanner
* - the TD that originated the span
*/
public void replaceTDBySpanTD(IETDWidget tdToReplace, IETDWidget spanner) {
int index = indexOf(tdToReplace);
IESpanTDWidget span = new IESpanTDWidget(getWOComponent(), this, spanner, getProject());
span.setXLocation(tdToReplace.getXLocation());
removeFromInnerWidgets(tdToReplace);
insertElementAt(span, index);
}
/**
* @param incrementer
*/
@Override
public void setXLocation(Incrementer incrementer) {
Enumeration<ITableData> en = elements();
while (en.hasMoreElements()) {
ITableData td = en.nextElement();
td.setXLocation(incrementer);
}
}
@Override
public Vector<IETextFieldWidget> getAllDateTextfields() {
Vector<IETextFieldWidget> v = new Vector<IETextFieldWidget>();
Enumeration<ITableData> en = elements();
while (en.hasMoreElements()) {
ITableData element = en.nextElement();
v.addAll(element.getAllDateTextfields());
}
return v;
}
/**
* Overrides getInnerWidgets
*
* @see org.openflexo.foundation.ie.widget.IESequence#getInnerWidgets()
*/
@Override
public Vector<ITableData> getInnerWidgets() {
Vector<ITableData> orig = super.getInnerWidgets();
if (isSerializing || isSerializing() || isBeingCloned()) {
return getAllRealTD(orig);
} else {
return orig;
}
}
public Vector<ITableData> getAllRealTD() {
return getAllRealTD(getInnerWidgets());
}
/**
* @param orig
* @return
*/
private Vector<ITableData> getAllRealTD(Vector<ITableData> orig) {
Vector<ITableData> v = new Vector<ITableData>(orig);
Enumeration<ITableData> en = orig.elements();
while (en.hasMoreElements()) {
ITableData td = en.nextElement();
if (td instanceof IESpanTDWidget) {
v.remove(td);
}
}
return v;
}
@Override
public void setInnerWidgets(Vector<ITableData> v) {
Iterator<ITableData> i = v.iterator();
while (i.hasNext()) {
ITableData td = i.next();
if (td instanceof IESpanTDWidget) {
if (logger.isLoggable(Level.SEVERE)) {
logger.severe("Trying to set a vector containing spanTD's!!!");
}
i.remove();
}
}
super.setInnerWidgets(v);
}
@Override
public Vector<IESequenceTab> getAllTabContainers() {
Vector<IESequenceTab> reply = new Vector<IESequenceTab>();
Enumeration en = elements();
while (en.hasMoreElements()) {
ITableData top = (ITableData) en.nextElement();
reply.addAll(top.getAllTabContainers());
}
return reply;
}
/**
* @return
*/
public Vector<IWidget> getAllInnerTableWidget() {
Vector<IWidget> v = new Vector<IWidget>();
Enumeration en = getAllNonSequenceWidget().elements();
while (en.hasMoreElements()) {
IETDWidget td = (IETDWidget) en.nextElement();
v.addAll(td.getAllInnerTableWidget());
}
return v;
}
}