📄 chartview.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 */package net.sourceforge.eclipsetrader.charts.views;import java.util.ArrayList;import java.util.Arrays;import java.util.Calendar;import java.util.Collections;import java.util.Comparator;import java.util.Date;import java.util.Iterator;import java.util.List;import java.util.Observable;import java.util.Observer;import net.sourceforge.eclipsetrader.charts.ChartsPlugin;import net.sourceforge.eclipsetrader.charts.DatePlot;import net.sourceforge.eclipsetrader.charts.IIndicatorPlugin;import net.sourceforge.eclipsetrader.charts.ObjectPlugin;import net.sourceforge.eclipsetrader.charts.Plot;import net.sourceforge.eclipsetrader.charts.Settings;import net.sourceforge.eclipsetrader.charts.actions.AutoScaleAction;import net.sourceforge.eclipsetrader.charts.actions.Set10MinuteIntervalAction;import net.sourceforge.eclipsetrader.charts.actions.Set15MinuteIntervalAction;import net.sourceforge.eclipsetrader.charts.actions.Set1DayIntervalAction;import net.sourceforge.eclipsetrader.charts.actions.Set1MinuteIntervalAction;import net.sourceforge.eclipsetrader.charts.actions.Set2MinuteIntervalAction;import net.sourceforge.eclipsetrader.charts.actions.Set30MinuteIntervalAction;import net.sourceforge.eclipsetrader.charts.actions.Set5MinuteIntervalAction;import net.sourceforge.eclipsetrader.charts.actions.Set60MinuteIntervalAction;import net.sourceforge.eclipsetrader.charts.actions.SetCustomPeriodAction;import net.sourceforge.eclipsetrader.charts.actions.SetLast2YearsPeriodAction;import net.sourceforge.eclipsetrader.charts.actions.SetLast6MonthsPeriodAction;import net.sourceforge.eclipsetrader.charts.actions.SetLastYearPeriodAction;import net.sourceforge.eclipsetrader.charts.actions.SetMonthlyIntervalAction;import net.sourceforge.eclipsetrader.charts.actions.SetViewAllAction;import net.sourceforge.eclipsetrader.charts.actions.SetWeeklyIntervalAction;import net.sourceforge.eclipsetrader.charts.dialogs.ChartSettingsDialog;import net.sourceforge.eclipsetrader.charts.events.ChartSelectionProvider;import net.sourceforge.eclipsetrader.charts.events.IndicatorSelection;import net.sourceforge.eclipsetrader.charts.events.ObjectSelection;import net.sourceforge.eclipsetrader.charts.events.PlotEvent;import net.sourceforge.eclipsetrader.charts.events.PlotListener;import net.sourceforge.eclipsetrader.charts.events.PlotMouseEvent;import net.sourceforge.eclipsetrader.charts.events.PlotMouseListener;import net.sourceforge.eclipsetrader.charts.events.PlotSelectionEvent;import net.sourceforge.eclipsetrader.charts.events.PlotSelectionListener;import net.sourceforge.eclipsetrader.charts.events.TabSelection;import net.sourceforge.eclipsetrader.charts.internal.CopyAction;import net.sourceforge.eclipsetrader.charts.internal.CutAction;import net.sourceforge.eclipsetrader.charts.internal.DeleteAction;import net.sourceforge.eclipsetrader.charts.internal.Messages;import net.sourceforge.eclipsetrader.charts.internal.PasteAction;import net.sourceforge.eclipsetrader.charts.internal.PasteSpecialAction;import net.sourceforge.eclipsetrader.core.CorePlugin;import net.sourceforge.eclipsetrader.core.FeedMonitor;import net.sourceforge.eclipsetrader.core.ICollectionObserver;import net.sourceforge.eclipsetrader.core.IHistoryFeed;import net.sourceforge.eclipsetrader.core.db.BarData;import net.sourceforge.eclipsetrader.core.db.Chart;import net.sourceforge.eclipsetrader.core.db.ChartIndicator;import net.sourceforge.eclipsetrader.core.db.ChartObject;import net.sourceforge.eclipsetrader.core.db.ChartRow;import net.sourceforge.eclipsetrader.core.db.ChartTab;import net.sourceforge.eclipsetrader.core.db.History;import net.sourceforge.eclipsetrader.core.db.Security;import net.sourceforge.eclipsetrader.core.db.visitors.ChartVisitorAdapter;import net.sourceforge.eclipsetrader.core.transfers.SecurityTransfer;import net.sourceforge.eclipsetrader.core.ui.NullSelection;import net.sourceforge.eclipsetrader.core.ui.SecuritySelection;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.eclipse.core.runtime.IConfigurationElement;import org.eclipse.core.runtime.IExtensionPoint;import org.eclipse.core.runtime.IExtensionRegistry;import org.eclipse.core.runtime.IPath;import org.eclipse.core.runtime.IProgressMonitor;import org.eclipse.core.runtime.IStatus;import org.eclipse.core.runtime.Platform;import org.eclipse.core.runtime.Status;import org.eclipse.core.runtime.jobs.Job;import org.eclipse.jface.action.Action;import org.eclipse.jface.action.GroupMarker;import org.eclipse.jface.action.IMenuListener;import org.eclipse.jface.action.IMenuManager;import org.eclipse.jface.action.IToolBarManager;import org.eclipse.jface.action.MenuManager;import org.eclipse.jface.action.Separator;import org.eclipse.jface.dialogs.MessageDialog;import org.eclipse.jface.preference.IPreferenceStore;import org.eclipse.jface.preference.PreferenceStore;import org.eclipse.jface.util.IPropertyChangeListener;import org.eclipse.jface.util.PropertyChangeEvent;import org.eclipse.jface.viewers.ISelection;import org.eclipse.swt.SWT;import org.eclipse.swt.custom.CTabFolder;import org.eclipse.swt.custom.CTabFolder2Listener;import org.eclipse.swt.custom.CTabFolderEvent;import org.eclipse.swt.custom.CTabItem;import org.eclipse.swt.custom.SashForm;import org.eclipse.swt.dnd.DND;import org.eclipse.swt.dnd.DropTarget;import org.eclipse.swt.dnd.DropTargetEvent;import org.eclipse.swt.dnd.DropTargetListener;import org.eclipse.swt.dnd.Transfer;import org.eclipse.swt.dnd.TransferData;import org.eclipse.swt.events.ControlAdapter;import org.eclipse.swt.events.ControlEvent;import org.eclipse.swt.events.ControlListener;import org.eclipse.swt.events.DisposeEvent;import org.eclipse.swt.events.DisposeListener;import org.eclipse.swt.events.SelectionAdapter;import org.eclipse.swt.events.SelectionEvent;import org.eclipse.swt.events.TraverseEvent;import org.eclipse.swt.events.TraverseListener;import org.eclipse.swt.graphics.Cursor;import org.eclipse.swt.graphics.GC;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.Control;import org.eclipse.swt.widgets.Menu;import org.eclipse.swt.widgets.ScrollBar;import org.eclipse.ui.IActionBars;import org.eclipse.ui.ISelectionListener;import org.eclipse.ui.IViewSite;import org.eclipse.ui.IWorkbenchActionConstants;import org.eclipse.ui.IWorkbenchPart;import org.eclipse.ui.IWorkbenchPreferenceConstants;import org.eclipse.ui.PartInitException;import org.eclipse.ui.PlatformUI;import org.eclipse.ui.part.ViewPart;import org.eclipse.ui.themes.ITheme;import org.eclipse.ui.themes.IThemeManager;/** */public class ChartView extends ViewPart implements PlotMouseListener, CTabFolder2Listener, ICollectionObserver, ISelectionListener{ public static final String VIEW_ID = "net.sourceforge.eclipsetrader.views.chart"; //$NON-NLS-1$ public static final String THEME_CHART_BACKGROUND = "CHART_BACKGROUND"; public static final String THEME_CHART_GRID_COLOR = "CHART_GRID_COLOR"; public static final String THEME_SCALE_BACKGROUND = "CHART_SCALE_BACKGROUND"; public static final String THEME_SCALE_FOREGROUND = "CHART_SCALE_FOREGROUND"; public static final String THEME_SUMMARY_BACKGROUND = "CHART_SUMMARY_BACKGROUND"; public static final String THEME_SUMMARY_FOREGROUND = "CHART_SUMMARY_FOREGROUND"; public static final String THEME_PERIOD_BACKGROUND = "CHART_PERIOD_BACKGROUND"; public static final String THEME_PERIOD_FOREGROUND = "CHART_PERIOD_FOREGROUND"; public static final String THEME_PERIOD_MARKERS = "CHART_PERIOD_MARKERS"; public static final String THEME_CHART_SELECTION_COLOR = "CHART_SELECTION_COLOR"; public static final int PERIOD_ALL = 0; public static final int PERIOD_LAST6MONTHS = 1; public static final int PERIOD_LASTYEAR = 2; public static final int PERIOD_LAST2YEARS = 3; public static final int PERIOD_CUSTOM = -1; public static final int HIDE_TABS_NEVER = 0; public static final int HIDE_TABS_ONLYONE = 1; public static final String PREFS_FOLLOW_SELECTION = "followSelection"; public static final String PREFS_SHOW_ADJUSTED_VALUES = "showAdjustedValues"; public static final String PREFS_SHOW_MARKETVALUE = "showMarketValue"; public static final String PREFS_WEIGHTS = "weights"; static boolean DEFAULT_FOLLOW_SELECTION = false; static boolean DEFAULT_SHOW_ADJUSTED_VALUES = false; static boolean DEFAULT_SHOW_MARKET_VALUE = false; Chart chart; SashForm sashForm; DatePlot datePlot; ScrollBar hBar; List tabGroups = new ArrayList(); Security security; int oldMouseX = -1, oldMouseY = -1; boolean autoScale = false; boolean followSelection = false; boolean showAdjustedValues = false; boolean showMarketValue = false; ChartObject newChartObject; Action viewAll = new SetViewAllAction(this); Action viewLast2Years = new SetLast2YearsPeriodAction(this); Action viewLastYear = new SetLastYearPeriodAction(this); Action viewLast6Months = new SetLast6MonthsPeriodAction(this); Action viewCustom = new SetCustomPeriodAction(this); Action monthlyAction = new SetMonthlyIntervalAction(this); Action weeklyAction = new SetWeeklyIntervalAction(this); Action dailyAction = new Set1DayIntervalAction(this); Action minute1Action = new Set1MinuteIntervalAction(this); Action minute2Action = new Set2MinuteIntervalAction(this); Action minute5Action = new Set5MinuteIntervalAction(this); Action minute10Action = new Set10MinuteIntervalAction(this); Action minute15Action = new Set15MinuteIntervalAction(this); Action minute30Action = new Set30MinuteIntervalAction(this); Action minute60Action = new Set60MinuteIntervalAction(this); Action autoScaleAction = new AutoScaleAction(this); Action toggleFollowSelectionAction; Action toggleAdjustedValuesAction; Action toggleMarketValueAction; Action cutAction; Action copyAction; Action pasteAction; Action pasteSpecialAction; Action deleteAction; PreferenceStore preferences; ITheme theme; Log logger = LogFactory.getLog(getClass()); IPropertyChangeListener themeChangeListener = new IPropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { String property = event.getProperty(); if (property.equals(IThemeManager.CHANGE_CURRENT_THEME)) { IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager(); if (theme != null) theme.removePropertyChangeListener(themeChangeListener); theme = themeManager.getCurrentTheme(); theme.addPropertyChangeListener(themeChangeListener); datePlot.setBackground(theme.getColorRegistry().get(property)); datePlot.setForeground(theme.getColorRegistry().get(property)); datePlot.setHilight(theme.getColorRegistry().get(property)); datePlot.redrawAll(); } else if (property.equals(ChartView.THEME_PERIOD_BACKGROUND)) { datePlot.setBackground(theme.getColorRegistry().get(property)); datePlot.redrawAll(); } else if (property.equals(ChartView.THEME_PERIOD_FOREGROUND)) { datePlot.setForeground(theme.getColorRegistry().get(property)); datePlot.redrawAll(); } else if (property.equals(ChartView.THEME_PERIOD_MARKERS)) { datePlot.setHilight(theme.getColorRegistry().get(property)); datePlot.redrawAll(); } } }; ControlListener sashResizeListener = new ControlAdapter() { public void controlResized(ControlEvent e) { String values = ""; int[] weights = sashForm.getWeights(); for (int i = 0; i < weights.length; i++) values += (i == 0 ? "" : ";") + String.valueOf(weights[i]); preferences.setValue(PREFS_WEIGHTS, values); } }; DropTargetListener dropTargetListener = new DropTargetListener() { public void dragEnter(DropTargetEvent event) { event.detail = DND.DROP_COPY; event.currentDataType = null; TransferData[] data = event.dataTypes; if (event.currentDataType == null) { for (int i = 0; i < data.length; i++) { if (SecurityTransfer.getInstance().isSupportedType(data[i])) { event.currentDataType = data[i]; break; } } } } public void dragOver(DropTargetEvent event) { event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL; } public void dragOperationChanged(DropTargetEvent event) { } public void dragLeave(DropTargetEvent event) { } public void dropAccept(DropTargetEvent event) { } public void drop(DropTargetEvent event) { if (SecurityTransfer.getInstance().isSupportedType(event.currentDataType)) { Security[] securities = (Security[]) event.data; setSecurity(securities[0]); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -