### Eclipse Workspace Patch 1.0
#P moodle
Index: course/moodleform_mod.php
===================================================================
RCS file: /cvsroot/moodle/moodle/course/moodleform_mod.php,v
retrieving revision 1.13
diff -u -r1.13 moodleform_mod.php
--- course/moodleform_mod.php	2 Aug 2007 10:38:20 -0000	1.13
+++ course/moodleform_mod.php	6 Aug 2007 12:06:43 -0000
@@ -29,10 +29,17 @@
      */
     var $_cm;
 
+    /**
+     * List of not yet used outcomes in activity
+     * @var array
+     */
+    var $_candidate_outcomes;
+
     function moodleform_mod($instance, $section, $cm) {
         $this->_instance = $instance;
         $this->_section = $section;
         $this->_cm = $cm;
+        $this->_candidate_outcomes = array();
         parent::moodleform('modedit.php');
     }
 
@@ -45,7 +52,7 @@
     }
 
     function definition_after_data() {
-        global $COURSE;
+        global $COURSE, $CFG;
         $mform =& $this->_form;
 
         if ($id = $mform->getElementValue('update')) {
@@ -59,11 +66,54 @@
                         $elname = 'outcome_'.$item->outcomeid;
                         if ($mform->elementExists($elname)) {
                             $mform->hardFreeze($elname); // prevent removing of existing outcomes
+                            unset($this->_candidate_outcomes[$item->outcomeid]);
                         }
                     }
                 }
             }
+
         }
+
+        if (!empty($CFG->enableoutcomes)) {
+            if ($outcomes = grade_outcome::fetch_all_available($COURSE->id)) {
+                $categories = grade_category::fetch_all(array('courseid'=>$COURSE->id));
+                $options = array();
+
+                if (!$id) {
+                    $options[-1] = get_string('outcomecategorynew', 'grades');
+                }
+                foreach ($categories as $category) {
+                    $options[$category->id] = $category->get_name();
+                }
+                $cat_el =& $mform->getElement('outcomecat');
+                $cat_el->load($options);
+
+                if ($id) {
+                    $modulename = $mform->getElementValue('modulename');
+                    $instance   = $mform->getElementValue('instance');
+                    if ($activity_item = grade_item::fetch(array('itemtype'=>'mod', 'itemmodule'=>$modulename,
+                                                       'iteminstance'=>$instance, 'itemnumber'=>0, 'courseid'=>$COURSE->id))) {
+                        $mform->setDefault('outcomecat', $activity_item->categoryid);
+                    } else {
+                        $course_category = grade_category::fetch_course_category($COURSE->id);
+                        $mform->setDefault('outcomecat', $course_category->id);
+                    }
+                } else {
+                    $mform->setDefault('outcomecat', -1);
+                    // TODO: it might be better to use course category here by default
+/*                    $course_category = grade_category::fetch_course_category($COURSE->id);
+                    $mform->setDefault('outcomecat', $course_category->id);*/
+                    
+                }
+
+                if (empty($this->_candidate_outcomes)) {
+                    // no more outcomes can be addded
+                    $mform->removeElement('outcomecat');
+                }
+            } else {
+                $mform->removeElement('outcomecat');
+            }
+        }            
     }
 
     // form verification
@@ -119,8 +169,10 @@
         if (!empty($CFG->enableoutcomes)) {
             if ($outcomes = grade_outcome::fetch_all_available($COURSE->id)) {
                 $mform->addElement('header', 'modoutcomes', get_string('outcomes', 'grades'));
+                $mform->addElement('select', 'outcomecat', get_string('outcomecategory', 'grades'));
                 foreach($outcomes as $outcome) {
                     $mform->addElement('advcheckbox', 'outcome_'.$outcome->id, $outcome->get_name());
+                    $this->_candidate_outcomes[$outcome->id] = $outcome->id;
                 }
             }
         }
Index: course/modedit.php
===================================================================
RCS file: /cvsroot/moodle/moodle/course/modedit.php,v
retrieving revision 1.29
diff -u -r1.29 modedit.php
--- course/modedit.php	3 Aug 2007 14:12:38 -0000	1.29
+++ course/modedit.php	6 Aug 2007 12:06:43 -0000
@@ -295,18 +295,35 @@
         }
 
         //sync idnumber with grade_item
-        if ($grade_item = grade_item::fetch(array('itemtype'=>'mod', 'itemmodule'=>$fromform->modulename,
+        if ($activity_item = grade_item::fetch(array('itemtype'=>'mod', 'itemmodule'=>$fromform->modulename,
                      'iteminstance'=>$fromform->instance, 'itemnumber'=>0, 'courseid'=>$COURSE->id))) {
-            if ($grade_item->idnumber != $fromform->cmidnumber) {
-                $grade_item->idnumber = $fromform->cmidnumber;
-                $grade_item->update();
+            if ($activity_item->idnumber != $fromform->cmidnumber) {
+                $activity_item->idnumber = $fromform->cmidnumber;
+                $activity_item->update();
+            }
+        }
+
+
+        $category = false; // means course category
+        if (isset($fromform->outcomecat)) {
+            if ($fromform->outcomecat == -1) { // new category - adding activity only
+                //create new category - do not insert yet
+                $category = new grade_category();
+                $category->fullname = stripslashes($fromform->name);
+                $category->courseid = $COURSE->id;
+
+            } else if ($fromform->outcomecat == 0) { // keep the same cat as activity item or course cat if no grading
+                if ($activity_item) {
+                    $category = $activity_item->get_parent_category();
+                }
+
+            } else { // put into specified category
+                $category = grade_category::fetch(array('id'=>$fromform->outcomecat));
             }
         }
 
         // add outcomes if requested
         if ($outcomes = grade_outcome::fetch_all_available($COURSE->id)) {
-            $grade_items = array();
-
             foreach($outcomes as $outcome) {
                 $elname = 'outcome_'.$outcome->id;
 
@@ -347,49 +364,25 @@
 
                     $grade_item->insert();
 
-                    // TODO comment on these next 4 lines
-                    if ($item = grade_item::fetch(array('itemtype'=>'mod', 'itemmodule'=>$grade_item->itemmodule,
-                                 'iteminstance'=>$grade_item->iteminstance, 'itemnumber'=>0, 'courseid'=>$COURSE->id))) {
-                        $grade_item->set_parent($item->categoryid);
-                        $grade_item->move_after_sortorder($item->sortorder);
-                    }
-                    $grade_items[] = $grade_item;
-                }
-            }
+                    // Put it into requested category
+                    if ($category) {
 
-            // Create a grade_category to represent this module, if outcomes have been attached
-            if (!empty($grade_items)) {
-                // Add the module's normal grade_item as a child of this category
-                $item_params = array('itemtype'=>'mod',
-                                     'itemmodule'=>$fromform->modulename,
-                                     'iteminstance'=>$fromform->instance,
-                                     'itemnumber'=>0,
-                                     'courseid'=>$COURSE->id);
-                $item = grade_item::fetch($item_params);
-
-                // Only create the category if it will contain at least 2 items
-                if ($item OR count($grade_items) > 1) { // If we are here it means there is at least 1 outcome
-                    $cat_params = array('courseid'=>$COURSE->id, 'fullname'=>$fromform->name);
-                    $grade_category = grade_category::fetch($cat_params);
-
-                    if (!$grade_category) {
-                        $grade_category = new grade_category($cat_params);
-                        $grade_category->courseid = $COURSE->id;
-                        $grade_category->fullname = $fromform->name;
-                        $grade_category->insert();
-                    }
-
-                    $sortorder = $grade_category->sortorder;
+                        if (empty($category->id)) {
+                            // now is the time to insert it
+                            $category->insert();
+                        }
 
-                    if ($item) {
-                        $item->set_parent($grade_category->id);
-                        $sortorder = $item->sortorder;
+                        if ($add and $activity_item and $activity_item->categoryid != $category->id) {
+                            // move activity to category when inserting only
+                            $activity_item->set_parent($category->id);
+                        }
+                        
+                        $grade_item->set_parent($category->id);
                     }
 
-                    // Add the outcomes as children of this category
-                    foreach ($grade_items as $gi) {
-                        $gi->set_parent($grade_category->id);
-                        $gi->move_after_sortorder($sortorder);
+                    // ...just after the activity grade item if exists
+                    if ($activity_item) {
+                        $grade_item->move_after_sortorder($activity_item->sortorder);
                     }
                 }
             }
Index: lang/en_utf8/grades.php
===================================================================
RCS file: /cvsroot/moodle/moodle/lang/en_utf8/grades.php,v
retrieving revision 1.67
diff -u -r1.67 grades.php
--- lang/en_utf8/grades.php	6 Aug 2007 12:05:45 -0000	1.67
+++ lang/en_utf8/grades.php	6 Aug 2007 12:06:44 -0000
@@ -235,6 +235,8 @@
 $string['onascaleof'] = ' on a scale of $a->grademin to $a->grademax';
 $string['operations'] = 'Operations';
 $string['outcome'] = 'Outcome';
+$string['outcomecategory'] = 'Create outcomes in category';
+$string['outcomecategorynew'] = 'New category';
 $string['outcomecreate'] = 'Add a new outcome';
 $string['outcomeitem'] = 'Outcome item';
 $string['outcomeitemsedit'] = 'Edit outcome item';
