/*!
  @header ECXMLControlDefaultRule
  @abstract Module of Encore
 
  @availability OS X, GNUstep
  @copyright 2004, 2005, 2006 Oliver Langer

  Author: Oliver Langer

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA

  <pre>
  -------------------------------------------------------------------------
  Modification history

  27.11.05 ola     initial version
  22.08.06 ola     license changed
  -------------------------------------------------------------------------
  </pre>
*/

#if !defined(__ECXMLControlDefaultRule_H)
#define __ECXMLControlDefaultRule_H

#include <Foundation/Foundation.h>
#include <Encore/ECObject.h>
#include <Encore/ECXMLControlRule.h>
#include <Encore/ECXMLControlContext.h>

@class ECXMLControlSetterLookupUtil;

/*!
 * @class ECXMLControlSetAttributeRule
 * @abstract Used to call the appropriate method in order to hand-off an
 *   the attribute's value
 */
@interface ECXMLControlSetAttributeRule : ECObject <ECXMLControlRule> {
  @private 
    ECXMLControlSetterLookupUtil *setterLookupUtil;
}

- init;
- (void) dealloc;


/*!
 * @method respondsToContext
 * @param aContext current context to evaluate
 * @result YES if the receiver should be valuated according to the given 
 *   context
 */
- (BOOL) mayActOn: (ECXMLControlContext *) aContext;


/*!
 * @method actOn
 * @param aContext current context to evaluate
 * @result YES if no more rules should be evaluated
 */
- (BOOL) actOn: (ECXMLControlContext *) aContext;
@end


/* ---------------------------------- */

/*!
 * @class ECXMLControlLinkObjectRule
 * @abstract This rule is being executed when closing an xml element.
 *   It links the underlying object to it's super object by calling one
 *   of the setter methods, if available. Also it pops the current top user
 *   object from the stack. It ignores the first one.
 */
@interface ECXMLControlLinkObjectRule : ECObject <ECXMLControlRule> {
  @private 
    ECXMLControlSetterLookupUtil *setterLookupUtil;
}

- init;
- (void) dealloc;


/*!
 * @method actOn
 * @param aContext current context to evaluate
 * @result YES if no more rules should be evaluated
 */
- (BOOL) actOn: (ECXMLControlContext *) aContext;


/*!
 * @method respondsToContext
 * @param aContext current context to evaluate
 * @result YES if the receiver should be valuated according to the given 
 *   context
 */
- (BOOL) mayActOn: (ECXMLControlContext *) aContext;

@end

// ---------------------------------- ECXMLControlSetterLookupUtil

/*!
 * @class ECXMLControlSetterLookupUtil
 * @abstract This class is used to lookup an appropriate method for a given
 *  attribute name and a given object
 * @discussion See {@link addMethodNameSchema} for the syntax of the method
 * naming scheme. By default, the schemes set%@%@ and add%@%@ are added.
 */
@interface ECXMLControlSetterLookupUtil : ECObject {
  @private
    NSMutableArray *namesForSetterMethods;
}

- init;
- (void) dealloc;


/*!
 * @method addMethodNameSchema
 * @abstract Used to add a new pattern for a method name.
 * @discussion The pattern must contain two substitution strings for
 *   objc strings (%@). The first one will be replaced by the first character
 *   of an attribute name. The second will be replaced by all remaining 
 *   characters of the attribute name. Through this mechanism we can use 
 *   various combinations using an uppercase first letter and a lowercase
 *   first letter for the method name.<p/>
 *   E.g.: pattern is set%@%@
 *         attribute name is "money"
 *  This will result in an attempt to look for one of the following method
 *  names: setMoney, setmoney
 */
- addMethodNameSchema: (NSString *) aMethodNameSchema;


/*!
 * @method lookupMethodForAttributeName
 * @abstract Looks for a particular method which can be used as a setter
 * @discussion The method name schemes will be tried in the order they are
 * added to this object.
 * method wrt. to the given method name schemes 
 * (see {@link addMethodNameSchema}).
 * @param anAttributeName name of the attribute to set
 * @param aTargetObject underlying object to evaluate
 * @result selector or NULL, if it could not be found
 */
- (SEL) lookupMethodForAttributeName: (NSString *) anAttributeName 
  ofObject: (id) aTargetObject;
@end

#endif
