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

203 lines
7.2 KiB
Java
Executable File

/*
* 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.FormProcessException;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.event.FormSubmissionListener;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.cms.contenttypes.GenericArticleImageAssociation;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ContentType;
import com.arsdigita.cms.ImageAsset;
import com.arsdigita.cms.ItemCollection;
import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.SecurityManager;
import com.arsdigita.cms.dispatcher.Utilities;
import com.arsdigita.cms.ui.ImageBrowser;
import com.arsdigita.cms.ui.ImageChooser;
import com.arsdigita.cms.util.GlobalizationUtil;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.persistence.OID;
import org.apache.log4j.Logger;
import java.math.BigDecimal;
/**
* A component that can assign an existing image to an article.
* Consists of an ImageChooser and an ImageSelectionForm
*
* @author Stanislav Freidin
* @author Michael Pih
* @version $Revision: #12 $ $DateTime: 2004/08/17 23:15:09 $
* @version $Id: ArticleImageChooser.java 287 2005-02-22 00:29:02Z sskracic $
*/
public class ArticleImageChooser extends SimpleContainer {
public static final String CHOSEN_IMAGE = "chim";
private static Logger s_log =
Logger.getLogger(ArticleImageChooser.class);
private final ItemSelectionModel m_assets;
private final ItemSelectionModel m_choiceModel;
private ImageChooser m_chooser;
private ImageSelectionForm m_form;
private BigDecimalParameter m_chosenImage;
/**
* Construct a new ArticleImageChooser
*/
public ArticleImageChooser(ItemSelectionModel itemModel,
ItemSelectionModel assetModel) {
super();
m_assets = assetModel;
m_chooser = new ImageChooser();
add(m_chooser);
// Show the form when an image is clicked
m_chooser.addImageActionListener(new ImageBrowser.LinkActionListener() {
public void linkClicked(PageState state, BigDecimal imageId) {
s_log.debug("SELECTING: " + imageId);
selectImage(state, imageId);
}
public void deleteClicked(PageState state, BigDecimal imageId) {
s_log.debug("DELETING: " + imageId);
deleteImage(state, imageId);
}
});
// Clone the asset model, since we don't want to contaminate
// the original data in case the user decides to cancel the
// form submission
m_chosenImage = new BigDecimalParameter(CHOSEN_IMAGE);
ContentType t = assetModel.getContentType();
if ( t == null ) {
m_choiceModel =
new ItemSelectionModel(assetModel.getJavaClass().getName(),
assetModel.getObjectType(),
m_chosenImage);
} else {
m_choiceModel =
new ItemSelectionModel(assetModel.getContentType(), m_chosenImage);
}
m_form = new ImageSelectionForm(itemModel, m_choiceModel);
// Hide the form again when the user clicks Cancel
m_form.addSubmissionListener(new FormSubmissionListener() {
public void submitted(FormSectionEvent e) throws FormProcessException {
PageState state = e.getPageState();
if(m_form.getSaveCancelSection().getCancelButton().isSelected(state)) {
deselectImage(state);
throw new FormProcessException( (String) GlobalizationUtil.globalize("cms.ui.authoring.submission_cancelled").localize());
}
}
});
// Propagate the image selection on success
m_form.addProcessListener(new FormProcessListener() {
public void process(FormSectionEvent e) throws FormProcessException {
PageState state = e.getPageState();
m_assets.setSelectedObject(state,
m_choiceModel.getSelectedObject(state));
}
});
add(m_form);
}
// Hide the form by default, register the "chosen image" parameter
public void register(Page p) {
p.addComponentStateParam(this, m_chosenImage);
p.setVisibleDefault(m_form, false);
}
/**
* @return the image selection form
*/
public ImageSelectionForm getImageSelectionForm() {
return m_form;
}
/**
* @return the image chooser
*/
public ImageChooser getImageChooser() {
return m_chooser;
}
/**
* Select the specified image and show the form
*/
public void selectImage(PageState s, BigDecimal imageId) {
s.setVisible(m_form, true);
s.setVisible(m_chooser, false);
m_choiceModel.setSelectedKey(s, imageId);
}
/**
* Select the specified image and show the form
*/
public void deleteImage(PageState s, BigDecimal imageId) {
SecurityManager sm = Utilities.getSecurityManager(s);
if (sm.canAccess(s.getRequest(),SecurityManager.DELETE_IMAGES) ) {
try {
ImageAsset asset = (ImageAsset) DomainObjectFactory.newInstance
(new OID(ImageAsset.BASE_DATA_OBJECT_TYPE,imageId));
if (!GenericArticleImageAssociation.imageHasAssociation(asset)) {
asset.setLive(null);
ItemCollection pendingVersions = asset.getPendingVersions();
while(pendingVersions.next()) {
ContentItem item = pendingVersions.getContentItem();
asset.removePendingVersion(item);
}
asset.delete();
}
} catch (DataObjectNotFoundException e) {
// can't find asset, don't delete
}
}
}
/**
* Deselect the image and hide the form
*/
public void deselectImage(PageState s) {
s.setVisible(m_form, false);
s.setVisible(m_chooser, true);
m_choiceModel.clearSelection(s);
m_chooser.clearSelection(s);
}
}