package kornell.gui.client.presentation.welcome.generic;
import java.util.ArrayList;
import java.util.List;
import com.github.gwtbootstrap.client.ui.constants.AlertType;
import com.github.gwtbootstrap.client.ui.constants.IconType;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.place.shared.PlaceChangeEvent;
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.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;
import com.google.web.bindery.event.shared.EventBus;
import kornell.api.client.Callback;
import kornell.api.client.KornellSession;
import kornell.core.entity.EnrollmentProgressDescription;
import kornell.core.to.CourseClassTO;
import kornell.core.to.CourseClassesTO;
import kornell.gui.client.ClientFactory;
import kornell.gui.client.KornellConstants;
import kornell.gui.client.ViewFactory;
import kornell.gui.client.event.CourseClassesFetchedEvent;
import kornell.gui.client.personnel.Student;
import kornell.gui.client.personnel.Teacher;
import kornell.gui.client.personnel.Teachers;
import kornell.gui.client.presentation.welcome.WelcomePlace;
import kornell.gui.client.presentation.welcome.WelcomeView;
import kornell.gui.client.util.view.KornellNotification;
public class GenericWelcomeView extends Composite implements WelcomeView {
interface MyUiBinder extends UiBinder<Widget, GenericWelcomeView> {
}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
@UiField
FlowPanel coursesWrapper;
@UiField
FlowPanel pnlCourses;
Button btnCoursesAll, btnCoursesInProgress, btnCoursesToStart, btnCoursesToAcquire, btnCoursesFinished;
private KornellSession session;
private PlaceController placeCtrl;
private ViewFactory viewFactory;
private EventBus bus;
private static KornellConstants constants = GWT.create(KornellConstants.class);
private Button selectedFilterButton;
private ArrayList<IsWidget> widgets;
private int classesCount;
public GenericWelcomeView(ClientFactory clientFactory) {
this.session = clientFactory.getKornellSession();
this.placeCtrl = clientFactory.getPlaceController();
this.viewFactory = clientFactory.getViewFactory();
this.bus = clientFactory.getEventBus();
initWidget(uiBinder.createAndBindUi(this));
coursesWrapper.setVisible(false);
initData();
bus.addHandler(PlaceChangeEvent.TYPE, new PlaceChangeEvent.Handler() {
@Override
public void onPlaceChange(PlaceChangeEvent event) {
if (event.getNewPlace() instanceof WelcomePlace) {
initData();
}
}
});
}
private void startPlaceBar() {
if (widgets == null) {
widgets = new ArrayList<IsWidget>();
btnCoursesFinished = startButton(constants.finished(), widgets);
btnCoursesToAcquire = startButton("DisponÃveis", widgets);
btnCoursesToStart = startButton(constants.toStart(), widgets);
btnCoursesInProgress = startButton(constants.inProgress(), widgets);
btnCoursesAll = startButton(constants.allClasses(), widgets);
selectedFilterButton = btnCoursesAll;
}
viewFactory.getMenuBarView().setPlaceBarWidgets(widgets);
}
private Button startButton(String text, List<IsWidget> widgets) {
Button button = new Button(text);
button.addStyleName("btnPlaceBar");
button.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
selectedFilterButton = (Button) event.getSource();
initData();
}
});
widgets.add(button);
return button;
}
private void initData() {
viewFactory.getMenuBarView().initPlaceBar(IconType.HOME, constants.homeTitle(), constants.homeDescription());
session.courseClasses().getCourseClassesTO(new Callback<CourseClassesTO>() {
@Override
public void ok(CourseClassesTO courseClassesTO) {
bus.fireEvent(new CourseClassesFetchedEvent(courseClassesTO));
startPlaceBar();
display(courseClassesTO);
}
});
}
private void display(final CourseClassesTO tos) {
pnlCourses.clear();
final int classesCount = tos.getCourseClasses().size();
if (classesCount == 0) {
coursesWrapper.setVisible(false);
KornellNotification.show(constants.noClassesAvailable(), AlertType.WARNING, 8000);
} else {
coursesWrapper.setVisible(true);
}
prepareButtons(classesCount);
prepareClassesPanel(tos);
}
private void prepareClassesPanel(final CourseClassesTO tos) {
classesCount = tos.getCourseClasses().size();
for (final CourseClassTO courseClassTO : tos.getCourseClasses()) {
if (courseClassTO.getCourseClass().isInvisible())
continue;
final Teacher teacher = Teachers.of(courseClassTO);
Student student = teacher.student(session.getCurrentUser());
addPanelIfFiltered(btnCoursesAll, courseClassTO);
if (student.isEnrolled()) {
EnrollmentProgressDescription description = student.getEnrollmentProgress().getDescription();
switch (description) {
case completed:
addPanelIfFiltered(btnCoursesFinished, courseClassTO);
break;
case inProgress:
addPanelIfFiltered(btnCoursesInProgress, courseClassTO);
break;
case notStarted:
addPanelIfFiltered(btnCoursesToStart, courseClassTO);
break;
}
} else {
addPanelIfFiltered(btnCoursesToAcquire, courseClassTO);
}
}
}
private void addPanelIfFiltered(Button button, CourseClassTO courseClassTO) {
if (button.equals(selectedFilterButton)) {
pnlCourses.add(new GenericCourseSummaryView(placeCtrl, courseClassTO, session));
}
if (classesCount > 3)
button.setVisible(true);
}
private void prepareButtons(int classesCount) {
refreshButtonSelection(btnCoursesAll);
refreshButtonSelection(btnCoursesInProgress);
refreshButtonSelection(btnCoursesToStart);
refreshButtonSelection(btnCoursesToAcquire);
refreshButtonSelection(btnCoursesFinished);
}
private void refreshButtonSelection(Button button) {
button.setVisible(false);
button.removeStyleName("btnAction");
button.addStyleName("btnNotSelected");
if (selectedFilterButton != null && selectedFilterButton.equals(button)) {
button.addStyleName("btnAction");
button.removeStyleName("btnNotSelected");
}
}
@Override
public void setPresenter(Presenter presenter) {
}
}