Added the Gruff library to the lib/ directory of the the rails folder, and the
[selectricity] / lib / gruff-0.2.8 / lib / gruff / mini / legend.rb
diff --git a/lib/gruff-0.2.8/lib/gruff/mini/legend.rb b/lib/gruff-0.2.8/lib/gruff/mini/legend.rb
new file mode 100644 (file)
index 0000000..25039cf
--- /dev/null
@@ -0,0 +1,77 @@
+module Gruff
+  module Mini
+    module Legend
+      
+      ##
+      # The canvas needs to be bigger so we can put the legend beneath it.
+
+      def expand_canvas_for_vertical_legend
+        @original_rows = @raw_rows
+        @rows += @data.length * calculate_caps_height(scale_fontsize(@legend_font_size)) * 1.7
+        render_background
+      end
+      
+      ##
+      # Draw the legend beneath the existing graph.
+
+      def draw_vertical_legend
+                
+        @legend_labels = @data.collect {|item| item[Gruff::Base::DATA_LABEL_INDEX] }
+        
+        legend_square_width = 40.0 # small square with color of this item
+        legend_square_margin = 10.0
+        @legend_left_margin = 40.0
+        legend_top_margin = 40.0
+
+        # May fix legend drawing problem at small sizes
+        @d.font = @font if @font
+        @d.pointsize = @legend_font_size
+
+        current_x_offset = @graph_left + @legend_left_margin
+        current_y_offset = @original_rows + legend_top_margin
+
+        debug { @d.line 0.0, current_y_offset, @raw_columns, current_y_offset }
+
+        @legend_labels.each_with_index do |legend_label, index|        
+
+          # Draw label
+          @d.fill = @font_color
+          @d.font = @font if @font
+          @d.pointsize = scale_fontsize(@legend_font_size)
+          @d.stroke = 'transparent'
+          @d.font_weight = Magick::NormalWeight
+          @d.gravity = Magick::WestGravity
+          @d = @d.annotate_scaled( @base_image, 
+                            @raw_columns, 1.0,
+                            current_x_offset + (legend_square_width * 1.7), current_y_offset, 
+                            truncate_legend_label(legend_label), @scale)
+
+          # Now draw box with color of this dataset
+          @d = @d.stroke 'transparent'
+          @d = @d.fill @data[index][Gruff::Base::DATA_COLOR_INDEX]
+          @d = @d.rectangle(current_x_offset, 
+                            current_y_offset - legend_square_width / 2.0, 
+                            current_x_offset + legend_square_width, 
+                            current_y_offset + legend_square_width / 2.0)
+          
+          current_y_offset += calculate_caps_height(@legend_font_size) * 1.7
+        end
+        @color_index = 0
+      end
+
+      ##
+      # Shorten long labels so they will fit on the canvas.
+      #
+      #   Department of Hu...
+      
+      def truncate_legend_label(label)
+        truncated_label = label.to_s
+        while calculate_width(scale_fontsize(@legend_font_size), truncated_label) > (@columns - @legend_left_margin - Gruff::Base::RIGHT_MARGIN) && (truncated_label.length > 1)
+          truncated_label = truncated_label[0..truncated_label.length-2]
+        end
+        truncated_label + (truncated_label.length < label.to_s.length ? "…" : '')
+      end
+      
+    end
+  end
+end

Benjamin Mako Hill || Want to submit a patch?