/** * 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; } }