Several improvments for the ImageBrowser and image lists

git-svn-id: https://svn.libreccm.org/ccm/trunk@3436 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2015-05-27 16:44:32 +00:00
parent d33f690dda
commit 7b2693721b
4 changed files with 302 additions and 184 deletions

View File

@ -142,22 +142,30 @@ public class ImageStepDisplayTable extends Table {
setModelBuilder(new ImageTableModelBuilder(imageStep)); setModelBuilder(new ImageTableModelBuilder(imageStep));
columnModel.get(TABLE_COL_INDEX_THUMBNAIL).setCellRenderer(new ThumbnailCellRenderer()); columnModel.get(TABLE_COL_INDEX_THUMBNAIL).setCellRenderer(
columnModel.get(TABLE_COL_INDEX_PROPS).setCellRenderer(new PropertiesCellRenderer()); new ThumbnailCellRenderer());
columnModel.get(TABLE_COL_INDEX_PROPS).setCellRenderer(
new PropertiesCellRenderer());
// columnModel.get(TABLE_COL_INDEX_NAME).setCellRenderer(new NameCellRenderer()); // columnModel.get(TABLE_COL_INDEX_NAME).setCellRenderer(new NameCellRenderer());
// columnModel.get(TABLE_COL_INDEX_DIMENSIONS).setCellRenderer(new DimensionsCellRenderer()); // columnModel.get(TABLE_COL_INDEX_DIMENSIONS).setCellRenderer(new DimensionsCellRenderer());
// columnModel.get(TABLE_COL_INDEX_TYPE).setCellRenderer(new TypeCellRenderer()); // columnModel.get(TABLE_COL_INDEX_TYPE).setCellRenderer(new TypeCellRenderer());
columnModel.get(TABLE_COL_INDEX_CAPTION).setCellRenderer(new CaptionCellRenderer()); columnModel.get(TABLE_COL_INDEX_CAPTION).setCellRenderer(
columnModel.get(TABLE_COL_INDEX_EDIT).setCellRenderer(new EditCellRenderer()); new CaptionCellRenderer());
columnModel.get(TABLE_COL_INDEX_UP).setCellRenderer(new UpCellRenderer()); columnModel.get(TABLE_COL_INDEX_EDIT).setCellRenderer(
columnModel.get(TABLE_COL_INDEX_DOWN).setCellRenderer(new DownCellRenderer()); new EditCellRenderer());
columnModel.get(TABLE_COL_INDEX_DEL).setCellRenderer(new DeleteCellRenderer()); columnModel.get(TABLE_COL_INDEX_UP)
.setCellRenderer(new UpCellRenderer());
columnModel.get(TABLE_COL_INDEX_DOWN).setCellRenderer(
new DownCellRenderer());
columnModel.get(TABLE_COL_INDEX_DEL).setCellRenderer(
new DeleteCellRenderer());
addTableActionListener(new ImageStepTableActionListener()); addTableActionListener(new ImageStepTableActionListener());
} }
private class ImageTableModelBuilder extends LockableImpl implements TableModelBuilder { private class ImageTableModelBuilder extends LockableImpl implements
TableModelBuilder {
private final ImageStep imageStep; private final ImageStep imageStep;
@ -204,8 +212,10 @@ public class ImageStepDisplayTable extends Table {
@Override @Override
public Object getElementAt(final int columnIndex) { public Object getElementAt(final int columnIndex) {
final ItemImageAttachment image = (ItemImageAttachment) DomainObjectFactory.newInstance( final ItemImageAttachment image
images.getDataObject()); = (ItemImageAttachment) DomainObjectFactory
.newInstance(
images.getDataObject());
switch (columnIndex) { switch (columnIndex) {
case TABLE_COL_INDEX_THUMBNAIL: case TABLE_COL_INDEX_THUMBNAIL:
@ -246,7 +256,8 @@ public class ImageStepDisplayTable extends Table {
} }
private class ThumbnailCellRenderer extends LockableImpl implements TableCellRenderer { private class ThumbnailCellRenderer extends LockableImpl implements
TableCellRenderer {
@Override @Override
public Component getComponent(final Table table, public Component getComponent(final Table table,
@ -281,48 +292,83 @@ public class ImageStepDisplayTable extends Table {
protected void generateImagePropertiesXML(final ImageAsset image, protected void generateImagePropertiesXML(final ImageAsset image,
final PageState state, final PageState state,
final Element element) { final Element element) {
final Integer thumbWidth = CMS.getConfig()
.getImageBrowserThumbnailMaxWidth();
final Integer thumbHeight = CMS.getConfig()
.getImageBrowserThumbnailMaxHeight();
final Double aspectRatio = image.getWidth().doubleValue() / image
.getHeight().doubleValue();
final Double imgWidth;
final Double imgHeight;
if (image.getWidth().doubleValue() > image.getHeight().doubleValue()) {
imgWidth = (double) thumbWidth;
imgHeight = imgWidth / aspectRatio;
} else {
imgHeight = (double) thumbHeight;
imgWidth = imgHeight * aspectRatio;
}
element.addAttribute("name", image.getName()); element.addAttribute("name", image.getName());
element.addAttribute("src", URL.getDispatcherPath() final String imgUrl = URL.getDispatcherPath()
+ Service.getImageURL(image)); + Service.getImageURL(image);
final BigDecimal width = image.getWidth(); final String src;
if (width != null) { if (imgUrl.contains("?")) {
element.addAttribute("width", width.toString()); src = String.format("%s&maxWidth=%d&maxHeight=%d",
} imgUrl,
final BigDecimal height = image.getHeight(); imgWidth.intValue(),
if (height != null) { imgHeight.intValue());
element.addAttribute("height", height.toString()); } else {
src = String.format("%s?maxWidth=%d&maxHeight=%d",
imgUrl,
imgWidth.intValue(),
imgHeight.intValue());
} }
element.addAttribute("src", src);
//final BigDecimal width = image.getWidth();
//if (width != null) {
element.addAttribute("width", Integer.toString(imgWidth.intValue()));
//}
//final BigDecimal height = image.getHeight();
//if (height != null) {
element.addAttribute("height", Integer.toString(imgHeight.intValue()));
//}
element.addAttribute("plain", "true"); element.addAttribute("plain", "true");
} }
} }
private class PropertiesCellRenderer extends LockableImpl implements TableCellRenderer { private class PropertiesCellRenderer extends LockableImpl implements
TableCellRenderer {
@Override @Override
public Component getComponent(final Table table, public Component getComponent(final Table table,
final PageState state, final PageState state,
final Object value, final Object value,
final boolean isSelected, final boolean isSelected,
final Object key, final Object key,
final int row, final int row,
final int column) { final int column) {
final ItemImageAttachment attachment = (ItemImageAttachment) value; final ItemImageAttachment attachment = (ItemImageAttachment) value;
final ReusableImageAsset image = attachment.getImage(); final ReusableImageAsset image = attachment.getImage();
final BoxPanel panel = new BoxPanel(BoxPanel.VERTICAL); final BoxPanel panel = new BoxPanel(BoxPanel.VERTICAL);
panel.add(new Label(image.getName())); panel.add(new Label(image.getName()));
panel.add(new Label(String.format("%sx%s px", image.getWidth().toString(), panel.add(new Label(String.format("%sx%s px", image.getWidth()
image.getHeight().toString()))); .toString(),
image.getHeight().toString())));
panel.add(new Label(image.getMimeType().getLabel())); panel.add(new Label(image.getMimeType().getLabel()));
return panel; return panel;
} }
} }
private class NameCellRenderer extends LockableImpl implements TableCellRenderer { private class NameCellRenderer extends LockableImpl implements
TableCellRenderer {
@Override @Override
public Component getComponent(final Table table, public Component getComponent(final Table table,
@ -337,7 +383,8 @@ public class ImageStepDisplayTable extends Table {
} }
private class DimensionsCellRenderer extends LockableImpl implements TableCellRenderer { private class DimensionsCellRenderer extends LockableImpl implements
TableCellRenderer {
@Override @Override
public Component getComponent(final Table table, public Component getComponent(final Table table,
@ -352,7 +399,8 @@ public class ImageStepDisplayTable extends Table {
} }
private class TypeCellRenderer extends LockableImpl implements TableCellRenderer { private class TypeCellRenderer extends LockableImpl implements
TableCellRenderer {
@Override @Override
public Component getComponent(final Table table, public Component getComponent(final Table table,
@ -367,7 +415,8 @@ public class ImageStepDisplayTable extends Table {
} }
private class CaptionCellRenderer extends LockableImpl implements TableCellRenderer { private class CaptionCellRenderer extends LockableImpl implements
TableCellRenderer {
@Override @Override
public Component getComponent(final Table table, public Component getComponent(final Table table,
@ -382,7 +431,8 @@ public class ImageStepDisplayTable extends Table {
} }
private class EditCellRenderer extends LockableImpl implements TableCellRenderer { private class EditCellRenderer extends LockableImpl implements
TableCellRenderer {
@Override @Override
public Component getComponent(final Table table, public Component getComponent(final Table table,
@ -392,7 +442,8 @@ public class ImageStepDisplayTable extends Table {
final Object key, final Object key,
final int row, final int row,
final int column) { final int column) {
final com.arsdigita.cms.SecurityManager securityManager = CMS.getSecurityManager(state); final com.arsdigita.cms.SecurityManager securityManager = CMS
.getSecurityManager(state);
final ContentItem item = imageStep.getItem(state); final ContentItem item = imageStep.getItem(state);
final boolean canEdit = securityManager.canAccess( final boolean canEdit = securityManager.canAccess(
@ -401,16 +452,19 @@ public class ImageStepDisplayTable extends Table {
item); item);
if (canEdit) { if (canEdit) {
final ControlLink link = new ControlLink(new Label((GlobalizedMessage) value)); final ControlLink link = new ControlLink(new Label(
(GlobalizedMessage) value));
link.setStyleAttr(CONTROL_LINK_FONT_SIZE); link.setStyleAttr(CONTROL_LINK_FONT_SIZE);
return link; return link;
} else { } else {
return new Label(""); return new Label("");
} }
} }
} }
private class UpCellRenderer extends LockableImpl implements TableCellRenderer { private class UpCellRenderer extends LockableImpl implements
TableCellRenderer {
@Override @Override
public Component getComponent(final Table table, public Component getComponent(final Table table,
@ -424,7 +478,8 @@ public class ImageStepDisplayTable extends Table {
//First row, don't show up link //First row, don't show up link
return new Label(""); return new Label("");
} else { } else {
final ControlLink link = new ControlLink(new Label((GlobalizedMessage) value)); final ControlLink link = new ControlLink(new Label(
(GlobalizedMessage) value));
link.setStyleAttr(CONTROL_LINK_FONT_SIZE); link.setStyleAttr(CONTROL_LINK_FONT_SIZE);
return link; return link;
} }
@ -432,7 +487,8 @@ public class ImageStepDisplayTable extends Table {
} }
private class DownCellRenderer extends LockableImpl implements TableCellRenderer { private class DownCellRenderer extends LockableImpl implements
TableCellRenderer {
@Override @Override
public Component getComponent(final Table table, public Component getComponent(final Table table,
@ -443,13 +499,15 @@ public class ImageStepDisplayTable extends Table {
final int row, final int row,
final int column) { final int column) {
final ContentItem item = imageStep.getItem(state); final ContentItem item = imageStep.getItem(state);
final DataCollection images = ItemImageAttachment.getImageAttachments(item); final DataCollection images = ItemImageAttachment
.getImageAttachments(item);
if ((images.size() - 1) == row) { if ((images.size() - 1) == row) {
//Last row in table, don't show down link //Last row in table, don't show down link
return new Label(""); return new Label("");
} else { } else {
final ControlLink link = new ControlLink(new Label((GlobalizedMessage) value)); final ControlLink link = new ControlLink(new Label(
(GlobalizedMessage) value));
link.setStyleAttr(CONTROL_LINK_FONT_SIZE); link.setStyleAttr(CONTROL_LINK_FONT_SIZE);
return link; return link;
} }
@ -457,7 +515,8 @@ public class ImageStepDisplayTable extends Table {
} }
private class DeleteCellRenderer extends LockableImpl implements TableCellRenderer { private class DeleteCellRenderer extends LockableImpl implements
TableCellRenderer {
@Override @Override
public Component getComponent(final Table table, public Component getComponent(final Table table,
@ -467,7 +526,8 @@ public class ImageStepDisplayTable extends Table {
final Object key, final Object key,
final int row, final int row,
final int column) { final int column) {
final com.arsdigita.cms.SecurityManager securityManager = CMS.getSecurityManager(state); final com.arsdigita.cms.SecurityManager securityManager = CMS
.getSecurityManager(state);
final ContentItem item = imageStep.getItem(state); final ContentItem item = imageStep.getItem(state);
final boolean canEdit = securityManager.canAccess( final boolean canEdit = securityManager.canAccess(
@ -476,7 +536,8 @@ public class ImageStepDisplayTable extends Table {
item); item);
if (canEdit) { if (canEdit) {
final ControlLink link = new ControlLink(new Label((GlobalizedMessage) value)); final ControlLink link = new ControlLink(new Label(
(GlobalizedMessage) value));
link.setConfirmation(ImageStepGlobalizationUtil.globalize( link.setConfirmation(ImageStepGlobalizationUtil.globalize(
"cms.contentassets.ui.image_step.remove_attached_image.confirm")); "cms.contentassets.ui.image_step.remove_attached_image.confirm"));
link.setStyleAttr(CONTROL_LINK_FONT_SIZE); link.setStyleAttr(CONTROL_LINK_FONT_SIZE);
@ -497,18 +558,21 @@ public class ImageStepDisplayTable extends Table {
@Override @Override
public void cellSelected(final TableActionEvent event) { public void cellSelected(final TableActionEvent event) {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final TableColumn column = getColumnModel().get(event.getColumn().intValue()); final TableColumn column = getColumnModel().get(event.getColumn()
.intValue());
if (TABLE_COL_EDIT.equals(column.getHeaderKey().toString())) { if (TABLE_COL_EDIT.equals(column.getHeaderKey().toString())) {
imageStep.setAttachment(state, ItemImageAttachment.retrieve(OID.valueOf(event imageStep.setAttachment(state, ItemImageAttachment.retrieve(OID
.getRowKey().toString()))); .valueOf(event
.getRowKey().toString())));
imageStep.showComponent(state, "edit"); imageStep.showComponent(state, "edit");
} else if (TABLE_COL_UP.equals(column.getHeaderKey().toString())) { } else if (TABLE_COL_UP.equals(column.getHeaderKey().toString())) {
move(OID.valueOf(event.getRowKey().toString()), UP, state); move(OID.valueOf(event.getRowKey().toString()), UP, state);
} else if (TABLE_COL_DOWN.equals(column.getHeaderKey().toString())) { } else if (TABLE_COL_DOWN.equals(column.getHeaderKey().toString())) {
move(OID.valueOf(event.getRowKey().toString()), DOWN, state); move(OID.valueOf(event.getRowKey().toString()), DOWN, state);
} else if (TABLE_COL_DEL.equals(column.getHeaderKey().toString())) { } else if (TABLE_COL_DEL.equals(column.getHeaderKey().toString())) {
DomainObjectFactory.newInstance(OID.valueOf(event.getRowKey().toString())).delete(); DomainObjectFactory.newInstance(OID.valueOf(event.getRowKey()
.toString())).delete();
regenSortKeys(state); regenSortKeys(state);
} }
@ -523,7 +587,8 @@ public class ImageStepDisplayTable extends Table {
private void regenSortKeys(final PageState state) { private void regenSortKeys(final PageState state) {
final ContentItem item = imageStep.getItem(state); final ContentItem item = imageStep.getItem(state);
final DataCollection images = ItemImageAttachment.getImageAttachments(item); final DataCollection images = ItemImageAttachment.getImageAttachments(
item);
int pos = 0; int pos = 0;
while (images.next()) { while (images.next()) {
@ -532,7 +597,8 @@ public class ImageStepDisplayTable extends Table {
.newInstance(images.getDataObject()); .newInstance(images.getDataObject());
if (domainObject instanceof ItemImageAttachment) { if (domainObject instanceof ItemImageAttachment) {
final ItemImageAttachment image = (ItemImageAttachment) domainObject; final ItemImageAttachment image
= (ItemImageAttachment) domainObject;
if (image.getSortKey() != pos) { if (image.getSortKey() != pos) {
image.setSortKey(pos); image.setSortKey(pos);
image.save(); image.save();
@ -542,12 +608,15 @@ public class ImageStepDisplayTable extends Table {
} }
} }
private void move(final OID imageOid, final int direction, final PageState state) { private void move(final OID imageOid, final int direction,
final PageState state) {
final ContentItem item = imageStep.getItem(state); final ContentItem item = imageStep.getItem(state);
final DataCollection images = ItemImageAttachment.getImageAttachments(item); final DataCollection images = ItemImageAttachment.getImageAttachments(
item);
if (imageOid == null) { if (imageOid == null) {
throw new IllegalArgumentException("OID of ImageAttachment must not be null."); throw new IllegalArgumentException(
"OID of ImageAttachment must not be null.");
} }
// No move, nothing to do // No move, nothing to do
@ -564,7 +633,8 @@ public class ImageStepDisplayTable extends Table {
// Throw an {@link IllegalArgumentxception} if the imageOid was not found // Throw an {@link IllegalArgumentxception} if the imageOid was not found
if (!images.getDataObject().getOID().equals(imageOid)) { if (!images.getDataObject().getOID().equals(imageOid)) {
throw new IllegalArgumentException("OID " + imageOid + " is not in collection"); throw new IllegalArgumentException("OID " + imageOid
+ " is not in collection");
} }
// Get the image to move and test if it is really an ItemImageAttachment // Get the image to move and test if it is really an ItemImageAttachment
@ -577,8 +647,8 @@ public class ImageStepDisplayTable extends Table {
// value but respect bounds of the current list // value but respect bounds of the current list
final int newSortKey = Math.max(1, final int newSortKey = Math.max(1,
Math.min((int) images.size(), Math.min((int) images.size(),
((ItemImageAttachment) sortDomainObject). ((ItemImageAttachment) sortDomainObject)
getSortKey() + move)); .getSortKey() + move));
((ItemImageAttachment) sortDomainObject).setSortKey(newSortKey); ((ItemImageAttachment) sortDomainObject).setSortKey(newSortKey);
sortDomainObject.save(); sortDomainObject.save();
@ -586,11 +656,13 @@ public class ImageStepDisplayTable extends Table {
// new postition one step in the nessecary direction // new postition one step in the nessecary direction
if (move < 0) { if (move < 0) {
while (images.previous() && move < 0) { while (images.previous() && move < 0) {
final DomainObject domainObject = DomainObjectFactory.newInstance(images. final DomainObject domainObject = DomainObjectFactory
getDataObject()); .newInstance(images.
getDataObject());
if (domainObject instanceof ItemImageAttachment) { if (domainObject instanceof ItemImageAttachment) {
((ItemImageAttachment) domainObject).setSortKey( ((ItemImageAttachment) domainObject).setSortKey(
((ItemImageAttachment) domainObject).getSortKey() + 1); ((ItemImageAttachment) domainObject).getSortKey()
+ 1);
domainObject.save(); domainObject.save();
move++; move++;
} }
@ -598,11 +670,13 @@ public class ImageStepDisplayTable extends Table {
} }
if (move > 0) { if (move > 0) {
while (images.next() && move > 0) { while (images.next() && move > 0) {
final DomainObject domainObject = DomainObjectFactory.newInstance(images. final DomainObject domainObject = DomainObjectFactory
getDataObject()); .newInstance(images.
getDataObject());
if (domainObject instanceof ItemImageAttachment) { if (domainObject instanceof ItemImageAttachment) {
((ItemImageAttachment) domainObject).setSortKey( ((ItemImageAttachment) domainObject).setSortKey(
((ItemImageAttachment) domainObject).getSortKey() - 1); ((ItemImageAttachment) domainObject).getSortKey()
- 1);
domainObject.save(); domainObject.save();
move--; move--;
} }

View File

@ -73,17 +73,29 @@ public class ImageBrowser extends Table {
private ImageBrowserModelBuilder m_builder; private ImageBrowserModelBuilder m_builder;
// match columns by (symbolic) index, makes for easier reordering // match columns by (symbolic) index, makes for easier reordering
/** Index into TableColumn for Thumb column */ /**
* Index into TableColumn for Thumb column
*/
private static final int THUMB = 0; private static final int THUMB = 0;
/** Index into TableColumn for Name column */ /**
* Index into TableColumn for Name column
*/
private static final int NAME = 1; private static final int NAME = 1;
/** Index into TableColumn for Size column */ /**
* Index into TableColumn for Size column
*/
private static final int SIZE = 2; private static final int SIZE = 2;
/** Index into TableColumn for Type column */ /**
* Index into TableColumn for Type column
*/
private static final int TYPE = 3; private static final int TYPE = 3;
/** Index into TableColumn for Select link column */ /**
* Index into TableColumn for Select link column
*/
private static final int SELECT = 4; private static final int SELECT = 4;
/** Index into TableColumn for Delete link column */ /**
* Index into TableColumn for Delete link column
*/
private static final int DELETE = 5; private static final int DELETE = 5;
private int m_numColumns = -1; private int m_numColumns = -1;
@ -91,12 +103,11 @@ public class ImageBrowser extends Table {
private Dimension m_thumbSize; private Dimension m_thumbSize;
/** /**
* Construct a new ImageBrowser with default mode. * Construct a new ImageBrowser with default mode.
* *
* @param builder the {@link ImageBrowserModelBuilder} that will supply this * @param builder the {@link ImageBrowserModelBuilder} that will supply this
* component with its {@link ImageBrowserModel} during each * component with its {@link ImageBrowserModel} during each
* request * request
*/ */
public ImageBrowser(ImageBrowserModelBuilder b) { public ImageBrowser(ImageBrowserModelBuilder b) {
@ -108,7 +119,7 @@ public class ImageBrowser extends Table {
* Construct a new ImageBrowser table with requested mode. * Construct a new ImageBrowser table with requested mode.
* *
* @param builder the {@link ImageBrowserModelBuilder} that will supply this * @param builder the {@link ImageBrowserModelBuilder} that will supply this
* component with its {@link ImageBrowserModel} during each * component with its {@link ImageBrowserModel} during each
* request * request
* @param mode the component mode (see {@link ImageComponent}) * @param mode the component mode (see {@link ImageComponent})
*/ */
@ -125,35 +136,35 @@ public class ImageBrowser extends Table {
/* Add columns and column header to the yet empty table */ /* Add columns and column header to the yet empty table */
TableColumnModel model = getColumnModel(); TableColumnModel model = getColumnModel();
model.add(new TableColumn( model.add(new TableColumn(
THUMB, THUMB,
new Label(GlobalizationUtil.globalize( new Label(GlobalizationUtil.globalize(
"cms.contentasset.image.ui.table.header_thumb") "cms.contentasset.image.ui.table.header_thumb")
) )); )));
model.add(new TableColumn( model.add(new TableColumn(
NAME, NAME,
new Label(GlobalizationUtil.globalize( new Label(GlobalizationUtil.globalize(
"cms.contentasset.image.ui.table.header_name") "cms.contentasset.image.ui.table.header_name")
) )); )));
model.add(new TableColumn( model.add(new TableColumn(
SIZE, SIZE,
new Label(GlobalizationUtil.globalize( new Label(GlobalizationUtil.globalize(
"cms.contentasset.image.ui.table.header_size") "cms.contentasset.image.ui.table.header_size")
) )); )));
model.add(new TableColumn( model.add(new TableColumn(
TYPE, TYPE,
new Label(GlobalizationUtil.globalize( new Label(GlobalizationUtil.globalize(
"cms.contentasset.image.ui.table.header_type") "cms.contentasset.image.ui.table.header_type")
) )); )));
model.add(new TableColumn( model.add(new TableColumn(
SELECT, SELECT,
new Label(GlobalizationUtil.globalize( new Label(GlobalizationUtil.globalize(
"cms.contentasset.image.ui.table.header_action_select") "cms.contentasset.image.ui.table.header_action_select")
) )); )));
model.add(new TableColumn( // Temporary not used due to consistency model.add(new TableColumn( // Temporary not used due to consistency
DELETE, null // probs with images probably in use DELETE, null // probs with images probably in use
// new Label(GlobalizationUtil.globalize( // new Label(GlobalizationUtil.globalize(
// "cms.contentasset.image.ui.table.header_action_delete")) // "cms.contentasset.image.ui.table.header_action_delete"))
)); ));
model.get(THUMB).setCellRenderer(new ThumbnailCellRenderer()); model.get(THUMB).setCellRenderer(new ThumbnailCellRenderer());
model.get(NAME).setCellRenderer(new DefaultTableCellRenderer(false)); model.get(NAME).setCellRenderer(new DefaultTableCellRenderer(false));
@ -169,10 +180,9 @@ public class ImageBrowser extends Table {
setClassAttr("imageBrowser"); setClassAttr("imageBrowser");
} }
/** /**
* *
* @return * @return
*/ */
public int getNumColumns() { public int getNumColumns() {
return m_numColumns; return m_numColumns;
@ -215,20 +225,20 @@ public class ImageBrowser extends Table {
* is clicked. Child classes should override the linkClicked method. * is clicked. Child classes should override the linkClicked method.
*/ */
public static abstract class LinkActionListener public static abstract class LinkActionListener
extends TableActionAdapter { extends TableActionAdapter {
/** /**
* *
* @param e * @param e
*/ */
@Override @Override
public void cellSelected(TableActionEvent e) { public void cellSelected(TableActionEvent e) {
int c = e.getColumn().intValue(); int c = e.getColumn().intValue();
if (c == SELECT) { if (c == SELECT) {
linkClicked(e.getPageState(), linkClicked(e.getPageState(),
new BigDecimal((String) e.getRowKey())); new BigDecimal((String) e.getRowKey()));
} else if (c == DELETE) { } else if (c == DELETE) {
deleteClicked(e.getPageState(), deleteClicked(e.getPageState(),
new BigDecimal((String) e.getRowKey())); new BigDecimal((String) e.getRowKey()));
} }
} }
@ -236,6 +246,7 @@ public class ImageBrowser extends Table {
public abstract void linkClicked(PageState state, BigDecimal imageId); public abstract void linkClicked(PageState state, BigDecimal imageId);
public abstract void deleteClicked(PageState state, BigDecimal imageId); public abstract void deleteClicked(PageState state, BigDecimal imageId);
} }
/** /**
@ -245,29 +256,45 @@ public class ImageBrowser extends Table {
@Override @Override
public Component getComponent(Table table, PageState state, Object value, public Component getComponent(Table table, PageState state, Object value,
boolean isSelected, Object key, boolean isSelected, Object key,
int row, int column) { int row, int column) {
ImageAsset a = (ImageAsset) value; ImageAsset a = (ImageAsset) value;
Double aspectRatio = a.getWidth().doubleValue() / a.getHeight()
.doubleValue();
Double width;
Double height;
if (a.getWidth().doubleValue() > a.getHeight().doubleValue()) {
width = m_thumbSize.getWidth();
height = m_thumbSize.getWidth() / aspectRatio;
} else {
height = m_thumbSize.getHeight();
width = height * aspectRatio;
}
String url = Service.getImageURL(a); String url = Service.getImageURL(a);
// Sets url paramter to resize the images server-side // Sets url paramter to resize the images server-side
String resizeParam = "&maxWidth=" String resizeParam = "&maxWidth=" + new Double(m_thumbSize
+ new Double(m_thumbSize.getWidth()).intValue() .getWidth()).intValue()
+ "&maxHeight=" + "&maxHeight="
+ new Double(m_thumbSize.getHeight()).intValue(); + new Double(m_thumbSize
.getHeight())
.intValue();
Image img = new Image(URL.getDispatcherPath() + url Image img = new Image(URL.getDispatcherPath() + url + resizeParam,
+ resizeParam, a.getName()); a.getName());
img.setBorder("0"); img.setBorder("0");
final Double width = m_thumbSize.getWidth(); // final Double width = m_thumbSize.getWidth();
final Double height = m_thumbSize.getHeight(); // final Double height = m_thumbSize.getHeight();
img.setWidth(Integer.toString(width.intValue())); img.setWidth(Integer.toString(width.intValue()));
img.setHeight(Integer.toString(height.intValue())); img.setHeight(Integer.toString(height.intValue()));
return new Link(img, url); return new Link(img, url);
} }
} }
/** /**
@ -280,7 +307,7 @@ public class ImageBrowser extends Table {
} }
/** /**
* *
* @param table * @param table
* @param state * @param state
* @param value * @param value
@ -288,27 +315,29 @@ public class ImageBrowser extends Table {
* @param key * @param key
* @param row * @param row
* @param column * @param column
* @return *
* @return
*/ */
@Override @Override
public Component getComponent(Table table, PageState state, Object value, public Component getComponent(Table table, PageState state, Object value,
boolean isSelected, Object key, boolean isSelected, Object key,
int row, int column) { int row, int column) {
if (m_mode == ImageComponent.SELECT_IMAGE if (m_mode == ImageComponent.SELECT_IMAGE
|| m_mode == ImageComponent.ATTACH_IMAGE) { || m_mode == ImageComponent.ATTACH_IMAGE) {
return super.getComponent(table, state, value, return super.getComponent(table, state, value,
isSelected, key, row, column); isSelected, key, row, column);
} }
// return new Label(""); // this variant is deprecated! // return new Label(""); // this variant is deprecated!
return new Label(); return new Label();
} }
} }
/** /**
* Inner private class renders the delete link if the user has permission * Inner private class renders the delete link if the user has permission to
* to deletethe asset and it's not used in an article. * deletethe asset and it's not used in an article.
*/ */
private class DeleteCellRenderer extends DefaultTableCellRenderer { private class DeleteCellRenderer extends DefaultTableCellRenderer {
@ -317,7 +346,7 @@ public class ImageBrowser extends Table {
} }
/** /**
* *
* @param table * @param table
* @param state * @param state
* @param value * @param value
@ -325,12 +354,13 @@ public class ImageBrowser extends Table {
* @param key * @param key
* @param row * @param row
* @param column * @param column
* @return *
* @return
*/ */
@Override @Override
public Component getComponent(Table table, PageState state, Object value, public Component getComponent(Table table, PageState state, Object value,
boolean isSelected, Object key, boolean isSelected, Object key,
int row, int column) { int row, int column) {
// Only show delete link in admin mode // Only show delete link in admin mode
if (m_mode == ImageComponent.ADMIN_IMAGES) { if (m_mode == ImageComponent.ADMIN_IMAGES) {
@ -338,13 +368,13 @@ public class ImageBrowser extends Table {
boolean canDelete = false; boolean canDelete = false;
// SecurityManager sm = Utilities.getSecurityManager(state); // SecurityManager sm = Utilities.getSecurityManager(state);
SecurityManager sm = CMS.getSecurityManager(state); SecurityManager sm = CMS.getSecurityManager(state);
if (sm.canAccess(state.getRequest(), if (sm.canAccess(state.getRequest(),
SecurityManager.DELETE_IMAGES)) { SecurityManager.DELETE_IMAGES)) {
try { try {
ImageAsset asset = (ImageAsset) DomainObjectFactory ImageAsset asset = (ImageAsset) DomainObjectFactory
.newInstance(new .newInstance(new OID(
OID(ImageAsset.BASE_DATA_OBJECT_TYPE, ImageAsset.BASE_DATA_OBJECT_TYPE,
(BigDecimal) key)); (BigDecimal) key));
//XXX Find a new way to figure out, if this image is used by any CI so we can //XXX Find a new way to figure out, if this image is used by any CI so we can
// decide if it can be deleted // decide if it can be deleted
// if (!GenericArticleImageAssociation.imageHasAssociation(asset)) { // if (!GenericArticleImageAssociation.imageHasAssociation(asset)) {
@ -358,27 +388,28 @@ public class ImageBrowser extends Table {
// can delete image because it's not in use // can delete image because it's not in use
if (canDelete) { if (canDelete) {
return super.getComponent(table, return super.getComponent(table,
state, state,
value, value,
isSelected, isSelected,
key, key,
row, row,
column); column);
} }
} }
// return (Component) null; // used to work for other tables but // return (Component) null; // used to work for other tables but
// doesn't here for some reason. // doesn't here for some reason.
return new Label(); return new Label();
} }
} }
/** /**
* Inner private class converts an ImageBrowserModelBuilder to a * Inner private class converts an ImageBrowserModelBuilder to a
* TableModelBuilder * TableModelBuilder
*/ */
private static class BuilderAdapter extends LockableImpl private static class BuilderAdapter extends LockableImpl
implements TableModelBuilder { implements TableModelBuilder {
private ImageBrowserModelBuilder m_builder; private ImageBrowserModelBuilder m_builder;
@ -389,7 +420,7 @@ public class ImageBrowser extends Table {
@Override @Override
public TableModel makeModel(Table t, PageState s) { public TableModel makeModel(Table t, PageState s) {
return new ImageModelAdapter( return new ImageModelAdapter(
m_builder.makeModel((ImageBrowser) t, s)); m_builder.makeModel((ImageBrowser) t, s));
} }
@Override @Override
@ -397,6 +428,7 @@ public class ImageBrowser extends Table {
m_builder.lock(); m_builder.lock();
super.lock(); super.lock();
} }
} }
/** /**
@ -465,15 +497,15 @@ public class ImageBrowser extends Table {
// Due to current design has to be a string! Localisation // Due to current design has to be a string! Localisation
// works here nevertheless. // works here nevertheless.
return (String) GlobalizationUtil.globalize( return (String) GlobalizationUtil.globalize(
"cms.contentasset.image.ui.table.link_select") "cms.contentasset.image.ui.table.link_select")
.localize(); .localize();
case ImageBrowser.DELETE: case ImageBrowser.DELETE:
// Due to current design has to be a string! Localisation // Due to current design has to be a string! Localisation
// works here nevertheless. // works here nevertheless.
return (String) GlobalizationUtil.globalize( return (String) GlobalizationUtil.globalize(
"cms.contentasset.image.ui.table.link_delete") "cms.contentasset.image.ui.table.link_delete")
.localize(); .localize();
default: default:
return null; return null;
@ -488,5 +520,7 @@ public class ImageBrowser extends Table {
public ImageBrowserModel getModel() { public ImageBrowserModel getModel() {
return m_model; return m_model;
} }
} }
} }

View File

@ -29,15 +29,15 @@ import java.math.BigDecimal;
/** /**
* An image library component. * An image library component.
* *
* This component can be used in different places to add an image library * This component can be used in different places to add an image library in a
* in a convinient way. This class uses a listener class which should be * convinient way. This class uses a listener class which should be extended
* extended from {@link ImageComponentAbstractListener}. * from {@link ImageComponentAbstractListener}.
* *
* @author unknown * @author unknown
* @author Sören Bernstein <quasi@quasiweb.de> * @author Sören Bernstein <quasi@quasiweb.de>
*/ */
public class ImageLibraryComponent extends SimpleContainer public class ImageLibraryComponent extends SimpleContainer
implements ImageComponent, Resettable { implements ImageComponent, Resettable {
private final ImageChooser m_chooser; private final ImageChooser m_chooser;
private final ItemSelectionModel m_imageModel; private final ItemSelectionModel m_imageModel;
@ -65,28 +65,34 @@ public class ImageLibraryComponent extends SimpleContainer
m_chooser = new ImageChooser(ContentItem.DRAFT, m_mode); m_chooser = new ImageChooser(ContentItem.DRAFT, m_mode);
m_chooser.addImageActionListener(new ImageBrowser.LinkActionListener() { m_chooser.addImageActionListener(new ImageBrowser.LinkActionListener() {
@Override @Override
public void deleteClicked(final PageState state, final BigDecimal imageID) { public void deleteClicked(final PageState state,
final BigDecimal imageID) {
ImagesPane.S_LOG.debug("Clicked delete"); ImagesPane.S_LOG.debug("Clicked delete");
final ReusableImageAsset image = new ReusableImageAsset(imageID); final ReusableImageAsset image = new ReusableImageAsset(imageID);
image.delete(); image.delete();
} }
@Override @Override
public void linkClicked(final PageState state, final BigDecimal imageID) { public void linkClicked(final PageState state,
final BigDecimal imageID) {
ImagesPane.S_LOG.debug("Clicked select"); ImagesPane.S_LOG.debug("Clicked select");
try { try {
final ReusableImageAsset image = new ReusableImageAsset(imageID); final ReusableImageAsset image = new ReusableImageAsset(
if(m_mode == ImageComponent.SELECT_IMAGE) { imageID);
parent.getResultComponent().setResult(image, ImageComponent.LIBRARY); if (m_mode == ImageComponent.SELECT_IMAGE) {
parent.getResultComponent().setResult(image,
ImageComponent.LIBRARY);
} }
m_imageModel.setSelectedObject(state, image); m_imageModel.setSelectedObject(state, image);
} catch (DataObjectNotFoundException ex) { } catch (DataObjectNotFoundException ex) {
ImagesPane.S_LOG.error("Selected non-existant image: " + imageID, ex); ImagesPane.S_LOG.error("Selected non-existant image: "
+ imageID, ex);
} }
} }
}); });
add(m_chooser);
// Form for additional fields and submit // Form for additional fields and submit
m_form = new Form("imageLibraryComponent", new ColumnPanel(2)); m_form = new Form("imageLibraryComponent", new ColumnPanel(2));
@ -102,7 +108,7 @@ public class ImageLibraryComponent extends SimpleContainer
// in image-step // in image-step
if (m_mode == ImageComponent.ATTACH_IMAGE) { if (m_mode == ImageComponent.ATTACH_IMAGE) {
m_form.add(new Label(GlobalizationUtil m_form.add(new Label(GlobalizationUtil
.globalize("cms.contentasset.image.ui.caption"))); .globalize("cms.contentasset.image.ui.caption")));
m_caption.addValidationListener(new NotNullValidationListener()); m_caption.addValidationListener(new NotNullValidationListener());
m_caption.setSize(CMS.getConfig().getImageBrowserCaptionSize()); m_caption.setSize(CMS.getConfig().getImageBrowserCaptionSize());
m_form.add(m_caption); m_form.add(m_caption);
@ -120,26 +126,28 @@ public class ImageLibraryComponent extends SimpleContainer
* m_form.add(m_title); } * m_form.add(m_title); }
*/ */
m_form.add(new Label(GlobalizationUtil m_form.add(new Label(GlobalizationUtil
.globalize("cms.contentasset.image.ui.use_context"))); .globalize("cms.contentasset.image.ui.use_context")));
m_useContext.setSize(40); m_useContext.setSize(40);
m_form.add(m_useContext); m_form.add(m_useContext);
} }
// if (m_mode == ImageComponent.SELECT_IMAGE) { // if (m_mode == ImageComponent.SELECT_IMAGE) {
// m_form.setOnSubmit("selectImage();"); // m_form.setOnSubmit("selectImage();");
// } // }
// save and cancel buttons // save and cancel buttons
m_saveCancel = new SaveCancelSection(); m_saveCancel = new SaveCancelSection();
m_saveCancel.getSaveButton().setOnClick("selectImage(this)"); m_saveCancel.getSaveButton().setOnClick("selectImage(this)");
m_saveCancel.getCancelButton().setOnClick("selectImage(this)"); m_saveCancel.getCancelButton().setOnClick("selectImage(this)");
if (m_mode == ImageComponent.SELECT_IMAGE if (m_mode == ImageComponent.SELECT_IMAGE
|| m_mode == ImageComponent.ATTACH_IMAGE) { || m_mode == ImageComponent.ATTACH_IMAGE) {
m_form.add(m_saveCancel); m_form.add(m_saveCancel);
} }
add(m_chooser);
} }
@Override @Override
public ReusableImageAsset getImage(final FormSectionEvent event) { public ReusableImageAsset getImage(final FormSectionEvent event) {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
return (ReusableImageAsset) m_imageModel.getSelectedItem(state); return (ReusableImageAsset) m_imageModel.getSelectedItem(state);
@ -151,53 +159,53 @@ public class ImageLibraryComponent extends SimpleContainer
page.addComponentStateParam(this, m_imageID); page.addComponentStateParam(this, m_imageID);
} }
@Override @Override
public String getCaption(final FormSectionEvent event) { public String getCaption(final FormSectionEvent event) {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
return (String) m_caption.getValue(state); return (String) m_caption.getValue(state);
} }
@Override @Override
public String getDescription(final FormSectionEvent event) { public String getDescription(final FormSectionEvent event) {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
return (String) m_description.getValue(state); return (String) m_description.getValue(state);
} }
@Override @Override
public String getTitle(final FormSectionEvent event) { public String getTitle(final FormSectionEvent event) {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
return (String) m_title.getValue(state); return (String) m_title.getValue(state);
} }
@Override @Override
public String getUseContext(final FormSectionEvent event) { public String getUseContext(final FormSectionEvent event) {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
return (String) m_useContext.getValue(state); return (String) m_useContext.getValue(state);
} }
@Override @Override
public Form getForm() { public Form getForm() {
return m_form; return m_form;
} }
@Override @Override
public SaveCancelSection getSaveCancelSection() { public SaveCancelSection getSaveCancelSection() {
return m_saveCancel; return m_saveCancel;
} }
/** /**
* Add a link to an {@link ImageUploadComponent} * Add a link to an {@link ImageUploadComponent}
* *
* @param actionListener * @param actionListener
*/ */
public void addUploadLink(final ActionListener actionListener) { public void addUploadLink(final ActionListener actionListener) {
// Add action link to image upload component // Add action link to image upload component
if (m_mode != ImageComponent.DISPLAY_ONLY) { if (m_mode != ImageComponent.DISPLAY_ONLY) {
final ActionLink upload = new ActionLink(new final ActionLink upload = new ActionLink(new Label(GlobalizationUtil
Label(GlobalizationUtil.globalize( .globalize(
"cms.ui.authoring.upload_a_new_image") )); "cms.ui.authoring.upload_a_new_image")));
upload.addActionListener(actionListener); upload.addActionListener(actionListener);
upload.setClassAttr("cmsContentViewMenu imageUploadLink"); upload.setClassAttr("cmsContentViewMenu imageUploadLink");
add(upload, ColumnPanel.FULL_WIDTH); add(upload, ColumnPanel.FULL_WIDTH);
} }
} }
@ -205,11 +213,12 @@ public class ImageLibraryComponent extends SimpleContainer
/** /**
* Reset this component. * Reset this component.
*/ */
@Override @Override
public void reset(final PageState state) { public void reset(final PageState state) {
// clear selection // clear selection
m_imageModel.clearSelection(state); m_imageModel.clearSelection(state);
m_chooser.clearSelection(state); m_chooser.clearSelection(state);
m_chooser.clearKeyword(state); m_chooser.clearKeyword(state);
} }
} }

View File

@ -23,6 +23,7 @@
exclude-result-prefixes="xsl" exclude-result-prefixes="xsl"
version="2.0"> version="2.0">
<xsl:import href="cms/image.xsl"/>
<xsl:import href="cms/item-summary.xsl"/> <xsl:import href="cms/item-summary.xsl"/>
<xsl:import href="cms/notes.xsl"/> <xsl:import href="cms/notes.xsl"/>
<xsl:import href="cms/tasks-panel.xsl"/> <xsl:import href="cms/tasks-panel.xsl"/>