hqchart
Version:
stock chart
234 lines (230 loc) • 890 kB
JavaScript
"use strict";var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};/*
Copyright (c) 2018 jones
http://www.apache.org/licenses/LICENSE-2.0
开源项目 https://github.com/jones2000/HQChart
jones_2000@163.com
封装行情类图形控件 (H5版本)
*///日志输出类
if(!JSConsole){var JSConsole={Chart:{Log:console.log},//图形日志
Complier:{Log:console.log//编译器日志
}};}function JSChart(divElement){this.DivElement=divElement;this.DivToolElement=null;//工具条
this.JSChartContainer;//画图控件
//h5 canvas
this.CanvasElement=document.createElement("canvas");this.CanvasElement.className='jschart-drawing';this.CanvasElement.id=Guid();this.CanvasElement.setAttribute("tabindex",0);if(this.CanvasElement.style)this.CanvasElement.style.outline='none';if(!divElement.hasChildNodes("canvas")){divElement.appendChild(this.CanvasElement);}//改参数div
this.ModifyIndexDialog=new ModifyIndexDialog(divElement);this.ChangeIndexDialog=new ChangeIndexDialog(divElement);this.MinuteDialog=new MinuteDialog(divElement);this.OnSize=function(){//画布大小通过div获取
var height=parseInt(this.DivElement.style.height.replace("px",""));if(this.ToolElement){//TODO调整工具条大小
height-=this.ToolElement.style.height.replace("px","");//减去工具条的高度
}this.CanvasElement.height=height;this.CanvasElement.width=parseInt(this.DivElement.style.width.replace("px",""));this.CanvasElement.style.width=this.CanvasElement.width+'px';this.CanvasElement.style.height=this.CanvasElement.height+'px';var pixelTatio=GetDevicePixelRatio();//获取设备的分辨率
this.CanvasElement.height*=pixelTatio;this.CanvasElement.width*=pixelTatio;JSConsole.Chart.Log("[JSChart::OnSize] devicePixelRatio="+window.devicePixelRatio+", height="+this.CanvasElement.height+", width="+this.CanvasElement.width);if(this.JSChartContainer&&this.JSChartContainer.Frame)this.JSChartContainer.Frame.SetSizeChage(true);if(this.JSChartContainer)this.JSChartContainer.Draw();};//手机屏需要调整 间距
this.AdjustChartBorder=function(chart){var pixelTatio=GetDevicePixelRatio();//获取设备的分辨率
chart.Frame.ChartBorder.Left*=pixelTatio;chart.Frame.ChartBorder.Right*=pixelTatio;chart.Frame.ChartBorder.Top*=pixelTatio;chart.Frame.ChartBorder.Bottom*=pixelTatio;};this.AdjustTitleHeight=function(chart){var pixelTatio=GetDevicePixelRatio();//获取设备的分辨率
for(var _i in chart.Frame.SubFrame){chart.Frame.SubFrame[_i].Frame.ChartBorder.TitleHeight*=pixelTatio;}chart.ChartCorssCursor.TextHeight*=pixelTatio;//十字光标文本信息高度
};//历史K线图
this.CreateKLineChartContainer=function(option){var chart=null;if(option.Type==="历史K线图横屏")chart=new KLineChartHScreenContainer(this.CanvasElement);else chart=new KLineChartContainer(this.CanvasElement);if(option.NetworkFilter)chart.NetworkFilter=option.NetworkFilter;//创建改参数div
chart.ModifyIndexDialog=this.ModifyIndexDialog;chart.ChangeIndexDialog=this.ChangeIndexDialog;chart.MinuteDialog=this.MinuteDialog;//右键菜单
if(option.IsShowRightMenu==true)chart.RightMenu=new KLineRightMenu(this.DivElement);if(option.ScriptError)chart.ScriptErrorCallback=option.ScriptError;chart.SelectRectRightMenu=new KLineSelectRightMenu(this.DivElement);if(option.EnableScrollUpDown==true)chart.EnableScrollUpDown=option.EnableScrollUpDown;if(option.DisableMouse==true)chart.DisableMouse=option.DisableMouse;if(option.TouchMoveMinAngle)chart.TouchMoveMinAngle=option.TouchMoveMinAngle;if(option.KLine)//k线图的属性设置
{if(option.KLine.DragMode>=0)chart.DragMode=option.KLine.DragMode;if(option.KLine.Right>=0)chart.Right=option.KLine.Right;if(option.KLine.Period>=0)chart.Period=option.KLine.Period;if(option.KLine.MaxReqeustDataCount>0)chart.MaxReqeustDataCount=option.KLine.MaxReqeustDataCount;if(option.KLine.Info&&option.KLine.Info.length>0)chart.SetKLineInfo(option.KLine.Info,false);if(option.KLine.IndexTreeApiUrl)chart.ChangeIndexDialog.IndexTreeApiUrl=option.KLine.IndexTreeApiUrl;if(option.KLine.KLineDoubleClick==false)chart.MinuteDialog=this.MinuteDialog=null;if(option.KLine.IndexTreeApiUrl!=null)chart.ChangeIndexDialog.IndexTreeApiUrl=option.KLine.IndexTreeApiUrl;if(option.KLine.IsShowTooltip==false)chart.IsShowTooltip=false;if(option.KLine.MaxRequestMinuteDayCount>0)chart.MaxRequestMinuteDayCount=option.KLine.MaxRequestMinuteDayCount;if(option.KLine.DrawType)chart.KLineDrawType=option.KLine.DrawType;if(option.KLine.FirstShowDate>20000101)chart.CustomShow={Date:option.KLine.FirstShowDate};if(option.KLine.RightSpaceCount>0)chart.RightSpaceCount=option.KLine.RightSpaceCount;}if(option.Page){if(option.Page.Day&&option.Page.Day.Enable==true)chart.Page.Day.Enable=true;if(option.Page.Minute&&option.Page.Minute.Enable==true)chart.Page.Minute.Enable=true;}if(option.DragDownload){if(option.DragDownload.Day&&option.DragDownload.Day.Enable==true)chart.DragDownload.Day.Enable=true;if(option.DragDownload.Minute&&option.DragDownload.Minute.Enable==true)chart.DragDownload.Minute.Enable=true;}if(option.Language){if(option.Language==='CN')chart.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;else if(option.Language==='EN')chart.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_ENGLISH_ID;}if(option.SourceDatatLimit)chart.SetSourceDatatLimit(option.SourceDatatLimit);if(option.DrawPicture)//画图工具
{if(option.DrawPicture.StorageKey&&chart.ChartDrawStorage)chart.ChartDrawStorage.Load(option.DrawPicture.StorageKey);}if(option.StepPixel>0)chart.StepPixel=option.StepPixel;if(option.ZoomStepPixel>0)chart.ZoomStepPixel=option.ZoomStepPixel;if(option.IsApiPeriod==true)chart.IsApiPeriod=option.IsApiPeriod;if(!option.Windows||option.Windows.length<=0)return null;//创建子窗口
chart.Create(option.Windows.length);if(option.Border){if(!isNaN(option.Border.Left))chart.Frame.ChartBorder.Left=option.Border.Left;if(!isNaN(option.Border.Right))chart.Frame.ChartBorder.Right=option.Border.Right;if(!isNaN(option.Border.Top))chart.Frame.ChartBorder.Top=option.Border.Top;if(!isNaN(option.Border.Bottom))chart.Frame.ChartBorder.Bottom=option.Border.Bottom;}this.AdjustChartBorder(chart);if(option.KLine){if(option.KLine.PageSize>0)//一屏显示的数据个数
{var pageSize=chart.GetMaxMinPageSize();if(pageSize.Max>10&&pageSize.Max<option.KLine.PageSize)chart.PageSize=pageSize.Max;else if(pageSize.Min>10&&pageSize.Min>option.KLine.PageSize)chart.PageSize=pageSize.Min;else chart.PageSize=option.KLine.PageSize;}}//取消显示十字光标刻度信息
if(option.IsCorssOnlyDrawKLine===true)chart.ChartCorssCursor.IsOnlyDrawKLine=option.IsCorssOnlyDrawKLine;if(option.CorssCursorTouchEnd===true)chart.CorssCursorTouchEnd=option.CorssCursorTouchEnd;if(option.IsClickShowCorssCursor==true)chart.IsClickShowCorssCursor=option.IsClickShowCorssCursor;if(option.CorssCursorInfo){if(!isNaN(option.CorssCursorInfo.Left))chart.ChartCorssCursor.ShowTextMode.Left=option.CorssCursorInfo.Left;if(!isNaN(option.CorssCursorInfo.Right))chart.ChartCorssCursor.ShowTextMode.Right=option.CorssCursorInfo.Right;if(!isNaN(option.CorssCursorInfo.Bottom))chart.ChartCorssCursor.ShowTextMode.Bottom=option.CorssCursorInfo.Bottom;if(option.CorssCursorInfo.IsShowCorss===false)chart.ChartCorssCursor.IsShowCorss=option.CorssCursorInfo.IsShowCorss;if(option.CorssCursorInfo.IsShowClose==true)chart.ChartCorssCursor.IsShowClose=option.CorssCursorInfo.IsShowClose;//Y轴显示收盘价
if(option.CorssCursorInfo.PressTime)chart.PressTime=option.CorssCursorInfo.PressTime;//长按显示十字光标的时间
if(option.CorssCursorInfo.HPenType>0)chart.ChartCorssCursor.HPenType=option.CorssCursorInfo.HPenType;if(option.CorssCursorInfo.VPenType>0)chart.ChartCorssCursor.VPenType=option.CorssCursorInfo.VPenType;}if(option.SplashTitle)chart.ChartSplashPaint.SplashTitle=option.SplashTitle;if(option.Frame){for(var i in option.Frame){var item=option.Frame[i];if(!chart.Frame.SubFrame[i])continue;if(item.SplitCount)chart.Frame.SubFrame[i].Frame.YSplitOperator.SplitCount=item.SplitCount;if(item.StringFormat)chart.Frame.SubFrame[i].Frame.YSplitOperator.StringFormat=item.StringFormat;if(IFrameSplitOperator.IsNumber(item.FloatPrecision))chart.Frame.SubFrame[i].Frame.YSplitOperator.FloatPrecision=item.FloatPrecision;if(item.Custom)chart.Frame.SubFrame[i].Frame.YSplitOperator.Custom=item.Custom;if(IFrameSplitOperator.IsNumber(item.SplitType))chart.Frame.SubFrame[i].Frame.YSplitOperator.SplitType=item.SplitType;if(!isNaN(item.Height))chart.Frame.SubFrame[i].Height=item.Height;if(item.IsShowLeftText===false||item.IsShowLeftText===true){chart.Frame.SubFrame[i].Frame.IsShowYText[0]=item.IsShowLeftText;chart.Frame.SubFrame[i].Frame.YSplitOperator.IsShowLeftText=item.IsShowLeftText;//显示左边刻度
}if(item.IsShowRightText===false||item.IsShowRightText===true){chart.Frame.SubFrame[i].Frame.IsShowYText[1]=item.IsShowRightText;chart.Frame.SubFrame[i].Frame.YSplitOperator.IsShowRightText=item.IsShowRightText;//显示右边刻度
}if(item.TopSpace>=0)chart.Frame.SubFrame[i].Frame.ChartBorder.TopSpace=item.TopSpace;if(item.BottomSpace>=0)chart.Frame.SubFrame[i].Frame.ChartBorder.BottomSpace=item.BottomSpace;}}if(option.KLine){if(option.KLine.ShowKLine==false)chart.ChartPaint[0].IsShow=false;if(option.KLine.InfoPosition>0)chart.ChartPaint[0].InfoPosition=option.KLine.InfoPosition;if(option.KLine.IsShowMaxMinPrice==false)chart.ChartPaint[0].IsShowMaxMinPrice=option.KLine.IsShowMaxMinPrice;}if(option.KLineTitle){if(option.KLineTitle.IsShowName==false)chart.TitlePaint[0].IsShowName=false;if(option.KLineTitle.IsShowSettingInfo==false)chart.TitlePaint[0].IsShowSettingInfo=false;if(option.KLineTitle.IsShow==false)chart.TitlePaint[0].IsShow=false;}//叠加股票
if(option.Overlay){for(var i in option.Overlay){var item=option.Overlay[i];chart.OverlaySymbol(item.Symbol,item);}}if(option.ExtendChart){for(var i in option.ExtendChart){var item=option.ExtendChart[i];chart.CreateExtendChart(item.Name,item);}}//创建子窗口的指标
var scriptData=new JSIndexScript();if(option.ColorIndex)//五彩K线
{var item=option.ColorIndex;var indexInfo=scriptData.Get(item.Index);if(indexInfo){indexInfo.ID=item.Index;chart.ColorIndex=new ScriptIndex(indexInfo.Name,indexInfo.Script,indexInfo.Args,indexInfo);//脚本执行
}}if(option.TradeIndex)//交易指标
{var item=option.TradeIndex;var _indexInfo=scriptData.Get(item.Index);if(_indexInfo){_indexInfo.ID=item.Index;chart.TradeIndex=new ScriptIndex(_indexInfo.Name,_indexInfo.Script,_indexInfo.Args,_indexInfo);//脚本执行
}}for(var i in option.Windows){var item=option.Windows[i];if(item.Script){chart.WindowIndex[i]=new ScriptIndex(item.Name,item.Script,item.Args,item);//脚本执行
}else if(item.JsonData){chart.WindowIndex[i]=new JsonDataIndex(item.Name,item.Script,item.Args,item);//脚本执行
}else if(item.Local&&item.Local.Data){chart.WindowIndex[i]=new LocalJsonDataIndex(item.Local.Name,item.Local.Args,{JsonData:item.Local.Data});}else if(item.API)//使用API挂接指标数据 API:{ Name:指标名字, Script:指标脚本可以为空, Args:参数可以为空, Url:指标执行地址 }
{var apiItem=item.API;chart.WindowIndex[i]=new APIScriptIndex(apiItem.Name,apiItem.Script,apiItem.Args,item);}else{var indexItem=JSIndexMap.Get(item.Index);if(indexItem){chart.WindowIndex[i]=indexItem.Create();chart.CreateWindowIndex(i);}else{var _indexInfo2=scriptData.Get(item.Index);if(!_indexInfo2)continue;if(item.Lock)_indexInfo2.Lock=item.Lock;_indexInfo2.ID=item.Index;var args=_indexInfo2.Args;if(item.Args)args=item.Args;if(item.IsShortTitle)_indexInfo2.IsShortTitle=item.IsShortTitle;if(item.TitleFont)_indexInfo2.TitleFont=item.TitleFont;chart.WindowIndex[i]=new ScriptIndex(_indexInfo2.Name,_indexInfo2.Script,args,_indexInfo2);//脚本执行
if(item.StringFormat>0)chart.WindowIndex[i].StringFormat=item.StringFormat;if(item.FloatPrecision>=0)chart.WindowIndex[i].FloatPrecision=item.FloatPrecision;}}if(item.Modify!=null)chart.Frame.SubFrame[i].Frame.ModifyIndex=item.Modify;if(item.Change!=null)chart.Frame.SubFrame[i].Frame.ChangeIndex=item.Change;if(item.Close!=null)chart.Frame.SubFrame[i].Frame.CloseIndex=item.Close;if(item.Overlay!=null)chart.Frame.SubFrame[i].Frame.OverlayIndex=item.Overlay;if(item.IsDrawTitleBG==true)chart.Frame.SubFrame[i].Frame.IsDrawTitleBG=item.IsDrawTitleBG;if(!isNaN(item.TitleHeight))chart.Frame.SubFrame[i].Frame.ChartBorder.TitleHeight=item.TitleHeight;}//叠加指标宽度
if(option.OverlayIndexFrameWidth>40)chart.OverlayIndexFrameWidth=option.OverlayIndexFrameWidth;//叠加指标
for(var i in option.OverlayIndex){var item=option.OverlayIndex[i];if(item.Windows>=chart.Frame.SubFrame.length)continue;chart.CreateOverlayWindowsIndex({WindowIndex:item.Windows,IndexName:item.Index,ShowRightText:item.ShowRightText});}this.AdjustTitleHeight(chart);return chart;};//自定义指数历史K线图
this.CreateCustomKLineChartContainer=function(option){var chart=new CustomKLineChartContainer(this.CanvasElement);//创建改参数div
chart.ModifyIndexDialog=this.ModifyIndexDialog;chart.ChangeIndexDialog=this.ChangeIndexDialog;chart.MinuteDialog=this.MinuteDialog;//右键菜单
if(option.IsShowRightMenu==true)chart.RightMenu=new KLineRightMenu(this.DivElement);if(option.KLine)//k线图的属性设置
{if(option.KLine.DragMode>=0)chart.DragMode=option.KLine.DragMode;if(option.KLine.Right>=0)chart.Right=option.KLine.Right;if(option.KLine.Period>=0)chart.Period=option.KLine.Period;if(option.KLine.MaxReqeustDataCount>0)chart.MaxReqeustDataCount=option.KLine.MaxReqeustDataCount;if(option.KLine.Info&&option.KLine.Info.length>0)chart.SetKLineInfo(option.KLine.Info,false);if(option.KLine.IndexTreeApiUrl)chart.ChangeIndexDialog.IndexTreeApiUrl=option.KLine.IndexTreeApiUrl;if(option.KLine.KLineDoubleClick==false)chart.MinuteDialog=this.MinuteDialog=null;if(option.KLine.IndexTreeApiUrl!=null)chart.ChangeIndexDialog.IndexTreeApiUrl=option.KLine.IndexTreeApiUrl;if(option.KLine.PageSize>0)chart.PageSize=option.KLine.PageSize;if(option.KLine.IsShowTooltip==false)chart.IsShowTooltip=false;}if(option.CustomStock)chart.CustomStock=option.CustomStock;if(option.QueryDate)chart.QueryDate=option.QueryDate;if(!option.Windows||option.Windows.length<=0)return null;//创建子窗口
chart.Create(option.Windows.length);if(option.Border){if(!isNaN(option.Border.Left))chart.Frame.ChartBorder.Left=option.Border.Left;if(!isNaN(option.Border.Right))chart.Frame.ChartBorder.Right=option.Border.Right;if(!isNaN(option.Border.Top))chart.Frame.ChartBorder.Top=option.Border.Top;}if(option.IsShowCorssCursorInfo==false)//取消显示十字光标刻度信息
{chart.ChartCorssCursor.IsShowText=option.IsShowCorssCursorInfo;}if(option.Frame){for(var i in option.Frame){var item=option.Frame[i];if(item.SplitCount)chart.Frame.SubFrame[i].Frame.YSplitOperator.SplitCount=item.SplitCount;if(item.StringFormat)chart.Frame.SubFrame[i].Frame.YSplitOperator.StringFormat=item.StringFormat;}}if(option.KLineTitle){if(option.KLineTitle.IsShowName==false)chart.TitlePaint[0].IsShowName=false;if(option.KLineTitle.IsShowSettingInfo==false)chart.TitlePaint[0].IsShowSettingInfo=false;}//创建子窗口的指标
var scriptData=new JSIndexScript();for(var i in option.Windows){var item=option.Windows[i];if(item.Script){chart.WindowIndex[i]=new ScriptIndex(item.Name,item.Script,item.Args,item);//脚本执行
}else{var indexItem=JSIndexMap.Get(item.Index);if(indexItem){chart.WindowIndex[i]=indexItem.Create();chart.CreateWindowIndex(i);}else{var indexInfo=scriptData.Get(item.Index);if(!indexInfo)continue;if(item.Lock)indexInfo.Lock=item.Lock;chart.WindowIndex[i]=new ScriptIndex(indexInfo.Name,indexInfo.Script,indexInfo.Args,indexInfo);//脚本执行
}}if(item.Modify!=null)chart.Frame.SubFrame[i].Frame.ModifyIndex=item.Modify;if(item.Change!=null)chart.Frame.SubFrame[i].Frame.ChangeIndex=item.Change;if(!isNaN(item.TitleHeight))chart.Frame.SubFrame[i].Frame.ChartBorder.TitleHeight=item.TitleHeight;}return chart;};//分钟走势图
this.CreateMinuteChartContainer=function(option){var chart=null;if(option.Type==="分钟走势图横屏")chart=new MinuteChartHScreenContainer(this.CanvasElement);else chart=new MinuteChartContainer(this.CanvasElement);if(option.NetworkFilter)chart.NetworkFilter=option.NetworkFilter;var windowsCount=2;if(option.Windows&&option.Windows.length>0)windowsCount+=option.Windows.length;//指标窗口从第3个窗口开始
if(option.EnableScrollUpDown==true)chart.EnableScrollUpDown=option.EnableScrollUpDown;if(option.DisableMouse==true)chart.DisableMouse=option.DisableMouse;if(option.Language){if(option.Language==='CN')chart.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;else if(option.Language==='EN')chart.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_ENGLISH_ID;}if(option.Info&&option.Info.length>0)chart.SetMinuteInfo(option.Info,false);chart.Create(windowsCount);//创建子窗口
if(option.CorssCursorInfo){if(!isNaN(option.CorssCursorInfo.Left))chart.ChartCorssCursor.ShowTextMode.Left=option.CorssCursorInfo.Left;if(!isNaN(option.CorssCursorInfo.Right))chart.ChartCorssCursor.ShowTextMode.Right=option.CorssCursorInfo.Right;if(!isNaN(option.CorssCursorInfo.Bottom))chart.ChartCorssCursor.ShowTextMode.Bottom=option.CorssCursorInfo.Bottom;if(option.CorssCursorInfo.IsShowCorss===false)chart.ChartCorssCursor.IsShowCorss=option.CorssCursorInfo.IsShowCorss;}if(option.MinuteInfo)chart.CreateMinuteInfo(option.MinuteInfo);if(option.IsShowRightMenu==true)chart.RightMenu=new MinuteRightMenu(this.DivElement);if(option.DayCount>1)chart.DayCount=option.DayCount;if(option.Border){if(!isNaN(option.Border.Left))chart.Frame.ChartBorder.Left=option.Border.Left;if(!isNaN(option.Border.Right))chart.Frame.ChartBorder.Right=option.Border.Right;if(!isNaN(option.Border.Top))chart.Frame.ChartBorder.Top=option.Border.Top;if(!isNaN(option.Border.Bottom))chart.Frame.ChartBorder.Bottom=option.Border.Bottom;}if(option.SplashTitle)chart.ChartSplashPaint.SplashTitle=option.SplashTitle;this.AdjustChartBorder(chart);if(option.Frame){for(var i in option.Frame){var item=option.Frame[i];if(!chart.Frame.SubFrame[i])continue;if(item.SplitCount)chart.Frame.SubFrame[i].Frame.YSplitOperator.SplitCount=item.SplitCount;if(item.StringFormat)chart.Frame.SubFrame[i].Frame.YSplitOperator.StringFormat=item.StringFormat;if(item.IsShowLeftText==false)chart.Frame.SubFrame[i].Frame.YSplitOperator.IsShowLeftText=item.IsShowLeftText;//显示左边刻度
if(item.IsShowRightText==false)chart.Frame.SubFrame[i].Frame.YSplitOperator.IsShowRightText=item.IsShowRightText;//显示右边刻度
if(item.Height>0)chart.Frame.SubFrame[i].Height=item.Height;if(item.Custom)chart.Frame.SubFrame[i].Frame.YSplitOperator.Custom=item.Custom;}}if(option.ExtendChart){for(var i in option.ExtendChart){var item=option.ExtendChart[i];chart.CreateExtendChart(item.Name,item);}}//叠加股票
if(option.Overlay){for(var i in option.Overlay){var item=option.Overlay[i];chart.OverlaySymbol(item.Symbol,item);}}if(option.MinuteLine){if(option.MinuteLine.IsDrawAreaPrice==false)chart.ChartPaint[0].IsDrawArea=false;if(option.MinuteLine.IsShowLead==false)chart.IsShowLead=false;if(option.MinuteLine.IsShowAveragePrice==false)chart.ChartPaint[1].IsShow=false;if(option.MinuteLine.SplitType===1)chart.Frame.SubFrame[0].Frame.YSplitOperator.SplitType=option.MinuteLine.SplitType;}if(option.MinuteTitle){if(option.MinuteTitle.IsShowName==false)chart.TitlePaint[0].IsShowName=false;if(option.MinuteTitle.IsShowDate===false||option.MinuteTitle.IsShowDate===true)chart.TitlePaint[0].IsShowDate=option.MinuteTitle.IsShowDate;//if(option.KLineTitle.IsShow == false) chart.TitlePaint[0].IsShow = false;
}if(option.CorssCursorTouchEnd===true)chart.CorssCursorTouchEnd=option.CorssCursorTouchEnd;if(option.IsShowBeforeData===true)chart.IsShowBeforeData=option.IsShowBeforeData;//分钟数据指标从第3个指标窗口设置
var scriptData=new JSIndexScript();for(var i in option.Windows){var item=option.Windows[i];if(item.Script){chart.WindowIndex[2+parseInt(i)]=new ScriptIndex(item.Name,item.Script,item.Args);//脚本执行
}else if(item.API)//使用API挂接指标数据 API:{ Name:指标名字, Script:指标脚本可以为空, Args:参数可以为空, Url:指标执行地址 }
{var apiItem=item.API;chart.WindowIndex[2+parseInt(i)]=new APIScriptIndex(apiItem.Name,apiItem.Script,apiItem.Args,item);}else{var indexItem=JSIndexMap.Get(item.Index);if(indexItem){chart.WindowIndex[2+parseInt(i)]=indexItem.Create();//创建子窗口的指标
chart.CreateWindowIndex(2+parseInt(i));}else{var indexInfo=scriptData.Get(item.Index);if(!indexInfo)continue;indexInfo.ID=item.Index;var args=indexInfo.Args;if(item.Args)args=item.Args;chart.WindowIndex[2+parseInt(i)]=new ScriptIndex(indexInfo.Name,indexInfo.Script,args,indexInfo);//脚本执行
if(item.StringFormat>0)chart.WindowIndex[2+parseInt(i)].StringFormat=item.StringFormat;if(item.FloatPrecision>=0)chart.WindowIndex[2+parseInt(i)].FloatPrecision=item.FloatPrecision;}}if(!isNaN(item.TitleHeight))chart.Frame.SubFrame[2+parseInt(i)].Frame.ChartBorder.TitleHeight=item.TitleHeight;}this.AdjustTitleHeight(chart);if(option.Function){var func=option.Function;if(func.RequestMinuteData)chart.RequestMinuteData=func.RequestMinuteData;if(func.RecvMinuteData)chart.RecvMinuteData=func.RecvMinuteData;}return chart;};//历史分钟走势图
this.CreateHistoryMinuteChartContainer=function(option){var chart=new HistoryMinuteChartContainer(this.CanvasElement);var windowsCount=2;if(option.Windows&&option.Windows.length>0)windowsCount+=option.Windows.length;//指标窗口从第3个窗口开始
chart.Create(windowsCount);//创建子窗口
if(option.IsShowCorssCursorInfo==false)//取消显示十字光标刻度信息
{chart.ChartCorssCursor.IsShowText=option.IsShowCorssCursorInfo;}if(option.Border){if(!isNaN(option.Border.Left))chart.Frame.ChartBorder.Left=option.Border.Left;if(!isNaN(option.Border.Right))chart.Frame.ChartBorder.Right=option.Border.Right;if(!isNaN(option.Border.Top))chart.Frame.ChartBorder.Top=option.Border.Top;if(!isNaN(option.Border.Bottom))chart.Frame.ChartBorder.Bottom=option.Border.Bottom;}var scriptData=new JSIndexScript();for(var i in option.Windows){var item=option.Windows[i];if(item.Script){chart.WindowIndex[2+parseInt(i)]=new ScriptIndex(item.Name,item.Script,item.Args);//脚本执行
}else{var indexItem=JSIndexMap.Get(item.Index);if(indexItem){chart.WindowIndex[2+parseInt(i)]=indexItem.Create();//创建子窗口的指标
chart.CreateWindowIndex(2+parseInt(i));}else{var indexInfo=scriptData.Get(item.Index);if(!indexInfo)continue;chart.WindowIndex[2+parseInt(i)]=new ScriptIndex(indexInfo.Name,indexInfo.Script,indexInfo.Args);//脚本执行
}}if(!isNaN(item.TitleHeight))chart.Frame.SubFrame[2+parseInt(i)].Frame.ChartBorder.TitleHeight=item.TitleHeight;}chart.TradeDate=20181009;if(option.HistoryMinute.TradeDate)chart.TradeDate=option.HistoryMinute.TradeDate;if(option.HistoryMinute.IsShowName!=null)chart.TitlePaint[0].IsShowName=option.HistoryMinute.IsShowName;//动态标题是否显示股票名称
if(option.HistoryMinute.IsShowDate!=null)chart.TitlePaint[0].IsShowDate=option.HistoryMinute.IsShowDate;//动态标题是否显示日期
return chart;};this.CreateKLineTrainChartContainer=function(option){var bHScreen=option.Type=='K线训练横屏'?true:false;var chart=new KLineTrainChartContainer(this.CanvasElement,bHScreen);if(option.NetworkFilter)chart.NetworkFilter=option.NetworkFilter;if(option.IsApiPeriod==true)chart.IsApiPeriod=option.IsApiPeriod;//创建改参数div
chart.ModifyIndexDialog=this.ModifyIndexDialog;chart.ChangeIndexDialog=this.ChangeIndexDialog;if(option.ScriptError)chart.ScriptErrorCallback=option.ScriptError;if(option.KLine)//k线图的属性设置
{if(option.KLine.Right>=0)chart.Right=option.KLine.Right;if(option.KLine.Period>=0)chart.Period=option.KLine.Period;if(option.KLine.MaxReqeustDataCount>0)chart.MaxReqeustDataCount=option.KLine.MaxReqeustDataCount;if(option.KLine.Info&&option.KLine.Info.length>0)chart.SetKLineInfo(option.KLine.Info,false);if(option.KLine.PageSize>0)chart.PageSize=option.KLine.PageSize;if(option.KLine.IsShowTooltip==false)chart.IsShowTooltip=false;if(option.KLine.MaxRequestMinuteDayCount>0)chart.MaxRequestMinuteDayCount=option.KLine.MaxRequestMinuteDayCount;if(option.KLine.DrawType)chart.KLineDrawType=option.KLine.DrawType;}if(option.Train){if(option.Train.DataCount)chart.TrainDataCount=option.Train.DataCount;if(option.Train.Callback)chart.TrainCallback=option.Train.Callback;}if(!option.Windows||option.Windows.length<=0)return null;//创建子窗口
chart.Create(option.Windows.length);if(option.Border){if(!isNaN(option.Border.Left))chart.Frame.ChartBorder.Left=option.Border.Left;if(!isNaN(option.Border.Right))chart.Frame.ChartBorder.Right=option.Border.Right;if(!isNaN(option.Border.Top))chart.Frame.ChartBorder.Top=option.Border.Top;if(!isNaN(option.Border.Bottom))chart.Frame.ChartBorder.Bottom=option.Border.Bottom;}this.AdjustChartBorder(chart);if(option.IsShowCorssCursorInfo==false)chart.ChartCorssCursor.IsShowText=option.IsShowCorssCursorInfo;//取消显示十字光标刻度信息
if(option.IsCorssOnlyDrawKLine===true)chart.ChartCorssCursor.IsOnlyDrawKLine=option.IsCorssOnlyDrawKLine;if(option.CorssCursorTouchEnd===true)chart.CorssCursorTouchEnd=option.CorssCursorTouchEnd;if(option.IsClickShowCorssCursor==true)chart.IsClickShowCorssCursor=option.IsClickShowCorssCursor;if(option.Frame){for(var i in option.Frame){var item=option.Frame[i];if(!chart.Frame.SubFrame[i])continue;if(item.SplitCount)chart.Frame.SubFrame[i].Frame.YSplitOperator.SplitCount=item.SplitCount;if(item.StringFormat)chart.Frame.SubFrame[i].Frame.YSplitOperator.StringFormat=item.StringFormat;if(item.IsShowLeftText==false)chart.Frame.SubFrame[i].Frame.YSplitOperator.IsShowLeftText=item.IsShowLeftText;//显示左边刻度
if(item.IsShowRightText==false)chart.Frame.SubFrame[i].Frame.YSplitOperator.IsShowRightText=item.IsShowRightText;//显示右边刻度
}}if(option.ExtendChart){for(var i in option.ExtendChart){var item=option.ExtendChart[i];chart.CreateExtendChart(item.Name,item);}}//股票名称 日期 周期都不显示
chart.TitlePaint[0].IsShowName=false;chart.TitlePaint[0].IsShowSettingInfo=false;chart.TitlePaint[0].IsShowDateTime=false;//创建子窗口的指标
var scriptData=new JSIndexScript();for(var i in option.Windows){var item=option.Windows[i];if(item.Script){chart.WindowIndex[i]=new ScriptIndex(item.Name,item.Script,item.Args,item);//脚本执行
}else{var indexItem=JSIndexMap.Get(item.Index);if(indexItem){chart.WindowIndex[i]=indexItem.Create();chart.CreateWindowIndex(i);}else{var indexInfo=scriptData.Get(item.Index);if(!indexInfo)continue;if(item.Lock)indexInfo.Lock=item.Lock;chart.WindowIndex[i]=new ScriptIndex(indexInfo.Name,indexInfo.Script,indexInfo.Args,indexInfo);//脚本执行
}}if(item.Modify!=null)chart.Frame.SubFrame[i].Frame.ModifyIndex=item.Modify;if(item.Change!=null)chart.Frame.SubFrame[i].Frame.ChangeIndex=item.Change;if(item.Close!=null)chart.Frame.SubFrame[i].Frame.CloseIndex=item.Close;if(!isNaN(item.TitleHeight))chart.Frame.SubFrame[i].Frame.ChartBorder.TitleHeight=item.TitleHeight;}this.AdjustTitleHeight(chart);return chart;};//根据option内容绘制图形
this.SetOption=function(option){var chart=null;switch(option.Type){case"历史K线图":case'历史K线图横屏':chart=this.CreateKLineChartContainer(option);break;case"自定义指数历史K线图":chart=this.CreateCustomKLineChartContainer(option);break;case"分钟走势图":case"分钟走势图横屏":chart=this.CreateMinuteChartContainer(option);break;case"历史分钟走势图":chart=this.CreateHistoryMinuteChartContainer(option);break;case'K线训练':case'K线训练横屏':chart=this.CreateKLineTrainChartContainer(option);break;case"简单图形":return this.CreateSimpleChart(option);case"饼图":case'雷达图':return this.CreatePieChart(option);case'地图':return this.CreateMapChart(option);default:return false;}if(!chart)return false;//是否自动更新
if(option.IsAutoUpdate!=null)chart.IsAutoUpdate=option.IsAutoUpdate;if(option.AutoUpdateFrequency>0)chart.AutoUpdateFrequency=option.AutoUpdateFrequency;//设置股票代码
if(!option.Symbol)return false;chart.Draw();chart.ChangeSymbol(option.Symbol);this.JSChartContainer=chart;this.DivElement.JSChart=this;//div中保存一份
this.JSChartContainer.Draw();};this.CreateSimpleChart=function(option){var chart=new SimlpleChartContainer(this.CanvasElement);if(option.MainDataControl)chart.MainDataControl=option.MainDataControl;chart.Create();if(option.Border)//边框设置
{if(!isNaN(option.Border.Left))chart.Frame.ChartBorder.Left=option.Border.Left;if(!isNaN(option.Border.Right))chart.Frame.ChartBorder.Right=option.Border.Right;if(!isNaN(option.Border.Top))chart.Frame.ChartBorder.Top=option.Border.Top;}chart.Draw();chart.RequestData();this.JSChartContainer=chart;this.DivElement.JSChart=this;//div中保存一份
this.JSChartContainer.Draw();};//创建饼图
this.CreatePieChart=function(option){var chart=new PieChartContainer(this.CanvasElement);if(option.MainDataControl)chart.MainDataControl=option.MainDataControl;if(option.Radius)chart.Radius=option.Radius;chart.Create();if(option.Border)//边框设置
{if(!isNaN(option.Border.Left))chart.Frame.ChartBorder.Left=option.Border.Left;if(!isNaN(option.Border.Right))chart.Frame.ChartBorder.Right=option.Border.Right;if(!isNaN(option.Border.Top))chart.Frame.ChartBorder.Top=option.Border.Top;}this.AdjustChartBorder(chart);if(option.Frame){if(option.Frame[0].IsShowBorder==false)chart.Frame.IsShowBorder=option.Frame[0].IsShowBorder;}chart.Draw();chart.RequestData();this.JSChartContainer=chart;this.DivElement.JSChart=this;//div中保存一份
this.JSChartContainer.Draw();};this.CreateMapChart=function(option){var chart=new MapChartContainer(this.CanvasElement);if(option.MainDataControl)chart.MainDataControl=option.MainDataControl;chart.Create();if(option.Border)//边框设置
{if(!isNaN(option.Border.Left))chart.Frame.ChartBorder.Left=option.Border.Left;if(!isNaN(option.Border.Right))chart.Frame.ChartBorder.Right=option.Border.Right;if(!isNaN(option.Border.Top))chart.Frame.ChartBorder.Top=option.Border.Top;}chart.Draw();chart.RequestData();this.JSChartContainer=chart;this.DivElement.JSChart=this;//div中保存一份
this.JSChartContainer.Draw();};//创建工具条
this.CreateToolbar=function(option){};//创建设置div窗口
this.CreateSettingDiv=function(option){};this.Focus=function(){if(this.CanvasElement)this.CanvasElement.focus();};//切换股票代码接口
this.ChangeSymbol=function(symbol){if(this.JSChartContainer)this.JSChartContainer.ChangeSymbol(symbol);};//K线切换指标
this.ChangeIndex=function(windowIndex,indexName,option){if(this.JSChartContainer&&typeof this.JSChartContainer.ChangeIndex=='function')this.JSChartContainer.ChangeIndex(windowIndex,indexName,option);};this.ChangeScriptIndex=function(windowIndex,indexData){if(this.JSChartContainer&&typeof this.JSChartContainer.ChangeScriptIndex=='function')this.JSChartContainer.ChangeScriptIndex(windowIndex,indexData);};this.ChangePyScriptIndex=function(windowIndex,indexData)//切换py指标
{if(this.JSChartContainer&&typeof this.JSChartContainer.ChangePyScriptIndex=='function')this.JSChartContainer.ChangePyScriptIndex(windowIndex,indexData);};this.GetIndexInfo=function(){if(this.JSChartContainer&&typeof this.JSChartContainer.GetIndexInfo=='function')return this.JSChartContainer.GetIndexInfo();else return[];};this.ChangeInstructionIndex=function(indexName){if(this.JSChartContainer&&typeof this.JSChartContainer.ChangeInstructionIndex=='function')this.JSChartContainer.ChangeInstructionIndex(indexName);};this.ChangeInstructionScriptIndex=function(indexData){if(this.JSChartContainer&&typeof this.JSChartContainer.ChangeInstructionIndex=='function')this.JSChartContainer.ChangeInstructionScriptIndex(indexData);};this.CancelInstructionIndex=function(){if(this.JSChartContainer&&typeof this.JSChartContainer.CancelInstructionIndex=='function')this.JSChartContainer.CancelInstructionIndex();};//K线周期切换
this.ChangePeriod=function(period){if(this.JSChartContainer&&typeof this.JSChartContainer.ChangePeriod=='function')this.JSChartContainer.ChangePeriod(period);};//K线复权切换
this.ChangeRight=function(right){if(this.JSChartContainer&&typeof this.JSChartContainer.ChangeRight=='function')this.JSChartContainer.ChangeRight(right);};//叠加股票
this.OverlaySymbol=function(symbol,option){if(this.JSChartContainer&&typeof this.JSChartContainer.OverlaySymbol=='function')this.JSChartContainer.OverlaySymbol(symbol,option);};//删除一个叠加股票
this.DeleteOverlaySymbol=function(symbol){if(this.JSChartContainer&&typeof this.JSChartContainer.DeleteOverlaySymbol=='function')this.JSChartContainer.DeleteOverlaySymbol(symbol);};//设置当前屏的起始日期 { Date:起始日期(必填), PageSize:一屏显示的数据个数(可选)}
this.SetFirstShowDate=function(obj){if(this.JSChartContainer&&typeof this.JSChartContainer.SetFirstShowDate=='function')this.JSChartContainer.SetFirstShowDate(obj);};//K线切换类型 0=实心K线 1=收盘价线 2=美国线 3=空心K线 4=面积图
this.ChangeKLineDrawType=function(drawType){if(this.JSChartContainer&&typeof this.JSChartContainer.ChangeKLineDrawType=='function')this.JSChartContainer.ChangeKLineDrawType(drawType);};//指标窗口个数
this.ChangeIndexWindowCount=function(count){if(this.JSChartContainer&&typeof this.JSChartContainer.ChangeIndexWindowCount=='function'){this.JSChartContainer.ChangeIndexWindowCount(count);}};//取消叠加
this.ClearOverlaySymbol=function(){if(this.JSChartContainer&&typeof this.JSChartContainer.ClearOverlaySymbol=='function'){this.JSChartContainer.ClearOverlaySymbol();}};this.DeleteKLineInfo=function(infoName){if(this.JSChartContainer&&typeof this.JSChartContainer.DeleteKLineInfo=='function'){this.JSChartContainer.DeleteKLineInfo(infoName);}};this.ClearKLineInfo=function(){if(this.JSChartContainer&&typeof this.JSChartContainer.ClearKLineInfo=='function'){this.JSChartContainer.ClearKLineInfo();}};this.AddKLineInfo=function(infoName,bUpdate){if(this.JSChartContainer&&typeof this.JSChartContainer.AddKLineInfo=='function'){this.JSChartContainer.AddKLineInfo(infoName,bUpdate);}};this.ChangMainDataControl=function(dataControl){if(this.JSChartContainer&&typeof this.JSChartContainer.SetMainDataConotrl=='function')this.JSChartContainer.SetMainDataConotrl(dataControl);};this.AddOverlayIndex=function(obj)//{WindowIndex:窗口ID, IndexName:指标ID, Identify:叠加指标ID(可选)}
{if(this.JSChartContainer&&typeof this.JSChartContainer.AddOverlayIndex=='function')this.JSChartContainer.AddOverlayIndex(obj);};this.DeleteOverlayWindowsIndex=function(identify){if(this.JSChartContainer&&typeof this.JSChartContainer.DeleteOverlayWindowsIndex=='function')this.JSChartContainer.DeleteOverlayWindowsIndex(identify);};this.StopAutoUpdate=function(){if(this.JSChartContainer&&typeof this.JSChartContainer.StopAutoUpdate=='function')this.JSChartContainer.StopAutoUpdate();};//设置强制横屏
this.ForceLandscape=function(bForceLandscape){if(this.JSChartContainer){JSConsole.Chart.Log("[JSChart::ForceLandscape] bForceLandscape="+bForceLandscape);this.JSChartContainer.IsForceLandscape=bForceLandscape;}};//锁指标
this.LockIndex=function(lockData){if(this.JSChartContainer&&typeof this.JSChartContainer.LockIndex=='function'){JSConsole.Chart.Log('[JSChart:LockIndex] lockData',lockData);this.JSChartContainer.LockIndex(lockData);}};//历史分钟数据 更改日期
this.ChangeTradeDate=function(tradeDate){if(this.JSChartContainer&&typeof this.JSChartContainer.ChangeTradeDate=='function'){JSConsole.Chart.Log('[JSChart:ChangeTradeDate] date',tradeDate);this.JSChartContainer.ChangeTradeDate(tradeDate);}};//多日走势图
this.ChangeDayCount=function(count){if(this.JSChartContainer&&typeof this.JSChartContainer.ChangeDayCount=='function'){JSConsole.Chart.Log('[JSChart:ChangeDayCount] count',count);this.JSChartContainer.ChangeDayCount(count);}};//返回弹幕数据类
this.StartAnimation=function(option){if(this.JSChartContainer&&typeof this.JSChartContainer.StartAnimation=='function'){JSConsole.Chart.Log('[JSChart:StartAnimation] start.');return this.JSChartContainer.StartAnimation(option);}};this.StopAnimation=function(){if(this.JSChartContainer&&typeof this.JSChartContainer.StopAnimation=='function'){JSConsole.Chart.Log('[JSChart:StopAnimation] start.');return this.JSChartContainer.StopAnimation();}};this.SaveToImage=function(format,colorGB)//format=保存的文件格式, colorGB=背景色
{if(this.JSChartContainer&&typeof this.JSChartContainer.SaveToImage=='function')return this.JSChartContainer.SaveToImage(format,colorGB);};this.SaveToImageUrl=function(obj,callback){if(this.JSChartContainer&&typeof this.JSChartContainer.SaveToImageUrl=='function')return this.JSChartContainer.SaveToImageUrl(obj,callback);};//事件回调
this.AddEventCallback=function(obj){if(this.JSChartContainer&&typeof this.JSChartContainer.AddEventCallback=='function'){JSConsole.Chart.Log('[JSChart:AddEventCallback] ',obj);this.JSChartContainer.AddEventCallback(obj);}};//设置语言 'EN', 'CN'
this.SetLanguage=function(language){if(this.JSChartContainer&&typeof this.JSChartContainer.SetLanguage=='function'){JSConsole.Chart.Log('[JSChart:SetLanguage] ',language);this.JSChartContainer.SetLanguage(language);}};//切换指标模板
this.ChangeIndexTemplate=function(option){if(this.JSChartContainer&&typeof this.JSChartContainer.ChangeIndexTemplate=='function'){JSConsole.Chart.Log('[JSChart:ChangeIndexTemplate] ',option);this.JSChartContainer.ChangeIndexTemplate(option);}};//画图工具
this.SetChartDrawOption=function(option){if(this.JSChartContainer&&typeof this.JSChartContainer.SetChartDrawOption=='function'){JSConsole.Chart.Log('[JSChart:SetChartDrawOption] ',option);this.JSChartContainer.SetChartDrawOption(option);}};this.CreateChartDrawPicture=function(name){if(this.JSChartContainer&&typeof this.JSChartContainer.CreateChartDrawPicture=='function'){JSConsole.Chart.Log('[JSChart:CreateChartDrawPicture] ',name);this.JSChartContainer.CreateChartDrawPicture(name);}};}//初始化
JSChart.Init=function(divElement){var jsChartControl=new JSChart(divElement);jsChartControl.OnSize();return jsChartControl;};JSChart.SetDomain=function(domain,cacheDomain){if(domain)g_JSChartResource.Domain=domain;if(cacheDomain)g_JSChartResource.CacheDomain=cacheDomain;};JSChart.SetPyIndexDomain=function(domain)//设置py指标计算api域名
{if(domain)g_JSChartResource.PyIndexDomain=domain;};//自定义风格
JSChart.SetStyle=function(option){if(option)g_JSChartResource.SetStyle(option);};//value { EN:'', CH:'' }
JSChart.SetTextResource=function(key,value){g_JSChartLocalization.SetTextResource(key,value);};//获取本地化资源
JSChart.GetLocalization=function(){return g_JSChartLocalization;};//获取设备分辨率比
JSChart.GetDevicePixelRatio=function(){return GetDevicePixelRatio();};JSChart.CreateGuid=function(){return Guid();};JSChart.GetResource=function()//获取颜色配置 (设置配必须啊在JSChart.Init()之前)
{return g_JSChartResource;};JSChart.GetMinuteTimeStringData=function(){return g_MinuteTimeStringData;};JSChart.GetMinuteCoordinateData=function(){return g_MinuteCoordinateData;};JSChart.GetKLineZoom=function()//K线缩放配置
{return ZOOM_SEED;};var JSCHART_EVENT_ID={RECV_KLINE_MATCH:1,//接收到形态匹配
RECV_INDEX_DATA:2,//接收指标数据
RECV_HISTROY_DATA:3,//接收到历史数据
RECV_TRAIN_MOVE_STEP:4,//接收K线训练,移动一次K线
CHART_STATUS:5,//每次Draw() 以后会调用
BARRAGE_PLAY_END:6,//单个弹幕播放完成
RECV_OVERLAY_INDEX_DATA:7,//接收叠加指标数据
DBCLICK_KLINE:8,//双击K线图
RECV_START_AUTOUPDATE:9,//开始自动更新
RECV_STOP_AUTOUPDATE:10,//停止自动更新
ON_CONTEXT_MENU:11,//右键菜单事件
ON_TITLE_DRAW:12,//标题信息绘制事件
ON_SELECT_RECT:13,//区间选择事件通知
RECV_MINUTE_DATA:14,//分时图数据到达
ON_CLICK_INDEXTITLE:15,//点击指标标题事件
RECV_KLINE_UPDATE_DATA:16,//K线日,分钟更新数据到达
ON_CLICK_DRAWPICTURE:17,//点击画图工具
ON_FINISH_DRAWPICTURE:18,//完成画图工具
ON_INDEXTITLE_DRAW:19,//指标标题重绘事件
ON_CUSTOM_VERTICAL_DRAW:20//自定义X轴绘制事件
};var JSCHART_OPERATOR_ID={OP_SCROLL_LEFT:1,OP_SCROLL_RIGHT:2,OP_ZOOM_OUT:3,//缩小
OP_ZOOM_IN:4,//放大
OP_GOTO_HOME:5//第1页数据
};var JSCHART_DRAG_ID={DISABLE_DRAG_ID:0,CLICK_TOUCH_MODE_ID:3//长按十字光标显示保留/点击十字光标消失 (使用TouchStatus)
/*
图形控件
*/};function JSChartContainer(uielement){var _this2=this;this.ClassName='JSChartContainer';var _self=this;this.Frame;//框架画法
this.ChartPaint=new Array();//图形画法
this.ChartPaintEx=[];//图形扩展画法
this.ChartInfo=new Array();//K线|走势图上信息地雷
this.ChartInfoPaint;//信息地理
this.ExtendChartPaint=new Array();//扩展画法
this.TitlePaint=new Array();//标题画法
this.OverlayChartPaint=new Array();//叠加信息画法
this.ChartDrawPicture=new Array();//画图工具
this.ChartDrawStorage;//画图工具保存
this.ChartDrawOption={IsLockScreen:false,Zoom:5};//画图工具设置 { IsLockScreen://是否锁住屏幕, Zoom: //线段|点放大倍数 }
this.CurrentChartDrawPicture=null;//当前的画图工具
this.SelectChartDrawPicture=null;//当前选中的画图
this.ChartCorssCursor;//十字光标
this.IsClickShowCorssCursor=false;//手势点击显示十字光标
this.ChartSplashPaint=null;//等待提示
this.Canvas=uielement.getContext("2d");//画布
this.UIElement=uielement;this.MouseDrag;this.DragMode=1;//拖拽模式 0 禁止拖拽 1 数据拖拽 2 区间选择 3(CLICK_TOUCH_MODE_ID)=长按十字光标显示保留/点击十字光标消失 (使用TouchStatus)
this.TouchStatus={CorssCursorShow:false},//十字光标是否显示
this.DragTimer;this.EnableScrollUpDown=false;//是否可以上下滚动图形(手机端才有)
this.CursorIndex=0;//十字光标X轴索引
this.LastPoint=new Point();//鼠标位置
this.IsForceLandscape=false;//是否强制横屏
this.CorssCursorTouchEnd=false;//手离开屏幕自动隐藏十字光标
this.StepPixel=4;//移动一个数据需要的像素
this.ZoomStepPixel=5;//放大缩小手势需要的最小像素
this.TouchMoveMinAngle=70;//左右移动最小角度
this.EnableAnimation=false;//是否开启动画
//tooltip提示信息
this.Tooltip=document.createElement("div");this.Tooltip.className='jschart-tooltip';this.Tooltip.style.background=g_JSChartResource.TooltipBGColor;this.Tooltip.style.opacity=g_JSChartResource.TooltipAlpha;this.Tooltip.id=Guid();uielement.parentNode.appendChild(this.Tooltip);this.IsShowTooltip=true;//是否显示K线tooltip
//区间选择
this.SelectRect=document.createElement("div");this.SelectRect.className="jschart-selectrect";this.SelectRect.style.background=g_JSChartResource.SelectRectBGColor;//this.SelectRect.style.opacity=g_JSChartResource.SelectRectAlpha;
this.SelectRect.id=Guid();uielement.parentNode.appendChild(this.SelectRect);//区间选择右键菜单
this.SelectRectRightMenu;//坐标轴风格方法 double-更加数值型分割 price-更加股票价格分割
this.FrameSplitData=new Map();this.FrameSplitData.set("double",new SplitData());this.FrameSplitData.set("price",new PriceSplitData());//事件回调
this.mapEvent=new Map();//通知外部调用 key:JSCHART_EVENT_ID value:{Callback:回调,}
this.IsOnTouch=false;//是否再操作数据
this.TouchDrawCount=0;//手势绘制次数
this.DisableMouse=false;//禁止鼠标事件
this.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;this.PressTime=500;this.NetworkFilter;//网络请求回调 function(data, callback);
//设置事件回调
//{event:事件id, callback:回调函数}
this.AddEventCallback=function(object){if(!object||!object.event||!object.callback)return;var data={Callback:object.callback,Source:object};this.mapEvent.set(object.event,data);};this.RemoveEventCallback=function(eventid){if(!this.mapEvent.has(eventid))return;this.mapEvent.delete(eventid);};this.GetEventCallback=function(id)//获取事件回调
{if(!this.mapEvent.has(id))return null;var item=this.mapEvent.get(id);return item;};//接收指标数据
this.GetIndexEvent=function(){return this.GetEventCallback(JSCHART_EVENT_ID.RECV_INDEX_DATA);};this.GetOverlayIndexEvent=function(){return this.GetEventCallback(JSCHART_EVENT_ID.RECV_OVERLAY_INDEX_DATA);};//鼠标事件绑定
uielement.onmousemove=function(e){_this2.UIOnMouseMove(e);};uielement.oncontextmenu=function(e){return _this2.UIOnContextMenu(e);};uielement.ondblclick=function(e){_this2.UIOnDblClick(e);};uielement.onmousedown=function(e){_this2.UIOnMouseDown(e);};this.UIOnMouseMove=function(e){//JSConsole.Chart.Log('[JSChartContainer.UIOnMouseMove] e.clientX, e.clientY, left, top ',e.clientX, e.clientY, this.getBoundingClientRect().left,this.getBoundingClientRect().top);
var pixelTatio=GetDevicePixelRatio();//鼠标移动坐标是原始坐标 需要乘以放大倍速
var x=(e.clientX-this.UIElement.getBoundingClientRect().left)*pixelTatio;var y=(e.clientY-this.UIElement.getBoundingClientRect().top)*pixelTatio;//加载数据中,禁用鼠标事件
if(this.ChartSplashPaint&&this.ChartSplashPaint.IsEnableSplash==true)return;if(this.DisableMouse==true)return;this.OnMouseMove(x,y,e);};this.UIOnContextMenu=function(e){var x=e.clientX-this.UIElement.getBoundingClientRect().left;var y=e.clientY-this.UIElement.getBoundingClientRect().top;if(typeof this.OnRightMenu=='function')this.OnRightMenu(x,y,e);//右键菜单事件
return false;};this.UIOnDblClick=function(e){var x=e.clientX-this.UIElement.getBoundingClientRect().left;var y=e.clientY-this.UIElement.getBoundingClientRect().top;this.OnDoubleClick(x,y,e);};this.UIOnMouseDown=function(e){var _this3=this;if(this.DragMode==0)return;var pixelTatio=GetDevicePixelRatio();this.IsOnTouch=true;if(this.TryClickLock){//JSConsole.Chart.Log('[uielement.onmousedown] left, top ',e.clientX, e.clientY, this.getBoundingClientRect().left,this.getBoundingClientRect().top);
var x=(e.clientX-this.UIElement.getBoundingClientRect().left)*pixelTatio;var y=(e.clientY-this.UIElement.getBoundingClientRect().top)*pixelTatio;if(this.TryClickLock(x,y))return;}this.HideSelectRect();if(this.SelectRectRightMenu)this.SelectRectRightMenu.Hide();if(this.ChartPictureMenu)this.ChartPictureMenu.Hide();var drag={"Click":{},"LastMove":{}//最后移动的位置
};drag.Click.X=e.clientX;drag.Click.Y=e.clientY;drag.LastMove.X=e.clientX;drag.LastMove.Y=e.clientY;this.MouseDrag=drag;this.SelectChartDrawPicture=null;if(this.CurrentChartDrawPicture)//画图工具模式
{var drawPicture=this.CurrentChartDrawPicture;if(drawPicture.Status==2)this.SetChartDrawPictureThirdPoint(drag.Click.X,drag.Click.Y);else{this.SetChartDrawPictureFirstPoint(drag.Click.X,drag.Click.Y);//只有1个点 直接完成
if(this.FinishChartDrawPicturePoint())this.DrawDynamicInfo();}}else//是否在画图工具上
{var drawPictrueData={};var pixelTatio=GetDevicePixelRatio();//鼠标移动坐标是原始坐标 需要乘以放大倍速
drawPictrueData.X=(e.clientX-this.UIElement.getBoundingClientRect().left)*pixelTatio;drawPictrueData.Y=(e.clientY-this.UIElement.getBoundingClientRect().top)*pixelTatio;if(this.GetChartDrawPictureByPoint(drawPictrueData)){drawPictrueData.ChartDrawPicture.Status=20;drawPictrueData.ChartDrawPicture.ValueToPoint();drawPictrueData.ChartDrawPicture.MovePointIndex=drawPictrueData.PointIndex;this.CurrentChartDrawPicture=drawPictrueData.ChartDrawPicture;this.SelectChartDrawPicture=drawPictrueData.ChartDrawPicture;this.OnSelectChartPicture(drawPictrueData.ChartDrawPicture);//选中画图工具事件
}}document.onmousemove=function(e){_this3.DocOnMouseMove(e);};document.onmouseup=function(e){_this3.DocOnMouseUp(e);};};this.DocOnMouseMove=function(e){//加载数据中,禁用鼠标事件
if(this.ChartSplashPaint&&this.IsEnableSplash==true)return;var drag=this.MouseDrag;if(!drag)return;var moveSetp=Math.abs(drag.LastMove.X-e.clientX);if(this.CurrentChartDrawPicture){var drawPicture=this.CurrentChartDrawPicture;if(drawPicture.Status==1||drawPicture.Status==2){if(Math.abs(drag.LastMove.X-e.clientX)<5&&Math.abs(drag.LastMove.Y-e.clientY)<5)return;if(this.SetChartDrawPictureSecondPoint(e.clientX,e.clientY)){this.DrawDynamicInfo();}}else if(drawPicture.Status==3){if(this.SetChartDrawPictureThirdPoint(e.clientX,e.clientY)){this.DrawDynamicInfo();}}else if(drawPicture.Status==20)//画图工具移动
{if(Math.abs(drag.LastMove.X-e.clientX)<5&&Math.abs(drag.LastMove.Y-e.clientY)<5)return;if(this.MoveChartDrawPicture(e.clientX-drag.LastMove.X,e.clientY-drag.LastMove.Y)){this.DrawDynamicInfo();}}drag.LastMove.X=e.clientX;drag.LastMove.Y=e.clientY;}else if(this.DragMode==1)//数据左右拖拽
{if(moveSetp<5)return;var isLeft=true;if(drag.LastMove.X<e.clientX)isLeft=false;//右移数据
this.UIElement.style.cursor="pointer";if(this.DataMove(moveSetp,isLeft)){this.UpdataDataoffset();this.UpdatePointByCursorIndex();this.UpdateFrameMaxMin();this.ResetFrameXYSplit();this.Draw();}else{if(this.DragDownloadData)this.DragDownloadData();}drag.LastMove.X=e.clientX;drag.LastMove.Y=e.clientY;}else if(this.DragMode==2)//区间选择
{var yMoveSetp=Math.abs(drag.LastMove.Y-e.clientY);if(moveSetp<5&&yMoveSetp<5)return;var x=drag.Click.X-uielement.getBoundingClientRect().left;var y=drag.Click.Y-uielement.getBoundingClientRect().top;var x2=e.clientX-uielement.getBoundingClientRect().left;var y2=e.clientY-uielement.getBoundingClientRect().top;this.ShowSelectRect(x,y,x2,y2);drag.LastMove.X=e.clientX;drag.LastMove.Y=e.clientY;}};this.DocOnMouseUp=function(e){//清空事件
document.onmousemove=null;document.onmouseup=null;var bClearDrawPicture=true;if(this.CurrentChartDrawPicture){var drawPicture=this.CurrentChartDrawPicture;if(drawPicture.Status==2||drawPicture.Status==1||drawPicture.Status==3){drawPicture.PointStatus=drawPicture.Status;if(this.FinishChartDrawPicturePoint())this.DrawDynamicInfo();else bClearDrawPicture=false;}else if(drawPicture.Status==20){if(this.FinishMoveChartDrawPicture())this.DrawDynamicInfo();}}else if(this.DragMode==2)//区间选择
{var drag=this.MouseDrag;var selectData=new SelectRectData();//区间起始位置 结束位子
selectData.XStart=drag.Click.X-uielement.getBoundingClientRect().left;selectData.XEnd=drag.LastMove.X-uielement.getBoundingClientRect().left;selectData.JSChartContainer=this.JSChartContainer;selectData.Stock={Symbol:this.Symbol,Name:this.Name};if(this.GetSelectRectData(selectData)){var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_SELECT_RECT);if(event&&event.Callback){var data={X:drag.LastMove.X-uielement.getBoundingClientRect().left,Y:drag.LastMove.Y-uielement.getBoundingClientRect().top,SelectData:selectData//区间选择的数据
};event.Callback(event,data,this);}if(this.SelectRectRightMenu){e.data={Chart:this,X:drag.LastMove.X-uielement.getBoundingClientRect().left,Y:drag.LastMove.Y-uielement.getBoundingClientRect().top,SelectData:selectData//区间选择的数据
};this.SelectRectRightMenu.DoModal(e);}}}//清空数据
JSConsole.Chart.Log('[KLineChartContainer::document.onmouseup]',e);this.UIElement.style.cursor="default";this.MouseDrag=null;this.IsOnTouch=false;if(bClearDrawPicture===true)this.CurrentChartDrawPicture=null;};//判断是单个手指
this.IsPhoneDragging=function(e){// JSConsole.Chart.Log(e);
var changed=e.changedTouches.length;var touching=e.touches.length;return changed==1&&touching==1;};//是否是2个手指操所
this.IsPhonePinching=function(e){var changed=e.changedTouches.length;var touching=e.touches.length;return(changed==1||changed==2)&&touching==2;};this.PreventTouchEvent=function(e){if(e.cancelable)e.preventDefault();e.stopPropagation();};this.GetToucheData=function(e,isForceLandscape){var touches=new Array();var pixelTatio=GetDevicePixelRatio();//获取设备的分辨率
for(var i=0;i<e.touches.length;++i){var item=e.touches[i];if(isForceLandscape){touches.push({clientX:item.clientY*pixelTatio,clientY:item.clientX*pixelTatio,pageX:item.pageY*pixelTatio,pageY:item.pageX*pixelTatio});}else{touches.push({clientX:item.clientX*pixelTatio,clientY:item.clientY*pixelTatio,pageX:item.pageX*pixelTatio,pageY:item.pageY*pixelTatio});}}return touches;};this.IsSingleTouch=function(e)//是否是单点触屏
{var touchCount=e.touches.length;return touchCount==1;};this.StopDragTimer=function(){if(IFrameSplitOperator.IsNumber(this.DragTimer)){clearTimeout(this.DragTimer);this.DragTimer=null;}};this.GetMoveAngle=function(pt,pt2)//计算角度
{var xMove=Math.abs(pt.X-pt2.X);var yMove=Math.abs(pt.Y-pt2.Y);var angle=Math.atan(xMove/yMove)*180/Math.PI;return angle;};//手机拖拽
uielement.ontouchstart=function(e){_this2.OnTouchStart(e);};uielement.ontouchmove=function(e){_this2.OnTouchMove(e);};uielement.ontouchend=function(e){_this2.OnTouchEnd(e);};this.OnTouchStart=function(e){this.IsOnTouch=true;this.TouchDrawCount=0;this.PhonePinch=null;this.StopDragTimer();var isSingleTouch=this.IsSingleTouch(e);if(this.EnableScrollUpDown==false||!isSingleTouch||//多点触屏
this.DragMode==JSCHART_DRAG_ID.CLICK_TOUCH_MODE_ID&