// ==========================================================================
// Project:   SproutCore - JavaScript Application Framework
// Copyright: ©2008-2011 Apple Inc. All rights reserved.
// License:   Licensed under MIT license (see license.js)
// ==========================================================================

/**
  @namespace
  
  This is the default InlineEditorDelegate for SC.LabelView. The default editor
  is an SC.InlineTextFieldView.

  Only one editor is allowed to be active at a time. If another view requests an
  editor while an editor is already active, the delegate will first attempt to
  commit the existing editor, then discard it if commit fails, and fail to
  acquire if the active editor could not be discarded.

  Each time an editor is required, it instantiates it and appends it to the same
  pane as the view being edited. The editor is responsible for positioning
  itself correctly in its beginEditing method.

  @since SproutCore 1.0
*/
SC.InlineTextFieldDelegate = /** @scope SC.InlineTextFieldDelegate */{

  /**
    The current shared inline editor.

    @type SC.InlineTextFieldView
  */
  editor: null,

  /**
    If an editor is currently active, dismisses it by first attempting to commit
    and if that fails attempting to dismiss. If that fails, the acquire fails
    and returns null.

    Otherwise, it creates the editor as a child of the client view's pane and
    returns it.

    The default editor is an SC.InlineTextFieldView. The client view may
    customize this by setting a different inlineEditor as its exampleEditor
    property.

    @param {SC.InlineEditable} label the label that is requesting an editor
    @returns {SC.InlineEditor} the editor the label should use to edit
  */
  acquireEditor: function(label) {
    var editor = this.editor;

    if(editor) {
      // attempt to end editing on the previous editor and return null if unable
      // to end editing successfully
      if(editor.get('isEditing') && !editor.commitEditing() && !editor.discardEditing()) return null;

      // now release it
      this.releaseEditor(editor);
    }

    // default to SC.InlineTextFieldView
    var exampleEditor = label.exampleEditor ? label.exampleEditor : SC.InlineTextFieldView,
    pane = label.get('pane');

    // set ourself as the delegate for the editor
    editor = this.editor = pane.createChildView(exampleEditor, {
      inlineEditorDelegate: this
    });

    pane.appendChild(editor);

    return editor;
  },

  /**
    Cleans up the given editor by simply removing it from the view hierarchy. The
    client view should null any references to the editor so it may be garbage
    collected.

    @params {SC.InlineEditor} editor the editor that should be cleaned up
    @returns {Boolean} whether the cleanup succeeded
  */
  releaseEditor: function(editor) {
    editor.removeFromParent();

    this.editor = null;

    return YES;
  }
};

