This breaks a dependency cycle between GrDiffLine and GrDiffGroup. The line only needed to need to know about groups, if it was of type CONTEXT_CONTROL. But there was not really a need for the context control to be modeled as a line. Moving this logic from line to group meant to re-write the diff builders a little bit such that context control is now handled a bit more explicitly, which is probably an improvement anyway. This change is driven by the desire to convert GrDiffLine and GrDiffGroup to TypeScript and the author did not see a great solution for how to otherwise break the dependency cycle. Change-Id: Id07b0b9b2c4f5caf7bcc99ac20164dd34c14653d
		
			
				
	
	
		
			131 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * @license
 | 
						|
 * Copyright (C) 2016 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.
 | 
						|
 */
 | 
						|
 | 
						|
import {GrDiffBuilder} from './gr-diff-builder.js';
 | 
						|
import {GrDiffGroup} from '../gr-diff/gr-diff-group';
 | 
						|
 | 
						|
/** @constructor */
 | 
						|
export function GrDiffBuilderSideBySide(diff, prefs, outputEl, layers) {
 | 
						|
  GrDiffBuilder.call(this, diff, prefs, outputEl, layers);
 | 
						|
}
 | 
						|
GrDiffBuilderSideBySide.prototype = Object.create(GrDiffBuilder.prototype);
 | 
						|
GrDiffBuilderSideBySide.prototype.constructor = GrDiffBuilderSideBySide;
 | 
						|
 | 
						|
GrDiffBuilderSideBySide.prototype.buildSectionElement = function(group) {
 | 
						|
  const sectionEl = this._createElement('tbody', 'section');
 | 
						|
  sectionEl.classList.add(group.type);
 | 
						|
  if (this._isTotal(group)) {
 | 
						|
    sectionEl.classList.add('total');
 | 
						|
  }
 | 
						|
  if (group.dueToRebase) {
 | 
						|
    sectionEl.classList.add('dueToRebase');
 | 
						|
  }
 | 
						|
  if (group.ignoredWhitespaceOnly) {
 | 
						|
    sectionEl.classList.add('ignoredWhitespaceOnly');
 | 
						|
  }
 | 
						|
  if (group.type === GrDiffGroup.Type.CONTEXT_CONTROL) {
 | 
						|
    sectionEl.appendChild(
 | 
						|
        this._createContextRow(sectionEl, group.contextGroups));
 | 
						|
    return sectionEl;
 | 
						|
  }
 | 
						|
 | 
						|
  const pairs = group.getSideBySidePairs();
 | 
						|
  for (let i = 0; i < pairs.length; i++) {
 | 
						|
    sectionEl.appendChild(this._createRow(sectionEl, pairs[i].left,
 | 
						|
        pairs[i].right));
 | 
						|
  }
 | 
						|
  return sectionEl;
 | 
						|
};
 | 
						|
 | 
						|
GrDiffBuilderSideBySide.prototype.addColumns = function(outputEl, fontSize) {
 | 
						|
  const width = fontSize * 4;
 | 
						|
  const colgroup = document.createElement('colgroup');
 | 
						|
 | 
						|
  // Add the blame column.
 | 
						|
  let col = this._createElement('col', 'blame');
 | 
						|
  colgroup.appendChild(col);
 | 
						|
 | 
						|
  // Add left-side line number.
 | 
						|
  col = document.createElement('col');
 | 
						|
  col.setAttribute('width', width);
 | 
						|
  colgroup.appendChild(col);
 | 
						|
 | 
						|
  // Add left-side content.
 | 
						|
  colgroup.appendChild(document.createElement('col'));
 | 
						|
 | 
						|
  // Add right-side line number.
 | 
						|
  col = document.createElement('col');
 | 
						|
  col.setAttribute('width', width);
 | 
						|
  colgroup.appendChild(col);
 | 
						|
 | 
						|
  // Add right-side content.
 | 
						|
  colgroup.appendChild(document.createElement('col'));
 | 
						|
 | 
						|
  outputEl.appendChild(colgroup);
 | 
						|
};
 | 
						|
 | 
						|
GrDiffBuilderSideBySide.prototype._createRow = function(section, leftLine,
 | 
						|
    rightLine) {
 | 
						|
  const row = this._createElement('tr');
 | 
						|
  row.classList.add('diff-row', 'side-by-side');
 | 
						|
  row.setAttribute('left-type', leftLine.type);
 | 
						|
  row.setAttribute('right-type', rightLine.type);
 | 
						|
  row.tabIndex = -1;
 | 
						|
 | 
						|
  row.appendChild(this._createBlameCell(leftLine.beforeNumber));
 | 
						|
 | 
						|
  this._appendPair(section, row, leftLine, leftLine.beforeNumber,
 | 
						|
      GrDiffBuilder.Side.LEFT);
 | 
						|
  this._appendPair(section, row, rightLine, rightLine.afterNumber,
 | 
						|
      GrDiffBuilder.Side.RIGHT);
 | 
						|
  return row;
 | 
						|
};
 | 
						|
 | 
						|
GrDiffBuilderSideBySide.prototype._appendPair = function(section, row, line,
 | 
						|
    lineNumber, side) {
 | 
						|
  const lineNumberEl = this._createLineEl(line, lineNumber, line.type, side);
 | 
						|
  row.appendChild(lineNumberEl);
 | 
						|
  row.appendChild(this._createTextEl(lineNumberEl, line, side));
 | 
						|
};
 | 
						|
 | 
						|
GrDiffBuilderSideBySide.prototype._createContextRow = function(section,
 | 
						|
    contextGroups) {
 | 
						|
  const row = this._createElement('tr');
 | 
						|
  row.classList.add('diff-row', 'side-by-side');
 | 
						|
  row.setAttribute('left-type', GrDiffGroup.Type.CONTEXT_CONTROL);
 | 
						|
  row.setAttribute('right-type', GrDiffGroup.Type.CONTEXT_CONTROL);
 | 
						|
  row.tabIndex = -1;
 | 
						|
 | 
						|
  row.appendChild(this._createBlameCell(0));
 | 
						|
  row.appendChild(this._createElement('td', 'contextLineNum'));
 | 
						|
  row.appendChild(this._createContextControl(section, contextGroups));
 | 
						|
  row.appendChild(this._createElement('td', 'contextLineNum'));
 | 
						|
  row.appendChild(this._createContextControl(section, contextGroups));
 | 
						|
  return row;
 | 
						|
};
 | 
						|
 | 
						|
GrDiffBuilderSideBySide.prototype._getNextContentOnSide = function(
 | 
						|
    content, side) {
 | 
						|
  let tr = content.parentElement.parentElement;
 | 
						|
  while (tr = tr.nextSibling) {
 | 
						|
    content = tr.querySelector(
 | 
						|
        'td.content .contentText[data-side="' + side + '"]');
 | 
						|
    if (content) { return content; }
 | 
						|
  }
 | 
						|
  return null;
 | 
						|
};
 |