/**
* <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.segmentedview;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.AbstractComponent;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.ComponentRenderer;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Event;
public class SegmentViewComponent extends AbstractComponent {
private boolean reselect;
private boolean allowNoSelection;
private boolean allowMultipleSelection;
private final Set<Component> selectedSegments = new HashSet<Component>();
private final List<Component> segments = new ArrayList<Component>();
private final static SegmentViewRenderer RENDERER = new SegmentViewRenderer();
public SegmentViewComponent(String name) {
super(name);
}
public boolean isAllowMultipleSelection() {
return allowMultipleSelection;
}
public void setAllowMultipleSelection(boolean allowMultipleSelection) {
this.allowMultipleSelection = allowMultipleSelection;
}
public boolean isAllowNoSelection() {
return allowNoSelection;
}
public void setAllowNoSelection(boolean allowNoSelection) {
this.allowNoSelection = allowNoSelection;
}
public boolean isReselect() {
return reselect;
}
/**
* If a segment is selectable and clicked, send
* a select event. Default is false.
* @param reselect
*/
public void setReselect(boolean reselect) {
this.reselect = reselect;
}
public boolean isEmpty() {
return segments.isEmpty();
}
public List<Component> getSegments() {
return segments;
}
public void setSegments(List<Link> links) {
segments.clear();
selectedSegments.clear();
segments.addAll(links);
setDirty(true);
}
public void addSegment(Link link) {
segments.add(link);
setDirty(true);
}
public void addSegment(Link link, boolean selected) {
if(selected) {
link.setCustomEnabledLinkCSS("btn btn-primary");
} else {
link.setCustomEnabledLinkCSS("btn btn-default");
}
segments.add(link);
if(selected) {
selectedSegments.add(link);
} else {
selectedSegments.remove(link);
}
setDirty(true);
}
public void removeSegment(String name) {
for(Iterator<Component> it=segments.iterator(); it.hasNext(); ) {
Component segment = it.next();
if(name.equals(segment.getComponentName())) {
it.remove();
selectedSegments.remove(segment);
setDirty(true);
}
}
}
public void removeSegment(Component cmp) {
for(Iterator<Component> it=segments.iterator(); it.hasNext(); ) {
Component segment = it.next();
if(cmp == segment) {
it.remove();
selectedSegments.remove(segment);
setDirty(true);
}
}
}
public boolean isSelected(Component component) {
return selectedSegments.contains(component);
}
public void select(Component component) {
if(segments.contains(component)) {
if(!isAllowMultipleSelection()) {
deselectAllSegments();
}
selectSegment(component);
setDirty(true);
}
}
@Override
protected void doDispatchRequest(UserRequest ureq) {
Event e = null;
String cmd = ureq.getParameter(VelocityContainer.COMMAND_ID);
int count = 0;
for(Component segment:segments) {
if(segment.getComponentName().equals(cmd)) {
boolean selected = selectedSegments.contains(segment);
if(selected) {
if(isAllowNoSelection() || selectedSegments.size() > 1) {
e = new SegmentViewEvent(SegmentViewEvent.DESELECTION_EVENT, segment.getComponentName(), count);
selectedSegments.remove(segment);
} else if(isReselect()) {
e = new SegmentViewEvent(SegmentViewEvent.SELECTION_EVENT, segment.getComponentName(), count);
}
} else {
if(!isAllowMultipleSelection()) {
deselectAllSegments();
}
e = new SegmentViewEvent(SegmentViewEvent.SELECTION_EVENT, segment.getComponentName(), count);
selectSegment(segment);
}
break;
}
count++;
}
if(e != null) {
setDirty(true);
fireEvent(ureq, e);
}
}
private void selectSegment(Component segment) {
if(segment instanceof Link) {
((Link)segment).setCustomEnabledLinkCSS("btn btn-primary");
}
selectedSegments.add(segment);
}
private void deselectAllSegments() {
for(Component segment:selectedSegments) {
if(segment instanceof Link) {
((Link)segment).setCustomEnabledLinkCSS("btn btn-default");
}
}
selectedSegments.clear();
}
@Override
public ComponentRenderer getHTMLRendererSingleton() {
return RENDERER;
}
}