/*
* 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.folder;
import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.Container;
import com.arsdigita.bebop.ControlLink;
import com.arsdigita.bebop.Form;
import com.arsdigita.bebop.FormData;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.GridPanel;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.PaginationModelBuilder;
import com.arsdigita.bebop.Paginator;
import com.arsdigita.bebop.RequestLocal;
import com.arsdigita.bebop.Resettable;
import com.arsdigita.bebop.SaveCancelSection;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.Tree;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.event.FormSubmissionListener;
import com.arsdigita.bebop.event.FormValidationListener;
import com.arsdigita.bebop.event.PrintEvent;
import com.arsdigita.bebop.event.PrintListener;
import com.arsdigita.bebop.form.CheckboxGroup;
import com.arsdigita.bebop.form.FormErrorDisplay;
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.ArrayParameter;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.bebop.table.TableCellRenderer;
import com.arsdigita.bebop.table.TableColumn;
import com.arsdigita.bebop.tree.TreeCellRenderer;
import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ContentSection;
import com.arsdigita.cms.Folder;
import com.arsdigita.cms.ItemCollection;
import com.arsdigita.cms.SecurityManager;
import com.arsdigita.cms.dispatcher.Utilities;
import com.arsdigita.cms.util.GlobalizationUtil;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.ACSObject;
import com.arsdigita.kernel.User;
import com.arsdigita.persistence.CompoundFilter;
import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.Filter;
import com.arsdigita.persistence.OID;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.toolbox.ui.ActionGroup;
import com.arsdigita.util.Assert;
import com.arsdigita.web.Web;
import org.apache.log4j.Logger;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
/**
* Browse folders and manipulate them with various actions
* (move/copy/delete).
*
* @author David Lutterkort
* @version $Id: FolderManipulator.java 1940 2009-05-29 07:15:05Z terry $
*/
public class FolderManipulator extends SimpleContainer
implements FormProcessListener, FormValidationListener,
FormSubmissionListener, Resettable {
private static Logger s_log =
Logger.getLogger(FolderManipulator.class);
public static final String RESOURCE_BUNDLE =
"com.arsdigita.cms.ui.folder.CMSFolderResources";
private static final String MOVE = "Move";
private static final String COPY = "Copy";
private static final BigDecimal[] EMPTY_ARRAY = new BigDecimal[0];
private ArrayParameter m_sources;
private StringParameter m_action;
// The folder in which the source items live
private FolderSelectionModel m_srcFolderSel;
private ItemView m_itemView;
private TargetSelector m_targetSelector;
public FolderManipulator(FolderSelectionModel folderSel) {
m_sources = new ArrayParameter(new BigDecimalParameter("srcs"));
m_action = new StringParameter("act");
m_srcFolderSel = folderSel;
m_itemView = new ItemView();
m_itemView.addProcessListener(this);
m_itemView.addValidationListener(this);
add(m_itemView);
m_targetSelector = new TargetSelector();
add(m_targetSelector);
m_targetSelector.addProcessListener(this);
m_targetSelector.addValidationListener(this);
m_targetSelector.addSubmissionListener(this);
}
@Override
public void register(Page p) {
super.register(p);
p.setVisibleDefault(m_targetSelector, false);
p.addComponentStateParam(this, m_sources);
p.addComponentStateParam(this, m_action);
}
public final BigDecimal[] getSources(PageState s) {
BigDecimal[] result = (BigDecimal[]) s.getValue(m_sources);
return (result==null) ? EMPTY_ARRAY : result;
}
public final FolderSelectionModel getSrcFolderSel () {
return m_srcFolderSel;
}
public final Folder getTarget(PageState s) {
return m_targetSelector.getTarget(s);
}
protected final boolean isMove(PageState s) {
return MOVE.equals(getAction(s));
}
protected final boolean isCopy(PageState s) {
return COPY.equals(getAction(s));
}
private String getAction(PageState s) {
return (String) s.getValue(m_action);
}
protected void moveItems(Folder target, BigDecimal[] items) {
s_log.debug ("moving to folder: " + target + " items: " + items);
for (int i=0; i 0;
SecurityManager sm = Utilities.getSecurityManager(s);
if ( e.getSource() == m_itemView ) {
if ( ! hasSources ) {
d.addError(globalize("cms.ui.folder.must_select_item"));
}
} else if ( e.getSource() == m_targetSelector ) {
// The source items must have gotten lost somehow
if ( ! hasSources ) {
throw new IllegalStateException( (String) GlobalizationUtil.globalize("cms.ui.folder.no_source_items_specified").localize());
}
Folder target = m_targetSelector.getTarget(s);
if ( target == null ) {
d.addError(globalize("cms.ui.folder.need_select_target_folder"));
}
if ( target.equals(m_srcFolderSel.getSelectedObject(s)) ) {
d.addError(globalize("cms.ui.folder.not_within_same_folder"));
}
// check create item permission
User user = Web.getContext().getUser();
if ( ! sm.canAccess(user, SecurityManager.NEW_ITEM, target) ) {
d.addError(globalize("cms.ui.folder.no_permission_for_item"));
}
// Per-item checks
for (int i=0; i