package kornell.gui.client.presentation.classroom.generic.details; import static kornell.core.util.StringUtils.mkurl; import java.util.ArrayList; import java.util.List; import com.github.gwtbootstrap.client.ui.Collapse; import com.github.gwtbootstrap.client.ui.CollapseTrigger; import com.github.gwtbootstrap.client.ui.FluidRow; import com.github.gwtbootstrap.client.ui.event.HideEvent; import com.github.gwtbootstrap.client.ui.event.HideHandler; import com.github.gwtbootstrap.client.ui.event.ShowEvent; import com.github.gwtbootstrap.client.ui.event.ShowHandler; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.place.shared.PlaceController; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; import com.google.web.bindery.event.shared.EventBus; import kornell.api.client.KornellClient; import kornell.api.client.KornellSession; import kornell.core.entity.CourseClassState; import kornell.core.entity.Enrollment; import kornell.core.entity.EnrollmentState; import kornell.core.lom.Content; import kornell.core.lom.ContentFormat; import kornell.core.lom.ExternalPage; import kornell.core.lom.Topic; import kornell.core.to.CourseClassTO; import kornell.gui.client.util.ClientConstants; public class GenericTopicView extends Composite { interface MyUiBinder extends UiBinder<Widget, GenericTopicView> { } private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); private PlaceController placeCtrl; private EventBus bus; private String IMAGES_PATH = mkurl(ClientConstants.IMAGES_PATH, "courseDetails"); private Content content; private KornellSession session; private CourseClassTO currentCourse; private int index; private boolean enableAnchorOnFirstChild; @UiField CollapseTrigger trigger; @UiField FlowPanel topicWrapper; @UiField FlowPanel topicPanel; @UiField Image topicIcon; @UiField Label lblTopic; @UiField Collapse collapse; @UiField FluidRow childrenPanel; public GenericTopicView(EventBus eventBus, KornellClient client, PlaceController placeCtrl, KornellSession session, CourseClassTO currentCourse, Content content, int index, boolean enableAnchorOnFirstChild) { this.bus = eventBus; this.placeCtrl = placeCtrl; this.session = session; this.content = content; this.currentCourse = currentCourse; this.index = index; this.enableAnchorOnFirstChild = enableAnchorOnFirstChild; initWidget(uiBinder.createAndBindUi(this)); collapse.addShowHandler(new ShowHandler() { @Override public void onShow(ShowEvent showEvent) { updateIconURL(true); } }); collapse.addHideHandler(new HideHandler() { @Override public void onHide(HideEvent hideEvent) { updateIconURL(false); } }); Timer timer = new Timer() { public void run() { display(); } }; timer.schedule(500); } public void show(final boolean show){ Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override public void execute() { if(show) collapse.show(); else collapse.hide(); } }); } private void display() { trigger.setTarget("#toggle" + index); collapse.setId("toggle" + index); updateIconURL(false); String topicName = "???Topic???"; Topic topic = content.getTopic(); List<Content> children = new ArrayList<Content>(); if (ContentFormat.Topic.equals(content.getFormat())) { topicName = topic.getName(); children = topic.getChildren(); } lblTopic.setText(topicName); ExternalPage page; int childrenIndex = 0; for (Content contentItem : children) { page = contentItem.getExternalPage(); if (!page.getTitle().startsWith("###")) { // TODO MDA Enrollment enrollment = currentCourse != null? currentCourse.getEnrollment() : null; EnrollmentState state = enrollment != null ? enrollment.getState() : null; boolean enableAnchor = (page.isVisited() || (childrenIndex == 0 && enableAnchorOnFirstChild)) && EnrollmentState.enrolled.equals(state) && !CourseClassState.inactive.equals(currentCourse.getCourseClass().getState()); childrenPanel.add(new GenericPageView(bus, session, placeCtrl, page, currentCourse, enableAnchor)); } childrenIndex++; } if (childrenPanel.getWidgetCount() > 0) { this.addStyleName("cursorPointer"); } else { topicIcon.addStyleName("shy"); this.addStyleName("cursorDefault"); } topicWrapper.removeStyleName("shy"); } private void updateIconURL(boolean isOpened) { if(isOpened) topicIcon.setUrl(mkurl(IMAGES_PATH, "topic-expanded.png")); else topicIcon.setUrl(mkurl(IMAGES_PATH, "topic-contracted.png")); } }