Package com.aelitis.azureus.ui.swt.views.skin.sidebar

Source Code of com.aelitis.azureus.ui.swt.views.skin.sidebar.SideBarVitalityImageSWT

/**
* Created on Sep 15, 2008
*
* Copyright 2008 Vuze, Inc.  All rights reserved.
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License only.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
*/

package com.aelitis.azureus.ui.swt.views.skin.sidebar;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;

import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.ui.swt.Utils;

import com.aelitis.azureus.ui.mdi.*;
import com.aelitis.azureus.ui.swt.imageloader.ImageLoader;

/**
* @author TuxPaper
* @created Sep 15, 2008
*
*/
public class SideBarVitalityImageSWT
  implements MdiEntryVitalityImage
{
  private String imageID;

  private final MdiEntry mdiEntry;

  private List<MdiEntryVitalityImageListener> listeners = Collections.EMPTY_LIST;

  private String tooltip;

  private Rectangle hitArea;

  private boolean visible = true;

  private int currentAnimationIndex;

  private String suffix = "";

  private TimerEventPerformer performer;

  private TimerEventPeriodic timerEvent;

  private Image[] images;

  private int delayTime = -1;

  private String fullImageID;

  private int alignment = SWT.RIGHT;

  public SideBarVitalityImageSWT(final MdiEntry mdiEntry, String imageID) {
    this.mdiEntry = mdiEntry;

    mdiEntry.addListener(new MdiCloseListener() {

      public void mdiEntryClosed(MdiEntry entry, boolean userClosed) {
        ImageLoader imageLoader = ImageLoader.getInstance();
        if (fullImageID != null) {
          imageLoader.releaseImage(fullImageID);
        }
      }
    });

    setImageID(imageID);
  }

  // @see org.gudy.azureus2.plugins.ui.sidebar.SideBarVitalityImage#getImageID()
  public String getImageID() {
    return imageID;
  }

  /**
   * @return the sideBarEntry
   */
  public MdiEntry getMdiEntry() {
    return mdiEntry;
  }

  // @see org.gudy.azureus2.plugins.ui.sidebar.SideBarVitalityImage#addListener(org.gudy.azureus2.plugins.ui.sidebar.SideBarVitalityImageListener)
  public void addListener(MdiEntryVitalityImageListener l) {
    if (listeners == Collections.EMPTY_LIST) {
      listeners = new ArrayList<MdiEntryVitalityImageListener>(1);
    }
    listeners.add(l);
  }

  public void triggerClickedListeners(int x, int y) {
    Object[] list = listeners.toArray();
    for (int i = 0; i < list.length; i++) {
      MdiEntryVitalityImageListener l = (MdiEntryVitalityImageListener) list[i];
      try {
        l.mdiEntryVitalityImage_clicked(x, y);
      } catch (Exception e) {
        Debug.out(e);
      }
    }
  }

  // @see org.gudy.azureus2.plugins.ui.sidebar.SideBarVitalityImage#setTooltip(java.lang.String)
  public void setToolTip(String tooltip) {
    this.tooltip = tooltip;
  }

  public String getToolTip() {
    return tooltip;
  }

  /**
   * @param bounds relative to entry
   *
   * @since 3.1.1.1
   */
  public void setHitArea(Rectangle hitArea) {
    this.hitArea = hitArea;
  }

  public Rectangle getHitArea() {
    return hitArea;
  }

  // @see org.gudy.azureus2.plugins.ui.sidebar.SideBarVitalityImage#getVisible()
  public boolean isVisible() {
    return visible;
  }

  // @see org.gudy.azureus2.plugins.ui.sidebar.SideBarVitalityImage#setVisible(boolean)
  public void setVisible(boolean visible) {
    if (this.visible == visible) {
      return;
    }
    this.visible = visible;

    if (visible) {
      createTimerEvent();
    } else if (timerEvent != null) {
      timerEvent.cancel();
    }

    //System.out.println("Gonna redraw because of " + mdiEntry.getId() + " set to " + this.visible + " via " + Debug.getCompressedStackTrace() );
   
    Utils.execSWTThread(new AERunnable() {
      public void runSupport() {
        if (mdiEntry != null) {
          mdiEntry.redraw();
        }
      }
    });
  }

  /**
   *
   *
   * @since 3.1.1.1
   */
  private synchronized void createTimerEvent() {
    if (timerEvent != null) {
      timerEvent.cancel();
    }
    if (images != null && images.length > 1) {
      ImageLoader imageLoader = ImageLoader.getInstance();
      int delay = delayTime == -1 ? imageLoader.getAnimationDelay(imageID)
          : delayTime;

      if (performer == null) {
        performer = new TimerEventPerformer() {
          private boolean exec_pending = false;

          private Object lock = this;

          public void perform(TimerEvent event) {
            synchronized (lock) {

              if (exec_pending) {

                return;
              }

              exec_pending = true;
            }

            Utils.execSWTThread(new AERunnable() {
              public void runSupport() {
                synchronized (lock) {

                  exec_pending = false;
                }

                if (images == null || images.length == 0 || !visible
                    || hitArea == null) {
                  return;
                }
                currentAnimationIndex++;
                if (currentAnimationIndex >= images.length) {
                  currentAnimationIndex = 0;
                }
                if (mdiEntry instanceof SideBarEntrySWT) {
                  SideBarEntrySWT sbEntry = (SideBarEntrySWT) mdiEntry;

                  TreeItem treeItem = sbEntry.getTreeItem();
                  if (treeItem == null || treeItem.isDisposed()
                      || !sbEntry.swt_isVisible()) {
                    return;
                  }
                  Tree parent = treeItem.getParent();
                  parent.redraw(hitArea.x, hitArea.y + treeItem.getBounds().y,
                      hitArea.width, hitArea.height, true);
                  parent.update();
                }
              }
            });
          }
        };
      }
      timerEvent = SimpleTimer.addPeriodicEvent("Animate " + mdiEntry.getId()
          + "::" + imageID + suffix, delay, performer);
    }
  }

  /**
   * @param images
   * @return the currentAnimationIndex
   */
  public int getCurrentAnimationIndex(Image[] images) {
    if (currentAnimationIndex >= images.length) {
      currentAnimationIndex = 0;
    } else if (currentAnimationIndex < 0) {
      currentAnimationIndex = 0;
    }
    return currentAnimationIndex;
  }

  public void switchSuffix(String suffix) {
    if (suffix == null) {
      suffix = "";
    }
    if (suffix.equals(this.suffix)) {
      return;
    }
    this.suffix = suffix;
    setImageID(imageID);
  }

  public void setImageID(final String id) {
    Utils.execSWTThread(new AERunnable() {
      public void runSupport() {
        ImageLoader imageLoader = ImageLoader.getInstance();
        String newFullImageID = id + suffix;
        if (newFullImageID.equals(fullImageID)) {
          return;
        }
        if (fullImageID != null) {
          imageLoader.releaseImage(fullImageID);
        }
        imageID = id;
        images = imageLoader.getImages(newFullImageID);
        if (images == null || images.length == 0) {
          imageLoader.releaseImage(newFullImageID);
          newFullImageID = id;
          images = imageLoader.getImages(id);
        }
        fullImageID = newFullImageID;
        currentAnimationIndex = 0;
        if (isVisible()) {
          createTimerEvent();
        }
      }
    });
  }

  /**
   * @return
   *
   * @since 3.1.1.1
   */
  public Image getImage() {
    if (images == null || images.length == 0
        || currentAnimationIndex >= images.length) {
      return null;
    }
    return images[currentAnimationIndex];
  }

  /**
   * @param delayTime the delayTime to set
   */
  public void setDelayTime(int delayTime) {
    if (this.delayTime == delayTime) {
      return;
    }
    this.delayTime = delayTime;
    if (isVisible()) {
      createTimerEvent();
    }
  }

  /**
   * @return the delayTime
   */
  public int getDelayTime() {
    return delayTime;
  }

  public int getAlignment() {
    return alignment;
  }

  public void setAlignment(int alignment) {
    this.alignment = alignment;
  }
}
TOP

Related Classes of com.aelitis.azureus.ui.swt.views.skin.sidebar.SideBarVitalityImageSWT

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.