/*
* File : BufferedGraphicTableItem1.java
* Created : 24 nov. 2003
*
* Azureus - a Java Bittorrent client
*
* 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; either version 2 of the License.
*
* 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 ( see the LICENSE file ).
*
* 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 org.gudy.azureus2.ui.swt.components;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.components.BufferedTableRow;
import org.gudy.azureus2.ui.swt.views.table.TableOrTreeSWT;
/** Draws an image at a column in a row of a table using direct paints to the
* table.
* In comparison to BufferedGraphicTable2,
* Pros:
* - Cleaner
* - More proper
*
* Cons:
* - Bug - overpainting of table causing our cell to redraw everytime any other cell redraws
* (New for Windows since SWT3.0M8, always been there for linux)
* - other bugs
*
* @see BufferedGraphicTable2
* @author TuxPaper
*
*/
public abstract class BufferedGraphicTableItem1 extends BufferedTableItemImpl
implements BufferedGraphicTableItem
{
private int marginHeight = 1;
private int marginWidth = 1;
private int orientation = SWT.CENTER;
//The Buffered image
private Image image;
/** Track if we have ever drawn the cell. Don't draw the cell using our
* own GC if we've never drawn before. ie. If we setGraphic before the
* cell is visible, don't paint.
*/
private boolean neverDrawn = true;
public BufferedGraphicTableItem1(BufferedTableRow row,int position) {
super(row, position);
}
/** Retrieve the graphic related to this table item.
* @return the Image that is draw in the cell, or null if there is none.
*/
public Image getGraphic() {
return image;
}
/* Sets image to be drawn.
* @param img Image to be stored & drawn
* @return true - image was changed.<br>
* false = image was the same (doesn't mean image bits were the same)
*/
public boolean setGraphic(Image img) {
boolean bImageSet = (image != img);
boolean bDoRedraw = (img == null);
if (bImageSet) {
// redraw if size changed to wipe area
if (!bDoRedraw &&
image != null && !image.isDisposed() && !img.isDisposed() &&
!image.getBounds().equals(img.getBounds()))
bDoRedraw = true;
image = img;
}
//doPaint(bDoRedraw);
return bImageSet;
}
public boolean needsPainting() {
return true;
}
public void dispose() {
super.dispose();
image = null;
}
/** Calculate the bounds of the receiver should be drawing in
* @return what size/position the canvas should be
*/
public Rectangle getBoundsForCanvas() {
Rectangle bounds = super.getBounds();
if(bounds == null)
return null;
bounds.y += marginHeight;
bounds.height -= (marginHeight * 2);
bounds.x += marginWidth;
bounds.width -= (marginWidth * 2);
return bounds;
}
// @see {getBounds}
public Rectangle getBounds() {
return getBoundsForCanvas();
}
public Rectangle getBoundsRaw() {
return super.getBounds();
}
public Point getSize() {
Rectangle bounds = super.getBounds();
if(bounds == null)
return new Point(0, 0);
return new Point(bounds.width - (marginWidth * 2),
bounds.height - (marginHeight * 2));
}
public void invalidate() {
}
public int getMarginHeight() {
return marginHeight;
}
public int getMarginWidth() {
return marginWidth;
}
public void setMargin(int width, int height) {
if (width >= 0) {
marginWidth = width;
}
if (height >= 0) {
marginHeight = height;
}
}
public int getOrientation() {
return orientation;
}
public void setOrientation(int orientation) {
this.orientation = orientation;
}
public Image getBackgroundImage() {
Image imageRowBG = row.getBackgroundImage();
if (imageRowBG != null) {
Rectangle bounds = super.getBounds();
int wInside = bounds.width - (marginWidth * 2);
int hInside = bounds.height - (marginHeight * 2);
Image imageCellBG = new Image(Display.getDefault(), wInside, hInside);
GC gc = new GC(imageCellBG);
gc.drawImage(imageRowBG, bounds.x + marginWidth, 0 + marginHeight,
wInside, hInside, 0, 0, wInside, hInside);
gc.dispose();
return imageCellBG;
}
TableOrTreeSWT table = row.getTable();
Rectangle bounds = super.getBounds();
if (bounds.isEmpty()) {
return null;
}
Image image = new Image(Display.getDefault(), bounds.width
- (marginWidth * 2), bounds.height - (marginHeight * 2));
GC gc = new GC(image);
gc.setForeground(getBackground());
gc.setBackground(getBackground());
gc.fillRectangle(0, 0, bounds.width, bounds.height);
gc.dispose();
return image;
}
}