/* * (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; /** * Represents a bloc widget * * @author bmangez */ import java.util.Hashtable; import java.util.Vector; import java.util.logging.Logger; import org.apache.commons.lang.StringUtils; import org.openflexo.foundation.DataModification; import org.openflexo.foundation.FlexoObservable; import org.openflexo.foundation.ie.HTMLListDescriptor; import org.openflexo.foundation.ie.IEObject; import org.openflexo.foundation.ie.IETopComponent; import org.openflexo.foundation.ie.IEWOComponent; import org.openflexo.foundation.ie.IObject; import org.openflexo.foundation.ie.dm.IEDataModification; import org.openflexo.foundation.ie.dm.InnerBlocInserted; import org.openflexo.foundation.ie.dm.InnerBlocRemoved; import org.openflexo.foundation.ie.dm.TableSizeChanged; import org.openflexo.foundation.ie.dm.table.AddEmptyRow; import org.openflexo.foundation.ie.dm.table.RemoveEmptyRow; import org.openflexo.foundation.ie.dm.table.WidgetAddedToTable; import org.openflexo.foundation.ie.dm.table.WidgetRemovedFromTable; import org.openflexo.foundation.rm.FlexoProject; import org.openflexo.foundation.xml.FlexoComponentBuilder; public class IEBlocWidget extends AbstractButtonedWidget implements IETopComponent, ExtensibleWidget { /** * */ public static final String BLOC_WIDGET = "bloc_widget"; @SuppressWarnings("unused") private static final Logger logger = Logger.getLogger(IEBlocWidget.class.getPackage().getName()); // ========================================================================== // ============================= Variables // ================================== // ========================================================================== public static final String BLOC_TITLE_ATTRIBUTE_NAME = "title"; public static final String IE_BLOC_WIDGET_TAG_NAME = "IEBloc"; private String _title; private int _colSpan = 1; private int _rowSpan = 1; private String _value; private boolean _hideTable = false; private InnerBlocWidgetInterface _innerBloc; // ========================================================================== // ============================= Constructor // ================================ // ========================================================================== public IEBlocWidget(FlexoComponentBuilder builder) { this(builder.woComponent, null, builder.getProject()); initializeDeserialization(builder); } public IEBlocWidget(IEWOComponent woComponent, IEObject parent, FlexoProject prj) { super(woComponent, parent, prj); _colSpan = 1; _rowSpan = 1; } public void setColSpan(int colSpan) { _colSpan = colSpan; setChanged(); notifyObservers(new IEDataModification("description", null, new Integer(colSpan))); } public void setRowSpan(int rowSpan) { _rowSpan = rowSpan; setChanged(); notifyObservers(new IEDataModification("rowSpan", null, new Integer(rowSpan))); } public int getColSpan() { return _colSpan; } public int getRowSpan() { return _rowSpan; } public boolean getHideTable() { return _hideTable; } public void setHideTable(boolean table) { _hideTable = table; setChanged(); notifyObservers(new IEDataModification("hideTable", null, new Boolean(table))); } /** * @deprecated * @return */ @Deprecated public String getValue() { return _value; } /** * @deprecated * @param _value */ @Deprecated public void setValue(String _value) { this._value = _value; setChanged(); notifyObservers(new IEDataModification("value", null, _value)); } // ========================================================================== // ============================= Instance Methods // =========================== // ========================================================================== @Override public void performOnDeleteOperations() { if (_innerBloc != null) { _innerBloc.delete(); } super.performOnDeleteOperations(); } public void removeContent(InnerBlocWidgetInterface table) { if (table != null && table.equals(_innerBloc)) { DataModification dm = new InnerBlocRemoved(_innerBloc); _innerBloc = null; setChanged(); notifyObservers(dm); } } public void insertContent(InnerBlocWidgetInterface table) { if (table != null) { setContent(table); setChanged(); notifyObservers(new InnerBlocInserted(table)); } } public void replaceWidgetByReusable(IEWidget oldWidget, InnerBlocReusableWidget newWidget) { removeContent((InnerBlocWidgetInterface) oldWidget); insertContent(newWidget); } // ========================================================================== // ============================= Accessors // ================================== // ========================================================================== @Override public boolean isTopComponent() { return true; } public void setTitle(String title) { _title = title; setChanged(); notifyObservers(new DataModification(BLOC_TITLE_ATTRIBUTE_NAME, null, title)); } @Override public String getTitle() { return _title; } public InnerBlocWidgetInterface getContent() { return _innerBloc; } public void setContent(InnerBlocWidgetInterface content) { _innerBloc = content; _innerBloc.setParent(this); setChanged(); } @Override public String getDefaultInspectorName() { return "Bloc.inspector"; } /** * Return a Vector of embedded IEObjects at this level. NOTE that this is NOT a recursive method * * @return a Vector of IEObject instances */ @Override public Vector<IObject> getEmbeddedIEObjects() { Vector answer = new Vector(); if (_innerBloc != null) { answer.add(_innerBloc); } answer.add(getButtonList()); return answer; } public HTMLListDescriptor getContainedDescriptor() { if (getContent() != null) { return getContent().getHTMLListDescriptor(); } return null; } @Override public String getFullyQualifiedName() { return "Bloc" + getTitle(); } public void notifyListActionButtonStateChange(IEDataModification modif) { setChanged(); notifyObservers(modif); } public void handleContentResize() { setChanged(); notifyObservers(new ContentSizeChanged()); } /** * Overrides update * * @see org.openflexo.foundation.ie.IEObject#update(org.openflexo.foundation.FlexoObservable, org.openflexo.foundation.DataModification) */ @Override public void update(FlexoObservable observable, DataModification obj) { if (observable == _innerBloc && (obj instanceof WidgetAddedToTable || obj instanceof WidgetRemovedFromTable || obj instanceof TableSizeChanged || obj instanceof AddEmptyRow || obj instanceof RemoveEmptyRow)) { setChanged(); notifyObservers(new ContentSizeChanged()); } else { super.update(observable, obj); } } /** * Overrides notifyDisplayNeedsRefresh * * @see org.openflexo.foundation.ie.widget.IEWidget#notifyDisplayNeedsRefresh() */ @Override public void notifyDisplayNeedsRefresh() { super.notifyDisplayNeedsRefresh(); if (_innerBloc != null) { _innerBloc.notifyDisplayNeedsRefresh(); } } /** * Overrides getClassNameKey * * @see org.openflexo.foundation.FlexoModelObject#getClassNameKey() */ @Override public String getClassNameKey() { return BLOC_WIDGET; } public Vector<IETextFieldWidget> getAllDateTextfields() { Vector<IETextFieldWidget> v = new Vector<IETextFieldWidget>(); if (_innerBloc != null) { v.addAll(_innerBloc.getAllDateTextfields()); } return v; } @Override public Vector<IESequenceTab> getAllTabContainers() { Vector<IESequenceTab> reply = new Vector<IESequenceTab>(); if (_innerBloc == null) { return reply; } if (_innerBloc instanceof IESequenceTab) { reply.add((IESequenceTab) _innerBloc); } if (_innerBloc instanceof IEHTMLTableWidget) { reply.addAll(((IEHTMLTableWidget) _innerBloc).getAllTabContainers()); } return reply; } @Override public Vector<IEHyperlinkWidget> getAllButtonInterface() { Vector<IEHyperlinkWidget> v = new Vector<IEHyperlinkWidget>(); if (_innerBloc != null) { v.addAll(_innerBloc.getAllButtonInterface()); } if (getButtonList() != null) { v.addAll(getButtonList().getAllButtonInterface()); } return v; } @Override public void setWOComponent(IEWOComponent woComponent) { if (noWOChange(woComponent)) { return; } super.setWOComponent(woComponent); if (getContent() != null) { ((IEWidget) getContent()).setWOComponent(woComponent);// This call is very important because it will update the WOComponent } // components cache if (getButtonList() != null) { getButtonList().setWOComponent(woComponent); } } @Override public boolean areComponentInstancesValid() { if (getContent() != null) { return ((IEWidget) getContent()).areComponentInstancesValid(); } else { return true; } } @Override public void removeInvalidComponentInstances() { super.removeInvalidComponentInstances(); if (getContent() != null) { ((IEWidget) getContent()).removeInvalidComponentInstances(); } } @Override protected Hashtable<String, String> getLocalizableProperties(Hashtable<String, String> props) { if (StringUtils.isNotEmpty(getTitle())) { props.put("title", getTitle()); } return super.getLocalizableProperties(props); } }