package kornell.gui.client.presentation.admin.courseversion.courseversion.wizard.edit; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import com.github.gwtbootstrap.client.ui.Button; import com.github.gwtbootstrap.client.ui.FileUpload; import com.github.gwtbootstrap.client.ui.Form; import com.github.gwtbootstrap.client.ui.TextBox; import com.github.gwtbootstrap.client.ui.constants.AlertType; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.dev.util.Name; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; 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.uibinder.client.UiHandler; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.Tree; import com.google.gwt.user.client.ui.TreeItem; 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.ContentSpec; import kornell.core.entity.CourseVersion; import kornell.gui.client.presentation.admin.courseversion.courseversion.AdminCourseVersionContentView; import kornell.gui.client.presentation.admin.courseversion.courseversion.AdminCourseVersionContentView.Presenter; import kornell.gui.client.presentation.admin.courseversion.courseversion.autobean.wizard.Wizard; import kornell.gui.client.presentation.admin.courseversion.courseversion.autobean.wizard.WizardElement; import kornell.gui.client.presentation.admin.courseversion.courseversion.autobean.wizard.WizardSlide; import kornell.gui.client.presentation.admin.courseversion.courseversion.autobean.wizard.WizardSlideItem; import kornell.gui.client.presentation.admin.courseversion.courseversion.autobean.wizard.WizardSlideItemType; import kornell.gui.client.presentation.admin.courseversion.courseversion.autobean.wizard.WizardTopic; import kornell.gui.client.presentation.admin.courseversion.courseversion.wizard.WizardUtils; import kornell.gui.client.util.forms.FormHelper; import kornell.gui.client.util.forms.formfield.KornellFormFieldWrapper; import kornell.gui.client.util.view.KornellNotification; import kornell.gui.client.util.view.LoadingPopup; public class WizardView extends Composite { interface MyUiBinder extends UiBinder<Widget, WizardView> { } private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); private EventBus bus; private KornellSession session; boolean isCurrentUser, showContactDetails, isRegisteredWithCPF; private FormHelper formHelper = GWT.create(FormHelper.class); private List<WizardSideItemLabel> sideItems; private HashMap<String, WizardSideItemLabel> sidePanelItemsMap; private static String HIGHLIGHT_CLASS = "highlightText"; private String PLAIN_CLASS = "plainDiscreteTextColor"; private KornellFormFieldWrapper name; private List<KornellFormFieldWrapper> fields; @UiField FlowPanel wizardPanel; @UiField FlowPanel sideWrapper; @UiField ScrollPanel sideItemsScroll; @UiField FlowPanel sidePanel; @UiField WizardSlideView wizardSlideView; @UiField Button btnNewTopic; @UiField Button btnNewSlide; @UiField Button btnNewSlideQuiz; private Wizard wizard; private CourseVersion courseVersion; private Presenter presenter; private String changedString = "(*) "; private Label selectedLabel; public WizardView(final KornellSession session, EventBus bus) { this.session = session; this.bus = bus; initWidget(uiBinder.createAndBindUi(this)); WizardUtils.createIcon(btnNewTopic, "fa-folder-open"); WizardUtils.createIcon(btnNewSlide, "fa-newspaper-o"); WizardUtils.createIcon(btnNewSlideQuiz, WizardUtils.getClasForWizardSlideItemViewIcon(WizardSlideItemType.QUIZ)); } public void init(CourseVersion courseVersion, Wizard wizard, Presenter presenter) { this.courseVersion = courseVersion; this.wizard = wizard; this.presenter = presenter; updateSidePanel(); wizardSlideView.setPresenter(presenter); wizardSlideView.updateSlidePanel(); createSlide(true); } @UiHandler("btnNewTopic") void doNewTopic(ClickEvent e) { if(WizardUtils.wizardElementHasValueChanged(presenter.getSelectedWizardElement())){ KornellNotification.show("Salve ou descarte as alterações antes de criar um novo tópico.", AlertType.WARNING); return; } WizardTopic wizardTopic = WizardUtils.newWizardTopic(); wizardTopic.setOrder(wizard.getWizardTopics().size()); wizard.getWizardTopics().add(wizardTopic); WizardElement prevWizardElement = WizardUtils.getPrevWizardElement(wizard, wizardTopic); if(prevWizardElement != null){ wizardTopic.setBackgroundURL(prevWizardElement.getBackgroundURL()); wizardTopic.getWizardSlides().get(0).setBackgroundURL(prevWizardElement.getBackgroundURL()); } presenter.wizardElementClicked(wizardTopic); } @UiHandler("btnNewSlide") void doNewSlide(ClickEvent e) { createSlide(false); } @UiHandler("btnNewSlideQuiz") void doNewSlideQuiz(ClickEvent e) { createSlide(true); } private void createSlide(boolean isQuiz) { if(WizardUtils.wizardElementHasValueChanged(presenter.getSelectedWizardElement())){ KornellNotification.show("Salve ou descarte as alterações antes de criar um novo slide.", AlertType.WARNING); return; } WizardSlide newWizardSlide = isQuiz ? WizardUtils.newWizardSlideQuiz() : WizardUtils.newWizardSlide(); WizardElement prevWizardElement; for (final WizardTopic wizardTopic : wizard.getWizardTopics()) { WizardElement selectedWizardElement = presenter.getSelectedWizardElement(); if(selectedWizardElement.getUUID().equals(wizardTopic.getUUID())){ newWizardSlide.setOrder(wizardTopic.getWizardSlides().size()); newWizardSlide.setParentOrder((wizardTopic.getOrder()+1)+""); wizardTopic.getWizardSlides().add(newWizardSlide); createNewSlide(newWizardSlide, wizardTopic); return; } int index = 0; for (final WizardSlide wizardSlide : wizardTopic.getWizardSlides()) { if(selectedWizardElement.getUUID().equals(wizardSlide.getUUID())){ newWizardSlide.setOrder(selectedWizardElement.getOrder()+1); newWizardSlide.setParentOrder((wizardTopic.getOrder()+1)+""); wizardTopic.getWizardSlides().add(index+1, newWizardSlide); for(int i = index+1; i < wizardTopic.getWizardSlides().size(); i++){ wizardTopic.getWizardSlides().get(i).setOrder(i); } createNewSlide(newWizardSlide, wizardTopic); return; } index++; } } } private void createNewSlide(WizardSlide newWizardSlide, final WizardTopic wizardTopic) { WizardElement prevWizardElement; prevWizardElement = WizardUtils.getPrevWizardElement(wizard, newWizardSlide); if(prevWizardElement != null){ newWizardSlide.setBackgroundURL(prevWizardElement.getBackgroundURL()); } newWizardSlide.setValueChanged(false); presenter.wizardElementClicked(newWizardSlide); } public void updateSidePanel() { sidePanel.clear(); sideItems = new ArrayList<WizardSideItemLabel>(); sidePanelItemsMap = new HashMap<String, WizardSideItemLabel>(); WizardElement selectedWizardElement = presenter.getSelectedWizardElement(); Tree tree = new Tree(); /*TreeItem topicTreeItxem = new TreeItem(new WizardSideItemLabel("Grand Parent", false, true)); root.addItem(new WizardSideItemLabel("Parent 1", true, true)); root.addItem(new WizardSideItemLabel("Parent 2", true, true)); TreeItem parent3 = root.addItem(new WizardSideItemLabel("Parent 3", true, true)); parent3.addItem(new WizardSideItemLabel("Parent 3.1", true, true)); parent3.addItem(new WizardSideItemLabel("Parent 3.2", true, true)); List<TreeItem> treeItems = new ArrayList<TreeItem>(); treeItems.add(tree.getItem(0)); int number = 1; while (!treeItems.isEmpty()) { TreeItem item = treeItems.remove(0); for (int i = 0; i < item.getChildCount(); i++) { treeItems.add(item.getChild(i)); } item.setState(true); } WizardSideItemLabel labelTopic, labelSlide; TreeItem topicTreeItem; if(selectedWizardElement != null){ for (final WizardTopic wizardTopic : wizard.getWizardTopics()) { labelTopic = createSidePanelItem(wizard, selectedWizardElement, null, wizardTopic); topicTreeItem = new TreeItem(labelTopic); for (final WizardSlide wizardSlide : wizardTopic.getWizardSlides()) { labelSlide = createSidePanelItem(wizard, selectedWizardElement, wizardTopic, wizardSlide); topicTreeItem.addItem(new TreeItem(labelSlide)); } tree.addItem(topicTreeItem); } for(int i = 0; i < tree.getItemCount(); i++){ } sidePanelItemsMap.get(selectedWizardElement.getUUID()).addStyleName("selected"); sidePanelItemsMap.get(selectedWizardElement.getUUID()).getElement().scrollIntoView(); } */ if(selectedWizardElement != null){ for (final WizardTopic wizardTopic : wizard.getWizardTopics()) { createSidePanelItem(wizard, selectedWizardElement, null, wizardTopic); for (final WizardSlide wizardSlide : wizardTopic.getWizardSlides()) { createSidePanelItem(wizard, selectedWizardElement, wizardTopic, wizardSlide); } } sidePanelItemsMap.get(selectedWizardElement.getUUID()).addStyleName("selected"); sidePanelItemsMap.get(selectedWizardElement.getUUID()).getElement().scrollIntoView(); } sidePanel.add(tree); } private WizardSideItemLabel createSidePanelItem(Wizard wizard, WizardElement selectedWizardElement, final WizardTopic parentWizardElement, WizardElement wizardElement) { final WizardSideItemLabel label = new WizardSideItemLabel("", false, false); label.addStyleName("sidePanelItem"); label.addClickHandler(new ClickHandler() { boolean enableClick = true; @Override public void onClick(ClickEvent event) { if(!enableClick || (selectedWizardElement != null && selectedWizardElement.getUUID().equals(wizardElement.getUUID()))){ return; } if(WizardUtils.wizardElementHasValueChanged(selectedWizardElement)){ KornellNotification.show("Salve ou descarte as alterações antes de trocar de slide.", AlertType.WARNING); return; } wizardSlideView.displaySlidePanel(false); LoadingPopup.show(); Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override public void execute() { for (Label lbl : sideItems) { lbl.removeStyleName("selected"); } label.addStyleName("selected"); setLabelContent(wizardElement, label); presenter.wizardElementClicked(wizardElement); } }); } }); if(parentWizardElement != null){ label.addStyleName("marginLeft25"); } label.getElement().setAttribute("data-wizard-element-uuid", wizardElement.getUUID()); setLabelContent(wizardElement, label); sidePanel.add(label); sideItems.add(label); return label; } private void setLabelContent(WizardElement wizardElement, final WizardSideItemLabel label) { String valueChanged = WizardUtils.wizardElementHasValueChanged(wizardElement) ? changedString : ""; String title = valueChanged + (wizardElement.getParentOrder() == null ? "Tópico " : ("Slide " + wizardElement.getParentOrder() + ".")) + (wizardElement.getOrder()+1); String labelText = span(title, HIGHLIGHT_CLASS) + separator(true) + span(wizardElement.getTitle(), PLAIN_CLASS); sidePanelItemsMap.put(wizardElement.getUUID(), label); label.getElement().setInnerHTML(labelText); } private String separator(boolean lineBreak) { return separator(lineBreak, false); } private String separator(boolean lineBreak, boolean dash) { return lineBreak ? "<br>" : (dash ? "  -  " : "   "); } private String span(String str, String className) { return "<span class=\""+className+"\">"+str+"</span>"; } public void toggleViewMode(boolean isViewModeOn) { this.sideWrapper.setVisible(!isViewModeOn); } public void displaySlidePanel(boolean display) { this.wizardSlideView.displaySlidePanel(display); } public void updateSlidePanel() { this.wizardSlideView.updateSlidePanel(); } public void refreshSlidePanel() { this.wizardSlideView.refreshForm(); } }