/**
* Copyright (C) 2004-2007 Aelitis SAS, All rights Reserved
*
* Date: July 14, 2004
*
* 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 com.aelitis.azureus.ui.common.table.impl;
import java.util.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.ui.swt.views.table.utils.TableColumnManager;
import com.aelitis.azureus.ui.common.table.*;
import org.gudy.azureus2.plugins.ui.UIRuntimeException;
import org.gudy.azureus2.plugins.ui.tables.*;
import org.gudy.azureus2.pluginsimpl.local.ui.tables.TableContextMenuItemImpl;
/**
* Table Column definition and modification routines.
* Implements both the plugin API and the core API.
* <P>
* A column is defined in relation to a table. When one column is in
* multiple tables of different table ids, each table has it's own column
* instance
*
* @author TuxPaper
*
* @see org.gudy.azureus2.ui.swt.views.table.utils.TableColumnManager
*/
public class TableColumnImpl
implements TableColumnCore
{
private static final String CFG_SORTDIRECTION = "config.style.table.defaultSortOrder";
/** Internal Name/ID of the column **/
private String sName;
/** key of the displayed title for the column. If null, uses default calc */
private String sTitleLanguageKey = null;
private int iAlignment;
private int iType;
private int iPosition;
private int iWidth;
private int iInterval;
private long lLastSortValueChange;
/** Table the column belongs to */
private String sTableID;
private boolean bColumnAdded;
private boolean bCoreDataSource;
private ArrayList cellRefreshListeners;
private ArrayList cellAddedListeners;
private ArrayList cellDisposeListeners;
private ArrayList cellToolTipListeners;
private ArrayList cellMouseListeners;
private ArrayList cellMouseMoveListeners;
private ArrayList cellVisibilityListeners;
private int iConsecutiveErrCount;
private ArrayList menuItems;
private boolean bObfusticateData;
protected AEMonitor this_mon = new AEMonitor("TableColumn");
private boolean bSortValueLive;
private long lStatsRefreshTotalTime;
private long lStatsRefreshCount = 0;
private long lStatsRefreshZeroCount = 0;
private boolean bSortAscending;
private boolean editable;
private int iMinWidth = -1;
private int iMaxWidth = -1;
private boolean bVisible;
private boolean bMaxWidthAuto = false;
private boolean bWidthAuto;
private int iPreferredWidth;
private boolean bPreferredWidthAuto = true;
private int iPreferredWidthMax = -1;
private boolean auto_tooltip = false;
/** Create a column object for the specified table.
*
* @param tableID table in which the column belongs to
* @param columnID name/id of the column
*/
public TableColumnImpl(String tableID, String columnID) {
sTableID = tableID;
sName = columnID;
iType = TYPE_TEXT_ONLY;
iWidth = 50;
iAlignment = ALIGN_LEAD;
bColumnAdded = false;
bCoreDataSource = false;
iInterval = INTERVAL_INVALID_ONLY;
iConsecutiveErrCount = 0;
lLastSortValueChange = 0;
bVisible = false;
iMinWidth = 16;
iPosition = POSITION_INVISIBLE;
int iSortDirection = COConfigurationManager.getIntParameter(CFG_SORTDIRECTION);
bSortAscending = iSortDirection == 1 ? false : true;
}
public void initialize(int iAlignment, int iPosition, int iWidth,
int iInterval) {
if (bColumnAdded) {
throw (new UIRuntimeException("Can't set properties. Column '" + sName
+ " already added"));
}
this.iAlignment = iAlignment;
setPosition(iPosition);
this.iWidth = iWidth;
this.iMinWidth = 16;
this.iInterval = iInterval;
}
public void initialize(int iAlignment, int iPosition, int iWidth) {
if (bColumnAdded) {
throw (new UIRuntimeException("Can't set properties. Column '" + sName
+ " already added"));
}
this.iAlignment = iAlignment;
setPosition(iPosition);
this.iWidth = iWidth;
this.iMinWidth = 16;
}
public String getName() {
return sName;
}
public String getTableID() {
return sTableID;
}
public void setType(int type) {
if (bColumnAdded) {
throw (new UIRuntimeException("Can't set properties. Column '" + sName
+ " already added"));
}
iType = type;
}
public int getType() {
return iType;
}
public void setWidth(int width) {
if (width == iWidth || width < 0) {
return;
}
if (iMinWidth > 0 && width < iMinWidth) {
return;
}
if (iMaxWidth > 0 && width > iMaxWidth) {
if (width == iMaxWidth) {
return;
}
width = iMaxWidth;
}
if (iMinWidth < 0) {
iMinWidth = width;
}
// if (iPreferredWidth <= 0) {
// iPreferredWidth = iWidth;
// }
iWidth = width;
if (bColumnAdded && bVisible) {
triggerColumnSizeChange();
}
}
public void triggerColumnSizeChange() {
TableStructureEventDispatcher tsed = TableStructureEventDispatcher.getInstance(sTableID);
tsed.columnSizeChanged(this);
if (iType == TYPE_GRAPHIC) {
invalidateCells();
}
}
public int getWidth() {
return iWidth;
}
public void setPosition(int position) {
if (bColumnAdded) {
throw (new UIRuntimeException("Can't set properties. Column '" + sName
+ " already added"));
}
if (iPosition == POSITION_INVISIBLE && position != POSITION_INVISIBLE) {
setVisible(true);
}
iPosition = position;
if (position == POSITION_INVISIBLE) {
setVisible(false);
}
}
public int getPosition() {
return iPosition;
}
public void setAlignment(int alignment) {
if (bColumnAdded) {
throw (new UIRuntimeException("Can't set properties. Column '" + sName
+ " already added"));
}
iAlignment = alignment;
}
public int getAlignment() {
return iAlignment;
}
public void addCellRefreshListener(TableCellRefreshListener listener) {
try {
this_mon.enter();
if (cellRefreshListeners == null) {
cellRefreshListeners = new ArrayList(1);
}
cellRefreshListeners.add(listener);
//System.out.println(this + " :: addCellRefreshListener " + listener + ". " + cellRefreshListeners.size());
} finally {
this_mon.exit();
}
}
public List getCellRefreshListeners() {
try {
this_mon.enter();
if (cellRefreshListeners == null) {
return (new ArrayList(0));
}
return (new ArrayList(cellRefreshListeners));
} finally {
this_mon.exit();
}
}
public void removeCellRefreshListener(TableCellRefreshListener listener) {
try {
this_mon.enter();
if (cellRefreshListeners == null) {
return;
}
cellRefreshListeners.remove(listener);
} finally {
this_mon.exit();
}
}
public boolean hasCellRefreshListener() {
return cellRefreshListeners != null && cellRefreshListeners.size() > 0;
}
public void setRefreshInterval(int interval) {
iInterval = interval;
}
public int getRefreshInterval() {
return iInterval;
}
public void addCellAddedListener(TableCellAddedListener listener) {
try {
this_mon.enter();
if (cellAddedListeners == null) {
cellAddedListeners = new ArrayList(1);
}
cellAddedListeners.add(listener);
} finally {
this_mon.exit();
}
}
public List getCellAddedListeners() {
try {
this_mon.enter();
if (cellAddedListeners == null) {
return (new ArrayList(0));
}
return (new ArrayList(cellAddedListeners));
} finally {
this_mon.exit();
}
}
public void removeCellAddedListener(TableCellAddedListener listener) {
try {
this_mon.enter();
if (cellAddedListeners == null) {
return;
}
cellAddedListeners.remove(listener);
} finally {
this_mon.exit();
}
}
public void addCellDisposeListener(TableCellDisposeListener listener) {
try {
this_mon.enter();
if (cellDisposeListeners == null) {
cellDisposeListeners = new ArrayList(1);
}
cellDisposeListeners.add(listener);
} finally {
this_mon.exit();
}
}
public void removeCellDisposeListener(TableCellDisposeListener listener) {
try {
this_mon.enter();
if (cellDisposeListeners == null) {
return;
}
cellDisposeListeners.remove(listener);
} finally {
this_mon.exit();
}
}
public void addCellToolTipListener(TableCellToolTipListener listener) {
try {
this_mon.enter();
if (cellToolTipListeners == null) {
cellToolTipListeners = new ArrayList(1);
}
cellToolTipListeners.add(listener);
} finally {
this_mon.exit();
}
}
public void removeCellToolTipListener(TableCellToolTipListener listener) {
try {
this_mon.enter();
if (cellToolTipListeners == null) {
return;
}
cellToolTipListeners.remove(listener);
} finally {
this_mon.exit();
}
}
public void addCellMouseListener(TableCellMouseListener listener) {
try {
this_mon.enter();
if (cellMouseListeners == null) {
cellMouseListeners = new ArrayList(1);
}
cellMouseListeners.add(listener);
} finally {
this_mon.exit();
}
}
public void removeCellMouseListener(TableCellMouseListener listener) {
try {
this_mon.enter();
if (cellMouseListeners == null) {
return;
}
cellMouseListeners.remove(listener);
} finally {
this_mon.exit();
}
}
public boolean hasCellMouseMoveListener() {
return cellMouseMoveListeners != null && cellMouseMoveListeners.size() > 0;
}
public void addCellMouseMoveListener(TableCellMouseMoveListener listener) {
try {
this_mon.enter();
if (cellMouseMoveListeners == null) {
cellMouseMoveListeners = new ArrayList(1);
}
cellMouseMoveListeners.add(listener);
} finally {
this_mon.exit();
}
}
public void removeCellMouseMoveListener(TableCellMouseMoveListener listener) {
try {
this_mon.enter();
if (cellMouseMoveListeners == null) {
return;
}
cellMouseMoveListeners.remove(listener);
} finally {
this_mon.exit();
}
}
public void addCellVisibilityListener(TableCellVisibilityListener listener) {
try {
this_mon.enter();
if (cellVisibilityListeners == null) {
cellVisibilityListeners = new ArrayList(1);
}
cellVisibilityListeners.add(listener);
} finally {
this_mon.exit();
}
}
public void removeCellVisibilityListener(TableCellVisibilityListener listener) {
try {
this_mon.enter();
if (cellVisibilityListeners == null) {
return;
}
cellVisibilityListeners.remove(listener);
} finally {
this_mon.exit();
}
}
public void invalidateCells() {
TableStructureEventDispatcher tsed = TableStructureEventDispatcher.getInstance(sTableID);
tsed.columnInvalidate(this);
}
public void invalidateCell(Object data_source) {
TableStructureEventDispatcher tsed = TableStructureEventDispatcher.getInstance(sTableID);
tsed.cellInvalidate(this, data_source);
}
public void addListeners(Object listenerObject) {
if (listenerObject instanceof TableCellDisposeListener) {
addCellDisposeListener((TableCellDisposeListener) listenerObject);
}
if (listenerObject instanceof TableCellRefreshListener) {
addCellRefreshListener((TableCellRefreshListener) listenerObject);
}
if (listenerObject instanceof TableCellToolTipListener) {
addCellToolTipListener((TableCellToolTipListener) listenerObject);
}
if (listenerObject instanceof TableCellAddedListener) {
addCellAddedListener((TableCellAddedListener) listenerObject);
}
if (listenerObject instanceof TableCellMouseMoveListener) {
addCellMouseMoveListener((TableCellMouseMoveListener) listenerObject);
}
if (listenerObject instanceof TableCellMouseListener) {
addCellMouseListener((TableCellMouseListener) listenerObject);
}
if (listenerObject instanceof TableCellVisibilityListener) {
addCellVisibilityListener((TableCellVisibilityListener) listenerObject);
}
}
/* Start of not plugin public API functions */
//////////////////////////////////////////////
public void setColumnAdded(boolean bAdded) {
bColumnAdded = bAdded;
}
public boolean getColumnAdded() {
return bColumnAdded;
}
public void setUseCoreDataSource(boolean bCoreDataSource) {
this.bCoreDataSource = bCoreDataSource;
}
public boolean getUseCoreDataSource() {
return bCoreDataSource;
}
public void invokeCellRefreshListeners(TableCell cell, boolean fastRefresh) throws Throwable {
//System.out.println(this + " :: invokeCellRefreshListeners" + cellRefreshListeners);
if (cellRefreshListeners == null) {
return;
}
Throwable firstError = null;
//System.out.println(this + " :: invokeCellRefreshListeners" + cellRefreshListeners.size());
for (int i = 0; i < cellRefreshListeners.size(); i++) {
TableCellRefreshListener l = (TableCellRefreshListener)cellRefreshListeners.get(i);
try {
if(l instanceof TableCellLightRefreshListener)
((TableCellLightRefreshListener)l).refresh(cell, fastRefresh);
else
l.refresh(cell);
} catch (Throwable e) {
if (firstError == null) {
firstError = e;
}
Debug.printStackTrace(e);
}
}
if (firstError != null) {
throw firstError;
}
}
public void invokeCellAddedListeners(TableCell cell) {
if (cellAddedListeners == null) {
return;
}
for (int i = 0; i < cellAddedListeners.size(); i++) {
try {
((TableCellAddedListener) (cellAddedListeners.get(i))).cellAdded(cell);
} catch (Throwable e) {
Debug.printStackTrace(e);
}
}
}
public void invokeCellDisposeListeners(TableCell cell) {
if (cellDisposeListeners == null) {
return;
}
for (int i = 0; i < cellDisposeListeners.size(); i++) {
try {
((TableCellDisposeListener) (cellDisposeListeners.get(i))).dispose(cell);
} catch (Throwable e) {
Debug.printStackTrace(e);
}
}
}
public void invokeCellToolTipListeners(TableCellCore cell, int type) {
if (cellToolTipListeners == null) {
return;
}
if (type == TableCellCore.TOOLTIPLISTENER_HOVER) {
for (int i = 0; i < cellToolTipListeners.size(); i++) {
try {
((TableCellToolTipListener) (cellToolTipListeners.get(i))).cellHover(cell);
} catch (Throwable e) {
Debug.printStackTrace(e);
}
}
} else {
for (int i = 0; i < cellToolTipListeners.size(); i++) {
try {
((TableCellToolTipListener) (cellToolTipListeners.get(i))).cellHoverComplete(cell);
} catch (Throwable e) {
Debug.printStackTrace(e);
}
}
}
}
public void invokeCellMouseListeners(TableCellMouseEvent event) {
ArrayList listeners = event.eventType == TableCellMouseEvent.EVENT_MOUSEMOVE
? cellMouseMoveListeners : this.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);
}
}
}
public void invokeCellVisibilityListeners(TableCellCore cell, int visibility) {
if (cellVisibilityListeners == null) {
return;
}
for (int i = 0; i < cellVisibilityListeners.size(); i++) {
try {
TableCellVisibilityListener l = (TableCellVisibilityListener) (cellVisibilityListeners.get(i));
l.cellVisibilityChanged(cell, visibility);
} catch (Throwable e) {
Debug.printStackTrace(e);
}
}
}
public void setPositionNoShift(int position) {
//if (iPosition < 0 && position >= 0) {
// setVisible(true);
//}
iPosition = position;
//if (position < 0) {
// setVisible(false);
//}
}
public void loadSettings(Map mapSettings) {
// Format: Key = [TableID].column.[columnname]
// Value[] = { visible, width, position, autotooltip, sortorder }
String itemPrefix = "Column." + sName;
String oldItemPrefix = "Table." + sTableID + "." + sName;
Object object = mapSettings.get(itemPrefix);
Object[] list;
if (object instanceof List) {
list = ((List) object).toArray();
} else {
list = new String[0];
}
int pos = 0;
if (list.length >= (pos + 1) && (list[pos] instanceof Number)) {
boolean vis = ((Number) list[pos]).intValue() == 1;
setVisible(vis);
}
pos++;
if (list.length >= (pos + 1) && (list[pos] instanceof Number)) {
int position = ((Number) list[pos]).intValue();
setPositionNoShift(position);
} else {
int position = COConfigurationManager.getIntParameter(oldItemPrefix + ".position",
iPosition);
if (iPosition == POSITION_INVISIBLE && position != POSITION_INVISIBLE) {
setVisible(true);
}
setPositionNoShift(position);
if (position == POSITION_INVISIBLE) {
setVisible(false);
}
}
pos++;
if (list.length >= (pos + 1) && (list[pos] instanceof Number)) {
int width = ((Number) list[pos]).intValue();
setWidth(width);
} else {
setWidth(COConfigurationManager.getIntParameter(oldItemPrefix + ".width",
iWidth));
}
pos++;
if (list.length >= (pos + 1) && (list[pos] instanceof Number)) {
boolean autoTooltip = ((Number) list[pos]).intValue() == 1;
setAutoTooltip(autoTooltip);
} else {
setAutoTooltip(COConfigurationManager.getBooleanParameter(oldItemPrefix
+ ".auto_tooltip", auto_tooltip));
}
pos++;
if (list.length >= (pos + 1) && (list[pos] instanceof Number)) {
int sortOrder = ((Number) list[pos]).intValue();
if (sortOrder >= 0) {
// dont call setSordOrder, since it will change lLastSortValueChange
// which we shouldn't do if we aren't the sorting column
bSortAscending = sortOrder == 1;
}
}
}
public void saveSettings(Map mapSettings) {
if (mapSettings == null) {
mapSettings = TableColumnManager.getInstance().getTableConfigMap(sTableID);
if (mapSettings == null) {
return;
}
}
String sItemPrefix = "Column." + sName;
mapSettings.put(sItemPrefix, Arrays.asList(new Object[] {
new Integer(bVisible ? 1 : 0),
new Integer(iPosition),
new Integer(iWidth),
new Integer(auto_tooltip ? 1 : 0),
new Integer(lLastSortValueChange == 0 ? -1 : (bSortAscending ? 1 : 0)),
}));
// cleanup old config
sItemPrefix = "Table." + sTableID + "." + sName;
if (COConfigurationManager.hasParameter(sItemPrefix + ".width", true)) {
COConfigurationManager.removeParameter(sItemPrefix + ".position");
COConfigurationManager.removeParameter(sItemPrefix + ".width");
COConfigurationManager.removeParameter(sItemPrefix + ".auto_tooltip");
}
}
public String getTitleLanguageKey() {
try {
this_mon.enter();
if (sTitleLanguageKey == null) {
sTitleLanguageKey = sTableID + ".column." + sName;
if (MessageText.keyExists(sTitleLanguageKey)) {
return sTitleLanguageKey;
}
String sKeyPrefix;
// Try a generic one of "TableColumn." + columnid
sKeyPrefix = "TableColumn.header.";
if (MessageText.keyExists(sKeyPrefix + sName)) {
sTitleLanguageKey = sKeyPrefix + sName;
return sTitleLanguageKey;
}
// Support "Old Style" language keys, which have a prefix of TableID + "View."
// Also, "MySeeders" is actually stored in "MyTorrents"..
sKeyPrefix = (sTableID.equals(TableManager.TABLE_MYTORRENTS_COMPLETE)
? TableManager.TABLE_MYTORRENTS_INCOMPLETE : sTableID)
+ "View.";
if (MessageText.keyExists(sKeyPrefix + sName)) {
sTitleLanguageKey = sKeyPrefix + sName;
return sTitleLanguageKey;
}
// The "all peers" view should just share the same peer columns, so reuse them.
if (sTableID.equals(TableManager.TABLE_ALL_PEERS)) {
sKeyPrefix = TableManager.TABLE_TORRENT_PEERS + ".column.";
if (MessageText.keyExists(sKeyPrefix + sName)) {
sTitleLanguageKey = sKeyPrefix + sName;
return sTitleLanguageKey;
}
// Or try "PeersView".
sKeyPrefix = "PeersView.";
if (MessageText.keyExists(sKeyPrefix + sName)) {
sTitleLanguageKey = sKeyPrefix + sName;
return sTitleLanguageKey;
}
}
// another "Old Style"
sKeyPrefix = "MyTorrentsView." + sName;
//System.out.println(sKeyPrefix + ";" + MessageText.getString(sKeyPrefix));
if (MessageText.keyExists(sKeyPrefix)) {
sTitleLanguageKey = sKeyPrefix;
return sTitleLanguageKey;
}
}
return sTitleLanguageKey;
} finally {
this_mon.exit();
}
}
public int getConsecutiveErrCount() {
return iConsecutiveErrCount;
}
public void setConsecutiveErrCount(int iCount) {
iConsecutiveErrCount = iCount;
}
public void removeContextMenuItem(TableContextMenuItem menuItem) {
if (menuItems == null) {
return;
}
menuItems.remove(menuItem);
}
public TableContextMenuItem addContextMenuItem(String key) {
if (menuItems == null) {
menuItems = new ArrayList();
}
// Hack.. should be using our own implementation..
TableContextMenuItemImpl item = new TableContextMenuItemImpl("", key);
menuItems.add(item);
return item;
}
public TableContextMenuItem[] getContextMenuItems() {
if (menuItems == null) {
return new TableContextMenuItem[0];
}
return (TableContextMenuItem[]) menuItems.toArray(new TableContextMenuItem[0]);
}
public boolean isObfusticated() {
return bObfusticateData;
}
public void setObfustication(boolean hideData) {
bObfusticateData = hideData;
}
public long getLastSortValueChange() {
if (bSortValueLive) {
return SystemTime.getCurrentTime();
}
return lLastSortValueChange;
}
public void setLastSortValueChange(long lastSortValueChange) {
lLastSortValueChange = lastSortValueChange;
}
public boolean isSortValueLive() {
return bSortValueLive;
}
public void setSortValueLive(boolean live) {
// if (live && !bSortValueLive) {
// System.out.println("Setting " + sTableID + ": " + sName + " to live sort value");
// }
bSortValueLive = live;
}
public void addRefreshTime(long ms) {
if (ms == 0) {
lStatsRefreshZeroCount++;
} else {
lStatsRefreshTotalTime += ms;
lStatsRefreshCount++;
}
}
public void generateDiagnostics(IndentWriter writer) {
writer.println("Column " + sTableID + ":" + sName
+ (bSortValueLive ? " (Live Sort)" : ""));
try {
writer.indent();
if (lStatsRefreshCount > 0) {
writer.println("Avg refresh time (" + lStatsRefreshCount
+ " samples): " + (lStatsRefreshTotalTime / lStatsRefreshCount)
+ " (" + lStatsRefreshZeroCount
+ " zero ms refreshes not included)");
}
writer.println("Listeners: refresh="
+ getListCountString(cellRefreshListeners) + "; dispose="
+ getListCountString(cellDisposeListeners) + "; mouse="
+ getListCountString(cellMouseListeners) + "; mm="
+ getListCountString(cellMouseMoveListeners) + "; vis="
+ getListCountString(cellVisibilityListeners) + "; added="
+ getListCountString(cellAddedListeners) + "; tooltip="
+ getListCountString(cellToolTipListeners));
writer.println("lLastSortValueChange=" + lLastSortValueChange);
} catch (Exception e) {
} finally {
writer.exdent();
}
}
private String getListCountString(List l) {
if (l == null) {
return "-0";
}
return "" + l.size();
}
public void setTableID(String tableID) {
sTableID = tableID;
}
// @see java.util.Comparator#compare(T, T)
public int compare(Object arg0, Object arg1) {
TableCellCore cell0 = ((TableRowCore) arg0).getTableCellCore(sName);
TableCellCore cell1 = ((TableRowCore) arg1).getTableCellCore(sName);
Comparable c0 = (cell0 == null) ? "" : cell0.getSortValue();
Comparable c1 = (cell1 == null) ? "" : cell1.getSortValue();
try {
boolean c0isString = c0 instanceof String;
boolean c1isString = c1 instanceof String;
if (c0isString && c1isString) {
if (bSortAscending) {
return ((String) c0).compareToIgnoreCase((String) c1);
}
return ((String) c1).compareToIgnoreCase((String) c0);
}
int val;
if (c1 == null) {
if (c0 == null) {
return 0;
}
// always place nulls at bottom
return -1;
} else if (c0 == null) {
// always place nulls at bottom
return 1;
} else if (c0isString && !c1isString) {
val = -1;
} else if (c1isString && !c0isString) {
val = 1;
} else {
val = c1.compareTo(c0);
}
return bSortAscending ? -val : val;
} catch (ClassCastException e) {
System.err.println("Can't compare " + c0.getClass().getName() + "("
+ c0.toString() + ") from row #" + cell0.getTableRowCore().getIndex()
+ " to " + c1.getClass().getName() + "(" + c1.toString()
+ ") from row #" + cell1.getTableRowCore().getIndex()
+ " while sorting column " + sName);
e.printStackTrace();
return 0;
}
}
/**
* @param bAscending The bAscending to set.
*/
public void setSortAscending(boolean bAscending) {
if (this.bSortAscending == bAscending) {
return;
}
setLastSortValueChange(SystemTime.getCurrentTime());
this.bSortAscending = bAscending;
}
/**
* @return Returns the bAscending.
*/
public boolean isSortAscending() {
return bSortAscending;
}
// @see org.gudy.azureus2.plugins.ui.tables.TableColumn#getMinWidth()
public int getMinWidth() {
if (iMinWidth < 0) {
return iWidth;
}
return iMinWidth;
}
// @see org.gudy.azureus2.plugins.ui.tables.TableColumn#setMinWidth(int)
public void setMinWidth(int minwidth) {
if (minwidth > iMaxWidth && iMaxWidth >= 0) {
iMaxWidth = minwidth;
}
if (iPreferredWidth > 0 && iPreferredWidth < minwidth) {
iPreferredWidth = minwidth;
}
iMinWidth = minwidth;
if (iWidth < minwidth) {
setWidth(minwidth);
}
}
// @see org.gudy.azureus2.plugins.ui.tables.TableColumn#getMaxWidth()
public int getMaxWidth() {
return iMaxWidth;
}
// @see org.gudy.azureus2.plugins.ui.tables.TableColumn#setMaxWidth(int)
public void setMaxWidth(int maxwidth) {
if (maxwidth >= 0 && maxwidth < iMinWidth) {
iMinWidth = maxwidth;
}
if (iPreferredWidth > maxwidth) {
iPreferredWidth = maxwidth;
}
iMaxWidth = maxwidth;
if (maxwidth >= 0 && iWidth > iMaxWidth) {
setWidth(maxwidth);
}
}
// @see org.gudy.azureus2.plugins.ui.tables.TableColumn#setWidthLimits(int, int)
public void setWidthLimits(int min, int max) {
setMinWidth(min);
setMaxWidth(max);
}
// @see org.gudy.azureus2.plugins.ui.tables.TableColumn#isVisible()
public boolean isVisible() {
return bVisible;
}
// @see org.gudy.azureus2.plugins.ui.tables.TableColumn#setVisible(boolean)
public void setVisible(boolean visible) {
if (bVisible == visible) {
return;
}
//System.out.println("set " + sTableID + "/" + sName + " to " + visible
// + " via " + Debug.getCompressedStackTrace());
bVisible = visible;
invalidateCells();
}
// @see org.gudy.azureus2.plugins.ui.tables.TableColumn#isMaxWidthAuto()
public boolean isMaxWidthAuto() {
return bMaxWidthAuto;
}
// @see org.gudy.azureus2.plugins.ui.tables.TableColumn#setMaxWidthAuto(boolean)
public void setMaxWidthAuto(boolean automaxwidth) {
bMaxWidthAuto = automaxwidth;
}
// @see org.gudy.azureus2.plugins.ui.tables.TableColumn#isMinWidthAuto()
public boolean isMinWidthAuto() {
return bWidthAuto;
}
// @see org.gudy.azureus2.plugins.ui.tables.TableColumn#setMinWidthAuto(boolean)
public void setMinWidthAuto(boolean autominwidth) {
bWidthAuto = autominwidth;
}
// @see org.gudy.azureus2.plugins.ui.tables.TableColumn#getPreferredWidth()
public int getPreferredWidth() {
return iPreferredWidth;
}
// @see org.gudy.azureus2.plugins.ui.tables.TableColumn#setPreferredWidthAuto(boolean)
public void setPreferredWidthAuto(boolean auto) {
bPreferredWidthAuto = auto;
}
// @see org.gudy.azureus2.plugins.ui.tables.TableColumn#isPreferredWidthAuto()
public boolean isPreferredWidthAuto() {
return bPreferredWidthAuto;
}
public void setPreferredWidthMax(int maxprefwidth) {
iPreferredWidthMax = maxprefwidth;
if (iPreferredWidth > iPreferredWidthMax) {
setPreferredWidth(maxprefwidth);
}
}
public int getPreferredWidthMax() {
return iPreferredWidthMax;
}
// @see org.gudy.azureus2.plugins.ui.tables.TableColumn#setPreferredWidth(int)
public void setPreferredWidth(int width) {
if (iPreferredWidthMax > 0 && width > iPreferredWidthMax) {
width = iPreferredWidthMax;
}
if (width < iMinWidth) {
iPreferredWidth = iMinWidth;
} else if (iMaxWidth > 0 && width > iMaxWidth) {
iPreferredWidth = iMaxWidth;
} else {
iPreferredWidth = width;
}
if (bColumnAdded && bVisible) {
triggerColumnSizeChange();
}
}
public void setAutoTooltip(boolean auto_tooltip) {
this.auto_tooltip = auto_tooltip;
}
public boolean doesAutoTooltip() {
return this.auto_tooltip;
}
public boolean isInplaceEdit() {
return editable;
}
public void setInplaceEdit(boolean editable) {
this.editable = editable;
}
public boolean inplaceValueSet(TableCell cell, String value, boolean finalEdit) {
return false;
}
}