summaryrefslogtreecommitdiffhomepage
path: root/lib/axlsx/drawing/vml_shape.rb
blob: 4b21528fa98b8779fc1137b4fa965d136341e29e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# frozen_string_literal: true

module Axlsx
  # A VmlShape is used to position and render a comment.
  class VmlShape
    include Axlsx::OptionsParser
    include Axlsx::Accessors

    # Creates a new VmlShape
    # @option options [Integer] row
    # @option options [Integer] column
    # @option options [Integer] left_column
    # @option options [Integer] left_offset
    # @option options [Integer] top_row
    # @option options [Integer] top_offset
    # @option options [Integer] right_column
    # @option options [Integer] right_offset
    # @option options [Integer] bottom_row
    # @option options [Integer] bottom_offset
    def initialize(options = {})
      @row = @column = @left_column = @top_row = @right_column = @bottom_row = 0
      @left_offset = 15
      @top_offset = 2
      @right_offset = 50
      @bottom_offset = 5
      @visible = true
      @id = Array.new(8) { rand(65..89).chr }.join
      parse_options options
      yield self if block_given?
    end

    unsigned_int_attr_accessor :row, :column, :left_column, :left_offset, :top_row, :top_offset,
                               :right_column, :right_offset, :bottom_row, :bottom_offset

    boolean_attr_accessor :visible

    # serialize the shape to a string
    # @param [String] str
    # @return [String]
    def to_xml_string(str = +'')
      str << <<~XML

        <v:shape id="#{@id}" type="#_x0000_t202" fillcolor="#ffffa1 [80]" o:insetmode="auto"
          style="visibility:#{@visible ? 'visible' : 'hidden'}">
          <v:fill color2="#ffffa1 [80]"/>
          <v:shadow on="t" obscured="t"/>
          <v:path o:connecttype="none"/>
          <v:textbox style='mso-fit-text-with-word-wrap:t'>
           <div style='text-align:left'></div>
          </v:textbox>

          <x:ClientData ObjectType="Note">
           <x:MoveWithCells/>
           <x:SizeWithCells/>
           <x:Anchor>#{left_column}, #{left_offset}, #{top_row}, #{top_offset}, #{right_column}, #{right_offset}, #{bottom_row}, #{bottom_offset}</x:Anchor>
           <x:AutoFill>False</x:AutoFill>
           <x:Row>#{row}</x:Row>
           <x:Column>#{column}</x:Column>
           #{@visible ? '<x:Visible/>' : ''}
          </x:ClientData>
         </v:shape>
      XML
    end
  end
end