10dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif# Copyright 2011 Google Inc. All Rights Reserved.
2e55d35ee104a41e5f7ae96f4e326f33f6beaf412Yunlian Jiang"""Module to draw column chart."""
30dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif
4f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano
50dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharifclass ColumnChart(object):
6e55d35ee104a41e5f7ae96f4e326f33f6beaf412Yunlian Jiang  """class to draw column chart."""
7f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano
80dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif  def __init__(self, title, width, height):
90dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    self.title = title
100dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    self.chart_div = filter(str.isalnum, title)
110dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    self.width = width
120dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    self.height = height
130dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    self.columns = []
140dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    self.rows = []
150dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    self.series = []
160dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif
170dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif  def AddSeries(self, column_name, series_type, color):
180dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    for i in range(len(self.columns)):
190dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif      if column_name == self.columns[i][1]:
200dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif        self.series.append((i - 1, series_type, color))
210dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif        break
220dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif
230dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif  def AddColumn(self, name, column_type):
240dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    self.columns.append((column_type, name))
250dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif
260dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif  def AddRow(self, row):
270dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    self.rows.append(row)
280dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif
290dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif  def GetJavascript(self):
30f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano    res = 'var data = new google.visualization.DataTable();\n'
310dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    for column in self.columns:
320dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif      res += "data.addColumn('%s', '%s');\n" % column
33f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano    res += 'data.addRows(%s);\n' % len(self.rows)
340dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    for row in range(len(self.rows)):
350dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif      for column in range(len(self.columns)):
360dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif        val = self.rows[row][column]
370dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif        if isinstance(val, str):
380dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif          val = "'%s'" % val
39f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano        res += 'data.setValue(%s, %s, %s);\n' % (row, column, val)
400dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif
41f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano    series_javascript = ''
420dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    for series in self.series:
430dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif      series_javascript += "%s: {type: '%s', color: '%s'}, " % series
440dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif
450dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    chart_add_javascript = """
460dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharifvar chart_%s = new google.visualization.ComboChart(
470dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif  document.getElementById('%s'));
480dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharifchart_%s.draw(data, {width: %s, height: %s, title: '%s', legend: 'none',
490dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif  seriesType: "bars", lineWidth: 0, pointSize: 5, series: {%s},
500dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif  vAxis: {minValue: 0}})
510dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif"""
52f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano
530dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    res += chart_add_javascript % (self.chart_div, self.chart_div,
54f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano                                   self.chart_div, self.width, self.height,
55f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano                                   self.title, series_javascript)
560dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    return res
570dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif
580dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif  def GetDiv(self):
590dcbc4b1714260820fd4b8d6536fbb05e139cc0fAhmad Sharif    return "<div id='%s' class='chart'></div>" % self.chart_div
60