package com.codeaffine.extras.imageviewer.internal;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;

public class ImageViewer {

  private final ScrolledComposite scrolledComposite;
  final Label imageLabel;
  private ImageData[] imageDatas;
  private Image image;

  public ImageViewer( Composite parent ) {
    scrolledComposite = new ScrolledComposite( parent, SWT.H_SCROLL | SWT.V_SCROLL );
    scrolledComposite.setBackground( getBackgroundColor() );
    imageLabel = new Label( scrolledComposite, SWT.NONE );
    imageLabel.setBackground( getBackgroundColor() );
    scrolledComposite.setContent( imageLabel );
    scrolledComposite.addListener( SWT.Dispose, this::handleDispose );
  }

  public Control getControl() {
    return scrolledComposite;
  }

  public void setImageDatas( ImageData... imageDatas ) {
    if( image != null ) {
      image.dispose();
      image = null;
    }
    this.imageDatas = imageDatas;
    if( imageDatas != null && imageDatas.length > 0 ) {
      image = new Image( scrolledComposite.getDisplay(), imageDatas[ 0 ] );
    }
    imageLabel.setImage( image );
    imageLabel.pack();
  }

  public ImageData[] getImageDatas() {
    return imageDatas;
  }

  @SuppressWarnings("unused")
  private void handleDispose( Event event ) {
    setImageDatas( ( ImageData[] )null );
  }

  private Color getBackgroundColor() {
    return scrolledComposite.getDisplay().getSystemColor( SWT.COLOR_LIST_BACKGROUND );
  }

}