/*
 * Copyright (c) 2010-2012, 2015 Eike Stepper (Berlin, Germany) 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:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.emf.cdo.common.util;

import org.eclipse.emf.cdo.common.CDOCommonSession;
import org.eclipse.emf.cdo.common.CDOCommonSession.Options.PassiveUpdateMode;
import org.eclipse.emf.cdo.common.CDOCommonView;

import org.eclipse.net4j.util.container.ContainerEventAdapter;
import org.eclipse.net4j.util.container.IContainer;
import org.eclipse.net4j.util.event.IEvent;

/**
 * A convenience adapter for common CDO {@link IEvent events}.
 *
 * @author Eike Stepper
 * @since 3.0
 */
public class CDOCommonEventAdapter extends ContainerEventAdapter<Object>
{
  public CDOCommonEventAdapter()
  {
  }

  @Override
  protected void notifyOtherEvent(IEvent event)
  {
    if (event instanceof CDOCommonSession.Options.PassiveUpdateEvent)
    {
      CDOCommonSession.Options.PassiveUpdateEvent e = (CDOCommonSession.Options.PassiveUpdateEvent)event;
      boolean oldEnabled = e.getOldEnabled();
      boolean newEnabled = e.getNewEnabled();
      if (oldEnabled != newEnabled)
      {
        onPassiveUpdatesEnabled(oldEnabled, newEnabled);
      }
      else
      {
        onPassiveUpdatesMode(e.getOldMode(), e.getNewMode());
      }
    }
  }

  @Override
  protected void onAdded(IContainer<Object> container, Object element)
  {
    if (element instanceof CDOCommonView)
    {
      onViewOpened((CDOCommonView)element);
    }
  }

  @Override
  protected void onRemoved(IContainer<Object> container, Object element)
  {
    if (element instanceof CDOCommonView)
    {
      onViewClosed((CDOCommonView)element);
    }
  }

  protected void onViewOpened(CDOCommonView view)
  {
  }

  protected void onViewClosed(CDOCommonView element)
  {
  }

  protected void onPassiveUpdatesEnabled(boolean oldEnabled, boolean newEnabled)
  {
  }

  protected void onPassiveUpdatesMode(PassiveUpdateMode oldMode, PassiveUpdateMode newMode)
  {
  }
}
