/*******************************************************************************
 * Copyright (c) 2001, 2005 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.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

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_;
  }
}
