// ========================================================================== // Project: TestRunner.targetsController // Copyright: ©2011 Apple Inc. // ========================================================================== /*global TestRunner */

/**

The full set of targets available in the application.  This is populated
automatically when you call loadTargets().

@extends SC.ArrayController

*/ TestRunner.targetsController = SC.ArrayController.create( /** @scope TestRunner.targetsController.prototype */ {

/**
  Generates the root array of children objects whenever the target content
  changes.  Used in a tree node.
*/
sourceRoot: function () {

  // break targets into their respective types.  Items that should not be
  // visible at the top level will not have a sort kind
  var kinds = {}, keys = [], kind, targets, ret;

  this.forEach(function (target) {
    kind = target.get('sortKind');

    if (kind) {
      targets = kinds[kind];
      if (!targets) { kinds[kind] = targets = []; }

      targets.push(target);
      if (keys.indexOf(kind) < 0) keys.push(kind);
    }
  }, this);

  // sort kinds alphabetically - with sproutcore at end and apps at top
  keys.sort();
  if (keys.indexOf('sproutcore') >= 0) {
    keys.removeObject('sproutcore').pushObject('sproutcore');
  }
  if (keys.indexOf('apps') >= 0) {
    keys.removeObject('apps').unshiftObject('apps');
  }

  // once divided into kinds, create group nodes for each kind
  ret = [];
  keys.forEach(function (kind) {
    targets = kinds[kind];

    var defKey = "SourceList.%@.isExpanded".fmt(kind),
        expanded = TestRunner.userDefaults.get(defKey);

    ret.push(SC.Object.create({
      displayName: "Kind.%@".fmt(kind).loc(),
      isExpanded: SC.none(expanded) ? (kind !== 'sproutcore') : expanded,
      children: targets.sortProperty('kind', 'displayName'),

      isExpandedDefaultKey: defKey,
      isExpandedDidChange: function () {
        TestRunner.userDefaults.set(this.get('isExpandedDefaultKey'), this.get('isExpanded'));
      }.observes('isExpanded')
    }));
  });

  return SC.Object.create({ children: ret, isExpanded: YES });

}.property('[]').cacheable(),

/**
  Send event when targets load.
*/
statusDidChange: function () {
  if (this.get('status') === SC.Record.READY_CLEAN) {
    TestRunner.statechart.resumeGotoState();
  }
}.observes('status')

});