content: /*******************************************************************************
   * Copyright (c) 2000, 2007 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.jsdt.internal.corext.fix;
  
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.Map;
  
  import org.eclipse.wst.jsdt.core.dom.rewrite.ITrackedNodePosition;
  import org.eclipse.wst.jsdt.internal.corext.fix.LinkedProposalPositionGroup.PositionInformation;
  
  public class LinkedProposalModel {
  	
  	private Map/*<String, PositionGroup>*/ fPositionGroups;
  	private LinkedProposalPositionGroup.PositionInformation fEndPosition;
  	
  	public void addPositionGroup(LinkedProposalPositionGroup positionGroup) {
  		if (positionGroup == null) {
  			throw new IllegalArgumentException("positionGroup must not be null"); //$NON-NLS-1$
  		}
  		
  		if (fPositionGroups == null) {
  			fPositionGroups= new HashMap();
  		}
  		fPositionGroups.put(positionGroup.getGroupId(), positionGroup);
  	}
  	
  	public LinkedProposalPositionGroup getPositionGroup(String groupId, boolean createIfNotExisting) {
  		LinkedProposalPositionGroup group= fPositionGroups != null ? (LinkedProposalPositionGroup) fPositionGroups.get(groupId) : null;
  		if (createIfNotExisting && group == null) {
  			group= new LinkedProposalPositionGroup(groupId);
  			addPositionGroup(group);
  		}
  		return group;
  	}
  	
  	public Iterator getPositionGroupIterator() {
  		if (fPositionGroups == null) {
  			return new Iterator() {
  				public boolean hasNext() {return false;}
  				public Object next() {return null;}
  				public void remove() {}
  			};
  		}
  		return fPositionGroups.values().iterator();
  	}
  	
  	
  	/**
  	 * Sets the end position of the linked mode to the end of the passed range.
  	 * @param position The position that describes the end position of the linked mode.
  	 */
  	public void setEndPosition(PositionInformation position) {
  		fEndPosition= position;
  	}
  	
  	public void setEndPosition(ITrackedNodePosition position) {
  		setEndPosition(LinkedProposalPositionGroup.createPositionInformation(position, false));
  	}
  	
  	public PositionInformation getEndPosition() {
  		return fEndPosition;
  	}
  
  	public boolean hasLinkedPositions() {
  		return fPositionGroups != null && !fPositionGroups.isEmpty();
  	}
  
  	public void clear() {
  		fPositionGroups= null;
  		fEndPosition= null;	
  	}
  	
  }
  