libreccm-legacy/ccm-cms/src/com/arsdigita/cms/ui/ItemSearchCreateItemPane.java

454 lines
20 KiB
Java

/*
* Copyright (C) 2011-2013 University of Bremen. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms.ui;
import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.FormData;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.Link;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.ParameterSingleSelectionModel;
import com.arsdigita.bebop.SegmentedPanel;
import com.arsdigita.bebop.SegmentedPanel.Segment;
import com.arsdigita.bebop.SingleSelectionModel;
import com.arsdigita.bebop.event.FormInitListener;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.event.FormSubmissionListener;
import com.arsdigita.bebop.event.PrintEvent;
import com.arsdigita.bebop.event.PrintListener;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ContentPage;
import com.arsdigita.cms.ContentSection;
import com.arsdigita.cms.ui.authoring.CreationSelector;
import com.arsdigita.cms.ui.authoring.NewItemForm;
import com.arsdigita.cms.ui.folder.FlatFolderPicker;
import com.arsdigita.cms.ui.folder.FolderSelectionModel;
import com.arsdigita.cms.ui.item.ContentItemRequestLocal;
import com.arsdigita.cms.util.GlobalizationUtil;
import com.arsdigita.persistence.OID;
import java.math.BigDecimal;
/**
*
* @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de>
* @author Jens Pelzetter <jens@jp-digital.de>
*/
class ItemSearchCreateItemPane extends CMSContainer
implements FormInitListener,
FormProcessListener,
FormSubmissionListener {
public static final String WIDGET_PARAM = "widget";
public static final String SEARCHWIDGET_PARAM = "searchWidget";
public static final String PUBLISHWIDGET_PARAM = "publishWidget";
private static final String CONTENT_TYPE_ID = "ct";
private static final String FOLDER_ID = "folder_id";
private static final String FLAT_FOLDER = "flatFolder";
private final SingleSelectionModel m_typeSel;
private String defaultFolder;
private boolean editAfterCreate = true;
private final ContentItemRequestLocal m_contentItem = new ContentItemRequestLocal() {
};
//private final Link m_selectCloseLink;
//private final Link m_selectEditLink;
// private final Link m_fallBackLink;
private Link m_fallBackLink;
// private final SegmentedPanel m_segPanel;
private SegmentedPanel m_segPanel;
// private final Segment m_creationSeg;
private Segment m_creationSeg;
// private final Segment m_newItemSeg;
private Segment m_newItemSeg;
private final Segment m_linkSeg = new Segment();
private final NewItemForm m_newItem = new SectionNewItemForm("newItem");
// private final SingleSelectionModel m_model;
private SingleSelectionModel m_model;
private final FolderSelectionModel m_folderSel; // To support legacy UI code
// private FolderSelectionModel m_folderSel; // To support legacy UI code
// private final CreationSelector m_creator;
private CreationSelector m_creator;
private final FlatFolderPicker m_folderPicker = new FlatFolderPicker(FLAT_FOLDER);
// ////////////////////////////////////////////////////////////////////////
//
// Quick 'nd Dirty interims solution
//
// While migrating the CMS pages from legacy dispatcher code to
// to new style, legacy free, servlet based pages we need two constructors.
// As soon as the migration is completed, the legacy tainted constructor
// has to be removed and the init() code can be part of the constructor
// again.
//
// ////////////////////////////////////////////////////////////////////////
/**
*
* @param parent
*/
public ItemSearchCreateItemPane(final ItemSearchPage parent) {
super();
m_folderSel = new FolderSelectionModel(m_model);
m_typeSel = new ParameterSingleSelectionModel(new BigDecimalParameter(CONTENT_TYPE_ID));
init();
}
/**
*
* @param parent
*/
public ItemSearchCreateItemPane(final CMSItemSearchPage parent) {
super();
m_folderSel = new FolderSelectionModel(m_model);
m_typeSel = new ParameterSingleSelectionModel(new BigDecimalParameter(CONTENT_TYPE_ID));
init();
}
/**
* Private service method to initialize all the instance properties.
* Used by constructors as a temporarly measure to be able to provide
* two constructors.
* Should be removed when migration completed (cf. note above).
*/
private void init() {
m_segPanel = new SegmentedPanel("itemSearchCreate");
m_creationSeg = new Segment();
m_newItemSeg = new Segment();
// m_linkSeg = new Segment();
// m_newItem = new SectionNewItemForm("newItem");
m_model = new ParameterSingleSelectionModel(new BigDecimalParameter(FOLDER_ID));
// m_folderSel = new FolderSelectionModel(m_model);
this.setIdAttr("folder-new-item");
// m_typeSel = new ParameterSingleSelectionModel(new BigDecimalParameter(CONTENT_TYPE_ID));
m_creator = new CreationSelector(m_typeSel, m_folderSel) {
@Override
public void editItem(final PageState state, final ContentItem item) {
m_creationSeg.setVisible(state, false);
m_linkSeg.setVisible(state, true);
m_contentItem.set(state, item);
}
};
m_creationSeg.add(m_creator);
m_creationSeg.add(new Label("<br/>", false));
final BoxPanel folderRow = new BoxPanel(BoxPanel.HORIZONTAL);
folderRow.add(new Label(GlobalizationUtil.globalize(
"cms.ui.item_search.create.folder_select")));
// m_folderPicker = new FlatFolderPicker(FLAT_FOLDER);
folderRow.add(m_folderPicker);
m_newItem.add(folderRow);
m_newItemSeg.add(m_newItem);
m_newItem.addInitListener(this);
m_newItem.addProcessListener(this);
m_newItem.addSubmissionListener(this);
m_segPanel.add(m_newItemSeg);
m_segPanel.add(m_creationSeg);
add(m_segPanel);
m_fallBackLink = new Link(
(String) GlobalizationUtil.globalize("cms.ui.search.create.fallback").localize(),
new PrintListener() {
public void prepare(final PrintEvent event) {
final Link target = (Link) event.getTarget();
final PageState state = event.getPageState();
final ContentItem item = m_contentItem.getContentItem(state);
final String title;
if (item instanceof ContentPage) {
title = ((ContentPage) item).getTitle();
} else {
title = item.getName();
}
final String widget = (String) state.getValue(new StringParameter(WIDGET_PARAM));
final String searchWidget = (String) state.getValue(new StringParameter(SEARCHWIDGET_PARAM));
final String publishWidget = (String) state.getValue(new StringParameter(PUBLISHWIDGET_PARAM));
final String scriptAction;
if (editAfterCreate) {
((Label) target.getChild()).setLabel((String) GlobalizationUtil.globalize(
"cms.ui.search.create.select_edit").localize());
final ContentSection section = item.getContentSection();
final String nodeURL = section.getPath() + "/";
final String linkTarget = ContentItemPage.getItemURL(nodeURL, item.getID(),
ContentItemPage.AUTHORING_TAB, true);
target.setTarget(linkTarget);
scriptAction = "";
} else {
((Label) target.getChild()).setLabel((String) GlobalizationUtil.globalize(
"cms.ui.search.create.select_close").localize());
scriptAction = "self.close();\n"
+ "return false;";
}
target.setOnClick(String.format("window.opener.document.%s.value=\"%s\";"
+ "window.opener.document.%s.value=\"%s\";"
+ "window.opener.document.%s.value=\"%s\";"
+ "%s",
widget,
item.getID().toString(),
searchWidget,
title,
publishWidget,
Boolean.TRUE.toString(),
scriptAction));
}
});
// m_selectCloseLink = new Link(
// (String) GlobalizationUtil.globalize("cms.ui.search.create.select_close").localize(),
// new PrintListener() {
//
// public void prepare(final PrintEvent event) {
// final Link target = (Link) event.getTarget();
// final PageState state = event.getPageState();
//
// final ContentItem item = m_contentItem.getContentItem(state);
// final String title;
// if (item instanceof ContentPage) {
// title = ((ContentPage) item).getTitle();
// } else {
// title = item.getName();
// }
//
// final String widget = (String) state.getValue(new StringParameter(WIDGET_PARAM));
// final String searchWidget = (String) state.getValue(new StringParameter(SEARCHWIDGET_PARAM));
// final String publishWidget = (String) state.getValue(new StringParameter(PUBLISHWIDGET_PARAM));
//
// target.setOnClick(String.format("window.opener.document.%s.value=\"%s\";"
// + "window.opener.document.%s.value=\"%s\";"
// + "window.opener.document.%s.value=\"%s\";"
// + "self.close();"
// + "return false;",
// widget,
// item.getID().toString(),
// searchWidget,
// title,
// publishWidget,
// Boolean.TRUE.toString()));
// }
//
// });
//
// m_selectEditLink = new Link((String) GlobalizationUtil.globalize("cms.ui.search.create.select_edit").localize(),
// new PrintListener() {
//
// public void prepare(final PrintEvent event) {
// final Link target = (Link) event.getTarget();
// final PageState state = event.getPageState();
//
// final ContentItem item = m_contentItem.getContentItem(state);
// final String title;
// if (item instanceof ContentPage) {
// title = ((ContentPage) item).getTitle();
// } else {
// title = item.getName();
// }
//
//
// final String widget = (String) state.getValue(new StringParameter(WIDGET_PARAM));
// final String searchWidget = (String) state.getValue(new StringParameter(SEARCHWIDGET_PARAM));
// final String publishWidget = (String) state.getValue(new StringParameter(PUBLISHWIDGET_PARAM));
//
// final ContentSection section = item.getContentSection();
// final String nodeURL = section.getPath() + "/";
// final String linkTarget = ContentItemPage.getItemURL(nodeURL, item.getID(),
// ContentItemPage.AUTHORING_TAB, true);
// target.setTarget(linkTarget);
// target.setOnClick(String.format("window.opener.document.%s.value=\"%s\";"
// + "window.opener.document.%s.value=\"%s\";"
// + "window.opener.document.%s.value=\"%s\";",
// widget,
// item.getID().toString(),
// searchWidget,
// title,
// publishWidget,
// Boolean.TRUE.toString()));
//
// }
//
// });
final BoxPanel linkPanel = new BoxPanel(BoxPanel.VERTICAL);
final Label jsLabel = new Label("", false);
jsLabel.addPrintListener(new PrintListener() {
public void prepare(final PrintEvent event) {
final Label target = (Label) event.getTarget();
final PageState state = event.getPageState();
final ContentItem item = m_contentItem.getContentItem(state);
final String title;
if (item instanceof ContentPage) {
title = ((ContentPage) item).getTitle();
} else {
title = item.getName();
}
final String widget = (String) state.getValue(new StringParameter(WIDGET_PARAM));
final String searchWidget = (String) state.getValue(new StringParameter(SEARCHWIDGET_PARAM));
final String publishWidget = (String) state.getValue(new StringParameter(PUBLISHWIDGET_PARAM));
final String scriptAction;
if (editAfterCreate) {
final ContentSection section = item.getContentSection();
final String nodeURL = section.getPath() + "/";
final String linkTarget = ContentItemPage.getItemURL(nodeURL, item.getID(),
ContentItemPage.AUTHORING_TAB, true);
scriptAction = String.format("window.location.href = \"/ccm/%s\";", linkTarget);
} else {
scriptAction = "self.close();";
}
target.setLabel(String.format("<script type=\"text/javascript\">"
+ "<!--\n"
+ "window.opener.document.%s.value=\"%s\";\n"
+ "window.opener.document.%s.value=\"%s\";\n"
+ "window.opener.document.%s.value=\"%s\";\n"
+ "%s\n"
+ "-->\n"
+ "</script>",
widget,
item.getID().toString(),
searchWidget,
title,
publishWidget,
Boolean.TRUE.toString(),
scriptAction));
}
});
linkPanel.add(jsLabel);
//linkPanel.add(m_selectCloseLink);
//linkPanel.add(m_selectEditLink);
linkPanel.add(m_fallBackLink);
m_linkSeg.add(linkPanel);
m_segPanel.add(m_linkSeg);
} // init
/**
*
* @param page
*/
@Override
public void register(final Page page) {
super.register(page);
page.setVisibleDefault(m_newItemSeg, true);
page.setVisibleDefault(m_creationSeg, false);
page.setVisibleDefault(m_linkSeg, false);
page.addComponentStateParam(this, m_typeSel.getStateParameter());
page.addComponentStateParam(this, m_folderSel.getStateParameter());
}
/**
*
* @param fse
* @throws FormProcessException
*/
public void init(final FormSectionEvent fse) throws FormProcessException {
final PageState state = fse.getPageState();
final FormData data = fse.getFormData();
if (((data.get(FLAT_FOLDER) == null) || "".equals(data.get(FLAT_FOLDER)))
&& (defaultFolder != null)) {
data.put(FLAT_FOLDER, defaultFolder.toString());
}
}
public void submitted(final FormSectionEvent fse) throws FormProcessException {
final PageState state = fse.getPageState();
final BigDecimal typeID = m_newItem.getTypeID(state);
m_typeSel.setSelectedKey(state, typeID);
final String folderOidStr = (String) m_folderPicker.getValue(state);
if ((folderOidStr == null) || folderOidStr.isEmpty()) {
fse.getFormData().addError(FLAT_FOLDER, GlobalizationUtil.globalize(
"cms.ui.item_search.create.folder_missing"));
throw new FormProcessException((String) GlobalizationUtil.globalize(
"cms.ui.item_search.create.folder_missing").localize());
}
final OID folderOID = OID.valueOf(folderOidStr);
m_folderSel.setSelectedKey(state, folderOID.get("id"));
m_newItemSeg.setVisible(state, false);
m_creationSeg.setVisible(state, true);
}
public void process(final FormSectionEvent fse) throws FormProcessException {
//Nothing
}
private static class SectionNewItemForm extends NewItemForm {
public SectionNewItemForm(String name) {
super(name);
}
public ContentSection getContentSection(PageState s) {
return CMS.getContext().getContentSection();
}
}
protected String getDefaultFolder() {
return defaultFolder;
}
protected void setDefaultFolder(final String defaultFolder) {
this.defaultFolder = defaultFolder;
}
protected boolean getEditAfterCreate() {
return editAfterCreate;
}
protected void setEditAfterCreate(final boolean editAfterCreate) {
this.editAfterCreate = editAfterCreate;
}
}