/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is Mozilla XForms support.
 *
 * The Initial Developer of the Original Code is
 * IBM Corporation.
 * Portions created by the Initial Developer are Copyright (C) 2004
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *  Brian Ryner <bryner@brianryner.com>
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

#include "nsIXFormsContextControl.idl"
#include "nsIModelElementPrivate.idl"

interface nsIDOMNode;
interface nsIDOMElement;
%{C++
  #include "nsCOMArray.h"
%}

[ptr] native nsCOMArrayPtr(nsCOMArray<nsIDOMNode>);

/**
 * Interface implemented by all XForms form control classes.
 */
[uuid(8198c940-a6dd-11dd-ad8b-0800200c9a66)]
interface nsIXFormsControl : nsIXFormsContextControl
{
  /**
   * Tries to move focus to form control and returns true if succeeded.
   */
  boolean tryFocus();

  /**
   * The model that the control is bound to.
   */
  readonly attribute nsIModelElementPrivate model;

  /**
   * The instance node that the control is bound to.
   */
  readonly attribute nsIDOMNode boundNode;

  /**
   * Binds the control to the model. Only handles attaching to the model
   * (including reattaching from any old model).
   *
   * @note It can also set the boundNode, but does not do a proper node
   * binding, as in setting up dependencies, attaching index() listeners, etc.
   *
   * @param setBoundNode     Set boundNode too?
   */
  void bindToModel(in boolean setBoundNode);

  /**
   * The instance nodes that the control depend on.
   *
   * In other words, all the instance nodes that could influence which node
   * the control is bound to (mBoundNode). For example:
   * If a node has @ref="/share[@owner = /me]", it depends on all /share
   * nodes, all @owner attributes on /share nodes, and all /me nodes.
   */
  readonly attribute nsCOMArrayPtr dependencies;

  /**
   * Get the element that should receive events for the control.
   *
   * @todo This should not be necessary, we should send directly to the
   * control (XXX)
   */
  readonly attribute nsIDOMElement element;

  /** According to sec 4.1 in the spec, only certain controls are allowed to
   *  be targets of the interaction and notification events.  The controls
   *  that inherit from nsXFormsControlStub that SHOULDN'T get these events
   *  need to override IsEventTarget() and return PR_FALSE if the event
   *  shouldn't target it.
   *
   *  @param event    nsXFormsEvent value to evaluate
   */
  boolean isEventTarget(in long event);

  /**
   * Is true when the control is getting its instance data node binding from a
   * model bind element, ie. it has a |bind| attribute.
   */
  readonly attribute boolean usesModelBinding;

  /**
   * Is true when the control uses single node binding.  Will return false
   * when the control uses node-set binding (i.e. repeat and itemset).
   */
  readonly attribute boolean usesSingleNodeBinding;

  /**
   * These represent the default intrinsic states for controls when they are
   * enabled and disabled.
   */
  readonly attribute long defaultIntrinsicState;
  readonly attribute long disabledIntrinsicState;

  /**
   * This method is used to force the control to recalculate its bound node
   * and to refresh.  Used primarily internally to correct situations where DOM
   * manipulations have gotten things out of balance.
   */
  void rebindAndRefresh();

  /**
   * The keeper of the aborted bind list, if any, that this control is
   * currently listed on.
   *
   * In other words, if this control tried to bind and couldn't, we added it
   * to the appropriate context control's aborted bind list so that this control
   * could bind as soon as the context control is able to bind.  But if this
   * control is removed from the DOM before it has a chance to be processed,
   * we should remove it from the list so that it can be cleaned up
   * appropriately.
   */
  attribute nsIXFormsContextControl abortedBindListContainer;
};
