// Copyright 2010-2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// Protocol messages to be used for mozc renderer style setting.
syntax = "proto2";

package mozc.renderer;

message RendererStyle {
  message RGBAColor {
    // RGB color range : [0 - 255]
    required double r = 1 [default = 0];
    required double g = 2 [default = 0];
    required double b = 3 [default = 0];
    // Alpha value range : [0 - 1.0]
    optional double a = 4 [default = 1.0];
  }
  message TextStyle {
    optional double font_size = 1;
    optional RGBAColor foreground_color = 2;
    optional RGBAColor background_color = 3;
    // Left padding size (pixel)
    optional int32 left_padding = 4 [default = 0];
    // Right padding size (pixel)
    optional int32 right_padding = 5 [default = 0];
    optional string font_name = 6;
  }

  message InfolistStyle{
    optional string caption_string  = 1;
    optional int32 caption_height  = 2;
    optional int32 caption_padding = 3;
    optional int32 window_border = 4;
    optional int32 row_rect_padding = 5;
    optional int32 window_width = 6;
    optional TextStyle caption_style = 7;
    optional TextStyle title_style = 8;
    optional TextStyle description_style = 9;
    optional RGBAColor border_color = 10;
    optional RGBAColor caption_background_color = 11;
    optional RGBAColor focused_background_color = 12;
    optional RGBAColor focused_border_color = 13;
  }

  // Window border size (pixel)
  optional int32 window_border = 1;
  // Footer height (pixel)
  optional int32 footer_height = 2;
  // Row rect padding  (pixel)
  optional int32 row_rect_padding = 3;
  // Window border color
  optional RGBAColor border_color = 4;

  // We want to ensure that the candidate window is at least wide
  // enough to render column_minimum_width_string as a candidate.
  optional string column_minimum_width_string = 5;

  // Candidate view text styles
  repeated TextStyle text_styles = 6;

  // Footer style
  repeated RGBAColor footer_border_colors = 7;
  // Footer label style
  optional TextStyle footer_style = 8;
  // Footer sub label style
  // Sub label is used to show the build number (CHANNEL_DEV only)
  optional TextStyle footer_sub_label_style = 9;

  // Focused background color
  optional RGBAColor focused_background_color = 10;
  // Focused border color
  optional RGBAColor focused_border_color = 11;

  // Scrollbar background color
  optional RGBAColor scrollbar_background_color = 12;
  // Scrollbar indicator color
  optional RGBAColor scrollbar_indicator_color = 13;
  // Scrollbar width (pixel)
  optional int32 scrollbar_width = 14;

  // Footer background is gradation color from top to bottom
  optional RGBAColor footer_top_color = 15;
  optional RGBAColor footer_bottom_color = 16;

  // Logo file name
  optional string logo_file_name = 17;

  // Infolist Style
  optional InfolistStyle infolist_style = 18;
}
