package kornell.scorm.client.scorm12;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.web.bindery.event.shared.EventBus;
import kornell.api.client.KornellSession;
import kornell.core.lom.Actom;
import kornell.core.lom.Contents;
import kornell.core.lom.ContentsOps;
import kornell.core.util.StringUtils;
import kornell.gui.client.event.ProgressEvent;
import kornell.gui.client.presentation.classroom.ClassroomPlace;
import kornell.gui.client.sequence.NavigationRequest;
import kornell.gui.client.sequence.Sequencer;
import kornell.gui.client.sequence.SimpleSequencer;
import kornell.gui.client.uidget.Uidget;
public class SCORM12Sequencer extends SimpleSequencer implements Sequencer {
private ClassroomPlace place;
private FlowPanel contentPanel;
private Uidget currentUidget;
private boolean isActive;
public SCORM12Sequencer(EventBus bus, KornellSession session) {
super(bus, session);
}
@Override
public void onContinue(NavigationRequest event) {
if (!isActive)
return;
currentIndex++;
paintCurrent();
}
private void makeCurrentVisible() {
currentUidget.setVisible(true);
}
@Override
public void onPrevious(NavigationRequest event) {
if (!isActive)
return;
currentIndex--;
paintCurrent();
}
@Override
public void onDirect(NavigationRequest event) {
launch(event.getDestination());
}
private void launch(String key) {
isActive = true;
currentIndex = StringUtils.isSome(key) ? lookupCurrentIndex(key) : 0;
currentActom = actoms.get(currentIndex);
paintCurrent();
}
@Override
public Sequencer withPanel(FlowPanel contentPanel) {
this.contentPanel = contentPanel;
return this;
}
@Override
public Sequencer withPlace(ClassroomPlace place) {
this.place = place;
setEnrollmentUUID(place.getEnrollmentUUID());
return this;
}
@Override
public void go(Contents contents) {
setContents(contents);
String currentKey = session.getItem(getBreadcrumbKey());
launch(currentKey);
}
private void paintCurrent() {
if (!isActive)
return;
if (contentPanel != null)
contentPanel.clear();
currentActom = actoms.get(currentIndex);
currentUidget = Uidget.forActom(currentActom);
currentUidget.setVisible(false);
contentPanel.add(currentUidget);
dropBreadcrumb();
makeCurrentVisible();
}
private void setContents(Contents contents) {
this.actoms = ContentsOps.collectActoms(contents);
}
@Override
public void stop() {
isActive = false;
contentPanel.clear();
}
// TODO: Smell - Activity Bar shows only after this fires.
@Override
public void fireProgressEvent() {
if (actoms == null)
return;
int pagesVisitedCount = 0;
int totalPages = actoms.size();
for (Actom actom : actoms) {
if (actom.isVisited()) {
pagesVisitedCount++;
continue;
}
break;
}
ProgressEvent progressEvent = new ProgressEvent();
progressEvent.setCurrentPage(currentIndex + 1);
progressEvent.setTotalPages(totalPages);
progressEvent.setPagesVisitedCount(pagesVisitedCount);
progressEvent.setEnrollmentUUID(place.getEnrollmentUUID());
bus.fireEvent(progressEvent);
}
}