package org.gudy.azureus2.ui.swt.views.table.painted;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.core3.util.SystemTime;
import org.gudy.azureus2.plugins.ui.Graphic;
import org.gudy.azureus2.plugins.ui.tables.TableColumn;
import org.gudy.azureus2.plugins.ui.tables.TableRow;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTGraphicImpl;
import org.gudy.azureus2.ui.swt.views.table.TableRowSWT;
import org.gudy.azureus2.ui.swt.views.table.TableViewSWT;
import org.gudy.azureus2.ui.swt.views.table.impl.TableCellSWTBase;
import com.aelitis.azureus.ui.common.table.TableColumnCore;
import com.aelitis.azureus.ui.common.table.TableRowCore;
public class TableCellPainted
extends TableCellSWTBase
{
private static final boolean DEBUG_CELLPAINT = false;
private Rectangle bounds;
private String text = "";
private int marginWidth;
private int marginHeight;
private boolean redrawScheduled;
private Color colorFG;
// private Color colorBG;
public TableCellPainted(TableRowSWT row, TableColumnCore column, int pos) {
super(row, column);
constructionCompleter();
}
protected void
constructionCompleter()
{
constructionComplete();
tableColumn.invokeCellAddedListeners(TableCellPainted.this);
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.tables.TableCell#getDataSource()
*/
public Object getDataSource() {
// remove this because if a disposal-listener needs to get its hands on teh datasource to clean up
// properly we need to return it to them! (happens with the peers view PiecesItem for example)
//if (isDisposed()) {
// return null;
//}
TableRowCore row = tableRow;
TableColumnCore col = tableColumn;
if (row == null || col == null) {
return (null);
}
return row.getDataSource(col.getUseCoreDataSource());
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.tables.TableCell#getTableColumn()
*/
public TableColumn getTableColumn() {
return tableColumn;
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.tables.TableCell#getTableRow()
*/
public TableRow getTableRow() {
return tableRow;
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.tables.TableCell#getTableID()
*/
public String getTableID() {
return tableRow==null?null:tableRow.getTableID();
}
@SuppressWarnings("null")
public static boolean stringEquals(String s0, String s1) {
boolean s0Null = s0 == null;
boolean s1Null = s1 == null;
if (s0Null || s1Null) {
return s0Null == s1Null;
}
return s0.equals(s1);
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.tables.TableCell#getText()
*/
public String getText() {
if (hasFlag(FLAG_SORTVALUEISTEXT) && sortValue instanceof String) {
return (String) sortValue;
}
return text;
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.tables.TableCell#getSortValue()
*/
public Comparable<?> getSortValue() {
Comparable<?> value = super.getSortValue();
return value == null ? "" : value;
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.tables.TableCell#isShown()
*/
public boolean isShown() {
return !isDisposed() && tableRow != null && tableRow.getView().isColumnVisible(tableColumn);
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.tables.TableCell#getMaxLines()
*/
public int getMaxLines() {
// TODO
return 1;
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.tables.TableCell#getWidth()
*/
public int getWidth() {
if (isDisposed()) {
return -1;
}
return tableColumn.getWidth() - 2 - (getMarginWidth() * 2);
}
public int getWidthRaw() {
if (isDisposed()) {
return -1;
}
return tableColumn.getWidth() - 2;
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.tables.TableCell#getHeight()
*/
public int getHeight() {
if (bounds == null) {
return tableRow.getView().getRowDefaultHeight();
}
return bounds.height - (getMarginHeight() * 2);
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.tables.TableCell#getMarginHeight()
*/
public int getMarginHeight() {
return marginHeight;
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.tables.TableCell#setMarginHeight(int)
*/
public void setMarginHeight(int height) {
marginHeight = height;
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.tables.TableCell#getMarginWidth()
*/
public int getMarginWidth() {
return marginWidth;
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.tables.TableCell#setMarginWidth(int)
*/
public void setMarginWidth(int width) {
marginWidth = width;
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.tables.TableCell#getBackgroundGraphic()
*/
public Graphic getBackgroundGraphic() {
// WARNING: requires SWT Thread!
return new UISWTGraphicImpl(getBackgroundImage());
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.common.table.TableCellCore#locationChanged()
*/
public void locationChanged() {
}
/* (non-Javadoc)
* @see org.gudy.azureus2.ui.swt.views.table.impl.TableCellSWTBase#setCursorID(int)
*/
@Override
public boolean setCursorID(int cursorID) {
if (!super.setCursorID(cursorID)) {
return false;
}
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (isDisposed() || tableRow == null) {
return;
}
if (isMouseOver()) {
TableViewSWT<?> view = (TableViewSWT<?>) tableRow.getView();
if (view != null) {
Composite composite = view.getComposite();
if (composite != null && !composite.isDisposed()) {
composite.setCursor(composite.getDisplay().getSystemCursor(
getCursorID()));
}
}
}
}
});
return true;
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.common.table.TableCellCore#redraw()
*/
public void redraw() {
if (tableRow==null || !tableRow.isVisible() || redrawScheduled) {
return;
}
redrawScheduled = true;
if (DEBUG_CELLPAINT) {
System.out.println(SystemTime.getCurrentTime() + "r"
+ tableRow.getIndex() + "c" + tableColumn.getPosition()
+ "} cellredraw via " + Debug.getCompressedStackTrace());
}
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (isDisposed()) {
return;
}
redrawScheduled = false;
if (DEBUG_CELLPAINT) {
System.out.println(SystemTime.getCurrentTime() + "r"
+ tableRow.getIndex() + "c" + tableColumn.getPosition()
+ "] cellredraw @ " + bounds);
}
if (bounds != null && tableRow != null) {
TableViewPainted view = (TableViewPainted) tableRow.getView();
if (view != null) {
view.swt_updateCanvasImage(bounds, false);
}
}
}
});
}
public boolean setForeground(Color color) {
// Don't need to set when not visible
if (isInvisibleAndCanRefresh()) {
return false;
}
if (color == colorFG || (color != null && color.equals(colorFG))
|| (colorFG != null && colorFG.equals(color))) {
return false;
}
colorFG = color;
setFlag(FLAG_VISUALLY_CHANGED_SINCE_REFRESH);
return true;
}
public Point getSize() {
if (bounds == null) {
return new Point(0, 0);
}
return new Point(bounds.width - (marginWidth * 2), bounds.height
- (marginHeight * 2));
}
public Rectangle getBounds() {
if (bounds == null) {
return new Rectangle(0, 0, 0, 0);
}
return new Rectangle(bounds.x + marginWidth, bounds.y + marginHeight,
bounds.width - (marginWidth * 2), bounds.height - (marginHeight * 2));
}
public Rectangle getBoundsRaw() {
if (bounds == null) {
return null;
}
return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height);
}
public Rectangle getBoundsOnDisplay() {
if (isDisposed() || tableRow == null) {
return null;
}
Rectangle bounds = getBoundsRaw();
if (bounds == null) {
return null;
}
TableViewPainted tv = ((TableViewPainted) tableRow.getView());
if (tv == null) {
return null;
}
Composite c = tv.getTableComposite();
if (c == null || c.isDisposed()) {
return null;
}
Point pt = c.toDisplay(bounds.x, bounds.y);
bounds.x = pt.x;
bounds.y = pt.y;
bounds.height = getHeight();
bounds.width = getWidthRaw();
return bounds;
}
public Image getBackgroundImage() {
if (bounds == null || 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(getBackgroundSWT());
gc.setBackground(getBackgroundSWT());
gc.fillRectangle(0, 0, bounds.width, bounds.height);
gc.dispose();
return image;
}
public Color getForegroundSWT() {
return colorFG;
}
public Color getBackgroundSWT() {
return null;
}
public void setBoundsRaw(Rectangle bounds) {
this.bounds = bounds;
}
@Override
public boolean uiSetText(String text) {
boolean bChanged = !stringEquals(this.text, text);
if (bChanged) {
this.text = text;
}
return bChanged;
}
}