1*760c253cSXin Li# -*- coding: utf-8 -*- 2*760c253cSXin Li# Copyright 2011 The ChromiumOS Authors 3*760c253cSXin Li# Use of this source code is governed by a BSD-style license that can be 4*760c253cSXin Li# found in the LICENSE file. 5*760c253cSXin Li 6*760c253cSXin Li"""Module to draw column chart.""" 7*760c253cSXin Li 8*760c253cSXin Li 9*760c253cSXin Liclass ColumnChart(object): 10*760c253cSXin Li """class to draw column chart.""" 11*760c253cSXin Li 12*760c253cSXin Li def __init__(self, title, width, height): 13*760c253cSXin Li self.title = title 14*760c253cSXin Li self.chart_div = "".join(t for t in title if t.isalnum()) 15*760c253cSXin Li self.width = width 16*760c253cSXin Li self.height = height 17*760c253cSXin Li self.columns = [] 18*760c253cSXin Li self.rows = [] 19*760c253cSXin Li self.series = [] 20*760c253cSXin Li 21*760c253cSXin Li def AddSeries(self, column_name, series_type, color): 22*760c253cSXin Li for i in range(len(self.columns)): 23*760c253cSXin Li if column_name == self.columns[i][1]: 24*760c253cSXin Li self.series.append((i - 1, series_type, color)) 25*760c253cSXin Li break 26*760c253cSXin Li 27*760c253cSXin Li def AddColumn(self, name, column_type): 28*760c253cSXin Li self.columns.append((column_type, name)) 29*760c253cSXin Li 30*760c253cSXin Li def AddRow(self, row): 31*760c253cSXin Li self.rows.append(row) 32*760c253cSXin Li 33*760c253cSXin Li def GetJavascript(self): 34*760c253cSXin Li res = "var data = new google.visualization.DataTable();\n" 35*760c253cSXin Li for column in self.columns: 36*760c253cSXin Li res += "data.addColumn('%s', '%s');\n" % column 37*760c253cSXin Li res += "data.addRows(%s);\n" % len(self.rows) 38*760c253cSXin Li for row in range(len(self.rows)): 39*760c253cSXin Li for column in range(len(self.columns)): 40*760c253cSXin Li val = self.rows[row][column] 41*760c253cSXin Li if isinstance(val, str): 42*760c253cSXin Li val = "'%s'" % val 43*760c253cSXin Li res += "data.setValue(%s, %s, %s);\n" % (row, column, val) 44*760c253cSXin Li 45*760c253cSXin Li series_javascript = "" 46*760c253cSXin Li for series in self.series: 47*760c253cSXin Li series_javascript += "%s: {type: '%s', color: '%s'}, " % series 48*760c253cSXin Li 49*760c253cSXin Li chart_add_javascript = """ 50*760c253cSXin Livar chart_%s = new google.visualization.ComboChart( 51*760c253cSXin Li document.getElementById('%s')); 52*760c253cSXin Lichart_%s.draw(data, {width: %s, height: %s, title: '%s', legend: 'none', 53*760c253cSXin Li seriesType: "bars", lineWidth: 0, pointSize: 5, series: {%s}, 54*760c253cSXin Li vAxis: {minValue: 0}}) 55*760c253cSXin Li""" 56*760c253cSXin Li 57*760c253cSXin Li res += chart_add_javascript % ( 58*760c253cSXin Li self.chart_div, 59*760c253cSXin Li self.chart_div, 60*760c253cSXin Li self.chart_div, 61*760c253cSXin Li self.width, 62*760c253cSXin Li self.height, 63*760c253cSXin Li self.title, 64*760c253cSXin Li series_javascript, 65*760c253cSXin Li ) 66*760c253cSXin Li return res 67*760c253cSXin Li 68*760c253cSXin Li def GetDiv(self): 69*760c253cSXin Li return "<div id='%s' class='chart'></div>" % self.chart_div 70