blob: 95f8970e0a611b2bcf58971ecf083ccbfd7ecc80 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.xsd.ui.internal.adt.design.editparts.model;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.wst.xsd.ui.internal.adt.facade.IADTObject;
import org.eclipse.wst.xsd.ui.internal.adt.facade.IADTObjectListener;
import org.eclipse.wst.xsd.ui.internal.adt.facade.IField;
import org.eclipse.wst.xsd.ui.internal.adt.facade.IStructure;
import org.eclipse.wst.xsd.ui.internal.adt.facade.IType;
public class ReferencedTypeColumn extends AbstractModelCollection
{
List listenerList = new ArrayList();
InternalListener internalListener = new InternalListener();
// todo... really this this model object should listen
// to the parent of the IType
//
public ReferencedTypeColumn(IADTObject model)
{
super(model, "ReferencedTypeColumn"); //$NON-NLS-1$
model.registerListener(internalListener);
internalListener.recomputeSubListeners();
}
public List getChildren()
{
List result = new ArrayList();
if (model instanceof IStructure)
{
IStructure structure = (IStructure)model;
for (Iterator i = structure.getFields().iterator(); i.hasNext(); )
{
IField field = (IField)i.next();
IType type = field.getType();
if (type != null) // && type.isComplexType())
{
if (!result.contains(type))
{
if (type instanceof IGraphElement)
{
if (((IGraphElement)type).isFocusAllowed())
result.add(type);
}
}
}
}
}
else if (model instanceof IField)
{
IField field = (IField)model;
IType type = field.getType();
if (type != null) // && type.isComplexType())
{
if (type instanceof IGraphElement)
{
if (((IGraphElement)type).isFocusAllowed())
result.add(type);
}
}
}
return result;
}
public void registerListener(IADTObjectListener listener)
{
listenerList.add(listener);
}
public void unregisterListener(IADTObjectListener listener)
{
listenerList.remove(listener);
}
protected void notifyListeners(Object changedObject, String property)
{
List clonedListenerList = new ArrayList();
clonedListenerList.addAll(listenerList);
for (Iterator i = clonedListenerList.iterator(); i.hasNext(); )
{
IADTObjectListener listener = (IADTObjectListener)i.next();
listener.propertyChanged(this, null);
}
}
protected class InternalListener implements IADTObjectListener
{
List fields = new ArrayList();
void recomputeSubListeners()
{
if (model instanceof IStructure)
{
// remove old ones
for (Iterator i = fields.iterator(); i.hasNext();)
{
IField field = (IField) i.next();
field.unregisterListener(this);
}
// add new ones
fields.clear();
IStructure complexType = (IStructure) model;
for (Iterator i = complexType.getFields().iterator(); i.hasNext();)
{
IField field = (IField) i.next();
fields.add(field);
field.registerListener(this);
}
}
}
public void propertyChanged(Object object, String property)
{
if (object == model)
{
// we need to update the fields we're listening too
// since these may have changed
recomputeSubListeners();
}
else if (object instanceof IField)
{
}
notifyListeners(object, property);
}
}
}