/* Copyright (c) 2018 jones http://www.apache.org/licenses/LICENSE-2.0 开源项目 https://github.com/jones2000/HQChart jones_2000@163.com 封装股票列表控件 (小程序版本) 不提供内置测试数据 */ //日志 import { JSConsole } from "./umychart.console.wechat.js" //画布DOM import { JSCanvasElement } from "./umychart.element.wechart.js"; import{ g_JSChartResource, JSCHART_LANGUAGE_ID, g_JSChartLocalization, } from './umychart.resource.wechat.js' import { IFrameSplitOperator, } from './umychart.framesplit.wechat.js' import { GetfloatPrecision, } from "./umychart.coordinatedata.wechat.js"; //图形库 import { ChartSplashPaint, GetFontHeight, } from "./umychart.chartpaint.wechat.js"; //行情数据结构体 及涉及到的行情算法(复权,周期等) import { JSCHART_EVENT_ID, PhoneDBClick, } from "./umychart.data.wechat.js"; //边框信息 function ChartBorder() { this.UIElement; //四周间距 this.Left = 50; this.Right = 80; this.Top = 50; this.Bottom = 50; this.GetChartWidth = function () { return this.UIElement.Width; } this.GetChartHeight = function () { return this.UIElement.Height; } this.GetLeft = function () { return this.Left; } this.GetRight = function () { return this.UIElement.Width - this.Right; } this.GetTop = function () { return this.Top; } this.GetBottom = function () { return this.UIElement.Height - this.Bottom; } this.GetWidth = function () { return this.UIElement.Width - this.Left - this.Right; } this.GetHeight = function () { return this.UIElement.Height - this.Top - this.Bottom; } } function JSReportChart(element) { this.CanvasElement=element; this.JSChartContainer; //表格控件 this.OnSize=function(option) { if (option) { if (IFrameSplitOperator.IsNumber(option.Width)) this.CanvasElement.Width=option.Width; if (IFrameSplitOperator.IsNumber(option.Height)) this.CanvasElement.Height=option.Height; } if (option && option.Redraw==false) return; if (this.JSChartContainer && this.JSChartContainer.OnSize) { this.JSChartContainer.OnSize(); } } this.SetOption=function(option) { var chart=this.CreateJSReportChartContainer(option); if (!chart) return false; if (option.OnCreatedCallback) option.OnCreatedCallback(chart); this.JSChartContainer=chart; if (option.Symbol) chart.Symbol=option.Symbol; if (option.Name) chart.Name=option.Name; var requestOption={ Callback:null }; if (chart.Symbol) requestOption.Callback=function() { chart.RequestMemberListData(); }; chart.RequestStockListData(requestOption); //下载码表 } this.CreateJSReportChartContainer=function(option) { var chart=new JSReportChartContainer(this.CanvasElement); chart.Create(option); if (option.NetworkFilter) chart.NetworkFilter=option.NetworkFilter; if (IFrameSplitOperator.IsNonEmptyArray(option.Column)) chart.SetColumn(option.Column); if (IFrameSplitOperator.IsNonEmptyArray(option.Tab)) chart.SetTab(option.Tab); if (IFrameSplitOperator.IsNumber(option.TabSelected)) chart.SetSelectedTab(option.TabSelected); if (option.SortInfo) { var item=option.SortInfo; if (IFrameSplitOperator.IsNumber(item.Field)) chart.SortInfo.Field=item.Field; if (IFrameSplitOperator.IsNumber(item.Sort)) chart.SortInfo.Sort=item.Sort; } this.SetChartBorder(chart, option); //是否自动更新 if (option.IsAutoUpdate!=null) chart.IsAutoUpdate=option.IsAutoUpdate; if (option.AutoUpdateFrequency>0) chart.AutoUpdateFrequency=option.AutoUpdateFrequency; if (IFrameSplitOperator.IsBool(option.EnableFilter)) chart.EnableFilter=option.EnableFilter; //注册事件 if (option.EventCallback) { for(var i=0;i { return this.GetEventCallback(id); } chart.GetStockDataCallback=(symbol)=>{ return this.GetStockData(symbol);} chart.GetBlockDataCallback=(symbol)=>{ return this.GetBlockData(symbol);} chart.Data=this.Data; chart.FixedRowData=this.FixedRowData; chart.SortInfo=this.SortInfo; this.ChartPaint[0]=chart; //页脚 if (option && option.PageInfo===true) { var pageInfoChart=new ChartReportPageInfo(); pageInfoChart.Frame=this.Frame; pageInfoChart.ChartBorder=this.Frame.ChartBorder; pageInfoChart.Canvas=this.Canvas; pageInfoChart.Report=chart; this.ChartPaint[1]=pageInfoChart; } if (option) { if (IFrameSplitOperator.IsBool(option.IsShowHeader)) chart.IsShowHeader=option.IsShowHeader; //是否显示表头 if (IFrameSplitOperator.IsNumber(option.FixedColumn)) chart.FixedColumn=option.FixedColumn; //固定列 if (IFrameSplitOperator.IsNumber(option.BorderLine)) this.Frame.BorderLine=option.BorderLine; //边框 if (IFrameSplitOperator.IsNumber(option.FixedRowCount)) chart.FixedRowCount=option.FixedRowCount; //固定行 if (IFrameSplitOperator.IsBool(option.ItemBorder)) chart.IsDrawBorder=option.ItemBorder; //单元格边框 if (IFrameSplitOperator.IsNonEmptyArray(option.FixedSymbol)) { chart.FixedRowCount=0; this.FixedRowData.Type=1; this.FixedRowData.Symbol=[]; var aryData=option.FixedSymbol; for(var i=0; i=0 && this.SortInfo.Sort>0) { var reportChart=this.GetReportChart(); if (reportChart) { var column=reportChart.Column[this.SortInfo.Field]; obj.Sort={ Column:column, Field:this.SortInfo.Field, Sort:this.SortInfo.Sort} ; } } this.NetworkFilter(obj, function(data) { self.ChartSplashPaint.EnableSplash(false); self.RecvMemberListData(data); }); if (obj.PreventDefault==true) return; //已被上层替换,不调用默认的网络请求 } throw { Name:'JSReportChartContainer::RequestMemberListData', Error:'(板块成分数据)不提供内置测试数据' }; } this.RecvMemberListData=function(recvData) { this.ClearData(); if (IFrameSplitOperator.IsNonEmptyArray(recvData.data)) { for(var i=0;i { this.UpdateStockData(); },frequency); } this.UpdateStockData=function() { if (!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; var chart=this.ChartPaint[0]; if (!chart) return; if (this.SortInfo && this.SortInfo.Field>=0 && this.SortInfo.Sort>0) { var column=chart.Column[this.SortInfo.Field]; if (column.Sort==2) { this.RequestStockSortData(column, this.SortInfo.Field, this.SortInfo.Sort); //远程排序 return; } } var arySymbol=chart.ShowSymbol; if (!IFrameSplitOperator.IsNonEmptyArray(arySymbol)) return; this.RequestStockData(arySymbol); } //下载股票数据 this.RequestStockData=function(arySymbol) { var self=this; if (this.NetworkFilter) { var obj= { Name:'JSDealChartContainer::RequestStockData', //类名::函数名 Explain:'报价列表股票数据', Request:{ Data: { stocks: arySymbol } }, Self:this, PreventDefault:false }; this.NetworkFilter(obj, function(data) { self.RecvStockData(data); self.AutoUpdate(); }); if (obj.PreventDefault==true) return; } throw { Name:'JSReportChartContainer::RequestStockData', Error:'(报价列表股票数据)不提供内置测试数据' }; } this.RecvStockData=function(data) { var setUpdateSymbol=new Set(); //更新的股票列表 if (IFrameSplitOperator.IsNonEmptyArray(data.data)) { //0=证券代码 1=股票名称 2=昨收 3=开 4=高 5=低 6=收 7=成交量 8=成交金额, 9=买价 10=买量 11=卖价 12=卖量 13=均价 14=流通股 15=总股本 for(var i=0;i0) stock.Exchange=stock.Vol/stock.OutShares*100; } if (!IFrameSplitOperator.IsNumber(item[24])) //振幅% { if (IFrameSplitOperator.IsNumber(stock.High) && IFrameSplitOperator.IsNumber(stock.Low) && IFrameSplitOperator.IsNumber(stock.YClose) && stock.YClose!=0) stock.Amplitude=(stock.High-stock.Low)/stock.YClose*100; } if (!IFrameSplitOperator.IsNumber(item[25])) //流通市值 { if (IFrameSplitOperator.IsNumber(stock.OutShares) && IFrameSplitOperator.IsNumber(stock.Price)) stock.CircMarketValue=stock.OutShares*stock.Price; } if (!IFrameSplitOperator.IsNumber(item[26])) //总市值 { if (IFrameSplitOperator.IsNumber(stock.TotalShares) && IFrameSplitOperator.IsNumber(stock.Price)) stock.MarketValue=stock.TotalShares*stock.Price; } if (item[30]) stock.ExtendData=item[30]; //30扩展数据 if (item[31]) this.BlockData.set(stock.OriginalSymbol,item[31]); //31=当前板块数据 if (item[32]) stock.CloseLine=item[32]; //32=收盘价线 } this.GetSymbolNoSuffix=function(symbol) { var index=symbol.lastIndexOf("."); if (index>0) return symbol.substring(0,index); else return symbol; } this.CancelAutoUpdate=function() //关闭停止更新 { if (this.AutoUpdateTimer) { clearTimeout(this.AutoUpdateTimer); this.AutoUpdateTimer = null; } } this.AutoUpdate=function(waitTime) //waitTime 更新时间 { this.CancelAutoUpdate(); if (!this.IsAutoUpdate) return; var self = this; var marketStatus=2; var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_REPORT_MARKET_STATUS); if (event && event.Callback) { var sendData={ MarketStatus:2 }; event.Callback(event, sendData, this); if (IFrameSplitOperator.IsNumber(sendData.MarketStatus)) marketStatus=sendData.MarketStatus; } if (marketStatus==0 || marketStatus==3) return; //闭市,盘后 var frequency=this.AutoUpdateFrequency; if (marketStatus==1) //盘前 { this.AutoUpdateTimer=setTimeout(function() { self.AutoUpdate(); },frequency); } else if (marketStatus==2) //盘中 { this.AutoUpdateTimer=setTimeout(function() { self.UpdateStockData(); },frequency); } } this.StopAutoUpdate=function() { this.CancelAutoUpdate(); this.AutoUpdateEvent(false,'JSDealChartContainer::StopAutoUpdate'); if (!this.IsAutoUpdate) return; this.IsAutoUpdate=false; } //设置事件回调 //{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.OnSize=function() { if (!this.Frame) return; this.SetSizeChange(true); this.Draw(); this.DelayUpdateStockData(); } this.SetSizeChange=function(bChanged) { for(var i=0;i0 && moveAngle0 && moveAngle>=this.TouchMoveMinAngle) { if (!this.OnDragXOffset(drag, touches,moveLeftRight, e)) return; } else { return; } drag.LastMove.X=touches[0].clientX; drag.LastMove.Y=touches[0].clientY; } } } this.OnTouchEnd=function(e) { JSConsole.Chart.Log('[JSReportChartContainer:OnTouchEnd]',e); if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return; this.ShowPageInfo(false); this.OnTouchClick(this.TouchInfo, e); this.IsOnTouch=false; this.TouchDrag=null; this.TouchInfo=null; } this.OnTouchClick=function(touchInfo, e) { if (!touchInfo || !touchInfo.Click) return false; if (touchInfo.Move) return false; var clickPoint=touchInfo.Click; var reportChart=this.GetReportChart(); if (!reportChart) return false; var clickData=reportChart.OnMouseDown(clickPoint.X,clickPoint.Y,e); if (!clickData) return false; if (clickData.Type==2 || clickData.Type==4) //点击行 { if (clickData.Redraw==true) this.Draw(); } else if (clickData.Type==3) //表头 { this.OnClickHeader(clickData, e); } JSConsole.Chart.Log('[JSReportChartContainer:OnTouchClick] clickData', clickData); } this.GetTabChart=function() { var chart=this.ChartPaint[0]; if (!chart) return null; return chart.Tab; } this.GetReportChart=function() { var chart=this.ChartPaint[0]; return chart; } this.GotoNextPage=function(bCycle) //bCycle 是否循环 { if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return false; var chart=this.ChartPaint[0]; if (!chart) return false; var pageSize=chart.GetPageSize(); if (pageSize>this.Data.Data.length) return false; if (this.Data.YOffset+pageSize>=this.Data.Data.length) { if (bCycle===true) { this.Data.YOffset=0; //循环到第1页 return true; } else { return false; } } this.Data.YOffset+=pageSize; var showDataCount=this.Data.Data.length-this.Data.YOffset; if (chart.SelectedModel==0) { if (chart.SelectedRow>showDataCount-1) chart.SelectedRow=showDataCount-1; } return true; } this.GotoPreviousPage=function(bCycle) //bCycle 是否循环 { if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return false; var chart=this.ChartPaint[0]; if (!chart) return false; var pageSize=chart.GetPageSize(); if (pageSize>this.Data.Data.length) return false; if (this.Data.YOffset<=0) { if (bCycle===true) { this.Data.YOffset=this.Data.Data.length-pageSize; //循环到最后一页 return true; } else { return false; } } var offset=this.Data.YOffset; offset-=pageSize; if (offset<0) offset=0; this.Data.YOffset=offset; return true; } this.MoveYOffset=function(setp, bCycle) //bCycle 是否循环 { if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return false; var chart=this.ChartPaint[0]; if (!chart) return false; var pageStatus=chart.GetCurrentPageStatus(); if (pageStatus.IsSinglePage) return false; if (setp>0) //向上 { var count=this.Data.Data.length; var pageSize=pageStatus.PageSize; var offset=this.Data.YOffset; if (bCycle) { for(var i=0;icount) offset=0; } } else { if (offset+pageSize>=count) return false; for(var i=0;icount) break; ++offset; } } this.Data.YOffset=offset; return true; } else if (setp<0) //向下 { setp=Math.abs(setp); var offset=this.Data.YOffset; if (bCycle) { var pageSize=pageStatus.PageSize; for(var i=0;i0) { selected+=step; selected=selected%pageSize; chart.SelectedRow=selected; chart.SelectedFixedRow=-1; result.Redraw=true; return result; } else if (step<0) { selected+=step; if (selected<0) { selected=selected%pageSize; selected=pageSize+selected; } chart.SelectedRow=selected; chart.SelectedFixedRow=-1; result.Redraw=true; return result; } } else if (chart.SelectedModel==1) //可翻页模式 { var pageStatus=chart.GetCurrentPageStatus(); var pageSize=pageStatus.PageSize; var selected=pageStatus.SelectedRow; if (step>0) { if (selected<0 || selectedpageStatus.End) { chart.SelectedRow=pageStatus.Start; result.Redraw=true; return result; } var offset=this.Data.YOffset; for(var i=0;ipageStatus.End) ++offset; if (selected>=this.Data.Data.length) { selected=0; offset=0; } } result.Redraw=true; result.Update=(offset!=this.Data.YOffset); chart.SelectedRow=selected; this.Data.YOffset=offset; return result; } else if (step<0) { if (selected<0 || selectedpageStatus.End) { chart.SelectedRow=pageStatus.End; result.Redraw=true; return result; } step=Math.abs(step); var offset=this.Data.YOffset; for(var i=0;i0) { if (this.Data.XOffset>=maxOffset) return false; for(var i=0;i=maxOffset) break; ++this.Data.XOffset; } return true; } else if (step<0) { if (this.Data.XOffset<=0) return false; step=Math.abs(step); for(var i=0;imaxOffset) pos=maxOffset; this.Data.XOffset=pos; return true; } this.GotoLastPage=function() { var chart=this.ChartPaint[0]; if (!chart) return; //显示最后一屏 var pageSize=chart.GetPageSize(true); var offset=this.Data.Data.length-pageSize; if (offset<0) offset=0; this.Data.DataOffset=offset; } this.SetColumn=function(aryColunm, option) { var chart=this.ChartPaint[0]; if (!chart) return; chart.SetColumn(aryColunm); chart.SizeChange=true; if (option && option.Redraw) this.Draw(); } this.SetTab=function(aryTab, option) { var chart=this.ChartPaint[0];; if (!chart) return; var chartTab=chart.Tab; if (!chartTab) return; chartTab.SetTabList(aryTab); if (option && option.Redraw) this.Draw(); } this.SetSelectedTab=function(index, opiton) { var chart=this.ChartPaint[0];; if (!chart) return; var chartTab=chart.Tab; if (!chartTab) return; chartTab.SelectedTabIndex=index; } this.ReloadResource=function(option) { this.Frame.ReloadResource(option); for(var i=0;i { return this.LocalSort(left, right, header.Column, sortInfo.Sort); }); } } else if (header.Column.Sort==2) //远程排序 { if (!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; this.SortInfo.Field=sortInfo.Field; this.SortInfo.Sort=sortInfo.Sort; this.Data.YOffset=0; this.ResetReportSelectStatus(); this.RequestStockSortData(header.Column, sortInfo.Field, sortInfo.Sort); //远程排序 return; } } this.Data.YOffset=0; this.ResetReportSelectStatus(); this.SortInfo.Field=sortInfo.Field; this.SortInfo.Sort=sortInfo.Sort; this.Draw(); this.DelayUpdateStockData(); } } } //点击标签 this.OnClickTab=function(tabData, e) { if (!tabData.Tab) return; var redraw=false; var pixelTatio = GetDevicePixelRatio(); var x = (e.clientX-this.UIElement.getBoundingClientRect().left)*pixelTatio; var y = (e.clientY-this.UIElement.getBoundingClientRect().top)*pixelTatio; if (tabData.Tab.IsMenu) { var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CLICK_REPORT_TABMENU); if (event && event.Callback) { redraw=true; var rtItem=tabData.Rect; var rtDOM={ Left: rtItem.Left/pixelTatio, Right:rtItem.Right/pixelTatio, Top:rtItem.Top/pixelTatio, Bottom:rtItem.Bottom/pixelTatio }; var sendData={ Data:tabData, IsSide:{X:x, Y:x}, Rect:rtDOM, e:e , Redraw:redraw }; event.Callback(event, sendData, this); if (IFrameSplitOperator.IsBool(sendData.Redraw)) redraw=sendData.Redraw; } this.SetSelectedTab(tabData.Index); //选中tab } else { var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CLICK_REPORT_TAB); if (event && event.Callback) { var sendData={ Data:tabData, IsSide:{X:x, Y:x}, e:e , Redraw:redraw }; event.Callback(event, sendData, this); if (IFrameSplitOperator.IsBool(sendData.Redraw)) redraw=sendData.Redraw; } this.SetSelectedTab(tabData.Index); } if (redraw) this.Draw(); } //本地排序 this.LocalSort=function(left, right, column, sortType) { switch(column.Type) { case REPORT_COLUMN_ID.SYMBOL_ID: case REPORT_COLUMN_ID.NAME_ID: return this.LocalStringSort(left, right, column, sortType); case REPORT_COLUMN_ID.PRICE_ID: case REPORT_COLUMN_ID.VOL_ID: case REPORT_COLUMN_ID.INCREASE_ID: case REPORT_COLUMN_ID.UPDOWN_ID: case REPORT_COLUMN_ID.BUY_PRICE_ID: case REPORT_COLUMN_ID.SELL_PRICE_ID: case REPORT_COLUMN_ID.AMOUNT_ID: case REPORT_COLUMN_ID.BUY_VOL_ID: case REPORT_COLUMN_ID.SELL_VOL_ID: case REPORT_COLUMN_ID.YCLOSE_ID: case REPORT_COLUMN_ID.OPEN_ID: case REPORT_COLUMN_ID.HIGH_ID: case REPORT_COLUMN_ID.LOW_ID: case REPORT_COLUMN_ID.AVERAGE_PRICE_ID: case REPORT_COLUMN_ID.OUTSTANDING_SHARES_ID: case REPORT_COLUMN_ID.TOTAL_SHARES_ID: case REPORT_COLUMN_ID.CIRC_MARKET_VALUE_ID: case REPORT_COLUMN_ID.MARKET_VALUE_ID: case REPORT_COLUMN_ID.EXCHANGE_RATE_ID: case REPORT_COLUMN_ID.AMPLITUDE_ID: case REPORT_COLUMN_ID.LIMIT_HIGH_ID: case REPORT_COLUMN_ID.LIMIT_LOW_ID: case REPORT_COLUMN_ID.VOL_IN_ID: case REPORT_COLUMN_ID.VOL_OUT_ID: return this.LocalNumberSort(left, right, column, sortType); case REPORT_COLUMN_ID.CUSTOM_NUMBER_TEXT_ID: //自定义数值字段 return this.LoacCustomNumberSort(left, right, column, sortType); case REPORT_COLUMN_ID.CUSTOM_STRING_TEXT_ID: //自定义字符串字段 return this.LoacCustomStringSort(left, right, column, sortType); case REPORT_COLUMN_ID.CUSTOM_DATETIME_TEXT_ID: return this.LoacCustomDateTimeSort(left, right, column, sortType); default: return 0; } } this.GetStockExtendData=function(symbol,column) { if (IFrameSplitOperator.IsNumber(column.DataIndex)) { if (column.DataIndex<0) return null; var stock=this.GetStockData(symbol); if (!stock || !stock.ExtendData) return null; return stock.ExtendData[column.DataIndex]; } if (IFrameSplitOperator.IsNumber(column.BlockIndex)) { if (column.BlockIndex<0) return null; var stock=this.GetBlockData(symbol); if (!stock) return null; return stock[column.BlockIndex]; } return null; } this.LocalStringSort=function(left, right, column, sortType) { var leftStock=this.GetStockData(left); var rightStock=this.GetStockData(right); var leftValue="", rightValue=""; if (sortType==2) { leftValue="啊啊啊啊啊"; rightValue="啊啊啊啊啊"; } var filedName=MAP_COLUMN_FIELD.get(column.Type); if (leftStock && leftStock[filedName]) leftValue=leftStock[filedName]; if (rightStock && rightStock[filedName]) rightValue=rightStock[filedName]; if (sortType==1) { if (rightValuerightValue) return 1; else return 0; } } this.LocalNumberSort=function(left, right, column, sortType) { var leftStock=this.GetStockData(left); var rightStock=this.GetStockData(right); var leftValue=-99999999999999, rightValue=-99999999999999; if (sortType==2) leftValue=rightValue=99999999999999; var filedName=MAP_COLUMN_FIELD.get(column.Type); if (leftStock && IFrameSplitOperator.IsNumber(leftStock[filedName])) leftValue=leftStock[filedName]; if (rightStock && IFrameSplitOperator.IsNumber(rightStock[filedName])) rightValue=rightStock[filedName]; if (sortType==1) { if (rightValuerightValue) return 1; else return 0; } } this.LoacCustomNumberSort=function(left, right, column, sortType) { var leftValue=-99999999999999, rightValue=-99999999999999; if (sortType==2) leftValue=rightValue=99999999999999; var value=this.GetStockExtendData(left, column); if (IFrameSplitOperator.IsNumber(value)) leftValue=value; var value=this.GetStockExtendData(right, column); if (IFrameSplitOperator.IsNumber(value)) rightValue=value; if (sortType==1) { if (rightValuerightValue) return 1; else return 0; } } this.LoacCustomDateTimeSort=function(left, right, column, sortType) { var leftValue=-99999999999999, rightValue=-99999999999999; if (sortType==2) leftValue=rightValue=99999999999999; var value=this.GetStockExtendData(left, column); if (IFrameSplitOperator.IsNumber(value)) leftValue=value; var value=this.GetStockExtendData(right, column); if (IFrameSplitOperator.IsNumber(value)) rightValue=value; if (sortType==1) { if (rightValuerightValue) return 1; else return 0; } } this.RequestStockSortData=function(column, filedid, sortType) { var chart=this.ChartPaint[0]; if (!chart) return; var self=this; var startIndex=this.Data.YOffset; var pageSize=chart.GetPageSize(); var endIndex=startIndex+pageSize; if (endIndex>=this.Data.Data.length) endIndex=this.Data.Data.length-1; if (this.NetworkFilter) { var obj= { Name:'JSDealChartContainer::RequestStockSortData', //类名::函数名 Explain:'报价列表股票排序数据', Request: { Data: { range:{ start:startIndex, end:endIndex, count:this.Data.Data.length }, column:{ name: column.Title, type: column.Type, index:filedid , ID:column.ID}, sort:sortType, symbol:this.Symbol, name:this.Name, pageSize:pageSize } }, Self:this, PreventDefault:false }; if (chart.FixedRowCount>0 && chart.FixedRowData.Type==1) { var arySymbol=[]; for(var i=0;i0) //上 { this.Canvas.moveTo(left,top); this.Canvas.lineTo(right,top); } if ((this.BorderLine&2)>0) //下 { this.Canvas.moveTo(left,bottom); this.Canvas.lineTo(right,bottom); } if ((this.BorderLine&4)>0) //左 { this.Canvas.moveTo(left,top); this.Canvas.lineTo(left,bottom); } if ((this.BorderLine&8)>0) //右 { this.Canvas.moveTo(right,top); this.Canvas.lineTo(right,bottom); } this.Canvas.stroke(); } } this.DrawLogo=function() { var text=g_JSChartResource.FrameLogo.Text; if (!IFrameSplitOperator.IsString(text)) return; this.Canvas.fillStyle=this.LogoTextColor; this.Canvas.font=this.LogoTextFont; this.Canvas.textAlign = 'right'; this.Canvas.textBaseline = 'bottom'; var x=this.ChartBorder.GetRight()-10; var y=this.ChartBorder.GetBottom()-5; this.Canvas.fillText(text,x,y); } } var REPORT_COLUMN_ID= { SYMBOL_ID:0, NAME_ID:1, PRICE_ID:2, //成交价格 VOL_ID:3, //成交量 INCREASE_ID:4, //涨幅 UPDOWN_ID:5, //涨跌 BUY_PRICE_ID:6, //买价 SELL_PRICE_ID:7, //卖价 AMOUNT_ID:8, //总金额 BUY_VOL_ID:9, //买量 SELL_VOL_ID:10, //卖量 YCLOSE_ID:11, //昨收 OPEN_ID:12, HIGH_ID:13, LOW_ID:14, AVERAGE_PRICE_ID:15,//均价 INDEX_ID:16, //序号 从1开始 OUTSTANDING_SHARES_ID:17, //流通股本 TOTAL_SHARES_ID:18, //总股本 CIRC_MARKET_VALUE_ID:19, //流通市值 MARKET_VALUE_ID:20, //总市值 EXCHANGE_RATE_ID:21, //换手率 成交量/流通股本 AMPLITUDE_ID:22, //振幅 LIMIT_HIGH_ID:23, //涨停价 LIMIT_LOW_ID:24, //跌停价 VOL_IN_ID:25, VOL_OUT_ID:26, CLOSE_LINE_ID:28, //收盘价线 SYMBOL_NAME_ID:99, CUSTOM_STRING_TEXT_ID:100, //自定义字符串文本 CUSTOM_NUMBER_TEXT_ID:101, //自定义数值型 CUSTOM_DATETIME_TEXT_ID:102 //自定义日期类型 }; var MAP_COLUMN_FIELD=new Map([ [REPORT_COLUMN_ID.SYMBOL_ID, "Symbol"], [REPORT_COLUMN_ID.NAME_ID, "Name"], [REPORT_COLUMN_ID.PRICE_ID, "Price"], [REPORT_COLUMN_ID.INCREASE_ID, "Increase"], [REPORT_COLUMN_ID.UPDOWN_ID, "UpDown"], [REPORT_COLUMN_ID.VOL_ID, "Vol"], [REPORT_COLUMN_ID.BUY_PRICE_ID, "BuyPrice"], [REPORT_COLUMN_ID.SELL_PRICE_ID, "SellPrice"], [REPORT_COLUMN_ID.AMOUNT_ID, "Amount"], [REPORT_COLUMN_ID.BUY_VOL_ID, "BuyVol"], [REPORT_COLUMN_ID.SELL_VOL_ID, "SellVol"], [REPORT_COLUMN_ID.YCLOSE_ID, "YClose"], [REPORT_COLUMN_ID.OPEN_ID, "Open"], [REPORT_COLUMN_ID.HIGH_ID, "High"], [REPORT_COLUMN_ID.LOW_ID, "Low"], [REPORT_COLUMN_ID.AVERAGE_PRICE_ID,"AvPrice"], [REPORT_COLUMN_ID.OUTSTANDING_SHARES_ID,"OutShares"], [REPORT_COLUMN_ID.TOTAL_SHARES_ID,"TotalShares"], [REPORT_COLUMN_ID.CIRC_MARKET_VALUE_ID,"CircMarketValue"], [REPORT_COLUMN_ID.MARKET_VALUE_ID,"MarketValue"], [REPORT_COLUMN_ID.EXCHANGE_RATE_ID, "Exchange"], [REPORT_COLUMN_ID.AMPLITUDE_ID, "Amplitude"], [REPORT_COLUMN_ID.LIMIT_HIGH_ID, "LimitHigh"], [REPORT_COLUMN_ID.LIMIT_LOW_ID,"LimitLow"], [REPORT_COLUMN_ID.VOL_IN_ID, "VolIn"], [REPORT_COLUMN_ID.VOL_OUT_ID,"VolOut"], ]); function ChartReport() { this.Canvas; //画布 this.ChartBorder; //边框信息 this.ChartFrame; //框架画法 this.Name; //名称 this.ClassName='ChartReport'; //类名 this.IsDrawFirst=false; this.GetEventCallback; //获取事件 this.GetStockDataCallback; //获取股票数据 this.GetBlockDataCallback; //获取当前板块的数据 this.Data; //数据 { XOffset:0, YOffset:0, Data:['600000.sh', '000001.sz'] } this.FixedRowData; //固定行 this.SortInfo; //排序信息 {Field:排序字段id, Sort:0 不排序 1升序 2降序 } this.FixedColumn=2; //固定列 this.FixedRowCount=0; //固定行 this.IsShowHeader=true; //是否显示表头 this.SizeChange=true; this.SelectedModel=0; //选中模式 0=SelectedRow表示当前屏索引 this.SelectedRow=-1; //选中行ID this.SelectedFixedRow=-1; //选中固定行ID this.IsDrawBorder=1; //是否绘制单元格边框 this.ShowSymbol=[]; //显示的股票列表 { Index:序号(排序用), Symbol:股票代码 } //涨跌颜色 this.UpColor=g_JSChartResource.Report.UpTextColor; this.DownColor=g_JSChartResource.Report.DownTextColor; this.UnchagneColor=g_JSChartResource.Report.UnchagneTextColor; this.BorderColor=g_JSChartResource.Report.BorderColor; //边框线 this.SelectedColor=g_JSChartResource.Report.SelectedColor; //选中行 //表头配置 this.HeaderFontConfig={ Size:g_JSChartResource.Report.Header.Font.Size, Name:g_JSChartResource.Report.Header.Font.Name }; this.HeaderColor=g_JSChartResource.Report.Header.Color; this.SortColor=g_JSChartResource.Report.Header.SortColor; //排序箭头颜色 this.HeaderMergin= { Left:g_JSChartResource.Report.Header.Mergin.Left, Right:g_JSChartResource.Report.Header.Mergin.Right, Top:g_JSChartResource.Report.Header.Mergin.Top, Bottom:g_JSChartResource.Report.Header.Mergin.Bottom }; //表格内容配置 this.ItemFontConfig={ Size:g_JSChartResource.Report.Item.Font.Size, Name:g_JSChartResource.Report.Item.Font.Name }; this.ItemFixedFontConfg={ Size:g_JSChartResource.Report.FixedItem.Font.Size, Name:g_JSChartResource.Report.FixedItem.Font.Name }; //固定行 this.ItemMergin= { Left:g_JSChartResource.Report.Item.Mergin.Left, Right:g_JSChartResource.Report.Item.Mergin.Right, Top:g_JSChartResource.Report.Item.Mergin.Top, Bottom:g_JSChartResource.Report.Item.Mergin.Bottom }; this.BarMergin= { Top:g_JSChartResource.Report.Item.BarMergin.Top, Left:g_JSChartResource.Report.Item.BarMergin.Left, Right:g_JSChartResource.Report.Item.BarMergin.Right, Bottom:g_JSChartResource.Report.Item.BarMergin.Bottom }; this.LimitBorderColor=g_JSChartResource.Report.LimitBorder.Color; this.LimitMergin= { Top:g_JSChartResource.Report.LimitBorder.Mergin.Top, Left:g_JSChartResource.Report.LimitBorder.Mergin.Left, Right:g_JSChartResource.Report.LimitBorder.Mergin.Right, Bottom:g_JSChartResource.Report.LimitBorder.Mergin.Bottom } //走势图 this.CloseLineConfig= { CloseColor:g_JSChartResource.Report.CloseLine.CloseColor, YCloseColor:g_JSChartResource.Report.CloseLine.YCloseColor, AreaColor:g_JSChartResource.Report.CloseLine.AreaColor } //股票代码+股票名称 this.ItemSymbolFontConfig={Size:g_JSChartResource.Report.Item.SymbolFont.Size, Name:g_JSChartResource.Report.Item.SymbolFont.Name}; this.ItemNameFontConfg={Size:g_JSChartResource.Report.Item.NameFont.Size, Name:g_JSChartResource.Report.Item.NameFont.Name}; //缓存 this.HeaderFont="12px 微软雅黑"; this.ItemFont="15px 微软雅黑"; this.ItemFixedFont="15px 微软雅黑"; this.ItemSymbolFont="12px 微软雅黑"; this.ItemNameFont="15px 微软雅黑"; this.ItemNameHeight=0; this.RowCount=0; //一屏显示行数 this.HeaderHeight=0; //表头高度 this.FixedRowHeight=0; //固定行高度 this.RowHeight=0; //行高度 this.BottomToolbarHeight=0; //底部工具条高度 this.IsShowAllColumn=false; //是否已显示所有列 this.Column= //{ Type:列id, Title:标题, TextAlign:文字对齐方式, MaxText:文字最大宽度 , TextColor:文字颜色, Sort:0=不支持排序 1=本地排序 0=远程排序 } [ { Type:REPORT_COLUMN_ID.INDEX_ID, Title:"序号", TextAlign:"center", Width:null, TextColor:g_JSChartResource.Report.FieldColor.Index, MaxText:"8888"}, { Type:REPORT_COLUMN_ID.SYMBOL_ID, Title:"代码", TextAlign:"left", Width:null, TextColor:g_JSChartResource.Report.FieldColor.Symbol, MaxText:"888888"}, { Type:REPORT_COLUMN_ID.NAME_ID, Title:"名称", TextAlign:"left", Width:null, TextColor:g_JSChartResource.Report.FieldColor.Name, MaxText:"擎擎擎擎" }, { Type:REPORT_COLUMN_ID.INCREASE_ID, Title:"涨幅%", TextAlign:"right", Width:null, MaxText:"-888.88" }, ]; this.RectClient={}; this.ReloadResource=function(resource) { this.UpColor=g_JSChartResource.Report.UpTextColor; this.DownColor=g_JSChartResource.Report.DownTextColor; this.UnchagneColor=g_JSChartResource.Report.UnchagneTextColor; this.BorderColor=g_JSChartResource.Report.BorderColor; //边框线 this.SelectedColor=g_JSChartResource.Report.SelectedColor; //选中行 //表头配置 this.HeaderFontConfig={ Size:g_JSChartResource.Report.Header.Font.Size, Name:g_JSChartResource.Report.Header.Font.Name }; this.HeaderColor=g_JSChartResource.Report.Header.Color; this.SortColor=g_JSChartResource.Report.Header.SortColor; //排序箭头颜色 this.HeaderMergin= { Left:g_JSChartResource.Report.Header.Mergin.Left, Right:g_JSChartResource.Report.Header.Mergin.Right, Top:g_JSChartResource.Report.Header.Mergin.Top, Bottom:g_JSChartResource.Report.Header.Mergin.Bottom }; //表格内容配置 this.ItemFontConfig={ Size:g_JSChartResource.Report.Item.Font.Size, Name:g_JSChartResource.Report.Item.Font.Name }; this.ItemMergin= { Left:g_JSChartResource.Report.Item.Mergin.Left, Right:g_JSChartResource.Report.Item.Mergin.Right, Top:g_JSChartResource.Report.Item.Mergin.Top, Bottom:g_JSChartResource.Report.Item.Mergin.Bottom }; this.BarMergin= { Top:g_JSChartResource.Report.Item.BarMergin.Top, Left:g_JSChartResource.Report.Item.BarMergin.Left, Right:g_JSChartResource.Report.Item.BarMergin.Right, Bottom:g_JSChartResource.Report.Item.BarMergin.Bottom }; this.LimitBorderColor=g_JSChartResource.Report.LimitBorder.Color; this.LimitMergin= { Top:g_JSChartResource.Report.LimitBorder.Mergin.Top, Left:g_JSChartResource.Report.LimitBorder.Mergin.Left, Right:g_JSChartResource.Report.LimitBorder.Mergin.Right, Bottom:g_JSChartResource.Report.LimitBorder.Mergin.Bottom } for(var i=0;i0涨,<0跌)2=(>昨收涨,<昨收跌) colItem.IsDrawCallback=false; //是否回调 if (IFrameSplitOperator.IsNumber(item.Decimal)) colItem.Decimal=item.Decimal; //小数位数 if (IFrameSplitOperator.IsNumber(item.FormatType)) colItem.FormatType=item.FormatType; //输出样式 if (IFrameSplitOperator.IsNumber(item.ColorType)) colItem.ColorType=item.ColorType; //颜色属性 if (IFrameSplitOperator.IsBool(item.IsDrawCallback)) colItem.IsDrawCallback=item.IsDrawCallback; } else if (item.Type==REPORT_COLUMN_ID.CUSTOM_DATETIME_TEXT_ID) { if (!IFrameSplitOperator.IsNumber(item.DataIndex) && !IFrameSplitOperator.IsNumber(item.BlockIndex)) continue; if (IFrameSplitOperator.IsNumber(item.DataIndex)) colItem.DataIndex=item.DataIndex; //数据在扩展数据索引列 if (IFrameSplitOperator.IsNumber(item.BlockIndex)) colItem.BlockIndex=item.BlockIndex; colItem.FormatType=0; //0=yyyy-mm-dd 1=YYYY/MM/DD colItem.ValueType=0; //0=yyyymmdd 1=hhmmss colItem.IsDrawCallback=false; //是否回调 if (IFrameSplitOperator.IsNumber(item.FormatType)) colItem.FormatType=item.FormatType; //输出样式 if (IFrameSplitOperator.IsNumber(item.ValueType)) colItem.FormatType=item.ValueType; //输出样式 if (IFrameSplitOperator.IsBool(item.IsDrawCallback)) colItem.IsDrawCallback=item.IsDrawCallback; } else if (item.Type==REPORT_COLUMN_ID.CLOSE_LINE_ID) { if (IFrameSplitOperator.IsBool(item.IsDrawArea)) colItem.IsDrawArea=item.IsDrawArea; } this.Column.push(colItem); } } this.GetDefaultColunm=function(id) { var DEFAULT_COLUMN= [ { Type:REPORT_COLUMN_ID.INDEX_ID, Title:"序号", TextAlign:"center", Width:null, TextColor:g_JSChartResource.Report.FieldColor.Index, MaxText:"8888"}, { Type:REPORT_COLUMN_ID.SYMBOL_ID, Title:"代码", TextAlign:"left", Width:null, TextColor:g_JSChartResource.Report.FieldColor.Symbol, MaxText:"888888"}, { Type:REPORT_COLUMN_ID.NAME_ID, Title:"名称", TextAlign:"left", Width:null, TextColor:g_JSChartResource.Report.FieldColor.Name, MaxText:"擎擎擎擎" }, { Type:REPORT_COLUMN_ID.SYMBOL_NAME_ID, Title:"股票名称", TextAlign:"left", Width:null, TextColor:g_JSChartResource.Report.FieldColor.Name, MaxText:"擎擎擎擎"}, { Type:REPORT_COLUMN_ID.INCREASE_ID, Title:"涨幅%", TextAlign:"right", Width:null, MaxText:"-888.88" }, { Type:REPORT_COLUMN_ID.PRICE_ID, Title:"现价", TextAlign:"right", Width:null, MaxText:"88888.88" }, { Type:REPORT_COLUMN_ID.UPDOWN_ID, Title:"涨跌", TextAlign:"right", Width:null, MaxText:"-888.88" }, { Type:REPORT_COLUMN_ID.AMPLITUDE_ID, Title:"振幅%", TextAlign:"right", Width:null, MaxText:"888.88" }, { Type:REPORT_COLUMN_ID.BUY_PRICE_ID, Title:"买价", TextAlign:"right", Width:null, MaxText:"88888.88" }, { Type:REPORT_COLUMN_ID.SELL_PRICE_ID, Title:"卖价", TextAlign:"right", Width:null, MaxText:"88888.88" }, { Type:REPORT_COLUMN_ID.AVERAGE_PRICE_ID, Title:"均价", TextAlign:"right", Width:null, MaxText:"88888.88" }, { Type:REPORT_COLUMN_ID.OPEN_ID, Title:"今开", TextAlign:"right", Width:null, MaxText:"88888.88" }, { Type:REPORT_COLUMN_ID.HIGH_ID, Title:"最高", TextAlign:"right", Width:null, MaxText:"88888.88" }, { Type:REPORT_COLUMN_ID.LOW_ID, Title:"最低", TextAlign:"right", Width:null, MaxText:"88888.88" }, { Type:REPORT_COLUMN_ID.YCLOSE_ID, Title:"昨收", TextAlign:"right", Width:null, MaxText:"88888.88" }, { Type:REPORT_COLUMN_ID.VOL_ID, Title:"总量", TextAlign:"right", TextColor:g_JSChartResource.Report.FieldColor.Vol, Width:null, MaxText:"8888.8擎" }, { Type:REPORT_COLUMN_ID.AMOUNT_ID, Title:"总金额", TextAlign:"right", TextColor:g_JSChartResource.Report.FieldColor.Amount, Width:null, MaxText:"8888.8擎" }, { Type:REPORT_COLUMN_ID.EXCHANGE_RATE_ID, Title:"换手%", TextAlign:"right", TextColor:g_JSChartResource.Report.FieldColor.Text, Width:null, MaxText:"88.88" }, { Type:REPORT_COLUMN_ID.OUTSTANDING_SHARES_ID, Title:"流通股本", TextAlign:"right", TextColor:g_JSChartResource.Report.FieldColor.Text, Width:null, MaxText:"8888.8擎" }, { Type:REPORT_COLUMN_ID.TOTAL_SHARES_ID, Title:"总股本", TextAlign:"right", TextColor:g_JSChartResource.Report.FieldColor.Text, Width:null, MaxText:"8888.8擎" }, { Type:REPORT_COLUMN_ID.CIRC_MARKET_VALUE_ID, Title:"流通市值", TextAlign:"right", TextColor:g_JSChartResource.Report.FieldColor.Text, Width:null, MaxText:"8888.8擎" }, { Type:REPORT_COLUMN_ID.MARKET_VALUE_ID, Title:"总市值", TextAlign:"right", TextColor:g_JSChartResource.Report.FieldColor.Text, Width:null, MaxText:"8888.8擎" }, { Type:REPORT_COLUMN_ID.VOL_IN_ID, Title:"内盘", TextAlign:"right", TextColor:g_JSChartResource.Report.DownTextColor, Width:null, MaxText:"8888.8擎" }, { Type:REPORT_COLUMN_ID.VOL_OUT_ID, Title:"外盘", TextAlign:"right", TextColor:g_JSChartResource.Report.UpTextColor, Width:null, MaxText:"8888.8擎" }, { Type:REPORT_COLUMN_ID.CLOSE_LINE_ID, Title:"走势", TextAlign:"center", TextColor:g_JSChartResource.Report.CloseLineColor, Width:null, MaxText:"88888.88" }, { Type:REPORT_COLUMN_ID.BUY_VOL_ID, Title:"买量", TextAlign:"right", TextColor:g_JSChartResource.Report.FieldColor.Vol, Width:null, MaxText:"8888.8擎" }, { Type:REPORT_COLUMN_ID.SELL_VOL_ID, Title:"卖量", TextAlign:"right", TextColor:g_JSChartResource.Report.FieldColor.Vol, Width:null, MaxText:"8888.8擎" }, //{ Type:REPORT_COLUMN_ID.MULTI_BAR_ID, Title:"柱子", TextAlign:"center", Width:null, TextColor:g_JSChartResource.DealList.FieldColor.BarTitle, MaxText:"888888" }, //{ Type:REPORT_COLUMN_ID.CENTER_BAR_ID, Title:"柱子2", TextAlign:"center", Width:null, TextColor:g_JSChartResource.DealList.FieldColor.BarTitle, MaxText:"888888" }, { Type:REPORT_COLUMN_ID.CUSTOM_STRING_TEXT_ID, Title:"自定义", TextAlign:"center", Width:null, TextColor:g_JSChartResource.Report.FieldColor.Text, MaxText:"擎擎擎擎擎" }, { Type:REPORT_COLUMN_ID.CUSTOM_NUMBER_TEXT_ID, Title:"自定义", TextAlign:"center", Width:null, TextColor:g_JSChartResource.Report.FieldColor.Text, MaxText:"擎擎擎擎擎" }, { Type:REPORT_COLUMN_ID.CUSTOM_DATETIME_TEXT_ID, Title:"自定义", TextAlign:"center", Width:null, TextColor:g_JSChartResource.Report.FieldColor.Text, MaxText:"9999-99-99" }, ]; for(var i=0;i0) { var bottom=this.ChartBorder.GetBottom(); this.Tab.DrawTab(this.RectClient.Left,bottom-this.BottomToolbarHeight, this.RectClient.Right, bottom) this.Tab.DrawScrollbar(this.RectClient.Left,bottom-this.BottomToolbarHeight, this.RectClient.Right, bottom); } this.DrawBorder(); this.SizeChange=false; } //更新缓存变量 this.UpdateCacheData=function() { this.RectClient.Left=this.ChartBorder.GetLeft(); this.RectClient.Right=this.ChartBorder.GetRight(); this.RectClient.Top=this.ChartBorder.GetTop(); this.RectClient.Bottom=this.ChartBorder.GetBottom()-this.BottomToolbarHeight; } this.GetPageSize=function(recalculate) //recalculate 是否重新计算 { if (recalculate) this.CalculateSize(); var size=this.RowCount; return size; } this.GetCurrentPageStatus=function() //{ Start:起始索引, End:结束索引(数据), PageSize:页面可以显示几条记录, IsEnd:是否是最后一页, IsSinglePage:是否只有一页数据} { var result={ Start:this.Data.YOffset, PageSize:this.RowCount, IsEnd:false, SelectedRow:this.SelectedRow, IsSinglePage:false, DataCount:0 }; if (IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) { result.End=this.Data.YOffset+this.RowCount-1; result.IsSinglePage=this.Data.Data.length<=this.RowCount; result.DataCount=this.Data.Data.length; if (result.End>=this.Data.Data.length-1) result.IsEnd=true; if (result.End>=this.Data.Data.length) result.End=this.Data.Data.length-1; } else { result.Star=0; result.End=0; result.IsEnd=true; result.IsSinglePage=true; } return result; } this.CalculateSize=function() //计算大小 { this.BottomToolbarHeight=0; this.UpdateCacheData(); this.HeaderFont=`${this.HeaderFontConfig.Size}px ${ this.HeaderFontConfig.Name}`; this.ItemFont=`${this.ItemFontConfig.Size}px ${ this.ItemFontConfig.Name}`; this.ItemFixedFont=`${this.ItemFixedFontConfg.Size}px ${ this.ItemFixedFontConfg.Name}`; this.ItemSymbolFont=`${this.ItemSymbolFontConfig.Size}px ${ this.ItemSymbolFontConfig.Name}`; this.ItemNameFont=`${this.ItemNameFontConfg.Size}px ${ this.ItemNameFontConfg.Name}`; this.RowHeight=this.GetFontHeight(this.ItemFont,"擎")+ this.ItemMergin.Top+ this.ItemMergin.Bottom; this.FixedRowHeight=this.GetFontHeight(this.ItemFixedFont,"擎")+ this.ItemMergin.Top+ this.ItemMergin.Bottom; this.Canvas.font=this.ItemFont; var itemWidth=0; for(var i=0;ithis.RowHeight) this.RowHeight=rowHeight; if (rowHeight>this.FixedRowHeight) this.FixedRowHeight=rowHeight; } else { itemWidth=this.Canvas.measureText(item.MaxText).width; item.Width=itemWidth+4+this.ItemMergin.Left+this.ItemMergin.Right; } } this.Canvas.font=this.HeaderFont; for(var i=0;i0) text+="↓"; itemWidth=this.Canvas.measureText(text).width; itemWidth+=(4+this.HeaderMergin.Left+this.HeaderMergin.Right); if (item.Width0) { this.DrawSortHeader(item.Title,item.TextAlign,x,y,textWidth,this.SortInfo.Sort); } else { this.DrawText(item.Title,item.TextAlign,x,y,textWidth); } textLeft+=item.Width; } for(var i=this.FixedColumn+this.Data.XOffset;i0) { this.DrawSortHeader(item.Title,item.TextAlign,x,y,textWidth,this.SortInfo.Sort); } else { this.DrawText(item.Title,item.TextAlign,x,y,textWidth); } textLeft+=item.Width; } } this.DrawText=function(text, textAlign, x, y, textWidth) { if (textAlign=='center') { x=x+textWidth/2; this.Canvas.textAlign="center"; } else if (textAlign=='right') { x=x+textWidth; this.Canvas.textAlign="right"; } else { this.Canvas.textAlign="left"; } this.Canvas.textBaseline="middle"; this.Canvas.fillText(text,x,y); } this.DrawSortHeader=function(text, textAlign, x, y, width, sortType) { var sortText=sortType==1?"↓":"↑"; var sortTextWidth=this.Canvas.measureText(sortText).width; var textWidth=this.Canvas.measureText(text).width+2; this.Canvas.textBaseline="middle"; this.Canvas.textAlign="left"; if (textAlign=='center') { x=x+width/2-(sortTextWidth+textWidth)/2; } else if (textAlign=='right') { x=(x+width)-sortTextWidth-textWidth; } else { } this.Canvas.fillText(text,x,y); this.Canvas.fillStyle=this.SortColor; this.Canvas.fillText(sortText,x+textWidth,y); this.Canvas.fillStyle=this.HeaderColor; } this.DrawBorder=function() { if (!this.IsDrawBorder) return; var left=this.RectClient.Left; var right=this.RectClient.Right; var top=this.RectClient.Top; var bottom=this.RectClient.Bottom; this.Canvas.strokeStyle=this.BorderColor; this.Canvas.beginPath(); this.Canvas.moveTo(left,ToFixedPoint(top+this.HeaderHeight)); this.Canvas.lineTo(right,ToFixedPoint(top+this.HeaderHeight)); var rowTop=top+this.HeaderHeight+this.RowHeight; var rotBottom=rowTop; for(var i=0;i=chartRight) break; } for(var i=this.FixedColumn+this.Data.XOffset;i=chartRight) break; } } this.DrawFixedItem=function(dataIndex, colIndex, column, left, top) { var x=left+this.ItemMergin.Left; var textWidth=column.Width-this.ItemMergin.Left-this.ItemMergin.Right; var drawInfo={ Text:null, TextColor:column.TextColor , TextAlign:column.TextAlign }; if (this.GetFixedRowTextDrawInfo(dataIndex, colIndex, column, drawInfo)) { this.DrawItemText(drawInfo.Text, drawInfo.TextColor, drawInfo.TextAlign, x, top, textWidth); return; } if (!this.FixedRowData || !IFrameSplitOperator.IsNonEmptyArray(this.FixedRowData.Data)) return; var data=this.FixedRowData.Data; var rowData=data[dataIndex]; if (!IFrameSplitOperator.IsNonEmptyArray(rowData)) return; var itemData=rowData[colIndex]; if (!itemData || !itemData.Text) return; drawInfo.Text=itemData.Text; if (itemData.Color) drawInfo.TextColor=itemData.Color; if (itemData.TextAlign) drawInfo.TextAlign=itemData.TextAlign; this.DrawItemText(drawInfo.Text, drawInfo.TextColor, drawInfo.TextAlign, x, top, textWidth); } this.DrawRow=function(symbol, top, dataIndex, rowType) //rowType 0=表格行 1=顶部固定行 { var left=this.RectClient.Left; var chartRight=this.RectClient.Right; var data= { Symbol:symbol , Stock:null }; if (this.GetStockDataCallback) data.Stock=this.GetStockDataCallback(symbol); if (this.GetBlockDataCallback) data.Block=this.GetBlockDataCallback(symbol); data.Decimal=GetfloatPrecision(symbol); //小数位数 for(var i=0;i=chartRight) break; } for(var i=this.FixedColumn+this.Data.XOffset;i=chartRight) break; } } this.DrawItem=function(index, data, column, left, top, rowType) { var itemWidth=column.Width; var x=left+this.ItemMergin.Left; var textWidth=column.Width-this.ItemMergin.Left-this.ItemMergin.Right; var stock=data.Stock; var drawInfo={ Text:null, TextColor:column.TextColor , TextAlign:column.TextAlign }; if (column.Type==REPORT_COLUMN_ID.INDEX_ID) { if (rowType==1) return; //固定行序号空 drawInfo.Text=(index+1).toString(); } else if (column.Type==REPORT_COLUMN_ID.SYMBOL_ID) { if (stock && stock.Symbol) drawInfo.Text=stock.Symbol; else drawInfo.Text=data.Symbol; } else if (column.Type==REPORT_COLUMN_ID.SYMBOL_NAME_ID) { this.DrawSymbolName(data, column, left, top, rowType); } else if (column.Type==REPORT_COLUMN_ID.NAME_ID) { if (stock && stock.Name) { drawInfo.Text=this.TextEllipsis(stock.Name, textWidth, column.MaxText); drawInfo.TextColor=this.GetNameColor(column,data.Symbol, rowType); } } else if (column.Type==REPORT_COLUMN_ID.PRICE_ID) { if (stock) this.GetPriceDrawInfo(stock.Price, stock, data, drawInfo); } else if (column.Type==REPORT_COLUMN_ID.OPEN_ID) { //如果行情开盘价为涨停价或跌停价,则对内容加灰框 if (stock) { this.DrawLimitPriceBorder(stock.Open, stock, left, top, column.Width); this.GetPriceDrawInfo(stock.Open, stock, data, drawInfo); } } else if (column.Type==REPORT_COLUMN_ID.HIGH_ID) { //如果行情最高价为涨停价,则对内容加灰框 if (stock) { this.DrawLimitPriceBorder(stock.High, stock, left, top, column.Width); this.GetPriceDrawInfo(stock.High, stock, data, drawInfo); } } else if (column.Type==REPORT_COLUMN_ID.LOW_ID) { //如果行情最低价为跌停价,则对内容加灰框 if (stock) { this.DrawLimitPriceBorder(stock.Low, stock, left, top, column.Width); this.GetPriceDrawInfo(stock.Low, stock, data, drawInfo); } } else if (column.Type==REPORT_COLUMN_ID.YCLOSE_ID) { if (stock) this.GetPriceDrawInfo(stock.YClose, stock, data, drawInfo); } else if (column.Type==REPORT_COLUMN_ID.BUY_PRICE_ID) { if (stock) this.GetPriceDrawInfo(stock.BuyPrice, stock, data, drawInfo); } else if (column.Type==REPORT_COLUMN_ID.SELL_PRICE_ID) { if (stock) this.GetPriceDrawInfo(stock.SellPrice, stock, data, drawInfo); } else if (column.Type==REPORT_COLUMN_ID.AVERAGE_PRICE_ID) { if (stock) this.GetPriceDrawInfo(stock.AvPrice, stock, data, drawInfo); } else if (column.Type==REPORT_COLUMN_ID.EXCHANGE_RATE_ID) { if (stock && IFrameSplitOperator.IsNumber(stock.Exchange)) drawInfo.Text=stock.Exchange.toFixed(2); } else if (column.Type==REPORT_COLUMN_ID.BUY_VOL_ID) { if (stock && IFrameSplitOperator.IsNumber(stock.BuyVol)) drawInfo.Text=this.FormatVolString(stock.BuyVol); } else if (column.Type==REPORT_COLUMN_ID.SELL_VOL_ID) { if (stock && IFrameSplitOperator.IsNumber(stock.SellVol)) drawInfo.Text=this.FormatVolString(stock.SellVol); } else if (column.Type==REPORT_COLUMN_ID.VOL_ID) { if (stock && IFrameSplitOperator.IsNumber(stock.Vol)) drawInfo.Text=this.FormatVolString(stock.Vol); } else if (column.Type==REPORT_COLUMN_ID.VOL_IN_ID) { if (stock && IFrameSplitOperator.IsNumber(stock.VolIn)) drawInfo.Text=this.FormatVolString(stock.VolIn); } else if (column.Type==REPORT_COLUMN_ID.VOL_OUT_ID) { if (stock && IFrameSplitOperator.IsNumber(stock.VolOut)) drawInfo.Text=this.FormatVolString(stock.VolOut); } else if (column.Type==REPORT_COLUMN_ID.TOTAL_SHARES_ID) { if (stock && IFrameSplitOperator.IsNumber(stock.TotalShares)) drawInfo.Text=this.FormatVolString(stock.TotalShares); } else if (column.Type==REPORT_COLUMN_ID.OUTSTANDING_SHARES_ID) { if (stock && IFrameSplitOperator.IsNumber(stock.OutShares)) drawInfo.Text=this.FormatVolString(stock.OutShares); } else if (column.Type==REPORT_COLUMN_ID.CIRC_MARKET_VALUE_ID || column.Type==REPORT_COLUMN_ID.MARKET_VALUE_ID || column.Type==REPORT_COLUMN_ID.AMOUNT_ID) { var fieldName=MAP_COLUMN_FIELD.get(column.Type); if (stock && IFrameSplitOperator.IsNumber(stock[fieldName])) drawInfo.Text=this.FormatVolString(stock[fieldName]); } else if (column.Type==REPORT_COLUMN_ID.INCREASE_ID || column.Type==REPORT_COLUMN_ID.AMPLITUDE_ID || column.Type==REPORT_COLUMN_ID.UPDOWN_ID) { var fieldName=MAP_COLUMN_FIELD.get(column.Type); if (stock && IFrameSplitOperator.IsNumber(stock[fieldName])) { var value=stock[fieldName]; drawInfo.Text=value.toFixed(2); drawInfo.TextColor=this.GetUpDownColor(value,0); } } else if (column.Type==REPORT_COLUMN_ID.CUSTOM_STRING_TEXT_ID) { this.GetCustomStringDrawInfo(data, column, drawInfo); } else if (column.Type==REPORT_COLUMN_ID.CUSTOM_NUMBER_TEXT_ID) { this.GetCustomNumberDrawInfo(data, column, drawInfo); } else if (column.Type==REPORT_COLUMN_ID.CUSTOM_DATETIME_TEXT_ID) { this.GetCustomDateTimeDrawInfo(data, column, drawInfo); } else if (column.Type==REPORT_COLUMN_ID.CLOSE_LINE_ID) { var rtItem={ Left:left, Top:top, Width:column.Width, Height:this.RowHeight }; rtItem.Right=rtItem.Left+rtItem.Width; rtItem.Bottom=rtItem.Top+rtItem.Height; if (stock) this.DrawLine(stock.CloseLine, column, rtItem); } this.DrawItemText(drawInfo.Text, drawInfo.TextColor, drawInfo.TextAlign, x, top, textWidth); } this.DrawSymbolName=function(data, column, left, top, rowType) { var stock=data.Stock; var symbol=data.Symbol; var name; if (stock) { symbol=stock.Symbol; name=stock.Name; } if (!symbol && !name) return; var y=top+this.ItemMergin.Top+this.ItemNameHeight; var textLeft=left+this.ItemMergin.Left; var x=textLeft; var width=column.Width-this.ItemMergin.Left-this.ItemMergin.Right; var textAlign=column.TextAlign; if (textAlign=='center') { x=textLeft+width/2; this.Canvas.textAlign="center"; } else if (textAlign=='right') { x=textLeft+width-2; this.Canvas.textAlign="right"; } else { x+=2; this.Canvas.textAlign="left"; } var textColor=this.GetNameColor(column,symbol,rowType); var text=name; if (text) { this.Canvas.textBaseline="ideographic"; this.Canvas.fillStyle=textColor; this.Canvas.font=this.ItemNameFont; text=this.TextEllipsis(text, width, column.MaxText); if (text) this.Canvas.fillText(text,x,y); } text=symbol; if (text) { this.Canvas.textBaseline="top"; this.Canvas.font=this.ItemSymbolFont; this.Canvas.fillStyle=textColor; this.Canvas.fillText(text,x,y); } this.Canvas.font=this.ItemFont; //还原字体 } this.DrawLimitPriceBorder=function(value, stock, left, top, itemWidth) { if (!IFrameSplitOperator.IsNumber(value) || !stock) return; var bDraw=false; if (IFrameSplitOperator.IsNumber(stock.LimitHigh)) { if (value>=stock.LimitHigh) bDraw=true; } if (IFrameSplitOperator.IsNumber(stock.LimitLow)) { if (value<=stock.LimitLow) bDraw=true; } if (!bDraw) return; var x=left+this.ItemMergin.Left+this.LimitMergin.Left; var width=itemWidth-this.ItemMergin.Left-this.ItemMergin.Right-this.LimitMergin.Left-this.LimitMergin.Right; var y=top+this.ItemMergin.Top+this.LimitMergin.Top; var height=this.RowHeight-this.ItemMergin.Top-this.ItemMergin.Bottom-this.LimitMergin.Top-this.LimitMergin.Bottom; this.Canvas.strokeStyle=this.LimitBorderColor; this.Canvas.strokeRect(ToFixedPoint(x),ToFixedPoint(y),ToFixedRect(width),ToFixedRect(height)); } this.GetExtendData=function(data, column) { if (IFrameSplitOperator.IsNumber(column.DataIndex)) { if (!data.Stock || !data.Stock.ExtendData) return null; if (column.DataIndex<0) return; return data.Stock.ExtendData[column.DataIndex]; } if (IFrameSplitOperator.IsNumber(column.BlockIndex)) { if (!data.Block) return; if (column.BlockIndex<0) return; return data.Block[column.BlockIndex]; } return null; } this.GetCustomStringDrawInfo=function(data, column, drawInfo) { var value=this.GetExtendData(data, column); if (!IFrameSplitOperator.IsString(value)) return; if (column.IsDrawCallback) //外部处理输出格式 { this.GetCustomTextDrawInfo(column, data.Symbol, value, drawInfo, data); return; } drawInfo.Text=value; } this.GetCustomNumberDrawInfo=function(data, column, drawInfo) { var value=this.GetExtendData(data, column); if (!IFrameSplitOperator.IsNumber(value)) return; if (column.IsDrawCallback) //外部处理输出格式 { this.GetCustomTextDrawInfo(column, data.Symbol, value, drawInfo,data); return; } //格式化输出 switch(column.FormatType) { case 1: drawInfo.Text=value.toFixed(column.Decimal); break; case 2: drawInfo.Text=IFrameSplitOperator.FormatValueThousandsString(value, column.Decimal); break; case 3: drawInfo.Text=this.FormatVolString(value); break; default: drawInfo.Text=IFrameSplitOperator.FormatValueString(value, column.Decimal); break; } //颜色 switch(column.ColorType) { case 1: drawInfo.TextColor=this.GetUpDownColor(value,0); break; case 2: if (!IFrameSplitOperator.IsNumber(data.Stock.YClose)) drawInfo.TextColor=this.UnchagneColor; else drawInfo.TextColor=this.GetUpDownColor(value, data.Stock.YClose); break; default: break; } } this.GetCustomDateTimeDrawInfo=function(data, column, drawInfo) { var value=this.GetExtendData(data, column); if (!IFrameSplitOperator.IsNumber(value)) return; if (column.IsDrawCallback) //外部处理输出格式 { this.GetCustomTextDrawInfo(column, data.Symbol, value, drawInfo, data); return; } if (column.ValueType==0) { if (column.FormatType==1) drawInfo.Text=IFrameSplitOperator.FormatDateString(value,"YYYY/MM/DD"); else drawInfo.Text=IFrameSplitOperator.FormatDateString(value); } } this.GetPriceDrawInfo=function(price, stock, data, drawInfo) { if (!IFrameSplitOperator.IsNumber(price)) return false; drawInfo.Text=price.toFixed(data.Decimal); if (!IFrameSplitOperator.IsNumber(stock.YClose)) drawInfo.TextColor=this.UnchagneColor; else drawInfo.TextColor=this.GetUpDownColor(price, stock.YClose); } this.GetUpDownColor=function(price, price2) { if (price>price2) return this.UpColor; else if (pricemaxWidth) { newText+="..."; break; } newText+=text[i]; } return newText; } this.DrawMultiBar=function(colunmInfo, data, rtItem) { if (!data.Source || !IFrameSplitOperator.IsNonEmptyArray(data.Source)) return false; var barData=data.Source[colunmInfo.DataIndex]; //{ Value:[0.4,0,2], Color:[0,1] }; if (!barData) return false; if (!IFrameSplitOperator.IsNonEmptyArray(barData.Value)) return false; var width=rtItem.Width-this.BarMergin.Left-this.BarMergin.Right; var left=rtItem.Left+this.BarMergin.Left; var top=rtItem.Top+this.RowMergin.Top+this.BarMergin.Top; var height=rtItem.Height-this.RowMergin.Top-this.RowMergin.Bottom-this.BarMergin.Top-this.BarMergin.Bottom; var right=left+width; for(var i=0;i=right) break; var barWidth=width*value; if (barWidth<1) barWidth=1; if (left+barWidth>right) barWidth=right-left; var colorIndex=i; if (IFrameSplitOperator.IsNonEmptyArray(barData.Color) && i1) value=1; var barWidth=width*value; if (barWidth<1) barWidth=1; var colorIndex=i; if (IFrameSplitOperator.IsNonEmptyArray(barData.Color) && i=count) { return right; } else { var offset=left+width*index/count; return offset; } } var Temp_GetYFromData=function(value) { if(value<=lineData.Min) return bottom; if(value>=lineData.Max) return top; var value=height*(value-lineData.Min)/(lineData.Max-lineData.Min); return bottom-value; } this.Canvas.save(); var yCenter=null; if (IFrameSplitOperator.IsNumber(lineData.YClose)) { var y=Temp_GetYFromData(lineData.YClose); y=ToFixedPoint(y); yCenter=y; this.Canvas.setLineDash([2,2]); this.Canvas.strokeStyle=this.CloseLineConfig.YCloseColor; this.Canvas.beginPath(); this.Canvas.moveTo(left,y); this.Canvas.lineTo(right,y); this.Canvas.stroke(); this.Canvas.setLineDash([]); } if (lineData.Color) this.Canvas.strokeStyle=lineData.Color; else this.Canvas.strokeStyle=column.TextColor; var bFirstPoint=true; var ptFirst={}; //第1个点 var drawCount=0, x,y; for(var i=0; i0) { this.Canvas.stroke(); if (column.IsDrawArea && IFrameSplitOperator.IsNumber(yCenter)) { this.Canvas.lineTo(x,yCenter); this.Canvas.lineTo(ptFirst.X,yCenter); this.Canvas.closePath(); this.SetFillStyle(this.CloseLineConfig.AreaColor,left,top, left,bottom); this.Canvas.fill(); } } this.Canvas.restore(); } this.SetFillStyle=function(color, x0, y0, x1, y1) { if (Array.isArray(color)) { let gradient = this.Canvas.createLinearGradient(x0, y0, x1, y1); var offset=1/(color.length); for(var i in color) { gradient.addColorStop(i*offset, color[i]); } this.Canvas.fillStyle=gradient; } else { this.Canvas.fillStyle=color; } } //外部配置显示格式 颜色 对齐方式 this.GetCustomTextDrawInfo=function(columnInfo, symbol, value, drawInfo,data) { var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_DRAW_CUSTOM_TEXT); if (!event || !event.Callback) return false; var sendData= { Symbol:symbol, Column:columnInfo, Value:value, Data:data, Out:{ Text:null, TextColor:null, TextAlign:null } }; event.Callback(event,sendData,this); if (sendData.Out.Text) drawInfo.Text=sendData.Out.Text; if (sendData.Out.TextColor) drawInfo.TextColor=sendData.Out.TextColor; if (sendData.Out.TextAlign) drawInfo.TextAlign=sendData.Out.TextAlign; return true; } this.GetFixedRowTextDrawInfo=function(rowIndex, colIndex, columnInfo, drawInfo) { var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_DRAW_REPORT_FIXEDROW_TEXT); if (!event || !event.Callback) return false; var sendData= { RowIndex:rowIndex, ColIndex:colIndex, Column:columnInfo, Data:this.FixedRowData, Out:{ Text:null, TextColor:null, TextAlign:null } }; event.Callback(event,sendData,this); if (sendData.Out.Text) drawInfo.Text=sendData.Out.Text; if (sendData.Out.TextColor) drawInfo.TextColor=sendData.Out.TextColor; if (sendData.Out.TextAlign) drawInfo.TextAlign=sendData.Out.TextAlign; return true; } this.GetVolColor=function(colunmInfo, data) { var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_DRAW_DEAL_VOL_COLOR); if (event && event.Callback) { var sendData={ Data:data, TextColor:null }; event.Callback(event,sendData,this); if (sendData.TextColor) return sendData.TextColor; } return colunmInfo.TextColor; } //获取股票名称颜色 this.GetNameColor=function(colunmInfo, symbol, rowType) { var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_DRAW_REPORT_NAME_COLOR); if (event && event.Callback) { var sendData={ Symbol:symbol, TextColor:null, RowType:rowType }; event.Callback(event,sendData,this); if (sendData.TextColor) return sendData.TextColor; } return colunmInfo.TextColor; } this.GetFontHeight=function(font,word) { return GetFontHeight(this.Canvas, font, word); } this.OnMouseDown=function(x,y,e) { if (!this.Data) return null; if (this.Tab) { var tab=this.Tab.OnMouseDown(x,y,e); if (tab) return { Type:1, Tab: tab }; //顶部工具栏 } var row=this.PtInFixedBody(x,y) if (row) { var bRedraw=true; var eventID=JSCHART_EVENT_ID.ON_CLICK_REPORT_FIXEDROW; if (e.button==2) eventID=JSCHART_EVENT_ID.ON_RCLICK_REPORT_FIXEDROW; this.SendClickEvent(eventID, { Data:row, X:x, Y:y, e:e }); this.SelectedFixedRow=row.Index; this.SelectedRow=-1; return { Type:4, Redraw:bRedraw, Row:row }; //行 } var row=this.PtInBody(x,y); if (row) { var bRedraw=true; if (this.SelectedModel==0) { if (this.SelectedRow==row.Index) bRedraw=false; this.SelectedRow=row.Index; this.SelectedFixedRow=-1; } else { if (this.SelectedRow==row.DataIndex) bRedraw=false; this.SelectedRow=row.DataIndex; this.SelectedFixedRow=-1; } var eventID=JSCHART_EVENT_ID.ON_CLICK_REPORT_ROW; if (e.button==2) eventID=JSCHART_EVENT_ID.ON_RCLICK_REPORT_ROW; this.SendClickEvent(eventID, { Data:row, X:x, Y:y, e:e }); return { Type:2, Redraw:bRedraw, Row:row }; //行 } var header=this.PtInHeader(x,y); if (header) { var eventID=JSCHART_EVENT_ID.ON_CLICK_REPORT_HEADER; if (e.button==2) { eventID=JSCHART_EVENT_ID.ON_RCLICK_REPORT_HEADER; } else if (e.button==0) { eventID=JSCHART_EVENT_ID.ON_CLICK_REPORT_HEADER; } this.SendClickEvent(eventID, { Data:row, X:x, Y:y , e:e }); return { Type:3, Redraw:bRedraw, Header:header }; //表头 } return null; } this.OnDblClick=function(x,y,e) { if (!this.Data) return false; var row=this.PtInBody(x,y); if (row) { this.SendClickEvent(JSCHART_EVENT_ID.ON_DBCLICK_REPORT_ROW, { Data:row, X:x, Y:y }); return true; } return false; } this.PtInBody=function(x,y) { if (!this.Data) return null; if (!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return null; var top=this.RectClient.Top+this.HeaderHeight; var left=this.RectClient.Left; var right=this.RectClient.Right; var rowWidth=this.RectClient.Right-this.RectClient.Left; var textTop=top+this.FixedRowHeight*this.FixedRowCount; for(var i=this.Data.YOffset, j=0; i=rtRow.Left && x<=rtRow.Right && y>=rtRow.Top && y<=rtRow.Bottom) { var data={ Rect:rtRow, DataIndex:i, Index:j , Symbol:symbol }; data.Item=this.PtInItem(x,y, rtRow.Top, rtRow.Bottom); return data; } textTop+=this.RowHeight; } return null; } this.PtInFixedBody=function(x,y) { if (this.FixedRowCount<=0) return null; var top=this.RectClient.Top+this.HeaderHeight; var left=this.RectClient.Left; var right=this.RectClient.Right; var rowWidth=this.RectClient.Right-this.RectClient.Left; var textTop=top; for(var i=0; i=rtRow.Left && x<=rtRow.Right && y>=rtRow.Top && y<=rtRow.Bottom) { var data={ Rect:rtRow, Index:i}; data.Item=this.PtInItem(x,y, rtRow.Top, rtRow.Bottom); return data; } textTop+=this.FixedRowHeight; } return null; } this.PtInItem=function(x,y, top, bottom) { var left=this.RectClient.Left; var right=this.RectClient.Right; var textLeft=left; //固定列 for(var i=0;i=header.Left && x<=header.Right && y>=header.Top && y<=header.Bottom) { return { Rect:header, Column:item, Index:i }; } textLeft+=item.Width; } for(var i=this.FixedColumn+this.Data.XOffset;i=right) break; var header={Left:textLeft, Right:textLeft+item.Width, Top:top, Bottom:bottom }; if (x>=header.Left && x<=header.Right && y>=header.Top && y<=header.Bottom) { return { Rect:header, Column:item, Index:i }; } textLeft+=item.Width; } return null; } this.PtInHeader=function(x,y) { if (!this.IsShowHeader) return null; var left=this.RectClient.Left; var right=this.RectClient.Right; var top=this.RectClient.Top; var bottom=top+this.HeaderHeight; if (!(x>=left && x<=right && y>=top && y<=bottom)) return null; return this.PtInItem(x,y,top,bottom); } this.IsPtInBody=function(x,y) { var top=this.RectClient.Top+this.HeaderHeight; var left=this.RectClient.Left; var right=this.RectClient.Right; var bottom=this.RectClient.Bottom; if (x>=left && x<=right && y>=top && y<=bottom) return true; return false; } this.IsPtInHeader=function(x,y) { if (!this.IsShowHeader) return false; var left=this.RectClient.Left; var right=this.RectClient.Right; var top=this.RectClient.Top; var bottom=top+this.HeaderHeight; if (x>=left && x<=right && y>=top && y<=bottom) return true; return false; } this.SendClickEvent=function(id, data) { var event=this.GetEventCallback(id); if (event && event.Callback) { event.Callback(event,data,this); } } this.GetXScrollPos=function() { return this.Data.XOffset; } this.GetXScrollRange=function() { var maxOffset=this.Column.length-this.FixedColumn-3; if (maxOffset<0) return 0; return maxOffset; } } //页脚信息 function ChartReportPageInfo() { this.Canvas; //画布 this.ChartBorder; //边框信息 this.ChartFrame; //框架画法 this.Name; //名称 this.ClassName='ChartPageInfo'; //类名 this.IsDrawFirst=false; this.IsShow=false; //是否显示 this.SizeChange=true; this.Report; this.FontConfig={ Size:g_JSChartResource.Report.PageInfo.Font.Size, Name:g_JSChartResource.Report.PageInfo.Font.Name }; this.TextColor=g_JSChartResource.Report.PageInfo.TextColor; this.BGColor=g_JSChartResource.Report.PageInfo.BGColor; this.Mergin= { Top:g_JSChartResource.Report.PageInfo.Mergin.Top, Left:g_JSChartResource.Report.PageInfo.Mergin.Left, Right:g_JSChartResource.Report.PageInfo.Mergin.Right, Bottom:g_JSChartResource.Report.PageInfo.Mergin.Bottom } this.Font; this.TextHeight=0; this.ReloadResource=function(resource) { this.FontConfig={ Size:g_JSChartResource.Report.PageInfo.Font.Size, Name:g_JSChartResource.Report.PageInfo.Font.Name }; this.TextColor=g_JSChartResource.Report.PageInfo.TextColor; this.BGColor=g_JSChartResource.Report.PageInfo.BGColor; this.Mergin= { Top:g_JSChartResource.Report.PageInfo.Mergin.Top, Left:g_JSChartResource.Report.PageInfo.Mergin.Left, Right:g_JSChartResource.Report.PageInfo.Mergin.Right, Bottom:g_JSChartResource.Report.PageInfo.Mergin.Bottom } } this.Draw=function() { if (!this.IsShow) return; if (!this.Report) return; var pageStatus=this.Report.GetCurrentPageStatus(); if (pageStatus.IsSinglePage) return; if (this.SizeChange) { this.Font=`${this.FontConfig.Size}px ${ this.FontConfig.Name}`; this.TextHeight=GetFontHeight(this.Canvas, this.Font, "擎")+this.Mergin.Top+this.Mergin.Bottom; } var left=this.ChartBorder.GetLeft(); var right=this.ChartBorder.GetRight(); var bottom=this.ChartBorder.GetBottom()-2; var center=left+(right-left)/2; var text=`${pageStatus.DataCount}/${pageStatus.DataCount}`; this.Canvas.font=this.Font; var textWidth=this.Canvas.measureText(text).width+4; var bgLeft=center-textWidth/2-this.Mergin.Left; var bgTop=bottom-this.TextHeight; this.Canvas.fillStyle=this.BGColor;; this.Canvas.fillRect(bgLeft,bgTop,textWidth+(this.Mergin.Left+this.Mergin.Right),this.TextHeight); text=`${pageStatus.Start+1}/${pageStatus.DataCount}`; this.Canvas.textAlign="center"; this.Canvas.textBaseline="bottom"; this.Canvas.fillStyle=this.TextColor; this.Canvas.fillText(text,center,bottom-this.Mergin.Bottom); this.SizeChange=false; } } //导出统一使用JSCommon命名空间名 var JSReport= { JSCanvasElement:JSCanvasElement, JSReportChart: JSReportChart, IFrameSplitOperator: IFrameSplitOperator, JSCHART_EVENT_ID:JSCHART_EVENT_ID, REPORT_COLUMN_ID:REPORT_COLUMN_ID, }; export { JSReport, JSCanvasElement, JSReportChart, IFrameSplitOperator, JSCHART_EVENT_ID, REPORT_COLUMN_ID, } /* module.exports = { JSReport: { JSCanvasElement:JSCanvasElement, JSReportChart: JSReportChart, IFrameSplitOperator: IFrameSplitOperator, JSCHART_EVENT_ID:JSCHART_EVENT_ID, REPORT_COLUMN_ID:REPORT_COLUMN_ID, }, }; */