hqchart 1.1.13171 → 1.1.13191

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4211,11 +4211,12 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4211
4211
  chart.ModifyIndexDialog=this.ModifyIndexDialog;
4212
4212
  chart.ChangeIndexDialog=this.ChangeIndexDialog;
4213
4213
  chart.MinuteDialog=this.MinuteDialog;
4214
+
4215
+ var pixelRatio=GetDevicePixelRatio();
4214
4216
 
4215
4217
  //右键菜单
4216
- if (option.IsShowRightMenu==true) chart.RightMenu=new KLineRightMenu(this.DivElement);
4218
+ if (IFrameSplitOperator.IsBool(option.IsShowRightMenu)) chart.IsShowRightMenu=option.IsShowRightMenu;
4217
4219
  if (option.ScriptError) chart.ScriptErrorCallback=option.ScriptError;
4218
- chart.SelectRectRightMenu=new KLineSelectRightMenu(this.DivElement);
4219
4220
  if (option.EnableScrollUpDown==true) chart.EnableScrollUpDown=option.EnableScrollUpDown;
4220
4221
  if (option.DisableMouse==true) chart.DisableMouse=option.DisableMouse;
4221
4222
  if (option.TouchMoveMinAngle) chart.TouchMoveMinAngle=option.TouchMoveMinAngle;
@@ -4429,8 +4430,8 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4429
4430
  chart.Frame.SubFrame[i].Frame.IsShowYText[1]=item.IsShowRightText;
4430
4431
  chart.Frame.SubFrame[i].Frame.YSplitOperator.IsShowRightText=item.IsShowRightText; //显示右边刻度
4431
4432
  }
4432
- if (item.TopSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.TopSpace=item.TopSpace;
4433
- if (item.BottomSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.BottomSpace=item.BottomSpace;
4433
+ if (item.TopSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.TopSpace=item.TopSpace*pixelRatio;
4434
+ if (item.BottomSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.BottomSpace=item.BottomSpace*pixelRatio;
4434
4435
 
4435
4436
  if (item.RightTextPosition>0) chart.Frame.SubFrame[i].Frame.YTextPosition[1]=item.RightTextPosition;
4436
4437
  if (item.LeftTextPosition>0) chart.Frame.SubFrame[i].Frame.YTextPosition[0]=item.LeftTextPosition;
@@ -4629,7 +4630,7 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4629
4630
  chart.MinuteDialog=this.MinuteDialog;
4630
4631
 
4631
4632
  //右键菜单
4632
- if (option.IsShowRightMenu==true) chart.RightMenu=new KLineRightMenu(this.DivElement);
4633
+ if (IFrameSplitOperator.IsBool(option.IsShowRightMenu)) chart.IsShowRightMenu=option.IsShowRightMenu;
4633
4634
 
4634
4635
  if (option.KLine) //k线图的属性设置
4635
4636
  {
@@ -4732,6 +4733,8 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4732
4733
  chart.ModifyIndexDialog=this.ModifyIndexDialog;
4733
4734
  chart.ChangeIndexDialog=this.ChangeIndexDialog;
4734
4735
 
4736
+ var pixelRatio=GetDevicePixelRatio();
4737
+
4735
4738
  var windowsCount=2;
4736
4739
  if (option.Windows && option.Windows.length>0) windowsCount+=option.Windows.length; //指标窗口从第3个窗口开始
4737
4740
  if (option.EnableScrollUpDown==true) chart.EnableScrollUpDown=option.EnableScrollUpDown;
@@ -4847,7 +4850,7 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4847
4850
 
4848
4851
  if (option.MinuteInfo) chart.CreateMinuteInfo(option.MinuteInfo);
4849
4852
 
4850
- if (option.IsShowRightMenu==true) chart.RightMenu=new MinuteRightMenu(this.DivElement);
4853
+ if (IFrameSplitOperator.IsBool(option.IsShowRightMenu)) chart.IsShowRightMenu=option.IsShowRightMenu;
4851
4854
 
4852
4855
  if (IFrameSplitOperator.IsNumber(option.DayCount)) chart.DayCount=option.DayCount;
4853
4856
 
@@ -4899,8 +4902,8 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4899
4902
  if (IFrameSplitOperator.IsNumber(item.YTextBaseline)) chart.Frame.SubFrame[i].Frame.YTextBaseline=item.YTextBaseline;
4900
4903
  if (IFrameSplitOperator.IsBool(item.IsShowIndexTitle)) chart.Frame.SubFrame[i].Frame.IsShowIndexTitle=item.IsShowIndexTitle;
4901
4904
 
4902
- if (item.TopSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.TopSpace=item.TopSpace;
4903
- if (item.BottomSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.BottomSpace=item.BottomSpace;
4905
+ if (item.TopSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.TopSpace=item.TopSpace*pixelRatio;
4906
+ if (item.BottomSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.BottomSpace=item.BottomSpace*pixelRatio;
4904
4907
 
4905
4908
  //是否显示关闭集合竞价按钮
4906
4909
  if (IFrameSplitOperator.IsNumber(item.CloseBeforeButton)) chart.Frame.SubFrame[i].Frame.IsShowCloseButton=item.CloseBeforeButton;
@@ -5566,6 +5569,7 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
5566
5569
  if (!chart) return false;
5567
5570
 
5568
5571
  this.JSChartContainer=chart;
5572
+ chart.DivElement=this.DivElement;
5569
5573
 
5570
5574
  if (option.DefaultCursor) chart.DefaultCursor=option.DefaultCursor;
5571
5575
  if (option.OnCreatedCallback) option.OnCreatedCallback(chart);
@@ -5573,6 +5577,10 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
5573
5577
  //是否自动更新
5574
5578
  if (option.IsAutoUpdate!=null) chart.IsAutoUpdate=option.IsAutoUpdate;
5575
5579
  if (option.AutoUpdateFrequency>0) chart.AutoUpdateFrequency=option.AutoUpdateFrequency;
5580
+
5581
+ //内置菜单
5582
+ if (option.EnablePopMenuV2===true) chart.InitalPopMenu();
5583
+
5576
5584
  //注册事件
5577
5585
  if (option.EventCallback)
5578
5586
  {
@@ -5599,19 +5607,6 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
5599
5607
  this.DivElement.JSChart=this; //div中保存一份
5600
5608
  this.JSChartContainer.Draw();
5601
5609
  }
5602
-
5603
- if (IFrameSplitOperator.IsBool(option.CheckLatestVerion) && option.CheckLatestVerion==false)
5604
- {
5605
-
5606
- }
5607
- else if (JSChart.LastVersion==null)
5608
- {
5609
- if (chart && typeof(chart.GetLatestVersion)=='function')
5610
- {
5611
- //由于域名都要备案,获取最新版本接口停止使用
5612
- //chart.GetLatestVersion();
5613
- }
5614
- }
5615
5610
  }
5616
5611
 
5617
5612
  //创建工具条
@@ -6055,6 +6050,15 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
6055
6050
  return this.JSChartContainer.ChangePriceGap(option);
6056
6051
  }
6057
6052
  }
6053
+
6054
+ this.PopupMenuByTab=function(menuData, rtTab)
6055
+ {
6056
+ if(this.JSChartContainer && typeof(this.JSChartContainer.PopupMenuByTab)=='function')
6057
+ {
6058
+ JSConsole.Chart.Log('[JSChart:ChangePriceGap] ');
6059
+ return this.JSChartContainer.PopupMenuByTab(menuData, rtTab);
6060
+ }
6061
+ }
6058
6062
  }
6059
6063
 
6060
6064
  JSChart.LastVersion=null; //最新的版本号
@@ -6260,6 +6264,12 @@ JSChart.ToFixedRect=function(value)
6260
6264
  return ToFixedRect(value);
6261
6265
  }
6262
6266
 
6267
+ JSChart.GetScrollPosition=function()
6268
+ {
6269
+ return GetScrollPosition();
6270
+ }
6271
+
6272
+
6263
6273
 
6264
6274
 
6265
6275
  var JSCHART_EVENT_ID=
@@ -6545,6 +6555,40 @@ var JSCHART_WORKER_MESSAGE_ID=
6545
6555
  ERROR_EXECUTE_SCRIPT:3,
6546
6556
  }
6547
6557
 
6558
+ var JSCHART_MENU_ID=
6559
+ {
6560
+ CMD_CHANGE_PERIOD_ID:1, //切换周期
6561
+ CMD_CHANGE_WINDOW_COUNT_ID:2, //窗口个数
6562
+ CMD_CHANGE_RIGHT_ID:3, //复权
6563
+ CMD_CHANGE_INDEX_ID:4, //切换指标
6564
+ CMD_CHANGE_COLOR_INDEX_ID:5, //五彩K线指标
6565
+ CMD_CHANGE_TRADE_INDEX_ID:6, //专家系统(交易指标)
6566
+ CMD_DELETE_COLOR_INDEX_ID:7, //删除五彩K线指标
6567
+ CMD_DELETE_TRADE_INDEX_ID:8, //删除专家系统(交易指标)
6568
+ CMD_CHANGE_KLINE_TYPE_ID:9, //切换K线类型
6569
+ CMD_CHANGE_PRICE_GAP_ID:10, //缺口提示
6570
+ CMD_OVERLAY_SYMBOL_ID:11, //叠加品种
6571
+ CMD_DELETE_ALL_OVERLAY_SYMBOL_ID:12, //删除所有叠加品种
6572
+ CMD_CHANGE_COORDINATETYPE_ID:13, //切换坐标类型
6573
+ CMD_CHANGE_KLINE_INFO_ID:14, //切换信息地雷
6574
+ CMD_DELETE_ALL_KLINE_INFO_ID:15, //清空信息地雷
6575
+ CMD_CHANGE_DRAG_MODE_ID:16, //切换拖动模式
6576
+ CMD_CHANGE_BG_SPLIT_ID:17, //背景分割
6577
+
6578
+ CMD_SHOW_DRAWTOOL_ID:18, //画图工具
6579
+ CMD_HIDE_DRAWTOOL_ID:19,
6580
+
6581
+ CMD_SHOW_STOCKCHIP_ID:20, //筹码分布
6582
+ CMD_HIDE_STOCKCHIP_ID:21,
6583
+
6584
+ CMD_ENABLE_SELECT_RECT_ID:22, //启动区间选择
6585
+ CMD_CHANGE_DAY_COUNT_ID:23, //切换天数
6586
+ CMD_SHOW_BEFORE_DATA_ID:24, //显示|隐藏集合竞价
6587
+
6588
+ CMD_SELECTED_ZOOM_ID:25, //选中放大
6589
+ CMD_SELECTED_SUMMARY_ID:26, //区间统计
6590
+ }
6591
+
6548
6592
 
6549
6593
  function PhoneDBClick()
6550
6594
  {
@@ -6708,9 +6752,6 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
6708
6752
  this.SelectRect.oncontextmenu=function() { return false; }; //屏蔽选中区域系统右键菜单
6709
6753
  uielement.parentNode.appendChild(this.SelectRect);
6710
6754
 
6711
- //区间选择右键菜单
6712
- this.SelectRectRightMenu;
6713
-
6714
6755
  //坐标轴风格方法 double-更加数值型分割 price-更加股票价格分割
6715
6756
  this.FrameSplitData=new Map();
6716
6757
  this.FrameSplitData.set("double",new SplitData());
@@ -6770,12 +6811,23 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
6770
6811
 
6771
6812
  this.StockCache={ Data:null }; //扩展数据缓存数据
6772
6813
 
6814
+ this.JSPopMenu; //内置菜单
6815
+ this.IsShowRightMenu=true; //显示右键菜单
6816
+
6773
6817
 
6774
6818
  this.ClearStockCache=function()
6775
6819
  {
6776
6820
  this.StockCache.Data=null;
6777
6821
  }
6778
6822
 
6823
+ this.InitalPopMenu=function() //初始化弹出窗口
6824
+ {
6825
+ if (this.JSPopMenu) return;
6826
+
6827
+ this.JSPopMenu=new JSPopMenu(); //内置菜单
6828
+ this.JSPopMenu.Inital();
6829
+ }
6830
+
6779
6831
  //obj={ Element:, Canvas: }
6780
6832
  this.SetCorssCursorElement=function(obj)
6781
6833
  {
@@ -6825,61 +6877,10 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
6825
6877
  {
6826
6878
  this.IsDestroy=true;
6827
6879
  this.StopAutoUpdate();
6828
-
6829
- if (this.GetLatestVersionTimer!=null)
6830
- {
6831
- clearTimeout(this.GetLatestVersionTimer);
6832
- this.GetLatestVersionTimer=null;
6833
- }
6834
6880
  }
6835
6881
 
6836
6882
  this.ChartDestory=this.ChartDestroy; //老版本写错了,需要兼容下
6837
6883
 
6838
-
6839
- this.GetLatestVersionTimer=null; //获取最新版本
6840
- this.GetLatestVersion=function()
6841
- {
6842
- if (this.GetLatestVersionTimer!=null)
6843
- {
6844
- clearTimeout(this.GetLatestVersionTimer);
6845
- this.GetLatestVersionTimer=null;
6846
- }
6847
-
6848
- var roundeTime=Math.floor(Math.random()*50);
6849
- var waittimer=1000*60*3+(roundeTime*1000);
6850
- var value="aHR0cHM6Ly9ocWNoYXJ0LnplYWxpbmsuY29tL2FwaS9HZXRWZXJzaW9u";
6851
- JSConsole.Chart.Log("[JSChartContainer::GetLatestVersion] wait for get hqchart latest version. ",waittimer);
6852
- this.GetLatestVersionTimer = setTimeout(()=>
6853
- {
6854
- var width=0, height=0;
6855
- if (this.Frame && this.Frame.ChartBorder)
6856
- {
6857
- width=this.Frame.ChartBorder.GetChartWidth();
6858
- height=this.Frame.ChartBorder.GetChartHeight();
6859
- }
6860
-
6861
- var url=`${atob(value)}?width=${width}&height=${height}&type=h5`;
6862
-
6863
- if (JSChart.LastVersion!=null) return; //只请求一次
6864
-
6865
- JSNetwork.HttpRequest({
6866
- url: url,
6867
- type:"get",
6868
- dataType: "json",
6869
- async:true,
6870
- success:function(data)
6871
- {
6872
- JSConsole.Chart.Log("[JSChartContainer::GetLatestVersion] hqchart latest version. ",data);
6873
- JSChart.LastVersion=data;
6874
- },
6875
- error:function(request, textStatus, errorThrown)
6876
- {
6877
- JSConsole.Chart.Log("[JSChartContainer::GetLatestVersion] Get HQChart latest version failed.", request);
6878
- }
6879
- });
6880
- }, waittimer);
6881
- }
6882
-
6883
6884
  //设置焦点
6884
6885
  this.SetFocus=function()
6885
6886
  {
@@ -6995,6 +6996,7 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
6995
6996
  this.UIOnContextMenu=function(e)
6996
6997
  {
6997
6998
  if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;
6999
+ if (!this.IsShowRightMenu) return;
6998
7000
 
6999
7001
  var x = e.clientX-this.UIElement.getBoundingClientRect().left;
7000
7002
  var y = e.clientY-this.UIElement.getBoundingClientRect().top;
@@ -7236,7 +7238,6 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
7236
7238
  }
7237
7239
 
7238
7240
  this.HideSelectRect();
7239
- if (this.SelectRectRightMenu) this.SelectRectRightMenu.Hide();
7240
7241
  if (this.ChartPictureMenu) this.ChartPictureMenu.Hide();
7241
7242
 
7242
7243
  var paint=this.GetRectSelectPaint();
@@ -7876,17 +7877,19 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
7876
7877
  }
7877
7878
  else
7878
7879
  {
7879
- if (isShowMenu && this.SelectRectRightMenu)
7880
+ if (isShowMenu)
7880
7881
  {
7881
- e.data=
7882
- {
7882
+ var data=
7883
+ {
7883
7884
  Chart:this,
7884
7885
  X:drag.LastMove.X-uielement.getBoundingClientRect().left,
7885
7886
  Y:drag.LastMove.Y-uielement.getBoundingClientRect().top,
7886
7887
  SelectData:selectData, //区间选择的数据
7887
7888
  RectSelectPaint:paint //区间选择背景
7888
7889
  };
7889
- this.SelectRectRightMenu.DoModal(e);
7890
+
7891
+ e.data=data;
7892
+ this.PopupSelectRectMenuV2(data, e);
7890
7893
  }
7891
7894
  }
7892
7895
  }
@@ -12938,6 +12941,225 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
12938
12941
  }
12939
12942
  }
12940
12943
  }
12944
+
12945
+ this.PopupMenuByTab=function(menuData, rtTab)
12946
+ {
12947
+ if (!this.JSPopMenu) return;
12948
+
12949
+ var pixelRatio=GetDevicePixelRatio();
12950
+ var rtCell={ Left:rtTab.Left/pixelRatio, Right:rtTab.Right/pixelRatio, Bottom:rtTab.Bottom/pixelRatio, Top:rtTab.Top/pixelRatio };
12951
+ rtCell.Width=rtCell.Right-rtCell.Left;
12952
+ rtCell.Height=rtCell.Bottom-rtCell.Top;
12953
+
12954
+ var rtClient=this.UIElement.getBoundingClientRect();
12955
+ var rtScroll=GetScrollPosition();
12956
+
12957
+ var offsetLeft=rtClient.left+rtScroll.Left;
12958
+ var offsetTop=rtClient.top+rtScroll.Top;
12959
+ rtCell.Left+=offsetLeft;
12960
+ rtCell.Right+=offsetLeft;
12961
+ rtCell.Top+=offsetTop;
12962
+ rtCell.Bottom+=offsetTop;
12963
+
12964
+ this.JSPopMenu.CreatePopMenu(menuData);
12965
+ this.JSPopMenu.PopupMenuByTab(rtCell);
12966
+ }
12967
+
12968
+ this.PopuMenuByRClick=function(menuData, x, y)
12969
+ {
12970
+ var rtClient=this.UIElement.getBoundingClientRect();
12971
+ var rtScroll=GetScrollPosition();
12972
+
12973
+ x+=rtClient.left+rtScroll.Left;
12974
+ y+=rtClient.top+rtScroll.Top;
12975
+
12976
+ this.JSPopMenu.CreatePopMenu(menuData);
12977
+ this.JSPopMenu.PopupMenuByRight(x,y);
12978
+ }
12979
+
12980
+ //点击右键菜单
12981
+ this.OnClickRightMenu=function(data)
12982
+ {
12983
+ JSConsole.Chart.Log('[JSChartContainer::OnClickRightMenu] ',data);
12984
+ if (!data || !data.Data) return;
12985
+
12986
+ var cmdID=data.Data.ID; //命令ID
12987
+ var aryArgs=data.Data.Args; //参数
12988
+ var param=null, srcParam=null; //原始值
12989
+ if (IFrameSplitOperator.IsNonEmptyArray(aryArgs))
12990
+ {
12991
+ srcParam=aryArgs[0];
12992
+ if (IFrameSplitOperator.IsNumber(aryArgs[0])) param=aryArgs[0];
12993
+ }
12994
+
12995
+ switch(cmdID)
12996
+ {
12997
+ case JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID:
12998
+ if (this.ChangePeriod && param!=null)
12999
+ this.ChangePeriod(param);
13000
+ break;
13001
+ case JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID:
13002
+ if (this.ChangeIndexWindowCount && param!=null)
13003
+ this.ChangeIndexWindowCount(param);
13004
+ break;
13005
+ case JSCHART_MENU_ID.CMD_CHANGE_RIGHT_ID:
13006
+ if (this.ChangeRight && param!=null)
13007
+ this.ChangeRight(param);
13008
+ break;
13009
+ case JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID:
13010
+ if (this.ChangeIndex && param!=null && aryArgs[1])
13011
+ this.ChangeIndex(param,aryArgs[1]);
13012
+ break;
13013
+
13014
+ case JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID:
13015
+ case JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID:
13016
+ if (this.ChangeInstructionIndex && aryArgs[0])
13017
+ this.ChangeInstructionIndex(aryArgs[0]);
13018
+ break;
13019
+ case JSCHART_MENU_ID.CMD_DELETE_COLOR_INDEX_ID: //删除五彩K线指标
13020
+ case JSCHART_MENU_ID.CMD_DELETE_TRADE_INDEX_ID: //删除专家系统(交易指标)
13021
+ if (this.CancelInstructionIndex) this.CancelInstructionIndex();
13022
+ break;
13023
+ case JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID: //切换K线类型
13024
+ if (this.ChangeKLineDrawType && param!=null)
13025
+ this.ChangeKLineDrawType(param,aryArgs[1],aryArgs[2]);
13026
+ break;
13027
+ case JSCHART_MENU_ID.CMD_CHANGE_PRICE_GAP_ID: //缺口提示
13028
+ if (this.ChangePriceGap && IFrameSplitOperator.IsBool(aryArgs[0]))
13029
+ {
13030
+ if (aryArgs[0]==false)
13031
+ {
13032
+ this.ChangePriceGap({ Enable:aryArgs[0] });
13033
+ }
13034
+ else
13035
+ {
13036
+ if (IFrameSplitOperator.IsNumber(aryArgs[1]))
13037
+ this.ChangePriceGap({ Enable:aryArgs[0], Count:aryArgs[1] });
13038
+ }
13039
+ }
13040
+ break;
13041
+ case JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID:
13042
+ if (aryArgs[1]===true)
13043
+ {
13044
+ if (this.OverlaySymbol && aryArgs[0]) this.OverlaySymbol(aryArgs[0]);
13045
+ }
13046
+ else if (aryArgs[1]===false)
13047
+ {
13048
+ if (this.DeleteOverlaySymbol && aryArgs[0]) this.DeleteOverlaySymbol(aryArgs[0]);
13049
+ }
13050
+ break;
13051
+ case JSCHART_MENU_ID.CMD_DELETE_ALL_OVERLAY_SYMBOL_ID:
13052
+ if (this.ClearOverlaySymbol) this.ClearOverlaySymbol();
13053
+ break;
13054
+ case JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID:
13055
+ if (this.ChangeCoordinateType && aryArgs[0]) this.ChangeCoordinateType(aryArgs[0]);
13056
+ break;
13057
+ case JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID:
13058
+ if (aryArgs[0] && IFrameSplitOperator.IsBool(aryArgs[1]))
13059
+ {
13060
+ if (aryArgs[1]==true && this.AddKLineInfo) this.AddKLineInfo(aryArgs[0],true);
13061
+ else if (aryArgs[1]==false && this.DeleteKLineInfo) this.DeleteKLineInfo(aryArgs[0]);
13062
+ }
13063
+ break;
13064
+ case JSCHART_MENU_ID.CMD_DELETE_ALL_KLINE_INFO_ID:
13065
+ if (this.ClearKLineInfo) this.ClearKLineInfo();
13066
+ break;
13067
+ case JSCHART_MENU_ID.CMD_CHANGE_DRAG_MODE_ID:
13068
+ if (param!=null) this.DragMode=param;
13069
+ break;
13070
+ case JSCHART_MENU_ID.CMD_CHANGE_BG_SPLIT_ID:
13071
+ if (IFrameSplitOperator.IsBool(srcParam))
13072
+ {
13073
+ if (srcParam)
13074
+ {
13075
+ this.CreateExtendChart("SessionBreaksPaint", { });
13076
+ this.Draw();
13077
+ }
13078
+ else
13079
+ {
13080
+ var finder=this.GetExtendChartByClassName("SessionBreaksPaint");
13081
+ if (finder)
13082
+ {
13083
+ this.DeleteExtendChartByID(finder.Chart.ID);
13084
+ this.Draw();
13085
+ }
13086
+ }
13087
+ }
13088
+ break;
13089
+ case JSCHART_MENU_ID.CMD_SHOW_DRAWTOOL_ID:
13090
+ var option={Name:'画图工具', Top:this.Frame.ChartBorder.Top };
13091
+ var extendChart=this.CreateExtendChart(option.Name, option); //创建扩展图形
13092
+ this.SetSizeChange(true);
13093
+ this.Draw();
13094
+ break;
13095
+ case JSCHART_MENU_ID.CMD_HIDE_DRAWTOOL_ID:
13096
+ var drawTools=this.GetExtendChartByClassName('DrawToolsButton');
13097
+ if (drawTools)
13098
+ {
13099
+ var toolsWidth=drawTools.Chart.Width;
13100
+ var toolsIndex=parseInt(drawTools.Index);
13101
+ for(var i=toolsIndex+1; i<this.ExtendChartPaint.length; ++i) //在画图工具后面创建的需要减去工具的宽度
13102
+ {
13103
+ var item=this.ExtendChartPaint[i];
13104
+ if (item.ClassName=='StockChip')
13105
+ {
13106
+ item.Left-=toolsWidth;
13107
+ }
13108
+ }
13109
+ this.DeleteExtendChart(drawTools);
13110
+ this.Frame.ChartBorder.Right-=toolsWidth;
13111
+ this.SetSizeChange(true);
13112
+ this.Draw();
13113
+ }
13114
+ break;
13115
+ case JSCHART_MENU_ID.CMD_SHOW_STOCKCHIP_ID:
13116
+ var option={Name:'筹码分布', ShowType:1, Width:230 };
13117
+ var extendChart=this.CreateExtendChart(option.Name, option); //创建扩展图形
13118
+ this.SetSizeChange(true);
13119
+ this.Draw();
13120
+ break;
13121
+ case JSCHART_MENU_ID.CMD_HIDE_STOCKCHIP_ID:
13122
+ var StockChip=chart.GetExtendChartByClassName('StockChip');
13123
+ if (StockChip)
13124
+ {
13125
+ var chipWidth=StockChip.Chart.Width;
13126
+ var chipIndex=parseInt(StockChip.Index);
13127
+ for(var i=chipIndex+1; i<this.ExtendChartPaint.length; ++i) //在筹码后面创建的需要筹码的宽度
13128
+ {
13129
+ var item=this.ExtendChartPaint[i];
13130
+ if (item.ClassName=='DrawToolsButton')
13131
+ {
13132
+ item.Left-=chipWidth;
13133
+ }
13134
+ }
13135
+ this.DeleteExtendChart(StockChip);
13136
+ this.Frame.ChartBorder.Right-=chipWidth;
13137
+ this.SetSizeChange(true);
13138
+ this.Draw();
13139
+ }
13140
+ break;
13141
+ case JSCHART_MENU_ID.CMD_ENABLE_SELECT_RECT_ID:
13142
+ if (IFrameSplitOperator.IsBool(srcParam))
13143
+ this.EnableSelectRect=srcParam;
13144
+ break;
13145
+ case JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID:
13146
+ if (this.ChangeDayCount && param!=null)
13147
+ this.ChangeDayCount(param);
13148
+ break;
13149
+ case JSCHART_MENU_ID.CMD_SHOW_BEFORE_DATA_ID:
13150
+ if (this.ShowCallAuctionData && IFrameSplitOperator.IsBool(srcParam))
13151
+ this.ShowCallAuctionData({ Left:srcParam, MultiDay:{ Left:srcParam }});
13152
+ break;
13153
+
13154
+ case JSCHART_MENU_ID.CMD_SELECTED_ZOOM_ID:
13155
+ if (this.ShowSelectData && srcParam) this.ShowSelectData(srcParam);
13156
+ break;
13157
+ case JSCHART_MENU_ID.CMD_SELECTED_SUMMARY_ID:
13158
+ var dlg=new KLineSelectRectDialog(this.DivElement);
13159
+ dlg.DoModal(srcParam);
13160
+ break;
13161
+ }
13162
+ }
12941
13163
  }
12942
13164
 
12943
13165
  function GetDevicePixelRatio()
@@ -13035,11 +13257,12 @@ function GetScrollPosition()
13035
13257
  var scrollPos={};
13036
13258
  var scrollTop=0;
13037
13259
  var scrollLeft=0;
13038
- if(document.documentElement && document.documentElement.scrollTop)
13260
+ if (document.documentElement && (document.documentElement.scrollTop || document.documentElement.scrollLeft))
13039
13261
  {
13040
13262
  scrollTop=document.documentElement.scrollTop;
13041
13263
  scrollLeft=document.documentElement.scrollLeft;
13042
- }else if(document.body)
13264
+ }
13265
+ else if(document.body)
13043
13266
  {
13044
13267
  scrollTop=document.body.scrollTop;
13045
13268
  scrollLeft=document.body.scrollLeft;
@@ -48003,7 +48226,8 @@ function FrameButtomToolbarPaint()
48003
48226
  this.Canvas.fillRect(rtBG.Left,rtBG.Top,rtBG.Width,rtBG.Height);
48004
48227
  }
48005
48228
 
48006
- var font=this.TitleFont(rtBG.Height-this.ButtonConfig.Mergin.Top-this.ButtonConfig.Mergin.Bottom);
48229
+ var font=this.GetTitleFont(rtBG.Height-this.ButtonConfig.Mergin.Top-this.ButtonConfig.Mergin.Bottom);
48230
+ var svgFont=this.GetSVGFont(rtBG.Height-this.ButtonConfig.Mergin.Top-this.ButtonConfig.Mergin.Bottom);
48007
48231
  this.Canvas.textBaseline='middle';
48008
48232
  this.Canvas.textAlign='center';
48009
48233
  this.Canvas.font=font;
@@ -48011,9 +48235,23 @@ function FrameButtomToolbarPaint()
48011
48235
  for(var i=0;i<this.AryButton.length;++i)
48012
48236
  {
48013
48237
  var item=this.AryButton[i];
48014
- if (!item.Title) return;
48015
- var textWidth=this.Canvas.measureText(item.Title).width+2;
48016
- var buttonWidth=textWidth+this.ButtonConfig.Mergin.Left+this.ButtonConfig.Mergin.Right;
48238
+ if (!item.Title && !(item.SVGButton && item.SVGButton.Symbol)) return;
48239
+
48240
+ var textWidth=0;
48241
+ if (item.Title)
48242
+ {
48243
+ textWidth=this.Canvas.measureText(item.Title).width+2;
48244
+ }
48245
+
48246
+ var svgButtonWidth=0;
48247
+ if (item.SVGButton && item.SVGButton.Symbol)
48248
+ {
48249
+ svgButtonWidth=this.ButtonConfig.SVG.Size;
48250
+ if (textWidth>0) svgButtonWidth+=this.ButtonConfig.SVG.MerginLeft;
48251
+
48252
+ }
48253
+
48254
+ var buttonWidth=textWidth+svgButtonWidth+this.ButtonConfig.Mergin.Left+this.ButtonConfig.Mergin.Right;
48017
48255
  var rtButton={ Left:xBotton, Top:rtBG.Top, Bottom:rtBG.Bottom, Height:rtBG.Height, Width:buttonWidth };
48018
48256
  rtButton.Right=rtButton.Left+rtButton.Width;
48019
48257
 
@@ -48050,12 +48288,50 @@ function FrameButtomToolbarPaint()
48050
48288
  this.Canvas.stroke();
48051
48289
  }
48052
48290
 
48053
- this.Canvas.fillStyle=titleColor;
48054
- var xText=rtButton.Left+rtButton.Width/2; //居中
48055
- var yText=rtButton.Top+this.ButtonConfig.Mergin.Top+(rtButton.Height-this.ButtonConfig.Mergin.Top-this.ButtonConfig.Mergin.Bottom)/2;
48056
- this.Canvas.fillText(item.Title,xText,yText);
48291
+ if (item.Title)
48292
+ {
48293
+ this.Canvas.fillStyle=titleColor;
48294
+ var xText=rtButton.Left+(rtButton.Width-svgButtonWidth)/2; //居中
48295
+ var yText=rtButton.Top+this.ButtonConfig.Mergin.Top+(rtButton.Height-this.ButtonConfig.Mergin.Top-this.ButtonConfig.Mergin.Bottom)/2;
48296
+ this.Canvas.fillText(item.Title,xText,yText);
48297
+ }
48298
+
48299
+
48300
+ var rtSVG=null;
48301
+ if (item.SVGButton && item.SVGButton.Symbol)
48302
+ {
48303
+ this.Canvas.font=svgFont;
48304
+ this.Canvas.fillStyle=titleColor;
48305
+ var xText=rtButton.Right-this.ButtonConfig.SVG.Size/2-this.ButtonConfig.Mergin.Right;
48306
+ this.Canvas.fillText(item.SVGButton.Symbol,xText,yText);
48307
+ this.Canvas.font=font;
48308
+
48309
+ rtSVG={Left:rtButton.Right-this.ButtonConfig.Mergin.Right-this.ButtonConfig.SVG.Size, Top:rtButton.Top, Width:this.ButtonConfig.SVG.Size, Height:this.ButtonConfig.SVG.Size};
48310
+ rtSVG.Right=rtSVG.Left+rtSVG.Width;
48311
+ rtSVG.Bottom=rtSVG.Top+rtSVG.Height;
48312
+ }
48313
+
48314
+ //{ Rect:rtButton, ID:item.ID, Data:item, RectSVG:rtSVG }
48315
+ if (textWidth>0 && svgButtonWidth>0)
48316
+ {
48317
+ var rtText={ Left:rtButton.Left, Top:rtButton.Top, Bottom:rtButton.Bottom };
48318
+ rtText.Right=rtText.Left+textWidth+this.ButtonConfig.Mergin.Left+this.ButtonConfig.SVG.MerginLeft/2;
48319
+ var cacheItem={ Rect:rtText, ID:item.ID, Data:item, RectCell:rtButton, ButtonType:0 };
48320
+ this.AryRectButton.push(cacheItem);
48321
+
48322
+ var rtSVG={Left:rtText.Right, Right:rtButton.Right, Top:rtButton.Top, Bottom:rtButton.Bottom };
48323
+ var cacheItem={ Rect:rtSVG, ID:item.ID, Data:item, RectCell:rtButton, ButtonType:1 };
48324
+ this.AryRectButton.push(cacheItem);
48325
+ }
48326
+ else
48327
+ {
48328
+ var cacheItem={ Rect:rtButton, ID:item.ID, Data:item, RectCell:rtButton }; //RectCell 全部的大小
48329
+ if (textWidth>0) cacheItem.ButtonType=0;
48330
+ else if (svgButtonWidth>0) cacheItem.ButtonType=1;
48331
+ this.AryRectButton.push(cacheItem);
48332
+ }
48333
+
48057
48334
 
48058
- this.AryRectButton.push({ Rect:rtButton, ID:item.ID, Data:item });
48059
48335
 
48060
48336
  xBotton+=buttonWidth+1;
48061
48337
  }
@@ -48084,13 +48360,22 @@ function FrameButtomToolbarPaint()
48084
48360
  return null;
48085
48361
  }
48086
48362
 
48087
- this.TitleFont=function(height)
48363
+ this.GetTitleFont=function(height)
48088
48364
  {
48089
48365
  var config=this.ButtonConfig.Font;
48090
- var fontSize=height;
48366
+ var fontSize=height*GetDevicePixelRatio();
48091
48367
  if (IFrameSplitOperator.IsPlusNumber(config.Size)) fontSize=config.Size;
48092
48368
 
48093
- var font=`${fontSize*GetDevicePixelRatio()}px ${config.Family}`;
48369
+ var font=`${fontSize}px ${config.Family}`;
48370
+ return font;
48371
+ }
48372
+
48373
+ this.GetSVGFont=function(height)
48374
+ {
48375
+ var config=this.ButtonConfig.SVG;
48376
+ var fontSize=height*GetDevicePixelRatio();
48377
+ if (IFrameSplitOperator.IsPlusNumber(config.Size)) fontSize=config.Size;
48378
+ var font=`${fontSize}px ${config.Family}`;
48094
48379
  return font;
48095
48380
  }
48096
48381
 
@@ -48103,7 +48388,7 @@ function FrameButtomToolbarPaint()
48103
48388
  if (x>rect.Left && x<rect.Right && y>rect.Top && y<rect.Bottom)
48104
48389
  {
48105
48390
  var frame=this.GetFrame();
48106
- var result={ ID:item.Data.ID, Rect:rect, FrameID:this.FrameID, Frame:frame, Data:item.Data };
48391
+ var result={ ID:item.Data.ID, Rect:rect, FrameID:this.FrameID, Frame:frame, Data:item.Data, ButtonType:item.ButtonType, RectCell:item.RectCell, };
48107
48392
  return result;
48108
48393
  }
48109
48394
  }
@@ -57444,7 +57729,7 @@ function IChartDrawPicture()
57444
57729
  if (option.LineWidth>0) this.LineWidth=option.LineWidth;
57445
57730
  if (option.AreaColor) this.AreaColor=option.AreaColor;
57446
57731
  if (option.PointColor) this.PointColor=option.PointColor;
57447
- if (option.MoveOnPointColor) this.SelectPointColor=option.PointColor;
57732
+ if (option.MoveOnPointColor) this.MoveOnPointColor=option.MoveOnPointColor;
57448
57733
  if (option.PointRadius) this.PointRadius=option.PointRadius;
57449
57734
  if (IFrameSplitOperator.IsNumber(option.SquareSize)) this.SquareSize=option.SquareSize;
57450
57735
  if (IFrameSplitOperator.IsBool(option.IsShowPoint)) this.IsShowPoint=option.IsShowPoint;
@@ -57643,8 +57928,8 @@ function IChartDrawPicture()
57643
57928
  for(var i=0; i<this.Point.length; ++i)
57644
57929
  {
57645
57930
  var item=this.Point[i];
57646
- var xValue=parseInt(this.Frame.GetXData(item.Y));
57647
- var yValue=this.Frame.GetYData(item.X);
57931
+ var xValue=parseInt(this.Frame.GetXData(item.Y,false));
57932
+ var yValue=this.Frame.GetYData(item.X,false);
57648
57933
 
57649
57934
  var valueItem={ XValue:xValue, YValue:yValue };
57650
57935
  var minuteItem=data.Data[xValue];
@@ -57658,8 +57943,8 @@ function IChartDrawPicture()
57658
57943
  for(var i=0; i<this.Point.length; ++i)
57659
57944
  {
57660
57945
  var item=this.Point[i];
57661
- var xValue=parseInt(this.Frame.GetXData(item.X));
57662
- var yValue=this.Frame.GetYData(item.Y);
57946
+ var xValue=parseInt(this.Frame.GetXData(item.X,false));
57947
+ var yValue=this.Frame.GetYData(item.Y,false);
57663
57948
 
57664
57949
  if (xValue>=data.Data.length) //超过当前数据,直接读固定时间
57665
57950
  {
@@ -57734,7 +58019,7 @@ function IChartDrawPicture()
57734
58019
  }
57735
58020
 
57736
58021
  data.FindDataIndexByDateTime(aryDateTime);
57737
- for(var i in aryDateTime)
58022
+ for(var i=0; i<aryDateTime.length; ++i)
57738
58023
  {
57739
58024
  var findItem=aryDateTime[i];
57740
58025
  var valueItem=this.Value[i];
@@ -57742,6 +58027,17 @@ function IChartDrawPicture()
57742
58027
  }
57743
58028
  }
57744
58029
 
58030
+ //重置X索引数据
58031
+ this.ResetXValue=function()
58032
+ {
58033
+ for(var i=0; i<this.Value.length; ++i)
58034
+ {
58035
+ var item=this.Value[i];
58036
+ item.XValue=null;
58037
+ }
58038
+ return true;
58039
+ }
58040
+
57745
58041
  //xStep,yStep 移动的偏移量
57746
58042
  this.Move=function(xStep,yStep)
57747
58043
  {
@@ -57867,6 +58163,8 @@ function IChartDrawPicture()
57867
58163
  for(var i=0; i<this.Value.length; ++i)
57868
58164
  {
57869
58165
  var item=this.Value[i];
58166
+ if (!IFrameSplitOperator.IsNumber(item.XValue)) return null; //无效索引 不显示
58167
+
57870
58168
  var dataIndex=item.XValue-data.DataOffset;
57871
58169
  if (dataIndex<0 || dataIndex>=showCount) ++invaildX;
57872
58170
 
@@ -58937,7 +59235,7 @@ function ChartDrawPictureLine()
58937
59235
  if (this.IsFrameMinSize()) return;
58938
59236
  if (!this.IsShow) return;
58939
59237
 
58940
- var drawPoint=this.CalculateDrawPoint( {IsCheckX:true, IsCheckY:true} );
59238
+ var drawPoint=this.CalculateDrawPoint( {IsCheckX:true, IsCheckY:false} );
58941
59239
  if (!drawPoint) return;
58942
59240
  if (drawPoint.length!=2) return;
58943
59241
 
@@ -59557,8 +59855,9 @@ function ChartDrawHLine()
59557
59855
 
59558
59856
  this.Button=
59559
59857
  {
59560
- CloseIcon: { Text:'\ue62b', Color:'rgb(255,255,255)', Family:"iconfont", Size:16 },
59561
- SettingIcon: { Text:'\ue623',Color:'rgb(255,255,255)', Family:"iconfont", Size:16 }
59858
+ CloseIcon: { Text:'\ue62b', Color:'rgb(255,255,255)', Family:"iconfont", Size:16, ID:JSCHART_BUTTON_ID.DRAW_PICTURE_DELETE, TooltipText:null },
59859
+ SettingIcon: { Text:'\ue623',Color:'rgb(255,255,255)', Family:"iconfont", Size:16, ID:JSCHART_BUTTON_ID.DRAW_PICTURE_SETTING, TooltipText:null }
59860
+ //修改ID, Text , TooltipText 可以外部定制按钮
59562
59861
  }
59563
59862
 
59564
59863
  this.AryButton=[];
@@ -59752,6 +60051,7 @@ function ChartDrawHLine()
59752
60051
  this.CalculateButtonSize();
59753
60052
  this.DrawValueText(drawPoint[0].Y, rtDraw, labInfo);
59754
60053
  if (labInfo) this.DrawRightLab(labInfo, rtDraw);
60054
+ if (labInfo) this.DrawCustomHLine(labInfo, drawPoint[0].Y);
59755
60055
  }
59756
60056
 
59757
60057
 
@@ -59891,6 +60191,53 @@ function ChartDrawHLine()
59891
60191
  }
59892
60192
  }
59893
60193
 
60194
+ this.DrawCustomHLine=function(labInfo, yLine)
60195
+ {
60196
+ if (!labInfo) return;
60197
+ if (!IFrameSplitOperator.IsNonEmptyArray(labInfo.AryLine)) return;
60198
+
60199
+ var left=this.Frame.ChartBorder.GetLeft();
60200
+ var right=this.Frame.ChartBorder.GetRight();
60201
+ var pixelRatio=GetDevicePixelRatio();
60202
+
60203
+ var yMax=yLine, yMin=yLine;
60204
+ for(var i=0;i<labInfo.AryLine.length;++i)
60205
+ {
60206
+ var item=labInfo.AryLine[i];
60207
+ if (!IFrameSplitOperator.IsNumber(item.Value)) continue;
60208
+
60209
+ var y=this.Frame.GetYFromData(item.Value);
60210
+ var yFixed=ToFixedPoint(y);
60211
+ var xRight=right;
60212
+ if (IFrameSplitOperator.IsNumber(item.Width)) xRight=left+item.Width*pixelRatio;
60213
+ if (item.Color) this.Canvas.strokeStyle=item.Color;
60214
+ else this.Canvas.strokeStyle=this.LineColor;
60215
+
60216
+ this.Canvas.beginPath();
60217
+ this.Canvas.moveTo(left,yFixed);
60218
+ this.Canvas.lineTo(xRight,yFixed);
60219
+ this.Canvas.stroke();
60220
+
60221
+ if (yMax<yFixed) yMax=yFixed;
60222
+ if (yMin>yFixed) yMin=yFixed;
60223
+ }
60224
+
60225
+ if (yMax!=yMin && labInfo.VLine)
60226
+ {
60227
+ var item=labInfo.VLine;
60228
+ var x=left+20*pixelRatio;
60229
+ if (IFrameSplitOperator.IsNumber(item.XOffset)) x=left+item.XOffset*pixelRatio;
60230
+ x=ToFixedPoint(x);
60231
+ if (item.Color) this.Canvas.strokeStyle=item.Color;
60232
+ else this.Canvas.strokeStyle=this.LineColor;
60233
+
60234
+ this.Canvas.beginPath();
60235
+ this.Canvas.moveTo(x,yMax);
60236
+ this.Canvas.lineTo(x,yMin);
60237
+ this.Canvas.stroke();
60238
+ }
60239
+ }
60240
+
59894
60241
  this.DrawValueText=function(y, rtDraw, labInfo)
59895
60242
  {
59896
60243
  var left=this.Frame.ChartBorder.GetLeft();
@@ -60035,7 +60382,7 @@ function ChartDrawHLine()
60035
60382
  this.Canvas.fillStyle=icon.Color;
60036
60383
  this.Canvas.fillText(this.Button.SettingIcon.Text,xCenter,yCenter);
60037
60384
 
60038
- this.AryButton.push({Rect:rtButton, ID:JSCHART_BUTTON_ID.DRAW_PICTURE_SETTING});
60385
+ this.AryButton.push({Rect:rtButton, ID:icon.ID, TooltipText:icon.TooltipText});
60039
60386
 
60040
60387
  /*
60041
60388
  if (this.ColseButtonSize>0)
@@ -60067,7 +60414,7 @@ function ChartDrawHLine()
60067
60414
  this.Canvas.fillStyle=icon.Color;
60068
60415
  this.Canvas.fillText(this.Button.CloseIcon.Text,xCenter,yCenter);
60069
60416
 
60070
- this.AryButton.push({Rect:rtButton,ID:JSCHART_BUTTON_ID.DRAW_PICTURE_DELETE });
60417
+ this.AryButton.push({Rect:rtButton,ID:icon.ID, TooltipText:icon.TooltipText });
60071
60418
 
60072
60419
  left=rtButton.Right;
60073
60420
  }
@@ -68770,12 +69117,14 @@ function JSChartResource()
68770
69117
  BorderColor:"rgb(204,204,204)",
68771
69118
  Button:
68772
69119
  {
68773
- Font:{ Family:"微软雅黑" },
69120
+ Font:{ Family:"微软雅黑", Size:12*GetDevicePixelRatio() },
68774
69121
  TitleColor: { Selected:"rgb(255,255,255)", Default:"rgb(125,125,125)", MoveOn:"rgb(234,85,4)" },
68775
69122
  BGColor: { Selected:"rgb(234,85,4)", Default:"rgb(235,235,235)", MoveOn:"rgb(242,242,242)" },
68776
69123
  BorderColor:"rgb(204,204,204)",
68777
69124
 
68778
- Mergin: { Left:5*GetDevicePixelRatio(), Right:5*GetDevicePixelRatio(), Top:4*GetDevicePixelRatio(), Bottom:2*GetDevicePixelRatio() }
69125
+ Mergin: { Left:5*GetDevicePixelRatio(), Right:5*GetDevicePixelRatio(), Top:4*GetDevicePixelRatio(), Bottom:2*GetDevicePixelRatio() },
69126
+
69127
+ SVG:{ Family:"iconfont", Size:12*GetDevicePixelRatio(), MerginLeft:4*GetDevicePixelRatio() }
68779
69128
  }
68780
69129
  }
68781
69130
 
@@ -69794,6 +70143,15 @@ function JSChartResource()
69794
70143
  if (IFrameSplitOperator.IsNumber(item.Top)) destItem.Top=item.Top;
69795
70144
  if (IFrameSplitOperator.IsNumber(item.Bottom)) destItem.Bottom=item.Bottom;
69796
70145
  }
70146
+
70147
+ if (button.SVG)
70148
+ {
70149
+ var item=button.SVG;
70150
+ var destItem=this.FrameButtomToolbar.Button.SVG;
70151
+ if (IFrameSplitOperator.IsNumber(item.Size)) destItem.Size=item.Size;
70152
+ if (IFrameSplitOperator.IsNumber(item.MerginLeft)) destItem.MerginLeft=item.MerginLeft;
70153
+ if (item.Family) destItem.Family=item.Family;
70154
+ }
69797
70155
  }
69798
70156
 
69799
70157
  }
@@ -72056,10 +72414,9 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
72056
72414
  isShowMenu=data.IsShowMenu;
72057
72415
  }
72058
72416
 
72059
-
72060
- if (isShowMenu && this.SelectRectRightMenu)
72417
+ if (isShowMenu)
72061
72418
  {
72062
- e.data=
72419
+ var data=
72063
72420
  {
72064
72421
  Chart:this,
72065
72422
  X:x,
@@ -72067,8 +72424,9 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
72067
72424
  SelectData:selectData, //区间选择的数据
72068
72425
  RectSelectPaint:paint //区间选择背景
72069
72426
  };
72427
+ e.data=data;
72070
72428
 
72071
- this.SelectRectRightMenu.DoModal(e);
72429
+ this.PopupSelectRectMenuV2(data, e);
72072
72430
  }
72073
72431
  }
72074
72432
 
@@ -72103,7 +72461,6 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
72103
72461
  this.ShowSelectData=function(selectData)
72104
72462
  {
72105
72463
  this.HideSelectRect();
72106
- if (this.SelectRectRightMenu) this.SelectRectRightMenu.Hide();
72107
72464
 
72108
72465
  JSConsole.Chart.Log('[KLineChartContainer::ShowSelectData] selectData', selectData);
72109
72466
  var dataOffset=selectData.Start;
@@ -72188,9 +72545,9 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
72188
72545
  isShowMenu=data.IsShowMenu;
72189
72546
  }
72190
72547
 
72191
- if (isShowMenu && this.SelectRectRightMenu)
72548
+ if (isShowMenu)
72192
72549
  {
72193
- e.data=
72550
+ var data=
72194
72551
  {
72195
72552
  Chart:this,
72196
72553
  X:corssCursor.LastPoint.X/pixelTatio,
@@ -72198,7 +72555,9 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
72198
72555
  SelectData:selectData, //区间选择的数据
72199
72556
  RectSelectPaint:paint //区间选择背景
72200
72557
  };
72201
- this.SelectRectRightMenu.DoModal(e);
72558
+ e.data=data
72559
+
72560
+ this.PopupSelectRectMenuV2(data, e);
72202
72561
  }
72203
72562
  }
72204
72563
 
@@ -76105,32 +76464,315 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
76105
76464
  }
76106
76465
  }
76107
76466
 
76108
-
76109
76467
  //注册鼠标右键事件
76110
76468
  this.OnRightMenu=function(x,y,e)
76111
76469
  {
76112
76470
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
76113
- if (this.RightMenu)
76114
- {
76115
- var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
76116
- e.data={ Chart:this, FrameID:frameId };
76117
- this.RightMenu.DoModal(e);
76118
- }
76119
-
76471
+ var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
76472
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
76473
+
76120
76474
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
76121
76475
  if (event)
76122
76476
  {
76123
- var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
76124
76477
  var data={ X:x, Y:y, Event:e, FrameID:frameId };
76125
76478
  event.Callback(event,data,this);
76126
76479
  }
76127
76480
  }
76128
76481
 
76482
+ //右键菜单数据
76483
+ this.GetRightMenuData=function(frameID)
76484
+ {
76485
+ var windowCount=this.Frame.SubFrame.length; //窗口个数
76486
+ var klineChart=this.ChartPaint[0];
76487
+ var priceGap=klineChart.PriceGap; //缺口配置信息
76488
+ var coordinateType=null, yCoordinateType=null; //坐标类型
76489
+ var mainFrame=null;
76490
+ if (this.Frame.SubFrame[0] && this.Frame.SubFrame[0].Frame) mainFrame=this.Frame.SubFrame[0].Frame;
76491
+ if (mainFrame)
76492
+ {
76493
+ coordinateType=mainFrame.CoordinateType;
76494
+ if (mainFrame.YSplitOperator) yCoordinateType=mainFrame.YSplitOperator.CoordinateType;
76495
+ }
76496
+
76497
+ var aryKLineInfo=[]; //信息地雷
76498
+ for(var i=0;i<this.ChartInfo.length;++i)
76499
+ {
76500
+ var item=this.ChartInfo[i];
76501
+ if (item && item.ClassName) aryKLineInfo.push(item.ClassName);
76502
+ }
76503
+
76504
+ var aryOverlaySymbol=[]; //叠加的股票列表
76505
+ for(var i=0; i<this.OverlayChartPaint.length; ++i)
76506
+ {
76507
+ var item=this.OverlayChartPaint[i];
76508
+ if (item && item.Symbol) aryOverlaySymbol.push(item.Symbol)
76509
+ }
76510
+
76511
+ var bBGSpit=false, bShowDrawTool=false, bShowStockChip=false;
76512
+ if (this.GetExtendChartByClassName("SessionBreaksPaint")) bBGSpit=true;
76513
+ if (this.GetExtendChartByClassName('DrawToolsButton')) bShowDrawTool=true; //画图工具
76514
+ if (this.GetExtendChartByClassName('StockChip')) bShowStockChip=true; //筹码
76515
+
76516
+ var aryMenu=
76517
+ [
76518
+ {
76519
+ Name:"分析周期",
76520
+ SubMenu:
76521
+ [
76522
+ { Name:"日线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[0] }, Checked:this.Period==0 },
76523
+ { Name:"周线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[1] }, Checked:this.Period==1 },
76524
+ { Name:"双周线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[21]}, Checked:this.Period==21 },
76525
+ { Name:"月线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[2]}, Checked:this.Period==2 },
76526
+ { Name:"季线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[9]}, Checked:this.Period==9 },
76527
+ { Name:"半年", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[22]}, Checked:this.Period==22 },
76528
+ { Name:"年线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[3]}, Checked:this.Period==3 },
76529
+ { Name:"1分", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[4]}, Checked:this.Period==4 },
76530
+ { Name:"5分", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[5]}, Checked:this.Period==5 },
76531
+ { Name:"15分", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[6]}, Checked:this.Period==6 },
76532
+ { Name:"30分", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[7]}, Checked:this.Period==7 },
76533
+ { Name:"60分", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[8]}, Checked:this.Period==8 },
76534
+ { Name:"2小时", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[11]}, Checked:this.Period==11 },
76535
+ { Name:"4小时", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[12]}, Checked:this.Period==12 },
76536
+ { Name:"分笔", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[10]}, Checked:this.Period==10 },
76537
+ { Name:"自定义周期:3分钟", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[20003]}, Checked:this.Period==20003 },
76538
+ { Name:"自定义周期:35分钟", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[20035]}, Checked:this.Period==20035 },
76539
+ { Name:"自定义周期:8日", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[40008]}, Checked:this.Period==40008 },
76540
+ ]
76541
+ },
76542
+ {
76543
+ Name:"指标切换",
76544
+ SubMenu:
76545
+ [
76546
+ { Name:"均线", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "均线"]}},
76547
+ { Name:"BOLL", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "BOLL"]}},
76548
+ { Name:"MACD", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "MACD"]}},
76549
+ { Name:"KDJ", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "KDJ"]}},
76550
+ { Name:"VOL", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "VOL"]}},
76551
+ { Name:"RSI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "RSI"]}},
76552
+ { Name:"BRAR", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "BRAR"]}},
76553
+ { Name:"WR", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "WR"]}},
76554
+ ]
76555
+ },
76556
+ {
76557
+ Name:"五彩K线",
76558
+ SubMenu:
76559
+ [
76560
+ { Name:"十字星", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-十字星"]}},
76561
+ { Name:"早晨之星", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-早晨之星"]}},
76562
+ { Name:"垂死十字", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-垂死十字"]}},
76563
+ { Name:"三只乌鸦", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-三只乌鸦"]}},
76564
+ { Name:"光脚阴线", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-光脚阴线"]}},
76565
+ { Name:"黄昏之星", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-黄昏之星"]}},
76566
+ ]
76567
+
76568
+ },
76569
+ {
76570
+ Name:"专家系统",
76571
+ SubMenu:
76572
+ [
76573
+ { Name:"BIAS", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-BIAS"]}},
76574
+ { Name:"CCI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-CCI"]}},
76575
+ { Name:"DMI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-DMI"]}},
76576
+ { Name:"KD", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-KD"]}},
76577
+ { Name:"BOLL", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-BOLL"]}},
76578
+ { Name:"KDJ", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-KDJ"]}},
76579
+ ]
76580
+ },
76581
+ {
76582
+ Name:"信息地雷",
76583
+ SubMenu:
76584
+ [
76585
+ { Name:"公告", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["公告", !aryKLineInfo.includes("AnnouncementInfo")]}, Checked:aryKLineInfo.includes("AnnouncementInfo") },
76586
+ { Name:"业绩预告", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["业绩预告", !aryKLineInfo.includes("PforecastInfo")]}, Checked:aryKLineInfo.includes("PforecastInfo") },
76587
+ { Name:"调研", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["调研", !aryKLineInfo.includes("ResearchInfo") ]}, Checked:aryKLineInfo.includes("ResearchInfo") },
76588
+ { Name:"大宗交易", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["大宗交易", !aryKLineInfo.includes("BlockTrading")]}, Checked:aryKLineInfo.includes("BlockTrading") },
76589
+ { Name:"龙虎榜", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["龙虎榜", !aryKLineInfo.includes("TradeDetail")]}, Checked:aryKLineInfo.includes("TradeDetail") },
76590
+ { Name:"互动易", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["互动易", !aryKLineInfo.includes("InvestorInfo")]}, Checked:aryKLineInfo.includes("InvestorInfo") },
76591
+ ]
76592
+ },
76593
+ {
76594
+ Name:"缺口提示",
76595
+ SubMenu:
76596
+ [
76597
+ { Name:"显示1个缺口", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_PRICE_GAP_ID, Args:[true, 1]}, Checked:(priceGap.Enable==true && priceGap.Count==1) },
76598
+ { Name:"显示2个缺口", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_PRICE_GAP_ID, Args:[true, 2]}, Checked:(priceGap.Enable==true && priceGap.Count==2) },
76599
+ { Name:"显示3个缺口", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_PRICE_GAP_ID, Args:[true, 3]}, Checked:(priceGap.Enable==true && priceGap.Count==3) },
76600
+ { Name:"隐藏缺口", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_PRICE_GAP_ID, Args:[false]}, Checked:priceGap.Enable==false },
76601
+ ]
76602
+ },
76603
+ {
76604
+ Name:"叠加品种",
76605
+ SubMenu:
76606
+ [
76607
+ { Name:"上证指数", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["000001.sh", !aryOverlaySymbol.includes("000001.sh")]}, Checked:aryOverlaySymbol.includes("000001.sh") },
76608
+ { Name:"深证成指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399001.sz", !aryOverlaySymbol.includes("399001.sz")]}, Checked:aryOverlaySymbol.includes("399001.sz") },
76609
+ { Name:"中小板指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399005.sz", !aryOverlaySymbol.includes("399005.sz")]}, Checked:aryOverlaySymbol.includes("399005.sz") },
76610
+ { Name:"创业板指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399006.sz", !aryOverlaySymbol.includes("399006.sz")]}, Checked:aryOverlaySymbol.includes("399006.sz") },
76611
+ { Name:"沪深300", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["000300.sh", !aryOverlaySymbol.includes("000300.sh")]}, Checked:aryOverlaySymbol.includes("000300.sh")},
76612
+ ]
76613
+ },
76614
+ {
76615
+ Name:"主图线型",
76616
+ SubMenu:
76617
+ [
76618
+ { Name:"K线(空心阳线)", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[3]} },
76619
+ { Name:"K线(实心阳线)", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[0]} },
76620
+ { Name:"美国线", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[2, true, { IsThinAKBar:false }]} },
76621
+ { Name:"美国线(细)", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[2, true, { IsThinAKBar:true }]} },
76622
+ { Name:"收盘线", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[1]} },
76623
+ { Name:"收盘面积", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[4]} },
76624
+ { Name:"K线(空心阳线阴线)", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[6]} },
76625
+ { Name:"Heikin Ashi", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[11]} },
76626
+ { Name:"Line Break", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[12]} },
76627
+ { Name:"High-low", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[13]} },
76628
+ { Name:"HLC Area", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[15]} },
76629
+ ]
76630
+ },
76631
+ {
76632
+ Name:"坐标类型",
76633
+ SubMenu:
76634
+ [
76635
+ { Name:"反转坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ IsReverse:coordinateType==0 }]}, Checked:coordinateType==1 },
76636
+ { Name:JSPopMenu.SEPARATOR_LINE_NAME },
76637
+
76638
+ { Name:"普通坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:0 }]}, Checked:yCoordinateType==0 },
76639
+ { Name:"百分比坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:1 }]}, Checked:yCoordinateType==1 },
76640
+ { Name:"对数坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:2 }]}, Checked:yCoordinateType==2 },
76641
+ { Name:"等比坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:3 }]}, Checked:yCoordinateType==3 },
76642
+ { Name:"等分坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:4 }]}, Checked:yCoordinateType==4 },
76643
+ { Name:"黄金分割", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:5 }]}, Checked:yCoordinateType==5},
76644
+
76645
+ ]
76646
+ },
76647
+ {
76648
+ Name:"指标窗口个数",
76649
+ SubMenu:
76650
+ [
76651
+ { Name:"1个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[2]}, Checked:2==windowCount },
76652
+ { Name:"2个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[3]}, Checked:3==windowCount },
76653
+ { Name:"3个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[4]}, Checked:4==windowCount },
76654
+ { Name:"4个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[5]}, Checked:5==windowCount },
76655
+ { Name:"5个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[6]}, Checked:6==windowCount },
76656
+ ]
76657
+ },
76658
+ {
76659
+ Name:"其他设置",
76660
+ SubMenu:
76661
+ [
76662
+
76663
+ { Name:"禁止拖拽", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_DRAG_MODE_ID, Args:[0]}, Checked:0==this.DragMode },
76664
+ { Name:"启动拖拽", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_DRAG_MODE_ID, Args:[1]}, Checked:1==this.DragMode },
76665
+ { Name:"区间选择", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_DRAG_MODE_ID, Args:[2]}, Checked:2==this.DragMode },
76666
+ { Name:JSPopMenu.SEPARATOR_LINE_NAME },
76667
+
76668
+ { Name:"背景分割", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_BG_SPLIT_ID, Args:[!bBGSpit]}, Checked:bBGSpit},
76669
+
76670
+ { Name:"画图工具", Data:{ ID:bShowDrawTool?JSCHART_MENU_ID.CMD_HIDE_DRAWTOOL_ID:JSCHART_MENU_ID.CMD_SHOW_DRAWTOOL_ID, Args:[]}, Checked:bShowDrawTool},
76671
+
76672
+ { Name:"移动筹码图", Data:{ ID:bShowStockChip?JSCHART_MENU_ID.CMD_HIDE_STOCKCHIP_ID:JSCHART_MENU_ID.CMD_SHOW_STOCKCHIP_ID, Args:[]}, Checked:bShowStockChip},
76673
+ ]
76674
+ }
76675
+ ];
76676
+
76677
+ //复权
76678
+ if(!MARKET_SUFFIX_NAME.IsSHSZIndex(this.Symbol) && !MARKET_SUFFIX_NAME.IsBIT(this.Symbol))
76679
+ {
76680
+ var rightMenu=
76681
+ {
76682
+ Name:"复权处理",
76683
+ SubMenu:
76684
+ [
76685
+ { Name:"不复权", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_RIGHT_ID, Args:[0]}, Checked:0==this.Right },
76686
+ { Name:"前复权", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_RIGHT_ID, Args:[1]}, Checked:1==this.Right },
76687
+ { Name:"后复权", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_RIGHT_ID, Args:[2]}, Checked:2==this.Right }
76688
+ ]
76689
+ };
76690
+
76691
+ aryMenu.splice(1,0,rightMenu);
76692
+ }
76693
+
76694
+ //删除菜单
76695
+ for(var i=0;i<aryMenu.length;++i)
76696
+ {
76697
+ var item=aryMenu[i];
76698
+ if (item.Name=="五彩K线")
76699
+ {
76700
+ if (this.ColorIndex)
76701
+ {
76702
+ item.SubMenu.push({ Name:JSPopMenu.SEPARATOR_LINE_NAME });
76703
+ item.SubMenu.push({ Name:"删除五彩K线", Data:{ ID: JSCHART_MENU_ID.CMD_DELETE_COLOR_INDEX_ID} });
76704
+ }
76705
+ }
76706
+ else if (item.Name=="专家系统")
76707
+ {
76708
+ if (this.TradeIndex)
76709
+ {
76710
+ item.SubMenu.push({ Name:JSPopMenu.SEPARATOR_LINE_NAME });
76711
+ item.SubMenu.push({ Name:"删除专家系统", Data:{ ID: JSCHART_MENU_ID.CMD_DELETE_TRADE_INDEX_ID} });
76712
+ }
76713
+ }
76714
+ else if (item.Name=="叠加品种")
76715
+ {
76716
+ for(var j=0;j<item.SubMenu.length;++j)
76717
+ {
76718
+ if (item.SubMenu[j].Checked)
76719
+ {
76720
+ item.SubMenu.push({ Name:JSPopMenu.SEPARATOR_LINE_NAME });
76721
+ item.SubMenu.push({ Name:"取消叠加", Data:{ ID: JSCHART_MENU_ID.CMD_DELETE_ALL_OVERLAY_SYMBOL_ID} });
76722
+ break;
76723
+ }
76724
+ }
76725
+ }
76726
+ else if (item.Name=="信息地雷")
76727
+ {
76728
+ for(var j=0;j<item.SubMenu.length;++j)
76729
+ {
76730
+ if (item.SubMenu[j].Checked)
76731
+ {
76732
+ item.SubMenu.push({ Name:JSPopMenu.SEPARATOR_LINE_NAME });
76733
+ item.SubMenu.push({ Name:"删除所有", Data:{ ID: JSCHART_MENU_ID.CMD_DELETE_ALL_KLINE_INFO_ID} });
76734
+ break;
76735
+ }
76736
+ }
76737
+ }
76738
+ }
76739
+
76740
+ return aryMenu;
76741
+ }
76742
+
76743
+ this.PopupRightMenuV2=function(data,e)
76744
+ {
76745
+ if (!this.JSPopMenu) return;
76746
+ var x=data.X, y=data.Y;
76747
+ var frameID=data.FrameID;
76748
+ var menuData={ Menu:this.GetRightMenuData(frameID), Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
76749
+ menuData.ClickCallback=(data)=>{ this.OnClickRightMenu(data); }
76750
+
76751
+ this.PopuMenuByRClick(menuData, x, y);
76752
+ }
76753
+
76754
+ this.PopupSelectRectMenuV2=function(data, e)
76755
+ {
76756
+ var aryMenu=
76757
+ [
76758
+ { Name:"区间统计", Data:{ ID:JSCHART_MENU_ID.CMD_SELECTED_SUMMARY_ID, Args:[e] }},
76759
+ { Name:"区间放大", Data:{ ID:JSCHART_MENU_ID.CMD_SELECTED_ZOOM_ID, Args:[data.SelectData] }}
76760
+ ];
76761
+
76762
+ var menuData={ Menu:aryMenu, Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
76763
+ menuData.ClickCallback=(data)=>{ this.OnClickRightMenu(data); }
76764
+ var x=data.X, y=data.Y;
76765
+ this.PopuMenuByRClick(menuData, x, y);
76766
+ }
76767
+
76129
76768
  //重新加载画图工具(切换股票|周期)
76130
76769
  this.ReloadChartDrawPicture=function()
76131
76770
  {
76132
76771
  this.ChartDrawPicture=[];
76133
- this.ChartDrawStorageCache;
76772
+ if (this.SelectChartDrawPicture) this.SelectChartDrawPicture.IsSelected=false;
76773
+ this.SelectChartDrawPicture=null;
76774
+ this.CurrentChartDrawPicture=null;
76775
+
76134
76776
  if (this.ChartDrawStorage)
76135
76777
  {
76136
76778
  this.ChartDrawStorageCache=this.ChartDrawStorage.GetDrawData( {Symbol:this.Symbol, Period:this.Period} );
@@ -77521,7 +78163,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
77521
78163
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CLICK_EXTENDCHART_BUTTON);
77522
78164
  if (event && event.Callback)
77523
78165
  {
77524
- var data={ Info:button, PreventDefault:false }; //PreventDefault 是否阻止内置的点击处理
78166
+ var data={ Info:button, PreventDefault:false, e:e }; //PreventDefault 是否阻止内置的点击处理
77525
78167
  event.Callback(event,data,this);
77526
78168
  if (data.PreventDefault) return;
77527
78169
  }
@@ -79488,22 +80130,135 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
79488
80130
  //注册鼠标右键事件
79489
80131
  this.OnRightMenu=function(x,y,e)
79490
80132
  {
79491
- if (this.RightMenu)
79492
- {
79493
- var frameId=this.Frame.PtInFrame(x,y);
79494
- e.data={ Chart:this, FrameID:frameId };
79495
- this.RightMenu.DoModal(e);
79496
- }
79497
-
80133
+ var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
80134
+ var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
80135
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
80136
+
79498
80137
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
79499
80138
  if (event)
79500
80139
  {
79501
- var frameId=this.Frame.PtInFrame(x,y);
79502
80140
  var data={ X:x, Y:y, Event:e, FrameID:frameId };
79503
80141
  event.Callback(event,data,this);
79504
80142
  }
79505
80143
  }
79506
80144
 
80145
+ //右键菜单数据
80146
+ this.GetRightMenuData=function(frameID)
80147
+ {
80148
+ var windowCount=this.Frame.SubFrame.length; //窗口个数
80149
+
80150
+ var aryOverlaySymbol=[]; //叠加的股票列表
80151
+ for(var i=0; i<this.OverlayChartPaint.length; ++i)
80152
+ {
80153
+ var item=this.OverlayChartPaint[i];
80154
+ if (item && item.Symbol) aryOverlaySymbol.push(item.Symbol)
80155
+ }
80156
+
80157
+ var bShowDrawTool=false;
80158
+ if (this.GetExtendChartByClassName('DrawToolsButton')) bShowDrawTool=true; //画图工具
80159
+
80160
+ var aryMenu=
80161
+ [
80162
+ {
80163
+ Name:"叠加品种",
80164
+ SubMenu:
80165
+ [
80166
+ { Name:"上证指数", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["000001.sh", !aryOverlaySymbol.includes("000001.sh")]}, Checked:aryOverlaySymbol.includes("000001.sh") },
80167
+ { Name:"深证成指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399001.sz", !aryOverlaySymbol.includes("399001.sz")]}, Checked:aryOverlaySymbol.includes("399001.sz") },
80168
+ { Name:"中小板指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399005.sz", !aryOverlaySymbol.includes("399005.sz")]}, Checked:aryOverlaySymbol.includes("399005.sz") },
80169
+ { Name:"创业板指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399006.sz", !aryOverlaySymbol.includes("399006.sz")]}, Checked:aryOverlaySymbol.includes("399006.sz") },
80170
+ { Name:"沪深300", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["000300.sh", !aryOverlaySymbol.includes("000300.sh")]}, Checked:aryOverlaySymbol.includes("000300.sh")},
80171
+ ]
80172
+ },
80173
+ {
80174
+ Name:"多日分时图",
80175
+ SubMenu:
80176
+ [
80177
+ { Name:"当日分时图", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID, Args:[1]}, Checked:this.DayCount==1 },
80178
+ { Name:"最近2日", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID, Args:[2]}, Checked:this.DayCount==2 },
80179
+ { Name:"最近3日", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID, Args:[3]}, Checked:this.DayCount==3 },
80180
+ { Name:"最近4日", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID, Args:[4]}, Checked:this.DayCount==4 },
80181
+ { Name:"最近5日", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID, Args:[5]}, Checked:this.DayCount==5 },
80182
+ ]
80183
+ },
80184
+ {
80185
+ Name:"指标窗口个数",
80186
+ SubMenu:
80187
+ [
80188
+ { Name:"1个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[2]}, Checked:3==windowCount },
80189
+ { Name:"2个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[3]}, Checked:4==windowCount },
80190
+ { Name:"3个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[4]}, Checked:5==windowCount },
80191
+ { Name:"4个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[5]}, Checked:6==windowCount },
80192
+ { Name:"5个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[6]}, Checked:7==windowCount },
80193
+ ]
80194
+ },
80195
+ {
80196
+ Name:"指标切换",
80197
+ SubMenu:
80198
+ [
80199
+ { Name:"MACD", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "MACD"]}},
80200
+ { Name:"DMI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "DMI"]}},
80201
+ { Name:"DMA", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "DMA"]}},
80202
+ { Name:"BRAR", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "BRAR"]}},
80203
+ { Name:"KDJ", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "KDJ"]}},
80204
+ { Name:"RSI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "RSI"]}},
80205
+ { Name:"WR", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "WR"]}},
80206
+ { Name:"CCI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "CCI"]}},
80207
+ { Name:"TRIX", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "TRIX"]}},
80208
+ ]
80209
+ },
80210
+ {
80211
+ Name:"区间选择",Data:{ ID: JSCHART_MENU_ID.CMD_ENABLE_SELECT_RECT_ID, Args:[!this.EnableSelectRect]}, Checked:this.EnableSelectRect
80212
+ },
80213
+ {
80214
+ Name:"其他设置",
80215
+ SubMenu:
80216
+ [
80217
+ { Name:"画图工具", Data:{ ID:bShowDrawTool?JSCHART_MENU_ID.CMD_HIDE_DRAWTOOL_ID:JSCHART_MENU_ID.CMD_SHOW_DRAWTOOL_ID, Args:[]}, Checked:bShowDrawTool},
80218
+ ]
80219
+ }
80220
+
80221
+ ];
80222
+
80223
+ if (MARKET_SUFFIX_NAME.IsSHSZStockA(this.Symbol))
80224
+ {
80225
+ var item={ Name:"集合竞价",Data:{ ID: JSCHART_MENU_ID.CMD_SHOW_BEFORE_DATA_ID, Args:[!this.IsShowBeforeData] }, Checked:this.IsShowBeforeData };
80226
+ aryMenu.splice(4,0,item);
80227
+ }
80228
+
80229
+
80230
+ //删除菜单
80231
+ for(var i=0;i<aryMenu.length;++i)
80232
+ {
80233
+ var item=aryMenu[i];
80234
+ if (item.Name=="叠加品种")
80235
+ {
80236
+ for(var j=0;j<item.SubMenu.length;++j)
80237
+ {
80238
+ if (item.SubMenu[j].Checked)
80239
+ {
80240
+ item.SubMenu.push({ Name:JSPopMenu.SEPARATOR_LINE_NAME });
80241
+ item.SubMenu.push({ Name:"取消叠加", Data:{ ID: JSCHART_MENU_ID.CMD_DELETE_ALL_OVERLAY_SYMBOL_ID} });
80242
+ break;
80243
+ }
80244
+ }
80245
+ }
80246
+ }
80247
+
80248
+ return aryMenu;
80249
+ }
80250
+
80251
+ this.PopupRightMenuV2=function(data,e)
80252
+ {
80253
+ if (!this.JSPopMenu) return;
80254
+ var x=data.X, y=data.Y;
80255
+ var frameID=data.FrameID;
80256
+ var menuData={ Menu:this.GetRightMenuData(frameID), Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
80257
+ menuData.ClickCallback=(data)=>{ this.OnClickRightMenu(data); }
80258
+
80259
+ this.PopuMenuByRClick(menuData, x, y);
80260
+ }
80261
+
79507
80262
  this.OnWheel=function(e)
79508
80263
  {
79509
80264
  JSConsole.Chart.Log('[MinuteChartContainer::OnWheel]',e);
@@ -80608,15 +81363,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
80608
81363
  this.ResetDayOffset();
80609
81364
  }
80610
81365
 
80611
- if (this.DayCount>1)
80612
- {
80613
- this.ChartDrawPicture=[];
80614
- }
80615
- else
80616
- {
80617
- this.ReloadChartDrawPicture();
80618
- }
80619
-
81366
+ this.ReloadChartDrawPicture();
80620
81367
  this.ResetDataStatus();
80621
81368
  this.ClearIndexPaint(); //清空指标
80622
81369
  this.Frame.ClearYCoordinateMaxMin();
@@ -81138,6 +81885,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
81138
81885
  this.TitlePaint[0].IsShowDate=true;
81139
81886
  this.UpdateDataOffset();
81140
81887
  this.UpdateFrameMaxMin(); //调整坐标最大 最小值
81888
+ this.CreateChartDrawPictureByStorage(); //创建画图工具
81141
81889
 
81142
81890
  //执行脚本
81143
81891
  if (this.Frame.SubFrame.length>2)
@@ -81436,7 +82184,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
81436
82184
  this.UpdateLatestMinuteDataV2(minuteData);
81437
82185
  this.UpdateHistoryMinuteUI(updateTime);
81438
82186
  this.RecvMinuteDataEvent({FunctionName:"RecvUpdateMinuteData"} );
81439
- this.RequestOverlayMinuteData(); //请求叠加数据 (主数据下载完再下载)
82187
+ this.RequestOverlayMinuteData(); //请求叠加数据 (主数据下载完再下载)
81440
82188
  this.BindAllOverlayIndexData(this.SourceData);
81441
82189
  this.AutoUpdateEvent(true, "MinuteChartContainer::RecvUpdateMinuteData");
81442
82190
  this.AutoUpdate();
@@ -82856,7 +83604,11 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
82856
83604
  this.ReloadChartDrawPicture=function()
82857
83605
  {
82858
83606
  this.ChartDrawPicture=[];
82859
- this.ChartDrawStorageCache;
83607
+ if (this.SelectChartDrawPicture) this.SelectChartDrawPicture.IsSelected=false;
83608
+ this.SelectChartDrawPicture=null;
83609
+ this.CurrentChartDrawPicture=null;
83610
+ this.MoveOnChartDrawPicture=null;
83611
+
82860
83612
  if (this.ChartDrawStorage)
82861
83613
  {
82862
83614
  this.ChartDrawStorageCache=this.ChartDrawStorage.GetDrawData( { Symbol:this.Symbol, Period:888888888 } );
@@ -82867,7 +83619,8 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
82867
83619
  {
82868
83620
  if (!this.ChartDrawStorageCache || this.ChartDrawStorageCache.length<=0) return;
82869
83621
 
82870
- for(var i in this.ChartDrawStorageCache)
83622
+ var self=this;
83623
+ for(var i=0; i<this.ChartDrawStorageCache.length; ++i)
82871
83624
  {
82872
83625
  var item=this.ChartDrawStorageCache[i];
82873
83626
  if (item.FrameID<0 || !this.Frame.SubFrame || this.Frame.SubFrame.length<item.FrameID) continue;
@@ -82878,8 +83631,11 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
82878
83631
  drawPicture.Canvas=this.Canvas;
82879
83632
  drawPicture.Status=10;
82880
83633
  drawPicture.Frame=this.Frame.SubFrame[item.FrameID].Frame; //绑定框架坐标
83634
+ if (drawPicture.ImportStorageData) drawPicture.ImportStorageData(item);
83635
+ drawPicture.ResetXValue();
82881
83636
  drawPicture.UpdateXValue();
82882
83637
  drawPicture.ValueToPoint();
83638
+ drawPicture.GetActiveDrawPicture=()=>{ return this.GetActiveDrawPicture(); }
82883
83639
 
82884
83640
  if (drawPicture.ClassName==='ChartDrawPictureText') drawPicture.IsInitialized=true;
82885
83641
 
@@ -89419,1479 +90175,6 @@ function WaitDialog(divElement)
89419
90175
  }
89420
90176
  }
89421
90177
 
89422
- //K线右键菜单类
89423
- //id:"kline"
89424
- function KLineRightMenu(divElement)
89425
- {
89426
- this.newMethod=IDivDialog; //派生
89427
- this.newMethod(divElement);
89428
- delete this.newMethod;
89429
-
89430
- this.option={};
89431
-
89432
- this.Create = function () {
89433
- var _self = this;
89434
-
89435
- this.ID=Guid();
89436
-
89437
- _self.BindData();
89438
- _self.BindEvent();
89439
- }
89440
- this.BindData=function(){
89441
- var _self = this;
89442
-
89443
- var id=this.DivElement.id;
89444
- var $body = $("#" + id);
89445
-
89446
- $body.find("div[id^='topMenu_']").remove();
89447
- $body.find("div[id^='childMenu_']").remove();
89448
-
89449
- var $topMenu = $("<div />");
89450
- $topMenu.attr("id", "topMenu_"+_self.ID).addClass("context-menu-wrapper topmenu").hide();
89451
- $body.append($topMenu);
89452
-
89453
- var $topTable = $("<table />");
89454
- $topTable.attr({ id: "topTable_" + _self.ID, cellspacing: "0", cellpadding: "0" }).addClass("context-menu");
89455
- $topMenu.append($topTable);
89456
-
89457
- $topTable.append(_self.childrenList(_self.option.data));
89458
-
89459
- for (var i = 0; i < _self.option.data.length; i++) {
89460
- var isHasChildren = typeof _self.option.data[i].children != "undefined";
89461
-
89462
- if (isHasChildren) {
89463
-
89464
- var $childMenu = $("<div />");
89465
- $childMenu.attr({ id: "childMenu_"+_self.ID + i, "data-index": i }).addClass("context-menu-wrapper").hide();
89466
- $body.append($childMenu);
89467
-
89468
- var $childTable = $("<table />");
89469
- $childTable.attr({ id: "childTable_" + _self.ID + i, cellspacing: "0", cellpadding: "0" }).addClass("context-menu");
89470
- $childMenu.append($childTable);
89471
-
89472
- $childTable.append(_self.childrenList(_self.option.data[i].children));
89473
- }
89474
- }
89475
- }
89476
-
89477
- this.Update=function()
89478
- {
89479
- var _self = this;
89480
- //var id=this.DivElement.id;
89481
- //var $body=$("#"+id);
89482
- //
89483
- //var $topTable = $("#topTable_" + _self.ID);
89484
- //$topTable.empty();
89485
- //$topTable.append(_self.childrenList(_self.option.data));
89486
- //
89487
- //for (var i = 0; i < _self.option.data.length; i++) {
89488
- // var isHasChildren = typeof _self.option.data[i].children != "undefined";
89489
- //
89490
- // if (isHasChildren) {
89491
- // var $childTable = $("#childTable_" + _self.ID + i);
89492
- // $childTable.empty();
89493
- // $childTable.append(_self.childrenList(_self.option.data[i].children));
89494
- // }
89495
- //}
89496
-
89497
- _self.BindData();
89498
- _self.BindEvent();
89499
- }
89500
-
89501
- this.childrenList = function(list) {
89502
- var result = [];
89503
-
89504
- for (var i = 0; i < list.length; i++) {
89505
- var isBorder = typeof list[i].isBorder != "undefined" && list[i].isBorder;
89506
-
89507
- var $tr = $("<tr />");
89508
- $tr.addClass("font_Arial context-menu");
89509
- if (isBorder)
89510
- $tr.addClass("border");
89511
-
89512
- var $td1 = $("<td />");
89513
- if(list[i].selected){
89514
- $td1.addClass("spacer context-menu").html("√");
89515
- }else{
89516
- $td1.addClass("spacer context-menu");
89517
- }
89518
-
89519
- var $td2 = $("<td />");
89520
- $td2.addClass("text").html(list[i].text);
89521
-
89522
- var $td3 = $("<td />");
89523
- $td3.addClass("right shortcut");
89524
-
89525
- var $td4 = $("<td />");
89526
- $td4.addClass(typeof list[i].children != "undefined" ? "submenu-arrow" : "context-menu spacer");
89527
-
89528
- $tr.append($td1).append($td2).append($td3).append($td4);
89529
-
89530
- result.push($tr);
89531
- }
89532
- return result;
89533
- }
89534
-
89535
- this.Show=function (obj) {
89536
- var _self = this;
89537
- $.extend(_self.option, obj);
89538
-
89539
- if (!_self.ID) _self.Create(); //判断是否重复创建
89540
- else _self.Update(); //更新菜单状态
89541
-
89542
- var $topMenu = $("#topMenu_"+_self.ID),
89543
- topWidth = $topMenu.outerWidth(),
89544
- topHeight = $topMenu.outerHeight();
89545
-
89546
- var x = _self.option.x,
89547
- y = _self.option.y;
89548
-
89549
- if (topWidth > _self.option.position.X + _self.option.position.W- x) //超过了右边距
89550
- x = x - topWidth;
89551
-
89552
- if (topHeight > _self.option.position.Y +_self.option.position.H - y)//超过了下边距
89553
- y = y - topHeight;
89554
-
89555
- $topMenu.hide();
89556
- $topMenu.css({ position:"absolute",left: x + "px", top: y + "px" }).show();
89557
-
89558
- this.isInit = true;
89559
- }
89560
-
89561
- this.Hide=function () {
89562
- var _self = this;
89563
- if (typeof($)=="undefined") return;
89564
- $("#topMenu_" + _self.ID).hide();
89565
- $("[id^='childMenu_" + _self.ID + "']").hide();
89566
- }
89567
-
89568
- this.BindEvent=function () {
89569
- var _self = this;
89570
- var $childMenu = $("[id^='childMenu_" + _self.ID + "']");
89571
-
89572
- $("#topTable_" + _self.ID).find("tr").mouseenter(function () {
89573
- var $this = $(this),
89574
- index = $this.index(),
89575
- $topMenu = $("#topMenu_" + _self.ID),
89576
- $child = $("#childMenu_" + _self.ID + index),
89577
- trWidth = $this.outerWidth(),
89578
- trHeight = $this.outerHeight();
89579
-
89580
- var left = $topMenu.position().left + trWidth + 1;
89581
- var top = $topMenu.position().top + (trHeight * index);
89582
-
89583
- if (trWidth > _self.option.position.X + _self.option.position.W - left) //超过了右边距
89584
- left = left - trWidth - $topMenu.outerWidth() - 2;
89585
-
89586
- if ($child.outerHeight() > _self.option.position.Y +_self.option.position.H - top)//超过了下边距
89587
- top = $topMenu.position().top + $topMenu.outerHeight() - $child.outerHeight();
89588
-
89589
- $childMenu.hide();
89590
- $child.css({ left: left + "px", top: top + "px" }).show();
89591
- }).mouseleave(function () {
89592
- var index = $(this).index();
89593
- setTimeout(function () {
89594
- if ($("#childMenu_" + _self.ID + index).attr("data-isShow") != 1) {
89595
- $("#childMenu_" + _self.ID + index).hide();
89596
- }
89597
- }, 10)
89598
-
89599
- }).click(function () {
89600
- var $this = $(this);
89601
- var index = $this.index();
89602
-
89603
- if ($.type(_self.option.data[index].click) == "function") {
89604
- _self.option.data[index].click(_self.option.returnData);
89605
- $this.hide();
89606
- }
89607
- }).contextmenu(function()
89608
- {
89609
- return false; //屏蔽系统右键菜单
89610
- });
89611
-
89612
-
89613
- $childMenu.mouseenter(function () {
89614
- $(this).attr("data-isShow", "1");
89615
- }).mouseleave(function () {
89616
- $(this).attr("data-isShow", "0");
89617
- }).contextmenu(function()
89618
- {
89619
- return false; //屏蔽系统右键菜单
89620
- });
89621
-
89622
- $childMenu.find("tr").click(function () {
89623
- var $this = $(this);
89624
- var divIndex = parseInt($this.closest("div").attr("data-index"));
89625
- var trIndex = $this.index();
89626
-
89627
- if ($.type(_self.option.data[divIndex].children[trIndex].click) == "function") {
89628
- _self.option.data[divIndex].children[trIndex].click(_self.option.windowIndex || 1);
89629
- $childMenu.hide();
89630
- }
89631
- });
89632
- }
89633
-
89634
- this.GetPeriod=function (chart)
89635
- {
89636
- var data=
89637
- [
89638
- {
89639
- text: "日线", Value:0,
89640
- click: function () { chart.ChangePeriod(0); }
89641
- },
89642
- {
89643
- text: "周线",Value:1,
89644
- click: function () { chart.ChangePeriod(1); }
89645
- },
89646
- {
89647
- text: "双周线",Value:21,
89648
- click: function () { chart.ChangePeriod(21); }
89649
- },
89650
- {
89651
- text: "月线",Value:2,
89652
- click: function () { chart.ChangePeriod(2); }
89653
- },
89654
- {
89655
- text: "季线",Value:9,
89656
- click: function () { chart.ChangePeriod(9); }
89657
- },
89658
- {
89659
- text: "半年",Value:22,
89660
- click: function () { chart.ChangePeriod(22); }
89661
- },
89662
- {
89663
- text: "年线",Value:3,
89664
- click: function () { chart.ChangePeriod(3); }
89665
- },
89666
- {
89667
- text: "1分",Value:4,
89668
- click: function () { chart.ChangePeriod(4); }
89669
- },
89670
- {
89671
- text: "5分",Value:5,
89672
- click: function () { chart.ChangePeriod(5); }
89673
- },
89674
- {
89675
- text: "15分",Value:6,
89676
- click: function () { chart.ChangePeriod(6); }
89677
- },
89678
- {
89679
- text: "30分",Value:7,
89680
- click: function () { chart.ChangePeriod(7); }
89681
- },
89682
- {
89683
- text: "60分",Value:8,
89684
- click: function () { chart.ChangePeriod(8); }
89685
- },
89686
- {
89687
- text: "2小时",Value:11,
89688
- click: function () { chart.ChangePeriod(11); }
89689
- },
89690
- {
89691
- text: "4小时",Value:12,
89692
- click: function () { chart.ChangePeriod(12); }
89693
- },
89694
- {
89695
- text: "分笔",Value:10,
89696
- click: function () { chart.ChangePeriod(10); }
89697
- },
89698
- {
89699
- text: "自定义周期:3分钟",Value:20003,
89700
- click: function () { chart.ChangePeriod(20003); }
89701
- },
89702
- {
89703
- text: "自定义周期:35分钟",Value:20035,
89704
- click: function () { chart.ChangePeriod(20035); }
89705
- },
89706
- {
89707
- text: "自定义周期:8日",Value:40008,
89708
- click: function () { chart.ChangePeriod(40008); }
89709
- }
89710
- ];
89711
-
89712
- for(var i in data)
89713
- {
89714
- var item=data[i];
89715
- if (item.Value==chart.Period)
89716
- {
89717
- item.selected=true;
89718
- break;
89719
- }
89720
- }
89721
-
89722
- return data;
89723
- }
89724
-
89725
- this.GetRight=function(chart)
89726
- {
89727
- var data=
89728
- [
89729
- {
89730
- text: "不复权",
89731
- click: function () { chart.ChangeRight(0); }
89732
- },
89733
- {
89734
- text: "前复权",
89735
- click: function () { chart.ChangeRight(1); }
89736
- },
89737
- {
89738
- text: "后复权",
89739
- click: function () { chart.ChangeRight(2); }
89740
- }
89741
- ];
89742
-
89743
- if (chart.Right>=0 && chart.Right<data.length) data[chart.Right].selected=true;
89744
-
89745
- return data;
89746
- }
89747
-
89748
- //指标
89749
- this.GetIndex=function (chart)
89750
- {
89751
- return [{
89752
- text: "均线",
89753
- click: function (windowIndex) {
89754
- chart.ChangeIndex(windowIndex, '均线')
89755
- }
89756
- }, {
89757
- text: "BOLL",
89758
- click: function (windowIndex) {
89759
- chart.ChangeIndex(windowIndex, 'BOLL')
89760
- },
89761
- isBorder:true
89762
- }, {
89763
- text: "MACD",
89764
- click: function (windowIndex) {
89765
- chart.ChangeIndex(windowIndex, 'MACD')
89766
- }
89767
- }, {
89768
- text: "KDJ",
89769
- click: function (windowIndex) {
89770
- chart.ChangeIndex(windowIndex, 'KDJ')
89771
- }
89772
- }, {
89773
- text: "VOL",
89774
- click: function (windowIndex) {
89775
- chart.ChangeIndex(windowIndex, 'VOL')
89776
- }
89777
- }, {
89778
- text: "RSI",
89779
- click: function (windowIndex) {
89780
- chart.ChangeIndex(windowIndex, 'RSI')
89781
- }
89782
- }, {
89783
- text: "BRAR",
89784
- click: function (windowIndex) {
89785
- chart.ChangeIndex(windowIndex, 'BRAR')
89786
- }
89787
- }, {
89788
- text: "WR",
89789
- click: function (windowIndex) {
89790
- chart.ChangeIndex(windowIndex, 'WR')
89791
- }
89792
- }, {
89793
- text: "BIAS",
89794
- click: function (windowIndex) {
89795
- chart.ChangeIndex(windowIndex, 'BIAS')
89796
- }
89797
- }, {
89798
- text: "OBV",
89799
- click: function (windowIndex) {
89800
- chart.ChangeIndex(windowIndex, 'OBV')
89801
- }
89802
- }, {
89803
- text: "DMI",
89804
- click: function (windowIndex) {
89805
- chart.ChangeIndex(windowIndex, 'DMI')
89806
- }
89807
- }, {
89808
- text: "CR",
89809
- click: function (windowIndex) {
89810
- chart.ChangeIndex(windowIndex, 'CR')
89811
- }
89812
- }, {
89813
- text: "PSY",
89814
- click: function (windowIndex) {
89815
- chart.ChangeIndex(windowIndex, 'PSY')
89816
- }
89817
- }, {
89818
- text: "CCI",
89819
- click: function (windowIndex) {
89820
- chart.ChangeIndex(windowIndex, 'CCI')
89821
- }
89822
- }, {
89823
- text: "DMA",
89824
- click: function (windowIndex) {
89825
- chart.ChangeIndex(windowIndex, 'DMA')
89826
- }
89827
- }, {
89828
- text: "TRIX",
89829
- click: function (windowIndex) {
89830
- chart.ChangeIndex(windowIndex, 'TRIX')
89831
- }
89832
- }, {
89833
- text: "VR",
89834
- click: function (windowIndex) {
89835
- chart.ChangeIndex(windowIndex, 'VR')
89836
- }
89837
- }, {
89838
- text: "EMV",
89839
- click: function (windowIndex) {
89840
- chart.ChangeIndex(windowIndex, 'EMV')
89841
- }
89842
- }, {
89843
- text: "ROC",
89844
- click: function (windowIndex) {
89845
- chart.ChangeIndex(windowIndex, 'ROC')
89846
- }
89847
- }, {
89848
- text: "MIM",
89849
- click: function (windowIndex) {
89850
- chart.ChangeIndex(windowIndex, 'MIM')
89851
- }
89852
- }, {
89853
- text: "FSL",
89854
- click: function (windowIndex) {
89855
- chart.ChangeIndex(windowIndex, 'FSL')
89856
- }
89857
- } ]
89858
- }
89859
-
89860
- //五彩K线
89861
- this.GetColorIndex=function (chart)
89862
- {
89863
- var data=
89864
- [
89865
- {
89866
- text: "十字星",
89867
- click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-十字星') }
89868
- },
89869
- {
89870
- text: "早晨之星",
89871
- click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-早晨之星') },
89872
- },
89873
- {
89874
- text: "垂死十字",
89875
- click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-垂死十字') },
89876
- },
89877
- {
89878
- text: "三只乌鸦",
89879
- click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-三只乌鸦') }
89880
- },
89881
- {
89882
- text: "光脚阴线",
89883
- click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-光脚阴线') }
89884
- },
89885
- {
89886
- text: "黄昏之星",
89887
- click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-黄昏之星') }
89888
- }
89889
- ];
89890
-
89891
- if (chart.ColorIndex)
89892
- {
89893
- data[data.length-1].isBorder=true;
89894
- data.push(
89895
- {
89896
- text: "删除五彩K线",
89897
- click: function (windowIndex) { chart.CancelInstructionIndex() }
89898
- });
89899
- }
89900
-
89901
- return data;
89902
- }
89903
-
89904
- //专家系统
89905
- this.GetTradeIndex=function(chart)
89906
- {
89907
- var data=
89908
- [
89909
- {
89910
- text: "BIAS",
89911
- click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-BIAS') }
89912
- },
89913
- {
89914
- text: "CCI",
89915
- click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-CCI') }
89916
- },
89917
- {
89918
- text: "DMI",
89919
- click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-DMI') }
89920
- },
89921
- {
89922
- text: "KD",
89923
- click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-KD') }
89924
- },
89925
- {
89926
- text: "BOLL",
89927
- click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-BOLL') }
89928
- },
89929
- {
89930
- text: "KDJ",
89931
- click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-KDJ') }
89932
- }
89933
- ];
89934
-
89935
- if (chart.TradeIndex)
89936
- {
89937
- data[data.length-1].isBorder=true;
89938
- data.push(
89939
- {
89940
- text: "删除专家系统",
89941
- click: function (windowIndex) { chart.CancelInstructionIndex()}
89942
- });
89943
- }
89944
- return data;
89945
- }
89946
-
89947
- //叠加
89948
- this.GetOverlay=function (chart)
89949
- {
89950
- var data=
89951
- [
89952
- {
89953
- text: "上证指数",
89954
- click: function () { chart.OverlaySymbol('000001.sh'); }
89955
- },
89956
- {
89957
- text: "深证成指",
89958
- click: function () { chart.OverlaySymbol('399001.sz'); }
89959
- },
89960
- {
89961
- text: "中小板指",
89962
- click: function () { chart.OverlaySymbol('399005.sz'); }
89963
- },
89964
- {
89965
- text: "创业板指",
89966
- click: function () { chart.OverlaySymbol('399006.sz'); }
89967
- },
89968
- {
89969
- text: "沪深300",
89970
- click: function () { chart.OverlaySymbol('000300.sh'); },
89971
- }
89972
- ];
89973
-
89974
- for(var i in chart.OverlayChartPaint)
89975
- {
89976
- var item=chart.OverlayChartPaint[i];
89977
- var symbol=item.Symbol;
89978
- const mapSymbol=new Map([['000001.sh',0],['399001.sz',1],['399005.sz',2],['399006.sz',3],['000300.sh',4]]);
89979
- if (mapSymbol.has(symbol))
89980
- {
89981
- var menuItem=data[mapSymbol.get(symbol)];
89982
- let delSymbol=symbol;
89983
- menuItem.selected=true;
89984
- menuItem.click=function () { chart.DeleteOverlaySymbol(delSymbol); };
89985
- }
89986
- }
89987
-
89988
- if (chart.OverlayChartPaint && chart.OverlayChartPaint.length>0)
89989
- {
89990
- data[data.length-1].isBorder=true;
89991
- data.push(
89992
- {
89993
- text: "取消叠加",
89994
- click: function () { chart.ClearOverlaySymbol();}
89995
- }
89996
- );
89997
- }
89998
-
89999
- return data;
90000
- }
90001
-
90002
- //K线类型设置
90003
- this.GetKLineType=function(chart)
90004
- {
90005
- var data=
90006
- [
90007
- {
90008
- text: "K线(空心阳线)",
90009
- click: function () { chart.ChangeKLineDrawType(3);}
90010
- },
90011
- {
90012
- text: "K线(实心阳线)",
90013
- click: function () { chart.ChangeKLineDrawType(0); }
90014
- },
90015
- {
90016
- text: "美国线",
90017
- click: function () { chart.ChangeKLineDrawType(2, true ,{ IsThinAKBar:false }); }
90018
- },
90019
- {
90020
- text: "收盘线",
90021
- click: function () { chart.ChangeKLineDrawType(1); }
90022
- },
90023
- {
90024
- text: "收盘面积",
90025
- click: function () { chart.ChangeKLineDrawType(4); }
90026
- },
90027
- {
90028
- text: "K线(空心阳线阴线)",
90029
- click: function () { chart.ChangeKLineDrawType(6);}
90030
- },
90031
- {
90032
- text: "Heikin Ashi",
90033
- click: function () { chart.ChangeKLineDrawType(11);}
90034
- },
90035
- {
90036
- text: "Line Break",
90037
- click: function () { chart.ChangeKLineDrawType(12);}
90038
- },
90039
- {
90040
- text: "High-low",
90041
- click: function () { chart.ChangeKLineDrawType(13);}
90042
- },
90043
- {
90044
- text: "HLC Area",
90045
- click: function () { chart.ChangeKLineDrawType(15);}
90046
- }
90047
- ];
90048
-
90049
- switch(chart.KLineDrawType)
90050
- {
90051
- case 0:
90052
- data[1].selected=true;
90053
- break;
90054
- case 1:
90055
- data[3].selected=true;
90056
- break;
90057
- case 2:
90058
- data[2].selected=true;
90059
- break;
90060
- case 3:
90061
- data[0].selected=true;
90062
- break;
90063
- case 4:
90064
- data[4].selected=true;
90065
- break;
90066
- case 6:
90067
- data[5].selected=true;
90068
- break;
90069
- case 11:
90070
- data[6].selected=true;
90071
- break;
90072
- case 12:
90073
- data[7].selected=true;
90074
- break;
90075
- case 13:
90076
- data[8].selected=true;
90077
- break;
90078
- case 15:
90079
- data[9].selected=true;
90080
- break;
90081
- }
90082
- return data;
90083
- }
90084
-
90085
- //指标窗口个数
90086
- this.GetIndexWindowCount=function(chart)
90087
- {
90088
- var data=
90089
- [
90090
- {
90091
- text: "1个窗口",
90092
- click: function () { chart.ChangeIndexWindowCount(1); }
90093
- },
90094
- {
90095
- text: "2个窗口",
90096
- click: function () { chart.ChangeIndexWindowCount(2); }
90097
- },
90098
- {
90099
- text: "3个窗口",
90100
- click: function () { chart.ChangeIndexWindowCount(3); }
90101
- },
90102
- {
90103
- text: "4个窗口",
90104
- click: function () { chart.ChangeIndexWindowCount(4); }
90105
- },
90106
- {
90107
- text: "5个窗口",
90108
- click: function () { chart.ChangeIndexWindowCount(5); }
90109
- }
90110
- ];
90111
-
90112
- var count=chart.Frame.SubFrame.length;
90113
- if ((count-1)>=0 && (count-1)<data.length) data[count-1].selected=true; //选中
90114
-
90115
- return data;
90116
- }
90117
-
90118
- //坐标类型
90119
- this.GetCoordinateType=function(chart)
90120
- {
90121
- var data=
90122
- [
90123
- {
90124
- text: "普通坐标",
90125
- click: function () { chart.ChangeCoordinateType( {Type:0} ); }
90126
- },
90127
- {
90128
- text: "百分比坐标",
90129
- click: function () { chart.ChangeCoordinateType( {Type:1} ); }
90130
- },
90131
- {
90132
- text: "反转坐标",
90133
- click: function () { chart.ChangeCoordinateType( { IsReverse:true } ); }
90134
- },
90135
- {
90136
- text: "对数坐标",
90137
- click: function () { chart.ChangeCoordinateType( {Type:2} ); }
90138
- },
90139
- {
90140
- text: "等比坐标",
90141
- click: function () { chart.ChangeCoordinateType( {Type:3} ); }
90142
- },
90143
- {
90144
- text: "等分坐标",
90145
- click: function () { chart.ChangeCoordinateType( {Type:4} ); }
90146
- },
90147
- {
90148
- text: "黄金分割",
90149
- click: function () { chart.ChangeCoordinateType( {Type:5} ); }
90150
- }
90151
- ];
90152
-
90153
- if (chart.Frame && chart.Frame.SubFrame && chart.Frame.SubFrame.length>0)
90154
- {
90155
- if (chart.Frame.SubFrame[0].Frame.CoordinateType==1)
90156
- {
90157
- data[2].selected=true;
90158
- data[2].click=function() { chart.ChangeCoordinateType( { IsReverse:false } ); } //取消反转
90159
- }
90160
-
90161
- if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==1) data[1].selected=true; //百分比
90162
- else if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==0) data[0].selected=true; //普通坐标
90163
- else if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==2) data[3].selected=true; //对数
90164
- else if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==3) data[4].selected=true; //等比坐标
90165
- else if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==4) data[5].selected=true; //等分坐标
90166
- else if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==5) data[6].selected=true; //黄金分割
90167
- }
90168
-
90169
- return data;
90170
- }
90171
-
90172
- //拖拽模式
90173
- this.GetDragModeType=function(chart)
90174
- {
90175
- var data=
90176
- [
90177
- {
90178
- text: "禁止拖拽",
90179
- click: function () { chart.DragMode=0; }
90180
- },
90181
- {
90182
- text: "启动拖拽",
90183
- click: function () { chart.DragMode=1; }
90184
- },
90185
- {
90186
- text: "区间选择",
90187
- click: function () { chart.DragMode=2; }
90188
- }
90189
- ];
90190
-
90191
- if (chart.DragMode>=0 && chart.DragMode<data.length) data[chart.DragMode].selected=true; //选中
90192
-
90193
- return data;
90194
- }
90195
-
90196
- //工具
90197
- this.GetTools=function(chart)
90198
- {
90199
- var data=[];
90200
- var drawTools=chart.GetExtendChartByClassName('DrawToolsButton');
90201
- if (drawTools)
90202
- {
90203
- data.push(
90204
- {
90205
- text: "关闭画图工具",
90206
- click: function ()
90207
- {
90208
- var toolsWidth=drawTools.Chart.Width;
90209
- var toolsIndex=parseInt(drawTools.Index);
90210
- for(var i=toolsIndex+1; i<chart.ExtendChartPaint.length; ++i) //在画图工具后面创建的需要减去工具的宽度
90211
- {
90212
- var item=chart.ExtendChartPaint[i];
90213
- if (item.ClassName=='StockChip')
90214
- {
90215
- item.Left-=toolsWidth;
90216
- }
90217
- }
90218
- chart.DeleteExtendChart(drawTools);
90219
- chart.Frame.ChartBorder.Right-=toolsWidth;
90220
- chart.SetSizeChange(true);
90221
- chart.Draw();
90222
- }
90223
- }
90224
- );
90225
- }
90226
- else
90227
- {
90228
- data.push(
90229
- {
90230
- text: "画图工具",
90231
- click: function () {
90232
- var option={Name:'画图工具', Top:chart.Frame.ChartBorder.Top };
90233
- var extendChart=chart.CreateExtendChart(option.Name, option); //创建扩展图形
90234
- chart.SetSizeChange(true);
90235
- chart.Draw();
90236
- }
90237
- }
90238
- );
90239
- }
90240
-
90241
- var StockChip=chart.GetExtendChartByClassName('StockChip');
90242
- if (StockChip)
90243
- {
90244
- data.push(
90245
- {
90246
- text: "关闭移动筹码",
90247
- click: function ()
90248
- {
90249
- var chipWidth=StockChip.Chart.Width;
90250
- var chipIndex=parseInt(StockChip.Index);
90251
- for(var i=chipIndex+1; i<chart.ExtendChartPaint.length; ++i) //在筹码后面创建的需要筹码的宽度
90252
- {
90253
- var item=chart.ExtendChartPaint[i];
90254
- if (item.ClassName=='DrawToolsButton')
90255
- {
90256
- item.Left-=chipWidth;
90257
- }
90258
- }
90259
- chart.DeleteExtendChart(StockChip);
90260
- chart.Frame.ChartBorder.Right-=chipWidth;
90261
- chart.SetSizeChange(true);
90262
- chart.Draw();
90263
- }
90264
-
90265
- }
90266
- );
90267
- }
90268
- else
90269
- {
90270
- data.push(
90271
- {
90272
- text: "移动筹码",
90273
- click: function () {
90274
- var option={Name:'筹码分布', ShowType:1, Width:230 };
90275
- var extendChart=chart.CreateExtendChart(option.Name, option); //创建扩展图形
90276
- chart.SetSizeChange(true);
90277
- chart.Draw();
90278
- }
90279
- }
90280
- );
90281
- }
90282
-
90283
- return data;
90284
- }
90285
-
90286
- //缺口提示
90287
- this.GetPriceGap=function(chart)
90288
- {
90289
- var klineChart=chart.ChartPaint[0];
90290
- var priceGap=klineChart.PriceGap;
90291
- var data=
90292
- [
90293
- {
90294
- text: "显示1个缺口",
90295
- click: function () { chart.ChangePriceGap({ Enable:true, Count:1 }); }
90296
- },
90297
- {
90298
- text: "显示2个缺口",
90299
- click: function () { chart.ChangePriceGap({ Enable:true, Count:2 }); }
90300
- },
90301
- {
90302
- text: "显示3个缺口",
90303
- click: function () { chart.ChangePriceGap({ Enable:true, Count:3 }); }
90304
- },
90305
- {
90306
- text: "隐藏缺口",
90307
- click: function () { chart.ChangePriceGap({ Enable:false }); }
90308
- }
90309
- ];
90310
-
90311
- if (!priceGap.Enable || priceGap.Count<=0)
90312
- {
90313
- data[data.length-1].selected=true; //选中
90314
- }
90315
- else if (priceGap.Enable && priceGap.Count>0)
90316
- {
90317
- var index=priceGap.Count-1;
90318
- if (index>data.length-2) index=data.length-2;
90319
- data[index].selected=true; //选中
90320
- }
90321
-
90322
- return data;
90323
- }
90324
-
90325
- this.GetBGSplit=function(chart)
90326
- {
90327
- var data=
90328
- [
90329
- {
90330
- text: "启用",
90331
- click: function ()
90332
- {
90333
- chart.CreateExtendChart("SessionBreaksPaint", { });
90334
- chart.Draw();
90335
- }
90336
- },
90337
- {
90338
- text: "关闭",
90339
- click: function ()
90340
- {
90341
- var finder=chart.GetExtendChartByClassName("SessionBreaksPaint");
90342
- if (finder)
90343
- {
90344
- chart.DeleteExtendChartByID(finder.Chart.ID);
90345
- chart.Draw();
90346
- }
90347
- }
90348
- },
90349
- ];
90350
-
90351
- var finder=chart.GetExtendChartByClassName("SessionBreaksPaint");
90352
- if (finder) data[0].selected=true;
90353
- else data[1].selected=true;
90354
-
90355
- return data;
90356
- }
90357
-
90358
-
90359
- this.GetKLineInfo=function(chart)
90360
- {
90361
- var setInfo=new Set();
90362
- for(var i in chart.ChartInfo)
90363
- {
90364
- var item=chart.ChartInfo[i];
90365
- setInfo.add(item.ClassName);
90366
- }
90367
-
90368
- var aryKLineInfo=["公告","业绩预告","调研","大宗交易","龙虎榜","互动易"]
90369
-
90370
- var data=[];
90371
- for(var i in aryKLineInfo)
90372
- {
90373
- var infoName=aryKLineInfo[i];
90374
- var classInfo=JSKLineInfoMap.GetClassInfo(infoName);
90375
- if (!classInfo) continue;
90376
-
90377
- var item=this.CreateKlineInfoItem(infoName, setInfo.has(classInfo.ClassName), chart);
90378
- data.push(item);
90379
- }
90380
-
90381
- if (chart.ChartInfo.length>0)
90382
- {
90383
- data[data.length-1].isBorder=true;
90384
- var item={ text:'删除所有', click:function() { chart.ClearKLineInfo()} };
90385
- data.push(item);
90386
-
90387
- }
90388
-
90389
- return data;
90390
- }
90391
-
90392
- this.CreateKlineInfoItem=function(infoName,bExist,chart)
90393
- {
90394
- var item=
90395
- {
90396
- text:infoName,
90397
- selected:bExist
90398
- }
90399
-
90400
- if (bExist) item.click=function() { chart.DeleteKLineInfo(infoName) };
90401
- else item.click=function() { chart.AddKLineInfo(infoName,true) }
90402
-
90403
- return item;
90404
- }
90405
-
90406
- this.DoModal=function(event)
90407
- {
90408
- var chart=event.data.Chart;
90409
- var rightMenu=chart.RightMenu;
90410
- var x = event.offsetX;
90411
- var y = event.offsetY;
90412
-
90413
- var dataList=[{
90414
- text: "分析周期",
90415
- children: this.GetPeriod(chart)
90416
- },
90417
- {
90418
- text: "复权处理",
90419
- children: this.GetRight(chart)
90420
- },
90421
- {
90422
- text: "指标切换",
90423
- children: this.GetIndex(chart)
90424
- },
90425
- {
90426
- text:"五彩K线",
90427
- children: this.GetColorIndex(chart)
90428
- },
90429
- {
90430
- text:'专家系统',
90431
- children: this.GetTradeIndex(chart)
90432
- },
90433
- {
90434
- text:'信息地雷',
90435
- children: this.GetKLineInfo(chart)
90436
- },
90437
- {
90438
- text:'缺口提示',
90439
- children: this.GetPriceGap(chart)
90440
- },
90441
- {
90442
- text: "叠加品种",
90443
- children: this.GetOverlay(chart)
90444
- },
90445
- {
90446
- text:'主图线型',
90447
- children: this.GetKLineType(chart)
90448
- },
90449
- {
90450
- text:"坐标类型",
90451
- children:this.GetCoordinateType(chart)
90452
- },
90453
- {
90454
- text:'指标窗口个数',
90455
- children: this.GetIndexWindowCount(chart)
90456
- },
90457
- {
90458
- text:'鼠标拖拽',
90459
- children: this.GetDragModeType(chart)
90460
- },
90461
- {
90462
- text:"工具",
90463
- children:this.GetTools(chart)
90464
- },
90465
- {
90466
- text:"背景分割",
90467
- children:this.GetBGSplit(chart)
90468
- }
90469
- ];
90470
-
90471
- var upperSymbol=chart.Symbol.toUpperCase();
90472
- if(MARKET_SUFFIX_NAME.IsSHSZIndex(chart.Symbol) || MARKET_SUFFIX_NAME.IsBIT(upperSymbol))
90473
- {
90474
- dataList.splice(1,1);
90475
- }
90476
-
90477
- var identify=event.data.FrameID;
90478
- var overlayIndex=this.GetOverlayIndex(chart,identify);
90479
- if (overlayIndex && overlayIndex.length>0)
90480
- {
90481
- var delOverlayIndexMenu={ text:'删除叠加指标', children:this.GetDeleteOverlayIndex(chart,overlayIndex) }
90482
- dataList.splice(3,0,delOverlayIndexMenu);
90483
- }
90484
-
90485
- JSConsole.Chart.Log('[KLineRightMenu::DoModal]',identify);
90486
- rightMenu.Show({
90487
- windowIndex :identify,
90488
- x:x+chart.UIElement.offsetLeft,
90489
- y:y+chart.UIElement.offsetTop,
90490
- position:chart.Frame.Position,
90491
- data:dataList
90492
- })
90493
-
90494
- $(document).click(function () {
90495
- rightMenu.Hide();
90496
- });
90497
- }
90498
-
90499
- this.GetOverlayIndex=function(chart, windowsIndex)
90500
- {
90501
- if (windowsIndex>=chart.Frame.SubFrame.length || windowsIndex<0) return [];
90502
-
90503
- var result=[];
90504
- var item=chart.Frame.SubFrame[windowsIndex];
90505
- for(var i in item.OverlayIndex)
90506
- {
90507
- var overlayItem=item.OverlayIndex[i];
90508
- result.push({Name:overlayItem.Script.Name, Identify:overlayItem.Identify});
90509
- }
90510
-
90511
- return result;
90512
- }
90513
-
90514
- this.GetDeleteOverlayIndex=function(chart,overlayIndex)
90515
- {
90516
- var data=[];
90517
- for(var i in overlayIndex)
90518
- {
90519
- let identify=overlayIndex[i].Identify;
90520
- data.push({text:overlayIndex[i].Name, click:function()
90521
- {
90522
- chart.DeleteOverlayWindowsIndex(identify)
90523
- }});
90524
- }
90525
-
90526
- return data;
90527
- }
90528
- }
90529
-
90530
- //K线区间选择右键菜单
90531
- function KLineSelectRightMenu(divElement)
90532
- {
90533
- this.newMethod=KLineRightMenu; //派生
90534
- this.newMethod(divElement);
90535
- delete this.newMethod;
90536
-
90537
- this.DoModal=function(event)
90538
- {
90539
- var chart=event.data.Chart;
90540
- var rightMenu=this;
90541
- var x = event.data.X;
90542
- var y = event.data.Y;
90543
-
90544
- var dataList=
90545
- [
90546
- {
90547
- text: "区间统计",
90548
- click: function ()
90549
- {
90550
- JSConsole.Chart.Log('[KLineSelectRightMenu::click] 区间统计');
90551
- rightMenu.Hide();
90552
- var dialog=new KLineSelectRectDialog(divElement);
90553
- dialog.DoModal(event);
90554
- }
90555
- },
90556
- {
90557
- text:'区间放大',
90558
- click:function()
90559
- {
90560
- JSConsole.Chart.Log('[KLineSelectRightMenu::click] 区间放大');
90561
- var chart=event.data.Chart;
90562
- chart.ShowSelectData(event.data.SelectData);
90563
- }
90564
- }
90565
- ];
90566
-
90567
- rightMenu.Show({
90568
- x:x,
90569
- y:y,
90570
- position:chart.Frame.Position,
90571
- data:dataList
90572
- });
90573
- }
90574
-
90575
- this.Show=function (obj)
90576
- {
90577
- var _self = this;
90578
- $.extend(_self.option, obj);
90579
-
90580
- //判断是否重复创建
90581
- if (!_self.ID) _self.Create();
90582
- //判断下如果DOM没了需要重新创建
90583
- var divIdName='topMenu_'+_self.ID;
90584
- var divDom=document.getElementById(divIdName);
90585
- if (!divDom) _self.Create();
90586
-
90587
- var $topMenu = $("#topMenu_"+_self.ID),
90588
- topWidth = $topMenu.outerWidth(),
90589
- topHeight = $topMenu.outerHeight();
90590
-
90591
- $topMenu.contextmenu(function()
90592
- {
90593
- return false; //屏蔽系统右键菜单
90594
- });
90595
-
90596
- var x = _self.option.x,
90597
- y = _self.option.y;
90598
-
90599
- if (topWidth > _self.option.position.X + _self.option.position.W- x) //超过了右边距
90600
- x = x - topWidth;
90601
-
90602
- if (topHeight > _self.option.position.Y +_self.option.position.H - y)//超过了下边距
90603
- y = y - topHeight;
90604
-
90605
- $topMenu.hide();
90606
- $topMenu.css({ position:"absolute",left: x + "px", top: y + "px" }).show();
90607
-
90608
- $("#topMenu_" + _self.ID).find("tr").show(); //把菜单列表显示
90609
-
90610
- this.isInit = true;
90611
- }
90612
- }
90613
-
90614
- //分钟数据右键菜单
90615
- function MinuteRightMenu(divElement)
90616
- {
90617
- this.newMethod=KLineRightMenu; //派生
90618
- this.newMethod(divElement);
90619
- delete this.newMethod;
90620
-
90621
- this.DoModal=function(event)
90622
- {
90623
- var chart=event.data.Chart;
90624
- var rightMenu=chart.RightMenu;
90625
- var x = event.offsetX;
90626
- var y = event.offsetY;
90627
-
90628
- var dataList=
90629
- [
90630
- {
90631
- text: "叠加品种",
90632
- children: this.GetOverlay(chart)
90633
- },
90634
- {
90635
- text: "多日分时图",
90636
- children: this.GetDayCount(chart)
90637
- },
90638
- {
90639
- text:'指标窗口个数',
90640
- children: this.GetIndexWindowCount(chart)
90641
- },
90642
- {
90643
- text: "副图指标切换",
90644
- children: this.GetIndex(chart)
90645
- },
90646
- {
90647
- text:"区间选择",
90648
- children:this.GetSelectRect(chart)
90649
- },
90650
-
90651
- ];
90652
-
90653
- var symbol=chart.Symbol;
90654
- if (MARKET_SUFFIX_NAME.IsSHSZStockA(symbol))
90655
- {
90656
- dataList.push({text:'集合竞价',children: this.GetShowBeforeData(chart)});
90657
- }
90658
-
90659
- dataList.push({text:"工具", children:this.GetTools(chart)});
90660
-
90661
- var identify=event.data.FrameID;
90662
- var overlayIndex=this.GetOverlayIndex(chart,identify);
90663
- if (overlayIndex && overlayIndex.length>0)
90664
- {
90665
- var delOverlayIndexMenu={ text:'删除叠加指标', children:this.GetDeleteOverlayIndex(chart,overlayIndex) }
90666
- dataList.splice(3,0,delOverlayIndexMenu);
90667
- }
90668
-
90669
- var identify=event.data.FrameID;
90670
- JSConsole.Chart.Log('[MinuteRightMenu::DoModal]',identify);
90671
- rightMenu.Show({
90672
- windowIndex :identify,
90673
- x:x+chart.UIElement.offsetLeft,
90674
- y:y+chart.UIElement.offsetTop,
90675
- position:chart.Frame.Position,
90676
- data:dataList
90677
- })
90678
-
90679
- $(document).click(function () {
90680
- rightMenu.Hide();
90681
- });
90682
- }
90683
-
90684
- this.GetDayCount=function(chart)
90685
- {
90686
- var data=
90687
- [
90688
- {
90689
- text: "当日分时图",
90690
- click: function () { chart.ChangeDayCount(1); },
90691
- isBorder:true
90692
- },
90693
- {
90694
- text: "最近2日",
90695
- click: function () { chart.ChangeDayCount(2); }
90696
- },
90697
- {
90698
- text: "最近3日",
90699
- click: function () { chart.ChangeDayCount(3); }
90700
- },
90701
- {
90702
- text: "最近4日",
90703
- click: function () { chart.ChangeDayCount(4); }
90704
- },
90705
- {
90706
- text: "最近5日",
90707
- click: function () { chart.ChangeDayCount(5); }
90708
- },
90709
- {
90710
- text: "最近6日",
90711
- click: function () { chart.ChangeDayCount(6); }
90712
- }
90713
- ];
90714
-
90715
- if ((chart.DayCount-1)>=0 && (chart.DayCount-1)<data.length) data[chart.DayCount-1].selected=true;
90716
-
90717
- return data;
90718
- }
90719
-
90720
- this.GetIndex=function (chart)
90721
- {
90722
- var data=
90723
- [
90724
- {
90725
- text: "MACD",
90726
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'MACD') }
90727
- },
90728
- {
90729
- text: "DMI",
90730
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'DMI') }
90731
- },
90732
- {
90733
- text: "DMA",
90734
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'DMA') }
90735
- },
90736
- {
90737
- text: "BRAR",
90738
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'BRAR') }
90739
- },
90740
- {
90741
- text: "KDJ",
90742
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'KDJ') }
90743
- },
90744
- {
90745
- text: "RSI",
90746
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'RSI') }
90747
- },
90748
- {
90749
- text: "WR",
90750
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'WR') }
90751
- },
90752
- {
90753
- text: "CCI",
90754
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'CCI') }
90755
- },
90756
- {
90757
- text: "TRIX",
90758
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'TRIX') }
90759
- }
90760
- ];
90761
-
90762
- return data;
90763
- }
90764
-
90765
- this.GetShowBeforeData=function(chart) //是否显示集合竞价
90766
- {
90767
- if (chart.IsShowBeforeData)
90768
- {
90769
- var data=
90770
- [
90771
- {
90772
- text: "隐藏",
90773
- click: function () { chart.ShowCallAuctionData( { Left:false, MultiDay:{ Left:false }} ); },
90774
- }
90775
- ];
90776
-
90777
- return data;
90778
- }
90779
- else
90780
- {
90781
- var data=
90782
- [
90783
- {
90784
- text: "显示",
90785
- click: function () { chart.ShowCallAuctionData({Left:true, MultiDay:{ Left:true }}); },
90786
- }
90787
- ];
90788
-
90789
- return data;
90790
- }
90791
- }
90792
-
90793
- this.GetSelectRect=function(chart) //区间选择
90794
- {
90795
- if (chart.EnableSelectRect)
90796
- {
90797
- var data=
90798
- [
90799
- {
90800
- text: "禁用区间选择",
90801
- click: function () { chart.EnableSelectRect=false; },
90802
- }
90803
- ];
90804
-
90805
- return data;
90806
- }
90807
- else
90808
- {
90809
- var data=
90810
- [
90811
- {
90812
- text: "启动区间选择",
90813
- click: function () { chart.EnableSelectRect=true },
90814
- }
90815
- ];
90816
-
90817
- return data;
90818
- }
90819
- }
90820
-
90821
- //指标窗口个数
90822
- this.GetIndexWindowCount=function(chart)
90823
- {
90824
- var data=
90825
- [
90826
- {
90827
- text: "1个窗口",
90828
- click: function () { chart.ChangeIndexWindowCount(2); }
90829
- },
90830
- {
90831
- text: "2个窗口",
90832
- click: function () { chart.ChangeIndexWindowCount(3); }
90833
- },
90834
- {
90835
- text: "3个窗口",
90836
- click: function () { chart.ChangeIndexWindowCount(4); }
90837
- },
90838
- {
90839
- text: "4个窗口",
90840
- click: function () { chart.ChangeIndexWindowCount(5); }
90841
- },
90842
- {
90843
- text: "5个窗口",
90844
- click: function () { chart.ChangeIndexWindowCount(6); }
90845
- }
90846
- ];
90847
-
90848
- var count=chart.Frame.SubFrame.length-1;
90849
- if ((count-1)>=0 && (count-1)<data.length) data[count-1].selected=true; //选中
90850
-
90851
- return data;
90852
- }
90853
-
90854
- //工具
90855
- this.GetTools=function(chart)
90856
- {
90857
- var data=[];
90858
- var drawTools=chart.GetExtendChartByClassName('DrawToolsButton');
90859
- if (drawTools)
90860
- {
90861
- data.push(
90862
- {
90863
- text: "关闭画图工具",
90864
- click: function ()
90865
- {
90866
- var toolsWidth=drawTools.Chart.Width;
90867
- var toolsIndex=parseInt(drawTools.Index);
90868
- chart.DeleteExtendChart(drawTools);
90869
- chart.Frame.ChartBorder.Right-=toolsWidth;
90870
- chart.SetSizeChange(true);
90871
- chart.Draw();
90872
- }
90873
- }
90874
- );
90875
- }
90876
- else
90877
- {
90878
- data.push(
90879
- {
90880
- text: "画图工具",
90881
- click: function () {
90882
- var option={Name:'画图工具', Top:chart.Frame.ChartBorder.Top };
90883
- var extendChart=chart.CreateExtendChart(option.Name, option); //创建扩展图形
90884
- chart.SetSizeChange(true);
90885
- chart.Draw();
90886
- }
90887
- }
90888
- );
90889
- }
90890
-
90891
- return data;
90892
- }
90893
- }
90894
-
90895
90178
  //画图工具 单个图形设置
90896
90179
  function ChartPictureSettingMenu(divElement)
90897
90180
  {
@@ -134949,6 +134232,317 @@ function ScrollBarBGChart()
134949
134232
  }
134950
134233
 
134951
134234
 
134235
+ /*
134236
+ Copyright (c) 2018 jones
134237
+
134238
+ http://www.apache.org/licenses/LICENSE-2.0
134239
+
134240
+ 开源项目 https://github.com/jones2000/HQChart
134241
+
134242
+ jones_2000@163.com
134243
+
134244
+ 内置菜单 使用table模式
134245
+ */
134246
+
134247
+ function JSPopMenu()
134248
+ {
134249
+ this.Data={ Menu:[], Position:0 }; //{ Name:, SVG, ID, bChecked:, SubMenu:[] } Position 0=右键菜单 1=Tab弹菜单 2=下拉菜单
134250
+
134251
+ this.RootDOM=null;
134252
+ this.TBodyDOM=null;
134253
+ this.ArySubRootDOM=[];
134254
+
134255
+ this.ClickCallback=null; //点击回调
134256
+ this.CheckedClassName="UMyChart_MenuItem_Span_Checked iconfont icon-checked"; //选中图标
134257
+ this.RightArrowClassName="UMyChart_MenuItem_Span_Arrow iconfont icon-menu_arraw_right"; //右侧箭头
134258
+ this.SelectedClassName="UMyChart_MenuItem_Tr_Selected";
134259
+
134260
+ this.AryTDClassName=
134261
+ [
134262
+ "UMyChart_MenuItem_Td_Status", //图标
134263
+ "UMyChart_MenuItem_Td_Content", //文字
134264
+ "UMyChart_MenuItem_Td_Shortcut", //快捷方式
134265
+ "UMyChart_MenuItem_Td_Arrow" //箭头
134266
+ ];
134267
+
134268
+ this.Inital=function()
134269
+ {
134270
+ window.addEventListener('mousedown', (e)=>{ this.OnWindowMouseDown(e)});
134271
+ }
134272
+
134273
+ //创建菜单
134274
+ this.CreatePopMenu=function(data)
134275
+ {
134276
+ this.Clear();
134277
+
134278
+ var root=document.createElement("div");
134279
+ root.className="UMyChart_PopMenu";
134280
+
134281
+ var table=document.createElement("table");
134282
+ table.className="UMyChart_PopMenu_Table";
134283
+ root.appendChild(table);
134284
+
134285
+ var tbody=document.createElement("tbody");
134286
+ tbody.className="UMyChart_PopMenu_Tbody";
134287
+ table.appendChild(tbody);
134288
+
134289
+
134290
+ var rootData={ Root:root, TBody:tbody, Table:table };
134291
+ for(var i=0;i<data.Menu.length;++i)
134292
+ {
134293
+ var item=data.Menu[i];
134294
+ var trDom=this.CreateMenu(rootData, item);
134295
+ tbody.appendChild(trDom);
134296
+ }
134297
+
134298
+ document.body.appendChild(root);
134299
+ this.RootDOM=root;
134300
+ this.TBodyDOM=tbody;
134301
+
134302
+ if (IFrameSplitOperator.IsNumber(data.Position)) this.Data.Position=data.Position;
134303
+ if (data.ClickCallback) this.ClickCallback=data.ClickCallback;
134304
+
134305
+ }
134306
+
134307
+ //清除菜单
134308
+ this.Clear=function()
134309
+ {
134310
+ this.Data.Menu=[];
134311
+ this.Data.Position=JSPopMenu.POSITION_ID.RIGHT_MENU_ID;
134312
+ this.ClickCallback=null;
134313
+
134314
+ if (!this.RootDOM) return;
134315
+
134316
+ document.body.removeChild(this.RootDOM);
134317
+ this.RootDOM=null;
134318
+ this.TBodyDOM=null;
134319
+
134320
+ for(var i=0;i<this.ArySubRootDOM.length;++i)
134321
+ {
134322
+ document.body.removeChild(this.ArySubRootDOM[i]);
134323
+ }
134324
+ this.ArySubRootDOM=[]
134325
+ }
134326
+
134327
+ this.CreateMenu=function(parentItem, item)
134328
+ {
134329
+ var trDom=document.createElement("tr");
134330
+ trDom.className='UMyChart_MenuItem_Tr';
134331
+
134332
+ var prtTdDom=null;
134333
+ for(var i=0;i<this.AryTDClassName.length;++i)
134334
+ {
134335
+ var tdDom=document.createElement("td");
134336
+ tdDom.className=this.AryTDClassName[i];
134337
+
134338
+ if (i==0) //图标
134339
+ {
134340
+ if (item.Checked)
134341
+ {
134342
+ var spanDom=document.createElement("span");
134343
+ spanDom.className=this.CheckedClassName;
134344
+ spanDom.style["font-size"]="10px";
134345
+ tdDom.appendChild(spanDom);
134346
+ }
134347
+ }
134348
+ else if (i==1) //内容
134349
+ {
134350
+ tdDom.innerText=item.Name;
134351
+ }
134352
+ else if (i==2) //快捷方式
134353
+ {
134354
+
134355
+ }
134356
+ else if (i==3) //箭头
134357
+ {
134358
+ if (IFrameSplitOperator.IsNonEmptyArray(item.SubMenu))
134359
+ {
134360
+ var spanDom=document.createElement("span");
134361
+ spanDom.className=this.RightArrowClassName;
134362
+ spanDom.style["font-size"]="10px";
134363
+ tdDom.appendChild(spanDom);
134364
+ }
134365
+ }
134366
+
134367
+ trDom.appendChild(tdDom);
134368
+ }
134369
+
134370
+ if (IFrameSplitOperator.IsNonEmptyArray(item.SubMenu)) //子菜单
134371
+ {
134372
+ var subRoot=document.createElement("div");
134373
+ subRoot.className="UMyChart_PopSubMenu";
134374
+
134375
+ var subTable=document.createElement("table");
134376
+ subTable.className="UMyChart_PopMenu_Table";
134377
+ subRoot.appendChild(subTable);
134378
+
134379
+ var subTbody=document.createElement("tbody");
134380
+ subTbody.className="UMyChart_PopMenu_TBody";
134381
+ subTable.appendChild(subTbody);
134382
+
134383
+ var subRootData={ Root:subRoot, TBody:subTbody, Table:subTable };
134384
+ var preTrDom=null;
134385
+ for(var i=0;i<item.SubMenu.length;++i)
134386
+ {
134387
+ var subItem=item.SubMenu[i];
134388
+ if (subItem.Name==JSPopMenu.SEPARATOR_LINE_NAME)
134389
+ {
134390
+ var trSeparator=document.createElement("tr");
134391
+ trSeparator.className='UMyChart_MenuItem_Tr_Separator';
134392
+ var tdDom=document.createElement("td");
134393
+ tdDom.className="UMyChart_MenuItem_Td_Status_Separator";
134394
+ trSeparator.appendChild(tdDom);
134395
+ var tdDom=document.createElement("td");
134396
+ tdDom.className="UMyChart_MenuItem_Td_Separator";
134397
+ trSeparator.appendChild(tdDom);
134398
+ var tdDom=document.createElement("td");
134399
+ tdDom.className="UMyChart_MenuItem_Td_Separator";
134400
+ trSeparator.appendChild(tdDom);
134401
+ var tdDom=document.createElement("td");
134402
+ tdDom.className="UMyChart_MenuItem_Td_Separator";
134403
+ trSeparator.appendChild(tdDom);
134404
+ subTbody.appendChild(trSeparator);
134405
+ continue;
134406
+ }
134407
+
134408
+ var subTrDom=this.CreateMenu(subRootData, subItem);
134409
+ preTrDom=subTrDom;
134410
+ subTbody.appendChild(subTrDom);
134411
+ }
134412
+
134413
+ trDom.onmouseover=(e)=>{ this.OnMouseOver(e, parentItem, trDom, subRoot); }
134414
+ document.body.appendChild(subRoot);
134415
+ this.ArySubRootDOM.push(subRoot);
134416
+ }
134417
+ else
134418
+ {
134419
+ trDom.onmousedown=(e)=> { this.OnClickMenu(e, item, false); }; //菜单点击
134420
+ trDom.onmouseover=(e)=>{ this.OnMouseOver(e, parentItem); }
134421
+ }
134422
+
134423
+ return trDom;
134424
+ }
134425
+
134426
+ //弹tab菜单
134427
+ this.PopupMenuByTab=function(rtTab)
134428
+ {
134429
+ if (!this.RootDOM) return;
134430
+ if (!rtTab) return;
134431
+
134432
+ var xLeft=rtTab.Left;
134433
+ var yTop=rtTab.Top-this.RootDOM.offsetHeight;
134434
+
134435
+ this.RootDOM.style.visibility='visible';
134436
+ this.RootDOM.style.top = yTop + "px";
134437
+ this.RootDOM.style.left = xLeft + "px";
134438
+ }
134439
+
134440
+ //弹右键菜单
134441
+ this.PopupMenuByRight=function(x,y)
134442
+ {
134443
+ if (!this.RootDOM) return;
134444
+ if (!IFrameSplitOperator.IsNumber(x) || !IFrameSplitOperator.IsNumber(y)) return;
134445
+
134446
+ //菜单在当前屏幕无法显示需要调整
134447
+ var menuHeight=this.RootDOM.offsetHeight;
134448
+ var yMenuBottom=y+menuHeight;
134449
+ var yBottom=window.innerHeight-15;
134450
+ if (yMenuBottom>yBottom) y=yBottom-menuHeight;
134451
+
134452
+ var menuWidth=this.RootDOM.offsetWidth;
134453
+ var yMenuRight=x+menuWidth;
134454
+ var yRight=window.innerWidth-15;
134455
+ if (yMenuRight>yRight) x=yRight-menuWidth;
134456
+
134457
+ this.RootDOM.style.visibility='visible';
134458
+ this.RootDOM.style.top = y + "px";
134459
+ this.RootDOM.style.left = x + "px";
134460
+ }
134461
+
134462
+ this.OnClickMenu=function(e, item, bSubMenu)
134463
+ {
134464
+ console.log("[JSPopMenu::OnClickMenu] e=, item=, bSubMenu", e, item, bSubMenu);
134465
+ if (!this.ClickCallback) return;
134466
+
134467
+ this.ClickCallback(item);
134468
+ }
134469
+
134470
+ this.OnMouseOver=function(e, parentItem, trDom, subMenu)
134471
+ {
134472
+ if (parentItem && parentItem.PopMenu && parentItem.PopMenu!=subMenu)
134473
+ {
134474
+ parentItem.PopMenu.style.visibility="hidden";
134475
+ if (parentItem.PopRow) parentItem.PopRow.classList.remove(this.SelectedClassName);
134476
+
134477
+ parentItem.PopMenu=null;
134478
+ parentItem.PopRow=null;
134479
+ }
134480
+
134481
+ if (subMenu)
134482
+ {
134483
+ if (subMenu.style.visibility=="visible")
134484
+ {
134485
+
134486
+ }
134487
+ else
134488
+ {
134489
+ var rtParent=trDom.getBoundingClientRect();
134490
+ var x=rtParent.right, y=rtParent.top;
134491
+
134492
+ //菜单在当前屏幕无法显示需要调整
134493
+ var yBottom=window.innerHeight-15;
134494
+ var yRight=window.innerWidth-15;
134495
+ var menuHeight=subMenu.offsetHeight;
134496
+ var menuWidth=subMenu.offsetWidth;
134497
+ var yMenuBottom=y+menuHeight;
134498
+ var yMenuRight=x+menuWidth;
134499
+
134500
+ if (yMenuBottom>yBottom) y=yBottom-menuHeight;
134501
+ if (yMenuRight>yRight) x=rtParent.left-menuWidth;
134502
+
134503
+ subMenu.style.left=`${x}px`;
134504
+ subMenu.style.top=`${y}px`;
134505
+
134506
+ trDom.classList.add(this.SelectedClassName);
134507
+
134508
+ /*
134509
+ if (this.Data.Position==JSPopMenu.POSITION_ID.TAB_MENU_ID)
134510
+ {
134511
+ var yButton=parentItem.Root.getBoundingClientRect().bottom;
134512
+ var ySubButton=subMenu.getBoundingClientRect().bottom;
134513
+ if (yButton<ySubButton)
134514
+ {
134515
+ var yOffset=yButton-ySubButton;
134516
+ subMenu.style.top=`${yOffset}px`;
134517
+ }
134518
+ }
134519
+ */
134520
+
134521
+ subMenu.style.visibility="visible";
134522
+ }
134523
+
134524
+ parentItem.PopMenu=subMenu;
134525
+ parentItem.PopRow=trDom;
134526
+ }
134527
+ }
134528
+
134529
+
134530
+
134531
+ this.OnWindowMouseDown=function(e)
134532
+ {
134533
+ if (!this.RootDOM) return;
134534
+
134535
+ console.log("[JSPopMenu::OnWindowMouseDown] e=", e);
134536
+
134537
+ this.Clear();
134538
+ }
134539
+ }
134540
+
134541
+
134542
+ JSPopMenu.POSITION_ID={ };
134543
+ JSPopMenu.POSITION_ID.RIGHT_MENU_ID=0;
134544
+ JSPopMenu.POSITION_ID.TAB_MENU_ID=1;
134545
+ JSPopMenu.SEPARATOR_LINE_NAME="MENU_SEPARATOR"; //分割线
134952
134546
  ///////////////////////////////////////////////////////////////////////////////////
134953
134547
  // 工作线程计算指标示例
134954
134548
  //
@@ -135070,7 +134664,7 @@ function HQChartScriptWorker()
135070
134664
 
135071
134665
 
135072
134666
 
135073
- var HQCHART_VERSION="1.1.13170";
134667
+ var HQCHART_VERSION="1.1.13190";
135074
134668
 
135075
134669
  function PrintHQChartVersion()
135076
134670
  {
@@ -135202,10 +134796,13 @@ export default {
135202
134796
  JSCHART_DRAG_ID:JSCHART_DRAG_ID,
135203
134797
  JSCHART_BUTTON_ID:JSCHART_BUTTON_ID,
135204
134798
  JSCHART_DATA_FIELD_ID:JSCHART_DATA_FIELD_ID,
135205
- JSCHART_WORKER_MESSAGE_ID:JSCHART_WORKER_MESSAGE_ID
134799
+ JSCHART_WORKER_MESSAGE_ID:JSCHART_WORKER_MESSAGE_ID,
134800
+ JSCHART_MENU_ID:JSCHART_MENU_ID
135206
134801
  },
135207
134802
 
135208
134803
 
135209
134804
  HQChartScriptWorker:HQChartScriptWorker, //计算工作线程
134805
+
134806
+ JSPopMenu:JSPopMenu, //弹出菜单
135210
134807
 
135211
134808
  }