/**
  * @param assFormulaQuestionUnitCategory $category
  * @param assFormulaQuestionUnit         $unit
  * @return ilPropertyFormGUI
  */
 protected function initUnitForm(assFormulaQuestionUnitCategory $category = null, assFormulaQuestionUnit $unit = null)
 {
     if ($this->unit_form instanceof ilPropertyFormGUI) {
         return $this->unit_form;
     }
     $unit_in_use = false;
     if ($unit instanceof assFormulaQuestionUnit && $this->repository->isUnitInUse($unit->getId())) {
         $unit_in_use = true;
     }
     $this->unit_form = new ilPropertyFormGUI();
     $title = new ilTextInputGUI($this->lng->txt('unit'), 'unit_title');
     $title->setDisabled($unit_in_use);
     $title->setRequired(true);
     $this->unit_form->addItem($title);
     $baseunit = new ilSelectInputGUI($this->lng->txt('baseunit'), 'base_unit');
     $items = $this->repository->getCategorizedUnits();
     $options = array();
     $category_name = '';
     $new_category = false;
     foreach ((array) $items as $item) {
         if ($unit instanceof assFormulaQuestionUnit && $unit->getId() == $item->getId()) {
             continue;
         }
         /**
          * @var $item assFormulaQuestionUnitCategory|assFormulaQuestionUnitCategory
          */
         if ($item instanceof assFormulaQuestionUnitCategory) {
             if ($category_name != $item->getDisplayString()) {
                 $new_category = true;
                 $category_name = $item->getDisplayString();
             }
             continue;
         }
         $options[$item->getId()] = $item->getDisplayString() . ($new_category ? ' (' . $category_name . ')' : '');
         $new_category = false;
     }
     $baseunit->setDisabled($unit_in_use);
     $baseunit->setOptions(array(0 => $this->lng->txt('no_selection')) + $options);
     $this->unit_form->addItem($baseunit);
     $factor = new ilNumberInputGUI($this->lng->txt('factor'), 'factor');
     $factor->setRequired(true);
     $factor->setSize(3);
     $factor->setMinValue(0);
     $factor->allowDecimals(true);
     $factor->setDisabled($unit_in_use);
     $this->unit_form->addItem($factor);
     if (null === $unit) {
         $this->unit_form->setTitle($this->lng->txt('new_unit'));
         $this->unit_form->setFormAction($this->ctrl->getFormAction($this, 'addUnit'));
         $this->unit_form->addCommandButton('addUnit', $this->lng->txt('save'));
     } else {
         $this->ctrl->setParameter($this, 'unit_id', $unit->getId());
         if ($unit_in_use) {
             $this->unit_form->setFormAction($this->ctrl->getFormAction($this, 'showUnitsOfCategory'));
         } else {
             $this->unit_form->addCommandButton('saveUnit', $this->lng->txt('save'));
             $this->unit_form->setFormAction($this->ctrl->getFormAction($this, 'saveUnit'));
         }
         $this->unit_form->setTitle(sprintf($this->lng->txt('un_sel_cat_sel_unit'), $category->getDisplayString(), $unit->getDisplayString()));
     }
     $this->unit_form->addCommandButton('showUnitsOfCategory', $this->lng->txt('cancel'));
     return $this->unit_form;
 }
 /**
  * @param assFormulaQuestionUnit $unit
  */
 public function saveUnit(assFormulaQuestionUnit $unit)
 {
     /**
      * @var $ilDB ilDB
      */
     global $ilDB;
     $res = $ilDB->queryF('SELECT unit_id FROM il_qpl_qst_fq_unit WHERE unit_id = %s', array('integer'), array($unit->getId()));
     if ($ilDB->fetchAssoc($res)) {
         $row = $ilDB->fetchAssoc($res);
         $sequence = $row['sequence'];
         if (is_null($unit->getBaseUnit()) || !strlen($unit->getBaseUnit())) {
             $unit->setFactor(1);
         }
         $ar = $ilDB->manipulateF('UPDATE il_qpl_qst_fq_unit SET unit = %s, factor = %s, baseunit_fi = %s, category_fi = %s, sequence = %s WHERE unit_id = %s AND question_fi = %s', array('text', 'float', 'integer', 'integer', 'integer', 'integer', 'integer'), array($unit->getUnit(), $unit->getFactor(), (int) $unit->getBaseUnit(), (int) $unit->getCategory(), (int) $unit->getSequence(), (int) $unit->getId(), (int) $this->getConsumerId()));
         if ($ar > 0) {
             $this->clearUnits();
         }
     }
 }