annotate .svn/pristine/a9/a9a0fea2fdb05f53e7106ee809d36d5c965e5151.svn-base @ 1524:82fac3dcf466 redmine-2.5-integration

Fix failure to interpret Javascript when autocompleting members for project
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Thu, 11 Sep 2014 10:24:38 +0100
parents 038ba2d95de8
children
rev   line source
Chris@1296 1 require 'rexml/document'
Chris@1296 2 require 'SVG/Graph/Graph'
Chris@1296 3 require 'SVG/Graph/BarBase'
Chris@1296 4
Chris@1296 5 module SVG
Chris@1296 6 module Graph
Chris@1296 7 # === Create presentation quality SVG bar graphs easily
Chris@1296 8 #
Chris@1296 9 # = Synopsis
Chris@1296 10 #
Chris@1296 11 # require 'SVG/Graph/Bar'
Chris@1296 12 #
Chris@1296 13 # fields = %w(Jan Feb Mar);
Chris@1296 14 # data_sales_02 = [12, 45, 21]
Chris@1296 15 #
Chris@1296 16 # graph = SVG::Graph::Bar.new(
Chris@1296 17 # :height => 500,
Chris@1296 18 # :width => 300,
Chris@1296 19 # :fields => fields
Chris@1296 20 # )
Chris@1296 21 #
Chris@1296 22 # graph.add_data(
Chris@1296 23 # :data => data_sales_02,
Chris@1296 24 # :title => 'Sales 2002'
Chris@1296 25 # )
Chris@1296 26 #
Chris@1296 27 # print "Content-type: image/svg+xml\r\n\r\n"
Chris@1296 28 # print graph.burn
Chris@1296 29 #
Chris@1296 30 # = Description
Chris@1296 31 #
Chris@1296 32 # This object aims to allow you to easily create high quality
Chris@1296 33 # SVG[http://www.w3c.org/tr/svg bar graphs. You can either use the default
Chris@1296 34 # style sheet or supply your own. Either way there are many options which
Chris@1296 35 # can be configured to give you control over how the graph is generated -
Chris@1296 36 # with or without a key, data elements at each point, title, subtitle etc.
Chris@1296 37 #
Chris@1296 38 # = Notes
Chris@1296 39 #
Chris@1296 40 # The default stylesheet handles upto 12 data sets, if you
Chris@1296 41 # use more you must create your own stylesheet and add the
Chris@1296 42 # additional settings for the extra data sets. You will know
Chris@1296 43 # if you go over 12 data sets as they will have no style and
Chris@1296 44 # be in black.
Chris@1296 45 #
Chris@1296 46 # = Examples
Chris@1296 47 #
Chris@1296 48 # * http://germane-software.com/repositories/public/SVG/test/test.rb
Chris@1296 49 #
Chris@1296 50 # = See also
Chris@1296 51 #
Chris@1296 52 # * SVG::Graph::Graph
Chris@1296 53 # * SVG::Graph::BarHorizontal
Chris@1296 54 # * SVG::Graph::Line
Chris@1296 55 # * SVG::Graph::Pie
Chris@1296 56 # * SVG::Graph::Plot
Chris@1296 57 # * SVG::Graph::TimeSeries
Chris@1296 58 class Bar < BarBase
Chris@1296 59 include REXML
Chris@1296 60
Chris@1296 61 # See Graph::initialize and BarBase::set_defaults
Chris@1296 62 def set_defaults
Chris@1296 63 super
Chris@1296 64 self.top_align = self.top_font = 1
Chris@1296 65 end
Chris@1296 66
Chris@1296 67 protected
Chris@1296 68
Chris@1296 69 def get_x_labels
Chris@1296 70 @config[:fields]
Chris@1296 71 end
Chris@1296 72
Chris@1296 73 def get_y_labels
Chris@1296 74 maxvalue = max_value
Chris@1296 75 minvalue = min_value
Chris@1296 76 range = maxvalue - minvalue
Chris@1296 77
Chris@1296 78 top_pad = range == 0 ? 10 : range / 20.0
Chris@1296 79 scale_range = (maxvalue + top_pad) - minvalue
Chris@1296 80
Chris@1296 81 scale_division = scale_divisions || (scale_range / 10.0)
Chris@1296 82
Chris@1296 83 if scale_integers
Chris@1296 84 scale_division = scale_division < 1 ? 1 : scale_division.round
Chris@1296 85 end
Chris@1296 86
Chris@1296 87 rv = []
Chris@1296 88 maxvalue = maxvalue%scale_division == 0 ?
Chris@1296 89 maxvalue : maxvalue + scale_division
Chris@1296 90 minvalue.step( maxvalue, scale_division ) {|v| rv << v}
Chris@1296 91 return rv
Chris@1296 92 end
Chris@1296 93
Chris@1296 94 def x_label_offset( width )
Chris@1296 95 width / 2.0
Chris@1296 96 end
Chris@1296 97
Chris@1296 98 def draw_data
Chris@1296 99 minvalue = min_value
Chris@1296 100 fieldwidth = field_width
Chris@1296 101
Chris@1296 102 unit_size = (@graph_height.to_f - font_size*2*top_font) /
Chris@1296 103 (get_y_labels.max - get_y_labels.min)
Chris@1296 104 bargap = bar_gap ? (fieldwidth < 10 ? fieldwidth / 2 : 10) : 0
Chris@1296 105
Chris@1296 106 bar_width = fieldwidth - bargap
Chris@1296 107 bar_width /= @data.length if stack == :side
Chris@1296 108 x_mod = (@graph_width-bargap)/2 - (stack==:side ? bar_width/2 : 0)
Chris@1296 109
Chris@1296 110 bottom = @graph_height
Chris@1296 111
Chris@1296 112 field_count = 0
Chris@1296 113 @config[:fields].each_index { |i|
Chris@1296 114 dataset_count = 0
Chris@1296 115 for dataset in @data
Chris@1296 116
Chris@1296 117 # cases (assume 0 = +ve):
Chris@1296 118 # value min length
Chris@1296 119 # +ve +ve value - min
Chris@1296 120 # +ve -ve value - 0
Chris@1296 121 # -ve -ve value.abs - 0
Chris@1296 122
Chris@1296 123 value = dataset[:data][i]
Chris@1296 124
Chris@1296 125 left = (fieldwidth * field_count)
Chris@1296 126
Chris@1296 127 length = (value.abs - (minvalue > 0 ? minvalue : 0)) * unit_size
Chris@1296 128 # top is 0 if value is negative
Chris@1296 129 top = bottom - (((value < 0 ? 0 : value) - minvalue) * unit_size)
Chris@1296 130 left += bar_width * dataset_count if stack == :side
Chris@1296 131
Chris@1296 132 @graph.add_element( "rect", {
Chris@1296 133 "x" => left.to_s,
Chris@1296 134 "y" => top.to_s,
Chris@1296 135 "width" => bar_width.to_s,
Chris@1296 136 "height" => length.to_s,
Chris@1296 137 "class" => "fill#{dataset_count+1}"
Chris@1296 138 })
Chris@1296 139
Chris@1296 140 make_datapoint_text(left + bar_width/2.0, top - 6, value.to_s)
Chris@1296 141 dataset_count += 1
Chris@1296 142 end
Chris@1296 143 field_count += 1
Chris@1296 144 }
Chris@1296 145 end
Chris@1296 146 end
Chris@1296 147 end
Chris@1296 148 end