📄 tablecellimpl.java
字号:
/* End TYPE_GRAPHIC Functions */
public void addRefreshListener(TableCellRefreshListener listener) {
try{
this_mon.enter();
if (refreshListeners == null)
refreshListeners = new ArrayList(1);
if (bDebug) {
debug("addRefreshListener; count=" + refreshListeners.size());
}
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 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();
}
}
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 TableCellMouseListener)
addMouseListener((TableCellMouseListener)listenerObject);
if (listenerObject instanceof TableCellVisibilityListener)
addVisibilityListener((TableCellVisibilityListener)listenerObject);
}
/**
* If a plugin in trying to invalidate a cell, then clear the sort value
* too.
*/
public void invalidate() {
checkCellForSetting();
invalidate(true);
}
/* Start of Core-Only function */
//////////////////////////////////
public void invalidate(final boolean bMustRefresh) {
valid = false;
if (bDebug)
debug("Invalidate Cell;" + bMustRefresh);
if (bMustRefresh)
this.bMustRefresh = true;
}
public void refresh() {
refresh(true);
}
public void refresh(boolean bDoGraphics) {
refresh(bDoGraphics, isShown());
}
public void refresh(boolean bDoGraphics, boolean bRowVisible) {
refresh(bDoGraphics, bRowVisible, isShown());
}
private boolean bInRefresh = false;
public void refresh(boolean bDoGraphics, boolean bRowVisible,
boolean bCellVisible)
{
if (refreshErrLoopCount > 2)
return;
int iErrCount = tableColumn.getConsecutiveErrCount();
if (iErrCount > 10) {
refreshErrLoopCount = 3;
return;
}
if (bInRefresh) {
// Skip a Refresh call when being called from within refresh.
// This could happen on virtual tables where SetData calls us again, or
// if we ever introduce plugins to refresh.
if (bDebug)
debug("Calling Refresh from Refresh :) Skipping.");
return;
}
bInRefresh = true;
// See bIsUpToDate variable comments
if (bCellVisible && !bIsUpToDate) {
if (bDebug)
debug("Setting Invalid because visible & not up to date");
valid = false;
bIsUpToDate = true;
} else if (!bCellVisible && bIsUpToDate) {
bIsUpToDate = false;
}
try {
if (bDebug) {
debug("Cell Valid?" + valid + "; Visible?" + tableRow.isVisible() + "/" + bufferedTableItem.isShown());
}
int iInterval = tableColumn.getRefreshInterval();
if (iInterval == TableColumnCore.INTERVAL_INVALID_ONLY && !valid
&& !bMustRefresh && bSortValueIsText && sortValue != null
&& tableColumn.getType() == TableColumnCore.TYPE_TEXT_ONLY) {
if (bCellVisible) {
if (bDebug)
debug("fast refresh: setText");
setText((String)sortValue);
valid = true;
}
} else if ((iInterval == TableColumnCore.INTERVAL_LIVE ||
(iInterval == TableColumnCore.INTERVAL_GRAPHIC && bDoGraphics) ||
(iInterval > 0 && (loopFactor % iInterval) == 0) ||
!valid || bMustRefresh))
{
boolean bWasValid = isValid();
if (bDebug)
debug("invoke refresh");
long lTimeStart = SystemTime.getCurrentTime();
tableColumn.invokeCellRefreshListeners(this);
if (refreshListeners != null) {
for (int i = 0; i < refreshListeners.size(); i++) {
((TableCellRefreshListener)(refreshListeners.get(i))).refresh(this);
}
}
long lTimeEnd = SystemTime.getCurrentTime();
tableColumn.addRefreshTime(lTimeEnd - lTimeStart);
// Change to valid only if we weren't valid before the listener calls
// This is in case the listeners set valid to false when it was true
if (!bWasValid)
valid = true;
if (bMustRefresh)
bMustRefresh = false;
}
loopFactor++;
refreshErrLoopCount = 0;
if (iErrCount > 0)
tableColumn.setConsecutiveErrCount(0);
} catch (Throwable e) {
refreshErrLoopCount++;
tableColumn.setConsecutiveErrCount(++iErrCount);
pluginError(e);
if (refreshErrLoopCount > 2)
Logger.log(new LogEvent(LOGID, LogEvent.LT_ERROR,
"TableCell will not be refreshed anymore this session."));
} finally {
bInRefresh = false;
}
}
public void dispose() {
bDisposed = true;
tableColumn.invokeCellDisposeListeners(this);
if (disposeListeners != null) {
try {
for (Iterator iter = disposeListeners.iterator(); iter.hasNext();) {
TableCellDisposeListener listener = (TableCellDisposeListener)iter.next();
listener.dispose(this);
}
disposeListeners = null;
} catch (Throwable e) {
pluginError(e);
}
}
if (bufferedTableItem != null)
bufferedTableItem.dispose();
refreshListeners = null;
bufferedTableItem = null;
tableColumn = null;
tableRow = null;
sortValue = null;
}
public void setIcon(Image img) {
if (isInvisibleAndCanRefresh())
return;
bufferedTableItem.setIcon(img);
graphic = null;
}
public Image getIcon() {
return bufferedTableItem.getIcon();
}
public boolean needsPainting() {
return bufferedTableItem.needsPainting();
}
public void doPaint(GC gc) {
if ((!bIsUpToDate || !valid)
&& (refreshListeners != null || tableColumn.hasCellRefreshListener())) {
if (bDebug) {
debug("doPaint: invoke refresh");
}
refresh();
}
if (bDebug) {
debug("doPaint " + bIsUpToDate + ";" + valid + ";" + refreshListeners);
}
bufferedTableItem.doPaint(gc);
}
public void locationChanged() {
bufferedTableItem.locationChanged();
}
public TableRowCore getTableRowCore() {
return tableRow;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
return getText();
}
/* Comparable Implementation */
/** Compare our sortValue to the specified object. Assumes the object
* is TableCellImp (safe assumption)
*/
public int compareTo(Object o) {
try {
Comparable ourSortValue = getSortValue();
Comparable otherSortValue = ((TableCellImpl)o).getSortValue();
if (ourSortValue instanceof String && otherSortValue instanceof String) {
// Collator.getInstance cache's Collator object, so this is relatively
// fast. However, storing it as static somewhere might give a small
// performance boost. If such an approach is take, ensure that the static
// variable is updated the user chooses an different language.
Collator collator = Collator.getInstance(Locale.getDefault());
return collator.compare(ourSortValue, otherSortValue);
}
try {
return ourSortValue.compareTo(otherSortValue);
} catch (ClassCastException e) {
// It's possible that a row was created, but not refreshed yet.
// In that case, one sortValue will be String, and the other will be
// a comparable object that the plugin defined. Those two sortValues
// may not be compatable (for good reason!), so just skip it.
}
} catch (Exception e) {
System.out.println("Could not compare cells");
Debug.printStackTrace( e );
}
return 0;
}
public void invokeToolTipListeners(int type) {
if (tableColumn == null)
return;
tableColumn.invokeCellToolTipListeners(this, type);
if (tooltipListeners == null || tooltipErrLoopCount > 2)
return;
int iErrCount = tableColumn.getConsecutiveErrCount();
if (iErrCount > 10)
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);
}
tooltipErrLoopCount = 0;
} catch (Throwable e) {
tooltipErrLoopCount++;
tableColumn.setConsecutiveErrCount(++iErrCount);
pluginError(e);
if (tooltipErrLoopCount > 2)
Logger.log(new LogEvent(LOGID, LogEvent.LT_ERROR,
"TableCell's tooltip will not be refreshed anymore this session."));
}
}
public void invokeMouseListeners(TableCellMouseEvent event) {
if (cellMouseListeners == null)
return;
for (int i = 0; i < cellMouseListeners.size(); i++) {
try {
TableCellMouseListener l = (TableCellMouseListener) (cellMouseListeners
.get(i));
l.cellMouseTrigger(event);
} catch (Throwable e) {
Debug.printStackTrace(e);
}
}
}
public void invokeVisibilityListeners(int 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);
}
}
}
public static final Comparator TEXT_COMPARATOR = new TextComparator();
private static class TextComparator implements Comparator {
public int compare(Object arg0, Object arg1) {
return arg0.toString().compareToIgnoreCase(arg1.toString());
}
}
public void setUpToDate(boolean upToDate) {
bIsUpToDate = upToDate;
}
public boolean isUpToDate() {
return bIsUpToDate;
}
private void debug(final String s) {
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
System.out.println(SystemTime.getCurrentTime() + ": r"
+ tableRow.getIndex() + "c" + tableColumn.getPosition()
+ "r.v?" + ((tableRow.isVisible() ? "Y":"N"))
+ ";" + s);
}
}, true);
}
public Rectangle getBounds() {
Rectangle bounds = bufferedTableItem.getBounds();
if (bounds == null) {
return new Rectangle(0,0,0,0);
}
return bounds;
}
private void setOrientationViaColumn() {
if (!(bufferedTableItem instanceof BufferedGraphicTableItem))
return;
BufferedGraphicTableItem ti = (BufferedGraphicTableItem) bufferedTableItem;
int align = tableColumn.getAlignment();
if (align == TableColumn.ALIGN_CENTER)
ti.setOrientation(SWT.CENTER);
else if (align == TableColumn.ALIGN_LEAD)
ti.setOrientation(SWT.LEFT);
else if (align == TableColumn.ALIGN_TRAIL)
ti.setOrientation(SWT.RIGHT);
}
public String getObfusticatedText() {
if (tableColumn.isObfusticated()) {
if (tableColumn instanceof ObfusticateCellText) {
return ((ObfusticateCellText)tableColumn).getObfusticatedText(this);
}
return "";
}
return null;
}
public Image getBackgroundImage() {
return bufferedTableItem.getBackgroundImage();
}
public BufferedTableItem getBufferedTableItem() {
return bufferedTableItem;
}
public int getCursorID() {
return iCursorID;
}
public void setCursorID(int cursorID) {
iCursorID = cursorID;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -