/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <hr>
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* This file has been modified by the OpenOLAT community. Changes are licensed
* under the Apache 2.0 license as the original file.
* <p>
*/
package org.olat.core.gui.components.form.flexible.impl.rules;
import java.util.HashSet;
import java.util.Set;
import org.olat.core.gui.components.form.flexible.FormItem;
import org.olat.core.gui.components.form.flexible.FormItemContainer;
import org.olat.core.gui.components.form.flexible.FormItemDependencyRule;
import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
import org.olat.core.gui.components.form.flexible.elements.SingleSelection;
import org.olat.core.gui.components.form.flexible.elements.TextElement;
import org.olat.core.logging.AssertException;
/**
* Description:<br>
* TODO: patrickb Class Description for RulesFactory
*
* <P>
* Initial Date: 10.02.2007 <br>
*
* @author patrickb
*/
public class RulesFactory {
/**
* Creates a custom rule which is triggered whenever
* <code>triggerElement</code> is set to <code>triggerValue</code>. The code
* which gets executed resides in the <code>apply</code> method of a
* {@link DependencyRuleApplayable} object. An implementation that executes if
* a trigger element changes to "true" could look like this:
*
* <pre>
* {@code
* RulesFactory.createCustomRule(triggerElement, "true", new HashSet<FormItem>(Arrays.asList(target1, target2)), formLayout).setDependencyRuleApplayable(new DependencyRuleApplayable() {
* public void apply(FormItem triggerElement, Object triggerVal, Set<FormItem> targets) {
* for (FormItem target : targets) {
* target.setEnabled(true);
* }
* }
* });
* }
* </pre>
*
* (Note that this example uses an anonymous class which makes it unnecessary
* for you to create a separate class which implements
* <code>DependencyRuleApplayable</code> for each of your rules.) Don't forget
* to add action listeners for
* {@link org.olat.core.gui.components.form.flexible.impl.FormEvent.ONCHANGE}
* to your trigger elements.
*
* @param triggerElement The element that is being watched for changes.
* @param triggerValue Triggers if the <code>triggerElement</code>'s key
* changes to <code>triggerValue</code>
* @param targets The targets.
* @param formLayout The container.
* @return The rule
* @see DependencyRuleApplayable
*/
public static FormItemDependencyRule createCustomRule(FormItem triggerElement, Object triggerValue, Set<FormItem> targets,
FormItemContainer formLayout) {
FormItemDependencyRule fidr = createRule(triggerElement, triggerValue, targets, FormItemDependencyRuleImpl.CUSTOM);
formLayout.addDependencyRule(fidr);
return fidr;
}
/**
* creates a custom rule, it is a must to define and set the applayable
*
* @param triggerElement
* @param triggerValue
* @param target
* @param formLayout
* @return
*/
public static FormItemDependencyRule createCustomRule(FormItem triggerElement, Object triggerValue, FormItem target,
FormItemContainer formLayout) {
Set<FormItem> targets = new HashSet<FormItem>();
targets.add(target);
return createCustomRule(triggerElement, triggerValue, targets, formLayout);
}
/**
* creates a reset rule
*
* @param triggerElement
* @param triggerValue
* @param targets
* @param formLayout
* @return
*/
public static FormItemDependencyRule createResetRule(FormItem triggerElement, Object triggerValue, Set<FormItem> targets,
FormItemContainer formLayout) {
FormItemDependencyRule fidr = createRule(triggerElement, triggerValue, targets, FormItemDependencyRuleImpl.RESET);
formLayout.addDependencyRule(fidr);
return fidr;
}
/**
* creates a reset rule
*
* @param triggerElement
* @param triggerValue
* @param target
* @param formLayout
* @return
*/
public static FormItemDependencyRule createResetRule(FormItem triggerElement, Object triggerValue, FormItem target,
FormItemContainer formLayout) {
Set<FormItem> targets = new HashSet<FormItem>();
targets.add(target);
return createResetRule(triggerElement, triggerValue, targets, formLayout);
}
/**
*
* @param triggerElement
* @param triggerValue
* @param targets
* @return
*/
public static FormItemDependencyRule createHideRule(FormItem triggerElement, Object triggerValue, Set<FormItem> targets,
FormItemContainer formLayout) {
FormItemDependencyRule fidr = createRule(triggerElement, triggerValue, targets, FormItemDependencyRuleImpl.MAKE_INVISIBLE);
formLayout.addDependencyRule(fidr);
return fidr;
}
/**
*
* @param triggerElement
* @param triggerValue
* @param target
* @return
*/
public static FormItemDependencyRule createHideRule(FormItem triggerElement, Object triggerValue, FormItem target,
FormItemContainer formLayout) {
Set<FormItem> targets = new HashSet<FormItem>();
targets.add(target);
return createHideRule(triggerElement, triggerValue, targets, formLayout);
}
/**
*
* @param triggerElement
* @param triggerValue
* @param targets
* @return
*/
public static FormItemDependencyRule createShowRule(FormItem triggerElement, Object triggerValue, Set<FormItem> targets,
FormItemContainer formLayout) {
FormItemDependencyRule fidr = createRule(triggerElement, triggerValue, targets, FormItemDependencyRuleImpl.MAKE_VISIBLE);
formLayout.addDependencyRule(fidr);
return fidr;
}
/**
*
* @param triggerElement
* @param triggerValue
* @param target
* @return
*/
public static FormItemDependencyRule createShowRule(FormItem triggerElement, Object triggerValue, FormItem target,
FormItemContainer formLayout) {
Set<FormItem> targets = new HashSet<FormItem>();
targets.add(target);
return createShowRule(triggerElement, triggerValue, targets, formLayout);
}
/**
*
* @param triggerElement
* @param triggerValue
* @param targets
* @return
*/
public static FormItemDependencyRule createReadOnlyRule(FormItem triggerElement, Object triggerValue, Set<FormItem> targets,
FormItemContainer formLayout) {
FormItemDependencyRule fidr = createRule(triggerElement, triggerValue, targets, FormItemDependencyRuleImpl.MAKE_READONLY);
formLayout.addDependencyRule(fidr);
return fidr;
}
/**
*
* @param triggerElement
* @param triggerValue
* @param target
* @return
*/
public static FormItemDependencyRule createReadOnlyRule(FormItem triggerElement, Object triggerValue, FormItem target,
FormItemContainer formLayout) {
Set<FormItem> targets = new HashSet<FormItem>();
targets.add(target);
return createReadOnlyRule(triggerElement, triggerValue, targets, formLayout);
}
/**
*
* @param triggerElement
* @param triggerValue
* @param targets
* @return
*/
public static FormItemDependencyRule createWritableRule(FormItem triggerElement, Object triggerValue, Set<FormItem> targets,
FormItemContainer formLayout) {
FormItemDependencyRule fidr = createRule(triggerElement, triggerValue, targets, FormItemDependencyRuleImpl.MAKE_WRITABLE);
formLayout.addDependencyRule(fidr);
return fidr;
}
/**
*
* @param triggerElement
* @param triggerValue
* @param target
* @return
*/
public static FormItemDependencyRule createWritableRule(FormItem triggerElement, Object triggerValue, FormItem target,
FormItemContainer formLayout) {
Set<FormItem> targets = new HashSet<FormItem>();
targets.add(target);
return createWritableRule(triggerElement, triggerValue, targets, formLayout);
}
/**
*
* @param triggerElement
* @param triggerValue
* @param targets
* @param type
* @return
*/
private static FormItemDependencyRule createRule(FormItem triggerElement, Object triggerValue, Set<FormItem> targets, int type) {
FormItemDependencyRule retVal = null;
//
if (triggerElement instanceof SingleSelection) {
retVal = new SingleSelectionTriggerdDependencyRule((SingleSelection) triggerElement, (String) triggerValue, targets, type);
} else if (triggerElement instanceof MultipleSelectionElement) {
retVal = new MultiSelectionTriggerdDependencyRule((MultipleSelectionElement) triggerElement, (String) triggerValue, targets, type);
} else if (triggerElement instanceof TextElement) {
retVal = new TextElementTriggerdDependencyRule((TextElement) triggerElement, (String) triggerValue, targets, type);
} else {
throw new AssertException("Form Item of type <" + triggerElement.getClass().getName() + "> not yet supported as TRIGGERELEMENT");
}
//
return retVal;
}
}