customtabletreeviewer.java
来自「SANCHO」· Java 代码 · 共 473 行
JAVA
473 行
/* * Copyright (C) 2004-2005 Rutger M. Ovidius for use with the sancho project. * See LICENSE.txt for license information. */package sancho.view.viewer;import java.util.Hashtable;import java.util.Iterator;import org.eclipse.jface.viewers.IBaseLabelProvider;import org.eclipse.jface.viewers.IColorProvider;import org.eclipse.jface.viewers.IFontProvider;import org.eclipse.jface.viewers.ILabelProvider;import org.eclipse.jface.viewers.ISelection;import org.eclipse.jface.viewers.ITableLabelProvider;import org.eclipse.jface.viewers.TableTreeViewer;import org.eclipse.swt.SWT;import org.eclipse.swt.custom.TableTreeItem;import org.eclipse.swt.events.KeyAdapter;import org.eclipse.swt.events.KeyEvent;import org.eclipse.swt.graphics.Color;import org.eclipse.swt.graphics.Font;import org.eclipse.swt.graphics.Image;import org.eclipse.swt.graphics.Point;import org.eclipse.swt.graphics.RGB;import org.eclipse.swt.widgets.Composite;import org.eclipse.swt.widgets.Item;import org.eclipse.swt.widgets.Table;import org.eclipse.swt.widgets.TableColumn;import org.eclipse.swt.widgets.Widget;import sancho.model.mldonkey.Client;import sancho.model.mldonkey.File;import sancho.view.preferences.PreferenceLoader;import sancho.view.transfer.CTableTreeEditor;import sancho.view.transfer.ChunkCanvas;import sancho.view.transfer.FileClient;import sancho.view.utility.IDSelector;import sancho.view.utility.SResources;public class CustomTableTreeViewer extends TableTreeViewer implements ICustomViewer { private Hashtable tableTreeEditors = new Hashtable(); private boolean activeEditors = false; private int chunksColumn = -1; private int[] columnIDs; private static Color alternateColor; private static Color tableBGColor; public static Color sortedBGColor; private static boolean alternateColors; public static boolean hilightSorted; private boolean adjustFonts = SWT.getPlatform().equals("win32") || SWT.getPlatform().equals("gtk") || SWT.getPlatform().equals("motif"); // make public for retarded gtk public void updateSelection(ISelection selection) { super.updateSelection(selection); } public void updateDisplay() { alternateColor = PreferenceLoader.loadColor("tableAlternateBGColor"); alternateColors = PreferenceLoader.loadBoolean("tableAlternateBGColors"); tableBGColor = PreferenceLoader.loadColor("tablesBackgroundColor"); boolean newHigh = PreferenceLoader.loadBoolean("tableHilightSorted"); sortedBGColor = PreferenceLoader.loadColor("tableSortedColumnBGColor"); if (!newHigh && hilightSorted) resetSelColumn(); hilightSorted = newHigh; if (!alternateColors) resetColors(); else recolor(); } public CustomTableTreeViewer(Composite parent, int style) { super(parent, style); Table table = getTableTree().getTable(); table.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { nudgeColumn(); } public void keyReleased(KeyEvent e) { nudgeColumn(); } }); } // 3rd attempt to hack in TTEs public void setChunksColumn(int i) { chunksColumn = i; } public int getChunksColumn() { return chunksColumn; } public void setEditors(boolean b) { activeEditors = b; } public boolean getEditors() { return activeEditors; } public void nudgeColumn() { if (activeEditors && chunksColumn > -1) { TableColumn c = this.getTableTree().getTable().getColumn(chunksColumn); int width = c.getWidth(); if (width > 0) c.setWidth(width); } } public void closeAllTTE() { Iterator i = tableTreeEditors.keySet().iterator(); while (i.hasNext()) { Object object = i.next(); disposeTTE((CTableTreeEditor) tableTreeEditors.get(object)); } tableTreeEditors.clear(); } public void openAllTTE() { TableTreeItem[] parents = this.getTableTree().getItems(); for (int i = 0; i < parents.length; i++) { associateTTE(parents[i].getData(), parents[i], true); TableTreeItem[] children = parents[i].getItems(); for (int j = 0; j < children.length; j++) { if (children[j].getData() != null) associateTTE(children[j].getData(), children[j], true); } } } private void disposeTTE(CTableTreeEditor tableTreeEditor) { if (tableTreeEditor != null) { if (tableTreeEditor.getEditor() != null) { tableTreeEditor.getEditor().dispose(); } tableTreeEditor.dispose(); } } public void remove(Object[] elements) { super.remove(elements); if (activeEditors) removeTTE(elements); if (alternateColors) recolor(); } public void removeTTE(Object[] elements) { if (!activeEditors) return; for (int i = 0; i < elements.length; i++) { if (elements[i] != null) { // why is it null? disposeTTE((CTableTreeEditor) tableTreeEditors.get(elements[i])); tableTreeEditors.remove(elements[i]); } } nudgeColumn(); } public void add(Object parentElement, Object[] childElements) { super.add(parentElement, childElements); nudgeColumn(); } private void associateTTE(Object element, Item item, boolean forceUpdate) { if ((item.getData() != element) || forceUpdate) { if (!tableTreeEditors.containsKey(element)) { File file = null; Client client = null; if (element instanceof File) file = (File) element; else if (element instanceof FileClient) { FileClient fileClient = (FileClient) element; file = fileClient.getFile(); client = fileClient.getClient(); } CTableTreeEditor tableTreeEditor = new CTableTreeEditor(this.getTableTree()); tableTreeEditor.horizontalAlignment = SWT.LEFT; tableTreeEditor.grabHorizontal = true; ChunkCanvas chunkCanvas = new ChunkCanvas(this.getTableTree().getTable(), SWT.NO_BACKGROUND, client, file, null, true); tableTreeEditor.setEditor(chunkCanvas, (TableTreeItem) item, chunksColumn); /* if (client != null) client.addObserver(chunkCanvas); else file.addObserver(chunkCanvas); */ tableTreeEditors.put(element, tableTreeEditor); } else { CTableTreeEditor tableTreeEditor = (CTableTreeEditor) tableTreeEditors.get(element); if (!item.equals(tableTreeEditor.getItem())) tableTreeEditor.setItem((TableTreeItem) item); } } } protected void mapElement(Object element, Widget item) { super.mapElement(element, item); // if (activeEditors) // associateTTE(element, (Item) item, true); } protected void unmapElement(Object element) { super.unmapElement(element); // if (activeEditors) // disassociateTTE(element); } private void disassociateTTE(Object element) { // Fully dispose if filters are active, or processing child items if ((getFilters().length > 0) || !(element instanceof File)) { disposeTTE((CTableTreeEditor) tableTreeEditors.get(element)); tableTreeEditors.remove(element); } else { CTableTreeEditor tableTreeEditor = (CTableTreeEditor) tableTreeEditors.get(element); if (tableTreeEditor != null) tableTreeEditor.setItem(null); } } public void refresh() { super.refresh(); if (activeEditors) nudgeColumn(); } public void expandAll() { super.expandAll(); nudgeColumn(); } public void collapseAll() { super.collapseAll(); nudgeColumn(); } public void collapseToLevel(Object element, int level) { super.collapseToLevel(element, level); nudgeColumn(); } public void expandToLevel(Object element, int level) { super.expandToLevel(element, level); nudgeColumn(); } // End TTE hack public void setColumnIDs(String string) { columnIDs = new int[string.length()]; for (int i = 0; i < string.length(); i++) columnIDs[i] = string.charAt(i) - IDSelector.MAGIC_NUMBER; } public int[] getColumnIDs() { return columnIDs; } public void resetColors() { TableTreeItem[] ti = getTableTree().getItems(); for (int i = 0; i < ti.length; i++) ti[i].setBackground(null); } public void resetSelColumn() { int column = ((GSorter)getSorter()).getLastColumnIndex(); TableTreeItem[] ti = getTableTree().getItems(); for (int i = 0; i < ti.length; i++) { ti[i].setBackground(column, null); TableTreeItem[] tii = ti[i].getItems(); for (int j = 0; j < tii.length; j++) { tii[j].setBackground(column, null); } } } public void recolor() { TableTreeItem[] ti = getTableTree().getItems(); for (int i = 0; i < ti.length; i++) { if (i % 2 != 0) { if (!ti[i].getBackground().getRGB().equals(alternateColor.getRGB())) ti[i].setBackground(alternateColor); } else { if (!ti[i].getBackground().getRGB().equals(tableBGColor.getRGB())) ti[i].setBackground(tableBGColor); } } } // crap jface code public Object getElementAt(int index) { // XXX: Workaround for 1GBCSB1: SWT:WIN2000 - TableTree should have getItem(int index) //TableTreeItem i = tableTree.getItems()[index]; //if (i != null) // return i.getData(); //return null; // crap workaround arrayoutofbounds TableTreeItem[] items = getTableTree().getItems(); if (index >= items.length) return null; return items[index].getData(); } protected Item getItem(int x, int y) { // XXX: Workaround for 1GBCSHG: SWT:WIN2000 - TableTree should have getItem(Point point) // Item i = getTableTree().getTable().getItem( // getTableTree().toControl(new Point(x, y))); // Item ii = getTableTree().getItem(new Point(x, y)); return getTableTree().getItem(new Point(x, y)); } protected void checkTTE(Item item, Object element) { //item. if (!tableTreeEditors.containsKey(element)) { File file = null; Client client = null; if (element instanceof File) file = (File) element; else if (element instanceof FileClient) { FileClient fileClient = (FileClient) element; file = fileClient.getFile(); client = fileClient.getClient(); } CTableTreeEditor tableTreeEditor = new CTableTreeEditor(this.getTableTree()); tableTreeEditor.horizontalAlignment = SWT.LEFT; tableTreeEditor.grabHorizontal = true; ChunkCanvas chunkCanvas = new ChunkCanvas(this.getTableTree().getTable(), SWT.NO_BACKGROUND, client, file, null, true); tableTreeEditor.setEditor(chunkCanvas, (TableTreeItem) item, chunksColumn); /* if (client != null) client.addObserver(chunkCanvas); else file.addObserver(chunkCanvas); */ tableTreeEditors.put(element, tableTreeEditor); } else { CTableTreeEditor tableTreeEditor = (CTableTreeEditor) tableTreeEditors.get(element); Item TEitem = tableTreeEditor.getItem(); if (!TEitem.equals(item)) { tableTreeEditor.setItem((TableTreeItem) item); } } } // Copyright (c) 2000, 2003 IBM Corporation and others. // TableTreeViewer.java protected void doUpdateItem(Item item, Object element) { // update icon and label // Similar code in TableTreeViewer.doUpdateItem() if (activeEditors) checkTTE(item, element); IBaseLabelProvider prov = getLabelProvider(); ITableLabelProvider tprov = null; ILabelProvider lprov = null; if (prov instanceof ITableLabelProvider) tprov = (ITableLabelProvider) prov; else lprov = (ILabelProvider) prov; int columnCount = this.getTableTree().getTable().getColumnCount(); TableTreeItem ti = (TableTreeItem) item; // Also enter loop if no columns added. See 1G9WWGZ: JFUIF:WINNT - // TableViewer with 0 columns does not work for (int column = 0; (column < columnCount) || (column == 0); column++) { String text = SResources.S_ES; //$NON-NLS-1$ Image image = null; if (tprov != null) { text = tprov.getColumnText(element, column); image = tprov.getColumnImage(element, column); } else { if (column == 0) { text = lprov.getText(element); image = lprov.getImage(element); } } // Only set text if it changes if (!text.equals(ti.getText(column))) ti.setText(column, text); // Apparently a problem to setImage to null if already null if (ti.getImage(column) != image) ti.setImage(column, image); if (hilightSorted) { RGB curr = ti.getBackground(column).getRGB(); if (((GSorter) getSorter()).getLastColumnIndex() == column) { if (!curr.equals(alternateColor.getRGB())) { ti.setBackground(column, alternateColor); } } else { if (!curr.equals(getTableTree().getBackground().getRGB())) { ti.setBackground(column, null); } } } } if (adjustFonts && prov instanceof IFontProvider) { IFontProvider fprov = (IFontProvider) prov; Font f = fprov.getFont(element); if (f != null && f != ti.getData("fontOn")) { ti.setFont(f); ti.setData("fontOn", f); } else if (f == null && ti.getData("fontOn") != null) { ti.setData("fontOn", null); ti.setFont(null); }; } if (prov instanceof IColorProvider) { IColorProvider cprov = (IColorProvider) prov; if (ti.getForeground() != cprov.getForeground(element)) { if ((cprov.getForeground(element) != null) || (!ti.getParent().getForeground().getRGB().equals(ti.getForeground().getRGB()))) ti.setForeground(cprov.getForeground(element)); } // if (ti.getBackground() != cprov.getBackground(element)) { // if ((cprov.getBackground(element) != null) // || // (!ti.getParent().getBackground().getRGB().equals(ti.getBackground().getRGB()))) // ti.setBackground(cprov.getBackground(element)); // } } if (alternateColors) recolor(); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?