/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <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 the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <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>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.core.gui.components.rating;
import java.util.ArrayList;
import java.util.List;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.AbstractComponent;
import org.olat.core.gui.components.ComponentRenderer;
import org.olat.core.gui.components.form.flexible.impl.Form;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Event;
import org.olat.core.logging.AssertException;
import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing;
/**
* Description:<br>
* The rating controller offers a view for users to rate on something using a
* star-like view.
*
* <h3>Events fired by this conmponent:</h3>
* RatingEvent that contains the new rating
* <P>
* Initial Date: 31.10.2008 <br>
* @author gnaegi
*/
public class RatingComponent extends AbstractComponent {
private static final OLog log = Tracing.createLoggerFor(RatingComponent.class);
private static final ComponentRenderer RENDERER = new RatingRenderer();
private List<String> ratingLabels;
private boolean translateRatingLabels;
private String title;
private boolean translateTitle;
private String explanation;
private boolean translateExplanation;
private boolean showRatingAsText;
private boolean allowUserInput;
private String cssClass;
private float currentRating;
private Form form;
/**
* Create a rating component with no title and a default explanation and hover
* texts. Use the setter methods to change the values. Use NULL values to
* disable texts (title, explanation, labels)
*
* @param name
* @param currentRating the current rating
* @param maxRating maximum number that can be rated
* @param allowUserInput
*/
public RatingComponent(String name, float currentRating, int maxRating, boolean allowUserInput) {
this(null, name, currentRating, maxRating, allowUserInput, null);
}
public RatingComponent(String id, String name, float currentRating, int maxRating, boolean allowUserInput, Form form) {
super(id, name);
if (currentRating > maxRating)
throw new AssertException("Current rating set to higher value::" + currentRating + " than the maxRating::" + maxRating);
this.allowUserInput = allowUserInput;
this.currentRating = currentRating;
// use default values for the other stuff
this.ratingLabels = new ArrayList<String>(maxRating);
for (int i = 0; i < maxRating; i++) {
// style: rating.5.3 => 3 out of 5
this.ratingLabels.add("rating." + maxRating + "."+ (i+1));
}
this.translateRatingLabels = true;
this.title = null;
this.translateTitle = true;
if (allowUserInput) this.explanation = "rating.explanation";
else this.explanation = null;
this.translateExplanation = true;
this.showRatingAsText = false;
this.form = form;
}
/**
* @see org.olat.core.gui.components.Component#doDispatchRequest(org.olat.core.gui.UserRequest)
*/
protected void doDispatchRequest(UserRequest ureq) {
setDirty(true);
String cmd = ureq.getParameter(VelocityContainer.COMMAND_ID);
try {
float rating = Float.parseFloat(cmd);
// update GUI
setCurrentRating(rating);
// notify listeners
Event event = new RatingEvent(rating);
fireEvent(ureq, event);
} catch (NumberFormatException e) {
log.error("Error while parsing rating value::" + cmd);
}
}
/**
* @see org.olat.core.gui.components.Component#getHTMLRendererSingleton()
*/
public ComponentRenderer getHTMLRendererSingleton() {
return RENDERER;
}
//
// Various getter and setter methods
//
Form getForm() {
return form;
}
// only package scope, used by renderer
List<String> getRatingLabel() {
return ratingLabels;
}
public String getRatingLabel(int position) {
if (position >= ratingLabels.size()) {
throw new AssertException("Can not get rating at position::" + position + " in rating array of size::" + ratingLabels.size() + " in component::" + getComponentName());
}
return ratingLabels.get(position);
}
public void setLevelLabel(int position, String ratingLabel) {
if (position >= ratingLabels.size()) {
throw new AssertException("Can not set rating at position::" + position + " in rating array of size::" + ratingLabels.size() + " in component::" + getComponentName());
}
this.ratingLabels.set(position, ratingLabel);
setDirty(true);
}
public boolean isTranslateRatingLabels() {
return translateRatingLabels;
}
public void setTranslateRatingLabels(boolean translateRatingLabels) {
this.translateRatingLabels = translateRatingLabels;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
setDirty(true);
}
public boolean isTranslateTitle() {
return translateTitle;
}
public void setTranslateTitle(boolean translateTitle) {
this.translateTitle = translateTitle;
}
public String getExplanation() {
return explanation;
}
public void setExplanation(String explanation) {
this.explanation = explanation;
setDirty(true);
}
public boolean isTranslateExplanation() {
return translateExplanation;
}
public void setTranslateExplanation(boolean translateExplanation) {
this.translateExplanation = translateExplanation;
}
public boolean isShowRatingAsText() {
return showRatingAsText;
}
public void setShowRatingAsText(boolean showRatingAsText) {
this.showRatingAsText = showRatingAsText;
}
public boolean isAllowUserInput() {
return allowUserInput;
}
public void setAllowUserInput(boolean allowUserInput) {
this.allowUserInput = allowUserInput;
setDirty(true);
}
public int getRatingSteps() {
return ratingLabels.size();
}
public String getCssClass() {
return cssClass;
}
public void setCssClass(String cssClass) {
this.cssClass = cssClass;
this.setDirty(true);
}
public float getCurrentRating() {
return currentRating;
}
public void setCurrentRating(float currentRating) {
this.currentRating = currentRating;
setDirty(true);
}
}