/*
 * Copyright (c) 2007, 2008, 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.net4j.util.ui;

import org.eclipse.net4j.util.event.IEvent;
import org.eclipse.net4j.util.event.IListener;
import org.eclipse.net4j.util.internal.ui.bundle.OM;

import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Display;

/**
 * @author Eike Stepper
 */
public abstract class StructuredContentProvider<INPUT> extends ViewerSorter
    implements IStructuredContentProvider, IListener
{
  private StructuredViewer viewer;

  private INPUT input;

  private Font italicFont;

  private Font boldFont;

  public StructuredContentProvider()
  {
  }

  public void dispose()
  {
    if (input != null)
    {
      disconnectInput(input);
      input = null;
    }

    if (italicFont != null)
    {
      italicFont.dispose();
      italicFont = null;
    }

    if (boldFont != null)
    {
      boldFont.dispose();
      boldFont = null;
    }
  }

  public INPUT getInput()
  {
    return input;
  }

  public StructuredViewer getViewer()
  {
    return viewer;
  }

  @SuppressWarnings("unchecked")
  public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
  {
    this.viewer = (StructuredViewer)viewer;
    if (newInput != input)
    {
      if (input != null)
      {
        disconnectInput(input);
      }

      try
      {
        input = (INPUT)newInput;
        if (input != null)
        {
          connectInput(input);
        }
      }
      catch (Exception ex)
      {
        OM.LOG.error(ex);
        input = null;
      }
    }
  }

  protected void connectInput(INPUT input)
  {
  }

  protected void disconnectInput(INPUT input)
  {
  }

  public void notifyEvent(IEvent event)
  {
    refreshViewer(true);
  }

  /**
   * @since 3.0
   */
  public void refreshViewer(boolean updateLabels)
  {
    UIUtil.refreshElement(viewer, null, updateLabels);
  }

  /**
   * @since 3.1
   */
  public void refreshElement(Object element, boolean updateLabels)
  {
    UIUtil.refreshElement(viewer, element, updateLabels);
  }

  /**
   * @since 3.1
   * @deprecated Use {@link #refreshElement(Object, boolean)}
   */
  @Deprecated
  public void refreshSynced(Object element, boolean updateLabels)
  {
    refreshElement(element, updateLabels);
  }

  /**
   * @since 3.1
   */
  public void updateLabels(Object element)
  {
    UIUtil.updateElements(viewer, element);
  }

  /**
   * @since 3.1
   */
  public void revealElement(final Object element)
  {
    try
    {
      getDisplay().asyncExec(new Runnable()
      {
        public void run()
        {
          try
          {
            viewer.reveal(element);
          }
          catch (RuntimeException ignore)
          {
          }
        }
      });
    }
    catch (RuntimeException ignore)
    {
    }
  }

  /**
   * @since 3.1
   */
  public void selectElement(final Object element, final boolean reveal)
  {
    try
    {
      getDisplay().asyncExec(new Runnable()
      {
        public void run()
        {
          try
          {
            viewer.setSelection(new StructuredSelection(element), reveal);
          }
          catch (RuntimeException ignore)
          {
          }
        }
      });
    }
    catch (RuntimeException ignore)
    {
    }
  }

  /**
   * @since 3.3
   */
  public void expandElement(final Object element, final int level)
  {
    if (element != null)
    {
      if (getViewer() instanceof TreeViewer)
      {
        final TreeViewer viewer = (TreeViewer)getViewer();

        try
        {
          getDisplay().asyncExec(new Runnable()
          {
            public void run()
            {
              try
              {
                viewer.expandToLevel(element, level);
              }
              catch (RuntimeException ignore)
              {
              }
            }
          });
        }
        catch (RuntimeException ignore)
        {
        }
      }
    }
  }

  protected Display getDisplay()
  {
    Display display = viewer.getControl().getDisplay();
    if (display == null)
    {
      display = UIUtil.getDisplay();
    }

    return display;
  }

  /**
   * @since 3.1
   */
  protected synchronized Font getItalicFont()
  {
    if (italicFont == null && viewer != null)
    {
      italicFont = UIUtil.getItalicFont(viewer.getControl());
    }

    return italicFont;
  }

  /**
   * @since 3.3
   */
  protected synchronized Font getBoldFont()
  {
    if (boldFont == null && viewer != null)
    {
      boldFont = UIUtil.getBoldFont(viewer.getControl());
    }

    return boldFont;
  }
}
