package kornell.gui.client.presentation.bar.generic; import com.google.gwt.core.client.GWT; import com.google.gwt.place.shared.Place; import com.google.gwt.place.shared.PlaceChangeEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; 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.ScrollPanel; import com.google.gwt.user.client.ui.Widget; import kornell.api.client.KornellSession; import kornell.core.entity.EnrollmentState; import kornell.gui.client.ClientFactory; import kornell.gui.client.event.HideSouthBarEvent; import kornell.gui.client.event.HideSouthBarEventHandler; import kornell.gui.client.presentation.admin.AdminPlace; import kornell.gui.client.presentation.bar.ActivityBarView; import kornell.gui.client.presentation.bar.AdminBarView; import kornell.gui.client.presentation.bar.SouthBarView; import kornell.gui.client.presentation.classroom.ClassroomPlace; import kornell.gui.client.util.easing.Ease; import kornell.gui.client.util.easing.Transitions; import kornell.gui.client.util.easing.Updater; import kornell.gui.client.util.view.Positioning; public class GenericSouthBarView extends Composite implements SouthBarView, HideSouthBarEventHandler { interface MyUiBinder extends UiBinder<Widget, GenericSouthBarView> { } private static final int NO_SOUTH_BAR = 0; private static final int ACTIVITY_BAR = 1; private static final int ADMIN_BAR = 2; private int currentSouthBar = 0; private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); IsWidget barView = null; private AdminBarView adminBarView; @UiField FlowPanel southBar; private ClientFactory clientFactory; private ScrollPanel scrollPanel; private KornellSession session; public GenericSouthBarView(final ClientFactory clientFactory, ScrollPanel scrollPanel) { this.clientFactory = clientFactory; clientFactory.getEventBus().addHandler(HideSouthBarEvent.TYPE,this); initWidget(uiBinder.createAndBindUi(this)); this.scrollPanel = scrollPanel; this.session = clientFactory.getKornellSession(); pickSouthBar(clientFactory.getPlaceController().getWhere()); clientFactory.getEventBus().addHandler(PlaceChangeEvent.TYPE, new PlaceChangeEvent.Handler() { @Override public void onPlaceChange(PlaceChangeEvent event) { Place newPlace = event.getNewPlace(); pickSouthBar(newPlace); } }); } private void pickSouthBar(final Place newPlace) { if(newPlace instanceof AdminPlace && clientFactory.getKornellSession().isInstitutionAdmin()){ if(currentSouthBar != ADMIN_BAR){ currentSouthBar = ADMIN_BAR; barView = getAdminBarView(newPlace); showSouthBar(barView); } } else if (newPlace instanceof ClassroomPlace && session.getCurrentCourseClass() != null && session.getCurrentCourseClass().getEnrollment() != null && EnrollmentState.enrolled.equals(session.getCurrentCourseClass().getEnrollment().getState()) && session.getCurrentCourseClass().getCourseVersionTO().getCourseVersion().getParentVersionUUID() == null) { if(currentSouthBar != ACTIVITY_BAR){ currentSouthBar = ACTIVITY_BAR; barView = getActivityBarView(); showSouthBar(barView); } } else { if(currentSouthBar != NO_SOUTH_BAR){ currentSouthBar = NO_SOUTH_BAR; hideSouthBar(barView); } } } private void hideSouthBar(final IsWidget barView){ scrollPanel.removeStyleName("offsetSouthBar"); if(barView == null){ setVisible(false); return; } barView.asWidget().getElement().getStyle().setProperty("bottom", "0px"); Ease.out(Transitions.QUAD, new Updater() { @Override public void update(double progress) { int position = -((int) (Positioning.SOUTH_BAR * progress)); barView.asWidget().getElement().getStyle().setProperty("bottom", position + "px"); if(position == -Positioning.SOUTH_BAR){ setVisible(false); } } }).run(Positioning.BAR_ANIMATION_LENGTH); } private void showSouthBar(final IsWidget barView){ southBar.clear(); barView.asWidget().getElement().getStyle().setProperty("bottom", (Positioning.SOUTH_BAR * -1) + "px"); southBar.add(barView); this.setVisible(true); Ease.out(Transitions.QUAD, new Updater() { @Override public void update(double progress) { int position = ((int) (Positioning.SOUTH_BAR * progress)) - Positioning.SOUTH_BAR; barView.asWidget().getElement().getStyle().setProperty("bottom", position + "px"); } }).run(Positioning.BAR_ANIMATION_LENGTH); scrollPanel.addStyleName("offsetSouthBar"); } private ActivityBarView getActivityBarView() { return new GenericActivityBarView(clientFactory); } private AdminBarView getAdminBarView(Place newPlace) { if (adminBarView == null) adminBarView = new GenericAdminBarView(clientFactory); return adminBarView; } @Override public void setPresenter(Presenter presenter) { } @Override public void onHideSouthBar(HideSouthBarEvent event) { pickSouthBar(clientFactory.getPlaceController().getWhere()); } }