ImageSelectPage und ImagePane (1/2)

Weitere Änderungen. Restrukturierung, unter anderem interne Klassen aus ImageStepEdit zu normalen Klassen in cms.ui gemacht.

git-svn-id: https://svn.libreccm.org/ccm/trunk@1766 8810af33-2d31-482b-a856-94f89814c4df
master
quasi 2012-07-12 16:12:56 +00:00
parent 29eaf69880
commit 7749c376a5
7 changed files with 290 additions and 152 deletions

View File

@ -34,6 +34,7 @@ import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ImageAsset;
import com.arsdigita.cms.SecurityManager;
import com.arsdigita.cms.Service;
import com.arsdigita.cms.ui.ImageComponent;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.mimetypes.MimeType;
@ -65,9 +66,6 @@ import org.apache.log4j.Logger;
*/
public class ImageBrowser extends Table {
public static final int DISPLAY_ONLY = 0;
public static final int SELECT_IMAGE = 1;
public static final int ADMIN_IMAGES = 2;
private ImageBrowserModelBuilder m_builder;
private static final String[] HEADERS = {"Thumbnail", "Name", "Size", "Type", "Action", ""};
private static final int THUMB = 0;
@ -76,8 +74,8 @@ public class ImageBrowser extends Table {
private static final int TYPE = 3;
private static final int LINK = 4;
private static final int DELETE = 5;
private static int s_numColumns = -1;
private int m_mode = DISPLAY_ONLY;
private int m_numColumns = -1;
private int m_mode;
private Dimension m_thumbSize;
private static final Logger s_log = Logger.getLogger(ImageBrowser.class);
@ -89,7 +87,7 @@ public class ImageBrowser extends Table {
*/
public ImageBrowser(ImageBrowserModelBuilder b) {
this(b, ImageBrowser.SELECT_IMAGE);
this(b, ImageComponent.ATTACH_IMAGE);
}
public ImageBrowser(ImageBrowserModelBuilder b, int mode) {
@ -114,9 +112,13 @@ public class ImageBrowser extends Table {
}
private void addColumn(TableCellRenderer renderer) {
getColumn(++s_numColumns).setCellRenderer(renderer);
getColumn(++m_numColumns).setCellRenderer(renderer);
}
public int getNumColumns() {
return m_numColumns;
}
/**
* @return the size, in pixels, of the thumbnail images
*/
@ -217,7 +219,7 @@ public class ImageBrowser extends Table {
boolean isSelected, Object key,
int row, int column) {
if (m_mode == ImageBrowser.SELECT_IMAGE) {
if (m_mode == ImageComponent.SELECT_IMAGE) {
return super.getComponent(table, state, value, isSelected, key, row, column);
}
@ -239,7 +241,7 @@ public class ImageBrowser extends Table {
int row, int column) {
// Only show delete link in admin mode
if (m_mode == ADMIN_IMAGES) {
if (m_mode == ImageComponent.ADMIN_IMAGES) {
boolean canDelete = false;
// SecurityManager sm = Utilities.getSecurityManager(state);
@ -300,7 +302,8 @@ public class ImageBrowser extends Table {
@Override
public int getColumnCount() {
return ImageBrowser.s_numColumns;
return ((ImageBrowser)m_model).getNumColumns();
// return ImageBrowser.s_numColumns;
}
@Override

View File

@ -95,14 +95,18 @@ public class ImageChooser extends BoxPanel {
* {@link ContentItem#DRAFT} or {@link ContentItem#LIVE}
*/
public ImageChooser(String context) {
this(context, ImageBrowser.SELECT_IMAGE);
this(context, ImageComponent.ATTACH_IMAGE);
}
public ImageChooser(int mode) {
this(ContentItem.DRAFT, mode);
}
/**
* Construct a new ImageChooser
*/
public ImageChooser() {
this(ContentItem.DRAFT, ImageBrowser.SELECT_IMAGE);
this(ContentItem.DRAFT, ImageComponent.ATTACH_IMAGE);
}
/**

View File

@ -16,6 +16,14 @@ import com.arsdigita.cms.ReusableImageAsset;
*/
public interface ImageComponent {
public static final int DISPLAY_ONLY = 0;
public static final int SELECT_IMAGE = 1;
public static final int ATTACH_IMAGE = 2;
public static final int ADMIN_IMAGES = 3;
public static final String UPLOAD = "upload";
public static final String LIBRARY = "library";
ReusableImageAsset getImage(FormSectionEvent event) throws FormProcessException;
String getCaption(FormSectionEvent event);

View File

@ -29,6 +29,7 @@ import java.math.BigDecimal;
* @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de>
*/
public class ImageLibraryComponent extends SimpleContainer implements ImageComponent {
private final ImageChooser m_chooser;
private final ItemSelectionModel m_imageModel;
private final BigDecimalParameter m_imageID;
@ -38,11 +39,17 @@ public class ImageLibraryComponent extends SimpleContainer implements ImageCompo
private final TextField m_title;
private final TextField m_useContext;
private final SaveCancelSection m_saveCancel;
private int m_mode;
public ImageLibraryComponent() {
this(ImageComponent.SELECT_IMAGE);
}
public ImageLibraryComponent(int mode) {
m_mode = mode;
m_imageID = new BigDecimalParameter("imageID");
m_imageModel = new ItemSelectionModel(m_imageID);
m_chooser = new ImageChooser(ContentItem.DRAFT, ImageBrowser.ADMIN_IMAGES);
m_chooser = new ImageChooser(ContentItem.DRAFT, m_mode);
m_chooser.addImageActionListener(new ImageBrowser.LinkActionListener() {
public void deleteClicked(PageState ps, BigDecimal imageID) {
@ -62,42 +69,46 @@ public class ImageLibraryComponent extends SimpleContainer implements ImageCompo
}
});
add(m_chooser);
m_form = new Form("imageStepEditLibrary", new ColumnPanel(2));
// Form for additional fields and submit
m_form = new Form("imageLibraryComponent", new ColumnPanel(2));
add(m_form);
m_form.add(new Label("Caption"));
// Initialize all wisgets
m_caption = new TextField("caption");
m_caption.addValidationListener(new NotNullValidationListener());
m_caption.setSize(40);
m_form.add(m_caption);
m_description = new TextField("description");
m_description.addValidationListener(new NotNullValidationListener());
m_description.setSize(40);
m_title = new TextField("title");
m_title.addValidationListener(new NotNullValidationListener());
m_title.setSize(40);
// Only show the title and description fields where these have
// been explicitly requested.
/*
* if
* (ItemImageAttachment.getConfig().getIsImageStepDescriptionAndTitleShown())
* { m_form.add(new Label("Description"));
* m_form.add(m_description); m_form.add(new Label("Title"));
* m_form.add(m_title); }
*/
m_form.add(new Label("Use Context"));
m_useContext = new TextField("useContext");
m_useContext.setSize(40);
m_form.add(m_useContext);
// Show additional fields only in default mode a.k.a. ATTACH_IMAGE like
// in image-step
if (m_mode == ImageComponent.ATTACH_IMAGE) {
m_form.add(new Label("Caption"));
m_caption.addValidationListener(new NotNullValidationListener());
m_caption.setSize(40);
m_form.add(m_caption);
m_description.addValidationListener(new NotNullValidationListener());
m_description.setSize(40);
m_title.addValidationListener(new NotNullValidationListener());
m_title.setSize(40);
// Only show the title and description fields where these have
// been explicitly requested.
/*
* if
* (ItemImageAttachment.getConfig().getIsImageStepDescriptionAndTitleShown())
* { m_form.add(new Label("Description"));
* m_form.add(m_description); m_form.add(new Label("Title"));
* m_form.add(m_title); }
*/
m_form.add(new Label("Use Context"));
m_useContext.setSize(40);
m_form.add(m_useContext);
}
// save and cancel buttons
m_saveCancel = new SaveCancelSection();
m_form.add(m_saveCancel);
ActionLink upload = new ActionLink("Upload a new image");
upload.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
// setImageComponent(ev.getPageState(), UPLOAD);
}
});
add(upload, ColumnPanel.FULL_WIDTH);
}
public ReusableImageAsset getImage(FormSectionEvent event) {
@ -138,5 +149,13 @@ public class ImageLibraryComponent extends SimpleContainer implements ImageCompo
public SaveCancelSection getSaveCancelSection() {
return m_saveCancel;
}
public void addUploadLink(ActionListener actionListener) {
// Add action link to image upload component
if (m_mode != ImageComponent.DISPLAY_ONLY) {
ActionLink upload = new ActionLink("Upload new image");
upload.addActionListener(actionListener);
add(upload, ColumnPanel.FULL_WIDTH);
}
}
}

View File

@ -4,6 +4,7 @@
*/
package com.arsdigita.cms.ui;
import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.TabbedPane;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
@ -19,7 +20,8 @@ public class ImageSelectPage extends CMSPage {
private final static String XSL_CLASS = "CMS Admin";
private TabbedPane m_tabbedPane;
private ImagesPane m_imagePane;
private ImageLibraryComponent m_imageLibrary;
private ImageUploadComponent m_imageUpload;
private BigDecimalParameter m_sectionId;
private static final CMSConfig s_conf = CMSConfig.getInstance();
private static final boolean LIMIT_TO_CONTENT_SECTION = false;
@ -33,6 +35,70 @@ public class ImageSelectPage extends CMSPage {
m_sectionId = new BigDecimalParameter(CONTENT_SECTION);
addGlobalStateParam(m_sectionId);
// m_imagePane = new ImagesPane();
m_tabbedPane = createTabbedPane();
m_tabbedPane.setIdAttr("page-body");
add(m_tabbedPane);
}
protected ImageLibraryComponent getImageLibraryPane() {
if (m_imageLibrary == null) {
m_imageLibrary = new ImageLibraryComponent(ImageComponent.SELECT_IMAGE);
// library.getForm().addInitListener(this);
// library.getForm().addProcessListener(this);
}
return m_imageLibrary;
}
protected ImageUploadComponent getImageUploadPane() {
if (m_imageUpload == null) {
m_imageUpload = new ImageUploadComponent(ImageComponent.SELECT_IMAGE);
// upload.getForm().addInitListener(this);
// upload.getForm().addProcessListener(this);
}
return m_imageUpload;
}
protected TabbedPane createTabbedPane() {
TabbedPane pane = new TabbedPane();
pane.setClassAttr(XSL_CLASS);
addToPane(pane, "library", getImageLibraryPane());
addToPane(pane, "upload", getImageUploadPane());
pane.setDefaultPane(m_imageLibrary);
return pane;
}
/**
* 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(TabbedPane pane, String tabName, Component comp) {
if (comp != null) {
pane.addTab(GlobalizationUtil.globalize("cms.ui.item_search." + tabName).localize().toString(), comp);
}
}
/* Listeners */
/**
* InitListener
*
* this init listener selects the object with the submitted oid
*/
// private init() {
//
// }
/**
* ProcessListener
*
* this process listener
*/
}

View File

@ -25,62 +25,76 @@ import java.io.IOException;
* @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de>
*/
public class ImageUploadComponent extends Form implements ImageComponent {
private final FileUploadSection m_imageFile;
private final TextField m_caption;
private final TextField m_title;
private final TextArea m_description;
private final TextField m_useContext;
private final SaveCancelSection m_saveCancel;
private int m_mode;
public ImageUploadComponent() {
this(ImageComponent.ATTACH_IMAGE);
}
public ImageUploadComponent(int mode) {
super("imageUploadComponent", new ColumnPanel(2));
m_mode = mode;
setEncType("multipart/form-data");
// Ignoring deprecated constructor.
m_imageFile = new FileUploadSection("Image Type", "image", ImageAsset.MIME_JPEG);
m_imageFile.getFileUploadWidget().addValidationListener(new NotNullValidationListener());
add(m_imageFile, ColumnPanel.FULL_WIDTH);
add(new Label("Caption"));
// Initialize all widgets
m_caption = new TextField("caption");
m_caption.addValidationListener(new NotNullValidationListener());
m_caption.addValidationListener(new StringLengthValidationListener(40));
m_caption.setSize(40);
add(m_caption);
m_title = new TextField("title");
m_description = new TextArea("description");
// We only show the title and description fields in the case where
// getIsImageStepDescriptionAndTitleShown is false.
/*
* if
* (ItemImageAttachment.getConfig().getIsImageStepDescriptionAndTitleShown())
* { add(new Label("Title")); m_title.addValidationListener(new
* NotNullValidationListener()); m_title.setSize(40);
* m_title.addValidationListener(new
* StringLengthValidationListener(40)); add(m_title);
*
* add(new Label("Description"));
* m_description.addValidationListener(new
* NotNullValidationListener());
* m_description.addValidationListener(new
* StringLengthValidationListener(600)); m_description.setCols(30);
* m_description.setRows(5); add(m_description);
*
* }
*/
add(new Label("Use Context"));
m_useContext = new TextField("useContext");
m_useContext.setSize(40);
add(m_useContext);
// add widget only if we are in attach mode
if (m_mode == ImageComponent.ATTACH_IMAGE) {
add(new Label("Caption"));
m_caption.addValidationListener(new NotNullValidationListener());
m_caption.addValidationListener(new StringLengthValidationListener(40));
m_caption.setSize(40);
add(m_caption);
// We only show the title and description fields in the case where
// getIsImageStepDescriptionAndTitleShown is false.
// if (ItemImageAttachment.getConfig().getIsImageStepDescriptionAndTitleShown()) {
// add(new Label("Title"));
// m_title.addValidationListener(new NotNullValidationListener());
// m_title.setSize(40);
// m_title.addValidationListener(new StringLengthValidationListener(40));
// add(m_title);
//
// add(new Label("Description"));
// m_description.addValidationListener(new NotNullValidationListener());
// m_description.addValidationListener(new StringLengthValidationListener(600));
// m_description.setCols(30);
// m_description.setRows(5);
// add(m_description);
//
// }
add(new Label("Use Context"));
m_useContext.setSize(40);
add(m_useContext);
}
m_saveCancel = new SaveCancelSection();
add(m_saveCancel);
/*
* Removed by Quasimodo: Changed editing workflow, so that library
* comes first Also, library mode has now a link to upload images
* whixh will link to this form. Consequently, this link will create
* a loop, which isn't fatal but confusing ActionLink library = new
* ActionLink( "Select an existing image" );
* library.addActionListener( new ActionListener() { public void
* actionPerformed( ActionEvent ev ) { setImageComponent(
* ev.getPageState(), LIBRARY ); } } ); add( library,
* Removed by Quasimodo: Changed editing workflow, so that library comes
* first Also, library mode has now a link to upload images which will
* link to this form. Consequently, this link will create a loop, which
* isn't fatal but confusing. ActionLink library = new ActionLink(
* "Select an existing image" ); library.addActionListener( new
* ActionListener() { public void actionPerformed( ActionEvent ev ) {
* setImageComponent( ev.getPageState(), LIBRARY ); } } ); add( library,
* ColumnPanel.FULL_WIDTH );
*/
}
@ -127,5 +141,4 @@ public class ImageUploadComponent extends Form implements ImageComponent {
public Form getForm() {
return this;
}
}

View File

@ -4,9 +4,7 @@
*/
package com.arsdigita.cms.ui;
import com.arsdigita.bebop.ActionLink;
import com.arsdigita.bebop.ColumnPanel;
import com.arsdigita.bebop.Form;
import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.MapComponentSelectionModel;
@ -14,30 +12,21 @@ import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.ParameterSingleSelectionModel;
import com.arsdigita.bebop.Resettable;
import com.arsdigita.bebop.SaveCancelSection;
import com.arsdigita.bebop.SegmentedPanel;
import com.arsdigita.bebop.SimpleComponent;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.bebop.event.FormInitListener;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.form.TextArea;
import com.arsdigita.bebop.form.TextField;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.bebop.parameters.NotNullValidationListener;
import com.arsdigita.bebop.parameters.StringLengthValidationListener;
import com.arsdigita.bebop.event.FormSubmissionListener;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ImageAsset;
import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.ReusableImageAsset;
import com.arsdigita.cms.util.GlobalizationUtil;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.toolbox.ui.LayoutPanel;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.log4j.Logger;
@ -46,14 +35,12 @@ import org.apache.log4j.Logger;
*
* @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de>
*/
public class ImagesPane extends LayoutPanel implements Resettable {
public class ImagesPane extends LayoutPanel implements Resettable, FormProcessListener, FormInitListener {
public static final Logger s_log = Logger.getLogger(BrowsePane.class);
//private ImageChooser imageChooser;
private final StringParameter m_imageComponentKey;
private final MapComponentSelectionModel m_imageComponent;
private final String UPLOAD = "upload";
private final String LIBRARY = "library";
public ImagesPane() {
// Left column is empty, this is only to provide the same layout for all
@ -61,12 +48,8 @@ public class ImagesPane extends LayoutPanel implements Resettable {
setLeft(new SimpleComponent());
SegmentedPanel body = new SegmentedPanel();
body.addSegment(
new Label(GlobalizationUtil.globalize("cms.ui.image_browser")),
new ImageChooser(ContentItem.DRAFT, ImageBrowser.ADMIN_IMAGES));
setBody(body);
m_imageComponentKey = new StringParameter("imageComponent");
ParameterSingleSelectionModel componentModel = new ParameterSingleSelectionModel(m_imageComponentKey);
@ -74,24 +57,36 @@ public class ImagesPane extends LayoutPanel implements Resettable {
Map selectors = m_imageComponent.getComponentsMap();
// ImageUploadComponent upload = new ImageUploadComponent();
// upload.getForm().addInitListener(this);
// upload.getForm().addProcessListener(this);
// selectors.put(UPLOAD, upload);
// add(upload);
//
// ImageLibraryComponent library = new ImageLibraryComponent();
// library.getForm().addInitListener(this);
// library.getForm().addProcessListener(this);
// selectors.put(LIBRARY,
// library);
// add(library);
ImageUploadComponent upload = new ImageUploadComponent(ImageComponent.ADMIN_IMAGES);
upload.getForm().addInitListener(this);
upload.getForm().addProcessListener(this);
selectors.put(ImageComponent.UPLOAD, upload);
body.addSegment(
new Label(GlobalizationUtil.globalize("cms.ui.image_upload")),
upload);
ImageLibraryComponent library = new ImageLibraryComponent(ImageComponent.ADMIN_IMAGES);
library.getForm().addInitListener(this);
library.getForm().addProcessListener(this);
library.addUploadLink(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
setImageComponent(ev.getPageState(), ImageComponent.UPLOAD);
}
});
selectors.put(ImageComponent.LIBRARY, library);
body.addSegment(
new Label(GlobalizationUtil.globalize("cms.ui.image_browser")),
library);
}
@Override
public final void register(Page page) {
super.register(page);
}
@Override
public final void reset(PageState state) {
super.reset(state);
}
@ -99,43 +94,73 @@ public class ImagesPane extends LayoutPanel implements Resettable {
/*
* // Private classes and methods private final class ProcessListener
* implements FormProcessListener {
*
* public void process(FormSectionEvent event) throws FormProcessException {
* PageState ps = event.getPageState(); ImageComponent component =
* getImageComponent(ps);
*
* if (!component.getSaveCancelSection().getSaveButton().isSelected(ps)) {
* return; }
*
* ContentItem item = m_imageStep.getItem(ps); if (null == item) {
* s_log.error("No item selected in ImageStepEdit", new RuntimeException());
* return; }
*
* ReusableImageAsset image = component.getImage(event);
*
* ItemImageAttachment attachment = m_imageStep.getAttachment(ps); if (null
* == attachment) { attachment = new ItemImageAttachment(item, image); }
* attachment.setCaption(component.getCaption(event));
*
* // We only set the description and title based on the UI in // the case
* where getIsImageStepDescriptionAndTitleShown is true. // Otherwise, we
* leave this as the default value. This means // existing values are not
* overwritten if the image is edited when //
* isImageStepDescriptionAndTitleShown is false. if
* (ItemImageAttachment.getConfig().getIsImageStepDescriptionAndTitleShown())
* { attachment.setDescription(component.getDescription(event));
* attachment.setTitle(component.getTitle(event)); }
* attachment.setUseContext(component.getUseContext(event)); } }
*
* private final class SubmissionListener implements FormSubmissionListener
* {
*
* public final void submitted(final FormSectionEvent e) { final PageState s
* = e.getPageState();
*
* }
* }
*/
public void process(FormSectionEvent event) throws FormProcessException {
PageState ps = event.getPageState();
// ImageComponent component = getImageComponent(ps);
//
// if (!component.getSaveCancelSection().getSaveButton().isSelected(ps)) {
// return;
// }
//
// ContentItem item = m_imageStep.getItem(ps);
// if (null == item) {
// s_log.error("No item selected in ImageStepEdit", new RuntimeException());
// return;
// }
//
// ReusableImageAsset image = component.getImage(event);
//
// ItemImageAttachment attachment = m_imageStep.getAttachment(ps);
// if (null
// == attachment) {
// attachment = new ItemImageAttachment(item, image);
// }
// attachment.setCaption(component.getCaption(event));
//
// // We only set the description and title based on the UI in
// // the case where getIsImageStepDescriptionAndTitleShown is true.
// // Otherwise, we leave this as the default value. This means
// // existing values are not overwritten if the image is edited when
// // isImageStepDescriptionAndTitleShown is false.
// if (ItemImageAttachment.getConfig().getIsImageStepDescriptionAndTitleShown()) {
// attachment.setDescription(component.getDescription(event));
// attachment.setTitle(component.getTitle(event));
// }
// attachment.setUseContext(component.getUseContext(event));
}
private final class SubmissionListener implements FormSubmissionListener {
public final void submitted(final FormSectionEvent e) {
final PageState s = e.getPageState();
}
}
private void setImageComponent(PageState ps, final String activeKey) {
m_imageComponent.setSelectedKey(ps, activeKey);
if (s_log.isDebugEnabled()) {
s_log.debug("Selected component: " + activeKey);
}
Map componentsMap = m_imageComponent.getComponentsMap();
Iterator i = componentsMap.keySet().iterator();
while (i.hasNext()) {
Object key = i.next();
Component component = (Component) componentsMap.get(key);
boolean isVisible = activeKey.equals(key);
if (s_log.isDebugEnabled()) {
s_log.debug("Key: " + key + "; Visibility: " + isVisible);
}
ps.setVisible(component, isVisible);
}
}
public void init(FormSectionEvent event)
throws FormProcessException {
PageState ps = event.getPageState();