/**********************************************************************************
* $URL: $
* $Id: $
***********************************************************************************
*
* Author: Eric Jeney, jeney@rutgers.edu
*
* Copyright (c) 2010 Rutgers, the State University of New Jersey
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package org.sakaiproject.lessonbuildertool.tool.producers;
import java.util.ArrayList;
import java.util.List;
import org.sakaiproject.util.FormattedText;
import org.sakaiproject.lessonbuildertool.SimplePage;
import org.sakaiproject.lessonbuildertool.SimplePageItem;
import org.sakaiproject.lessonbuildertool.model.SimplePageToolDao;
import org.sakaiproject.lessonbuildertool.tool.beans.SimplePageBean;
import org.sakaiproject.lessonbuildertool.tool.beans.SimplePageBean.Status;
import org.sakaiproject.lessonbuildertool.tool.view.GeneralViewParameters;
import org.sakaiproject.tool.cover.SessionManager;
import org.sakaiproject.tool.api.ToolSession;
import uk.org.ponder.messageutil.MessageLocator;
import uk.org.ponder.localeutil.LocaleGetter;
import uk.org.ponder.rsf.components.UIBranchContainer;
import uk.org.ponder.rsf.components.UICommand;
import uk.org.ponder.rsf.components.UIInternalLink;
import uk.org.ponder.rsf.components.UIContainer;
import uk.org.ponder.rsf.components.UIForm;
import uk.org.ponder.rsf.components.UIInput;
import uk.org.ponder.rsf.components.UIOutput;
import uk.org.ponder.rsf.components.UIComponent;
import uk.org.ponder.rsf.components.decorators.UIFreeAttributeDecorator;
import uk.org.ponder.rsf.flow.jsfnav.NavigationCase;
import uk.org.ponder.rsf.flow.jsfnav.NavigationCaseReporter;
import uk.org.ponder.rsf.view.ComponentChecker;
import uk.org.ponder.rsf.view.ViewComponentProducer;
import uk.org.ponder.rsf.viewstate.SimpleViewParameters;
import uk.org.ponder.rsf.viewstate.ViewParameters;
import uk.org.ponder.rsf.viewstate.ViewParamsReporter;
/**
* Uses the Fluid reorderer to reorder elements on the page.
*
* @author Eric Jeney <jeney@rutgers.edu>
*
*/
public class ReorderProducer implements ViewComponentProducer, NavigationCaseReporter, ViewParamsReporter {
private SimplePageBean simplePageBean;
private SimplePageToolDao simplePageToolDao;
private ShowPageProducer showPageProducer;
public MessageLocator messageLocator;
public LocaleGetter localeGetter;
public static final String VIEW_ID = "Reorder";
public String getViewID() {
return VIEW_ID;
}
public void fillComponents(UIContainer tofill, ViewParameters params, ComponentChecker checker) {
if (((GeneralViewParameters) params).getSendingPage() != -1) {
// will fail if page not in this site
// security then depends upon making sure that we only deal with this page
try {
simplePageBean.updatePageObject(((GeneralViewParameters) params).getSendingPage());
} catch (Exception e) {
System.out.println("Reorder permission exception " + e);
return;
}
}
UIOutput.make(tofill, "html").decorate(new UIFreeAttributeDecorator("lang", localeGetter.get().getLanguage()))
.decorate(new UIFreeAttributeDecorator("xml:lang", localeGetter.get().getLanguage()));
ToolSession toolSession = SessionManager.getCurrentToolSession();
String secondPageString = (String)toolSession.getAttribute("lessonbuilder.selectedpage");
Long secondPageId = null;
if (secondPageString != null)
secondPageId = Long.parseLong(secondPageString);
toolSession.setAttribute("lessonbuilder.selectedpage", null);
// may have been updated by sendingpage
SimplePage currentPage = simplePageBean.getCurrentPage();
// doesn't use any item parameters, so this should be safe
if (simplePageBean.canEditPage()) {
// make sure the order is right
simplePageBean.fixorder();
SimplePage page = simplePageBean.getCurrentPage();
List<SimplePageItem> items = simplePageToolDao.findItemsOnPage(page.getPageId());
SimplePage secondPage = null;
if (secondPageId != null)
secondPage = simplePageBean.getPage(secondPageId);
// are they hacking us? other page should be in the same site, or tests fail
// The tests here will handle student pages, but the UI doesn't actually present them.
if (secondPage != null && !secondPage.getSiteId().equals(page.getSiteId()))
secondPage = null;
if (secondPage != null) {
if (!simplePageToolDao.canEditPage(secondPageId))
secondPage = null;
}
// Some items are tacked onto the end automatically by setting the sequence to
// something less than or equal to 0. This takes them out of the Reorder tool.
while(items.size() > 0 && items.get(0).getSequence() <= 0) {
items.remove(0);
}
if (secondPage != null) {
List<SimplePageItem> moreItems = simplePageToolDao.findItemsOnPage(secondPageId);
if (moreItems != null && moreItems.size() > 0) {
items.add(null); //marker
while(moreItems.size() > 0 && moreItems.get(0).getSequence() <= 0) {
moreItems.remove(0);
}
items.addAll(moreItems);
}
} else
items.add(null); // if no 2nd page, put marker at the end
UIOutput.make(tofill, "intro", messageLocator.getMessage("simplepage.reorder_header"));
UIOutput.make(tofill, "instructions", messageLocator.getMessage("simplepage.reorder_instructions"));
UIOutput.make(tofill, "itemTable");
boolean second = false;
for (SimplePageItem i : items) {
if (i == null) {
// marker between used and not used
UIContainer row = UIBranchContainer.make(tofill, "item:");
UIOutput.make(row, "seq", "---").decorate(new UIFreeAttributeDecorator("class", "marker"));
UIOutput.make(row, "text-snippet", messageLocator.getMessage(secondPageId == null ? "simplepage.reorder-belowdelete" : "simplepage.reorder-aboveuse"));
second = true;
continue;
}
if (i.getType() == 7) {
i.setType(1); // Temporarily change multimedia to standard resource
// so that links work properly.
}
UIContainer row = UIBranchContainer.make(tofill, "item:");
// * prefix indicates items are from the other page, and have to be copied.
UIOutput.make(row, "seq", (second ? "*" : "") +
String.valueOf(i.getSequence()));
if (i.getType() == 5) {
String text = FormattedText.convertFormattedTextToPlaintext(i.getHtml());
if (text.length() > 100)
text = text.substring(0,100);
UIOutput.make(row, "text-snippet", text);
} else if (i.getType() == SimplePageItem.QUESTION) {
String text = i.getAttribute("questionText");
if (text == null)
text = messageLocator.getMessage("simplepage.questionName");
if (text.length() > 100)
text = text.substring(0,100);
UIOutput.make(row, "text-snippet", text);
} else {
UIOutput.make(row, "description", i.getDescription());
showPageProducer.makeLink(row, "link", i, simplePageBean, simplePageToolDao, messageLocator, true, currentPage, false, Status.NOT_REQUIRED);
}
UIComponent del = UIOutput.make(row, "dellink").decorate(new UIFreeAttributeDecorator("alt", messageLocator.getMessage("simplepage.delete")));
if (second)
del.decorate(new UIFreeAttributeDecorator("style", "display:block"));
}
// don't offer to add from other page if we already have second page items
// our bookkeeping can't keep track of more than one extra page
if(currentPage.getOwner() == null && secondPageId == null) {
GeneralViewParameters view = new GeneralViewParameters(PagePickerProducer.VIEW_ID);
view.setReturnView("reorder"); // flag to pagepicker that it needs to come back
UIOutput.make(tofill, "subpage-div");
UIInternalLink.make(tofill, "subpage-choose", messageLocator.getMessage("simplepage.reorder-addpage"), view);
view.setSendingPage(currentPage.getPageId());
}
UIForm form = UIForm.make(tofill, "form");
if (secondPageId != null)
UIInput.make(form, "otherpage", "#{simplePageBean.selectedEntity}", secondPageId.toString());
UIInput.make(form, "order", "#{simplePageBean.order}");
UICommand.make(form, "save", messageLocator.getMessage("simplepage.save_message"), "#{simplePageBean.reorder}");
UICommand.make(form, "cancel", messageLocator.getMessage("simplepage.cancel_message"), "#{simplePageBean.cancel}");
}
}
public void setSimplePageBean(SimplePageBean simplePageBean) {
this.simplePageBean = simplePageBean;
}
public void setSimplePageToolDao(SimplePageToolDao simplePageToolDao) {
this.simplePageToolDao = simplePageToolDao;
}
public void setShowPageProducer(ShowPageProducer p) {
this.showPageProducer = p;
}
public ViewParameters getViewParameters() {
return new GeneralViewParameters();
}
public List reportNavigationCases() {
List<NavigationCase> togo = new ArrayList<NavigationCase>();
togo.add(new NavigationCase(null, new SimpleViewParameters(ShowPageProducer.VIEW_ID)));
togo.add(new NavigationCase("success", new SimpleViewParameters(ReloadPageProducer.VIEW_ID)));
togo.add(new NavigationCase("cancel", new SimpleViewParameters(ShowPageProducer.VIEW_ID)));
return togo;
}
}