Package com.aelitis.azureus.ui.swt.columns.utils

Source Code of com.aelitis.azureus.ui.swt.columns.utils.ColumnImageClickArea

/**
* Created on April 29, 2007
*
* 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.columns.utils;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.*;

import org.gudy.azureus2.core3.util.Debug;

import com.aelitis.azureus.ui.common.table.TableCellCore;
import com.aelitis.azureus.ui.common.table.TableColumnCore;
import com.aelitis.azureus.ui.swt.imageloader.ImageLoader;
import com.aelitis.azureus.ui.swt.utils.ColorCache;

import org.gudy.azureus2.plugins.ui.tables.*;

/**
* @author TuxPaper
* @created Apr 29, 2007
*
*/
public class ColumnImageClickArea
  implements TableCellMouseMoveListener, TableRowMouseListener
{
  private static final boolean DEBUG = false;

  private String imageID;

  private final String columnID;

  private Rectangle area;

  private String id;

  private Image image;

  private Rectangle imageArea;

  private Image imgOnRow;

  private Image imgOver;

  private Image imgOffRow;

  private boolean mouseDownOn;

  private boolean cellContainsMouse;

  private TableRow rowContainingMouse;

  private float scale = 1.0f;

  private String tooltip;

  private boolean isVisible = true;

  /**
   * @param id
   */
  public ColumnImageClickArea(String columnID, String id, String imageID) {
    this.columnID = columnID;
    this.id = id;

    setImageID(imageID);
  }

  /**
   * @param imageID2
   *
   * @since 3.0.1.5
   */
  public void setImageID(String imageID) {
    ImageLoader imageLoader = ImageLoader.getInstance();
    if (imgOver != null) {
      imageLoader.releaseImage(this.imageID + "-over");
    }
    if (imgOnRow != null) {
      imageLoader.releaseImage(this.imageID + "-mouseonrow");
    }
    if (imgOffRow != null) {
      imageLoader.releaseImage(this.imageID);
    }

    this.imageID = imageID;
    if (imageID == null) {
      imgOffRow = null;
      imgOnRow = null;
    } else {
      imgOnRow = imageLoader.getImage(imageID + "-mouseonrow");
      imgOver = imageLoader.getImage(imageID + "-over");
      imgOffRow = imageLoader.getImage(imageID);
      if (!ImageLoader.isRealImage(imgOnRow)) {
        imgOnRow = imgOffRow;
      }
      if (!ImageLoader.isRealImage(imgOver)) {
        imgOver = imgOffRow;
      }
    }
    this.image = null;
  }

  public void addCell(TableCell cell) {
    cell.addListeners(this);
    TableRow row = cell.getTableRow();
    if (row != null) {
      row.addMouseListener(this);
    }
  }

  /**
   * @return the area
   */
  public Rectangle getArea() {
    if (area == null) {
      area = new Rectangle(0, 0, 0, 0);
    }
    return area;
  }

  /**
   * @param area the area to set
   */
  public void setArea(Rectangle area) {
    this.area = area;
  }

  /**
   * @return the id
   */
  public String getId() {
    return id;
  }

  /**
   * @return the image
   */
  public Image getImage() {
    return image;
  }

  /**
   * @param image the image to set
   */
  public void setImage(Image image) {
    if (!ImageLoader.isRealImage(image)) {
      this.image = null;
      imageArea = new Rectangle(0, 0, 0, 0);
    } else {
      this.image = image;
      imageArea = image.getBounds();
    }

    if (area == null) {
      area = new Rectangle(imageArea.x, imageArea.y, imageArea.width,
          imageArea.height);
      return;
    }
    area.width = (int) (imageArea.width * scale);
    area.height = (int) (imageArea.height * scale);
    //System.out.println("setImage scale " + scale + ";" + area + ";" + imageArea);
  }

  public void setPosition(int x, int y) {
    if (area == null) {
      area = new Rectangle(x, y, 0, 0);
      return;
    }
    area.x = x;
    area.y = y;
  }

  /**
   * @param gcImage
   *
   * @since 3.0.1.7
   */
  public void drawImage(TableCell cell, GC gcImage) {
    if (!isVisible) {
      return;
    }

    Image image = this.image;
    if (image == null) {
      if (cellContainsMouse && ImageLoader.isRealImage(imgOver)) {
        image = imgOver;
      } else if (rowContainingMouse == cell.getTableRow()
          && ImageLoader.isRealImage(imgOnRow)) {
        image = imgOnRow;
      } else {
        image = imgOffRow;
      }
    }

    if (DEBUG && cellContainsMouse) {
      gcImage.setBackground(ColorCache.getColor(gcImage.getDevice(),
          mouseDownOn ? "#ffff00" : "#ff0000"));
      gcImage.fillRectangle(getArea());
    }
   
    //image = imgOnRow;

    if (ImageLoader.isRealImage(image)) {
      imageArea = image.getBounds();

      Rectangle area = getArea();
      area.width = (int) (imageArea.width * scale);
      area.height = (int) (imageArea.height * scale);

      gcImage.drawImage(image, imageArea.x, imageArea.y, imageArea.width,
          imageArea.height, area.x, area.y, area.width, area.height);
    }
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCellMouseListener#cellMouseTrigger(org.gudy.azureus2.plugins.ui.tables.TableCellMouseEvent)
  public void cellMouseTrigger(TableCellMouseEvent event) {
    if (!isVisible) {
      return;
    }
    //    System.out.println(event.cell + ": " + event.eventType + ";" + event.x + "x" + event.y + "; b"
    //        + event.button + "; " + event.keyboardState);

    if (event.eventType == TableCellMouseEvent.EVENT_MOUSEDOWN) {
      mouseDownOn = false;
      Point pt = new Point(event.x, event.y);
      mouseDownOn = getArea().contains(pt);
      TableCellCore cell = (TableCellCore) event.row.getTableCell(columnID);
      if (cell != null) {
        cell.invalidate();
        cell.refreshAsync();
      }
    } else if (event.eventType == TableCellMouseEvent.EVENT_MOUSEUP
        && mouseDownOn) {
      mouseDownOn = false;
      TableCellMouseEvent mouseEvent = new TableCellMouseEvent();
      mouseEvent.button = event.button;
      mouseEvent.cell = event.cell;
      mouseEvent.eventType = TableCellMouseEvent.EVENT_MOUSEUP; // EVENT_MOUSECLICK would be nice..
      mouseEvent.keyboardState = event.keyboardState;
      mouseEvent.skipCoreFunctionality = event.skipCoreFunctionality;
      mouseEvent.x = event.x; // TODO: Convert to coord relative to image?
      mouseEvent.y = event.y;
      mouseEvent.data = this;
      ((TableColumnCore) event.cell.getTableColumn()).invokeCellMouseListeners(mouseEvent);
      ((TableCellCore) event.cell).invokeMouseListeners(mouseEvent);
    } else if (event.eventType == TableCellMouseEvent.EVENT_MOUSEMOVE) {
      boolean contains = getArea().contains(event.x, event.y);
      setContainsMouse(event.cell, contains);
    } else if (event.eventType == TableCellMouseEvent.EVENT_MOUSEEXIT) {
      setContainsMouse(event.cell, false);
    } else if (event.eventType == TableCellMouseEvent.EVENT_MOUSEDOUBLECLICK) {
      event.skipCoreFunctionality = true;
    }
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableRowMouseListener#rowMouseTrigger(org.gudy.azureus2.plugins.ui.tables.TableRowMouseEvent)
  public void rowMouseTrigger(TableRowMouseEvent event) {
    if (!isVisible) {
      return;
    }
    if (event.eventType == TableCellMouseEvent.EVENT_MOUSEEXIT) {
      if (rowContainingMouse == event.row) {
        rowContainingMouse = null;
      }
      setContainsMouse(null, false);
      //System.out.println("d=" + image);
      TableCellCore cell = (TableCellCore) event.row.getTableCell(columnID);
      if (cell != null) {
        cell.invalidate();
        cell.refreshAsync();
      }
    } else if (event.eventType == TableCellMouseEvent.EVENT_MOUSEENTER) {
      rowContainingMouse = event.row;

      //System.out.println("e=" + image);
      TableCellCore cell = (TableCellCore) event.row.getTableCell(columnID);
      if (cell != null) {
        cell.invalidate();
        cell.refreshAsync();
      }
    }
  }

  private void setContainsMouse(TableCell cell, boolean contains) {
    if (cellContainsMouse != contains) {
      cellContainsMouse = contains;
     
      if (cell != null) {
        TableCellCore cellCore = (TableCellCore) cell;
        cellCore.invalidate();
        cellCore.refreshAsync();
        cellCore.setCursorID(cellContainsMouse ? SWT.CURSOR_HAND
            : SWT.CURSOR_ARROW);
        if (tooltip != null) {
          if (cellContainsMouse) {
            cellCore.setToolTip(tooltip);
          } else {
            Object oldTT = cellCore.getToolTip();
            if (tooltip.equals(oldTT)) {
              cellCore.setToolTip(null);
            }
          }
        }
      }
    }
  }

  public float getScale() {
    return scale;
  }

  public void setScale(float scale) {
    this.scale = scale;
    setImage(image);
  }

  public Rectangle getImageArea() {
    return new Rectangle(imageArea.x, imageArea.y, imageArea.width,
        imageArea.height);
  }

  public String getTooltip() {
    return tooltip;
  }

  public void setTooltip(String tooltip) {
    this.tooltip = tooltip;
  }

  public boolean isVisible() {
    return isVisible;
  }

  public void setVisible(boolean isVisible) {
    this.isVisible = isVisible;
  }
}
TOP

Related Classes of com.aelitis.azureus.ui.swt.columns.utils.ColumnImageClickArea

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.