Package org.gudy.azureus2.ui.swt.views.table.impl

Source Code of org.gudy.azureus2.ui.swt.views.table.impl.FakeTableCell

/**
* Copyright (C) 2007 Aelitis, 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; either version 2
* of the License, or (at your option) any later version.
* 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.
*
* AELITIS, SAS au capital de 63.529,40 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/

package org.gudy.azureus2.ui.swt.views.table.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;

import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;

import org.gudy.azureus2.core3.disk.DiskManagerFileInfo;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.peer.PEPeer;
import org.gudy.azureus2.core3.peer.PEPiece;
import org.gudy.azureus2.core3.tracker.host.TRHostTorrent;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.components.BufferedTableItem;
import org.gudy.azureus2.ui.swt.mainwindow.Colors;
import org.gudy.azureus2.ui.swt.plugins.UISWTGraphic;
import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTGraphicImpl;
import org.gudy.azureus2.ui.swt.shells.GCStringPrinter;
import org.gudy.azureus2.ui.swt.views.table.TableCellSWT;
import org.gudy.azureus2.ui.swt.views.table.TableCellSWTPaintListener;
import org.gudy.azureus2.ui.swt.views.table.TableRowSWT;
import org.gudy.azureus2.ui.swt.views.table.utils.CoreTableColumn;
import org.gudy.azureus2.ui.swt.views.table.utils.TableColumnSWTUtils;

import com.aelitis.azureus.ui.common.table.TableColumnCore;
import com.aelitis.azureus.ui.common.table.TableRowCore;
import com.aelitis.azureus.ui.swt.utils.ColorCache;

import org.gudy.azureus2.plugins.download.DownloadException;
import org.gudy.azureus2.plugins.ui.Graphic;
import org.gudy.azureus2.plugins.ui.tables.*;
import org.gudy.azureus2.plugins.ui.tables.TableColumn;

import org.gudy.azureus2.pluginsimpl.local.disk.DiskManagerFileInfoImpl;
import org.gudy.azureus2.pluginsimpl.local.download.DownloadManagerImpl;
import org.gudy.azureus2.pluginsimpl.local.peers.PeerManagerImpl;
import org.gudy.azureus2.pluginsimpl.local.tracker.TrackerTorrentImpl;

/**
* @author TuxPaper
* @created Aug 29, 2007
*
*/
public class FakeTableCell
  implements TableCellSWT, PaintListener, MouseListener, MouseMoveListener,
  MouseTrackListener
{
  private AEMonitor this_mon = new AEMonitor("FakeTableCell");

  private ArrayList refreshListeners;

  private ArrayList disposeListeners;

  private ArrayList tooltipListeners;

  private ArrayList cellMouseListeners;

  private ArrayList cellMouseMoveListeners;

  private ArrayList cellVisibilityListeners;

  private ArrayList<TableCellClipboardListener> cellClipboardListeners;

  private Image image;

  private Rectangle imageBounds;

  private int marginHeight;

  private int orientation;

  private int marginWidth;

  private Comparable sortValue;

  private Object coreDataSource;

  private Composite composite;

  private final TableColumnCore tableColumn;

  private Graphic graphic;

  private String text;

  private Object pluginDataSource;

  private Object tooltip;
  private Object default_tooltip;
 
  private Rectangle cellArea;

  private boolean hadMore;

  private boolean wrapText  = true;
 
  private ArrayList cellSWTPaintListeners;
 
  private boolean valid;

  private TableRow fakeRow = null;

  /**
   * @param columnRateUpDown
   */
  public FakeTableCell(TableColumn column) {
    valid = false;
    this.tableColumn = (TableColumnCore) column;
    setOrientationViaColumn();
  }

  public FakeTableCell(TableColumnCore column) {
    valid = false;
    this.tableColumn = column;
    setOrientationViaColumn();
  }

  public void addRefreshListener(TableCellRefreshListener listener) {
    try {
      this_mon.enter();

      if (refreshListeners == null)
        refreshListeners = new ArrayList(1);

      refreshListeners.add(listener);

    } finally {
      this_mon.exit();
    }
  }

  public void removeRefreshListener(TableCellRefreshListener listener) {
    try {
      this_mon.enter();

      if (refreshListeners == null)
        return;

      refreshListeners.remove(listener);
    } finally {

      this_mon.exit();
    }
  }

  public void addDisposeListener(TableCellDisposeListener listener) {
    try {
      this_mon.enter();

      if (disposeListeners == null) {
        disposeListeners = new ArrayList(1);
      }
      disposeListeners.add(listener);
    } finally {

      this_mon.exit();
    }
  }

  public void removeDisposeListener(TableCellDisposeListener listener) {
    try {
      this_mon.enter();

      if (disposeListeners == null)
        return;

      disposeListeners.remove(listener);

    } finally {

      this_mon.exit();
    }
  }

  public void addToolTipListener(TableCellToolTipListener listener) {
    try {
      this_mon.enter();

      if (tooltipListeners == null) {
        tooltipListeners = new ArrayList(1);
      }
      tooltipListeners.add(listener);

    } finally {
      this_mon.exit();
    }
  }

  public void removeToolTipListener(TableCellToolTipListener listener) {
    try {
      this_mon.enter();

      if (tooltipListeners == null)
        return;

      tooltipListeners.remove(listener);
    } finally {

      this_mon.exit();
    }
  }

  public void addMouseListener(TableCellMouseListener listener) {
    try {
      this_mon.enter();

      if (cellMouseListeners == null)
        cellMouseListeners = new ArrayList(1);

      cellMouseListeners.add(listener);

    } finally {
      this_mon.exit();
    }
  }

  public void removeMouseListener(TableCellMouseListener listener) {
    try {
      this_mon.enter();

      if (cellMouseListeners == null)
        return;

      cellMouseListeners.remove(listener);

    } finally {
      this_mon.exit();
    }
  }

  public void addMouseMoveListener(TableCellMouseMoveListener listener) {
    try {
      this_mon.enter();

      if (cellMouseMoveListeners == null)
        cellMouseMoveListeners = new ArrayList(1);

      cellMouseMoveListeners.add(listener);

    } finally {
      this_mon.exit();
    }
  }

  public void removeMouseMoveListener(TableCellMouseMoveListener listener) {
    try {
      this_mon.enter();

      if (cellMouseMoveListeners == null)
        return;

      cellMouseMoveListeners.remove(listener);

    } finally {
      this_mon.exit();
    }
  }

  public void addVisibilityListener(TableCellVisibilityListener listener) {
    try {
      this_mon.enter();

      if (cellVisibilityListeners == null)
        cellVisibilityListeners = new ArrayList(1);

      cellVisibilityListeners.add(listener);

    } finally {
      this_mon.exit();
    }
  }

  public void removeVisibilityListener(TableCellVisibilityListener listener) {
    try {
      this_mon.enter();

      if (cellVisibilityListeners == null)
        return;

      cellVisibilityListeners.remove(listener);

    } finally {
      this_mon.exit();
    }
  }
 
  /**
   * @param listenerObject
   *
   * @since 4.0.0.1
   */
  private void addSWTPaintListener(TableCellSWTPaintListener listener) {
    try {
      this_mon.enter();

      if (cellSWTPaintListeners == null)
        cellSWTPaintListeners = new ArrayList(1);

      cellSWTPaintListeners.add(listener);

    } finally {
      this_mon.exit();
    }
  }

  public void invokeSWTPaintListeners(GC gc) {
    if (getBounds().isEmpty()) {
      return;
    }
    if (tableColumn != null) {
      Object[] swtPaintListeners = tableColumn.getCellOtherListeners("SWTPaint");
      if (swtPaintListeners != null) {
        for (int i = 0; i < swtPaintListeners.length; i++) {
          try {
            TableCellSWTPaintListener l = (TableCellSWTPaintListener) swtPaintListeners[i];
 
            l.cellPaint(gc, this);
 
          } catch (Throwable e) {
            Debug.printStackTrace(e);
          }
        }
      }
    }

    if (cellSWTPaintListeners == null) {
      return;
    }
   

    for (int i = 0; i < cellSWTPaintListeners.size(); i++) {
      try {
        TableCellSWTPaintListener l = (TableCellSWTPaintListener) (cellSWTPaintListeners.get(i));

        l.cellPaint(gc, this);

      } catch (Throwable e) {
        Debug.printStackTrace(e);
      }
    }
  }
 
  private void addCellClipboardListener(TableCellClipboardListener listener) {
    try {
      this_mon.enter();

      if (cellClipboardListeners == null)
        cellClipboardListeners = new ArrayList<TableCellClipboardListener>(1);

      cellClipboardListeners.add(listener);

    } finally {
      this_mon.exit();
    }
  }

  public String getClipboardText() {
    String text = null;
    try {
      this_mon.enter();

      if (cellClipboardListeners != null) {
        for (TableCellClipboardListener l : cellClipboardListeners) {
          try {
            text = l.getClipboardText(this);
          } catch (Exception e) {
            Debug.out(e);
          }
          if (text != null) {
            break;
          }
        }
      }
    } finally {
      this_mon.exit();
    }
    if (text == null) {
      text = this.getText();
    }
    return text;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#addListeners(java.lang.Object)
  public void addListeners(Object listenerObject) {
    if (listenerObject instanceof TableCellDisposeListener)
      addDisposeListener((TableCellDisposeListener) listenerObject);

    if (listenerObject instanceof TableCellRefreshListener)
      addRefreshListener((TableCellRefreshListener) listenerObject);

    if (listenerObject instanceof TableCellToolTipListener)
      addToolTipListener((TableCellToolTipListener) listenerObject);

    if (listenerObject instanceof TableCellMouseMoveListener) {
      addMouseMoveListener((TableCellMouseMoveListener) listenerObject);
    }

    if (listenerObject instanceof TableCellMouseListener) {
      addMouseListener((TableCellMouseListener) listenerObject);
    }

    if (listenerObject instanceof TableCellVisibilityListener)
      addVisibilityListener((TableCellVisibilityListener) listenerObject);

    if (listenerObject instanceof TableCellSWTPaintListener) {
      addSWTPaintListener((TableCellSWTPaintListener) listenerObject);
    }

    if (listenerObject instanceof TableCellClipboardListener) {
      addCellClipboardListener((TableCellClipboardListener) listenerObject);
    }
  }

  public void invokeMouseListeners(TableCellMouseEvent event) {
    if (event.cell != null && event.row == null) {
      event.row = event.cell.getTableRow();
    }

    try {
      tableColumn.invokeCellMouseListeners(event);
    } catch (Throwable e) {
      Debug.printStackTrace(e);
    }

    ArrayList listeners = event.eventType == TableCellMouseEvent.EVENT_MOUSEMOVE
        ? cellMouseMoveListeners : cellMouseListeners;

    if (listeners == null) {
      return;
    }

    for (int i = 0; i < listeners.size(); i++) {
      try {
        TableCellMouseListener l = (TableCellMouseListener) (listeners.get(i));

        l.cellMouseTrigger(event);

      } catch (Throwable e) {
        Debug.printStackTrace(e);
      }
    }
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#getDataSource()
  public Object getDataSource() {
    boolean bCoreObject = ((TableColumnCore) tableColumn).getUseCoreDataSource();
    if (bCoreObject) {
      return coreDataSource;
    }

    if (pluginDataSource != null) {
      return pluginDataSource;
    }

    if (coreDataSource instanceof DownloadManager) {
      DownloadManager dm = (DownloadManager) coreDataSource;
      if (dm != null) {
        try {
          pluginDataSource = DownloadManagerImpl.getDownloadStatic(dm);
        } catch (DownloadException e) { /* Ignore */
        }
      }
    }
    if (coreDataSource instanceof PEPeer) {
      PEPeer peer = (PEPeer) coreDataSource;
      if (peer != null) {
        pluginDataSource = PeerManagerImpl.getPeerForPEPeer(peer);
      }
    }

    if (coreDataSource instanceof PEPiece) {
      // XXX There is no Piece object for plugins yet
      PEPiece piece = (PEPiece) coreDataSource;
      if (piece != null) {
        pluginDataSource = null;
      }
    }

    if (coreDataSource instanceof DiskManagerFileInfo) {
      DiskManagerFileInfo fileInfo = (DiskManagerFileInfo) coreDataSource;
      if (fileInfo != null) {
        try {
          pluginDataSource = new DiskManagerFileInfoImpl(
              DownloadManagerImpl.getDownloadStatic(fileInfo.getDownloadManager()),
              fileInfo);
        } catch (DownloadException e) { /* Ignore */
        }
      }
    }

    if (coreDataSource instanceof TRHostTorrent) {
      TRHostTorrent item = (TRHostTorrent) coreDataSource;
      if (item != null) {
        pluginDataSource = new TrackerTorrentImpl(item);
      }
    }
   
    if (pluginDataSource == null) {
      // No translation available, make pluginDataSource the same as core
      pluginDataSource = coreDataSource;
    }

    return pluginDataSource;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#getForeground()
  public int[] getForeground() {
    if (composite == null || composite.isDisposed()) {
      return null;
    }
    Color fg = composite.getForeground();
    return new int[] {
      fg.getRed(),
      fg.getGreen(),
      fg.getBlue()
    };
  }

  public int[] getBackground() {
    // until we can make sure composite.getBackground is being used
    // (background image might superceed), return 0
    if (true) {
      return new int[] {
        0,
        0,
        0
      };
    }
    if (composite == null || composite.isDisposed()) {
      return null;
    }
    Color bg = composite.getBackground();
    return new int[] {
      bg.getRed(),
      bg.getGreen(),
      bg.getBlue()
    };
  }

  public Graphic getBackgroundGraphic() {
    // TODO handle cellArea

    if (composite == null || composite.isDisposed()) {
      return null;
    }

    try {
      Rectangle bounds = composite.getBounds();

      if (bounds.isEmpty()) {
        return null;
      }

      Image imgCap = new Image(composite.getDisplay(), bounds.width,
          bounds.height);

      // will walk up tree until it gets an image
      Control bgControl = Utils.findBackgroundImageControl(composite);
      Image imgBG = composite.getBackgroundImage();

      GC gc = new GC(imgCap);
      try {
        if (imgBG == null) { // || imgBG has alpha..
          gc.setBackground(composite.getBackground());
          gc.fillRectangle(0, 0, bounds.width, bounds.height);
        }

        if (imgBG != null) {
          Point controlPos = new Point(0, 0);
          if (bgControl instanceof Composite) {
            Rectangle compArea = ((Composite) bgControl).getClientArea();
            controlPos.x = compArea.x;
            controlPos.y = compArea.y;
          }
          Point absControlLoc = bgControl.toDisplay(controlPos.x, controlPos.y);

          Rectangle shellClientArea = composite.getShell().getClientArea();
          Point absShellLoc = composite.getParent().toDisplay(
              shellClientArea.x, shellClientArea.y);

          Point ofs = new Point(absControlLoc.x - absShellLoc.x,
              absControlLoc.y - absShellLoc.y);
          Rectangle imgBGBounds = imgBG.getBounds();
          ofs.x = (ofs.x % imgBGBounds.width);
          ofs.y = (ofs.y % imgBGBounds.height);

          gc.drawImage(imgBG, ofs.x, ofs.y);
        }
      } finally {
        gc.dispose();
      }

      return new UISWTGraphicImpl(imgCap);
    } catch (Exception e) {
      Debug.out(e);
    }
    return null;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#getGraphic()
  public Graphic getGraphic() {
    return graphic;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#getHeight()
  public int getHeight() {
    if (composite != null && !composite.isDisposed()) {
      return composite.getSize().y;
    }
    return 0;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#getMaxLines()
  public int getMaxLines() {
    return -1;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#getSortValue()
  public Comparable getSortValue() {
    if ( sortValue == null ){
      return( "" );
    }
    return sortValue;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#getTableColumn()
  public TableColumn getTableColumn() {
    return tableColumn;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#getTableID()
  public String getTableID() {
    return tableColumn == null ? null : tableColumn.getTableID();
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#getTableRow()
  public TableRow getTableRow() {
    if (fakeRow == null) {
      fakeRow = new TableRow() {
        Map<String, Object> data = new LightHashMap<String,Object>(1);

        public void setForegroundToErrorColor() {
        }

        public void setForeground(int[] rgb) {
        }

        public void setForeground(int red, int green, int blue) {
        }

        public void removeMouseListener(TableRowMouseListener listener) {
        }

        public boolean isValid() {
          return FakeTableCell.this.isValid();
        }

        public boolean isSelected() {
          return false;
        }

        public String getTableID() {
          return FakeTableCell.this.getTableID();
        }

        public TableCell getTableCell(String columnName) {
          return null;
        }

        public Object getDataSource() {
          return FakeTableCell.this.getDataSource();
        }

        public void addMouseListener(TableRowMouseListener listener) {
        }

        public Object getData(String id) {
          synchronized (data) {
            return data.get(id);
          }
        }

        public void setData(String id, Object val) {
          synchronized (data) {
            data.put(id, val);
          }
        }
      };
    }
    return fakeRow;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#getText()
  public String getText() {
    return text;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#getToolTip()
  public Object getToolTip() {
    if (tooltip == null && hadMore) {
      return text;
    }
    return tooltip;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#getWidth()
  public int getWidth() {
    if (!isDisposed()) {
      return composite.getSize().x;
    }
    return 0;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#invalidate()
  public void invalidate() {
    valid = false;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#isDisposed()
  public boolean isDisposed() {
    return composite == null || composite.isDisposed();
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#isShown()
  public boolean isShown() {
    return true;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#isValid()
  public boolean isValid() {
    return valid;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#setFillCell(boolean)
  public void setFillCell(boolean fillCell) {
    // TODO Auto-generated method stub

  }
 
  public void setWrapText( boolean wrap ){
    wrapText = wrap;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#setForeground(int, int, int)
  public boolean setForeground(int red, int green, int blue) {
    if (isDisposed()) {
      return false;
    }
    if (red < 0 || green < 0 || blue < 0) {
      composite.setForeground(null);
    } else {
      composite.setForeground(ColorCache.getColor(composite.getDisplay(), red,
          green, blue));
    }
    return true;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#setForeground(int[])
  public boolean setForeground(int[] rgb) {
    if (rgb == null || rgb.length < 3) {
      return setForeground(-1, -1, -1);
    }
    return setForeground(rgb[0], rgb[1], rgb[2]);
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#setForegroundToErrorColor()
  public boolean setForegroundToErrorColor() {
    if (isDisposed()) {
      return false;
    }
    composite.setForeground(Colors.colorError);
    return true;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#setGraphic(org.gudy.azureus2.plugins.ui.Graphic)
  public boolean setGraphic(Graphic img) {
    Image imgSWT = null;
    if (img instanceof UISWTGraphic) {
      imgSWT = ((UISWTGraphic) img).getImage();
    }

    if (imgSWT != null && imgSWT.isDisposed()) {
      return false;
    }

    if (image == imgSWT) {
      return false;
    }

    //System.out.println("setGraphic " + image);

    image = imgSWT;
    if (image != null) {
      imageBounds = image.getBounds();
    }

    if (composite != null && !composite.isDisposed()) {
      redraw();
    }

    graphic = img;
    return true;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#setMarginHeight(int)
  public void setMarginHeight(int height) {
    // TODO Auto-generated method stub

  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#setMarginWidth(int)
  public void setMarginWidth(int width) {
    // TODO Auto-generated method stub

  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#setSortValue(java.lang.Comparable)
  public boolean setSortValue(Comparable valueToSort) {
    // TODO Auto-generated method stub
    return false;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#setSortValue(float)
  public boolean setSortValue(float valueToSort) {
    // TODO Auto-generated method stub
    return false;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#setText(java.lang.String)
  public boolean setText(String text) {
    if (text != null && text.equals(this.text)) {
      return false;
    }
    this.text = text;
    Utils.execSWTThread(new AERunnable() {
      public void runSupport() {
        if (!isDisposed()) {
          composite.redraw();
        }
      }
    });
    return true;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#setToolTip(java.lang.Object)
  public void setToolTip(Object tooltip) {
    this.tooltip = tooltip;
    updateTooltip();
  }

  public void
  setDefaultToolTip(
    Object  o )
  {
    default_tooltip = o;
  }
 
  public Object
  getDefaultToolTip()
  {
    return( default_tooltip );
  }

  private void
  updateTooltip()
  {
    if (!isDisposed()) {
      Object  target = tooltip==null?default_tooltip:tooltip;
     
      composite.setToolTipText(target == null ? null : target.toString());
    }
  }
 
  private boolean _setSortValue(Comparable valueToSort) {
    if (sortValue == valueToSort)
      return false;

    if ((valueToSort instanceof String) && (sortValue instanceof String)
        && sortValue.equals(valueToSort)) {
      return false;
    }

    if ((valueToSort instanceof Number) && (sortValue instanceof Number)
        && sortValue.equals(valueToSort)) {
      return false;
    }

    sortValue = valueToSort;

    return true;
  }

  public boolean setSortValue(long valueToSort) {
    if ((sortValue instanceof Long)
        && ((Long) sortValue).longValue() == valueToSort)
      return false;

    return _setSortValue(new Long(valueToSort));
  }

  public void doPaint(GC gc, Rectangle bounds) {
    if (isDisposed()) {
      return;
    }
    // TODO: Cleanup and stop calling me so often!
   
    //gc.setBackground(getBackground());
    //if (DEBUG_COLORCELL) {
    //  gc.setBackground(Display.getDefault().getSystemColor(
    //      (int) (Math.random() * 16)));
    //}
    if (bounds == null) {
      return;
    }
    //gc.fillRectangle(bounds);

    if (image != null && !image.isDisposed()) {
      Point size = new Point(bounds.width, bounds.height);

      int x;

      int y = marginHeight;
      y += (size.y - imageBounds.height) / 2;

      if (orientation == SWT.CENTER) {
        x = marginWidth;
        x += (size.x - (marginWidth * 2) - imageBounds.width) / 2;
      } else if (orientation == SWT.RIGHT) {
        x = bounds.width - marginWidth - imageBounds.width;
      } else {
        x = marginWidth;
      }

      int width = Math.min(bounds.width - x - marginWidth, imageBounds.width);
      int height = Math.min(bounds.height - y - marginHeight,
          imageBounds.height);

      if (width >= 0 && height >= 0) {
        gc.drawImage(image, 0, 0, width, height, bounds.x + x, bounds.y + y,
            width, height);
      }
    }

    if (text != null && text.length() > 0) {
      GCStringPrinter sp = new GCStringPrinter(gc, text, bounds, true, false,
          wrapText?( orientation | SWT.WRAP ):orientation );
      sp.printString();
      hadMore = sp.isCutoff();
    }

    invokeSWTPaintListeners(gc);
  }

  public boolean refresh() {
    //System.out.println("refresh");
    Utils.execSWTThread(new AERunnable() {
      public void runSupport() {
        boolean wasValid = valid;
        try {
          tableColumn.invokeCellRefreshListeners(FakeTableCell.this, false);
        } catch (Throwable e) {
        }
        if (refreshListeners != null) {
          for (int i = 0; i < refreshListeners.size(); i++) {
            ((TableCellRefreshListener) (refreshListeners.get(i))).refresh(FakeTableCell.this);
          }
        }
        if (!wasValid) {
          valid = true;
        }
      }
    });
    return true;
  }

  public void setDataSource(Object _coreDataSource) {
    coreDataSource = _coreDataSource;
    if (_coreDataSource != null && !isDisposed()) {
      invokeVisibilityListeners(TableCellVisibilityListener.VISIBILITY_SHOWN,
          true);
    }
  }

  public void setControl(final Composite composite) {
    setControl(composite, null);
  }

  public void setControl(final Composite composite, Rectangle cellArea) {
    if (composite == null) {
      dispose();
      this.composite = null;
      return;
    }

    this.composite = composite;
    this.cellArea = cellArea;

    composite.addPaintListener(this);
    composite.addMouseListener(this);
    composite.addMouseMoveListener(this);
    composite.addMouseTrackListener(this);

    setForeground(-1, -1, -1);
    setText(null);
    setToolTip(null);

    composite.addDisposeListener(new DisposeListener() {
      public void widgetDisposed(DisposeEvent e) {
        dispose();
      }
    });
    if (coreDataSource != null && !isDisposed()) {
      invokeVisibilityListeners(TableCellVisibilityListener.VISIBILITY_SHOWN,
          true);
    }
  }

  public void paintControl(PaintEvent e) {
    doPaint(e.gc, cellArea == null ? composite.getClientArea() : cellArea);
  }

  public void mouseUp(MouseEvent e) {
    invokeMouseListeners(buildMouseEvent(e, TableCellMouseEvent.EVENT_MOUSEUP));
  }

  public void mouseDown(MouseEvent e) {
    try{
      if (   composite == null || composite.getMenu() != null ||
          ( cellMouseListeners != null && cellMouseListeners.size() > 0 ) ||
          text == null || text.length() == 0 ){
   
        return;
      }
     
      if (!(e.button == 3 || (e.button == 1 && e.stateMask == SWT.CONTROL))){
     
        return;
      }
   
      Menu menu = new Menu(composite.getShell(),SWT.POP_UP);
     
      MenuItem   item = new MenuItem( menu,SWT.NONE );
     
      item.setText( MessageText.getString( "ConfigView.copy.to.clipboard.tooltip"));
 
      item.addSelectionListener(
        new SelectionAdapter()
        {
          public void
          widgetSelected(
            SelectionEvent arg0)
          {
            if ( !composite.isDisposed() && text != null && text.length() > 0 ){
             
              new Clipboard(composite.getDisplay()).setContents(new Object[] {text}, new Transfer[] {TextTransfer.getInstance()});
            }
          }
        });
     
      composite.setMenu( menu );
     
      menu.addMenuListener(
        new MenuAdapter()
        {
          public void
          menuHidden(
            MenuEvent arg0 )
          {
            if ( !composite.isDisposed()){
           
              composite.setMenu( null );
            }
          }
        });
     
      menu.setVisible( true );

    }finally{
   
      invokeMouseListeners(buildMouseEvent(e, TableCellMouseEvent.EVENT_MOUSEDOWN));
    }
  }

  public void mouseDoubleClick(MouseEvent e) {
    invokeMouseListeners(buildMouseEvent(e,
        TableCellMouseEvent.EVENT_MOUSEDOUBLECLICK));
  }

  public void mouseMove(MouseEvent e) {
    invokeMouseListeners(buildMouseEvent(e, TableCellMouseEvent.EVENT_MOUSEMOVE));
  }

  public void mouseHover(MouseEvent e) {
    invokeToolTipListeners(TOOLTIPLISTENER_HOVER);
  }

  public void mouseExit(MouseEvent e) {
    invokeMouseListeners(buildMouseEvent(e, TableCellMouseEvent.EVENT_MOUSEEXIT));
  }

  public void mouseEnter(MouseEvent e) {
    invokeMouseListeners(buildMouseEvent(e,
        TableCellMouseEvent.EVENT_MOUSEENTER));
  }

  /**
   * @param e
   * @return
   *
   * @since 3.0.2.1
   */
  protected TableCellMouseEvent buildMouseEvent(MouseEvent e, int eventType) {
    if (isDisposed()) {
      return null;
    }
    TableCellMouseEvent event = new TableCellMouseEvent();
    event.cell = this;
    event.button = e.button;
    event.keyboardState = e.stateMask;
    event.eventType = eventType;

    Rectangle r = composite.getBounds();
    //    int align = tableColumn.getAlignment();
    //    if (align == TableColumn.ALIGN_CENTER) {
    //      r.x = marginWidth;
    //      r.x += (r.width - (marginWidth * 2) - imageBounds.width) / 2;
    //    }

    if (cellArea != null) {
      r = new Rectangle(r.x + cellArea.x, r.y + cellArea.y, cellArea.width,
          cellArea.height);
    }

    event.x = e.x - r.x;
    event.y = e.y - r.y;

    return event;
  }

  private void setOrientationViaColumn() {
    orientation = TableColumnSWTUtils.convertColumnAlignmentToSWT(tableColumn.getAlignment());
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#dispose()
  public void dispose() {
    if (composite != null && !composite.isDisposed()) {
      composite.removePaintListener(this);
      composite.removeMouseListener(this);
      composite.removeMouseMoveListener(this);
      composite.removeMouseTrackListener(this);
    }

    if (disposeListeners != null) {
      for (Iterator iter = disposeListeners.iterator(); iter.hasNext();) {
        TableCellDisposeListener listener = (TableCellDisposeListener) iter.next();
        try {
          listener.dispose(this);
        } catch (Throwable e) {
          Debug.out(e);
        }
      }
      disposeListeners = null;
    }
    tableColumn.invokeCellDisposeListeners(this);
    tableColumn.invalidateCells();
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#getCursorID()
  public int getCursorID() {
    // TODO Auto-generated method stub
    return 0;
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#getObfusticatedText()
  public String getObfusticatedText() {
    return text;
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#getTableRowCore()
  public TableRowCore getTableRowCore() {
    return null;
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#getVisuallyChangedSinceRefresh()
  public boolean getVisuallyChangedSinceRefresh() {
    return true;
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#invalidate(boolean)
  public void invalidate(boolean mustRefresh) {
    valid = false;
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#invokeToolTipListeners(int)
  public void invokeToolTipListeners(int type) {
    if (tableColumn == null)
      return;

    tableColumn.invokeCellToolTipListeners(this, type);

    if (tooltipListeners == null)
      return;

    try {
      if (type == TOOLTIPLISTENER_HOVER) {
        for (int i = 0; i < tooltipListeners.size(); i++)
          ((TableCellToolTipListener) (tooltipListeners.get(i))).cellHover(this);
      } else {
        for (int i = 0; i < tooltipListeners.size(); i++)
          ((TableCellToolTipListener) (tooltipListeners.get(i))).cellHoverComplete(this);
      }
    } catch (Throwable e) {
      Debug.out(e);
    }
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#invokeVisibilityListeners(int, boolean)
  public void invokeVisibilityListeners(int visibility,
      boolean invokeColumnListeners) {
    if (invokeColumnListeners) {
      tableColumn.invokeCellVisibilityListeners(this, visibility);
    }

    if (cellVisibilityListeners == null)
      return;

    for (int i = 0; i < cellVisibilityListeners.size(); i++) {
      try {
        TableCellVisibilityListener l = (TableCellVisibilityListener) (cellVisibilityListeners.get(i));

        l.cellVisibilityChanged(this, visibility);

      } catch (Throwable e) {
        Debug.printStackTrace(e);
      }
    }
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#isMouseOver()
  public boolean isMouseOver() {
    if (isDisposed()) {
      return false;
    }
    Rectangle r = composite.getBounds();
    if (cellArea != null) {
      r = new Rectangle(r.x + cellArea.x, r.y + cellArea.y, cellArea.width,
          cellArea.height);
    }
    Point ptStart = composite.toDisplay(r.x, r.y);
    r.x = ptStart.x;
    r.y = ptStart.y;
    Point ptCursor = composite.getDisplay().getCursorLocation();
    return r.contains(ptCursor);
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#isUpToDate()
  public boolean isUpToDate() {
    return false;
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#locationChanged()
  public void locationChanged() {
    // TODO Auto-generated method stub

  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#needsPainting()
  public boolean needsPainting() {
    return true;
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#refresh(boolean)
  public boolean refresh(boolean doGraphics) {
    return refresh();
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#refresh(boolean, boolean, boolean)
  public boolean refresh(boolean doGraphics, boolean rowVisible,
      boolean cellVisible) {
    return refresh();
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#refresh(boolean, boolean)
  public boolean refresh(boolean doGraphics, boolean rowVisible) {
    return refresh();
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#setCursorID(int)
  public void setCursorID(int cursorID) {
    // TODO Auto-generated method stub

  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#setUpToDate(boolean)
  public void setUpToDate(boolean upToDate) {
    // TODO Auto-generated method stub

  }

  // @see java.lang.Comparable#compareTo(java.lang.Object)
  public int compareTo(Object arg0) {
    // TODO Auto-generated method stub
    return 0;
  }

  public void setOrentation(int o) {
    orientation = o;
  }

  public Rectangle getCellArea() {
    return cellArea;
  }

  public void setCellArea(Rectangle cellArea) {
    //System.out.println("SCA " + cellArea + ";" + Debug.getCompressedStackTrace());
    this.cellArea = cellArea;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#getMouseOffset()
  public int[] getMouseOffset() {
    if (isDisposed()) {
      return null;
    }
    Rectangle r = composite.getBounds();
    if (cellArea != null) {
      r = new Rectangle(r.x + cellArea.x, r.y + cellArea.y, cellArea.width,
          cellArea.height);
    }
    Point ptStart = composite.toDisplay(r.x, r.y);
    r.x = ptStart.x;
    r.y = ptStart.y;
    Point ptCursor = composite.getDisplay().getCursorLocation();
    if (!r.contains(ptCursor)) {
      return null;
    }
    return new int[] { ptCursor.x - r.x, ptCursor.y - r.y };
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#getMarginHeight()
  public int getMarginHeight() {
    return marginHeight;
  }

  // @see org.gudy.azureus2.plugins.ui.tables.TableCell#getMarginWidth()
  public int getMarginWidth() {
    return marginWidth;
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#refreshAsync()
  public void refreshAsync() {
    refresh();
  }

  // @see com.aelitis.azureus.ui.common.table.TableCellCore#redraw()
  public void redraw() {
    Utils.execSWTThread(new AERunnable() {
      public void runSupport() {
        if (!isDisposed()) {
          composite.redraw();
        }
      }
    });
  }

  // @see org.gudy.azureus2.ui.swt.views.table.TableCellSWT#doPaint(org.eclipse.swt.graphics.GC)
  public void doPaint(GC gc) {
    doPaint(gc, cellArea == null ? composite.getClientArea() : cellArea);
  }

  // @see org.gudy.azureus2.ui.swt.views.table.TableCellSWT#getBackgroundImage()
  public Image getBackgroundImage() {
    // TODO Auto-generated method stub
    return null;
  }

  // @see org.gudy.azureus2.ui.swt.views.table.TableCellSWT#getBackgroundSWT()
  public Color getBackgroundSWT() {
    // TODO Auto-generated method stub
    return composite.getBackground();
  }

  // @see org.gudy.azureus2.ui.swt.views.table.TableCellSWT#getBounds()
  public Rectangle getBounds() {
    return cellArea == null ? composite.getClientArea() : new Rectangle(
        cellArea.x, cellArea.y, cellArea.width, cellArea.height);
  }

  // @see org.gudy.azureus2.ui.swt.views.table.TableCellSWT#getBufferedTableItem()
  public BufferedTableItem getBufferedTableItem() {
    // TODO Auto-generated method stub
    return null;
  }

  // @see org.gudy.azureus2.ui.swt.views.table.TableCellSWT#getForegroundSWT()
  public Color getForegroundSWT() {
    return composite.getForeground();
  }

  // @see org.gudy.azureus2.ui.swt.views.table.TableCellSWT#getGraphicSWT()
  public Image getGraphicSWT() {
    // TODO Auto-generated method stub
    return null;
  }

  // @see org.gudy.azureus2.ui.swt.views.table.TableCellSWT#getIcon()
  public Image getIcon() {
    // TODO Auto-generated method stub
    return null;
  }

  // @see org.gudy.azureus2.ui.swt.views.table.TableCellSWT#getSize()
  public Point getSize() {
    Rectangle bounds = getBounds();
    if (bounds == null) {
      return null;
    }
    return new Point(bounds.width, bounds.height);
  }

  // @see org.gudy.azureus2.ui.swt.views.table.TableCellSWT#getTableRowSWT()
  public TableRowSWT getTableRowSWT() {
    // TODO Auto-generated method stub
    return null;
  }

  // @see org.gudy.azureus2.ui.swt.views.table.TableCellSWT#getTextAlpha()
  public int getTextAlpha() {
    // TODO Auto-generated method stub
    return 0;
  }

  // @see org.gudy.azureus2.ui.swt.views.table.TableCellSWT#setForeground(org.eclipse.swt.graphics.Color)
  public boolean setForeground(Color color) {
    // TODO Auto-generated method stub
    return false;
  }

  // @see org.gudy.azureus2.ui.swt.views.table.TableCellSWT#setGraphic(org.eclipse.swt.graphics.Image)
  public boolean setGraphic(Image img) {
    graphic = null;

    image = img;
    if (image != null) {
      imageBounds = image.getBounds();
    }

    if (composite != null && !composite.isDisposed()) {
      redraw();
    }
   
    return true;
  }

  // @see org.gudy.azureus2.ui.swt.views.table.TableCellSWT#setIcon(org.eclipse.swt.graphics.Image)
  public boolean setIcon(Image img) {
    // TODO Auto-generated method stub
    return false;
  }

  // @see org.gudy.azureus2.ui.swt.views.table.TableCellSWT#setTextAlpha(int)
  public void setTextAlpha(int textOpacity) {
    // TODO Auto-generated method stub
   
  }

  public Rectangle getBoundsOnDisplay() {
    Rectangle bounds = getBounds();
    Point pt = composite.toDisplay(bounds.x, bounds.y);
    bounds.x = pt.x;
    bounds.y = pt.y;
    return bounds;
  }
}
TOP

Related Classes of org.gudy.azureus2.ui.swt.views.table.impl.FakeTableCell

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.