📄 tablecellimpl.java
字号:
/*
* File : TableCellImpl.java
* Created : 24 nov. 2003
* By : Olivier
* Originally PluginItem.java, and changed to be more generic.
*
* Copyright (C) 2004, 2005, 2006 Aelitis SAS, 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.
*
* 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
*
* AELITIS, SAS au capital de 46,603.30 euros,
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*/
package org.gudy.azureus2.ui.swt.views.table.impl;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Locale;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.config.ParameterListener;
import org.gudy.azureus2.core3.logging.*;
import org.gudy.azureus2.core3.util.AEMonitor;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.plugins.ui.Graphic;
import org.gudy.azureus2.plugins.ui.UIRuntimeException;
import org.gudy.azureus2.plugins.ui.SWT.GraphicSWT;
import org.gudy.azureus2.plugins.ui.tables.*;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.components.BufferedGraphicTableItem;
import org.gudy.azureus2.ui.swt.components.BufferedGraphicTableItem1;
import org.gudy.azureus2.ui.swt.components.BufferedGraphicTableItem2;
import org.gudy.azureus2.ui.swt.components.BufferedTableItem;
import org.gudy.azureus2.ui.swt.components.BufferedTableRow;
import org.gudy.azureus2.ui.swt.plugins.UISWTGraphic;
import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTGraphicImpl;
import org.gudy.azureus2.ui.swt.views.table.TableCellCore;
import org.gudy.azureus2.ui.swt.views.table.TableColumnCore;
import org.gudy.azureus2.ui.swt.views.table.TableRowCore;
/** TableCellImpl represents one cell in the table.
* Table access is provided by BufferedTableItem.
* TableCellImpl is stored in and accessed by TableRowCore.
* Drawing control gets passed to listeners.
*
* For plugins, this object is the implementation to TableCell.
*
* This object is needed to split core code from plugin code.
*/
public class TableCellImpl
implements TableCellCore
{
private static final LogIDs LOGID = LogIDs.GUI;
private TableRowCore tableRow;
private Comparable sortValue;
private boolean bSortValueIsText = true;
private BufferedTableItem bufferedTableItem;
private ArrayList refreshListeners;
private ArrayList disposeListeners;
private ArrayList tooltipListeners;
private ArrayList cellMouseListeners;
private TableColumnCore tableColumn;
private boolean valid;
private int refreshErrLoopCount;
private int tooltipErrLoopCount;
private int loopFactor;
private Object oToolTip;
/**
* For refreshing, this flag manages whether the row is actually up to date.
*
* We don't update any visuals while the row isn't visible. But, validility
* does get set to true so that the cell isn't forced to refresh every
* cycle when not visible. (We can't just never call refresh when the row
* is not visible, as refresh also sets the sort value)
*
* When the row does become visible, we have to invalidate the row so
* that the row will set its visuals again (this time, actually
* updating a viewable object).
*/
private boolean bIsUpToDate = true;
private boolean bDisposed = false;
private boolean bMustRefresh = false;
public boolean bDebug = false;
private AEMonitor this_mon = new AEMonitor( "TableCell" );
private static final String CFG_PAINT = "GUI_SWT_bAlternateTablePainting";
private static boolean bAlternateTablePainting;
static {
COConfigurationManager.addAndFireParameterListener(CFG_PAINT,
new ParameterListener() {
public void parameterChanged(String parameterName) {
bAlternateTablePainting = COConfigurationManager
.getBooleanParameter(CFG_PAINT);
}
});
}
/**
* Initialize
*
* @param _tableRow
* @param _tableColumn
* @param position
*/
public TableCellImpl(TableRowCore _tableRow, TableColumnCore _tableColumn,
int position) {
this.tableColumn = _tableColumn;
this.tableRow = _tableRow;
valid = false;
refreshErrLoopCount = 0;
tooltipErrLoopCount = 0;
loopFactor = 0;
BufferedTableRow bufRow = (BufferedTableRow)tableRow;
if (tableColumn.getType() == TableColumnCore.TYPE_GRAPHIC) {
if (bAlternateTablePainting) {
bufferedTableItem = new BufferedGraphicTableItem2(bufRow, position) {
public void refresh() {
TableCellImpl.this.refresh();
}
public void invalidate() {
TableCellImpl.this.valid = false;
}
};
} else {
bufferedTableItem = new BufferedGraphicTableItem1(bufRow, position) {
public void refresh() {
TableCellImpl.this.refresh();
}
public void invalidate() {
TableCellImpl.this.valid = false;
}
};
}
setOrientationViaColumn();
} else {
bufferedTableItem = new BufferedTableItem(bufRow, position) {
public void refresh() {
TableCellImpl.this.refresh();
}
public void invalidate() {
TableCellImpl.this.valid = false;
}
};
}
tableColumn.invokeCellAddedListeners(this);
//bDebug = (position == 1) && tableColumn.getTableID().equalsIgnoreCase("Peers");
}
private void pluginError(Throwable e) {
String sPosition = (bufferedTableItem == null)
? "null"
: "" + bufferedTableItem.getPosition() +
" (" + bufferedTableItem.getColumnName() + ")";
Logger.log(new LogEvent(LOGID, "Table Cell Plugin for Column #" + sPosition
+ " generated an exception ", e));
}
private void checkCellForSetting() {
if (isDisposed())
throw new UIRuntimeException("Table Cell is disposed.");
}
/* Public API */
////////////////
public Object getDataSource() {
return tableRow.getDataSource(tableColumn.getUseCoreDataSource());
}
public TableColumn getTableColumn() {
return tableColumn;
}
public TableRow getTableRow() {
return tableRow;
}
public String getTableID() {
return tableRow.getTableID();
}
public boolean isValid() {
return valid;
}
public boolean setForeground(Color color) {
checkCellForSetting();
// Don't need to set when not visible
if (!tableRow.isVisible())
return false;
return bufferedTableItem.setItemForeground(color);
}
public boolean setForeground(int red, int green, int blue) {
checkCellForSetting();
// Don't need to set when not visible
if (!tableRow.isVisible())
return false;
return bufferedTableItem.setItemForeground(red, green, blue);
}
public boolean setText(String text) {
checkCellForSetting();
if (text == null)
text = "";
boolean bChanged = false;
if (bSortValueIsText && !text.equals(sortValue)) {
bChanged = true;
sortValue = text;
if (bDebug)
debug("Setting SortValue to text;");
}
if (!tableRow.isVisible())
return false;
if (bufferedTableItem.setText(text) && !bSortValueIsText)
bChanged = true;
return bChanged;
}
public String getText() {
if (bSortValueIsText && sortValue instanceof String)
return (String)sortValue;
return bufferedTableItem.getText();
}
public boolean isShown() {
return bufferedTableItem.isShown();
}
public boolean setSortValue(Comparable valueToSort) {
checkCellForSetting();
if (sortValue == valueToSort)
return false;
if (bSortValueIsText) {
bSortValueIsText = false;
if (sortValue instanceof String)
// Make sure text is actually in the cell (it may not have been if
// cell wasn't created at the time of setting)
setText((String)sortValue);
}
if (bDebug)
debug("Setting SortValue to "
+ ((valueToSort == null) ? "null" : valueToSort.getClass().getName()));
sortValue = valueToSort;
return true;
}
public boolean setSortValue(long valueToSort) {
checkCellForSetting();
if ((sortValue instanceof Long)
&& ((Long) sortValue).longValue() == valueToSort)
return false;
return setSortValue(new Long(valueToSort));
}
public boolean setSortValue( float valueToSort ) {
checkCellForSetting();
if (sortValue instanceof Float
&& ((Float) sortValue).floatValue() == valueToSort)
return false;
return setSortValue(new Float(valueToSort));
}
public Comparable getSortValue() {
if (bDebug)
debug("GetSortValue;"
+ (sortValue == null ? "null" : sortValue.getClass().getName() + ";"
+ sortValue.toString()));
if (sortValue == null) {
if (bufferedTableItem != null)
return bufferedTableItem.getText();
return "";
}
return sortValue;
}
public void setToolTip(Object tooltip) {
oToolTip = tooltip;
}
public Object getToolTip() {
return oToolTip;
}
public boolean isDisposed() {
return bDisposed;
}
/* Start TYPE_GRAPHIC Functions */
public Point getSize() {
if (!(bufferedTableItem instanceof BufferedGraphicTableItem))
return null;
return ((BufferedGraphicTableItem)bufferedTableItem).getSize();
}
public int getWidth() {
if (!(bufferedTableItem instanceof BufferedGraphicTableItem))
return -1;
Point pt = ((BufferedGraphicTableItem)bufferedTableItem).getSize();
if (pt == null)
return -1;
return pt.x;
}
public int getHeight() {
if (!(bufferedTableItem instanceof BufferedGraphicTableItem))
return -1;
Point pt = ((BufferedGraphicTableItem)bufferedTableItem).getSize();
if (pt == null)
return -1;
return pt.y;
}
public boolean setGraphic(Image img) {
checkCellForSetting();
if (!(bufferedTableItem instanceof BufferedGraphicTableItem))
return false;
return ((BufferedGraphicTableItem)bufferedTableItem).setGraphic(img);
}
public boolean setGraphic(Graphic img) {
checkCellForSetting();
if (!(bufferedTableItem instanceof BufferedGraphicTableItem))
return false;
if (img == null)
return ((BufferedGraphicTableItem)bufferedTableItem).setGraphic(null);
if (img instanceof GraphicSWT){
Image imgSWT = ((GraphicSWT)img).getImage();
return ((BufferedGraphicTableItem)bufferedTableItem).setGraphic(imgSWT);
}
if (img instanceof UISWTGraphic){
Image imgSWT = ((UISWTGraphic)img).getImage();
return ((BufferedGraphicTableItem)bufferedTableItem).setGraphic(imgSWT);
}
return( false );
}
public Graphic getGraphic() {
if (!(bufferedTableItem instanceof BufferedGraphicTableItem))
return null;
Image img = ((BufferedGraphicTableItem)bufferedTableItem).getGraphic();
return new UISWTGraphicImpl(img);
}
public Image getGraphicSWT() {
if (!(bufferedTableItem instanceof BufferedGraphicTableItem))
return null;
return ((BufferedGraphicTableItem)bufferedTableItem).getGraphic();
}
public void setFillCell(boolean bFillCell) {
checkCellForSetting();
if (!(bufferedTableItem instanceof BufferedGraphicTableItem))
return;
if (bFillCell)
((BufferedGraphicTableItem)bufferedTableItem).orientation = SWT.FILL;
else
setOrientationViaColumn();
}
public void setMarginHeight(int height) {
checkCellForSetting();
if (!(bufferedTableItem instanceof BufferedGraphicTableItem))
return;
((BufferedGraphicTableItem)bufferedTableItem).marginHeight = height;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -