#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

################################################################################
#
# Demonstrates Excel::Writer::XLSX's named colors and the Excel color
# palette.
#
# The set_custom_color() Worksheet method can be used to override one of the
# built-in palette values with a more suitable colour. See the main docs.
#
# reverse('©'), March 2002, John McNamara, jmcnamara@cpan.org
#
# original written in Perl by John McNamara
# converted to Ruby by Hideo Nakamura, nakamura.hideo@gmail.com
#

require 'write_xlsx'

workbook = WriteXLSX.new("colors.xlsx")

# Some common formats
center  = workbook.add_format(:align => 'center')
heading = workbook.add_format(:align => 'center', :bold => 1)

######################################################################
#
# Demonstrate the named colors.
#

order = [
  0x21,
  0x0B,
  0x35,
  0x11,
  0x16,
  0x12,
  0x0D,
  0x10,
  0x17,
  0x09,
  0x0C,
  0x0F,
  0x0E,
  0x14,
  0x08,
  0x0A
]

colors = {
                0x08 => 'black',
                0x0C => 'blue',
                0x10 => 'brown',
                0x0F => 'cyan',
                0x17 => 'gray',
                0x11 => 'green',
                0x0B => 'lime',
                0x0E => 'magenta',
                0x12 => 'navy',
                0x35 => 'orange',
                0x21 => 'pink',
                0x14 => 'purple',
                0x0A => 'red',
                0x16 => 'silver',
                0x09 => 'white',
                0x0D => 'yellow',
        }

worksheet1 = workbook.add_worksheet('Named colors')

worksheet1.set_column(0, 3, 15)

worksheet1.write(0, 0, "Index", heading)
worksheet1.write(0, 1, "Index", heading)
worksheet1.write(0, 2, "Name",  heading)
worksheet1.write(0, 3, "Color", heading)

i = 1

# original was colors.each....
# order unmatch between perl and ruby (of cource, it's hash!)
# so i use order array to match perl's xls order.
#
order.each do |index|
  format = workbook.add_format(
      :fg_color => colors[index],
      :pattern  => 1,
      :border   => 1
  )

  worksheet1.write(i + 1, 0, index,                    center)
  worksheet1.write(i + 1, 1, sprintf("0x%02X", index), center)
  worksheet1.write(i + 1, 2, colors[index],            center)
  worksheet1.write(i + 1, 3, '',                       format)
  i += 1
end

######################################################################
#
# Demonstrate the standard Excel colors in the range 8..63.
#

worksheet2 = workbook.add_worksheet('Standard colors')

worksheet2.set_column(0, 3, 15)

worksheet2.write(0, 0, "Index", heading)
worksheet2.write(0, 1, "Index", heading)
worksheet2.write(0, 2, "Color", heading)
worksheet2.write(0, 3, "Name",  heading)

(8..63).each do |i|
  format = workbook.add_format(
      :fg_color => i,
      :pattern  => 1,
      :border   => 1
  )

  worksheet2.write((i - 7), 0, i,                    center)
  worksheet2.write((i - 7), 1, sprintf("0x%02X", i), center)
  worksheet2.write((i - 7), 2, '',                   format)

  # Add the  color names
  if colors.has_key?(i)
    worksheet2.write((i - 7), 3, colors[i], center)
  end
end


#
# Demonstrate the Html colors.
#

colors = {
  '#000000' => 'black',
  '#0000FF' => 'blue',
  '#800000' => 'brown',
  '#00FFFF' => 'cyan',
  '#808080' => 'gray',
  '#008000' => 'green',
  '#00FF00' => 'lime',
  '#FF00FF' => 'magenta',
  '#000080' => 'navy',
  '#FF6600' => 'orange',
  '#FF00FF' => 'pink',
  '#800080' => 'purple',
  '#FF0000' => 'red',
  '#C0C0C0' => 'silver',
  '#FFFFFF' => 'white',
  '#FFFF00' => 'yellow'
}

worksheet3 = workbook.add_worksheet('Html colors')

worksheet3.set_column(0, 3, 15)

worksheet3.write(0, 0, "Html",  heading)
worksheet3.write(0, 1, "Name",  heading)
worksheet3.write(0, 2, "Color", heading)

i = 1

colors.each do |html_color, color|
  format = workbook.add_format(
    :fg_color => html_color,
    :pattern  => 1,
    :border   => 1
  )
  
  worksheet3.write(i + 1, 1, html_color, center)
  worksheet3.write(i + 1, 2, color,      center)
  worksheet3.write(i + 1, 3, '',         format)
  i += 1
end

workbook.close
