hqchart 1.1.15808 → 1.1.15821

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.
@@ -0,0 +1,2342 @@
1
+ /*
2
+ Copyright (c) 2018 jones
3
+
4
+ http://www.apache.org/licenses/LICENSE-2.0
5
+
6
+ 开源项目 https://github.com/jones2000/HQChart
7
+
8
+ jones_2000@163.com
9
+
10
+ 封装订单表格控件 (H5版本)
11
+ 使用新的class语法
12
+ */
13
+
14
+
15
+ class JSOrderChart
16
+ {
17
+ DivElement=null;
18
+ JSChartContainer=null; //表格控件
19
+ ResizeListener=null; //大小变动监听
20
+ CanvasElement=null;
21
+
22
+ constructor(divElement)
23
+ {
24
+ this.DivElement=divElement;
25
+
26
+ //h5 canvas
27
+ this.CanvasElement=document.createElement("canvas");
28
+ this.CanvasElement.className='jsorderlist-drawing';
29
+ this.CanvasElement.id=Guid();
30
+ this.CanvasElement.setAttribute("tabindex",0);
31
+ if (this.CanvasElement.style) this.CanvasElement.style.outline='none';
32
+ if(divElement.hasChildNodes())
33
+ {
34
+ JSConsole.Chart.Log("[JSOrderChart::JSOrderChart] divElement hasChildNodes", divElement.childNodes);
35
+ }
36
+ divElement.appendChild(this.CanvasElement);
37
+ }
38
+
39
+
40
+ OnSize()
41
+ {
42
+ //画布大小通过div获取
43
+ var height=this.DivElement.offsetHeight;
44
+ var width=this.DivElement.offsetWidth;
45
+ if (this.DivElement.style.height && this.DivElement.style.width)
46
+ {
47
+ if (this.DivElement.style.height.includes("px"))
48
+ height=parseInt(this.DivElement.style.height.replace("px",""));
49
+ if (this.DivElement.style.width.includes("px"))
50
+ width=parseInt(this.DivElement.style.width.replace("px",""));
51
+ }
52
+
53
+ this.CanvasElement.height=height;
54
+ this.CanvasElement.width=width;
55
+ this.CanvasElement.style.width=this.CanvasElement.width+'px';
56
+ this.CanvasElement.style.height=this.CanvasElement.height+'px';
57
+
58
+ var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率
59
+ this.CanvasElement.height*=pixelTatio;
60
+ this.CanvasElement.width*=pixelTatio;
61
+
62
+ JSConsole.Chart.Log(`[JSOrderChart::OnSize] devicePixelRatio=${window.devicePixelRatio}, height=${this.CanvasElement.height}, width=${this.CanvasElement.width}`);
63
+
64
+ if (this.JSChartContainer && this.JSChartContainer.OnSize)
65
+ {
66
+ this.JSChartContainer.OnSize();
67
+ }
68
+ }
69
+
70
+ SetOption(option)
71
+ {
72
+ var chart=this.CreateJSOrderChartContainer(option);
73
+
74
+ if (!chart) return false;
75
+
76
+ if (option.OnCreatedCallback) option.OnCreatedCallback(chart);
77
+
78
+ this.JSChartContainer=chart;
79
+ this.DivElement.JSChart=this; //div中保存一份
80
+
81
+ //注册事件
82
+ if (IFrameSplitOperator.IsNonEmptyArray(option.EventCallback))
83
+ {
84
+ for(var i=0;i<option.EventCallback.length;++i)
85
+ {
86
+ var item=option.EventCallback[i];
87
+ chart.AddEventCallback(item);
88
+ }
89
+ }
90
+
91
+ if (option.EnableResize==true) this.CreateResizeListener();
92
+
93
+ //if (option.FloatTooltip && option.FloatTooltip.Enable) chart.InitalFloatTooltip(option.FloatTooltip); //提示信息
94
+
95
+ if (!option.Symbol)
96
+ {
97
+ chart.Draw();
98
+ }
99
+ else
100
+ {
101
+ chart.ChangeSymbol(option.Symbol);
102
+ }
103
+ }
104
+
105
+ CreateResizeListener()
106
+ {
107
+ this.ResizeListener = new ResizeObserver((entries)=>{ this.OnDivResize(entries); });
108
+ this.ResizeListener.observe(this.DivElement);
109
+ }
110
+
111
+ OnDivResize=function(entries)
112
+ {
113
+ JSConsole.Chart.Log("[JSOrderChart::OnDivResize] entries=", entries);
114
+ this.OnSize();
115
+ }
116
+
117
+
118
+ CreateJSOrderChartContainer(option)
119
+ {
120
+ var chart=new JSOrderChartContainer(this.CanvasElement);
121
+ chart.Create(option);
122
+
123
+ if (option.NetworkFilter) chart.NetworkFilter=option.NetworkFilter;
124
+ if (option.Column) chart.SetColumn(option.Column);
125
+
126
+ this.SetChartBorder(chart, option);
127
+
128
+ //是否自动更新
129
+ if (option.IsAutoUpdate!=null) chart.IsAutoUpdate=option.IsAutoUpdate;
130
+ if (option.AutoUpdateFrequency>0) chart.AutoUpdateFrequency=option.AutoUpdateFrequency;
131
+
132
+ var orderChart=chart.GetOrderChart();
133
+
134
+ //注册事件
135
+ if (option.EventCallback)
136
+ {
137
+ for(var i=0;i<option.EventCallback.length;++i)
138
+ {
139
+ var item=option.EventCallback[i];
140
+ chart.AddEventCallback(item);
141
+ }
142
+ }
143
+
144
+ return chart;
145
+ }
146
+
147
+ SetChartBorder(chart, option)
148
+ {
149
+ if (!option.Border) return;
150
+
151
+ var item=option.Border;
152
+ if (IFrameSplitOperator.IsNumber(option.Border.Left)) chart.Frame.ChartBorder.Left=option.Border.Left;
153
+ if (IFrameSplitOperator.IsNumber(option.Border.Right)) chart.Frame.ChartBorder.Right=option.Border.Right;
154
+ if (IFrameSplitOperator.IsNumber(option.Border.Top)) chart.Frame.ChartBorder.Top=option.Border.Top;
155
+ if (IFrameSplitOperator.IsNumber(option.Border.Bottom)) chart.Frame.ChartBorder.Bottom=option.Border.Bottom;
156
+
157
+ var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率
158
+ chart.Frame.ChartBorder.Left*=pixelTatio;
159
+ chart.Frame.ChartBorder.Right*=pixelTatio;
160
+ chart.Frame.ChartBorder.Top*=pixelTatio;
161
+ chart.Frame.ChartBorder.Bottom*=pixelTatio;
162
+ }
163
+
164
+ /////////////////////////////////////////////////////////////////////////////
165
+ //对外接口
166
+
167
+ //切换股票代码接口
168
+ ChangeSymbol(symbol, option)
169
+ {
170
+ if (this.JSChartContainer) this.JSChartContainer.ChangeSymbol(symbol,option);
171
+ }
172
+
173
+ //事件回调
174
+ AddEventCallback=function(obj)
175
+ {
176
+ if(this.JSChartContainer && typeof(this.JSChartContainer.AddEventCallback)=='function')
177
+ {
178
+ JSConsole.Chart.Log('[JSOrderChart:AddEventCallback] obj=', obj);
179
+ this.JSChartContainer.AddEventCallback(obj);
180
+ }
181
+ }
182
+
183
+ //重新加载配置
184
+ ReloadResource(option)
185
+ {
186
+ if(this.JSChartContainer && typeof(this.JSChartContainer.ReloadResource)=='function')
187
+ {
188
+ JSConsole.Chart.Log('[JSOrderChart:ReloadResource] ');
189
+ this.JSChartContainer.ReloadResource(option);
190
+ }
191
+ }
192
+
193
+ ChartDestroy=function()
194
+ {
195
+ if (this.JSChartContainer && typeof (this.JSChartContainer.ChartDestroy) == 'function')
196
+ {
197
+ this.JSChartContainer.ChartDestroy();
198
+ }
199
+ }
200
+
201
+
202
+ //初始化 静态方法
203
+ static Init(divElement)
204
+ {
205
+ var jsChartControl=new JSOrderChart(divElement);
206
+ jsChartControl.OnSize();
207
+
208
+ return jsChartControl;
209
+ }
210
+ }
211
+
212
+
213
+ class JSOrderChartContainer
214
+ {
215
+ ClassName='JSOrderChartContainer';
216
+ Frame; //框架画法
217
+ ChartPaint=[]; //图形画法
218
+ ChartSplashPaint=null; //等待提示
219
+ LoadDataSplashTitle="数据加载中"; //下载数据提示信息
220
+ Canvas=null; //画布
221
+
222
+ Symbol=null;
223
+ Name=null;
224
+ TradeDate=null;
225
+ NetworkFilter=null; //数据回调接口
226
+ Data={ DataOffset:0, Data:[], BasePrice:null }; //显示数据
227
+ SourceData={ Data:[], MapData:new Map(), BasePrice:null }; //原始数据 { Price:, Color:, BGColor:, Data:{ } }
228
+
229
+ //事件回调
230
+ MapEvent=new Map(); //通知外部调用 key:JSCHART_EVENT_ID value:{Callback:回调,}
231
+
232
+ AutoUpdateTimer=null;
233
+ AutoUpdateFrequency=15000; //更新频率
234
+
235
+ GotoBasePageConfig={ Enable:true, Timer:null, Frequency:5000, StartTime:null }; //自动回到基准页面
236
+
237
+ FloatTooltip=null; //提示浮框
238
+
239
+ UIElement=null;
240
+ LastPoint={ X:null, Y:null }; //鼠标位置
241
+
242
+ //MouseOnStatus:{ RowIndex:行, ColumnIndex:列}
243
+ LastMouseStatus={ MoveStatus:null, TooltipStatus:null, MouseOnStatus:null };
244
+
245
+ IsDestroy=false; //是否已经销毁了
246
+
247
+ constructor(uielement)
248
+ {
249
+ this.Canvas=uielement.getContext("2d"); //画布
250
+ this.UIElement=uielement;
251
+ }
252
+
253
+ ChartDestroy() //销毁
254
+ {
255
+ this.IsDestroy=true;
256
+ this.StopAutoUpdate();
257
+
258
+ this.DestroyFloatTooltip();
259
+ }
260
+
261
+ HideFloatTooltip()
262
+ {
263
+ if (!this.FloatTooltip) return;
264
+
265
+ this.FloatTooltip.Hide();
266
+ }
267
+
268
+ DestroyFloatTooltip()
269
+ {
270
+ if (!this.FloatTooltip) return;
271
+
272
+ this.FloatTooltip.Destroy();
273
+ this.FloatTooltip=null;
274
+ }
275
+
276
+ InitalFloatTooltip(option)
277
+ {
278
+ if (this.FloatTooltip) return;
279
+
280
+ this.FloatTooltip=new JSFloatTooltip();
281
+ this.FloatTooltip.Inital(this, option);
282
+ this.FloatTooltip.Create();
283
+ }
284
+
285
+ DrawFloatTooltip(point,toolTip)
286
+ {
287
+ if (!this.FloatTooltip) return;
288
+
289
+ this.UpdateFloatTooltip(point, toolTip)
290
+ }
291
+
292
+ UpdateFloatTooltip(point, toolTip)
293
+ {
294
+ if (!this.FloatTooltip) return;
295
+
296
+ var sendData=
297
+ {
298
+ Tooltip:toolTip,
299
+ Point:point,
300
+ DataType:6,
301
+ };
302
+
303
+ this.FloatTooltip.Update(sendData);
304
+ }
305
+
306
+ HideAllTooltip()
307
+ {
308
+ this.HideFloatTooltip();
309
+ }
310
+
311
+ CloneArray=function(aryData)
312
+ {
313
+ var data=[];
314
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryData)) return data;
315
+
316
+ for(var i=0;i<aryData.length;++i)
317
+ {
318
+ data.push(aryData[i]);
319
+ }
320
+
321
+ return data;
322
+ }
323
+
324
+ //创建
325
+ //windowCount 窗口个数
326
+ Create(option)
327
+ {
328
+ this.UIElement.JSChartContainer=this;
329
+
330
+ //创建等待提示
331
+ this.ChartSplashPaint = new ChartSplashPaint();
332
+ this.ChartSplashPaint.Canvas = this.Canvas;
333
+ this.ChartSplashPaint.SetTitle(this.LoadDataSplashTitle);
334
+
335
+ //创建框架
336
+ this.Frame=new JSOrderFrame();
337
+ this.Frame.ChartBorder=new ChartBorder();
338
+ this.Frame.ChartBorder.UIElement=this.UIElement;
339
+ this.Frame.ChartBorder.Top=30;
340
+ this.Frame.ChartBorder.Left=5;
341
+ this.Frame.ChartBorder.Bottom=20;
342
+ this.Frame.Canvas=this.Canvas;
343
+
344
+ this.ChartSplashPaint.Frame = this.Frame;
345
+
346
+ //创建表格
347
+ var chart=new ChartOrderList();
348
+ chart.Frame=this.Frame;
349
+ chart.ChartBorder=this.Frame.ChartBorder;
350
+ chart.Canvas=this.Canvas;
351
+ chart.UIElement=this.UIElement;
352
+ chart.GetEventCallback=(id)=> { return this.GetEventCallback(id); }
353
+ this.ChartPaint[0]=chart;
354
+
355
+ if (option)
356
+ {
357
+ if (IFrameSplitOperator.IsNumber(option.BorderLine)) this.Frame.BorderLine=option.BorderLine; //边框
358
+ if (IFrameSplitOperator.IsBool(option.IsShowHeader)) chart.IsShowHeader=option.IsShowHeader;
359
+ }
360
+
361
+ var bRegisterKeydown=true;
362
+ var bRegisterWheel=true;
363
+
364
+ if (option)
365
+ {
366
+ if (option.KeyDown===false)
367
+ {
368
+ bRegisterKeydown=false;
369
+ JSConsole.Chart.Log('[JSOrderChartContainer::Create] not register keydown event.');
370
+ }
371
+
372
+ if (option.Wheel===false)
373
+ {
374
+ bRegisterWheel=false;
375
+ JSConsole.Chart.Log('[JSOrderChartContainer::Create] not register wheel event.');
376
+ }
377
+
378
+ if (IFrameSplitOperator.IsBool(option.EnableSelected)) chart.SelectedData.Enable=option.EnableSelected;
379
+ }
380
+
381
+ if (bRegisterKeydown) this.UIElement.addEventListener("keydown", (e)=>{ this.OnKeyDown(e); }, true); //键盘消息
382
+ if (bRegisterWheel) this.UIElement.addEventListener("wheel", (e)=>{ this.OnWheel(e); }, true); //上下滚动消息
383
+
384
+ this.UIElement.onmousedown=(e)=> { this.UIOnMouseDown(e); }
385
+ this.UIElement.ondblclick=(e)=>{ this.UIOnDblClick(e); }
386
+ this.UIElement.oncontextmenu=(e)=> { this.UIOnContextMenu(e); }
387
+ this.UIElement.onmousemove=(e)=>{ this.UIOnMouseMove(e);}
388
+ this.UIElement.onmouseout=(e)=>{ this.UIOnMounseOut(e); }
389
+ this.UIElement.onmouseleave=(e)=>{ this.UIOnMouseleave(e); }
390
+ }
391
+
392
+ SetColumn(columnData)
393
+ {
394
+ var chart=this.GetOrderChart();
395
+ if (chart) chart.SetColumn(columnData);
396
+ }
397
+
398
+ Draw()
399
+ {
400
+ if (this.UIElement.width<=0 || this.UIElement.height<=0) return;
401
+
402
+ this.Canvas.clearRect(0,0,this.UIElement.width,this.UIElement.height);
403
+ var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率
404
+ this.Canvas.lineWidth=pixelTatio; //手机端需要根据分辨率比调整线段宽度
405
+
406
+ if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash)
407
+ {
408
+ this.Frame.Draw( { IsEnableSplash:this.ChartSplashPaint.IsEnableSplash} );
409
+ this.ChartSplashPaint.Draw();
410
+ return;
411
+ }
412
+
413
+ this.Frame.Draw();
414
+ this.Frame.DrawLogo();
415
+
416
+ //框架内图形
417
+ for(var i=0;i<this.ChartPaint.length;++i)
418
+ {
419
+ var item=this.ChartPaint[i];
420
+ if (item.IsDrawFirst)
421
+ item.Draw();
422
+ }
423
+
424
+ for(var i=0; i<this.ChartPaint.length; ++i)
425
+ {
426
+ var item=this.ChartPaint[i];
427
+ if (!item.IsDrawFirst)
428
+ item.Draw();
429
+ }
430
+ }
431
+
432
+ ClearData()
433
+ {
434
+ this.Data={ DataOffset:0, Data:[], BasePrice:null }; //分笔数据
435
+ this.SourceData={ Data:[], MapData:new Map(), BasePrice:null }; //原始分笔数据
436
+ }
437
+
438
+ ChangeSymbol(symbol, option)
439
+ {
440
+ this.Symbol=symbol;
441
+ this.ClearData();
442
+
443
+ var chart=this.GetOrderChart()
444
+ if (chart)
445
+ {
446
+ chart.Data=null;
447
+ chart.SelectedData.Data=null;
448
+ chart.MoveOnData.Data=null;
449
+ }
450
+
451
+ if (option)
452
+ {
453
+ if (IFrameSplitOperator.IsNumber(option.TradeDate)) this.TradeDate=option.TradeDate;
454
+ }
455
+
456
+ if (!this.Symbol)
457
+ {
458
+ this.Draw();
459
+ return;
460
+ }
461
+
462
+ this.RequestOrderData();
463
+ }
464
+
465
+ CancelAutoUpdate() //关闭停止更新
466
+ {
467
+ if (typeof (this.AutoUpdateTimer) == 'number')
468
+ {
469
+ clearTimeout(this.AutoUpdateTimer);
470
+ this.AutoUpdateTimer = null;
471
+ }
472
+ }
473
+
474
+ AutoUpdateEvent(bStart, explain) //自定更新事件, 是给websocket使用
475
+ {
476
+ var eventID=bStart ? JSCHART_EVENT_ID.RECV_START_AUTOUPDATE:JSCHART_EVENT_ID.RECV_STOP_AUTOUPDATE;
477
+ if (!this.MapEvent.has(eventID)) return;
478
+
479
+ var self=this;
480
+ var event=this.MapEvent.get(eventID);
481
+ var data={ Stock:{ Symbol:this.Symbol, Name:this.Name, DayCount:this.DayCount }, Explain: explain };
482
+ if (bStart)
483
+ {
484
+ data.Callback=function(data) //数据到达更新回调
485
+ {
486
+ self.RecvDealUpdateData(data);
487
+ }
488
+ }
489
+ event.Callback(event,data,this);
490
+ }
491
+
492
+ //全量数据下载
493
+ RequestOrderData()
494
+ {
495
+ this.ChartSplashPaint.SetTitle(this.LoadDataSplashTitle);
496
+ this.ChartSplashPaint.EnableSplash(true);
497
+ this.Draw();
498
+
499
+ var self=this;
500
+ if (this.NetworkFilter)
501
+ {
502
+ var obj=
503
+ {
504
+ Name:'JSOrderChartContainer::RequestOrderData', //类名::
505
+ Explain:'价格列表',
506
+ Request:{ Data: { symbol:self.Symbol, tradeDate:self.TradeDate } },
507
+ Self:this,
508
+ PreventDefault:false
509
+ };
510
+ this.NetworkFilter(obj, function(data)
511
+ {
512
+ self.ChartSplashPaint.EnableSplash(false);
513
+ self.RecvOrderData(data);
514
+ self.AutoUpdateEvent(true,'JSOrderChartContainer::RecvOrderData');
515
+ self.AutoUpdate();
516
+ });
517
+
518
+ if (obj.PreventDefault==true) return; //已被上层替换,不调用默认的网络请求
519
+ }
520
+ }
521
+
522
+ SortSourceData()
523
+ {
524
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data)) return;
525
+
526
+ this.SourceData.Data.sort((left,right)=>{ return right.Price-left.Price; });
527
+ }
528
+
529
+ RecvOrderData(data)
530
+ {
531
+ var chart=this.GetOrderChart();
532
+ if (!chart) return;
533
+
534
+ var aryOrder=JSOrderChartContainer.JsonDataToOrderData(data);
535
+
536
+ if (data && IFrameSplitOperator.IsNumber(data.basePrice)) this.SourceData.BasePrice=data.basePrice;
537
+
538
+ if (IFrameSplitOperator.IsNonEmptyArray(aryOrder))
539
+ {
540
+ for(var i=0;i<aryOrder.length; ++i)
541
+ {
542
+ var item=aryOrder[i];
543
+ if (!IFrameSplitOperator.IsNumber(item.Price)) continue;
544
+ if (this.SourceData.MapData.has(item.Price)) continue; //去重
545
+
546
+ //插入
547
+ this.SourceData.MapData.set(item.Price, item);
548
+ this.SourceData.Data.push(item);
549
+ }
550
+ }
551
+
552
+ this.SortSourceData();
553
+
554
+ this.Data={ DataOffset:0, Data:this.SourceData.Data.slice(), BasePrice:this.SourceData.BasePrice };
555
+
556
+ this.Symbol=data.symbol;
557
+ this.Name=data.name;
558
+
559
+ var chart=this.GetOrderChart();
560
+ chart.Data=this.Data;
561
+ chart.Symbol=this.Symbol;
562
+
563
+ this.GotoBasePage();
564
+
565
+ this.Draw();
566
+ }
567
+
568
+ RecvOrderUpdateData(data)
569
+ {
570
+ var chart=this.GetOrderChart();
571
+ if (!chart) return;
572
+
573
+ var aryOrder=JSOrderChartContainer.JsonDataToOrderData(data);
574
+ if (data && IFrameSplitOperator.IsNumber(data.basePrice)) this.SourceData.BasePrice=data.basePrice;
575
+
576
+ var bUpdate=false;
577
+ if (IFrameSplitOperator.IsNonEmptyArray(aryOrder))
578
+ {
579
+ for(var i=0;i<aryOrder.length; ++i)
580
+ {
581
+ var item=aryOrder[i];
582
+ if (!IFrameSplitOperator.IsNumber(item.Price)) continue;
583
+ if (this.SourceData.MapData.has(item.Price)) //更新
584
+ {
585
+ var priceItem=this.SourceData.MapData.get(item.Price);
586
+ if (!priceItem.Data)
587
+ {
588
+ priceItem.Data=item.Data;
589
+ }
590
+ else
591
+ {
592
+ var merged=Object.assign({}, priceItem.Data, item.Data); //合并
593
+ priceItem.Data=merged;
594
+ }
595
+ bUpdate=true;
596
+ }
597
+ else
598
+ {
599
+ //插入
600
+ this.SourceData.MapData.set(item.Price, item);
601
+ this.SourceData.Data.push(item);
602
+ bUpdate=true;
603
+ }
604
+ }
605
+ }
606
+
607
+ this.SortSourceData();
608
+
609
+ this.Data.Data=this.SourceData.Data.slice();
610
+ this.Data.BasePrice=this.SourceData.BasePrice;
611
+
612
+ if (bUpdate) this.Draw();
613
+ }
614
+
615
+ GotoBasePage(option)
616
+ {
617
+ if (!IFrameSplitOperator.IsNumber(this.SourceData.BasePrice)) return false;
618
+ var chart=this.GetOrderChart();
619
+ if (!chart) return false;
620
+
621
+ var index=-1;
622
+ for(var i=0;i<this.Data.Data.length;++i)
623
+ {
624
+ var item=this.Data.Data[i];
625
+ if (item.Price===this.SourceData.BasePrice)
626
+ {
627
+ index=i;
628
+ break;
629
+ }
630
+ }
631
+
632
+ if (index<0) return false;
633
+ var pageSize=chart.GetPageSize(chart.SizeChange);
634
+
635
+ var offset=index-parseInt(pageSize/2);
636
+ if (offset<0) offset=0;
637
+
638
+ this.Data.DataOffset=offset;
639
+
640
+ if (option && option.Draw===true) this.Draw();
641
+
642
+ this.StopGotoPagePageTimer();
643
+
644
+ return true;
645
+ }
646
+
647
+ IsInBasePage()
648
+ {
649
+ var chart=this.GetOrderChart();
650
+ if (!chart) return false;
651
+
652
+ if (!this.Data) return false;
653
+ if (!IFrameSplitOperator.IsNumber(this.Data.BasePrice)) return false;
654
+
655
+ if (chart.MapDrawPrice.has(this.Data.BasePrice)) return true;
656
+
657
+ return false;
658
+ }
659
+
660
+ //增量数据下载
661
+ RequestOrderUpdateData()
662
+ {
663
+ var self=this;
664
+
665
+ if (this.NetworkFilter)
666
+ {
667
+ var obj=
668
+ {
669
+ Name:'JSOrderChartContainer::RequestOrderUpdateData', //类名::函数名
670
+ Explain:'增量价格列表',
671
+ Request:{ Data: { symbol: self.Symbol } },
672
+ Self:this,
673
+ PreventDefault:false
674
+ };
675
+
676
+ this.NetworkFilter(obj, function(data)
677
+ {
678
+ self.RecvOrderUpdateData(data);
679
+ self.AutoUpdate();
680
+ });
681
+
682
+ if (obj.PreventDefault==true) return;
683
+ }
684
+ }
685
+
686
+ GetOrderChart()
687
+ {
688
+ return this.ChartPaint[0];
689
+ }
690
+
691
+
692
+ AutoUpdate(waitTime) //waitTime 更新时间
693
+ {
694
+ this.CancelAutoUpdate();
695
+ if (!this.IsAutoUpdate) return;
696
+ if (!this.Symbol) return;
697
+
698
+ var self = this;
699
+ var marketStatus=MARKET_SUFFIX_NAME.GetMarketStatus(this.Symbol);
700
+ if (marketStatus==0 || marketStatus==3) //闭市,盘后
701
+ {
702
+ this.AutoUpdateTimer=setTimeout(function()
703
+ {
704
+ self.AutoUpdate();
705
+ },20000);
706
+ return;
707
+ }
708
+
709
+ var frequency=this.AutoUpdateFrequency;
710
+ if (marketStatus==1) //盘前
711
+ {
712
+ this.AutoUpdateTimer=setTimeout(function()
713
+ {
714
+ self.AutoUpdate();
715
+ },frequency);
716
+ }
717
+ else if (marketStatus==2) //盘中
718
+ {
719
+ this.AutoUpdateTimer=setTimeout(function()
720
+ {
721
+ self.RequestOrderUpdateData();
722
+ },frequency);
723
+ }
724
+ }
725
+
726
+ StopAutoUpdate()
727
+ {
728
+ this.CancelAutoUpdate();
729
+ this.AutoUpdateEvent(false,'JSOrderChartContainer::StopAutoUpdate');
730
+ if (!this.IsAutoUpdate) return;
731
+ this.IsAutoUpdate=false;
732
+ }
733
+
734
+ //设置事件回调
735
+ //{event:事件id, callback:回调函数}
736
+ AddEventCallback(object)
737
+ {
738
+ if (!object || !object.event || !object.callback) return;
739
+
740
+ var data={Callback:object.callback, Source:object};
741
+ this.MapEvent.set(object.event,data);
742
+ }
743
+
744
+ RemoveEventCallback(eventid)
745
+ {
746
+ if (!this.MapEvent.has(eventid)) return;
747
+
748
+ this.MapEvent.delete(eventid);
749
+ }
750
+
751
+ GetEventCallback(id) //获取事件回调
752
+ {
753
+ if (!this.MapEvent.has(id)) return null;
754
+ var item=this.MapEvent.get(id);
755
+ return item;
756
+ }
757
+
758
+ OnSize()
759
+ {
760
+ if (!this.Frame) return;
761
+
762
+ this.SetSizeChange(true);
763
+
764
+ this.Draw();
765
+ }
766
+
767
+ SetSizeChange(bChanged)
768
+ {
769
+ var chart=this.GetOrderChart();
770
+ if (chart) chart.SizeChange=bChanged;
771
+ }
772
+
773
+
774
+ OnWheel(e) //滚轴
775
+ {
776
+ JSConsole.Chart.Log('[JSOrderChartContainer::OnWheel]',e);
777
+ if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;
778
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return;
779
+
780
+ var x = e.clientX-this.UIElement.getBoundingClientRect().left;
781
+ var y = e.clientY-this.UIElement.getBoundingClientRect().top;
782
+
783
+ var isInClient=false;
784
+ this.Canvas.beginPath();
785
+ this.Canvas.rect(this.Frame.ChartBorder.GetLeft(),this.Frame.ChartBorder.GetTop(),this.Frame.ChartBorder.GetWidth(),this.Frame.ChartBorder.GetHeight());
786
+ isInClient=this.Canvas.isPointInPath(x,y);
787
+ if (!isInClient) return;
788
+
789
+ var chart=this.GetOrderChart();
790
+ if (!chart) return;
791
+
792
+ var wheelValue=e.wheelDelta;
793
+ if (!IFrameSplitOperator.IsObjectExist(e.wheelDelta))
794
+ wheelValue=e.deltaY* -0.01;
795
+
796
+ var option={ Move:{ Count:1 }};
797
+ if (e && e.ctrlKey) option={ Move:{ Page:1 }}
798
+
799
+ var pageType=0
800
+ if (wheelValue<0) //下一条
801
+ {
802
+ this.HideAllTooltip();
803
+ if (this.GotoNextPage(option))
804
+ {
805
+ this.Draw();
806
+ this.DelayGotoBasePage();
807
+ }
808
+ }
809
+ else if (wheelValue>0) //上一页
810
+ {
811
+ this.HideAllTooltip();
812
+ if (this.GotoPreviousPage(option))
813
+ {
814
+ this.Draw();
815
+ this.DelayGotoBasePage();
816
+ }
817
+ }
818
+
819
+ if(e.preventDefault) e.preventDefault();
820
+ else e.returnValue = false;
821
+ }
822
+
823
+ OnKeyDown(e)
824
+ {
825
+ if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;
826
+
827
+ var keyID = e.keyCode ? e.keyCode :e.which;
828
+ switch(keyID)
829
+ {
830
+ case 38: //up
831
+ this.HideAllTooltip();
832
+ //if (this.GotoPreviousPage()) this.Draw();
833
+ break;
834
+ case 40: //down
835
+ this.HideAllTooltip();
836
+ //if (this.GotoNextPage()) this.Draw();
837
+ break;
838
+ }
839
+
840
+ //不让滚动条滚动
841
+ if(e.preventDefault) e.preventDefault();
842
+ else e.returnValue = false;
843
+ }
844
+
845
+ UIOnMouseDown(e)
846
+ {
847
+ this.DragCenter=null;
848
+
849
+ var pixelTatio = GetDevicePixelRatio();
850
+ var x = (e.clientX-this.UIElement.getBoundingClientRect().left)*pixelTatio;
851
+ var y = (e.clientY-this.UIElement.getBoundingClientRect().top)*pixelTatio;
852
+
853
+ if (this.TryDragCenter(x,y,e)) //拖动
854
+ {
855
+ return;
856
+ }
857
+
858
+ var chart=this.GetOrderChart();
859
+ if (!chart) return false;
860
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return false;
861
+ var clickData=chart.OnMouseDown(x,y,e);
862
+ if (!clickData) return;
863
+
864
+ if ((clickData.Type==1 || clickData.Type==2) && (e.button==0 || e.button==2)) //点单元格
865
+ {
866
+ if (clickData.Redraw==true) this.Draw();
867
+ }
868
+ }
869
+
870
+ TryDragCenter(x,y,e)
871
+ {
872
+ var chart=this.GetOrderChart();
873
+ if (!chart) return false;
874
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return false;
875
+
876
+ var pageSize=chart.GetPageSize();
877
+ if (pageSize>this.Data.Data.length) return false;
878
+
879
+ if (!chart.PtInCenter(x,y)) return false;
880
+
881
+ this.DragCenter=
882
+ {
883
+ Click:{ X:e.clientX, Y:e.clientY },
884
+ LastMove:{ X:e.clientX, Y:e.clientY}
885
+ };
886
+
887
+ this.SetCursor({Cursor:"grabbing"});
888
+
889
+ document.onmousemove=(e)=>{ this.DocOnMouseMove(e); }
890
+ document.onmouseup=(e)=> { this.DocOnMouseUp(e); }
891
+ }
892
+
893
+ DocOnMouseMove(e)
894
+ {
895
+ if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash) return;
896
+
897
+ var chart=this.GetOrderChart();
898
+ if (!chart) return;
899
+
900
+ var dragCenter=this.DragCenter;
901
+ if (!dragCenter) return;
902
+
903
+ var moveYSetp=dragCenter.LastMove.Y-e.clientY;
904
+ if(Math.abs(moveYSetp)<5) return;
905
+
906
+ var pixelTatio = GetDevicePixelRatio();
907
+ moveYSetp*=pixelTatio;
908
+ var rowHeight=chart.RowHeight;
909
+ if (Math.abs(moveYSetp)<rowHeight) return;
910
+
911
+ var bDraw=false;
912
+ if (moveYSetp>0)
913
+ {
914
+ var moveCount=Math.abs(moveYSetp)/rowHeight;
915
+ if (this.GotoNextPage({ Move:{ Count:moveCount }})) bDraw=true;
916
+ }
917
+ else if (moveYSetp<0)
918
+ {
919
+ var moveCount=Math.abs(moveYSetp)/rowHeight;
920
+ if (this.GotoPreviousPage({ Move:{ Count:moveCount }})) bDraw=true;
921
+ }
922
+
923
+ dragCenter.LastMove.X=e.clientX;
924
+ dragCenter.LastMove.Y=e.clientY;
925
+
926
+ this.SetCursor({Cursor:"grabbing"});
927
+
928
+ if (bDraw) this.Draw();
929
+ }
930
+
931
+ DocOnMouseUp(e)
932
+ {
933
+ //清空事件
934
+ document.onmousemove=null;
935
+ document.onmouseup=null;
936
+
937
+ this.DragCenter=null;
938
+
939
+ this.SetCursor({Cursor:"default"});
940
+ }
941
+
942
+ UIOnMouseMove(e)
943
+ {
944
+ if (this.DragCenter) return;
945
+
946
+
947
+ var pixelTatio = GetDevicePixelRatio();
948
+ var x = (e.clientX-this.UIElement.getBoundingClientRect().left)*pixelTatio;
949
+ var y = (e.clientY-this.UIElement.getBoundingClientRect().top)*pixelTatio;
950
+
951
+ var oldMouseOnStatus=this.LastMouseStatus.MouseOnStatus;
952
+ this.LastMouseStatus.OnMouseMove=null;
953
+
954
+ var bDrawTooltip=false;
955
+ if (this.LastMouseStatus.TooltipStatus) bDrawTooltip=true;
956
+ this.LastMouseStatus.TooltipStatus=null;
957
+ var chartTooltipData=null;
958
+ this.LastMouseStatus.OnMouseMove={ X:x, Y:y };
959
+ var mouseStatus={ Cursor:"default", Name:"Default"};; //鼠标状态
960
+
961
+ var chart=this.GetOrderChart();
962
+ var bDraw=false;
963
+ var cell=null;
964
+ if (chart)
965
+ {
966
+ var data=chart.OnMouseOn(x, y, e); //单元格提示信息
967
+ if (data)
968
+ {
969
+ if (data.Redraw===true) bDraw=data.Redraw;
970
+ if (data.Cell)
971
+ {
972
+ cell=data.Cell;
973
+ bDrawTooltip=true;
974
+ }
975
+ //this.LastMouseStatus.TooltipStatus={ X:x, Y:y, Data:tooltipData, ClientX:e.clientX, ClientY:e.clientY };
976
+ }
977
+ }
978
+
979
+ if (bDraw) this.Draw();
980
+
981
+ this.SendMouseOnEvent({ Data:cell, X:x, Y:y, FuncName:"UIOnMouseMove" });
982
+
983
+ if (this.LastMouseStatus.TooltipStatus)
984
+ {
985
+ var xTooltip = e.clientX-this.UIElement.getBoundingClientRect().left;
986
+ var yTooltip = e.clientY-this.UIElement.getBoundingClientRect().top;
987
+ //this.DrawFloatTooltip({X:xTooltip, Y:yTooltip, YMove:20/pixelTatio},this.LastMouseStatus.TooltipStatus.Data);
988
+ }
989
+ else
990
+ {
991
+ this.HideFloatTooltip();
992
+ }
993
+ }
994
+
995
+ SendMouseOnEvent(data)
996
+ {
997
+ var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_MOVEON_ORDER_CELL);
998
+ if (!event || !event.Callback) return;
999
+
1000
+ event.Callback(event,data, this)
1001
+ }
1002
+
1003
+ //设置鼠标形状 {Cursor:鼠标形状 }
1004
+ SetCursor(obj)
1005
+ {
1006
+ if (!obj || !obj.Cursor) return;
1007
+
1008
+ if (obj.Cursor=="default")
1009
+ this.UIElement.style.cursor="default";
1010
+ else
1011
+ this.UIElement.style.cursor=obj.Cursor;
1012
+ }
1013
+
1014
+ UIOnDblClick(e)
1015
+ {
1016
+ var pixelTatio = GetDevicePixelRatio();
1017
+ var x = (e.clientX-this.UIElement.getBoundingClientRect().left)*pixelTatio;
1018
+ var y = (e.clientY-this.UIElement.getBoundingClientRect().top)*pixelTatio;
1019
+
1020
+ var chart=this.GetOrderChart();
1021
+ if (chart) chart.OnDblClick(x,y,e);
1022
+ }
1023
+
1024
+ UIOnContextMenu(e)
1025
+ {
1026
+ e.preventDefault();
1027
+ }
1028
+
1029
+ UIOnMounseOut(e)
1030
+ {
1031
+ this.ClearMoveOnStatus("UIOnMouseleave");
1032
+
1033
+ this.HideAllTooltip();
1034
+ }
1035
+
1036
+ UIOnMouseleave(e)
1037
+ {
1038
+ this.ClearMoveOnStatus("UIOnMouseleave");
1039
+
1040
+ this.HideAllTooltip();
1041
+ }
1042
+
1043
+ ClearMoveOnStatus(funcName)
1044
+ {
1045
+ var chart=this.GetOrderChart();
1046
+ if (!chart) return;
1047
+
1048
+ if (!chart.MoveOnData.Data) return;
1049
+
1050
+ chart.MoveOnData.Data=null;
1051
+ this.Draw();
1052
+
1053
+ this.SendMouseOnEvent({ Data:null, X:x, Y:y, FuncName:funcName });
1054
+ }
1055
+
1056
+ //option ={ Move:{ Step:1, Page: 1 }}
1057
+ GotoNextPage(option)
1058
+ {
1059
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return false;
1060
+ var chart=this.GetOrderChart();
1061
+ if (!chart) return false;
1062
+
1063
+ var pageSize=chart.GetPageSize();
1064
+ if (pageSize>this.Data.Data.length) return false;
1065
+
1066
+ var moveStep=1;
1067
+ if (option && option.Move)
1068
+ {
1069
+ var item=option.Move;
1070
+ if (IFrameSplitOperator.IsPlusNumber(item.Step))
1071
+ {
1072
+ moveStep=item.Step;
1073
+ }
1074
+ else if (IFrameSplitOperator.IsPlusNumber(item.Page))
1075
+ {
1076
+ moveStep=pageSize;
1077
+ }
1078
+ }
1079
+
1080
+ var offset=this.Data.DataOffset+moveStep;
1081
+ if (offset+pageSize==this.Data.Data.length-1) return false;
1082
+
1083
+ if (offset+pageSize>this.Data.Data.length) //最后一页不够一屏调整到满屏
1084
+ {
1085
+ this.Data.DataOffset=this.Data.Data.length-pageSize;
1086
+ }
1087
+ else
1088
+ {
1089
+ this.Data.DataOffset=offset;
1090
+ }
1091
+
1092
+ return true;
1093
+ }
1094
+
1095
+ //option ={ Move:{ Step:1, Page: 1 }}
1096
+ GotoPreviousPage(option)
1097
+ {
1098
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return false;
1099
+ var chart=this.GetOrderChart();
1100
+ if (!chart) return false;
1101
+ if (this.Data.DataOffset<=0) return false;
1102
+
1103
+ var pageSize=chart.GetPageSize();
1104
+
1105
+ var moveStep=1;
1106
+ if (option && option.Move)
1107
+ {
1108
+ var item=option.Move;
1109
+ if (IFrameSplitOperator.IsPlusNumber(item.Step))
1110
+ {
1111
+ moveStep=item.Step;
1112
+ }
1113
+ else if (IFrameSplitOperator.IsPlusNumber(item.Page))
1114
+ {
1115
+ moveStep=pageSize;
1116
+ }
1117
+ }
1118
+
1119
+ var offset=this.Data.DataOffset-moveStep;
1120
+ if (offset<0) offset=0;
1121
+ this.Data.DataOffset=offset;
1122
+
1123
+ return true;
1124
+ }
1125
+
1126
+ ReloadResource(option)
1127
+ {
1128
+ this.Frame.ReloadResource(option);
1129
+
1130
+ for(var i=0;i<this.ChartPaint.length;++i)
1131
+ {
1132
+ var item=this.ChartPaint[i];
1133
+ if (item.ReloadResource) item.ReloadResource(option);
1134
+ }
1135
+
1136
+ if (option && option.Redraw)
1137
+ {
1138
+ this.SetSizeChange(true);
1139
+ this.Draw();
1140
+ }
1141
+ }
1142
+
1143
+ DelayGotoBasePage()
1144
+ {
1145
+ this.StopGotoPagePageTimer();
1146
+ if (this.IsInBasePage()) return;
1147
+
1148
+ var config=this.GotoBasePageConfig;
1149
+ if (config.Enable===false) return;
1150
+
1151
+ config.StartTime=new Date();
1152
+ config.Time=setTimeout(()=>
1153
+ {
1154
+ if (this.IsInBasePage()) return;
1155
+
1156
+ this.GotoBasePage({ Draw:true });
1157
+
1158
+ },config.Frequency);
1159
+
1160
+ }
1161
+
1162
+ StopGotoPagePageTimer()
1163
+ {
1164
+ var config=this.GotoBasePageConfig;
1165
+ clearTimeout(config.Timer);
1166
+ config.Timer = null;
1167
+ config.StartTime=null;
1168
+ }
1169
+
1170
+ static JsonDataToOrderData(data)
1171
+ {
1172
+ var symbol=data.symbol;
1173
+ var result=[];
1174
+ if (!IFrameSplitOperator.IsNonEmptyArray(data.data)) return result;
1175
+
1176
+ for(var i=0;i<data.data.length;++i)
1177
+ {
1178
+ var item=data.data[i];
1179
+
1180
+ var newItem={ Price:item.Price, Data:{ } };
1181
+ if (item.BGColor) newItem.BGColor=item.BGColor;
1182
+ if (IFrameSplitOperator.IsNumber(item.BGColorID)) newItem.BGColorID=item.BGColorID;
1183
+ if (item.Color) newItem.Color=item.Color;
1184
+ if (IFrameSplitOperator.IsNumber(item.ColorID)) newItem.ColorID=item.ColorID;
1185
+
1186
+ if (item.Data)
1187
+ {
1188
+ if (IFrameSplitOperator.IsObject(item.Data[201])) newItem.Data.ReserveNumber1=item.Data[201];
1189
+ if (IFrameSplitOperator.IsObject(item.Data[202])) newItem.Data.ReserveNumber2=item.Data[202];
1190
+ if (IFrameSplitOperator.IsObject(item.Data[203])) newItem.Data.ReserveNumber3=item.Data[203];
1191
+ if (IFrameSplitOperator.IsObject(item.Data[204])) newItem.Data.ReserveNumber4=item.Data[204];
1192
+ if (IFrameSplitOperator.IsObject(item.Data[205])) newItem.Data.ReserveNumber5=item.Data[205];
1193
+ if (IFrameSplitOperator.IsObject(item.Data[206])) newItem.Data.ReserveNumber6=item.Data[206];
1194
+ if (IFrameSplitOperator.IsObject(item.Data[207])) newItem.Data.ReserveNumber7=item.Data[207];
1195
+ if (IFrameSplitOperator.IsObject(item.Data[208])) newItem.Data.ReserveNumber8=item.Data[208];
1196
+ if (IFrameSplitOperator.IsObject(item.Data[209])) newItem.Data.ReserveNumber9=item.Data[209];
1197
+ if (IFrameSplitOperator.IsObject(item.Data[210])) newItem.Data.ReserveNumber10=item.Data[210];
1198
+ }
1199
+
1200
+ result.push(newItem);
1201
+ }
1202
+
1203
+ return result;
1204
+ }
1205
+
1206
+ }
1207
+
1208
+
1209
+ class JSOrderFrame
1210
+ {
1211
+ ChartBorder;
1212
+ Canvas; //画布
1213
+
1214
+ //BorderColor=g_JSChartResource.DealList.BorderColor; //边框线
1215
+
1216
+ LogoTextColor=g_JSChartResource.FrameLogo.TextColor;
1217
+ LogoTextFont=g_JSChartResource.FrameLogo.Font;
1218
+
1219
+ ReloadResource(resource)
1220
+ {
1221
+ this.BorderColor=g_JSChartResource.DealList.BorderColor; //边框线
1222
+ this.LogoTextColor=g_JSChartResource.FrameLogo.TextColor;
1223
+ this.LogoTextFont=g_JSChartResource.FrameLogo.Font;
1224
+ }
1225
+
1226
+ Draw(option)
1227
+ {
1228
+ var left=ToFixedPoint(this.ChartBorder.GetLeft());
1229
+ var top=ToFixedPoint(this.ChartBorder.GetTop());
1230
+ var right=ToFixedPoint(this.ChartBorder.GetRight());
1231
+ var bottom=ToFixedPoint(this.ChartBorder.GetBottom());
1232
+ var width=right-left;
1233
+ var height=bottom-top;
1234
+ }
1235
+
1236
+ DrawLogo()
1237
+ {
1238
+ var text=g_JSChartResource.FrameLogo.Text;
1239
+ if (!IFrameSplitOperator.IsString(text)) return;
1240
+
1241
+ this.Canvas.fillStyle=this.LogoTextColor;
1242
+ this.Canvas.font=this.LogoTextFont;
1243
+ this.Canvas.textAlign = 'left';
1244
+ this.Canvas.textBaseline = 'bottom';
1245
+
1246
+ var x=this.ChartBorder.GetLeft()+5;
1247
+ var y=this.ChartBorder.GetBottom()-5;
1248
+ this.Canvas.fillText(text,x,y);
1249
+ }
1250
+ }
1251
+
1252
+ var ORDER_COLUMN_ID=
1253
+ {
1254
+ PRICE_ID:0,
1255
+
1256
+ //预留数值类型 10个
1257
+ RESERVE_NUMBER1_ID:201, //ReserveNumber1:
1258
+ RESERVE_NUMBER2_ID:202,
1259
+ RESERVE_NUMBER3_ID:203,
1260
+ RESERVE_NUMBER4_ID:204,
1261
+ RESERVE_NUMBER5_ID:205,
1262
+ RESERVE_NUMBER6_ID:206,
1263
+ RESERVE_NUMBER7_ID:207,
1264
+ RESERVE_NUMBER8_ID:208,
1265
+ RESERVE_NUMBER9_ID:209,
1266
+ RESERVE_NUMBER10_ID:210,
1267
+
1268
+ //预留字符串类型 10个 301-399
1269
+ RESERVE_STRING1_ID:301, //ReserveString1:
1270
+ RESERVE_STRING2_ID:302,
1271
+ RESERVE_STRING3_ID:303,
1272
+ RESERVE_STRING4_ID:304,
1273
+ RESERVE_STRING5_ID:305,
1274
+ RESERVE_STRING6_ID:306,
1275
+ RESERVE_STRING7_ID:307,
1276
+ RESERVE_STRING8_ID:308,
1277
+ RESERVE_STRING9_ID:309,
1278
+ RESERVE_STRING10_ID:310,
1279
+ }
1280
+
1281
+ var MAP_ORDER_COLUMN_FIELD=new Map(
1282
+ [
1283
+ [ORDER_COLUMN_ID.RESERVE_NUMBER1_ID,"ReserveNumber1"],
1284
+ [ORDER_COLUMN_ID.RESERVE_NUMBER2_ID,"ReserveNumber2"],
1285
+ [ORDER_COLUMN_ID.RESERVE_NUMBER3_ID,"ReserveNumber3"],
1286
+ [ORDER_COLUMN_ID.RESERVE_NUMBER4_ID,"ReserveNumber4"],
1287
+ [ORDER_COLUMN_ID.RESERVE_NUMBER5_ID,"ReserveNumber5"],
1288
+ [ORDER_COLUMN_ID.RESERVE_NUMBER6_ID,"ReserveNumber6"],
1289
+ [ORDER_COLUMN_ID.RESERVE_NUMBER7_ID,"ReserveNumber7"],
1290
+ [ORDER_COLUMN_ID.RESERVE_NUMBER8_ID,"ReserveNumber8"],
1291
+ [ORDER_COLUMN_ID.RESERVE_NUMBER9_ID,"ReserveNumber9"],
1292
+ [ORDER_COLUMN_ID.RESERVE_NUMBER10_ID,"ReserveNumber10"],
1293
+
1294
+ [ORDER_COLUMN_ID.RESERVE_STRING1_ID,"ReserveString1"],
1295
+ [ORDER_COLUMN_ID.RESERVE_STRING2_ID,"ReserveString2"],
1296
+ [ORDER_COLUMN_ID.RESERVE_STRING3_ID,"ReserveString3"],
1297
+ [ORDER_COLUMN_ID.RESERVE_STRING4_ID,"ReserveString4"],
1298
+ [ORDER_COLUMN_ID.RESERVE_STRING5_ID,"ReserveString5"],
1299
+ [ORDER_COLUMN_ID.RESERVE_STRING6_ID,"ReserveString6"],
1300
+ [ORDER_COLUMN_ID.RESERVE_STRING7_ID,"ReserveString7"],
1301
+ [ORDER_COLUMN_ID.RESERVE_STRING8_ID,"ReserveString8"],
1302
+ [ORDER_COLUMN_ID.RESERVE_STRING9_ID,"ReserveString9"],
1303
+ [ORDER_COLUMN_ID.RESERVE_STRING10_ID,"ReserveString10"],
1304
+
1305
+ ]);
1306
+
1307
+
1308
+ class ChartOrderList
1309
+ {
1310
+ Canvas=null; //画布
1311
+ ChartBorder=null; //边框信息
1312
+ ChartFrame=null; //框架画法
1313
+ Name=null; //名称
1314
+ ClassName='ChartOrderList'; //类名
1315
+ IsDrawFirst=false;
1316
+ GetEventCallback=null;
1317
+ Data=null; //数据 { Data:[ { Price:, Color:, BGColor:, Data:{ } } ], Offset: }
1318
+ Symbol=null;
1319
+ Decimal=2; //小数位数
1320
+ IsShowHeader=true; //是否显示表头
1321
+ IsShowFooter=true; //是否显示页脚
1322
+ SelectedData={ Data:null, Enable:true }; //{ Data:{ ColIndex:null, Price:null, Type:null }, Enable:是否启动 }
1323
+ MoveOnData={ Data:null, Enable:true }; //鼠标在上面
1324
+
1325
+ SizeChange=true;
1326
+
1327
+ //涨跌颜色
1328
+ UpColor=g_JSChartResource.OrderList.UpTextColor;
1329
+ DownColor=g_JSChartResource.OrderList.DownTextColor;
1330
+ UnchangeColor=g_JSChartResource.OrderList.UnchagneTextColor;
1331
+
1332
+ BorderColor=g_JSChartResource.OrderList.BorderColor; //边框线
1333
+
1334
+ SelectedConfig={ BGColor:g_JSChartResource.OrderList.Selected.BGColor, LineColor:g_JSChartResource.OrderList.Selected.LineColor, LineWidth:g_JSChartResource.OrderList.Selected.LineWidth };
1335
+ MoveOnConfig={ LineColor:g_JSChartResource.OrderList.MoveOn.LineColor, LineWidth:g_JSChartResource.OrderList.MoveOn.LineWidth }
1336
+
1337
+ //表头配置
1338
+ HeaderFontConfig={ Size:g_JSChartResource.OrderList.Header.Font.Size, Name:g_JSChartResource.OrderList.Header.Font.Name };
1339
+ HeaderColor=g_JSChartResource.OrderList.Header.Color;
1340
+ HeaderMargin=
1341
+ {
1342
+ Left:g_JSChartResource.OrderList.Header.Margin.Left,
1343
+ Right:g_JSChartResource.OrderList.Header.Margin.Right,
1344
+ Top:g_JSChartResource.OrderList.Header.Margin.Top,
1345
+ Bottom:g_JSChartResource.OrderList.Header.Margin.Bottom
1346
+ };
1347
+
1348
+ //表格内容配置
1349
+ ItemFontConfig={ Size:g_JSChartResource.OrderList.Item.Font.Size, Name:g_JSChartResource.OrderList.Item.Font.Name };
1350
+ ItemMargin=
1351
+ {
1352
+ Left:g_JSChartResource.OrderList.Item.Margin.Left,
1353
+ Right:g_JSChartResource.OrderList.Item.Margin.Right,
1354
+ Top:g_JSChartResource.OrderList.Item.Margin.Top,
1355
+ Bottom:g_JSChartResource.OrderList.Item.Margin.Bottom,
1356
+ };
1357
+
1358
+ FooterConfig=
1359
+ {
1360
+ Font:{ Size:g_JSChartResource.OrderList.Header.Font.Size, Name:g_JSChartResource.OrderList.Header.Font.Name },
1361
+ Margin:CloneData(g_JSChartResource.OrderList.Header.Margin )
1362
+ }
1363
+
1364
+ //缓存
1365
+ HeaderFont=12*GetDevicePixelRatio() +"px 微软雅黑";
1366
+ ItemFont=15*GetDevicePixelRatio() +"px 微软雅黑";
1367
+ FooterFont=12*GetDevicePixelRatio() +"px 微软雅黑";
1368
+
1369
+ RowHeight=20;
1370
+ RowCount=0;
1371
+ HeaderHeight=0;
1372
+ FooterHeight=0;
1373
+
1374
+ //自定义颜色
1375
+ AryColor=g_JSChartResource.OrderList.AryColor.slice();
1376
+
1377
+ Column=
1378
+ {
1379
+ Left:
1380
+ [
1381
+ //{ Type:ORDER_COLUMN_ID.RESERVE_NUMBER1_ID, Title:"数值1", TextAlign:"center", Width:null, TextColor:g_JSChartResource.DealList.FieldColor.Time, MaxText:"8888.88" },
1382
+ ],
1383
+
1384
+ Right:
1385
+ [
1386
+ //{ Type:ORDER_COLUMN_ID.RESERVE_NUMBER3_ID, Title:"数值3", TextAlign:"center", Width:null, TextColor:g_JSChartResource.DealList.FieldColor.Time, MaxText:"888888" }
1387
+ ],
1388
+
1389
+ Center:{ Title:"", TextAlign:"center", MaxText:"88888.88" },
1390
+ }
1391
+
1392
+
1393
+ RectClient={ };
1394
+ RectCenter=null; //上下可以拖动的中间区域
1395
+ AryCellRect=[]; //{ Rect:, Type: 1=单行 }
1396
+
1397
+ //Type:20=分时图
1398
+ //{ Rect, Data, Index, Column, Type }}
1399
+ TooltipRect=[];
1400
+ MapDrawPrice=new Map(); //当前绘制的价格列表
1401
+
1402
+
1403
+ SetOption(option)
1404
+ {
1405
+ if (!option) return;
1406
+ if (IFrameSplitOperator.IsBool(option.IsShowHeader)) this.IsShowHeader=option.IsShowHeader;
1407
+ if (IFrameSplitOperator.IsBool(option.IsShowFooter)) this.IsShowFooter=option.IsShowFooter;
1408
+ }
1409
+
1410
+ ReloadResource(resource)
1411
+ {
1412
+ this.UpColor=g_JSChartResource.OrderList.UpTextColor;
1413
+ this.DownColor=g_JSChartResource.OrderList.DownTextColor;
1414
+ this.UnchangeColor=g_JSChartResource.OrderList.UnchagneTextColor;
1415
+
1416
+ this.BorderColor=g_JSChartResource.OrderList.BorderColor; //边框线
1417
+
1418
+ //表头配置
1419
+ this.HeaderFontConfig={ Size:g_JSChartResource.OrderList.Header.Font.Size, Name:g_JSChartResource.OrderList.Header.Font.Name };
1420
+ this.HeaderColor=g_JSChartResource.OrderList.Header.Color;
1421
+ this.HeaderMargin=
1422
+ {
1423
+ Left:g_JSChartResource.OrderList.Header.Margin.Left,
1424
+ Right:g_JSChartResource.OrderList.Header.Margin.Right,
1425
+ Top:g_JSChartResource.OrderList.Header.Margin.Top,
1426
+ Bottom:g_JSChartResource.OrderList.Header.Margin.Bottom
1427
+ };
1428
+
1429
+ //表格内容配置
1430
+ this.ItemFontConfig={ Size:g_JSChartResource.OrderList.Item.Font.Size, Name:g_JSChartResource.OrderList.Item.Font.Name };
1431
+ this.ItemMargin=
1432
+ {
1433
+ Left:g_JSChartResource.OrderList.Item.Margin.Left,
1434
+ Right:g_JSChartResource.OrderList.Item.Margin.Right,
1435
+ Top:g_JSChartResource.OrderList.Item.Margin.Top,
1436
+ Bottom:g_JSChartResource.OrderList.Item.Margin.Bottom,
1437
+ };
1438
+
1439
+ this.AryColor=g_JSChartResource.OrderList.AryColor.slice();
1440
+ }
1441
+
1442
+ GetColorByID(id)
1443
+ {
1444
+ if (!IFrameSplitOperator.IsNumber(id)) return null;
1445
+ if (id<0 || id>=this.AryColor.length) return null;
1446
+
1447
+ return this.AryColor[id];
1448
+ }
1449
+
1450
+ CreateColumnItem(item)
1451
+ {
1452
+ if (!item) return null;
1453
+ var colItem=this.GetDefaultColunm(item.Type);
1454
+ if (!colItem) return null;
1455
+
1456
+ if (item.Title) colItem.Title=item.Title;
1457
+ if (item.TitleAlign) colItem.TitleAlign=item.TitleAlign;
1458
+ if (item.HeaderColor) colItem.HeaderColor=item.HeaderColor;
1459
+ if (item.TextAlign) colItem.TextAlign=item.TextAlign;
1460
+ if (item.TextColor) colItem.TextColor=item.TextColor;
1461
+ if (item.MaxText) colItem.MaxText=item.MaxText;
1462
+
1463
+ if (this.IsReserveNumber(item.Type))
1464
+ {
1465
+ if (item.Format) colItem.Format=item.Format; //数据格式化设置{ Type:1=原始 2=千分位分割 3=万亿转换, ExFloatPrecision:万亿转换以后的小数位数 }
1466
+ if (IFrameSplitOperator.IsNumber(item.ColorType)) colItem.ColorType=item.ColorType; //0=默认 1=(>0, =0, <0) 2=(>=0, <0)
1467
+ if (IFrameSplitOperator.IsNumber(item.FloatPrecision)) colItem.FloatPrecision=item.FloatPrecision;
1468
+ if (item.StringFormat) colItem.StringFormat=item.StringFormat; //"{0}%" 输出增加固定字符
1469
+ }
1470
+
1471
+ if (item.MoveOn)
1472
+ {
1473
+ colItem.MoveOn={ };
1474
+ if (item.MoveOn.LineColor) colItem.MoveOn.LineColor=item.MoveOn.LineColor;
1475
+ if (IFrameSplitOperator.IsNumber(item.MoveOn.LineColorID)) colItem.MoveOn.LineColorID=item.MoveOn.LineColorID;
1476
+ if (IFrameSplitOperator.IsNumber(item.MoveOn.LineWidth)) colItem.MoveOn.LineWidth=item.MoveOn.LineWidth;
1477
+ }
1478
+
1479
+ return colItem
1480
+ }
1481
+
1482
+ SetColumn(columnData)
1483
+ {
1484
+ if (!columnData) return;
1485
+
1486
+ if (columnData.Left && IFrameSplitOperator.IsArray(columnData.Left.Data))
1487
+ {
1488
+ this.Column.Left=[];
1489
+ var aryData=columnData.Left.Data;
1490
+ for(var i=0;i<aryData.length;++i)
1491
+ {
1492
+ var item=aryData[i];
1493
+ var colItem=this.CreateColumnItem(item);
1494
+ if (!colItem) continue;
1495
+
1496
+ this.Column.Left.push(colItem);
1497
+ }
1498
+ }
1499
+
1500
+ if (columnData.Right && IFrameSplitOperator.IsArray(columnData.Right.Data))
1501
+ {
1502
+ this.Column.Right=[];
1503
+ var aryData=columnData.Right.Data;
1504
+ for(var i=0;i<aryData.length;++i)
1505
+ {
1506
+ var item=aryData[i];
1507
+ var colItem=this.CreateColumnItem(item);
1508
+ if (!colItem) continue;
1509
+
1510
+ this.Column.Right.push(colItem);
1511
+ }
1512
+ }
1513
+
1514
+ if (columnData.Center)
1515
+ {
1516
+ item=columnData.Center;
1517
+
1518
+ var colItem=this.CreateColumnItem(item);
1519
+ if (colItem) this.Column.Center=colItem;
1520
+ }
1521
+
1522
+ }
1523
+
1524
+ GetDefaultColunm(id)
1525
+ {
1526
+ var DEFAULT_COLUMN=
1527
+ [
1528
+ { Type:ORDER_COLUMN_ID.PRICE_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"99999.99", FloatPrecision:2 },
1529
+
1530
+ { Type:ORDER_COLUMN_ID.RESERVE_NUMBER1_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"9999.99", FloatPrecision:2 },
1531
+ { Type:ORDER_COLUMN_ID.RESERVE_NUMBER2_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"9999.99", FloatPrecision:2 },
1532
+ { Type:ORDER_COLUMN_ID.RESERVE_NUMBER3_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"9999.99", FloatPrecision:2 },
1533
+ { Type:ORDER_COLUMN_ID.RESERVE_NUMBER4_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"9999.99", FloatPrecision:2 },
1534
+ { Type:ORDER_COLUMN_ID.RESERVE_NUMBER5_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"9999.99", FloatPrecision:2 },
1535
+ { Type:ORDER_COLUMN_ID.RESERVE_NUMBER6_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"9999.99", FloatPrecision:2 },
1536
+ { Type:ORDER_COLUMN_ID.RESERVE_NUMBER7_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"9999.99", FloatPrecision:2 },
1537
+ { Type:ORDER_COLUMN_ID.RESERVE_NUMBER8_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"9999.99", FloatPrecision:2 },
1538
+ { Type:ORDER_COLUMN_ID.RESERVE_NUMBER9_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"9999.99", FloatPrecision:2 },
1539
+ { Type:ORDER_COLUMN_ID.RESERVE_NUMBER10_ID, Title:"", TextAlign:"right", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"9999.99", FloatPrecision:2 },
1540
+
1541
+
1542
+ { Type:ORDER_COLUMN_ID.RESERVE_STRING1_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"擎擎擎擎擎擎" },
1543
+ { Type:ORDER_COLUMN_ID.RESERVE_STRING2_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"擎擎擎擎擎擎" },
1544
+ { Type:ORDER_COLUMN_ID.RESERVE_STRING3_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"擎擎擎擎擎擎" },
1545
+ { Type:ORDER_COLUMN_ID.RESERVE_STRING4_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"擎擎擎擎擎擎" },
1546
+ { Type:ORDER_COLUMN_ID.RESERVE_STRING5_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"擎擎擎擎擎擎" },
1547
+ { Type:ORDER_COLUMN_ID.RESERVE_STRING6_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"擎擎擎擎擎擎" },
1548
+ { Type:ORDER_COLUMN_ID.RESERVE_STRING7_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"擎擎擎擎擎擎" },
1549
+ { Type:ORDER_COLUMN_ID.RESERVE_STRING8_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"擎擎擎擎擎擎" },
1550
+ { Type:ORDER_COLUMN_ID.RESERVE_STRING9_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"擎擎擎擎擎擎" },
1551
+ { Type:ORDER_COLUMN_ID.RESERVE_STRING10_ID, Title:"", TextAlign:"center", TextColor:g_JSChartResource.OrderList.FieldColor.Text, MaxText:"擎擎擎擎擎擎" },
1552
+ ];
1553
+
1554
+ for(var i=0;i<DEFAULT_COLUMN.length;++i)
1555
+ {
1556
+ var item=DEFAULT_COLUMN[i];
1557
+ if (item.Type==id) return item;
1558
+ }
1559
+
1560
+ return null;
1561
+ }
1562
+
1563
+
1564
+ Draw()
1565
+ {
1566
+ this.AryCellRect=[];
1567
+ this.TooltipRect=[];
1568
+ this.RectCenter=null;
1569
+ this.MapDrawPrice.clear();
1570
+ if (this.SizeChange) this.CalculateSize();
1571
+ else this.UpdateCacheData();
1572
+
1573
+ this.ClipClient();
1574
+ this.DrawHeader();
1575
+ this.DrawBodyBG();
1576
+ this.DrawBorder();
1577
+ this.DrawBody();
1578
+ this.DrawFooter();
1579
+ this.Canvas.restore();
1580
+
1581
+ this.SizeChange=false;
1582
+ }
1583
+
1584
+ ClipClient()
1585
+ {
1586
+ this.Canvas.save();
1587
+ this.Canvas.beginPath();
1588
+ this.Canvas.rect(this.RectClient.Left,this.RectClient.Top,(this.RectClient.Right-this.RectClient.Left),(this.RectClient.Bottom-this.RectClient.Top));
1589
+ //this.Canvas.stroke(); //调试用
1590
+ this.Canvas.clip();
1591
+ }
1592
+
1593
+ //更新缓存变量
1594
+ UpdateCacheData()
1595
+ {
1596
+ this.RectClient.Left=this.ChartBorder.GetLeft();
1597
+ this.RectClient.Right=this.ChartBorder.GetRight();
1598
+ this.RectClient.Top=this.ChartBorder.GetTop();
1599
+ this.RectClient.Bottom=this.ChartBorder.GetBottom();
1600
+ this.Decimal=GetfloatPrecision(this.Symbol);
1601
+ }
1602
+
1603
+ GetPageSize(recalculate) //recalculate 是否重新计算
1604
+ {
1605
+ if (recalculate) this.CalculateSize();
1606
+
1607
+ var size=this.RowCount;
1608
+
1609
+ return size;
1610
+ }
1611
+
1612
+
1613
+ CalculateColumnWidth(item)
1614
+ {
1615
+ this.Canvas.font=this.ItemFont;
1616
+ var textWidth=this.Canvas.measureText(item.MaxText).width;
1617
+ var width=textWidth+4+this.ItemMargin.Left+this.ItemMargin.Right;
1618
+
1619
+ if (item.Title) //标题文字宽度
1620
+ {
1621
+ this.Canvas.font=this.HeaderFont;
1622
+ textWidth=this.Canvas.measureText(item.Title).width;
1623
+ var titleWidth=textWidth+4+this.HeaderMargin.Right+this.HeaderMargin.Left;
1624
+ if (width<titleWidth) width=titleWidth;
1625
+ }
1626
+
1627
+ return width;
1628
+ }
1629
+
1630
+ CalculateSize() //计算大小
1631
+ {
1632
+ this.UpdateCacheData();
1633
+
1634
+ var pixelRatio=GetDevicePixelRatio();
1635
+ this.HeaderFont=`${this.HeaderFontConfig.Size*pixelRatio}px ${ this.HeaderFontConfig.Name}`;
1636
+ this.ItemFont=`${this.ItemFontConfig.Size*pixelRatio}px ${ this.ItemFontConfig.Name}`;
1637
+
1638
+ var leftWidth=0, rightWidth=0, centerWidth=0, itemWidth=0;
1639
+ var aryData=this.Column.Left;
1640
+ for(var i=0; i<aryData.length; ++i)
1641
+ {
1642
+ var item=aryData[i];
1643
+ item.Width=this.CalculateColumnWidth(item);
1644
+ leftWidth+=item.Width;
1645
+ }
1646
+
1647
+ var aryData=this.Column.Right;
1648
+ for(var i=0;i<aryData.length;++i)
1649
+ {
1650
+ var item=aryData[i];
1651
+ item.Width=this.CalculateColumnWidth(item);
1652
+ rightWidth+=item.Width;
1653
+ }
1654
+
1655
+ var item=this.Column.Center;
1656
+ item.Width=this.CalculateColumnWidth(item);
1657
+ centerWidth=item.Width;
1658
+
1659
+ var sumWidth=leftWidth+rightWidth+centerWidth;
1660
+
1661
+ this.RectClient.TableWidth=sumWidth;
1662
+ this.RectClient.LeftTableWidth=leftWidth;
1663
+ this.RectClient.RightTableWidth=rightWidth;
1664
+ this.RectClient.CenterWidth=centerWidth;
1665
+
1666
+ this.HeaderHeight=this.GetFontHeight(this.HeaderFont,"擎")+ this.HeaderMargin.Top+ this.HeaderMargin.Bottom;
1667
+ if (!this.IsShowHeader) this.HeaderHeight=0;
1668
+
1669
+ this.FooterHeight=0;
1670
+ if (this.IsShowFooter)
1671
+ {
1672
+ var config=this.FooterConfig;
1673
+ this.FooterHeight=this.GetFontHeight(this.FooterFont,"擎")+config.Margin.Top+config.Margin.Bottom;
1674
+ }
1675
+
1676
+ this.RowHeight=this.GetFontHeight(this.ItemFont,"擎")+ this.ItemMargin.Top+ this.ItemMargin.Bottom;
1677
+ this.RowCount=parseInt((this.RectClient.Bottom-this.RectClient.Top-this.HeaderHeight-this.FooterHeight)/this.RowHeight);
1678
+ }
1679
+
1680
+ DrawHeader()
1681
+ {
1682
+ if (!this.IsShowHeader) return;
1683
+
1684
+ var clientWidth=this.RectClient.Right-this.RectClient.Left;
1685
+ var tableWidth=this.RectClient.TableWidth;
1686
+ var xCenter=this.RectClient.Left+clientWidth/2;
1687
+
1688
+ this.Canvas.font=this.HeaderFont;
1689
+ this.Canvas.fillStyle=this.HeaderColor;
1690
+
1691
+ //中间
1692
+ var item=this.Column.Center;
1693
+ var rtCenter={ Left:xCenter-item.Width/2, Width:item.Width, Top:this.RectClient.Top, Height:this.HeaderHeight };
1694
+ rtCenter.Right=rtCenter.Left+rtCenter.Width;
1695
+ rtCenter.Bottom=rtCenter.Top+rtCenter.Height;
1696
+ this.DrawHeaderItem(rtCenter, item);
1697
+
1698
+ var aryData=this.Column.Left;
1699
+ if (IFrameSplitOperator.IsNonEmptyArray(aryData))
1700
+ {
1701
+ var xRight=rtCenter.Left;
1702
+ for(var i=aryData.length-1; i>=0; --i)
1703
+ {
1704
+ var item=aryData[i];
1705
+ var rtItem={ Right:xRight, Width:item.Width, Top:this.RectClient.Top, Height:this.HeaderHeight };
1706
+ rtItem.Left=rtItem.Right-rtItem.Width;
1707
+ rtItem.Bottom=rtItem.Top+rtItem.Height;
1708
+ this.DrawHeaderItem(rtItem, item);
1709
+
1710
+ xRight=rtItem.Left;
1711
+ }
1712
+ }
1713
+
1714
+ var aryData=this.Column.Right;
1715
+ if (IFrameSplitOperator.IsNonEmptyArray(aryData))
1716
+ {
1717
+ var xLeft=rtCenter.Right;
1718
+ for(var i=0;i<aryData.length; ++i)
1719
+ {
1720
+ var item=aryData[i];
1721
+ var rtItem={ Left:xLeft, Width:item.Width, Top:this.RectClient.Top, Height:this.HeaderHeight };
1722
+ rtItem.Right=rtItem.Left+rtItem.Width;
1723
+ rtItem.Bottom=rtItem.Top+rtItem.Height;
1724
+ this.DrawHeaderItem(rtItem, item);
1725
+
1726
+ xLeft=rtItem.Right;
1727
+ }
1728
+ }
1729
+
1730
+ }
1731
+
1732
+ DrawHeaderItem(rtItem, item)
1733
+ {
1734
+ var y=rtItem.Bottom-this.HeaderMargin.Bottom;
1735
+ var x=this.HeaderMargin.Left+rtItem.Left;
1736
+ var textAlign=item.TextAlign;
1737
+ if (item.TitleAlign) textAlign=item.TitleAlign;
1738
+
1739
+ if (textAlign=='center')
1740
+ {
1741
+ x=rtItem.Left+item.Width/2;
1742
+ this.Canvas.textAlign="center";
1743
+ }
1744
+ else if (textAlign=='right')
1745
+ {
1746
+ x=rtItem.Right-this.HeaderMargin.Right;
1747
+ this.Canvas.textAlign="right";
1748
+ }
1749
+ else
1750
+ {
1751
+ this.Canvas.textAlign="left";
1752
+ }
1753
+
1754
+ this.Canvas.textBaseline="bottom";
1755
+
1756
+ var color=this.HeaderColor;
1757
+ if (item.HeaderColor) color=item.HeaderColor;
1758
+ this.Canvas.fillStyle=color;
1759
+ this.Canvas.fillText(item.Title,x,y);
1760
+ }
1761
+
1762
+ DrawBorder()
1763
+ {
1764
+ var clientWidth=this.RectClient.Right-this.RectClient.Left;
1765
+ var tableWidth=this.RectClient.TableWidth;
1766
+ var xCenter=this.RectClient.Left+clientWidth/2;
1767
+
1768
+ var left=ToFixedPoint(xCenter-this.RectClient.CenterWidth/2-this.RectClient.LeftTableWidth);
1769
+ var right=ToFixedPoint(left+tableWidth);
1770
+ var top=ToFixedPoint(this.RectClient.Top);
1771
+ var bottom=ToFixedPoint(this.RectClient.Bottom);
1772
+ var yCellTop=top;
1773
+
1774
+ this.Canvas.strokeStyle=this.BorderColor;
1775
+ this.Canvas.beginPath();
1776
+
1777
+ if (this.IsShowHeader)
1778
+ {
1779
+ this.Canvas.moveTo(left,top+this.HeaderHeight);
1780
+ this.Canvas.lineTo(right,top+this.HeaderHeight);
1781
+ yCellTop=top+this.HeaderHeight;
1782
+ }
1783
+
1784
+ if (this.IsShowFooter)
1785
+ {
1786
+ bottom-=this.FooterHeight;
1787
+ }
1788
+
1789
+ //左右边框
1790
+ this.Canvas.moveTo(left, top);
1791
+ this.Canvas.lineTo(right, top);
1792
+ this.Canvas.lineTo(right, bottom);
1793
+ this.Canvas.lineTo(left, bottom);
1794
+ this.Canvas.lineTo(left, top);
1795
+
1796
+ //横线
1797
+ var yLine=yCellTop;
1798
+ for(var i=0;i<this.RowCount;++i)
1799
+ {
1800
+ yLine+=this.RowHeight;
1801
+ this.Canvas.moveTo(left, ToFixedPoint(yLine));
1802
+ this.Canvas.lineTo(right, ToFixedPoint(yLine));
1803
+ }
1804
+
1805
+ //竖线
1806
+ var item=this.Column.Center;
1807
+ var rtCenter={ Left:xCenter-item.Width/2, Width:item.Width, Top:this.RectClient.Top, Height:this.HeaderHeight };
1808
+ rtCenter.Right=rtCenter.Left+rtCenter.Width;
1809
+ rtCenter.Bottom=rtCenter.Top+rtCenter.Height;
1810
+ this.RectCenter={ Left:rtCenter.Left, Right:rtCenter.Right, Width:rtCenter.Width, Top:yCellTop, Bottom:this.RectClient.Bottom };
1811
+ this.RectCenter.Height=this.RectCenter.Bottom-this.RectCenter.Top;
1812
+
1813
+ this.Canvas.moveTo(ToFixedPoint(rtCenter.Left), top);
1814
+ this.Canvas.lineTo(ToFixedPoint(rtCenter.Left), bottom);
1815
+ this.Canvas.moveTo(ToFixedPoint(rtCenter.Right), top);
1816
+ this.Canvas.lineTo(ToFixedPoint(rtCenter.Right), bottom);
1817
+
1818
+ //左边
1819
+ var aryData=this.Column.Left;
1820
+ if (IFrameSplitOperator.IsNonEmptyArray(aryData))
1821
+ {
1822
+ var xRight=rtCenter.Left;
1823
+ for(var j=aryData.length-1; j>=1; --j)
1824
+ {
1825
+ var columnItem=aryData[j];
1826
+ var rtItem={ Right:xRight, Width:columnItem.Width, Top:rtCenter.Top, Bottom:rtCenter.Bottom, Height:rtCenter.Height };
1827
+ rtItem.Left=rtItem.Right-rtItem.Width;
1828
+
1829
+ this.Canvas.moveTo(ToFixedPoint(rtItem.Left), top);
1830
+ this.Canvas.lineTo(ToFixedPoint(rtItem.Left), bottom);
1831
+
1832
+ xRight=rtItem.Left;
1833
+ }
1834
+ }
1835
+
1836
+ //右边
1837
+ var aryData=this.Column.Right;
1838
+ if (IFrameSplitOperator.IsNonEmptyArray(aryData))
1839
+ {
1840
+ var xLeft=rtCenter.Right;
1841
+ for(var j=0; j<aryData.length-1; ++j)
1842
+ {
1843
+ var columnItem=aryData[j];
1844
+ var rtItem={ Left:xLeft, Width:columnItem.Width, Top:rtCenter.Top, Bottom:rtCenter.Bottom, Height:rtCenter.Height };
1845
+ rtItem.Right=rtItem.Left+rtItem.Width;
1846
+
1847
+ this.Canvas.moveTo(ToFixedPoint(rtItem.Right), top);
1848
+ this.Canvas.lineTo(ToFixedPoint(rtItem.Right), bottom);
1849
+
1850
+ xLeft=rtItem.Right;
1851
+ }
1852
+ }
1853
+
1854
+
1855
+ this.Canvas.stroke();
1856
+ }
1857
+
1858
+ DrawRowItemBG(rtItem, columnItem, data, cellInfo)
1859
+ {
1860
+ if (data.BGColor)
1861
+ {
1862
+ this.Canvas.fillStyle=data.BGColor;
1863
+ this.Canvas.fillRect(rtItem.Left,rtItem.Top, rtItem.Width, rtItem.Height);
1864
+ }
1865
+ }
1866
+
1867
+ //单元格背景颜色
1868
+ DrawBodyBG()
1869
+ {
1870
+ var drawSelectedInfo=null, drawMoveOnInfo=null;
1871
+ this.DrawBody( (rtItem, columnItem, data, cellInfo)=>
1872
+ {
1873
+ this.DrawRowItemBG(rtItem, columnItem, data, cellInfo);
1874
+ if (this.SelectedData && this.SelectedData.Enable && this.SelectedData.Data)
1875
+ {
1876
+ var selData=this.SelectedData.Data;
1877
+ if (selData && selData.ColIndex==cellInfo.ColIndex && selData.Price==cellInfo.Price && selData.Type==cellInfo.Type)
1878
+ {
1879
+ drawSelectedInfo={ Rect:rtItem, Column:columnItem, Data:data, CellInfo:cellInfo };
1880
+ }
1881
+ }
1882
+
1883
+ if (this.MoveOnData && this.MoveOnData.Enable && this.MoveOnData.Data)
1884
+ {
1885
+ var selData=this.MoveOnData.Data;
1886
+ if (selData && selData.ColIndex==cellInfo.ColIndex && selData.Price==cellInfo.Price && selData.Type==cellInfo.Type)
1887
+ {
1888
+ drawMoveOnInfo={ Rect:rtItem, Column:columnItem, Data:data, CellInfo:cellInfo };
1889
+ }
1890
+ }
1891
+ });
1892
+
1893
+ if (drawSelectedInfo)
1894
+ {
1895
+ var rtItem=drawSelectedInfo.Rect;
1896
+ this.Canvas.fillStyle=this.SelectedConfig.BGColor;
1897
+ this.Canvas.fillRect(rtItem.Left+1,rtItem.Top+1, rtItem.Width-2, rtItem.Height-2);
1898
+ }
1899
+
1900
+ if (drawMoveOnInfo)
1901
+ {
1902
+ var pixelTatio = GetDevicePixelRatio();
1903
+ var config=this.MoveOnConfig;
1904
+ var rtItem=drawMoveOnInfo.Rect;
1905
+ var column=drawMoveOnInfo.Column;
1906
+ var lineColor=config.LineColor;
1907
+ var lineWidth=config.LineWidth;
1908
+ if (column.MoveOn)
1909
+ {
1910
+ var config=column.MoveOn;
1911
+ if (config.LineColor) lineColor=config.LineColor;
1912
+ if (IFrameSplitOperator.IsNumber(config.LineColorID)) lineColor=this.GetColorByID(config.LineColorID);
1913
+ if (IFrameSplitOperator.IsNumber(config.LineWidth)) lineWidth=config.LineWidth;
1914
+ }
1915
+
1916
+ this.Canvas.save();
1917
+ if (IFrameSplitOperator.IsNumber(lineWidth)) this.Canvas.lineWidth=lineWidth;
1918
+ this.Canvas.strokeStyle=lineColor;
1919
+ this.Canvas.beginPath();
1920
+ this.Canvas.rect(rtItem.Left,rtItem.Top,rtItem.Width,rtItem.Height);
1921
+ this.Canvas.stroke();
1922
+ this.Canvas.restore();
1923
+ }
1924
+
1925
+ return true;
1926
+ }
1927
+
1928
+
1929
+ //绘制表格
1930
+ DrawBody(drawItemCallback)
1931
+ {
1932
+ if (!this.Data) return;
1933
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return;
1934
+
1935
+ this.Canvas.font=this.ItemFont;
1936
+ var top=this.RectClient.Top+this.HeaderHeight;
1937
+ var left=this.RectClient.Left+this.HeaderMargin.Left;
1938
+ var dataCount=this.Data.Data.length;
1939
+ var index=this.Data.DataOffset;
1940
+ var selectedRowData=null;
1941
+
1942
+ var clientWidth=this.RectClient.Right-this.RectClient.Left;
1943
+ var tableWidth=this.RectClient.TableWidth;
1944
+ var xCenter=this.RectClient.Left+clientWidth/2;
1945
+ var yTop=this.RectClient.Top+this.HeaderHeight;
1946
+
1947
+ for(var i=0; i<this.RowCount && index<dataCount; ++i,++index)
1948
+ {
1949
+ var columnItem=this.Column.Center;
1950
+ var rtCenter={ Top:yTop, Height:this.RowHeight, Left:xCenter-columnItem.Width/2, Width:columnItem.Width };
1951
+ rtCenter.Bottom=rtCenter.Top+rtCenter.Height;
1952
+ rtCenter.Right=rtCenter.Left+columnItem.Width;
1953
+ var item=this.Data.Data[index];
1954
+
1955
+ //价格
1956
+ var drawInfo={ Color:"rgb(100,10,0)"};
1957
+ this.FormatCenterItem(columnItem, item, drawInfo);
1958
+ var cellInfo={ RowIndex:i, ColIndex:0, Type:0, Price:item.Price };
1959
+ if (drawItemCallback)
1960
+ {
1961
+ drawItemCallback(rtCenter, columnItem, drawInfo, cellInfo );
1962
+ }
1963
+ else
1964
+ {
1965
+ this.DrawRowItem(rtCenter, columnItem, drawInfo, cellInfo);
1966
+ this.MapDrawPrice.set(item.Price, item);
1967
+ }
1968
+
1969
+ //左边
1970
+ var aryData=this.Column.Left;
1971
+ if (IFrameSplitOperator.IsNonEmptyArray(aryData))
1972
+ {
1973
+ var xRight=rtCenter.Left;
1974
+ for(var j=aryData.length-1; j>=0; --j)
1975
+ {
1976
+ var columnItem=aryData[j];
1977
+ var rtItem={ Right:xRight, Width:columnItem.Width, Top:rtCenter.Top, Bottom:rtCenter.Bottom, Height:rtCenter.Height };
1978
+ rtItem.Left=rtItem.Right-rtItem.Width;
1979
+
1980
+ var drawInfo={ Color:columnItem.TextColor };
1981
+ if (this.IsReserveNumber(columnItem.Type))
1982
+ {
1983
+ this.FormatReserveNumber(columnItem, item, drawInfo);
1984
+ }
1985
+
1986
+ var cellInfo={ RowIndex:i, ColIndex:j, Type:1, Price:item.Price };
1987
+ if (drawItemCallback)
1988
+ {
1989
+ drawItemCallback(rtItem, columnItem, drawInfo, cellInfo);
1990
+ }
1991
+ else
1992
+ {
1993
+ this.DrawRowItem(rtItem, columnItem, drawInfo, cellInfo);
1994
+ this.AryCellRect.push({ Rect:rtItem, CellInfo:cellInfo, Price:item.Price, Data:drawInfo.Data });
1995
+ }
1996
+ xRight=rtItem.Left;
1997
+ }
1998
+ }
1999
+
2000
+ //右边
2001
+ var aryData=this.Column.Right;
2002
+ if (IFrameSplitOperator.IsNonEmptyArray(aryData))
2003
+ {
2004
+ var xLeft=rtCenter.Right;
2005
+ for(var j=0; j<aryData.length; ++j)
2006
+ {
2007
+ var columnItem=aryData[j];
2008
+ var rtItem={ Left:xLeft, Width:columnItem.Width, Top:rtCenter.Top, Bottom:rtCenter.Bottom, Height:rtCenter.Height };
2009
+ rtItem.Right=rtItem.Left+rtItem.Width;
2010
+
2011
+ var drawInfo={ Color:columnItem.TextColor };
2012
+ if (this.IsReserveNumber(columnItem.Type))
2013
+ {
2014
+ this.FormatReserveNumber(columnItem, item, drawInfo);
2015
+ }
2016
+
2017
+ var cellInfo={ RowIndex:i, ColIndex:j, Type:2, Price:item.Price };
2018
+ if (drawItemCallback)
2019
+ {
2020
+ drawItemCallback(rtItem, columnItem, drawInfo, cellInfo);
2021
+ }
2022
+ else
2023
+ {
2024
+ this.DrawRowItem(rtItem, columnItem, drawInfo, cellInfo);
2025
+ this.AryCellRect.push({ Rect:rtItem, CellInfo:cellInfo, Price:item.Price, Data:drawInfo.Data });
2026
+ }
2027
+
2028
+ xLeft=rtItem.Right;
2029
+ }
2030
+ }
2031
+
2032
+ yTop+=this.RowHeight;
2033
+ }
2034
+ }
2035
+
2036
+ FormatCenterItem(column, data, drawInfo)
2037
+ {
2038
+ if (data.Color) drawInfo.Color=data.Color;
2039
+ if (data.BGColor) drawInfo.BGColor=data.BGColor;
2040
+ if (IFrameSplitOperator.IsNumber(data.ColorID)) drawInfo.Color=this.GetColorByID(data.ColorID);
2041
+ if (IFrameSplitOperator.IsNumber(data.BGColorID)) drawInfo.BGColor=this.GetColorByID(data.BGColorID);
2042
+
2043
+ if (data.Text) drawInfo.Text=data.Text;
2044
+ else if (IFrameSplitOperator.IsNumber(data.Price)) drawInfo.Text=`${data.Price.toFixed(this.Decimal)}`;
2045
+ }
2046
+
2047
+ DrawRowItem(rtItem, columnItem, data, cellInfo)
2048
+ {
2049
+ var x=rtItem.Left+this.ItemMargin.Left;
2050
+ var y=rtItem.Bottom-this.ItemMargin.Bottom;
2051
+ if (columnItem.TextAlign=='center')
2052
+ {
2053
+ x=rtItem.Left+columnItem.Width/2;
2054
+ this.Canvas.textAlign="center";
2055
+ }
2056
+ else if (columnItem.TextAlign=='right')
2057
+ {
2058
+ x=rtItem.Right-this.ItemMargin.Right;
2059
+ this.Canvas.textAlign="right";
2060
+ }
2061
+ else
2062
+ {
2063
+ this.Canvas.textAlign="left";
2064
+ }
2065
+
2066
+ this.Canvas.textBaseline="bottom";
2067
+ if (data.Color) this.Canvas.fillStyle=data.Color;
2068
+ if (data.Text) this.Canvas.fillText(data.Text, x, y);
2069
+ }
2070
+
2071
+ FormatReserveNumber(column, data, drawInfo)
2072
+ {
2073
+ if (column.DefaultText) drawInfo.Text=column.DefaultText;
2074
+
2075
+ var fieldName=MAP_ORDER_COLUMN_FIELD.get(column.Type);
2076
+ if (!data || !data.Data || !fieldName) return;
2077
+
2078
+ var item=data.Data[fieldName];
2079
+ if (!IFrameSplitOperator.IsObject(item)) return;
2080
+
2081
+ drawInfo.Data=item;
2082
+
2083
+ if (item.Color) drawInfo.Color=item.Color;
2084
+ if (item.BGColor) drawInfo.BGColor=item.BGColor;
2085
+ if (IFrameSplitOperator.IsNumber(item.ColorID)) drawInfo.Color=this.GetColorByID(item.ColorID);
2086
+ if (IFrameSplitOperator.IsNumber(item.BGColorID)) drawInfo.BGColor=this.GetColorByID(item.BGColorID);
2087
+
2088
+ if (item.Text)
2089
+ {
2090
+ drawInfo.Text=item.Text;
2091
+ }
2092
+ else if (IFrameSplitOperator.IsNumber(item.Value))
2093
+ {
2094
+ var dec=2;
2095
+ if (IFrameSplitOperator.IsNumber(column.FloatPrecision)) dec=column.FloatPrecision;
2096
+ var value=item.Value;
2097
+ var text=value.toFixed(dec);
2098
+ if (column.Format && IFrameSplitOperator.IsNumber(column.Format.Type))
2099
+ {
2100
+ var format=column.Format;
2101
+ switch(format.Type)
2102
+ {
2103
+ case 1: //原始数据
2104
+ text=value.toFixed(dec);
2105
+ break;
2106
+ case 2: //千分位分割
2107
+ text=IFrameSplitOperator.FormatValueThousandsString(value, dec);
2108
+ break;
2109
+ case 3:
2110
+ var exfloatPrecision=1;
2111
+ if (IFrameSplitOperator.IsNumber(format.ExFloatPrecision)) exfloatPrecision=format.ExFloatPrecision;
2112
+ text=IFrameSplitOperator.FormatValueStringV2(value, dec,exfloatPrecision);
2113
+ break;
2114
+ }
2115
+ }
2116
+
2117
+ if (column.StringFormat && text) text=column.StringFormat.replace("{0}", text);
2118
+
2119
+ drawInfo.Text=text;
2120
+ }
2121
+ }
2122
+
2123
+ FormatReserveString(column, data, drawInfo)
2124
+ {
2125
+ if (column.DefaultText) drawInfo.Text=column.DefaultText;
2126
+
2127
+ var fieldName=MAP_DEAL_COLUMN_FIELD.get(column.Type);
2128
+ if (!data || !fieldName) return;
2129
+
2130
+ var item=data[fieldName];
2131
+ if (IFrameSplitOperator.IsObject(item))
2132
+ {
2133
+ if (item.Text) drawInfo.Text=item.Text;
2134
+ if (item.TextColor) drawInfo.TextColor=item.TextColor;
2135
+ if (item.BGColor) drawInfo.BGColor=item.BGColor;
2136
+ }
2137
+ else if (IFrameSplitOperator.IsString(item))
2138
+ {
2139
+ drawInfo.Text=item;
2140
+ }
2141
+
2142
+ if (item && item.Tooltip && IFrameSplitOperator.IsNonEmptyArray(item.Tooltip.AryText))
2143
+ {
2144
+ drawInfo.Tooltip=
2145
+ {
2146
+ Type:2,
2147
+ Data:{ AryText:item.Tooltip.AryText }
2148
+ }
2149
+ }
2150
+ }
2151
+
2152
+
2153
+ DrawFooter()
2154
+ {
2155
+
2156
+ }
2157
+
2158
+
2159
+ GetFontHeight(font,word)
2160
+ {
2161
+ return GetFontHeight(this.Canvas, font, word);
2162
+ }
2163
+
2164
+ OnMouseDown(x,y,e) //Type: 1=行
2165
+ {
2166
+ if (!this.Data) return null;
2167
+
2168
+ var pixelTatio = GetDevicePixelRatio();
2169
+ var insidePoint={X:x/pixelTatio, Y:y/pixelTatio};
2170
+ var uiElement;
2171
+ if (this.UIElement) uiElement={Left:this.UIElement.getBoundingClientRect().left, Top:this.UIElement.getBoundingClientRect().top};
2172
+ else uiElement={Left:null, Top:null};
2173
+
2174
+ var cell=this.PtInCell(x,y);
2175
+ if (cell)
2176
+ {
2177
+ var bRedraw=true;
2178
+ var cellInfo=cell.CellInfo;
2179
+ var selData=this.SelectedData.Data;
2180
+ if (selData && selData.ColIndex==cellInfo.ColIndex && selData.Price==cell.Price && selData.Type==cellInfo.Type)
2181
+ {
2182
+ bRedraw=false;
2183
+ }
2184
+ else
2185
+ {
2186
+ this.SelectedData.Data={ ColIndex:cellInfo.ColIndex, Price:cell.Price, Type:cellInfo.Type };
2187
+ }
2188
+
2189
+ var eventID=JSCHART_EVENT_ID.ON_CLICK_ORDER_CELL;
2190
+ if (e.button==2) eventID=JSCHART_EVENT_ID.ON_RCLICK_ORDER_CELL;
2191
+
2192
+ this.SendClickEvent(eventID, { Data:cell, X:x, Y:y, e:e, Inside:insidePoint, UIElement:uiElement });
2193
+
2194
+ return { Type:cellInfo.Type, Redraw:bRedraw, Data:cell };
2195
+ }
2196
+
2197
+ return null;
2198
+ }
2199
+
2200
+ OnDblClick(x,y,e)
2201
+ {
2202
+ if (!this.Data) return false;
2203
+
2204
+ var pixelTatio = GetDevicePixelRatio();
2205
+ var insidePoint={X:x/pixelTatio, Y:y/pixelTatio};
2206
+ var uiElement;
2207
+ if (this.UIElement) uiElement={Left:this.UIElement.getBoundingClientRect().left, Top:this.UIElement.getBoundingClientRect().top};
2208
+ else uiElement={Left:null, Top:null};
2209
+
2210
+ var cell=this.PtInCell(x,y);
2211
+ if (cell)
2212
+ {
2213
+ this.SendClickEvent(JSCHART_EVENT_ID.ON_DBCLICK_ORDER_ROW, { Data:cell, X:x, Y:y, e:e, Inside:insidePoint, UIElement:uiElement } );
2214
+ return true;
2215
+ }
2216
+
2217
+ return false;
2218
+ }
2219
+
2220
+ PtInCell(x,y)
2221
+ {
2222
+ if (!this.Data) return null;
2223
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return null;
2224
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.AryCellRect)) return null;
2225
+
2226
+ for(var i=0;i<this.AryCellRect.length;++i)
2227
+ {
2228
+ var item=this.AryCellRect[i];
2229
+ var rtRow=item.Rect;
2230
+ if (x>=rtRow.Left && x<=rtRow.Right && y>=rtRow.Top && y<=rtRow.Bottom)
2231
+ {
2232
+ var data={ Rect:rtRow, CellInfo:item.CellInfo, Data:item.Data, Price:item.Price };
2233
+ return data;
2234
+ }
2235
+ }
2236
+
2237
+ return null;
2238
+ }
2239
+
2240
+ PtInCenter(x,y)
2241
+ {
2242
+ if (!this.RectCenter) return null;
2243
+
2244
+ if (x>=this.RectCenter.Left && x<=this.RectCenter.Right && y>=this.RectCenter.Top && y<=this.RectCenter.Bottom)
2245
+ {
2246
+ return { Rect:this.RectCenter };
2247
+ }
2248
+
2249
+ return null;
2250
+ }
2251
+
2252
+ SendClickEvent(id, data)
2253
+ {
2254
+ var event=this.GetEventCallback(id);
2255
+ if (event && event.Callback)
2256
+ {
2257
+ event.Callback(event,data,this);
2258
+ }
2259
+ }
2260
+
2261
+ IsReserveString(value)
2262
+ {
2263
+ var ARARY_TYPE=
2264
+ [
2265
+ ORDER_COLUMN_ID.RESERVE_STRING1_ID,ORDER_COLUMN_ID.RESERVE_STRING2_ID,ORDER_COLUMN_ID.RESERVE_STRING3_ID,ORDER_COLUMN_ID.RESERVE_STRING4_ID,
2266
+ ORDER_COLUMN_ID.RESERVE_STRING5_ID,ORDER_COLUMN_ID.RESERVE_STRING6_ID,ORDER_COLUMN_ID.RESERVE_STRING7_ID,ORDER_COLUMN_ID.RESERVE_STRING8_ID,
2267
+ ORDER_COLUMN_ID.RESERVE_STRING9_ID,ORDER_COLUMN_ID.RESERVE_STRING10_ID
2268
+ ];
2269
+
2270
+ return ARARY_TYPE.includes(value);
2271
+ }
2272
+
2273
+ IsReserveNumber(value)
2274
+ {
2275
+ var ARARY_TYPE=
2276
+ [
2277
+ ORDER_COLUMN_ID.RESERVE_NUMBER1_ID,ORDER_COLUMN_ID.RESERVE_NUMBER2_ID,ORDER_COLUMN_ID.RESERVE_NUMBER3_ID,
2278
+ ORDER_COLUMN_ID.RESERVE_NUMBER4_ID,ORDER_COLUMN_ID.RESERVE_NUMBER5_ID,ORDER_COLUMN_ID.RESERVE_NUMBER6_ID,ORDER_COLUMN_ID.RESERVE_NUMBER7_ID,
2279
+ ORDER_COLUMN_ID.RESERVE_NUMBER8_ID,ORDER_COLUMN_ID.RESERVE_NUMBER9_ID,ORDER_COLUMN_ID.RESERVE_NUMBER10_ID
2280
+ ];
2281
+
2282
+ return ARARY_TYPE.includes(value);
2283
+ }
2284
+
2285
+ OnMouseOn(x,y,e)
2286
+ {
2287
+ if (!this.Data) return null;
2288
+
2289
+ var pixelTatio = GetDevicePixelRatio();
2290
+ var insidePoint={X:x/pixelTatio, Y:y/pixelTatio};
2291
+ var uiElement;
2292
+ if (this.UIElement) uiElement={Left:this.UIElement.getBoundingClientRect().left, Top:this.UIElement.getBoundingClientRect().top};
2293
+ else uiElement={Left:null, Top:null};
2294
+
2295
+ var bDraw=false;
2296
+ var cell=this.PtInCell(x,y);
2297
+ if (cell)
2298
+ {
2299
+ var bRedraw=true;
2300
+ var cellInfo=cell.CellInfo;
2301
+ var selData=this.MoveOnData.Data;
2302
+ if (selData && selData.ColIndex==cellInfo.ColIndex && selData.Price==cell.Price && selData.Type==cellInfo.Type)
2303
+ {
2304
+ bDraw=false;
2305
+ }
2306
+ else
2307
+ {
2308
+ this.MoveOnData.Data={ ColIndex:cellInfo.ColIndex, Price:cell.Price, Type:cellInfo.Type };
2309
+ bDraw=true;
2310
+ }
2311
+ }
2312
+ else
2313
+ {
2314
+ if (this.MoveOnData.Data)
2315
+ {
2316
+ this.MoveOnData.Data=null;
2317
+ bDraw=true;
2318
+ }
2319
+ }
2320
+
2321
+ return { Redraw:bDraw, Cell:cell }
2322
+ }
2323
+
2324
+ GetTooltipData(x,y)
2325
+ {
2326
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.TooltipRect)) return null;
2327
+
2328
+ for(var i=0;i<this.TooltipRect.length;++i)
2329
+ {
2330
+ var item=this.TooltipRect[i];
2331
+ var rt=item.Rect;
2332
+ if (!rt) continue;
2333
+
2334
+ if (x>=rt.Left && x<=rt.Right && y>=rt.Top && y<=rt.Bottom)
2335
+ {
2336
+ return { Rect:item.Rect, Data:item.Data, Column:item.Column, Index:item.Index, Type:item.Type, Data:item.Data };
2337
+ }
2338
+ }
2339
+
2340
+ return null;
2341
+ }
2342
+ }