private function buildPanels(PhabricatorUserPreferences $preferences)
 {
     $viewer = $this->getViewer();
     $panels = PhabricatorSettingsPanel::getAllDisplayPanels();
     $result = array();
     foreach ($panels as $key => $panel) {
         $panel->setPreferences($preferences)->setViewer($viewer);
         if ($this->user) {
             $panel->setUser($this->user);
         }
         if (!$panel->isEnabled()) {
             continue;
         }
         if ($this->isTemplate()) {
             if (!$panel->isTemplatePanel()) {
                 continue;
             }
         } else {
             if (!$this->isSelf() && !$panel->isManagementPanel()) {
                 continue;
             }
             if ($this->isSelf() && !$panel->isUserPanel()) {
                 continue;
             }
         }
         if (!empty($result[$key])) {
             throw new Exception(pht("Two settings panels share the same panel key ('%s'): %s, %s.", $key, get_class($panel), get_class($result[$key])));
         }
         $result[$key] = $panel;
     }
     if (!$result) {
         throw new Exception(pht('No settings panels are available.'));
     }
     return $result;
 }
 public static final function getAllPanelGroupsWithPanels()
 {
     $groups = self::getAllPanelGroups();
     $panels = PhabricatorSettingsPanel::getAllPanels();
     $panels = mgroup($panels, 'getPanelGroupKey');
     foreach ($groups as $key => $group) {
         $group->panels = idx($panels, $key, array());
     }
     return $groups;
 }
 protected function newPages($object)
 {
     $viewer = $this->getViewer();
     $user = $object->getUser();
     $panels = PhabricatorSettingsPanel::getAllPanels();
     foreach ($panels as $key => $panel) {
         if (!$panel instanceof PhabricatorEditEngineSettingsPanel) {
             unset($panels[$key]);
             continue;
         }
         $panel->setViewer($viewer);
         if ($user) {
             $panel->setUser($user);
         }
     }
     $pages = array();
     $uris = array();
     foreach ($panels as $key => $panel) {
         $uris[$key] = $panel->getPanelURI();
         $page = $panel->newEditEnginePage();
         if (!$page) {
             continue;
         }
         $pages[] = $page;
     }
     $more_pages = array(id(new PhabricatorEditPage())->setKey('extra')->setLabel(pht('Extra Settings'))->setIsDefault(true));
     foreach ($more_pages as $page) {
         $pages[] = $page;
     }
     return $pages;
 }