/*******************************************************************************
 * Copyright (c) 2001, 2004 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.ws.internal.explorer.platform.datamodel;

import java.util.*;

public class ListManager
{
  private int nextViewId_;
  private Vector itemsList_;
  private Hashtable itemsTable_;

  public ListManager()
  {
    nextViewId_ = 0;
    itemsList_ = new Vector();
    itemsTable_ = new Hashtable();
  }

  private final void updateManager(ListElement element)
  {
    itemsTable_.put(String.valueOf(nextViewId_),element);
    element.setViewId(nextViewId_);
    nextViewId_++;
  }

  public final void add(ListElement element)
  {
    itemsList_.addElement(element);
    updateManager(element);
  }

  public final void addWithCurrentViewId(ListElement element)
  {
    itemsList_.addElement(element);
    itemsTable_.put(String.valueOf(element.getViewId()),element);
  }

  public final ListElement elementAt(int index)
  {
    return (ListElement)itemsList_.elementAt(index);
  }

  public final ListElement getElementWithViewId(int viewId)
  {
    return (ListElement)itemsTable_.get(String.valueOf(viewId));
  }

  public final void removeElementWithViewId(int viewId)
  {
    itemsTable_.remove(String.valueOf(viewId));
    for (int i=0;i<itemsList_.size();i++)
    {
      ListElement listElement = elementAt(i);
      if (listElement.getViewId() == viewId)
      {
        itemsList_.removeElementAt(i);
        break;
      }
    }
  }

  public final void removeElementAt(int index)
  {
    ListElement listElement = (ListElement)elementAt(index);
    itemsList_.removeElementAt(index);
    itemsTable_.remove(String.valueOf(listElement.getViewId()));
  }

  public final void insertElementAt(ListElement element,int index)
  {
    itemsList_.insertElementAt(element,index);
    updateManager(element);
  }

  public final Enumeration getListElements()
  {
    return itemsList_.elements();
  }

  public final void clear()
  {
    itemsList_.removeAllElements();
    itemsTable_.clear();
  }

  public final ListManager copy(ListManager newListManager)
  {
    newListManager.clear();
    for (int i=0;i<itemsList_.size();i++)
    {
      ListElement listElement = (ListElement)elementAt(i);
      ListElement newListElement = new ListElement(listElement.getObject());
      newListElement.setViewId(listElement.getViewId());
      newListElement.setTargetViewToolInfo(listElement.getTargetNodeId(),listElement.getTargetToolId(),listElement.getTargetViewId());
      newListManager.addWithCurrentViewId(newListElement);
    }
    newListManager.setNextViewId(nextViewId_);
    return newListManager;
  }

  public final void setNextViewId(int nextViewId)
  {
    nextViewId_ = nextViewId;
  }

  public final int getNextViewId()
  {
    return nextViewId_;
  }
}
