public function render() { $this->requireResource('differential-changeset-view-css'); $changesets = $this->changesets; Javelin::initBehavior('differential-toggle-files', array('pht' => array('undo' => pht('Undo'), 'collapsed' => pht('This file content has been collapsed.')))); Javelin::initBehavior('differential-dropdown-menus', array('pht' => array('Open in Editor' => pht('Open in Editor'), 'Show All Context' => pht('Show All Context'), 'All Context Shown' => pht('All Context Shown'), "Can't Toggle Unloaded File" => pht("Can't Toggle Unloaded File"), 'Expand File' => pht('Expand File'), 'Collapse File' => pht('Collapse File'), 'Browse in Diffusion' => pht('Browse in Diffusion'), 'View Standalone' => pht('View Standalone'), 'Show Raw File (Left)' => pht('Show Raw File (Left)'), 'Show Raw File (Right)' => pht('Show Raw File (Right)'), 'Configure Editor' => pht('Configure Editor'), 'Load Changes' => pht('Load Changes'), 'View Side-by-Side' => pht('View Side-by-Side'), 'View Unified' => pht('View Unified'), 'Change Text Encoding...' => pht('Change Text Encoding...'), 'Highlight As...' => pht('Highlight As...')))); $renderer = DifferentialChangesetParser::getDefaultRendererForViewer($this->getUser()); $output = array(); $ids = array(); foreach ($changesets as $key => $changeset) { $file = $changeset->getFilename(); $class = 'differential-changeset'; if (!$this->inlineURI) { $class .= ' differential-changeset-noneditable'; } $ref = $this->references[$key]; $detail = id(new DifferentialChangesetDetailView())->setUser($this->getUser()); $uniq_id = 'diff-' . $changeset->getAnchorName(); $detail->setID($uniq_id); $view_options = $this->renderViewOptionsDropdown($detail, $ref, $changeset); $detail->setChangeset($changeset); $detail->addButton($view_options); $detail->setSymbolIndex(idx($this->symbolIndexes, $key)); $detail->setVsChangesetID(idx($this->vsMap, $changeset->getID())); $detail->setEditable(true); $detail->setRenderingRef($ref); $detail->setRenderURI($this->renderURI); $detail->setWhitespace($this->whitespace); $detail->setRenderer($renderer); if ($this->getParser()) { $detail->appendChild($this->getParser()->renderChangeset()); $detail->setLoaded(true); } else { $detail->setAutoload(isset($this->visibleChangesets[$key])); if (isset($this->visibleChangesets[$key])) { $load = pht('Loading...'); } else { $load = javelin_tag('a', array('class' => 'button grey', 'href' => '#' . $uniq_id, 'sigil' => 'differential-load', 'meta' => array('id' => $detail->getID(), 'kill' => true), 'mustcapture' => true), pht('Load File')); } $detail->appendChild(phutil_tag('div', array('id' => $uniq_id), phutil_tag('div', array('class' => 'differential-loading'), $load))); } $output[] = $detail->render(); $ids[] = $detail->getID(); } $this->requireResource('aphront-tooltip-css'); $this->initBehavior('differential-populate', array('changesetViewIDs' => $ids)); $this->initBehavior('differential-comment-jump', array()); if ($this->inlineURI) { Javelin::initBehavior('differential-edit-inline-comments', array('uri' => $this->inlineURI, 'stage' => 'differential-review-stage', 'revealIcon' => hsprintf('%s', new PHUIDiffRevealIconView()))); } $header = id(new PHUIHeaderView())->setHeader($this->getTitle()); $content = phutil_tag('div', array('class' => 'differential-review-stage', 'id' => 'differential-review-stage'), $output); $object_box = id(new PHUIObjectBoxView())->setHeader($header)->setCollapsed(true)->appendChild($content); return $object_box; }