| /******************************************************************************* |
| * 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); |
| } |
| } |
| } |