/* * (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; /** * Abstract class containing buttons * * @author bmangez */ import java.util.Enumeration; import java.util.Vector; import java.util.logging.Level; import java.util.logging.Logger; import org.openflexo.foundation.FlexoObserver; import org.openflexo.foundation.ie.IEObject; import org.openflexo.foundation.ie.IEWOComponent; import org.openflexo.foundation.ie.dm.ButtonAdded; import org.openflexo.foundation.ie.dm.ButtonRemoved; import org.openflexo.foundation.rm.FlexoProject; import org.openflexo.logging.FlexoLogger; public abstract class AbstractButtonedWidget extends IEWidget implements ButtonContainerInterface, FlexoObserver, ButtonedWidgetInterface { private static final Logger logger = FlexoLogger.getLogger(AbstractButtonedWidget.class.getPackage().getName()); private IESequenceWidget _sequenceWidget; public AbstractButtonedWidget(IEWOComponent woComponent, IEObject parent, FlexoProject prj) { super(woComponent, parent, prj); _sequenceWidget = new IESequenceWidget(woComponent, this, prj); } @Override public IESequenceWidget getSequenceWidget() { return _sequenceWidget; } public void setSequenceWidget(IESequenceWidget list) { _sequenceWidget = list; list.setParent(this); list.setWOComponent(getWOComponent()); } public IESequenceWidget getButtonList() { return _sequenceWidget; } public void setButtonList(IESequenceWidget list) { _sequenceWidget = list; } @Deprecated public void addToDeprecatedButtonList(IEButtonWidget button) { if (logger.isLoggable(Level.WARNING)) { logger.warning("addToDeprecatedButtonList cannot be used"); } } @Deprecated public void removeFromDeprecatedButtonList(IEButtonWidget button) { if (logger.isLoggable(Level.WARNING)) { logger.warning("removeFromDeprecatedButtonList cannot be used anymore"); } } @Deprecated public Vector getDeprecatedButtonList() { if (logger.isLoggable(Level.WARNING)) { logger.warning("getDeprecatedButtonList cannot be used anymore"); } return null; } @Deprecated public void setDeprecatedButtonList(Vector v) { if (logger.isLoggable(Level.WARNING)) { logger.warning("setDeprecatedButton cannnot be used except at startut"); } } public void addToButtonList(IEHyperlinkWidget button) { addButton(button); } public void removeFromButtonList(IEHyperlinkWidget button) { removeButton(button); } @Override public void performOnDeleteOperations() { deleteButtons(); super.performOnDeleteOperations(); } private void deleteButtons() { Enumeration en = _sequenceWidget.elements(); while (en.hasMoreElements()) { ((IEWidget) en.nextElement()).delete(); } } @Override public void removeButton(IEHyperlinkWidget buttonToRemove) { _sequenceWidget.removeFromInnerWidgets(buttonToRemove); updateButtonIndex(); setChanged(); notifyObservers(new ButtonRemoved(buttonToRemove)); } /** * Overrides removeButton * * @see org.openflexo.foundation.ie.widget.ButtonContainerInterface#removeButton(org.openflexo.foundation.ie.widget.IEWidget) */ @Override public void removeButton(IEWidget button) { if (button instanceof IEHyperlinkWidget) { removeButton((IEHyperlinkWidget) button); } else { if (logger.isLoggable(Level.WARNING)) { logger.warning("Could not remove object of " + button.getClass().getName()); } } } public void addButton(IEHyperlinkWidget button, int index) { button.setParent(_sequenceWidget); button.setWOComponent(getWOComponent()); _sequenceWidget.insertElementAt(button, Math.max(Math.min(_sequenceWidget.size(), index), 0)); updateButtonIndex(); setChanged(); notifyObservers(new ButtonAdded(button)); } public void addButton(IEHyperlinkWidget button) { button.setParent(_sequenceWidget); int insertionIndex = findInsertionIndex(_sequenceWidget, ((Indexable) button).getIndex()); _sequenceWidget.insertElementAt(button, insertionIndex); setChanged(); notifyObservers(new ButtonAdded(button)); } public static int findInsertionIndex(IESequenceWidget v, int wish) { int answer = 0; if (v == null || v.size() == 0) { return answer; } while (answer < v.size() && answer < wish && wish > wishFor(v.get(answer))) { answer++; } return answer; } private static int wishFor(Object v) { return ((Indexable) v).getIndex(); } public Enumeration elements() { return _sequenceWidget.elements(); } /** * @deprecated use IESequence.refreshIndexes instead */ @Deprecated public void updateButtonIndex() { _sequenceWidget.refreshIndexes(); /* * Enumeration en = _buttonList.elements(); int i = 0; while * (en.hasMoreElements()) { ((IEWidget) en.nextElement()).setIndex(i); * i++; } */ } /** * Overrides insertButtonAtIndex * * @see org.openflexo.foundation.ie.widget.ButtonedWidgetInterface#insertButtonAtIndex(org.openflexo.foundation.ie.widget.IEButtonWidget, * int) */ @Override public void insertButtonAtIndex(IEHyperlinkWidget button, int index) { addButton(button, index); } @Override public int getButtonIndex(IEWidget button) { return _sequenceWidget.indexOf(button); } /** * Overrides buttons * * @see org.openflexo.foundation.ie.widget.ButtonedWidgetInterface#buttonWidgets() */ @Override public Enumeration<IEHyperlinkWidget> buttonWidgets() { return getAllButtons().elements(); } /** * Overrides getAllButtons * * @see org.openflexo.foundation.ie.widget.ButtonedWidgetInterface#getAllButtons() */ @Override public Vector<IEHyperlinkWidget> getAllButtons() { Vector<IEHyperlinkWidget> v = new Vector<IEHyperlinkWidget>(); Enumeration en = _sequenceWidget.getAllNonSequenceWidget().elements(); while (en.hasMoreElements()) { IWidget w = (IWidget) en.nextElement(); if (w instanceof IEHyperlinkWidget) { v.add((IEHyperlinkWidget) w); } } return v; } @Override public void setWOComponent(IEWOComponent woComponent) { if (noWOChange(woComponent)) { return; } super.setWOComponent(woComponent);// This call is very important because it will update the WOComponent components cache if (_sequenceWidget != null) { _sequenceWidget.setWOComponent(woComponent); } } @Override public boolean areComponentInstancesValid() { if (_sequenceWidget != null) { return _sequenceWidget.areComponentInstancesValid(); } else { return true; } } @Override public void removeInvalidComponentInstances() { if (_sequenceWidget != null) { _sequenceWidget.removeInvalidComponentInstances(); } } }