<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (C) 2013 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
    xmlns:g='urn:import:com.google.gwt.user.client.ui'
    xmlns:d='urn:import:com.google.gerrit.client.diff'>
  <ui:with field='res' type='com.google.gerrit.client.diff.Resources'/>
  <ui:style gss='false' type='com.google.gerrit.client.diff.SideBySideTable.DiffTableStyle'>
    @external .CodeMirror, .CodeMirror-selectedtext;
    @external .CodeMirror-linenumber;
    @external .CodeMirror-overlayscroll-vertical, .CodeMirror-scroll;
    @external .CodeMirror-dialog-bottom;
    @external .CodeMirror-cursor;

    @external .dark, .noIntraline, .showLineNumbers;

    .difftable .patchSetNav,
    .difftable .CodeMirror {
      -webkit-touch-callout: none;
      -webkit-user-select: none;
      -khtml-user-select: none;
      -moz-user-select: none;
      -ms-user-select: none;
    }

    .difftable .CodeMirror pre {
      overflow: visible;
      border-right: 0;
      width: auto;
    }

    /* Preserve space for underscores. If this changes
     * see ChunkManager.addPadding() and adjust there.
     */
    .difftable .CodeMirror pre,
    .difftable .CodeMirror pre span {
      padding-bottom: 1px;
    }

    .hideA .psNavA,
    .hideA .a {
      display: none;
    }

    .hideB .psNavB,
    .hideB .b {
      display: none;
    }

    .table {
      width: 100%;
      table-layout: fixed;
      border-spacing: 0;
    }
    .table td { padding: 0 }
    .a, .b { width: 50% }
    .hideA .psNavB, .hideA .b { width: 100% }
    .hideB .psNavA, .hideB .a { width: 100% }

    /* Hide scrollbars on A, B controls both views. */
    .a .CodeMirror-scroll { margin-right: -36px; }
    .a .CodeMirror-overlayscroll-vertical { display: none !important; }

    .showLineNumbers .b { border-left: none; }
    .b { border-left: 1px solid #ddd; }

    .a .diff { background-color: #faa; }
    /* Set min-width for lineWrapping to make sure it gets enough width
       before lineWrapping and to make sure it dosent do a ugly line wrap */
    .b .diff { background-color: #9f9; min-width: 60em; }
    .a .intralineBg { background-color: #fee; }
    .b .intralineBg { background-color: #dfd; }
    .noIntraline .a .intralineBg { background-color: #faa; }
    .noIntraline .b .intralineBg { background-color: #9f9; }

    .dark .a .diff { background-color: #400; }
    .dark .b .diff { background-color: #444; }

    .dark .a .intralineBg { background-color: #888; }
    .dark .b .intralineBg { background-color: #bbb; }
    .dark .noIntraline .a .intralineBg { background-color: #400; }
    .dark .noIntraline .b .intralineBg { background-color: #444; }

    .patchSetNav, .diff_header {
      background-color: #f7f7f7;
      line-height: 1;
    }

    .difftable .CodeMirror-selectedtext {
      background-color: inherit !important;
    }
    .difftable .CodeMirror-linenumber {
      height: 1.11em;
      cursor: pointer;
    }
    .difftable .CodeMirror div.CodeMirror-cursor {
      border-left: 2px solid black;
    }
    .difftable .CodeMirror-dialog-bottom {
      border-top: 0;
      border-left: 1px solid #000;
      border-bottom: 1px solid #000;
      background-color: #f7f7f7;
      top: 0;
      right: 0;
      bottom: auto;
      left: auto;
    }
    .showLineNumbers .padding {
      margin-left: 21px;
      border-left: 2px solid #d64040;
    }
  </ui:style>
  <g:HTMLPanel styleName='{style.difftable}'>
    <table class='{style.table}'>
      <tr ui:field='patchSetNavRow' class='{style.patchSetNav}'>
        <td ui:field='patchSetNavCellA' class='{style.psNavA}'>
          <d:PatchSetSelectBox ui:field='patchSetSelectBoxA' />
        </td>
        <td ui:field='patchSetNavCellB' class='{style.psNavB}'>
          <d:PatchSetSelectBox ui:field='patchSetSelectBoxB' />
        </td>
      </tr>
      <tr ui:field='diffHeaderRow' class='{res.diffTableStyle.diffHeader}'>
        <td colspan='2'><pre ui:field='diffHeaderText' /></td>
      </tr>
      <tr>
        <td ui:field='cmA' class='{style.a}' />
        <td ui:field='cmB' class='{style.b}' />
      </tr>
    </table>
    <g:FlowPanel ui:field='widgets' visible='false'/>
  </g:HTMLPanel>
</ui:UiBinder>
