Removed several unused and depcreated classes.
parent
c9eb1bb20b
commit
3ed92c6e56
|
|
@ -220,7 +220,7 @@ public class CMSPage extends Page implements ResourceHandler {
|
|||
public ContentSection getContentSection(HttpServletRequest request) {
|
||||
// Resets all content sections associations.
|
||||
// return ContentSectionDispatcher.getContentSection(request);
|
||||
return ContentSectionServlet.getContentSection(request);
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -27,11 +27,8 @@ import com.arsdigita.xml.Element;
|
|||
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
import org.librecms.contentsection.ContentSection;
|
||||
import org.librecms.contentsection.ContentSectionServlet;
|
||||
import org.librecms.dispatcher.ItemResolver;
|
||||
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
|
|
@ -114,7 +111,7 @@ public class ContentPanel extends SimpleComponent {
|
|||
String url = DispatcherHelper.getRequestContext().getRemainingURLPart();
|
||||
if (url.startsWith(CMSDispatcher.PREVIEW)) {
|
||||
pathInfo.newChildElement("cms:previewPath", CMS.CMS_XML_NS).setText(
|
||||
ContentSectionServlet.PREVIEW);
|
||||
"preview");
|
||||
}
|
||||
pathInfo.newChildElement("cms:templatePrefix", CMS.CMS_XML_NS).setText(
|
||||
"/" + ItemResolver.TEMPLATE_CONTEXT_PREFIX);
|
||||
|
|
|
|||
|
|
@ -1,94 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2003-2004 Red Hat Inc. 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.Component;
|
||||
import com.arsdigita.bebop.SingleSelectionModel;
|
||||
import com.arsdigita.bebop.list.ListModelBuilder;
|
||||
import com.arsdigita.bebop.tree.TreeModelBuilder;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.toolbox.ui.SelectionPanel;
|
||||
|
||||
import org.librecms.CmsConstants;
|
||||
|
||||
/**
|
||||
* A base component for use in CMS admin panes.
|
||||
*
|
||||
* @param <T> Type managed by the {@link SingleSelectionModel} used by instances
|
||||
* of this class.
|
||||
*
|
||||
* @author Justin Ross <jross@redhat.com>
|
||||
*/
|
||||
public abstract class BaseAdminPane<T> extends SelectionPanel<T> {
|
||||
|
||||
protected BaseAdminPane() {
|
||||
super();
|
||||
}
|
||||
|
||||
protected BaseAdminPane(final Component title,
|
||||
final Component selector) {
|
||||
super(title, selector);
|
||||
}
|
||||
|
||||
protected BaseAdminPane(final GlobalizedMessage title,
|
||||
final Component selector) {
|
||||
super(title, selector);
|
||||
}
|
||||
|
||||
protected BaseAdminPane(final Component title,
|
||||
final Component selector,
|
||||
final SingleSelectionModel<T> model) {
|
||||
super(title, selector, model);
|
||||
}
|
||||
|
||||
protected BaseAdminPane(final GlobalizedMessage title,
|
||||
final Component selector,
|
||||
final SingleSelectionModel<T> model) {
|
||||
super(title, selector, model);
|
||||
}
|
||||
|
||||
protected BaseAdminPane(final Component title,
|
||||
final ListModelBuilder builder) {
|
||||
super(title, builder);
|
||||
}
|
||||
|
||||
protected BaseAdminPane(final GlobalizedMessage title,
|
||||
final ListModelBuilder builder) {
|
||||
super(title, builder);
|
||||
}
|
||||
|
||||
protected BaseAdminPane(final Component title,
|
||||
final TreeModelBuilder builder) {
|
||||
super(title, builder);
|
||||
}
|
||||
|
||||
protected BaseAdminPane(final GlobalizedMessage title,
|
||||
final TreeModelBuilder builder) {
|
||||
super(title, builder);
|
||||
}
|
||||
|
||||
protected static GlobalizedMessage gz(final String key) {
|
||||
return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE);
|
||||
}
|
||||
|
||||
protected static String lz(final String key) {
|
||||
return (String) gz(key).localize();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,161 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2001-2004 Red Hat Inc. 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.Label;
|
||||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.Resettable;
|
||||
import com.arsdigita.bebop.SegmentedPanel;
|
||||
import com.arsdigita.bebop.SingleSelectionModel;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.event.FormSubmissionListener;
|
||||
import com.arsdigita.bebop.event.ActionEvent;
|
||||
import com.arsdigita.bebop.event.ActionListener;
|
||||
import com.arsdigita.cms.CMS;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.toolbox.ui.LayoutPanel;
|
||||
|
||||
import org.libreccm.categorization.Category;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.ContentSection;
|
||||
import org.librecms.contentsection.Folder;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* A pane that contains a folder tree on the left and a folder manipulator on
|
||||
* the right. It is a part of the content section main page and is displayed as
|
||||
* the "Browse" tab.
|
||||
*
|
||||
* @author David LutterKort <dlutter@redhat.com>
|
||||
* @author <a href="jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class BrowsePane extends LayoutPanel implements Resettable {
|
||||
|
||||
private SingleSelectionModel selectionModel;
|
||||
private FlatItemList flatItemList;
|
||||
|
||||
public BrowsePane() {
|
||||
|
||||
|
||||
final SegmentedPanel left = new SegmentedPanel();
|
||||
setLeft(left);
|
||||
|
||||
final Label heading = new Label(
|
||||
new GlobalizedMessage("cms.ui.folder_browser",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void register(final Page page) {
|
||||
super.register(page);
|
||||
|
||||
page.addActionListener(new FolderListener());
|
||||
page.addActionListener(new TreeListener());
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void reset(final PageState state) {
|
||||
super.reset(state);
|
||||
|
||||
flatItemList.reset(state);
|
||||
}
|
||||
|
||||
// Private classes and methods
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private final class ProcessListener implements FormProcessListener {
|
||||
|
||||
@Override
|
||||
public final void process(final FormSectionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private final class SubmissionListener implements FormSubmissionListener {
|
||||
|
||||
@Override
|
||||
public final void submitted(final FormSectionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private final class FolderListener implements ActionListener {
|
||||
|
||||
@Override
|
||||
public final void actionPerformed(final ActionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
if (!selectionModel.isSelected(state)) {
|
||||
final String folder = state
|
||||
.getRequest()
|
||||
.getParameter(ContentSectionPage.SET_FOLDER);
|
||||
|
||||
if (folder == null) {
|
||||
final Category root = CMS
|
||||
.getContext()
|
||||
.getContentSection()
|
||||
.getRootDocumentsFolder();
|
||||
final Long folderID = root.getObjectId();
|
||||
|
||||
/*
|
||||
ToDo
|
||||
User user = Web.getWebContext().getUser();
|
||||
if (user != null) {
|
||||
Folder homeFolder = Folder.getUserHomeFolder(
|
||||
user, CMS.getContext().getContentSection());
|
||||
if (homeFolder != null) {
|
||||
folderID = homeFolder.getID();
|
||||
}
|
||||
|
||||
}*/
|
||||
selectionModel.setSelectedKey(state, folderID);
|
||||
} else {
|
||||
selectionModel.setSelectedKey(state, Long.parseLong(folder));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private final class TreeListener implements ActionListener {
|
||||
|
||||
@Override
|
||||
public final void actionPerformed(final ActionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
final Category root = CMS
|
||||
.getContext()
|
||||
.getContentSection()
|
||||
.getRootDocumentsFolder();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,236 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui;
|
||||
|
||||
import com.arsdigita.bebop.BebopConfig;
|
||||
import com.arsdigita.bebop.Container;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.page.PageTransformer;
|
||||
import com.arsdigita.cms.dispatcher.Utilities;
|
||||
import com.arsdigita.templating.PresentationManager;
|
||||
import com.arsdigita.xml.Document;
|
||||
import com.arsdigita.xml.Element;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.security.Shiro;
|
||||
import org.libreccm.security.User;
|
||||
import org.libreccm.web.CcmApplication;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
/**
|
||||
* A <tt>CMSApplicationPage</tt> is a Bebop {@link com.arsdigita.bebop.Page}
|
||||
* implementation serving as a base for any CMS pageElement served by a servlet.
|
||||
*
|
||||
* It stores the current {@link com.arsdigita.cms.ContentSection} and, if
|
||||
* applicable, the {@link com.arsdigita.cms.ContentItem} in the pageElement
|
||||
* state as request local objects. Components that are part of the
|
||||
* <tt>CMSPage</tt> may access these objects by calling:
|
||||
* <blockquote><code><pre>
|
||||
* getContentSection(PageState state);
|
||||
* </pre></code></blockquote>
|
||||
*
|
||||
* @author Michael Pih (pihman@arsdigita.com)
|
||||
* @author Uday Mathur (umathur@arsdigita.com)
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class CMSApplicationPage extends Page {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
CMSApplicationPage.class);
|
||||
|
||||
/**
|
||||
* The global assets URL stub XML parameter name.
|
||||
*/
|
||||
public final static String ASSETS = "ASSETS";
|
||||
|
||||
/**
|
||||
* The XML pageElement class.
|
||||
*/
|
||||
public final static String PAGE_CLASS = "CMS";
|
||||
|
||||
/**
|
||||
* Map of XML parameters
|
||||
*/
|
||||
private Map<String, String> parameters;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private PageTransformer pageTransformer;
|
||||
|
||||
public CMSApplicationPage() {
|
||||
super();
|
||||
buildPage();
|
||||
}
|
||||
|
||||
public CMSApplicationPage(final String title) {
|
||||
super(title);
|
||||
buildPage();
|
||||
}
|
||||
|
||||
public CMSApplicationPage(final String title, final Container panel) {
|
||||
super(title, panel);
|
||||
buildPage();
|
||||
}
|
||||
|
||||
public CMSApplicationPage(final Label title) {
|
||||
super(title);
|
||||
buildPage();
|
||||
}
|
||||
|
||||
public CMSApplicationPage(final Label title, final Container panel) {
|
||||
super(title, panel);
|
||||
buildPage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the pageElement.
|
||||
*/
|
||||
private void buildPage() {
|
||||
|
||||
// Set the class attribute value (down in SimpleComponent).
|
||||
setClassAttr(PAGE_CLASS);
|
||||
|
||||
// Global XML params.
|
||||
// MP: This only works with older versions of Xalan.
|
||||
parameters = new HashMap<>();
|
||||
setXMLParameter(ASSETS, Utilities.getGlobalAssetsURL());
|
||||
|
||||
// MP: This is a hack to so that the XML params work with the newer
|
||||
// version of Xalan.
|
||||
setAttribute(ASSETS, Utilities.getGlobalAssetsURL());
|
||||
|
||||
// Make sure the error display gets rendered.
|
||||
getErrorDisplay().setIdAttr("page-body");
|
||||
|
||||
final Class<PresentationManager> presenterClass = BebopConfig
|
||||
.getConfig()
|
||||
.getPresenterClass();
|
||||
final PresentationManager presenter;
|
||||
try {
|
||||
presenter = presenterClass.getDeclaredConstructor().newInstance();
|
||||
} catch (InstantiationException
|
||||
| IllegalAccessException
|
||||
| NoSuchMethodException
|
||||
| InvocationTargetException ex) {
|
||||
throw new RuntimeException("Failed to create PresentationManager",
|
||||
ex);
|
||||
}
|
||||
|
||||
if (presenter instanceof PageTransformer) {
|
||||
pageTransformer = (PageTransformer) presenter;
|
||||
} else {
|
||||
pageTransformer = new PageTransformer();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finishes and locks the pageElement. If the pageElement is already locked,
|
||||
* does nothing.
|
||||
*
|
||||
* Client classes may overwrite this method to add context specific bits to
|
||||
* the page before it is locked.
|
||||
*
|
||||
* This method is called by the various servlets serving the various pages
|
||||
* of the CMS package, before serving and displaying the page.
|
||||
*
|
||||
* @param request
|
||||
* @param response
|
||||
* @param app
|
||||
*/
|
||||
public synchronized void init(final HttpServletRequest request,
|
||||
final HttpServletResponse response,
|
||||
final CcmApplication app) {
|
||||
LOGGER.debug("Initializing the page");
|
||||
|
||||
if (!isLocked()) {
|
||||
LOGGER.debug("The page hasn't been locked; locking it now");
|
||||
|
||||
lock();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the value of the XML parameter.
|
||||
*
|
||||
* @param name The parameter name
|
||||
*
|
||||
* @return The parameter value
|
||||
*
|
||||
* @pre (name != null)
|
||||
*/
|
||||
public String getXMLParameter(final String name) {
|
||||
return parameters.get(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an XML parameter.
|
||||
*
|
||||
* @param name The parameter name
|
||||
* @param value The parameter value
|
||||
*
|
||||
* @pre (name != null)
|
||||
*/
|
||||
public void setXMLParameter(String name, String value) {
|
||||
parameters.put(name, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Overwrites bebop.Page#generateXMLHelper to add the name of the user
|
||||
* logged in to the pageElement (displayed as part of the header).
|
||||
*
|
||||
* @param state
|
||||
* @param parent
|
||||
*
|
||||
* @return pageElement for use in generateXML
|
||||
*/
|
||||
@Override
|
||||
protected Element generateXMLHelper(final PageState state,
|
||||
final Document parent) {
|
||||
|
||||
/* Retain elements already included. */
|
||||
Element pageElement = super.generateXMLHelper(state, parent);
|
||||
|
||||
/* Add name of user logged in. */
|
||||
// Note: There are at least 2 ways in the API to determin the user
|
||||
// TODO: Check for differences, determin the best / recommended way and
|
||||
// document it in the classes. Probably remove one ore the other
|
||||
// way from the API if possible.
|
||||
final Shiro shiro = CdiUtil.createCdiUtil().findBean(Shiro.class);
|
||||
final Optional<User> user = shiro.getUser();
|
||||
// User user = Web.getWebContext().getUser();
|
||||
if (user.isPresent()) {
|
||||
pageElement.addAttribute("name", user.get().getName());
|
||||
}
|
||||
|
||||
return pageElement;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,481 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2001-2004 Red Hat Inc. 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.*;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.event.FormValidationListener;
|
||||
import com.arsdigita.bebop.event.PrintEvent;
|
||||
import com.arsdigita.bebop.event.PrintListener;
|
||||
import com.arsdigita.bebop.form.Option;
|
||||
import com.arsdigita.bebop.form.OptionGroup;
|
||||
import com.arsdigita.bebop.form.SingleSelect;
|
||||
import com.arsdigita.bebop.form.Submit;
|
||||
import com.arsdigita.bebop.parameters.BigDecimalParameter;
|
||||
import com.arsdigita.bebop.util.GlobalizationUtil;
|
||||
import com.arsdigita.bebop.util.SequentialMap;
|
||||
import com.arsdigita.cms.CMS;
|
||||
import com.arsdigita.cms.ui.authoring.BasicItemForm;
|
||||
import com.arsdigita.globalization.Globalization;
|
||||
import com.arsdigita.util.StringUtils;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.categorization.Category;
|
||||
import org.libreccm.categorization.CategoryManager;
|
||||
import org.libreccm.categorization.CategoryRepository;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.core.CcmObject;
|
||||
|
||||
import javax.enterprise.inject.spi.CDI;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* This is an abstract class which displays the category assignment UI.
|
||||
*
|
||||
* Displays two listboxes for assigning categories to items, with two
|
||||
* submit buttons to move categories back and forth. The left
|
||||
* listbox displays all available categories which have not been
|
||||
* assigned to the current item. The right listbox displays all categories
|
||||
* assigned to the current item.
|
||||
* <p>
|
||||
*
|
||||
*
|
||||
* @author Stanislav Freidin (sfreidin@arsdigita.com)
|
||||
* @author <a href="mailto:yannick.buelter@yabue.de">Yannick Bülter</a>
|
||||
*/
|
||||
public abstract class CategoryForm extends Form
|
||||
implements FormProcessListener, FormValidationListener {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
CategoryForm.class);
|
||||
private static final String SEPARATOR = ">";
|
||||
public static final String FREE = "free";
|
||||
public static final String ASSIGNED = "assigned";
|
||||
public static final String ASSIGN = "assign";
|
||||
public static final String REMOVE = "remove";
|
||||
public static final int SELECT_WIDTH = 30;
|
||||
public static final int SELECT_HEIGHT = 10;
|
||||
public static final String FILLER_OPTION = StringUtils.repeat("_", SELECT_WIDTH);
|
||||
|
||||
private final RequestLocal m_assigned;
|
||||
private Submit m_assign, m_remove;
|
||||
|
||||
private final Label m_freeLabel;
|
||||
private final Label m_assignedLabel;
|
||||
|
||||
/**
|
||||
* Construct a new CategoryForm component
|
||||
*
|
||||
* @param name the name of the form
|
||||
*/
|
||||
public CategoryForm(String name) {
|
||||
super(name, new ColumnPanel(3));
|
||||
|
||||
ColumnPanel panel = (ColumnPanel) getPanel();
|
||||
panel.setBorder(false);
|
||||
panel.setPadColor("#FFFFFF");
|
||||
panel.setColumnWidth(1, "0%");
|
||||
panel.setColumnWidth(2, "0%");
|
||||
panel.setColumnWidth(3, "0");
|
||||
panel.setWidth("0%");
|
||||
panel.setClassAttr("CMS Admin");
|
||||
|
||||
// Create the request local
|
||||
m_assigned = new RequestLocal() {
|
||||
|
||||
@Override
|
||||
public Object initialValue(PageState state) {
|
||||
CategoryMap m = new CategoryMap();
|
||||
initAssignedCategories(state, m);
|
||||
return m;
|
||||
}
|
||||
};
|
||||
|
||||
// Top row
|
||||
m_freeLabel = new Label(GlobalizationUtil.globalize("cms.ui.item.categories.available"), false);
|
||||
m_freeLabel.setFontWeight(Label.BOLD);
|
||||
add(m_freeLabel, ColumnPanel.LEFT);
|
||||
|
||||
//add(new Label(" ", false));
|
||||
add(new Embedded(" ", false));
|
||||
|
||||
m_assignedLabel = new Label(GlobalizationUtil.globalize("cms.ui.item.categories.assigned"), false);
|
||||
m_assignedLabel.setFontWeight(Label.BOLD);
|
||||
add(m_assignedLabel, ColumnPanel.LEFT);
|
||||
|
||||
// Middle Row
|
||||
SingleSelect freeWidget = new SingleSelect(new BigDecimalParameter(FREE));
|
||||
try {
|
||||
freeWidget.addPrintListener(new FreePrintListener());
|
||||
} catch (TooManyListenersException e) {
|
||||
UncheckedWrapperException.throwLoggedException(getClass(), "Too many listeners", e);
|
||||
}
|
||||
freeWidget.setSize(SELECT_HEIGHT);
|
||||
add(freeWidget);
|
||||
|
||||
BoxPanel box = new BoxPanel(BoxPanel.VERTICAL, true);
|
||||
box.setWidth("2%");
|
||||
addSubmitButtons(box);
|
||||
add(box, ColumnPanel.CENTER | ColumnPanel.MIDDLE);
|
||||
|
||||
SingleSelect assignedWidget =
|
||||
new SingleSelect(new BigDecimalParameter(ASSIGNED));
|
||||
try {
|
||||
assignedWidget.addPrintListener(new AssignedPrintListener());
|
||||
} catch (TooManyListenersException e) {
|
||||
UncheckedWrapperException.throwLoggedException(getClass(), "Too many listeners", e);
|
||||
}
|
||||
assignedWidget.setSize(SELECT_HEIGHT);
|
||||
add(assignedWidget);
|
||||
|
||||
// Add listeners
|
||||
addProcessListener(this);
|
||||
addValidationListener(this);
|
||||
|
||||
setClassAttr("CategoryForm");
|
||||
}
|
||||
|
||||
protected void addSubmitButtons(Container c) {
|
||||
addAssignButton(c);
|
||||
addRemoveButton(c);
|
||||
}
|
||||
|
||||
protected void addAssignButton(Container c) {
|
||||
m_assign = new Submit(ASSIGN, ">>");
|
||||
m_assign.setSize(10);
|
||||
c.add(m_assign);
|
||||
}
|
||||
|
||||
protected void addRemoveButton(Container c) {
|
||||
m_remove = new Submit(REMOVE, "<<");
|
||||
m_remove.setSize(10);
|
||||
c.add(m_remove);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the caption of the unassigned categories label
|
||||
*
|
||||
* @param caption the new caption
|
||||
*/
|
||||
public void setUnassignedCaption(String caption) {
|
||||
m_freeLabel.setLabel(caption);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the caption of the assigned categories label
|
||||
*
|
||||
* @param caption the new caption
|
||||
*/
|
||||
public void setAssignedCaption(String caption) {
|
||||
m_assignedLabel.setLabel(caption);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param s the page state
|
||||
* @return a {@link CategoryMap} of all assigned categories
|
||||
*/
|
||||
public CategoryMap getAssignedCategories(PageState s) {
|
||||
return (CategoryMap) m_assigned.get(s);
|
||||
}
|
||||
|
||||
// A print listener which populates the listbox with all
|
||||
// unassigned categories, apart from result of getExcludedCategory()
|
||||
// (if not null), and the root category.
|
||||
// Ordering is alphabetical based on qualified path, so entries are
|
||||
// ordered like a tree with all nodes expanded.
|
||||
// Ideally ordering should be like an expanded tree but based on
|
||||
// the sortkey order of the categories. However, I don't know
|
||||
// if it would be possible to write a comparison function that
|
||||
// could do this efficiently, and I'm not even going to try
|
||||
// chris.gilbert@westsussex.gov.uk
|
||||
//
|
||||
private class FreePrintListener implements PrintListener {
|
||||
|
||||
@Override
|
||||
public void prepare(PrintEvent e) {
|
||||
|
||||
OptionGroup target = (OptionGroup) e.getTarget();
|
||||
target.clearOptions();
|
||||
PageState state = e.getPageState();
|
||||
// Category root = getRootCategory(state);
|
||||
// if (root == null) {
|
||||
// return;
|
||||
// }
|
||||
|
||||
// exclude children of the excluded category (as per javadoc on
|
||||
// getExcludedCategory() method. This prevents attempts
|
||||
// to create circular category graph (which causes
|
||||
// exception in Category during addMapping if not checked here
|
||||
Category excludedCat = getExcludedCategory(state);
|
||||
CategoryMap excluded = new CategoryMap();
|
||||
if (excludedCat != null) {
|
||||
java.util.List<Category> excludedSubTree = getExcludedCategory(state).getSubCategories();
|
||||
excludedSubTree.forEach(excluded::add);
|
||||
}
|
||||
CategoryMap assigned = getAssignedCategories(state);
|
||||
SortedMap sortedCats = new TreeMap();
|
||||
// java.util.List<Category> children = root.getSubCategories();
|
||||
// children.forEach(x -> sortedCats.put(x.getName(), x.getUniqueId()));
|
||||
|
||||
Iterator it = sortedCats.entrySet().iterator();
|
||||
Map.Entry entry;
|
||||
String path;
|
||||
String id;
|
||||
boolean notExcluded;
|
||||
boolean notAlreadyAssigned;
|
||||
// boolean notRoot;
|
||||
|
||||
while (it.hasNext()) {
|
||||
entry = (Map.Entry) it.next();
|
||||
path = (String) entry.getKey();
|
||||
id = (String) entry.getValue();
|
||||
|
||||
notExcluded = !excluded.containsKey(id);
|
||||
notAlreadyAssigned = !assigned.containsKey(id);
|
||||
// notRoot = !id.equals(root.getUniqueId());
|
||||
|
||||
if (notExcluded && notAlreadyAssigned) {// && notRoot) {
|
||||
target.addOption(new Option(id, new Text(path)));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
addFillerOption(target);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Populate a {@link CategoryMap} with all categories which are assigned to
|
||||
* the item. Child classes should override this method to do the right thing.
|
||||
*
|
||||
* @param map The sequential map of all categories which are assigned to
|
||||
* the current item. Overridden method should repeatedly
|
||||
* <code>call map.addCategory(someCategory);</code>
|
||||
* @param state The page state
|
||||
*/
|
||||
protected abstract void initAssignedCategories(PageState state, CategoryMap map);
|
||||
|
||||
/**
|
||||
* Assign a category, moving it from the list on the left
|
||||
* to the list on the right
|
||||
*
|
||||
* @param s the page state
|
||||
* @param cat the category to assign
|
||||
*/
|
||||
protected abstract void assignCategory(PageState s, Category cat);
|
||||
|
||||
/**
|
||||
* Unassign a category, moving it from the list on the right
|
||||
* to the list on the left
|
||||
*
|
||||
* @param s the page state
|
||||
* @param cat the category to unassign
|
||||
*/
|
||||
protected abstract void unassignCategory(PageState s, Category cat);
|
||||
|
||||
/**
|
||||
* This method returns the URL for the givne item to make sure that
|
||||
* the item it is not possible to have two objects in the same category
|
||||
* with the same URL.
|
||||
* @param state The Page State
|
||||
*/
|
||||
protected abstract String getItemURL(PageState state);
|
||||
|
||||
/**
|
||||
* This allows the validation code to validate the properties of the
|
||||
* object
|
||||
*/
|
||||
protected abstract CcmObject getObject(PageState state);
|
||||
|
||||
/**
|
||||
* Get the category which will act as the root for the lists
|
||||
* of assigned and unassigned categories. The default implementation
|
||||
* returns the root category for the content section. Child classes
|
||||
* should override this method if they wish to provide an alternate root category.
|
||||
*
|
||||
* @param state the page state
|
||||
* @return the root category which should be used to populate the lists
|
||||
* of assigned and unassigned categories
|
||||
*/
|
||||
// public Category getRootCategory(PageState state) {
|
||||
// return null;
|
||||
// return CMS.getContext().getContentSection().getRootCategory();
|
||||
// }
|
||||
|
||||
/**
|
||||
* Return a category which should be excluded from the list of
|
||||
* free categories. It is permissible to return null
|
||||
*
|
||||
* @param s the page state
|
||||
* @return a category whose subtree will not be shown in the
|
||||
* category list
|
||||
*/
|
||||
protected Category getExcludedCategory(PageState s) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Populates the "assigned categories" widget
|
||||
@Deprecated
|
||||
private class AssignedPrintListener implements PrintListener {
|
||||
|
||||
@Override
|
||||
public void prepare(PrintEvent e) {
|
||||
OptionGroup o = (OptionGroup) e.getTarget();
|
||||
o.clearOptions();
|
||||
PageState state = e.getPageState();
|
||||
CategoryMap m = getAssignedCategories(state);
|
||||
|
||||
if (!m.isEmpty()) {
|
||||
for (Iterator i = m.values().iterator(); i.hasNext();) {
|
||||
Category c = (Category) i.next();
|
||||
o.addOption(new Option(c.getUniqueId(), new Text(getCategoryPath(c))));
|
||||
}
|
||||
} else {
|
||||
o.addOption(new Option("", new Text("-- none --")));
|
||||
}
|
||||
|
||||
addFillerOption(o);
|
||||
}
|
||||
}
|
||||
|
||||
// Process the form: assign/unassign categories
|
||||
@Override
|
||||
public void process(FormSectionEvent e) throws FormProcessException {
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final CategoryRepository categoryRepository = cdiUtil.findBean(CategoryRepository.class);
|
||||
|
||||
PageState state = e.getPageState();
|
||||
FormData data = e.getFormData();
|
||||
Long id;
|
||||
|
||||
if (m_assign.isSelected(state)) {
|
||||
id = ((BigDecimal) data.get(FREE)).longValue();
|
||||
Optional<Category> optional = categoryRepository.findById(id);
|
||||
if (optional.isPresent()) {
|
||||
Category cat = optional.get();
|
||||
assignCategory(state, cat);
|
||||
data.put(ASSIGNED, id);
|
||||
} else {
|
||||
throw new FormProcessException(GlobalizationUtil.globalize(String.format("Can't find category with id %d", id)));
|
||||
}
|
||||
} else if (m_remove.isSelected(state)) {
|
||||
id = ((BigDecimal) data.get(ASSIGNED)).longValue();
|
||||
Optional<Category> optional = categoryRepository.findById(id);
|
||||
if (optional.isPresent()) {
|
||||
Category cat = optional.get();
|
||||
unassignCategory(state, cat);
|
||||
data.put(FREE, id);
|
||||
} else {
|
||||
throw new FormProcessException(GlobalizationUtil.globalize(String.format("Can't find category with id %d", id)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Validate the form: make sure that a category is selected
|
||||
// for the remove/assign buttons
|
||||
@Override
|
||||
public void validate(FormSectionEvent e) throws FormProcessException {
|
||||
PageState state = e.getPageState();
|
||||
FormData data = e.getFormData();
|
||||
if (m_assign.isSelected(state)) {
|
||||
if (data.get(FREE) == null) {
|
||||
data.addError(GlobalizationUtil.globalize("cms.ui.category.assign_select_missing"));
|
||||
} else {
|
||||
// we need to make sure that no other item in this
|
||||
// category has the same name (url)
|
||||
Long id = ((BigDecimal) data.get(FREE)).longValue();
|
||||
|
||||
// Assign a new category
|
||||
// try {
|
||||
// String url = getItemURL(state);
|
||||
//
|
||||
// if (url != null) {
|
||||
// DataQuery query = SessionManager.getSession().retrieveQuery("com.arsdigita.categorization.getAllItemURLsForCategory");
|
||||
// query.setParameter("categoryID", id);
|
||||
// query.addEqualsFilter("lower(url)", url.toLowerCase());
|
||||
//
|
||||
// if (query.size() > 0) {
|
||||
// // we need to make sure that there is not an item
|
||||
// ACSObject item = getObject(state);
|
||||
// Collection list;
|
||||
// if (item instanceof ContentItem) {
|
||||
// list = BasicItemForm.getAllVersionIDs((ContentItem) item);
|
||||
// } else {
|
||||
// list = new ArrayList();
|
||||
// list.add(item.getID());
|
||||
// }
|
||||
// BigDecimal itemID;
|
||||
// while (query.next()) {
|
||||
// itemID = (BigDecimal) query.get("itemID");
|
||||
// if (!list.contains(itemID)) {
|
||||
// data.addError("There is already an item "
|
||||
// + "with the url " + url
|
||||
// + " in the category "
|
||||
// + cat.getName());
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// } catch (DataObjectNotFoundException ex) {
|
||||
// s_log.error("Error processing category. Unable to find "
|
||||
// + "category with id " + id);
|
||||
// throw new FormProcessException(ex);
|
||||
// }
|
||||
}
|
||||
} else if (m_remove.isSelected(state)) {
|
||||
if (data.get(ASSIGNED) == null) {
|
||||
data.addError(GlobalizationUtil.globalize("cms.ui.category.assign_select_missing"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add a "filler" option to the option group in order to ensure
|
||||
// the correct horizontal width
|
||||
private static void addFillerOption(OptionGroup o) {
|
||||
o.addOption(new Option("", FILLER_OPTION));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the full path to a category
|
||||
*/
|
||||
public static String getCategoryPath(Category c) {
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final CategoryManager categoryManager = cdiUtil.findBean(CategoryManager.class);
|
||||
return categoryManager.getCategoryPath(c);
|
||||
}
|
||||
|
||||
/**
|
||||
* A convenience method that abstracts SequentialMap
|
||||
* to deal with categories
|
||||
*/
|
||||
protected static class CategoryMap extends SequentialMap {
|
||||
|
||||
public CategoryMap() {
|
||||
super();
|
||||
}
|
||||
|
||||
public void add(Category c) {
|
||||
super.put(c.getUniqueId(), c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2003-2004 Red Hat Inc. 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.PageState;
|
||||
import com.arsdigita.bebop.RequestLocal;
|
||||
|
||||
import org.libreccm.core.CcmObject;
|
||||
|
||||
|
||||
public class CcmObjectRequestLocal extends RequestLocal {
|
||||
|
||||
public final CcmObject getACSObject(final PageState state) {
|
||||
return (CcmObject) get(state);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,343 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2001-2004 Red Hat Inc. 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.Component;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.SimpleContainer;
|
||||
import com.arsdigita.bebop.TabbedPane;
|
||||
import com.arsdigita.bebop.event.ActionEvent;
|
||||
import com.arsdigita.bebop.event.ActionListener;
|
||||
import com.arsdigita.bebop.event.PrintEvent;
|
||||
import com.arsdigita.bebop.event.PrintListener;
|
||||
import com.arsdigita.cms.CMS;
|
||||
import com.arsdigita.cms.PageLocations;
|
||||
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
import org.librecms.contentsection.ContentSection;
|
||||
|
||||
import com.arsdigita.cms.dispatcher.CMSPage;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.Assert;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.librecms.CMSConfig;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.security.PermissionChecker;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.ContentItemVersion;
|
||||
import org.librecms.contentsection.privileges.AdminPrivileges;
|
||||
|
||||
/**
|
||||
* Contains the entire admin UI for a content section.
|
||||
*
|
||||
* Developers Note: It is based on the dispatcher model is is going to be
|
||||
* replaced by the newer servlet based model. @see
|
||||
* c.ad.cms.ui.contentsection.MainPage (currently not active).
|
||||
*
|
||||
* @author Jack Chung
|
||||
* @author Michael Pih
|
||||
* @author Xixi D'Moon
|
||||
* @author Justin Ross
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ContentSectionPage extends CMSPage implements ActionListener {
|
||||
|
||||
/**
|
||||
* The URL parameter that can be passed in in order to set the current
|
||||
* folder. This is used in getting back to the correct level of folder
|
||||
* expansion from content item page.
|
||||
*/
|
||||
public static final String SET_FOLDER = "set_folder";
|
||||
|
||||
/**
|
||||
* The URL parameter that can be passed in in order to set the current
|
||||
* template (for setting the content type)
|
||||
*/
|
||||
public static final String SET_TEMPLATE = "set_template";
|
||||
|
||||
/**
|
||||
* The URL parameter that can be passed in in order to set the current tab.
|
||||
* This is a KLUDGE right now because the TabbedDialog's current tab is
|
||||
* selected with a local state parameter.
|
||||
*/
|
||||
public static final String SET_TAB = "set_tab";
|
||||
|
||||
/**
|
||||
* Index of the search tab
|
||||
*/
|
||||
public static final int SEARCH_TAB = 0;
|
||||
|
||||
/**
|
||||
* Index of the browse tab
|
||||
*/
|
||||
public static final int BROWSE_TAB = 1;
|
||||
|
||||
/**
|
||||
* Index of the roles tab
|
||||
*/
|
||||
public static final int ROLES_TAB = 2;
|
||||
|
||||
/**
|
||||
* Index of the workflows tab
|
||||
*/
|
||||
public static final int WORKFLOW_TAB = 3;
|
||||
|
||||
/**
|
||||
* Index of the lifecycles tab
|
||||
*/
|
||||
public static final int LIFECYCLES_TAB = 4;
|
||||
|
||||
/**
|
||||
* Index of the categories tab
|
||||
*/
|
||||
public static final int CATEGORIES_TAB = 5;
|
||||
|
||||
/**
|
||||
* Index of the content types tab
|
||||
*/
|
||||
public static final int CONTENTTYPES_TAB = 6;
|
||||
|
||||
public static final int USER_ADMIN_TAB = 7;
|
||||
|
||||
private TabbedPane m_tabbedPane;
|
||||
|
||||
private BrowsePane m_browsePane;
|
||||
|
||||
private ItemSearch m_searchPane;
|
||||
|
||||
/**
|
||||
* Creates the content section index page containing - a Navigaton bar for
|
||||
* the various tasks (items, search, images, ....) - a breadcrumb - ....
|
||||
* Contains the UI for administering a content section.
|
||||
*/
|
||||
public ContentSectionPage() {
|
||||
super(new Label(new TitlePrinter()), new SimpleContainer());
|
||||
|
||||
setClassAttr("cms-admin");
|
||||
|
||||
add(new GlobalNavigation());
|
||||
|
||||
// Initialize the individual panes
|
||||
m_browsePane = getBrowsePane();
|
||||
m_searchPane = getSearchPane();
|
||||
|
||||
// The panes
|
||||
m_tabbedPane = createTabbedPane();
|
||||
m_tabbedPane.setIdAttr("page-body");
|
||||
m_tabbedPane.addActionListener(this);
|
||||
add(m_tabbedPane);
|
||||
|
||||
addActionListener(new ActionListener() {
|
||||
|
||||
@Override
|
||||
public final void actionPerformed(ActionEvent e) {
|
||||
final PageState state = e.getPageState();
|
||||
|
||||
final String tab = state.getRequest().getParameter(SET_TAB);
|
||||
|
||||
if (tab != null) {
|
||||
m_tabbedPane.setSelectedIndex(state, Integer.valueOf(tab)
|
||||
.intValue());
|
||||
}
|
||||
|
||||
final PermissionChecker permissionChecker = CdiUtil
|
||||
.createCdiUtil().findBean(PermissionChecker.class);
|
||||
|
||||
if (CMSConfig.getConfig().isHideAdminTabs()) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates, and then caches, the browse pane. Overriding this method to
|
||||
* return null will prevent this tab from appearing.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected BrowsePane getBrowsePane() {
|
||||
if (m_browsePane == null) {
|
||||
m_browsePane = new BrowsePane();
|
||||
}
|
||||
return m_browsePane;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates, and then caches, the search pane. Overriding this method to
|
||||
* return null will prevent this tab from appearing.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected ItemSearch getSearchPane() {
|
||||
if (m_searchPane == null) {
|
||||
m_searchPane
|
||||
= new ItemSearch(
|
||||
ContentItemVersion.DRAFT.toString(),
|
||||
CMSConfig.getConfig().isLimitItemSearchToContentSection());
|
||||
}
|
||||
return m_searchPane;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the specified component, with the specified tab name, to the tabbed
|
||||
* pane only if it is not null.
|
||||
*
|
||||
* @param pane The pane to which to add the tab
|
||||
* @param tabName The name of the tab if it's added
|
||||
* @param comp The component to add to the pane
|
||||
*/
|
||||
protected void addToPane(final TabbedPane pane,
|
||||
final String tabName,
|
||||
final Component comp) {
|
||||
if (comp != null) {
|
||||
pane.addTab(new Label(tabName), comp);
|
||||
}
|
||||
}
|
||||
|
||||
private void tab(final TabbedPane pane,
|
||||
final String key,
|
||||
final Component tab) {
|
||||
if (tab != null) {
|
||||
pane.addTab(new Label(gz(key)), tab);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Created the TabbedPane to use for this page. Adds the tabs to the pane.
|
||||
* The default implementation uses a {@link
|
||||
* com.arsdigita.bebop.TabbedPane}. This implementation also adds browse,
|
||||
* search, staff admin, viewers admin, workflow admin, category admin, and
|
||||
* content type panes.</p>
|
||||
*
|
||||
* <p>
|
||||
* Developers can override this method to add only the tabs they want, or to
|
||||
* add additional tabs after the default CMS tabs are added.</p>
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected TabbedPane createTabbedPane() {
|
||||
final TabbedPane pane = new TabbedPane();
|
||||
|
||||
tab(pane, "cms.ui.browse", getBrowsePane());
|
||||
tab(pane, "cms.ui.search", getSearchPane());
|
||||
|
||||
return pane;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch the request-local content section.
|
||||
*
|
||||
* @param request The HTTP request
|
||||
*
|
||||
* @return The current content section
|
||||
*/
|
||||
@Override
|
||||
public ContentSection getContentSection(final HttpServletRequest request) {
|
||||
// Resets all content sections associations.
|
||||
ContentSection section = super.getContentSection(request);
|
||||
Assert.exists(section);
|
||||
return section;
|
||||
}
|
||||
|
||||
/**
|
||||
* When a new tab is selected, reset the state of the formerly-selected
|
||||
* pane.
|
||||
*
|
||||
* @param event The event fired by selecting a tab
|
||||
*/
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
final Component pane = m_tabbedPane.getCurrentPane(state);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a URL for displaying the tab
|
||||
*
|
||||
* @param item The item from which we get the corresponding content section
|
||||
* @param tab The index of the tab to display
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static String getSectionURL(final ContentItem item, final int tab) {
|
||||
// Get the content section associated with the content item.
|
||||
final ContentSection section = item.getContentType().getContentSection();
|
||||
|
||||
final String url = section.getPrimaryUrl() + PageLocations.SECTION_PAGE
|
||||
+ "?" + SET_TAB + "=" + tab;
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
private static GlobalizedMessage gz(final String key) {
|
||||
return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Getting the GlobalizedMessage using a CMS Class targetBundle.
|
||||
*
|
||||
* @param key The resource key
|
||||
*
|
||||
* @return
|
||||
*
|
||||
* @pre key != null
|
||||
*/
|
||||
public static GlobalizedMessage globalize(final String key) {
|
||||
return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param key
|
||||
* @param args
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static GlobalizedMessage globalize(final String key,
|
||||
final Object[] args) {
|
||||
return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE, args);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper class to be able to use a PrintListener to set the titel of the
|
||||
* page.
|
||||
*/
|
||||
private static class TitlePrinter implements PrintListener {
|
||||
|
||||
/**
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@Override
|
||||
public void prepare(final PrintEvent event) {
|
||||
final Label l = (Label) event.getTarget();
|
||||
|
||||
l.setLabel(CMS.getContext().getContentSection().getLabel());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2003-2004 Red Hat Inc. 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.PageState;
|
||||
import com.arsdigita.bebop.RequestLocal;
|
||||
import com.arsdigita.cms.CMS;
|
||||
|
||||
import org.librecms.contentsection.ContentSection;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public final class ContentSectionRequestLocal extends RequestLocal {
|
||||
|
||||
@Override
|
||||
protected Object initialValue(final PageState state) {
|
||||
return CMS.getContext().getContentSection();
|
||||
}
|
||||
|
||||
public final ContentSection getContentSection(final PageState state) {
|
||||
return (ContentSection) get(state);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,365 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2001-2004 Red Hat Inc. 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.ActionLink;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
import com.arsdigita.bebop.Resettable;
|
||||
import com.arsdigita.bebop.SegmentedPanel;
|
||||
import com.arsdigita.bebop.SingleSelectionModel;
|
||||
import com.arsdigita.bebop.event.ActionEvent;
|
||||
import com.arsdigita.bebop.event.ActionListener;
|
||||
import com.arsdigita.bebop.event.ChangeEvent;
|
||||
import com.arsdigita.bebop.event.ChangeListener;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.event.FormSubmissionListener;
|
||||
import com.arsdigita.bebop.parameters.LongParameter;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
|
||||
import com.arsdigita.cms.ui.authoring.CreationSelector;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import com.arsdigita.toolbox.ui.ActionGroup;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.security.PermissionChecker;
|
||||
import org.libreccm.security.PermissionManager;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.Folder;
|
||||
import org.librecms.contentsection.privileges.ItemPrivileges;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Encapsulates a {@link FolderManipulator} in order to create a flat item
|
||||
* listing. Also contains a new item form.
|
||||
*
|
||||
* @author <a href="mailto:sfreidin@arsdigita.com">Stanislav Freidin</a>
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class FlatItemList extends SegmentedPanel implements FormProcessListener,
|
||||
ChangeListener,
|
||||
FormSubmissionListener,
|
||||
Resettable,
|
||||
ActionListener {
|
||||
|
||||
private static final String CONTENT_TYPE_ID = "ct";
|
||||
|
||||
// The folder selectors
|
||||
private final SingleSelectionModel<Long> typeSelectionModel;
|
||||
|
||||
private CreationSelector creationSelector;
|
||||
|
||||
private final ActionLink createFolderAction;
|
||||
|
||||
private final Segment browseSegment;
|
||||
|
||||
private final Segment newItemSegment;
|
||||
|
||||
private final Segment newFolderSegment;
|
||||
|
||||
private final Segment editFolderSegment;
|
||||
|
||||
private final Segment permissionsSegment;
|
||||
|
||||
// Folder edit/rename functionality.
|
||||
private final ActionLink editFolderAction;
|
||||
|
||||
private final Label contentLabel;
|
||||
|
||||
private final Label chooseLabel;
|
||||
|
||||
private final StringParameter selectedLanguageParam;
|
||||
|
||||
/**
|
||||
* Construct a new item listing pane. The provided folder selection model is
|
||||
* used to keep track of the currently displayed folder.
|
||||
*
|
||||
* @param folderRequestLocal
|
||||
* @param folderSelectionModel maintains the currently displayed folder.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public FlatItemList() {
|
||||
|
||||
setIdAttr("flat-item-list");
|
||||
|
||||
newItemSegment = addSegment();
|
||||
newItemSegment.setIdAttr("folder-new-item");
|
||||
|
||||
newFolderSegment = addSegment();
|
||||
newFolderSegment.setIdAttr("folder-new-folder");
|
||||
|
||||
editFolderSegment = addSegment();
|
||||
editFolderSegment.setIdAttr("folder-edit-folder");
|
||||
|
||||
browseSegment = addSegment();
|
||||
browseSegment.setIdAttr("folder-browse");
|
||||
|
||||
final ActionGroup browseActions = new ActionGroup();
|
||||
browseSegment.add(browseActions);
|
||||
|
||||
// The top 'browse' segment
|
||||
contentLabel = new Label(globalize("cms.ui.contents_of"), false);
|
||||
browseSegment.addHeader(contentLabel);
|
||||
chooseLabel = new Label(globalize("cms.ui.choose_target_folder"),
|
||||
false);
|
||||
browseSegment.addHeader(chooseLabel);
|
||||
|
||||
|
||||
createFolderAction = new ActionLink(new Label(globalize(
|
||||
"cms.ui.new_folder")));
|
||||
createFolderAction.addActionListener(this);
|
||||
browseActions.addAction(createFolderAction);
|
||||
|
||||
editFolderAction = new ActionLink(new Label(globalize(
|
||||
"cms.ui.edit_folder")));
|
||||
editFolderAction.addActionListener(this);
|
||||
browseActions.addAction(editFolderAction);
|
||||
|
||||
permissionsSegment = addSegment();
|
||||
permissionsSegment.setIdAttr("folder-permissions");
|
||||
|
||||
final ActionGroup permissionActions = new ActionGroup();
|
||||
permissionsSegment.add(permissionActions);
|
||||
|
||||
permissionsSegment.addHeader(new Label(new GlobalizedMessage(
|
||||
"cms.ui.permissions", CmsConstants.CMS_BUNDLE)));
|
||||
|
||||
selectedLanguageParam = new StringParameter(
|
||||
ContentItemPage.SELECTED_LANGUAGE);
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final PermissionManager permissionManager = cdiUtil.findBean(
|
||||
PermissionManager.class);
|
||||
final List<String> privileges = permissionManager
|
||||
.listDefiniedPrivileges(ItemPrivileges.class);
|
||||
final Map<String, String> privNameMap = new HashMap<>();
|
||||
privileges.forEach(privilege -> privNameMap.put(privilege, privilege));
|
||||
|
||||
newItemSegment.addHeader(new Label(globalize("cms.ui.new_item")));
|
||||
typeSelectionModel = new ParameterSingleSelectionModel<>(
|
||||
new LongParameter(CONTENT_TYPE_ID));
|
||||
typeSelectionModel.addChangeListener(this);
|
||||
|
||||
|
||||
//m_newItemSeg.add(new Label("<br/>", false));
|
||||
|
||||
// The 'new folder' segment
|
||||
newFolderSegment.addHeader(new Label(globalize("cms.ui.new_folder")));
|
||||
// final Form folderCreate = new Form("fcreat");
|
||||
|
||||
//folderCreator.add(folderCreator);
|
||||
newFolderSegment.add(new Label("<br/>", false));
|
||||
|
||||
editFolderSegment.addHeader(new Label(globalize("cms.ui.edit_folder")));
|
||||
//Form folderEditorForm = new Form("fedit_form");
|
||||
//folderEditorForm.add(folderEditor);
|
||||
editFolderSegment.add(new Label("<br/>", false));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(final Page page) {
|
||||
super.register(page);
|
||||
|
||||
page.setVisibleDefault(chooseLabel, false);
|
||||
// page.setVisibleDefault(browseSegment, true);
|
||||
page.setVisibleDefault(newItemSegment, false);
|
||||
page.setVisibleDefault(newFolderSegment, false);
|
||||
page.setVisibleDefault(editFolderSegment, false);
|
||||
|
||||
page.addComponentStateParam(this,
|
||||
typeSelectionModel.getStateParameter());
|
||||
page.addGlobalStateParam(selectedLanguageParam);
|
||||
|
||||
page.addActionListener(new ActionListener() {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
if (state.isVisibleOnPage(FlatItemList.this)) {
|
||||
showHideSegments(state);
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Show/hide segments based on access checks.
|
||||
*
|
||||
* @param state The page state
|
||||
*
|
||||
* @pre ( state != null )
|
||||
*/
|
||||
private void showHideSegments(final PageState state) {
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final PermissionChecker permissionChecker = cdiUtil.findBean(
|
||||
PermissionChecker.class);
|
||||
final Folder folder = null;
|
||||
|
||||
// MP: This should be checked on the current folder instead of just
|
||||
// the content section.
|
||||
final boolean newItem = permissionChecker.isPermitted(
|
||||
ItemPrivileges.CREATE_NEW, folder);
|
||||
|
||||
if (!newItem) {
|
||||
browseMode(state);
|
||||
}
|
||||
|
||||
createFolderAction.setVisible(state, newItem);
|
||||
|
||||
final boolean editItem = permissionChecker.isPermitted(
|
||||
ItemPrivileges.EDIT, folder);
|
||||
|
||||
editFolderAction.setVisible(state, editItem);
|
||||
// chooseLabel.setVisible(state, editItem);
|
||||
// editFolderSegment.setVisible(state, editItem);
|
||||
|
||||
if (permissionChecker.isPermitted(ItemPrivileges.ADMINISTER, folder)) {
|
||||
permissionsSegment.setVisible(state, true);
|
||||
} else {
|
||||
permissionsSegment.setVisible(state, false);
|
||||
}
|
||||
}
|
||||
|
||||
private void browseMode(final PageState state) {
|
||||
browseSegment.setVisible(state, true);
|
||||
permissionsSegment.setVisible(state, true);
|
||||
chooseLabel.setVisible(state, false);
|
||||
contentLabel.setVisible(state, true);
|
||||
newItemSegment.setVisible(state, false);
|
||||
newFolderSegment.setVisible(state, false);
|
||||
editFolderSegment.setVisible(state, false);
|
||||
|
||||
typeSelectionModel.clearSelection(state);
|
||||
}
|
||||
|
||||
private void newItemMode(final PageState state) {
|
||||
permissionsSegment.setVisible(state, false);
|
||||
newItemSegment.setVisible(state, true);
|
||||
}
|
||||
|
||||
private void newFolderMode(final PageState state) {
|
||||
permissionsSegment.setVisible(state, false);
|
||||
newFolderSegment.setVisible(state, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void submitted(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final FormSectionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
final Object source = event.getSource();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stateChanged(final ChangeEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
if (event.getSource().equals(typeSelectionModel)) {
|
||||
if (!typeSelectionModel.isSelected(state)) {
|
||||
browseMode(state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
final Object source = event.getSource();
|
||||
if (source == createFolderAction) {
|
||||
newFolderMode(state);
|
||||
} else if (source == editFolderAction) {
|
||||
permissionsSegment.setVisible(state, false);
|
||||
editFolderSegment.setVisible(state, true);
|
||||
}
|
||||
// else if (source == togglePrivateAction) {
|
||||
// togglePermissions(state);
|
||||
// }
|
||||
// } else if (source == m_setHomeFolderAction) {
|
||||
// User user = Web.getWebContext().getUser();
|
||||
// Folder folder = m_folder.getFolder(state);
|
||||
// user = (User) DomainObjectFactory.newInstance(user.getOID());
|
||||
// Folder.setUserHomeFolder(user, folder);
|
||||
// } else if (source == m_removeHomeFolderAction) {
|
||||
// User user = Web.getWebContext().getUser();
|
||||
// ContentSection section = CMS.getContext().getContentSection();
|
||||
// UserHomeFolderMap map = UserHomeFolderMap
|
||||
// .findUserHomeFolderMap(user, section);
|
||||
// if (map != null) {
|
||||
// map.delete();
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
private void togglePermissions(final PageState state) {
|
||||
final Folder currentFolder = null;
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final PermissionChecker permissionChecker = cdiUtil.findBean(
|
||||
PermissionChecker.class);
|
||||
permissionChecker.checkPermission(ItemPrivileges.ADMINISTER,
|
||||
currentFolder);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset(final PageState state) {
|
||||
browseMode(state);
|
||||
// switching between folders used to keep showing the permission pane
|
||||
// in the same perm mode (direct or inherited) regardless
|
||||
// of the folder status
|
||||
}
|
||||
|
||||
|
||||
public void setPermissionLinkVis(final PageState state) {
|
||||
// final Folder currentFolder = folderRequestLocal.getFolder(state);
|
||||
// final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
// final PermissionChecker permissionChecker = cdiUtil.findBean(
|
||||
// PermissionChecker.class);
|
||||
// if (!permissionChecker.isPermitted(ItemPrivileges.ADMINISTER,
|
||||
// currentFolder)) {
|
||||
// togglePrivateAction.setVisible(state, false);
|
||||
// }
|
||||
}
|
||||
|
||||
/**
|
||||
* Getting the GlobalizedMessage using a CMS Class targetBundle.
|
||||
*
|
||||
* @param key The resource key
|
||||
*
|
||||
* @pre ( key != null )
|
||||
*/
|
||||
private static GlobalizedMessage globalize(final String key) {
|
||||
return ContentSectionPage.globalize(key);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,77 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2001-2004 Red Hat Inc. 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.Form;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.Resettable;
|
||||
import com.arsdigita.bebop.SimpleContainer;
|
||||
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
|
||||
/**
|
||||
* A wrapper around the {@link ItemSearchSection} which embeds the form section
|
||||
* in a form.
|
||||
*
|
||||
* @author Stanislav Freidin (sfreidin@arsdigita.com)
|
||||
* @author <a href="jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ItemSearch extends Form implements Resettable {
|
||||
|
||||
public static final String SINGLE_TYPE_PARAM = ItemSearchSection.SINGLE_TYPE_PARAM;
|
||||
|
||||
private ItemSearchSection itemSearchSection;
|
||||
|
||||
/**
|
||||
* Construct a new <code>ItemSearch</code> component Default to limit the
|
||||
* search to current content section
|
||||
*
|
||||
* @param context the context for the retrieved items. Should be
|
||||
* {@link ContentItem#DRAFT} or {@link ContentItem#LIVE}
|
||||
*/
|
||||
public ItemSearch(String context) {
|
||||
this(context, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a new <code>ItemSearch</code> component
|
||||
*
|
||||
* @param context the context for the retrieved items. Should be
|
||||
* {@link ContentItem#DRAFT} or {@link ContentItem#LIVE}
|
||||
* @param limitToContentSection limit the search to the current content
|
||||
* section
|
||||
*/
|
||||
public ItemSearch(final String context,
|
||||
final boolean limitToContentSection) {
|
||||
super("itemSearch", new SimpleContainer());
|
||||
//setMethod("GET");
|
||||
itemSearchSection = createSearchSection(context, limitToContentSection);
|
||||
super.add(itemSearchSection);
|
||||
}
|
||||
|
||||
protected ItemSearchSection createSearchSection(final String context,
|
||||
boolean limitToContentSection) {
|
||||
return new ItemSearchSection(context, limitToContentSection);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset(final PageState state) {
|
||||
itemSearchSection.reset(state);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,189 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2003-2004 Red Hat Inc. 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.Component;
|
||||
import com.arsdigita.bebop.SimpleContainer;
|
||||
import com.arsdigita.bebop.Container;
|
||||
import com.arsdigita.bebop.Resettable;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
import com.arsdigita.bebop.FormSection;
|
||||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.parameters.BigDecimalParameter;
|
||||
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
import org.librecms.contentsection.ContentType;
|
||||
|
||||
import com.arsdigita.cms.ui.search.ItemQueryComponent;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import com.arsdigita.search.ui.ResultsPane;
|
||||
import com.arsdigita.search.ui.QueryGenerator;
|
||||
import com.arsdigita.toolbox.ui.LayoutPanel;
|
||||
|
||||
import org.librecms.CmsConstants;
|
||||
|
||||
/**
|
||||
* Contains a form for specifying search parameters, as well as a
|
||||
* {@link com.arsdigita.search.ui.ResultsPane} which will perform the search and
|
||||
* display the results
|
||||
*
|
||||
* @author Stanislav Freidin (sfreidin@arsdigita.com)
|
||||
* @version $Id: ItemSearchSection.java 1940 2009-05-29 07:15:05Z terry $
|
||||
*/
|
||||
public class ItemSearchSection extends FormSection implements Resettable {
|
||||
|
||||
public static final String SINGLE_TYPE_PARAM = "single_type";
|
||||
|
||||
private ItemQueryComponent itemQueryComponent;
|
||||
private Component resultsComponent;
|
||||
|
||||
/**
|
||||
* Construct a new <code>ItemSearchSection</code> component
|
||||
*
|
||||
* @param context the context for the retrieved items. Should be
|
||||
* {@link ContentItem#DRAFT} or {@link ContentItem#LIVE}
|
||||
* @param limitToContentSection limit the search to the current content
|
||||
* section
|
||||
*/
|
||||
public ItemSearchSection(final String context,
|
||||
final boolean limitToContentSection) {
|
||||
this(null, context, limitToContentSection);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a new <code>ItemSearchSection</code> component
|
||||
*
|
||||
* @param context the context for the retrieved items. Should be
|
||||
* {@link ContentItem#DRAFT} or {@link ContentItem#LIVE}
|
||||
* @param name The name of the search parameter for the particular
|
||||
* FormSection
|
||||
* @param limitToContentSection limit the search to the current content
|
||||
* section
|
||||
*/
|
||||
public ItemSearchSection(final String name,
|
||||
final String context,
|
||||
final boolean limitToContentSection) {
|
||||
this(name, context, limitToContentSection, null);
|
||||
}
|
||||
|
||||
public ItemSearchSection(final String name,
|
||||
final String context,
|
||||
final boolean limitToContentSection,
|
||||
final ContentType type) {
|
||||
super(new SimpleContainer());
|
||||
final String thisName;
|
||||
if (name == null) {
|
||||
thisName = "itemSearch";
|
||||
} else {
|
||||
thisName = name;
|
||||
}
|
||||
|
||||
if (type == null) {
|
||||
itemQueryComponent = createQueryGenerator(context,
|
||||
limitToContentSection);
|
||||
} else {
|
||||
itemQueryComponent = createQueryGenerator(context,
|
||||
limitToContentSection,
|
||||
type);
|
||||
}
|
||||
resultsComponent = createResultsPane(itemQueryComponent);
|
||||
|
||||
LayoutPanel searchPanel = new LayoutPanel();
|
||||
searchPanel.setLeft(itemQueryComponent);
|
||||
searchPanel.setBody(resultsComponent);
|
||||
this.add(searchPanel);
|
||||
|
||||
addQueryGenerator(this);
|
||||
addResultsPane(this);
|
||||
addFormListener();
|
||||
|
||||
setClassAttr("itemSearch");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void reset(final PageState state) {
|
||||
resultsComponent.setVisible(state, false);
|
||||
}
|
||||
|
||||
protected ItemQueryComponent createQueryGenerator(
|
||||
final String context, final boolean limitToContentSection) {
|
||||
return new ItemQueryComponent(context, limitToContentSection);
|
||||
}
|
||||
|
||||
protected ItemQueryComponent createQueryGenerator(
|
||||
final String context,
|
||||
final boolean limitToContentSection,
|
||||
final ContentType type) {
|
||||
|
||||
return new ItemQueryComponent(context, limitToContentSection, type);
|
||||
}
|
||||
|
||||
protected Component createResultsPane(QueryGenerator generator) {
|
||||
ResultsPane pane = new ResultsPane(generator);
|
||||
pane.setRelativeURLs(true);
|
||||
pane.setSearchHelpMsg(new GlobalizedMessage("cms.ui.search.help",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
pane.setNoResultsMsg(new GlobalizedMessage("cms.ui.search.no_results",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
return pane;
|
||||
}
|
||||
|
||||
protected void addResultsPane(final Container container) {
|
||||
container.add(resultsComponent);
|
||||
}
|
||||
|
||||
protected void addQueryGenerator(final Container container) {
|
||||
container.add(itemQueryComponent);
|
||||
}
|
||||
|
||||
protected void processQuery(final PageState state) {
|
||||
resultsComponent.setVisible(state, itemQueryComponent.hasQuery(state));
|
||||
}
|
||||
|
||||
protected void addFormListener() {
|
||||
addProcessListener(new SearchFormProcessListener());
|
||||
}
|
||||
|
||||
// Hide results by default
|
||||
@Override
|
||||
public void register(final Page page) {
|
||||
super.register(page);
|
||||
page.setVisibleDefault(resultsComponent, false);
|
||||
page.addGlobalStateParam(new BigDecimalParameter(SINGLE_TYPE_PARAM));
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays the "keywords" and "content types" widgets
|
||||
*/
|
||||
private class SearchFormProcessListener implements FormProcessListener {
|
||||
|
||||
@Override
|
||||
public void process(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
PageState s = event.getPageState();
|
||||
processQuery(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,295 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. 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.ColumnPanel;
|
||||
import com.arsdigita.bebop.Form;
|
||||
import com.arsdigita.bebop.FormData;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.RequestLocal;
|
||||
import com.arsdigita.bebop.SimpleContainer;
|
||||
import com.arsdigita.bebop.event.FormInitListener;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.form.CheckboxGroup;
|
||||
import com.arsdigita.bebop.form.Hidden;
|
||||
import com.arsdigita.bebop.form.Option;
|
||||
import com.arsdigita.bebop.form.OptionGroup;
|
||||
import com.arsdigita.bebop.form.Submit;
|
||||
import com.arsdigita.bebop.form.Widget;
|
||||
import com.arsdigita.bebop.parameters.NotNullValidationListener;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.xml.Element;
|
||||
|
||||
import org.libreccm.core.UnexpectedErrorException;
|
||||
import org.libreccm.security.Party;
|
||||
import org.librecms.CmsConstants;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.TooManyListenersException;
|
||||
|
||||
/**
|
||||
* Form for adding multiple parties to a role.
|
||||
*
|
||||
* @author Scott Seago (scott@arsdigita.com)
|
||||
* @author <a href="mailto:yannick.buelter@yabue.de">Yannick Bülter</a>
|
||||
*/
|
||||
public abstract class PartyAddForm extends SimpleContainer
|
||||
implements FormInitListener, FormProcessListener {
|
||||
|
||||
private final static String SEARCH_QUERY = "searchQuery";
|
||||
private final static String PARTIES = "parties";
|
||||
private final static String SUBMIT = "addSubmit";
|
||||
private final static String CANCEL = "addCancel";
|
||||
|
||||
private Widget searchWidget;
|
||||
private RequestLocal queryRequestLocal;
|
||||
|
||||
private CMSContainer noMatchesContainer;
|
||||
private CMSContainer matchesContainer;
|
||||
|
||||
private Form form;
|
||||
private Hidden searchQueryField;
|
||||
private Submit cancelButton;
|
||||
|
||||
/**
|
||||
* Private access prevents this constructor from ever being called directly.
|
||||
*/
|
||||
private PartyAddForm() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param searchWidget The widget on the search form that contains the value
|
||||
* of the search string.
|
||||
*/
|
||||
public PartyAddForm(final Widget searchWidget) {
|
||||
|
||||
this();
|
||||
|
||||
this.searchWidget = searchWidget;
|
||||
|
||||
queryRequestLocal = new RequestLocal() {
|
||||
|
||||
@Override
|
||||
protected Object initialValue(final PageState state) {
|
||||
return makeQuery(state);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
form = makeForm();
|
||||
|
||||
final Label title = new Label(new GlobalizedMessage("cms.ui.matches",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
title.setFontWeight(Label.BOLD);
|
||||
|
||||
final Label label = new Label(new GlobalizedMessage(
|
||||
"cms.ui.there_was_no_one_matching_the_search_criteria",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
label.setFontWeight("em");
|
||||
|
||||
noMatchesContainer = new CMSContainer();
|
||||
noMatchesContainer.add(title);
|
||||
noMatchesContainer.add(label);
|
||||
super.add(noMatchesContainer);
|
||||
|
||||
matchesContainer = new CMSContainer();
|
||||
matchesContainer.add(title);
|
||||
matchesContainer.add(form);
|
||||
super.add(matchesContainer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the form used to add parties.
|
||||
*
|
||||
* @return The form
|
||||
*/
|
||||
private Form makeForm() {
|
||||
|
||||
final CMSForm addPartyForm = new CMSForm("AddParties") {
|
||||
|
||||
@Override
|
||||
public final boolean isCancelled(final PageState state) {
|
||||
return cancelButton.isSelected(state);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
// This hidden field will store the search query. A hidden widget is
|
||||
// used instead of a request local variable because the search query
|
||||
// should only be updated when the search form is submitted.
|
||||
searchQueryField = new Hidden(SEARCH_QUERY);
|
||||
addPartyForm.add(searchQueryField, ColumnPanel.FULL_WIDTH);
|
||||
|
||||
final Label hintLabel = new Label(
|
||||
new GlobalizedMessage("cms.ui.party_add_form.hint",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
addPartyForm.add(hintLabel, ColumnPanel.FULL_WIDTH);
|
||||
|
||||
// Add the list of parties that can be added.
|
||||
final CheckboxGroup partyCheckboxes = new CheckboxGroup(PARTIES);
|
||||
partyCheckboxes.addValidationListener(new NotNullValidationListener());
|
||||
try {
|
||||
partyCheckboxes.addPrintListener(event -> {
|
||||
final CheckboxGroup target = (CheckboxGroup) event.getTarget();
|
||||
final PageState state = event.getPageState();
|
||||
// Ensures that the init listener gets fired before the
|
||||
// print listeners.
|
||||
final FormData data = addPartyForm.getFormData(state);
|
||||
addParties(state, target);
|
||||
});
|
||||
} catch (TooManyListenersException ex) {
|
||||
throw new UnexpectedErrorException(ex);
|
||||
}
|
||||
addPartyForm.add(partyCheckboxes, ColumnPanel.FULL_WIDTH);
|
||||
|
||||
// Submit and Cancel buttons.
|
||||
final SimpleContainer buttonContainer = new SimpleContainer();
|
||||
final Submit submitButton = new Submit(SUBMIT,
|
||||
new GlobalizedMessage(
|
||||
"cms.ui.save",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
buttonContainer.add(submitButton);
|
||||
cancelButton = new Submit(CANCEL,
|
||||
new GlobalizedMessage("cms.ui.cancel",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
buttonContainer.add(cancelButton);
|
||||
addPartyForm.add(buttonContainer, ColumnPanel.FULL_WIDTH
|
||||
| ColumnPanel.CENTER);
|
||||
|
||||
addPartyForm.addInitListener(this);
|
||||
addPartyForm.addProcessListener(this);
|
||||
|
||||
return addPartyForm;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the form for adding parties.
|
||||
*
|
||||
* @return The "add party" form
|
||||
*/
|
||||
public Form getForm() {
|
||||
return form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the widget that contains the search string.
|
||||
*
|
||||
* @return The widget that contains the search string
|
||||
*/
|
||||
protected Widget getSearchWidget() {
|
||||
return searchQueryField;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if the form is cancelled, false otherwise.
|
||||
*
|
||||
* @param state The page state
|
||||
*
|
||||
* @return true if the form is cancelled, false otherwise.
|
||||
*
|
||||
* @pre ( state != null )
|
||||
*/
|
||||
public boolean isCancelled(final PageState state) {
|
||||
return cancelButton.isSelected(state);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds parties to the option group.
|
||||
*
|
||||
* @param state The page state
|
||||
* @param target The option group
|
||||
*
|
||||
* @pre ( state != null && target != null )
|
||||
*/
|
||||
private void addParties(final PageState state, final OptionGroup target) {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
final List<Party> parties = (List<Party>) queryRequestLocal.get(state);
|
||||
|
||||
target.clearOptions();
|
||||
|
||||
for (final Party party : parties) {
|
||||
target.addOption(new Option(
|
||||
Long.toString(party.getPartyId()),
|
||||
new Label(new GlobalizedMessage(party.getName()))
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a {@link Object} that encapsulates search results.
|
||||
*
|
||||
* @param state The page state
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected abstract List<Party> makeQuery(PageState state);
|
||||
|
||||
/**
|
||||
* Stores the search query in the hidden field.
|
||||
*
|
||||
* @param event The form event
|
||||
*
|
||||
* @throws com.arsdigita.bebop.FormProcessException
|
||||
*/
|
||||
@Override
|
||||
public void init(final FormSectionEvent event) throws FormProcessException {
|
||||
|
||||
PageState state = event.getPageState();
|
||||
|
||||
searchQueryField.setValue(state, searchWidget.getValue(state));
|
||||
}
|
||||
|
||||
/**
|
||||
* Process listener for the "Add parties" form.
|
||||
*
|
||||
* @param event The form event
|
||||
*
|
||||
* @throws com.arsdigita.bebop.FormProcessException
|
||||
*/
|
||||
@Override
|
||||
public abstract void process(FormSectionEvent event)
|
||||
throws FormProcessException;
|
||||
|
||||
/**
|
||||
* Displays the appropriate frame.
|
||||
*
|
||||
* @param state The page state
|
||||
* @param parent The parent DOM element
|
||||
*/
|
||||
@Override
|
||||
public void generateXML(final PageState state, final Element parent) {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
final List<Party> searchResults = (List<Party>) queryRequestLocal.get(state);
|
||||
|
||||
if (searchResults.size() > 0) {
|
||||
matchesContainer.generateXML(state, parent);
|
||||
} else {
|
||||
noMatchesContainer.generateXML(state, parent);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. 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.Label;
|
||||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.bebop.form.Submit;
|
||||
import com.arsdigita.bebop.form.TextField;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.util.Assert;
|
||||
|
||||
/**
|
||||
* Form to search for parties to be added to a staff group.
|
||||
*
|
||||
* @author Scott Seago <sseago@redhat.com>
|
||||
* @version $Id: PartySearchForm.java 1942 2009-05-29 07:53:23Z terry $
|
||||
*/
|
||||
public class PartySearchForm extends BaseForm {
|
||||
|
||||
private final TextField searchField;
|
||||
|
||||
public PartySearchForm() {
|
||||
super("SearchParties", gz("cms.ui.search"));
|
||||
|
||||
addComponent(new Label(gz("cms.ui.search_prompt")));
|
||||
|
||||
searchField = new TextField(new StringParameter("query"));
|
||||
searchField.setSize(40);
|
||||
addComponent(searchField);
|
||||
|
||||
addAction(new Submit("finish", gz("cms.ui.search")));
|
||||
addAction(new Cancel());
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void register(final Page page) {
|
||||
super.register(page);
|
||||
|
||||
Assert.isTrue(page.stateContains(this));
|
||||
}
|
||||
|
||||
public TextField getSearchWidget() {
|
||||
return searchField;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,158 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. 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.Component;
|
||||
import com.arsdigita.bebop.ControlLink;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.List;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
import com.arsdigita.bebop.list.ListModel;
|
||||
import com.arsdigita.bebop.util.BebopConstants;
|
||||
import com.arsdigita.cms.CMS;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.Assert;
|
||||
import com.arsdigita.xml.Element;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* This list offers the option for the code to provide the developer with links
|
||||
* to sort the given categories.
|
||||
*
|
||||
* NOTE: This UI currently does not scale well with large numbers of items since
|
||||
* it just lists all of them. It would probably be nice to integrate a paginator
|
||||
* as well to as to allow the user to move an item in large distances and to
|
||||
* insert an item in the middle. Right now, when you add an item it is just
|
||||
* placed at the end. However, if you want the item to appear in the middle then
|
||||
* you must hit the "up" arrow n/2 times where n is the number of items in the
|
||||
* list. This clearly is not a good setup.
|
||||
*
|
||||
*
|
||||
* @author Randy Graebner (randyg@alum.mit.edu)
|
||||
* @author <a href="mailto:yannick.buelter@yabue.de">Yannick Bülter</a>
|
||||
*/
|
||||
public abstract class SortableList extends List {
|
||||
|
||||
// It would be really nice if this used the save variable as is
|
||||
// used by List but because List has it as private, we cannot do that.
|
||||
private static final String SELECT_EVENT = "s";
|
||||
protected static final String PREV_EVENT = "prev";
|
||||
protected static final String NEXT_EVENT = "next";
|
||||
public boolean m_sortItems;
|
||||
|
||||
/**
|
||||
* This just makes a standard {@link SortableList}
|
||||
*/
|
||||
public SortableList(ParameterSingleSelectionModel model) {
|
||||
this(model, false);
|
||||
}
|
||||
|
||||
public SortableList(ParameterSingleSelectionModel model,
|
||||
boolean suppressSort) {
|
||||
super(model);
|
||||
m_sortItems = !suppressSort;
|
||||
}
|
||||
|
||||
/**
|
||||
* This geneates the XML as specified by the arguments pass in to the
|
||||
* constructor.
|
||||
*/
|
||||
public void generateXML(PageState state, Element parent) {
|
||||
if (!isVisible(state)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// They want the special sort items
|
||||
ListModel m = getModel(state);
|
||||
|
||||
if (!m.next()) {
|
||||
super.generateXML(state, parent);
|
||||
return;
|
||||
}
|
||||
|
||||
// because m.next() returned true, we know there are items
|
||||
// in the list
|
||||
Element list = parent
|
||||
.newChildElement("cms:sortableList", CMS.CMS_XML_NS);
|
||||
exportAttributes(list);
|
||||
|
||||
Component c;
|
||||
Object selKey = getSelectedKey(state);
|
||||
int i = 0;
|
||||
boolean hasNext;
|
||||
do {
|
||||
Element item = list.newChildElement(BebopConstants.BEBOP_CELL,
|
||||
BEBOP_XML_NS);
|
||||
if (m_sortItems) {
|
||||
|
||||
item.addAttribute("configure", "true");
|
||||
}
|
||||
String key = m.getKey();
|
||||
Assert.exists(key);
|
||||
|
||||
// Converting both keys to String for comparison
|
||||
// since ListModel.getKey returns a String
|
||||
boolean selected = (selKey != null)
|
||||
&& key.equals(selKey.toString());
|
||||
|
||||
if (selected) {
|
||||
item.addAttribute("selected", "selected");
|
||||
}
|
||||
|
||||
generateLabelXML(state, item,
|
||||
new Label(new GlobalizedMessage(m.getElement()
|
||||
.toString())), key, m.getElement());
|
||||
|
||||
hasNext = m.next();
|
||||
|
||||
// Add attributes containing URLs that fire control events
|
||||
// for various portlet actions
|
||||
try {
|
||||
// Maybe add attribute containing URL for "move up" link
|
||||
if (i > 0) {
|
||||
state.setControlEvent(this, PREV_EVENT, key);
|
||||
item.addAttribute("prevURL", state.stateAsURL());
|
||||
}
|
||||
|
||||
// Maybe add attribute containing URL for "move down" link
|
||||
if (hasNext) {
|
||||
state.setControlEvent(this, NEXT_EVENT, key);
|
||||
item.addAttribute("nextURL", state.stateAsURL());
|
||||
}
|
||||
|
||||
} catch (IOException ex) {
|
||||
throw new IllegalStateException("Caught IOException: "
|
||||
+ ex.getMessage());
|
||||
}
|
||||
i++;
|
||||
} while (hasNext);
|
||||
|
||||
state.clearControlEvent();
|
||||
}
|
||||
|
||||
protected void generateLabelXML(PageState state, Element parent,
|
||||
Label label, String key, Object element) {
|
||||
state.setControlEvent(this, SELECT_EVENT, key);
|
||||
Component c = new ControlLink(label);
|
||||
c.generateXML(state, parent);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,80 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2003-2004 Red Hat Inc. 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.PageState;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.toolbox.ui.ContextBar;
|
||||
import com.arsdigita.web.URL;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.web.ApplicationRepository;
|
||||
import org.libreccm.web.CcmApplication;
|
||||
import org.librecms.CmsConstants;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* The context bar of the content center UI.</p>
|
||||
*
|
||||
* @author Justin Ross
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
// Made public (instead of unspecified) in 6.6.8
|
||||
public class WorkspaceContextBar extends ContextBar {
|
||||
|
||||
/**
|
||||
* A logger instance, primarily to assist debugging .
|
||||
*/
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
WorkspaceContextBar.class);
|
||||
|
||||
/**
|
||||
*
|
||||
* @param state
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
protected List<Entry> entries(final PageState state) {
|
||||
|
||||
final List<Entry> entries = super.entries(state);
|
||||
|
||||
final String centerTitle = (String) new GlobalizedMessage(
|
||||
"cms.ui.content_center", CmsConstants.CMS_BUNDLE).localize();
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final ApplicationRepository appRepo = cdiUtil.findBean(
|
||||
ApplicationRepository.class);
|
||||
final List<CcmApplication> apps = appRepo.findByType(
|
||||
CmsConstants.CONTENT_CENTER_APP_TYPE);
|
||||
|
||||
final String centerPath = apps.get(0).getPrimaryUrl();
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Got Url: " + centerPath);
|
||||
}
|
||||
final URL url = URL.there(state.getRequest(), centerPath);
|
||||
entries.add(new Entry(centerTitle, url));
|
||||
|
||||
return entries;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2004 Red Hat Inc. 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.authoring;
|
||||
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.form.Widget;
|
||||
import com.arsdigita.bebop.parameters.LongParameter;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.categorization.ui.ACSObjectCategoryForm;
|
||||
import com.arsdigita.cms.CMS;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.libreccm.core.CcmObject;
|
||||
|
||||
/**
|
||||
* (No description available yet).
|
||||
*
|
||||
* Usage of this class is configured in parameter
|
||||
* c.ad.cms.category_authoring_add_form
|
||||
*/
|
||||
public class ItemCategoryForm extends ACSObjectCategoryForm {
|
||||
|
||||
private static Logger LOGGER = LogManager.getLogger(ItemCategoryForm.class);
|
||||
|
||||
public ItemCategoryForm(final LongParameter rootParameter,
|
||||
final StringParameter modeParameter,
|
||||
final Widget widget) {
|
||||
|
||||
super(rootParameter, modeParameter, widget);
|
||||
LOGGER.debug("creating new ItemTerm Form with widget " + widget);
|
||||
}
|
||||
|
||||
public ItemCategoryForm(final LongParameter root,
|
||||
final StringParameter mode) {
|
||||
|
||||
this(root, mode, new CategoryWidget("category", root, mode));
|
||||
}
|
||||
|
||||
/*
|
||||
* @see com.arsdigita.categorization.ui.ACSObjectCategoryForm#getObject()
|
||||
*/
|
||||
@Override
|
||||
protected CcmObject getObject(final PageState state) {
|
||||
return CMS.getContext().getContentItem();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,211 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2004 Red Hat Inc. 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.authoring;
|
||||
|
||||
import com.arsdigita.bebop.SimpleContainer;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.bebop.SimpleComponent;
|
||||
import com.arsdigita.bebop.event.ActionListener;
|
||||
import com.arsdigita.bebop.event.ActionEvent;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.bebop.Resettable;
|
||||
import com.arsdigita.bebop.parameters.LongParameter;
|
||||
import com.arsdigita.web.RedirectSignal;
|
||||
|
||||
import com.arsdigita.cms.CMS;
|
||||
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.util.Classes;
|
||||
|
||||
import org.librecms.CMSConfig;
|
||||
import org.libreccm.core.UnexpectedErrorException;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.ui.authoring.ContentItemAuthoringStep;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
@ContentItemAuthoringStep(
|
||||
labelBundle = CmsConstants.CMS_BUNDLE,
|
||||
labelKey = "item_category_step.label",
|
||||
descriptionBundle = CmsConstants.CMS_BUNDLE,
|
||||
descriptionKey = "item_category_step.description"
|
||||
)
|
||||
public class ItemCategoryStep extends SimpleContainer implements Resettable {
|
||||
|
||||
private final LongParameter rootParameter;
|
||||
private final StringParameter modeParameter;
|
||||
|
||||
private final ItemCategorySummary itemCategorySummary;
|
||||
|
||||
private final SimpleComponent addComponent;
|
||||
|
||||
private final SimpleComponent[] extensionSummaries;
|
||||
private final SimpleComponent[] extensionForms;
|
||||
private int extensionsCount;
|
||||
|
||||
public ItemCategoryStep(final ItemSelectionModel itemSelectionModel,
|
||||
final AuthoringKitWizard authoringKitWizard,
|
||||
final StringParameter selectedLanguage) {
|
||||
|
||||
super("cms:categoryStep", CMS.CMS_XML_NS);
|
||||
|
||||
rootParameter = new LongParameter("root");
|
||||
modeParameter = new StringParameter("mode");
|
||||
|
||||
itemCategorySummary = new ItemCategorySummary();
|
||||
itemCategorySummary.registerAction(ItemCategorySummary.ACTION_ADD,
|
||||
new AddActionListener("plain"));
|
||||
itemCategorySummary.registerAction(ItemCategorySummary.ACTION_ADD_JS,
|
||||
new AddActionListener("javascript"));
|
||||
|
||||
final String addFormClassName = null;
|
||||
final Class<?> addFormClass;
|
||||
try {
|
||||
addFormClass = Class.forName(addFormClassName);
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UnexpectedErrorException(ex);
|
||||
}
|
||||
addComponent = (SimpleComponent) Classes
|
||||
.newInstance(addFormClass,
|
||||
new Class<?>[]{LongParameter.class,
|
||||
StringParameter.class},
|
||||
new Object[]{rootParameter, modeParameter});
|
||||
addComponent.addCompletionListener(new ResetListener());
|
||||
|
||||
final String extensionClassName = CMSConfig
|
||||
.getConfig()
|
||||
.getCategoryAuthoringExtension();
|
||||
final Class<?> extensionClass;
|
||||
try {
|
||||
extensionClass = Class.forName(extensionClassName);
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UnexpectedErrorException(ex);
|
||||
}
|
||||
final ItemCategoryExtension extension = (ItemCategoryExtension) Classes
|
||||
.newInstance(extensionClass);
|
||||
|
||||
extensionSummaries = extension.getSummary();
|
||||
extensionForms = extension.getForm();
|
||||
int nSummaries = extensionSummaries.length;
|
||||
int nForms = extensionForms.length;
|
||||
if (nSummaries != nForms) {
|
||||
throw new UnexpectedErrorException(
|
||||
"Invalid category step extension.");
|
||||
}
|
||||
extensionsCount = nForms;
|
||||
for (int i = 0; i < extensionsCount; i++) {
|
||||
extensionSummaries[i]
|
||||
.addCompletionListener(new ExtensionListener(i));
|
||||
extensionForms[i].addCompletionListener(new ResetListener());
|
||||
super.add(extensionSummaries[i]);
|
||||
super.add(extensionForms[i]);
|
||||
}
|
||||
super.add(itemCategorySummary);
|
||||
super.add(addComponent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(final Page page) {
|
||||
super.register(page);
|
||||
|
||||
page.setVisibleDefault(addComponent, false);
|
||||
for (int i = 0; i < extensionsCount; i++) {
|
||||
page.setVisibleDefault(extensionForms[i], false);
|
||||
}
|
||||
page.addGlobalStateParam(rootParameter);
|
||||
page.addGlobalStateParam(modeParameter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset(final PageState state) {
|
||||
state.setValue(rootParameter, null);
|
||||
state.setValue(modeParameter, null);
|
||||
|
||||
itemCategorySummary.setVisible(state, true);
|
||||
addComponent.setVisible(state, false);
|
||||
for (int i = 0; i < extensionsCount; i++) {
|
||||
extensionSummaries[i].setVisible(state, true);
|
||||
extensionForms[i].setVisible(state, false);
|
||||
}
|
||||
}
|
||||
|
||||
private class AddActionListener implements ActionListener {
|
||||
|
||||
private final String mode;
|
||||
|
||||
public AddActionListener(final String mode) {
|
||||
this.mode = mode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent event) {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
state.setValue(rootParameter,
|
||||
new BigDecimal(state.getControlEventValue()));
|
||||
|
||||
state.setValue(ItemCategoryStep.this.modeParameter,
|
||||
mode);
|
||||
|
||||
itemCategorySummary.setVisible(state, false);
|
||||
addComponent.setVisible(state, true);
|
||||
for (int i=0;i<extensionsCount;i++) {
|
||||
extensionSummaries[i].setVisible(state, false);
|
||||
extensionForms[i].setVisible(state, false);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class ResetListener implements ActionListener {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
final PageState state = e.getPageState();
|
||||
reset(state);
|
||||
throw new RedirectSignal(state.toURL(), true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class ExtensionListener implements ActionListener {
|
||||
|
||||
private final int extensionIndex;
|
||||
|
||||
public ExtensionListener(int extensionIndex) {
|
||||
this.extensionIndex = extensionIndex;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent event) {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
itemCategorySummary.setVisible(state, false);
|
||||
addComponent.setVisible(state, false);
|
||||
for (int i=0;i<extensionsCount;i++) {
|
||||
extensionSummaries[i].setVisible(state, false);
|
||||
}
|
||||
extensionForms[extensionIndex].setVisible(state, true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui.authoring;
|
||||
|
||||
import org.libreccm.categorization.Category;
|
||||
import org.librecms.contentsection.ContentSection;
|
||||
import org.librecms.contentsection.ContentSectionRepository;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.enterprise.context.RequestScoped;
|
||||
import javax.inject.Inject;
|
||||
import javax.transaction.Transactional;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@RequestScoped
|
||||
class ItemCategoryStepController {
|
||||
|
||||
@Inject
|
||||
private ContentSectionRepository sectionRepo;
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
protected List<Category> getRootCategories(final ContentSection section) {
|
||||
|
||||
Objects.requireNonNull(section);
|
||||
|
||||
final ContentSection contentSection = sectionRepo
|
||||
.findById(section.getObjectId())
|
||||
.orElseThrow(() -> new IllegalArgumentException(String
|
||||
.format("No ContentSection with ID %d in the database.",
|
||||
section.getObjectId())));
|
||||
|
||||
return contentSection
|
||||
.getDomains()
|
||||
.stream()
|
||||
.map(domainOwnership -> domainOwnership.getDomain())
|
||||
.map(domain -> domain.getRoot())
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,91 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2004 Red Hat Inc. 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.authoring;
|
||||
|
||||
import com.arsdigita.bebop.PageState;
|
||||
|
||||
import org.libreccm.categorization.Category;
|
||||
|
||||
import com.arsdigita.categorization.ui.ACSObjectCategorySummary;
|
||||
import com.arsdigita.cms.CMS;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.core.CcmObject;
|
||||
import org.libreccm.security.PermissionChecker;
|
||||
import org.librecms.contentsection.privileges.ItemPrivileges;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class ItemCategorySummary extends ACSObjectCategorySummary {
|
||||
|
||||
public ItemCategorySummary() {
|
||||
super();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canEdit(final PageState state) {
|
||||
|
||||
final PermissionChecker permissionChecker = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(PermissionChecker.class);
|
||||
|
||||
return permissionChecker.isPermitted(ItemPrivileges.CATEGORIZE,
|
||||
CMS.getContext().getContentItem());
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @see com.arsdigita.categorization.ui.ObjectCategorySummary#getObject()
|
||||
*/
|
||||
@Override
|
||||
protected CcmObject getObject(final PageState state) {
|
||||
|
||||
return CMS.getContext().getContentItem();
|
||||
}
|
||||
|
||||
/*
|
||||
* @see com.arsdigita.categorization.ui.ObjectCategorySummary#getXMLPrefix()
|
||||
*/
|
||||
@Override
|
||||
protected String getXMLPrefix() {
|
||||
return "cms";
|
||||
}
|
||||
|
||||
/*
|
||||
* @see com.arsdigita.categorization.ui.ObjectCategorySummary#getXMLNameSpace()
|
||||
*/
|
||||
@Override
|
||||
protected String getXMLNameSpace() {
|
||||
return CMS.CMS_XML_NS;
|
||||
}
|
||||
|
||||
/*
|
||||
* @see com.arsdigita.categorization.ui.ObjectCategorySummary#getRootCategories()
|
||||
*/
|
||||
@Override
|
||||
protected List<Category> getRootCategories(final PageState state) {
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final ItemCategoryStepController controller = cdiUtil
|
||||
.findBean(ItemCategoryStepController.class);
|
||||
|
||||
return controller.getRootCategories(CMS.getContext().getContentSection());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,209 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002-2004 Red Hat Inc. 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.authoring;
|
||||
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.Resettable;
|
||||
import com.arsdigita.bebop.SimpleContainer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* A container which implements the {@link Resettable} interface and provides
|
||||
* other useful methods.
|
||||
*
|
||||
* @author <a href="mailto:phong@arsdigita.com">Phong Nguyen</a>
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ResettableContainer extends SimpleContainer implements Resettable {
|
||||
|
||||
/**
|
||||
* A list of all resettable components in this container
|
||||
*/
|
||||
private final List<Component> resettableComponents = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* A list of all components that are not visible by default
|
||||
*/
|
||||
private final List<Component> componentsNotVisibleByDefault
|
||||
= new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Constructs a new, empty {@code RessetableContainer}.
|
||||
*
|
||||
*/
|
||||
public ResettableContainer() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new, empty {@code ResettableContainer}.
|
||||
*
|
||||
* @param key The key for this container.
|
||||
*
|
||||
*/
|
||||
public ResettableContainer(final String key) {
|
||||
super();
|
||||
setKey(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new, empty {@code RessetableContainer}. The container will
|
||||
* wrap its children in the specified tag.
|
||||
*
|
||||
* @param tag The name of the XML element that will be used to wrap
|
||||
* the children of this container.
|
||||
* @param namespace The namespace for the tag.
|
||||
*
|
||||
*/
|
||||
public ResettableContainer(final String tag, final String namespace) {
|
||||
super(tag, namespace);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a component to container.
|
||||
*
|
||||
* @param component The component to be added.
|
||||
*
|
||||
*/
|
||||
@Override
|
||||
public void add(final Component component) {
|
||||
add(component, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a component to this container
|
||||
*
|
||||
* @param component The component to be added.
|
||||
* @param constraints This parameter is ignored. Child classes should
|
||||
* override the add method if they wish to provide
|
||||
* special handling of constraints.
|
||||
*
|
||||
*/
|
||||
@Override
|
||||
public void add(final Component component, final int constraints) {
|
||||
add(component);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the component to this pane with the specified default visibility.
|
||||
*
|
||||
* @param component
|
||||
* @param defaultVisibility The default visibility of this component
|
||||
*
|
||||
*
|
||||
*/
|
||||
public void add(final Component component,
|
||||
final boolean defaultVisibility) {
|
||||
|
||||
super.add(component);
|
||||
if (component instanceof Resettable) {
|
||||
resettableComponents.add(component);
|
||||
}
|
||||
if (!defaultVisibility) {
|
||||
componentsNotVisibleByDefault.add(component);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the visibility of all child components to false, except for the
|
||||
* component with the specified key.
|
||||
*
|
||||
* @param state The state of the current request.
|
||||
* @param key The key of the component. There will be no visibility
|
||||
* changes if key is null.
|
||||
*
|
||||
*/
|
||||
public void onlyShowComponent(final PageState state,
|
||||
final String key) {
|
||||
|
||||
if (key == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
final Iterator<Component> iter = children();
|
||||
Component child;
|
||||
while (iter.hasNext()) {
|
||||
child = iter.next();
|
||||
child.setVisible(state, key.equals(child.getKey()));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the visibility of all child components to false, except for the
|
||||
* specified component.
|
||||
*
|
||||
* @param state The state of the current request.
|
||||
* @param component The key of the component. There will be no visibility
|
||||
* changes if {@code component} is null.
|
||||
*
|
||||
*/
|
||||
public void onlyShowComponent(final PageState state,
|
||||
final Component component) {
|
||||
|
||||
if (component == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
final Iterator<Component> iter = children();
|
||||
Component child;
|
||||
while (iter.hasNext()) {
|
||||
child = iter.next();
|
||||
child.setVisible(state, child.equals(component));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets all resettable components added to this container.
|
||||
*
|
||||
* @param state The state of the current request.
|
||||
*
|
||||
*/
|
||||
@Override
|
||||
public void reset(final PageState state) {
|
||||
// Reset all resettable components automatically
|
||||
final Iterator<Component> iter = resettableComponents.iterator();
|
||||
while (iter.hasNext()) {
|
||||
((Resettable) iter.next()).reset(state);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers with page that this container belongs to and sets the default
|
||||
* visibility of child components.
|
||||
*
|
||||
* @param page The page this container belongs to.
|
||||
*
|
||||
*/
|
||||
@Override
|
||||
public void register(final Page page) {
|
||||
final Iterator<Component> iter = componentsNotVisibleByDefault
|
||||
.iterator();
|
||||
while (iter.hasNext()) {
|
||||
page.setVisibleDefault(iter.next(), false);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,353 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2001-2004 Red Hat Inc. 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.authoring;
|
||||
|
||||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.event.RequestEvent;
|
||||
import com.arsdigita.bebop.event.RequestListener;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.cms.ui.ContentItemPage;
|
||||
import com.arsdigita.cms.ui.SecurityPropertyEditor;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.toolbox.ui.ComponentAccess;
|
||||
import com.arsdigita.toolbox.ui.DomainObjectPropertySheet;
|
||||
|
||||
import java.text.DateFormat;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.core.UnexpectedErrorException;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
import org.librecms.CmsConstants;
|
||||
|
||||
import java.beans.BeanInfo;
|
||||
import java.beans.IntrospectionException;
|
||||
import java.beans.Introspector;
|
||||
import java.beans.PropertyDescriptor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* A simple implementation of an Authoring Kit editing step. Extends
|
||||
* {@link SecurityPropertyEditor} and provides authoring kit integration. See
|
||||
* the authoring kit documentation for more info.
|
||||
*
|
||||
* Child classes should a). call setDisplayComponent() b). call add() zero or
|
||||
* more times
|
||||
*
|
||||
* @author Stanislav Freidin
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class SimpleEditStep extends SecurityPropertyEditor
|
||||
implements AuthoringStepComponent, RequestListener {
|
||||
|
||||
private AuthoringKitWizard authoringKitWizard;
|
||||
private ItemSelectionModel itemSelectionModel;
|
||||
private String defaultEditKey = null;
|
||||
|
||||
private StringParameter streamlinedCreationParameter;
|
||||
private static final String STREAMLINED = "_streamlined";
|
||||
private static final String STREAMLINED_DONE = "1";
|
||||
|
||||
private final StringParameter selectedLanguageParameter;
|
||||
|
||||
private static List<AdditionalDisplayComponent> additionalDisplayComponents
|
||||
= new ArrayList<>();
|
||||
|
||||
/**
|
||||
* allow additional display components to be added to all implementations of
|
||||
* SimpleEditStep. This allows shared optional packages such as notes to
|
||||
* display information on the initial authoring page of all content types
|
||||
* without causing dependencies from ccm-cms.
|
||||
*
|
||||
* Any additional components must be added before the edit step is created.
|
||||
* An initialiser is a suitable location
|
||||
*
|
||||
* @param additionalDisplayComponent
|
||||
*/
|
||||
public static void addAdditionalDisplayComponent(
|
||||
AdditionalDisplayComponent additionalDisplayComponent) {
|
||||
|
||||
additionalDisplayComponents.add(additionalDisplayComponent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a new SimpleEditStep component
|
||||
*
|
||||
* @param itemModel The {@link ItemSelectionModel} which will be
|
||||
* responsible for loading the current item
|
||||
*
|
||||
* @param parent The parent wizard which contains the form.
|
||||
* The component may use the wizard's methods,
|
||||
* such as stepForward and stepBack, in its
|
||||
* process listener.
|
||||
* @param selectedLanguageParam
|
||||
*/
|
||||
public SimpleEditStep(final ItemSelectionModel itemModel,
|
||||
final AuthoringKitWizard parent,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
this(itemModel, parent, selectedLanguageParam, "");
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a new SimpleEditStep component
|
||||
*
|
||||
* @param itemSelectionModel The {@link ItemSelectionModel} which will be
|
||||
* responsible for loading the current item
|
||||
*
|
||||
* @param authoringKitWizard The parent wizard which contains the form. The
|
||||
* component may use the wizard's methods, such as
|
||||
* stepForward and stepBack, in its process
|
||||
* listener.
|
||||
* @param selectedLanguageParam
|
||||
*
|
||||
* @param parameterSuffix Additional global parameter name suffix if
|
||||
* there are multiple SimpleEditStep instances in
|
||||
* an authoring kit.
|
||||
*/
|
||||
public SimpleEditStep(final ItemSelectionModel itemSelectionModel,
|
||||
final AuthoringKitWizard authoringKitWizard,
|
||||
final StringParameter selectedLanguageParam,
|
||||
final String parameterSuffix) {
|
||||
|
||||
super();
|
||||
|
||||
Objects.requireNonNull(selectedLanguageParam);
|
||||
|
||||
this.authoringKitWizard = authoringKitWizard;
|
||||
this.itemSelectionModel = itemSelectionModel;
|
||||
|
||||
this.selectedLanguageParameter = selectedLanguageParam;
|
||||
|
||||
streamlinedCreationParameter = new StringParameter(
|
||||
authoringKitWizard.getContentType().getContentItemClass().getName()
|
||||
+ "_properties_done" + parameterSuffix);
|
||||
|
||||
authoringKitWizard
|
||||
.getList()
|
||||
.addActionListener(event -> showDisplayPane(event.getPageState()));
|
||||
|
||||
additionalDisplayComponents
|
||||
.stream()
|
||||
.forEach(component -> {
|
||||
component.setItemSelectionModel(itemSelectionModel);
|
||||
addDisplayComponent(component);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers global state parameter for cancelling streamlined creation
|
||||
*
|
||||
* @param page
|
||||
*/
|
||||
@Override
|
||||
public void register(final Page page) {
|
||||
|
||||
super.register(page);
|
||||
page.addGlobalStateParam(streamlinedCreationParameter);
|
||||
page.addRequestListener(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the parent wizard
|
||||
*/
|
||||
public AuthoringKitWizard getParentWizard() {
|
||||
return authoringKitWizard;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The item selection model
|
||||
*/
|
||||
public ItemSelectionModel getItemSelectionModel() {
|
||||
return itemSelectionModel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Forward to the next step if the streamlined creation parameter is turned
|
||||
* on _and_ the streamlined_creation global state parameter is set to
|
||||
* 'active'
|
||||
*
|
||||
* @param state the PageState
|
||||
*/
|
||||
public void maybeForwardToNextStep(final PageState state) {
|
||||
if (ContentItemPage.isStreamlinedCreationActive(state)
|
||||
&& !STREAMLINED_DONE.equals(state.getValue(
|
||||
streamlinedCreationParameter))) {
|
||||
state.setValue(streamlinedCreationParameter, STREAMLINED_DONE);
|
||||
fireCompletionEvent(state);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancel streamlined creation for this step if the streamlined creation
|
||||
* parameter is turned on _and_ the streamlined_creation global state param
|
||||
* is set to 'active'
|
||||
*
|
||||
* @param state the PageState
|
||||
*/
|
||||
public void cancelStreamlinedCreation(final PageState state) {
|
||||
|
||||
if (ContentItemPage.isStreamlinedCreationActive(state)) {
|
||||
state.setValue(streamlinedCreationParameter, STREAMLINED_DONE);
|
||||
}
|
||||
}
|
||||
|
||||
public void setDefaultEditKey(final String key) {
|
||||
defaultEditKey = key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Open the edit component if the streamlined creation parameter is turned
|
||||
* on _and_ the streamlined_creation global state param is set to 'active'
|
||||
*
|
||||
* @param e
|
||||
*/
|
||||
@Override
|
||||
public void pageRequested(final RequestEvent e) {
|
||||
PageState state = e.getPageState();
|
||||
|
||||
// XXX: This method is called on every page request for every authoring
|
||||
// step in every authoring kit. This has in the past revealed a caching
|
||||
// side-effect bug, but should in the main be harmless. Except of course
|
||||
// for performance.
|
||||
// Ideally this method would only be called for a single authoring step
|
||||
// on each page load. However, at the stage that this is called,
|
||||
// visibility has not been set, and getting the selected authoring kit
|
||||
// or component is not straightforward, and would almost certainly
|
||||
// involve duplicating code.
|
||||
// This need to be rethought.
|
||||
//if( !state.isVisibleOnPage( this ) ) return;
|
||||
if (defaultEditKey != null && itemSelectionModel.getSelectedItem(state)
|
||||
!= null) {
|
||||
|
||||
final ComponentAccess componentAccess = getAccessMap()
|
||||
.get(defaultEditKey);
|
||||
|
||||
if (ContentItemPage.isStreamlinedCreationActive(state)
|
||||
&& !STREAMLINED_DONE
|
||||
.equals(state.getValue(streamlinedCreationParameter))
|
||||
&& componentAccess != null
|
||||
&& componentAccess.canAccess(state)) {
|
||||
showComponent(state, defaultEditKey);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Public class which implements an AttributeFormatter interface for boolean
|
||||
* values. Its format(...) class returns a string representation for either
|
||||
* a false or a true value.
|
||||
*/
|
||||
protected static class LaunchDateAttributeFormatter
|
||||
implements DomainObjectPropertySheet.AttributeFormatter {
|
||||
|
||||
/**
|
||||
* Constructor, does nothing.
|
||||
*/
|
||||
public LaunchDateAttributeFormatter() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Formatter for the value of a (LaunchDate) attribute.
|
||||
*
|
||||
* It currently relays on the prerequisite that the passed in property
|
||||
* attribute is in fact a date property. No type checking yet!
|
||||
*
|
||||
* Note: the format method has to be executed at each page request. Take
|
||||
* care to properly adjust globalisation and localisation here!
|
||||
*
|
||||
* @param object Object containing the attribute to format.
|
||||
* @param attribute Name of the attribute to retrieve and format
|
||||
* @param state PageState of the request
|
||||
*
|
||||
* @return A String representation of the retrieved boolean attribute of
|
||||
* the domain object.
|
||||
*/
|
||||
@Override
|
||||
public String format(final Object object,
|
||||
final String attribute,
|
||||
final PageState state) {
|
||||
|
||||
if (object != null && object instanceof ContentItem) {
|
||||
|
||||
final ContentItem page = (ContentItem) object;
|
||||
final BeanInfo beanInfo;
|
||||
try {
|
||||
beanInfo = Introspector
|
||||
.getBeanInfo(page.getClass());
|
||||
} catch (IntrospectionException ex) {
|
||||
throw new UnexpectedErrorException(ex);
|
||||
}
|
||||
final Optional<PropertyDescriptor> propertyDescriptor = Arrays
|
||||
.stream(beanInfo.getPropertyDescriptors())
|
||||
.filter(propDesc -> attribute.equals(propDesc.getName()))
|
||||
.findAny();
|
||||
if (propertyDescriptor.isPresent()) {
|
||||
final Method readMethod = propertyDescriptor
|
||||
.get()
|
||||
.getReadMethod();
|
||||
final Object value;
|
||||
try {
|
||||
value = readMethod.invoke(object);
|
||||
} catch (IllegalAccessException | InvocationTargetException ex) {
|
||||
throw new IllegalArgumentException(ex);
|
||||
}
|
||||
if (value == null) {
|
||||
return (String) new GlobalizedMessage("cms.ui.unknown",
|
||||
CmsConstants.CMS_BUNDLE)
|
||||
.localize();
|
||||
} else {
|
||||
final GlobalizationHelper globalizationHelper = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(GlobalizationHelper.class);
|
||||
|
||||
// Note: No type safety here! We relay that it is
|
||||
// attached to a date property!
|
||||
return DateFormat.getDateInstance(
|
||||
DateFormat.LONG,
|
||||
globalizationHelper.getNegotiatedLocale())
|
||||
.format(value);
|
||||
}
|
||||
} else {
|
||||
return (String) new GlobalizedMessage("cms.ui.unknown",
|
||||
CmsConstants.CMS_BUNDLE)
|
||||
.localize();
|
||||
}
|
||||
|
||||
} else {
|
||||
return (String) new GlobalizedMessage("cms.ui.unknown",
|
||||
CmsConstants.CMS_BUNDLE)
|
||||
.localize();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,221 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2004 Red Hat Inc. 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.authoring;
|
||||
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.PropertySheet;
|
||||
import com.arsdigita.bebop.PropertySheetModel;
|
||||
import com.arsdigita.bebop.PropertySheetModelBuilder;
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
import com.arsdigita.toolbox.ui.DomainObjectPropertySheet;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import com.arsdigita.bebop.table.TableModel;
|
||||
import com.arsdigita.bebop.table.TableModelBuilder;
|
||||
import com.arsdigita.bebop.Table;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
|
||||
import org.libreccm.l10n.LocalizedString;
|
||||
|
||||
/**
|
||||
* This extends DomainObjectPropertySheet and has a lot of duplicate code from
|
||||
* it because it uses so many private inner classes
|
||||
*
|
||||
*/
|
||||
public class TextBodyPropertySheet extends DomainObjectPropertySheet {
|
||||
|
||||
/**
|
||||
* Construct a new TextAssetBodyPropertySheet
|
||||
*
|
||||
* @param objModel The selection model which feeds domain
|
||||
* objects to this property sheet.
|
||||
* @param selectedLanguageParam
|
||||
*
|
||||
*/
|
||||
public TextBodyPropertySheet(
|
||||
final ItemSelectionModel objModel,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super(objModel, false, selectedLanguageParam);
|
||||
setModelBuilder(new TMBAdapter(new DomainObjectModelBuilder()));
|
||||
getColumn(1).setCellRenderer(new TextAssetBodyLabelCellRenderer());
|
||||
}
|
||||
|
||||
// Build up the object properties model from the iterator over all properties
|
||||
private static class TextAssetBodyPropertiesModel
|
||||
implements PropertySheetModel {
|
||||
|
||||
// public final static String MIME_TYPE_KEY
|
||||
// = TextAssetBodyLabelCellRenderer.MIME_TYPE_KEY;
|
||||
private static final String ERROR = "No current property. "
|
||||
+ "Make sure that nextRow() was "
|
||||
+ "called at least once.";
|
||||
|
||||
private LocalizedString textAsset;
|
||||
private PageState pageState;
|
||||
private Iterator<Property> properties;
|
||||
private Property currentProperty;
|
||||
|
||||
public TextAssetBodyPropertiesModel(final LocalizedString textAsset,
|
||||
final Iterator<Property> properties,
|
||||
final PageState pageState) {
|
||||
this.textAsset = textAsset;
|
||||
this.properties = properties;
|
||||
this.pageState = pageState;
|
||||
currentProperty = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean nextRow() {
|
||||
|
||||
if (properties.hasNext()) {
|
||||
currentProperty = properties.next();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use getGlobalizedLabel() instead
|
||||
*/
|
||||
@Override
|
||||
@Deprecated
|
||||
public String getLabel() {
|
||||
return getGlobalizedLabel().getKey();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GlobalizedMessage getGlobalizedLabel() {
|
||||
if (currentProperty == null) {
|
||||
throw new IllegalStateException(ERROR);
|
||||
}
|
||||
return currentProperty.getGlobalizedLabel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getValue() {
|
||||
return getObjectValue().toString();
|
||||
}
|
||||
|
||||
public Object getObjectValue() {
|
||||
if (currentProperty == null) {
|
||||
throw new IllegalStateException(ERROR);
|
||||
}
|
||||
|
||||
return textAsset;
|
||||
}
|
||||
|
||||
public String getAttribute() {
|
||||
return currentProperty.getAttribute();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Builds an TextAssetBodyPropertiesModel
|
||||
private static class DomainObjectModelBuilder extends LockableImpl
|
||||
implements PropertySheetModelBuilder {
|
||||
|
||||
@Override
|
||||
public PropertySheetModel makeModel(final PropertySheet sheet,
|
||||
final PageState state) {
|
||||
|
||||
TextBodyPropertySheet propSheet
|
||||
= (TextBodyPropertySheet) sheet;
|
||||
throw new UnsupportedOperationException("ToDo");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// These are both from PropertySheet
|
||||
// Convert a PropertySheetModelBuilder to a TableModelBuilder
|
||||
private static class TMBAdapter
|
||||
extends LockableImpl implements TableModelBuilder {
|
||||
|
||||
private final PropertySheetModelBuilder modelBuilder;
|
||||
|
||||
public TMBAdapter(final PropertySheetModelBuilder builder) {
|
||||
this.modelBuilder = builder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableModel makeModel(final Table table,
|
||||
final PageState state) {
|
||||
return new TableModelAdapter(
|
||||
(TextAssetBodyPropertiesModel) modelBuilder.makeModel(
|
||||
(PropertySheet) table, state));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void lock() {
|
||||
modelBuilder.lock();
|
||||
super.lock();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Wraps a PropertySheetModel
|
||||
private static class TableModelAdapter implements TableModel {
|
||||
|
||||
private final TextAssetBodyPropertiesModel propertiesModel;
|
||||
private int row;
|
||||
|
||||
public TableModelAdapter(
|
||||
final TextAssetBodyPropertiesModel propertiesModel) {
|
||||
|
||||
this.propertiesModel = propertiesModel;
|
||||
row = -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean nextRow() {
|
||||
row++;
|
||||
return propertiesModel.nextRow();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getElementAt(final int columnIndex) {
|
||||
if (columnIndex == 0) {
|
||||
return propertiesModel.getGlobalizedLabel();
|
||||
} else {
|
||||
return propertiesModel.getObjectValue();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getKeyAt(final int columnIndex) {
|
||||
return propertiesModel.getAttribute();
|
||||
}
|
||||
|
||||
public PropertySheetModel getPSModel() {
|
||||
return propertiesModel;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui.item;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ItemCreateForm {
|
||||
|
||||
//Placeholder
|
||||
|
||||
}
|
||||
|
|
@ -18,11 +18,9 @@
|
|||
*/
|
||||
package com.arsdigita.cms.ui.search;
|
||||
|
||||
import com.arsdigita.bebop.form.Submit;
|
||||
|
||||
import org.librecms.contentsection.ContentType;
|
||||
|
||||
import com.arsdigita.cms.ui.ContentSectionPage;
|
||||
import com.arsdigita.search.ui.BaseQueryComponent;
|
||||
|
||||
/**
|
||||
|
|
@ -48,92 +46,4 @@ public class ItemQueryComponent extends BaseQueryComponent {
|
|||
final ContentType type) {
|
||||
this.context = context;
|
||||
|
||||
//ToDo
|
||||
// add(new PermissionFilterComponent(
|
||||
// SecurityManager.CMS_PREVIEW_ITEM));
|
||||
//
|
||||
// add(new SimpleCategoryFilterWidget() {
|
||||
//
|
||||
// @Override
|
||||
// protected Category[] getRoots(PageState state) {
|
||||
// Category[] roots;
|
||||
// if (limitToContentSection == true && CMS.getContext().
|
||||
// hasContentSection()) {
|
||||
// ContentSection section = CMS.getContext().
|
||||
// getContentSection();
|
||||
// roots = new Category[]{section.getRootCategory()};
|
||||
// } else {
|
||||
// ContentSectionCollection sections =
|
||||
// ContentSection.getAllSections();
|
||||
// List cats = new ArrayList();
|
||||
// while (sections.next()) {
|
||||
// ContentSection section =
|
||||
// sections.getContentSection();
|
||||
// cats.add(section.getRootCategory());
|
||||
// }
|
||||
// roots =
|
||||
// (Category[]) cats.toArray(new Category[cats.size()]);
|
||||
// }
|
||||
// return roots;
|
||||
// }
|
||||
// });
|
||||
//
|
||||
// if (type == null) {
|
||||
// add(new ContentTypeFilterWidget() {
|
||||
//
|
||||
// @Override
|
||||
// protected ContentSection getContentSection() {
|
||||
// if (limitToContentSection == true && CMS.getContext().
|
||||
// hasContentSection()) {
|
||||
// return CMS.getContext().getContentSection();
|
||||
// } else {
|
||||
// return super.getContentSection();
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// } else {
|
||||
// add(new ContentTypeFilterWidget(type) {
|
||||
//
|
||||
// @Override
|
||||
// protected ContentSection getContentSection() {
|
||||
// if (limitToContentSection == true && CMS.getContext().
|
||||
// hasContentSection()) {
|
||||
// return CMS.getContext().getContentSection();
|
||||
// } else {
|
||||
// return super.getContentSection();
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
//
|
||||
// add(new VersionFilterComponent(context));
|
||||
// if (limitToContentSection == true) {
|
||||
// add(new ContentSectionFilterComponent());
|
||||
// }
|
||||
// add(new DateRangeFilterWidget(new LastModifiedDateFilterType(),
|
||||
// LastModifiedDateFilterType.KEY));
|
||||
// add(new DateRangeFilterWidget(new CreationDateFilterType(),
|
||||
// CreationDateFilterType.KEY));
|
||||
// add(new PartyFilterWidget(new CreationUserFilterType(),
|
||||
// CreationUserFilterType.KEY));
|
||||
// add(new PartyFilterWidget(new LastModifiedUserFilterType(),
|
||||
// LastModifiedUserFilterType.KEY));
|
||||
// Submit submit = new Submit(context + "_search",
|
||||
// ContentSectionPage.globalize("cms.ui.search"));
|
||||
// add(submit);
|
||||
}
|
||||
|
||||
// private class LaunchDateFilterWidget extends DateRangeFilterWidget {
|
||||
//
|
||||
// public LaunchDateFilterWidget(FilterType type, String name) {
|
||||
// super(type, name);
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public boolean isVisible(PageState state) {
|
||||
// return !ContentSection.getConfig().getHideLaunchDate()
|
||||
// && super.isVisible(state);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ package org.librecms.contentsection;
|
|||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.cms.dispatcher.CMSPage;
|
||||
import com.arsdigita.cms.dispatcher.ContentItemDispatcher;
|
||||
import com.arsdigita.cms.ui.CMSApplicationPage;
|
||||
import com.arsdigita.dispatcher.AccessDeniedException;
|
||||
import com.arsdigita.dispatcher.DispatcherHelper;
|
||||
import com.arsdigita.dispatcher.RequestContext;
|
||||
|
|
@ -291,16 +290,7 @@ public class ContentSectionServlet extends BaseApplicationServlet {
|
|||
// final RequestContext ctx = DispatcherHelper.getRequestContext();
|
||||
cmsPage.init();
|
||||
cmsPage.dispatch(request, response, ctx);
|
||||
} else {
|
||||
final CMSApplicationPage cmsAppPage = (CMSApplicationPage) page;
|
||||
cmsAppPage.init(request, response, app);
|
||||
// Serve the page.
|
||||
final Document doc = cmsAppPage.buildDocument(request, response);
|
||||
|
||||
final PresentationManager pm = Templating
|
||||
.getPresentationManager();
|
||||
pm.servePage(doc, request, response);
|
||||
}
|
||||
}
|
||||
|
||||
/* SECONDLY try if we have to serve an item (old style dispatcher based */
|
||||
} else if (item != null) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue