📄 watchlisttableviewer.java
字号:
/* * Copyright (c) 2004-2007 Marco Maccaferri and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Marco Maccaferri - initial API and implementation * Danilo Tuler - column selection */package net.sourceforge.eclipsetrader.trading.internal;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.Iterator;import java.util.List;import java.util.Observable;import java.util.Observer;import net.sourceforge.eclipsetrader.core.IEditableLabelProvider;import net.sourceforge.eclipsetrader.core.db.Security;import net.sourceforge.eclipsetrader.core.db.WatchlistColumn;import net.sourceforge.eclipsetrader.core.db.WatchlistItem;import net.sourceforge.eclipsetrader.core.transfers.SecurityTransfer;import net.sourceforge.eclipsetrader.core.transfers.WatchlistItemTransfer;import net.sourceforge.eclipsetrader.core.ui.NullSelection;import net.sourceforge.eclipsetrader.core.ui.widgets.EditableTable;import net.sourceforge.eclipsetrader.core.ui.widgets.EditableTableColumn;import net.sourceforge.eclipsetrader.core.ui.widgets.IEditableItem;import net.sourceforge.eclipsetrader.trading.WatchlistColumnSelection;import net.sourceforge.eclipsetrader.trading.WatchlistItemSelection;import net.sourceforge.eclipsetrader.trading.actions.ToggleShowTotalsAction;import net.sourceforge.eclipsetrader.trading.internal.watchlist.ColumnRegistry;import net.sourceforge.eclipsetrader.trading.views.WatchlistView;import net.sourceforge.eclipsetrader.trading.wizards.WatchlistItemPropertiesDialog;import org.apache.commons.logging.LogFactory;import org.eclipse.jface.action.Action;import org.eclipse.jface.action.IMenuListener;import org.eclipse.jface.action.IMenuManager;import org.eclipse.jface.action.MenuManager;import org.eclipse.jface.action.Separator;import org.eclipse.jface.preference.PreferenceStore;import org.eclipse.jface.util.IPropertyChangeListener;import org.eclipse.jface.util.PropertyChangeEvent;import org.eclipse.jface.viewers.ILabelProvider;import org.eclipse.jface.viewers.ITableLabelProvider;import org.eclipse.swt.SWT;import org.eclipse.swt.dnd.DND;import org.eclipse.swt.dnd.DragSource;import org.eclipse.swt.dnd.DragSourceEvent;import org.eclipse.swt.dnd.DragSourceListener;import org.eclipse.swt.dnd.TextTransfer;import org.eclipse.swt.dnd.Transfer;import org.eclipse.swt.events.ControlAdapter;import org.eclipse.swt.events.ControlEvent;import org.eclipse.swt.events.DisposeEvent;import org.eclipse.swt.events.DisposeListener;import org.eclipse.swt.events.MouseAdapter;import org.eclipse.swt.events.MouseEvent;import org.eclipse.swt.events.SelectionAdapter;import org.eclipse.swt.events.SelectionEvent;import org.eclipse.swt.events.SelectionListener;import org.eclipse.swt.graphics.Color;import org.eclipse.swt.graphics.Image;import org.eclipse.swt.graphics.Point;import org.eclipse.swt.graphics.RGB;import org.eclipse.swt.graphics.Rectangle;import org.eclipse.swt.layout.GridData;import org.eclipse.swt.layout.GridLayout;import org.eclipse.swt.widgets.Composite;import org.eclipse.swt.widgets.Event;import org.eclipse.swt.widgets.Listener;import org.eclipse.swt.widgets.Table;import org.eclipse.swt.widgets.TableColumn;import org.eclipse.swt.widgets.TableItem;import org.eclipse.ui.IActionBars;import org.eclipse.ui.IWorkbenchActionConstants;import org.eclipse.ui.PlatformUI;import org.eclipse.ui.themes.ITheme;import org.eclipse.ui.themes.IThemeManager;/** */public class WatchlistTableViewer extends AbstractLayout{ public static final String EVEN_ROWS_BACKGROUND = "TABLE_EVEN_ROWS_BACKGROUND"; public static final String EVEN_ROWS_FOREGROUND = "TABLE_EVEN_ROWS_FOREGROUND"; public static final String ODD_ROWS_BACKGROUND = "TABLE_ODD_ROWS_BACKGROUND"; public static final String ODD_ROWS_FOREGROUND = "TABLE_ODD_ROWS_FOREGROUND"; public static final String TOTALS_ROWS_BACKGROUND = "TABLE_TOTALS_ROWS_BACKGROUND"; public static final String TOTALS_ROWS_FOREGROUND = "TABLE_TOTALS_ROWS_FOREGROUND"; public static final String TICK_BACKGROUND = "TABLE_TICK_BACKGROUND"; public static final String POSITIVE_FOREGROUND = "TABLE_POSITIVE_FOREGROUND"; public static final String NEGATIVE_FOREGROUND = "TABLE_NEGATIVE_FOREGROUND"; public static final String ALERT_BACKGROUND = "TABLE_ALERT_BACKGROUND"; List list = new ArrayList(); Composite content; EditableTable table; Color evenForeground; Color evenBackground; Color oddForeground; Color oddBackground; Color totalsForeground; Color totalsBackground; Color tickBackground; Color negativeForeground; Color positiveForeground; Color alertHilightBackground; boolean showTotals = false; boolean singleClick = true; int sortColumn = -1; int sortDirection = 0; Action toggleShowTotals; Action autoResizeAction; Action propertiesAction; WatchlistColumn selectedColumn; IPropertyChangeListener themeChangeListener = new IPropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { if (event.getProperty().equals(IThemeManager.CHANGE_CURRENT_THEME)) { ((ITheme) event.getOldValue()).removePropertyChangeListener(this); setTheme((ITheme) event.getNewValue()); } else { IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager(); ITheme theme = themeManager.getCurrentTheme(); if (event.getProperty().equals(EVEN_ROWS_BACKGROUND)) evenBackground = theme.getColorRegistry().get(event.getProperty()); else if (event.getProperty().equals(EVEN_ROWS_FOREGROUND)) evenForeground = theme.getColorRegistry().get(event.getProperty()); else if (event.getProperty().equals(ODD_ROWS_BACKGROUND)) oddBackground = theme.getColorRegistry().get(event.getProperty()); else if (event.getProperty().equals(ODD_ROWS_FOREGROUND)) oddForeground = theme.getColorRegistry().get(event.getProperty()); else if (event.getProperty().equals(TOTALS_ROWS_FOREGROUND)) totalsForeground = theme.getColorRegistry().get(event.getProperty()); else if (event.getProperty().equals(TOTALS_ROWS_FOREGROUND)) totalsForeground = theme.getColorRegistry().get(event.getProperty()); else if (event.getProperty().equals(POSITIVE_FOREGROUND)) positiveForeground = theme.getColorRegistry().get(event.getProperty()); else if (event.getProperty().equals(NEGATIVE_FOREGROUND)) negativeForeground = theme.getColorRegistry().get(event.getProperty()); else if (event.getProperty().equals(TICK_BACKGROUND)) tickBackground = theme.getColorRegistry().get(event.getProperty()); else if (event.getProperty().equals(ALERT_BACKGROUND)) alertHilightBackground = theme.getColorRegistry().get(event.getProperty()); } updateView(); } }; Comparator comparator = new Comparator() { public int compare(Object arg0, Object arg1) { Object provider = table.getColumn(sortColumn).getData("labelProvider"); if (provider instanceof Comparator) { if (sortDirection == 0) return ((Comparator)provider).compare(arg0, arg1); else return ((Comparator)provider).compare(arg1, arg0); } return 0; } }; SelectionListener columnSelectionListener = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { TableColumn tableColumn = (TableColumn) e.widget; WatchlistColumn column = (WatchlistColumn)tableColumn.getData(); int index = table.indexOf(tableColumn); if (index == sortColumn) { if (sortDirection == 1) sortColumn = -1; else sortDirection = 1; } else { sortColumn = index; sortDirection = 0; } if (sortColumn != -1) { String s = column.getId() + ";" + String.valueOf(sortDirection); getView().getPreferenceStore().setValue(WatchlistView.PREFS_SORTING, s); } else getView().getPreferenceStore().setValue(WatchlistView.PREFS_SORTING, ""); updateView(); } }; ControlAdapter columnControlListener = new ControlAdapter() { public void controlResized(ControlEvent e) { TableColumn tableColumn = (TableColumn)e.widget; WatchlistColumn column = (WatchlistColumn)tableColumn.getData(); getView().getPreferenceStore().setValue(column.getId() + ".width", tableColumn.getWidth()); } }; public WatchlistTableViewer(WatchlistView view) { super(view); showTotals = getView().getPreferenceStore().getBoolean(WatchlistView.PREFS_SHOW_TOTALS); toggleShowTotals = new ToggleShowTotalsAction(this); toggleShowTotals.setChecked(showTotals); IMenuManager menuManager = getViewSite().getActionBars().getMenuManager(); menuManager.appendToGroup("toggles", toggleShowTotals); autoResizeAction = new Action() { public void run() { TableColumn[] column = table.getColumns(); for (int i = 0; i < column.length; i++) { if (column[i].getResizable()) column[i].pack(); } } }; autoResizeAction.setId("autoResizeColumns"); autoResizeAction.setText("Resize columns"); menuManager.appendToGroup("layout", autoResizeAction); propertiesAction = new Action() { public void run() { TableItem[] selection = table.getSelection(); if (selection.length != 0 && selection[0] instanceof WatchlistTableItem) { WatchlistItem item = ((WatchlistTableItem) selection[0]).getWatchlistItem(); WatchlistItemPropertiesDialog dlg = new WatchlistItemPropertiesDialog(item, getViewSite().getShell()); dlg.open(); } } }; propertiesAction.setText("Properties"); propertiesAction.setEnabled(false); IActionBars actionBars = getViewSite().getActionBars(); actionBars.setGlobalActionHandler("properties", propertiesAction); actionBars.updateActionBars(); } public Composite createPartControl(Composite parent) { content = new Composite(parent, SWT.NONE); GridLayout gridLayout = new GridLayout(); gridLayout.marginWidth = gridLayout.marginHeight = 0; content.setLayout(gridLayout); IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager(); themeManager.addPropertyChangeListener(themeChangeListener); ITheme theme = themeManager.getCurrentTheme(); setTheme(theme); table = new EditableTable(content, SWT.MULTI|SWT.FULL_SELECTION); table.setHeaderVisible(true); table.setLinesVisible(false); table.setBackground(parent.getBackground()); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); table.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { if (singleClick) updateSelection(); } }); table.addMouseListener(new MouseAdapter() { public void mouseDown(MouseEvent e) { if (singleClick) { selectedColumn = getColumn(e); if (table.getItem(new Point(e.x, e.y)) == null) { table.deselectAll(); updateSelection(); } } } public void mouseDoubleClick(MouseEvent e) { if (!singleClick) { selectedColumn = getColumn(e); if (table.getItem(new Point(e.x, e.y)) == null) { table.deselectAll(); } updateSelection(); } } }); // TODO This is a workaround for the sort column background color table.addListener(SWT.EraseItem, new Listener() { public void handleEvent(Event event) { event.gc.setBackground(((TableItem)event.item).getBackground()); event.gc.fillRectangle(event.getBounds()); } }); TableColumn column = new TableColumn(table, SWT.NONE); column.setWidth(0); column.setResizable(false); // Drag and drop support DragSource dragSource = new DragSource(table, DND.DROP_COPY|DND.DROP_MOVE); dragSource.setTransfer(new Transfer[] { SecurityTransfer.getInstance(), WatchlistItemTransfer.getInstance(), TextTransfer.getInstance() }); dragSource.addDragListener(new DragSourceListener() { WatchlistItem[] watchlistSelection; public void dragStart(DragSourceEvent event) { if (table.getSelectionCount() == 0) event.doit = false; } public void dragSetData(DragSourceEvent event) { TableItem[] selection = table.getSelection();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -