* Thumbnails werden nun automatisch erzeugt und gespeichert
 * Anzeige im CC wird nun auf ein definiertes Maß proportional verkleinert
 * Lizenzfeld
 * TextAsset-Feld für den ausführlichen Text
 * Beschribungsfeld auf 500 Zeichen gekürzt
 * AuthoringStep "Bild hinzufügen" läßt sich per cms.properties Schlüssel ausblenden

git-svn-id: https://svn.libreccm.org/ccm/trunk@764 8810af33-2d31-482b-a856-94f89814c4df
master
quasi 2011-02-23 19:30:59 +00:00
parent dd645e695c
commit b78a52057d
16 changed files with 299 additions and 93 deletions

View File

@ -51,17 +51,12 @@ public class ItemImageAttachment extends ACSObject implements CustomCopy {
public static final String ITEM_ATTACHMENTS = "itemAttachments"; public static final String ITEM_ATTACHMENTS = "itemAttachments";
public static final String IMAGE_LINK = "imageLink"; public static final String IMAGE_LINK = "imageLink";
/** Data object type for this domain object */ /** Data object type for this domain object */
public static final String BASE_DATA_OBJECT_TYPE = public static final String BASE_DATA_OBJECT_TYPE = "com.arsdigita.cms.contentassets.ItemImageAttachment";
"com.arsdigita.cms.contentassets.ItemImageAttachment"; private static final Logger s_log = Logger.getLogger(ItemImageAttachment.class);
private static final Logger s_log = Logger.getLogger( private static final ItemImageAttachmentConfig s_config = new ItemImageAttachmentConfig();
ItemImageAttachment.class);
private static final ItemImageAttachmentConfig s_config =
new ItemImageAttachmentConfig();
static { static {
s_log.debug("Static initalizer starting...");
s_config.load(); s_config.load();
s_log.debug("Static initalizer finished.");
} }
private ItemImageAttachment() { private ItemImageAttachment() {
@ -131,8 +126,7 @@ public class ItemImageAttachment extends ACSObject implements CustomCopy {
s_log.debug("Getting attachments for " + item.getOID()); s_log.debug("Getting attachments for " + item.getOID());
} }
DataCollection attachments = SessionManager.getSession().retrieve( DataCollection attachments = SessionManager.getSession().retrieve(BASE_DATA_OBJECT_TYPE);
BASE_DATA_OBJECT_TYPE);
attachments.addEqualsFilter(ITEM + ".id", item.getID()); attachments.addEqualsFilter(ITEM + ".id", item.getID());
return attachments; return attachments;
@ -174,16 +168,16 @@ public class ItemImageAttachment extends ACSObject implements CustomCopy {
* Automatically publish an unpublished image * Automatically publish an unpublished image
*/ */
public boolean copyProperty(final CustomCopy source, public boolean copyProperty(final CustomCopy source,
final Property property, final Property property,
final ItemCopier copier) { final ItemCopier copier) {
String attribute = property.getName(); String attribute = property.getName();
if (ItemCopier.VERSION_COPY == copier.getCopyType() && IMAGE.equals( if (ItemCopier.VERSION_COPY == copier.getCopyType()
attribute)) { && IMAGE.equals(attribute)) {
ItemImageAttachment attachment = (ItemImageAttachment) source; ItemImageAttachment attachment = (ItemImageAttachment) source;
ReusableImageAsset image = attachment.getImage(); ReusableImageAsset image = attachment.getImage();
ReusableImageAsset liveImage = ReusableImageAsset liveImage =
(ReusableImageAsset) image.getLiveVersion(); (ReusableImageAsset) image.getLiveVersion();
if (null == liveImage) { if (null == liveImage) {
liveImage = (ReusableImageAsset) image.createLiveVersion(); liveImage = (ReusableImageAsset) image.createLiveVersion();
@ -216,8 +210,7 @@ public class ItemImageAttachment extends ACSObject implements CustomCopy {
// when we delete the link, the image still references it in DB // when we delete the link, the image still references it in DB
// can't make it composite because then image is deleted if we delete // can't make it composite because then image is deleted if we delete
// link. Have to set link to null first (I think) // link. Have to set link to null first (I think)
DomainObject link = DomainObjectFactory.newInstance((DataObject) get( DomainObject link = DomainObjectFactory.newInstance((DataObject) get(IMAGE_LINK));
IMAGE_LINK));
set(IMAGE_LINK, null); set(IMAGE_LINK, null);
save(); save();
link.delete(); link.delete();

View File

@ -65,45 +65,45 @@ public class ItemImageAttachmentInitializer extends ContentAssetInitializer {
} }
); );
removeDeprecatedImageSteps(); // removeDeprecatedImageSteps();
} }
/** /**
* *
*/ */
private void removeDeprecatedImageSteps() { // private void removeDeprecatedImageSteps() {
DataCollection steps = SessionManager.getSession().retrieve // DataCollection steps = SessionManager.getSession().retrieve
( AuthoringStep.BASE_DATA_OBJECT_TYPE ); // ( AuthoringStep.BASE_DATA_OBJECT_TYPE );
//
// Don't use defined constant to reduce dependency on GenericArticle // // Don't use defined constant to reduce dependency on GenericArticle
steps.addEqualsFilter( "component", // steps.addEqualsFilter( "component",
"com.arsdigita.cms.ui.authoring.ArticleImage" ); // "com.arsdigita.cms.ui.authoring.ArticleImage" );
//
while( steps.next() ) { // while( steps.next() ) {
DataObject step = steps.getDataObject(); // DataObject step = steps.getDataObject();
//
DataCollection kits = SessionManager.getSession().retrieve // DataCollection kits = SessionManager.getSession().retrieve
( AuthoringKitStepAssociation.BASE_DATA_OBJECT_TYPE ); // ( AuthoringKitStepAssociation.BASE_DATA_OBJECT_TYPE );
kits.addEqualsFilter( "stepId", step.get( "id" ) ); // kits.addEqualsFilter( "stepId", step.get( "id" ) );
//
while( kits.next() ) { // while( kits.next() ) {
DataObject kitStep = kits.getDataObject(); // DataObject kitStep = kits.getDataObject();
AuthoringKitStepAssociation kitStepAsso = new AuthoringKitStepAssociation(kitStep); // AuthoringKitStepAssociation kitStepAsso = new AuthoringKitStepAssociation(kitStep);
// Check whether the content type is (persistence-wise) subtype // // Check whether the content type is (persistence-wise) subtype
// of com.ad.cms.GenericArticle. This is lame, but I couldn't find a better API to do this: // // of com.ad.cms.GenericArticle. This is lame, but I couldn't find a better API to do this:
AuthoringKit kit = new AuthoringKit (kitStepAsso.getKitID()); // AuthoringKit kit = new AuthoringKit (kitStepAsso.getKitID());
try { // try {
ObjectType.verifySubtype(GenericArticle.BASE_DATA_OBJECT_TYPE, // ObjectType.verifySubtype(GenericArticle.BASE_DATA_OBJECT_TYPE,
kit.getContentType().getAssociatedObjectType()); // kit.getContentType().getAssociatedObjectType());
kitStepAsso.delete(); // kitStepAsso.delete();
} catch (PersistenceException pe) { // } catch (PersistenceException pe) {
// Do nothing, the content type is not subtyping com.arsdigita.cms.GenericArticle // // Do nothing, the content type is not subtyping com.arsdigita.cms.GenericArticle
} // }
} // }
//
// DomainObjectFactory.newInstance( step ).delete(); // // DomainObjectFactory.newInstance( step ).delete();
} // }
} // }
public String getTraversalXML() { public String getTraversalXML() {

View File

@ -4,15 +4,22 @@ import com.arsdigita.cms.*;
object type Image extends ContentPage { object type Image extends ContentPage {
component ImageAsset[0..1] image = join ct_images.image_id to cms_images.image_id; component ImageAsset[0..1] image = join ct_images.image_id to cms_images.image_id;
String[0..1] caption = ct_images.caption VARCHAR(400); component ImageAsset[0..1] thumbnail = join ct_images.thumbnail_id to cms_images.image_id;
String[0..1] description = ct_images.description VARCHAR(2000); component TextAsset [0..1] textAsset = join ct_images.text_id to cms_text.text_id;
String[0..1] artist = ct_images.artist VARCHAR(200);
Date [0..1] publishDate = ct_images.publish_date DATE; BigDecimal[0..1] width = ct_images.width INTEGER;
String[0..1] source = ct_images.source VARCHAR(600); BigDecimal[0..1] height = ct_images.height INTEGER;
String[0..1] media = ct_images.media VARCHAR(300);
String[0..1] copyright = ct_images.copyright VARCHAR(400); String[0..1] caption = ct_images.caption VARCHAR(400);
String[0..1] site = ct_images.site VARCHAR(500); String[0..1] description = ct_images.description VARCHAR(500);
String[0..1] artist = ct_images.artist VARCHAR(200);
Date [0..1] publishDate = ct_images.publish_date DATE;
String[0..1] source = ct_images.source VARCHAR(600);
String[0..1] media = ct_images.media VARCHAR(300);
String[0..1] copyright = ct_images.copyright VARCHAR(400);
String[0..1] site = ct_images.site VARCHAR(500);
String[0..1] license = ct_images.license VARCHAR(300);
reference key (ct_images.item_id); reference key (ct_images.item_id);
} }

View File

@ -17,6 +17,13 @@
descriptionBundle="com.arsdigita.cms.CMSResources" descriptionBundle="com.arsdigita.cms.CMSResources"
component="com.arsdigita.cms.contenttypes.ui.ImagePropertiesStep"/> component="com.arsdigita.cms.contenttypes.ui.ImagePropertiesStep"/>
<ctd:authoring-step
labelKey="cms.contenttypes.shared.body_text.title"
labelBundle="com.arsdigita.cms.CMSResources"
descriptionKey="cms.contenttypes.shared.body_text.description"
descriptionBundle="com.arsdigita.cms.CMSResources"
component="com.arsdigita.cms.contenttypes.ui.ImageTextBody"/>
<ctd:include href="/WEB-INF/content-types/assign-categories-step.xml"/> <ctd:include href="/WEB-INF/content-types/assign-categories-step.xml"/>
</ctd:authoring-kit> </ctd:authoring-kit>
</ctd:content-type> </ctd:content-type>

View File

@ -7,7 +7,9 @@
<xrd:formatter property="/object/publishDate" <xrd:formatter property="/object/publishDate"
class="com.arsdigita.xml.formatters.DateFormatter"/> class="com.arsdigita.xml.formatters.DateFormatter"/>
<xrd:associations rule="include"> <xrd:associations rule="include">
<xrd:property name="/object/thumbnail"/>
<xrd:property name="/object/image"/> <xrd:property name="/object/image"/>
<xrd:property name="/object/textAsset"/>
</xrd:associations> </xrd:associations>
</xrd:adapter> </xrd:adapter>
</xrd:context> </xrd:context>

View File

@ -20,6 +20,7 @@ package com.arsdigita.cms.contenttypes;
import com.arsdigita.cms.ContentPage; import com.arsdigita.cms.ContentPage;
import com.arsdigita.cms.ImageAsset; import com.arsdigita.cms.ImageAsset;
import com.arsdigita.cms.TextAsset;
import com.arsdigita.domain.DataObjectNotFoundException; import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.domain.DomainObjectFactory; import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.persistence.DataObject; import com.arsdigita.persistence.DataObject;
@ -36,11 +37,13 @@ import java.util.Date;
public class Image extends ContentPage { public class Image extends ContentPage {
private final static org.apache.log4j.Logger s_log = private final static org.apache.log4j.Logger s_log =
org.apache.log4j.Logger.getLogger(GenericArticle.class); org.apache.log4j.Logger.getLogger(Image.class);
/** PDL property name for lead */ /** PDL property name for lead */
public static final String IMAGE = "image"; public static final String IMAGE = "image";
// public static final String WIDTH = "width"; public static final String THUMBNAIL = "thumbnail";
// public static final String HEIGHT = "height"; public static final String TEXT_ASSET = "textAsset";
public static final String WIDTH = "width";
public static final String HEIGHT = "height";
public static final String CAPTION = "caption"; public static final String CAPTION = "caption";
public static final String DESCRIPTION = "description"; public static final String DESCRIPTION = "description";
public static final String ARTIST = "artist"; public static final String ARTIST = "artist";
@ -49,6 +52,8 @@ public class Image extends ContentPage {
public static final String MEDIA = "media"; public static final String MEDIA = "media";
public static final String COPYRIGHT = "copyright"; public static final String COPYRIGHT = "copyright";
public static final String SITE = "site"; public static final String SITE = "site";
public static final String LICENSE = "license";
protected static final int SUMMARY_SIZE = 1024;
/** Data object type for this domain object */ /** Data object type for this domain object */
public static final String BASE_DATA_OBJECT_TYPE = "com.arsdigita.cms.contenttypes.Image"; public static final String BASE_DATA_OBJECT_TYPE = "com.arsdigita.cms.contenttypes.Image";
private static final ImageConfig s_config = new ImageConfig(); private static final ImageConfig s_config = new ImageConfig();
@ -59,11 +64,10 @@ public class Image extends ContentPage {
s_log.debug("Static initalizer finished."); s_log.debug("Static initalizer finished.");
} }
public static final ImageConfig getConfig() { public static ImageConfig getConfig() {
return s_config; return s_config;
} }
public Image() { public Image() {
this(BASE_DATA_OBJECT_TYPE); this(BASE_DATA_OBJECT_TYPE);
} }
@ -97,6 +101,9 @@ public class Image extends ContentPage {
public void setImage(ImageAsset image) { public void setImage(ImageAsset image) {
set(IMAGE, image); set(IMAGE, image);
setWidth(image.getWidth());
setHeight(image.getHeight());
setThumbnail();
} }
public String getCaption() { public String getCaption() {
@ -107,6 +114,76 @@ public class Image extends ContentPage {
set(CAPTION, caption); set(CAPTION, caption);
} }
public ImageAsset getThumbnail() {
DataObject dobj = (DataObject) get(THUMBNAIL);
if (dobj != null) {
return (ImageAsset) DomainObjectFactory.newInstance(dobj);
} else {
return null;
}
}
private void setThumbnail() {
try {
set(THUMBNAIL, getImage().proportionalResizeToWidth(Image.getConfig().getMaxThumbnailWidth()));
} catch (NullPointerException ex) {
}
}
public BigDecimal getWidth() {
return (BigDecimal) get(WIDTH);
}
private void setWidth(BigDecimal width) {
set(WIDTH, width);
}
public BigDecimal getHeight() {
return (BigDecimal) get(HEIGHT);
}
private void setHeight(BigDecimal height) {
set(HEIGHT, height);
}
/**
* Return the text asset for this <code>Image</code>. Could return
* null if there is no text body actually associated with the page
*/
public TextAsset getTextAsset() {
DataObject text = (DataObject) get(TEXT_ASSET);
if (text == null) {
return null;
} else {
return new TextAsset(text);
}
}
/**
* Pass in a null value to remove the text of this item.
* Explicitly call text.delete() to remove the text from the database
*/
public void setTextAsset(TextAsset text) {
setAssociation(TEXT_ASSET, text);
}
/**
* Return a short summary of the text body for search.
* This method is WRONG, because the text body could actually
* be extremely large, and doing substring on it is NOT safe
*/
@Override
public String getSearchSummary() {
TextAsset textAsset = getTextAsset();
if (textAsset == null) {
return "";
}
return com.arsdigita.util.StringUtils.truncateString(textAsset.getText(),
SUMMARY_SIZE,
true);
}
@Override @Override
public String getDescription() { public String getDescription() {
return (String) get(DESCRIPTION); return (String) get(DESCRIPTION);
@ -164,4 +241,12 @@ public class Image extends ContentPage {
public void setSite(String site) { public void setSite(String site) {
set(SITE, site); set(SITE, site);
} }
public String getLicense() {
return (String) get(LICENSE);
}
public void setLicense(String license) {
set(LICENSE, license);
}
} }

View File

@ -28,6 +28,8 @@ public class ImageConfig extends AbstractConfig {
private final Parameter m_startYear; private final Parameter m_startYear;
private final Parameter m_endYearDelta; private final Parameter m_endYearDelta;
private final Parameter m_maxImageWidth;
private final Parameter m_maxThumbnailWidth;
public ImageConfig() { public ImageConfig() {
m_startYear = new IntegerParameter( m_startYear = new IntegerParameter(
@ -40,8 +42,20 @@ public class ImageConfig extends AbstractConfig {
Parameter.REQUIRED, Parameter.REQUIRED,
new Integer(3)); new Integer(3));
m_maxImageWidth = new IntegerParameter(
"com.arsdigita.cms.contenttypes.image.max_image_width",
Parameter.REQUIRED,
new Integer(600));
m_maxThumbnailWidth = new IntegerParameter(
"com.arsdigita.cms.contenttypes.image.max_thumbnail_width",
Parameter.REQUIRED,
new Integer(150));
register(m_startYear); register(m_startYear);
register(m_endYearDelta); register(m_endYearDelta);
register(m_maxImageWidth);
register(m_maxThumbnailWidth);
loadInfo(); loadInfo();
} }
@ -53,4 +67,12 @@ public class ImageConfig extends AbstractConfig {
public final int getEndYearDelta() { public final int getEndYearDelta() {
return ((Integer) get(m_endYearDelta)).intValue(); return ((Integer) get(m_endYearDelta)).intValue();
} }
public final int getMaxImageWidth() {
return ((Integer) get(m_maxImageWidth)).intValue();
}
public final int getMaxThumbnailWidth() {
return ((Integer) get(m_maxThumbnailWidth)).intValue();
}
} }

View File

@ -7,3 +7,13 @@ com.arsdigita.cms.contenttypes.image.end_year_delta.title=End Year
com.arsdigita.cms.contenttypes.image.end_year_delta.purpose=End year delta for the year select box com.arsdigita.cms.contenttypes.image.end_year_delta.purpose=End year delta for the year select box
com.arsdigita.cms.contenttypes.image.end_year_delta.example=3 com.arsdigita.cms.contenttypes.image.end_year_delta.example=3
com.arsdigita.cms.contenttypes.image.end_year_delta.format=[integer] com.arsdigita.cms.contenttypes.image.end_year_delta.format=[integer]
com.arsdigita.cms.contenttypes.image.max_image_width.title=Max Image Width
com.arsdigita.cms.contenttypes.image.max_image_width.purpose=max image display width for content center
com.arsdigita.cms.contenttypes.image.max_image_width.example=600
com.arsdigita.cms.contenttypes.image.max_image_width.format=[integer]
com.arsdigita.cms.contenttypes.image.max_image_width.title=Max thumbnail Width
com.arsdigita.cms.contenttypes.image.max_image_width.purpose=max thumnail width
com.arsdigita.cms.contenttypes.image.max_image_width.example=150
com.arsdigita.cms.contenttypes.image.max_image_width.format=[integer]

View File

@ -7,3 +7,6 @@ cms.contenttypes.ui.image.source=Source:
cms.contenttypes.ui.image.media=Media: cms.contenttypes.ui.image.media=Media:
cms.contenttypes.ui.image.copyright=Copyright: cms.contenttypes.ui.image.copyright=Copyright:
cms.contenttypes.ui.image.site=Site: cms.contenttypes.ui.image.site=Site:
cms.contenttypes.ui.image.license=License:
cms.contenttypes.ui.image.width=Width:
cms.contenttypes.ui.image.height=Height:

View File

@ -5,3 +5,6 @@ cms.contenttypes.ui.image.source=Quelle:
cms.contenttypes.ui.image.media=Medium: cms.contenttypes.ui.image.media=Medium:
cms.contenttypes.ui.image.copyright=Copyright: cms.contenttypes.ui.image.copyright=Copyright:
cms.contenttypes.ui.image.site=Standort: cms.contenttypes.ui.image.site=Standort:
cms.contenttypes.ui.image.license=Lizenz:
cms.contenttypes.ui.image.width=Breite:
cms.contenttypes.ui.image.height=H\u00f6he:

View File

@ -108,8 +108,12 @@ public class ImagePropertiesStep extends SimpleEditStep {
@Override @Override
protected ImageAsset getImageAsset(PageState state) { protected ImageAsset getImageAsset(PageState state) {
ImageAsset image = ((Image) itemModel.getSelectedItem(state)).getImage(); try {
return image; ImageAsset image = ((Image) itemModel.getSelectedItem(state)).getImage().proportionalResizeToWidth(Image.getConfig().getMaxImageWidth());
return image;
} catch (NullPointerException ex) {
return null;
}
} }
}); });
@ -122,6 +126,7 @@ public class ImagePropertiesStep extends SimpleEditStep {
ContentPage.LAUNCH_DATE, ContentPage.LAUNCH_DATE,
new DomainObjectPropertySheet.AttributeFormatter() { new DomainObjectPropertySheet.AttributeFormatter() {
@Override
public String format(DomainObject item, public String format(DomainObject item,
String attribute, String attribute,
PageState state) { PageState state) {
@ -135,12 +140,15 @@ public class ImagePropertiesStep extends SimpleEditStep {
}); });
} }
sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.image.width"), Image.WIDTH);
sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.image.height"), Image.HEIGHT);
sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.image.caption"), Image.CAPTION); sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.image.caption"), Image.CAPTION);
sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.description"), Image.DESCRIPTION); sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.description"), Image.DESCRIPTION);
sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.image.artist"), Image.ARTIST); sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.image.artist"), Image.ARTIST);
sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.image.publishDate"), Image.PUBLISHDATE, sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.image.publishDate"), Image.PUBLISHDATE,
new DomainObjectPropertySheet.AttributeFormatter() { new DomainObjectPropertySheet.AttributeFormatter() {
@Override
public String format(DomainObject item, String attribute, PageState state) { public String format(DomainObject item, String attribute, PageState state) {
Image image = (Image) item; Image image = (Image) item;
if ((image.getPublishDate()) != null) { if ((image.getPublishDate()) != null) {
@ -154,6 +162,7 @@ public class ImagePropertiesStep extends SimpleEditStep {
sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.image.media"), Image.MEDIA); sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.image.media"), Image.MEDIA);
sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.image.copyright"), Image.COPYRIGHT); sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.image.copyright"), Image.COPYRIGHT);
sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.image.site"), Image.SITE); sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.image.site"), Image.SITE);
sheet.add(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.image.license"), Image.LICENSE);
container.add(sheet); container.add(sheet);
@ -172,6 +181,7 @@ public class ImagePropertiesStep extends SimpleEditStep {
class ImageUploadListerner implements FormProcessListener { class ImageUploadListerner implements FormProcessListener {
@Override
public void process(FormSectionEvent fse) { public void process(FormSectionEvent fse) {
FormData data = fse.getFormData(); FormData data = fse.getFormData();
PageState ps = fse.getPageState(); PageState ps = fse.getPageState();
@ -233,10 +243,12 @@ public class ImagePropertiesStep extends SimpleEditStep {
} }
@Override
public SaveCancelSection getSaveCancelSection() { public SaveCancelSection getSaveCancelSection() {
return m_saveCancel; return m_saveCancel;
} }
@Override
public ImageAsset getImage(FormSectionEvent event) public ImageAsset getImage(FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
PageState ps = event.getPageState(); PageState ps = event.getPageState();
@ -254,6 +266,7 @@ public class ImagePropertiesStep extends SimpleEditStep {
} }
} }
@Override
public Form getForm() { public Form getForm() {
return this; return this;
} }

View File

@ -90,7 +90,7 @@ public class ImagePropertyForm
add(new Label(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.description"))); add(new Label(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.description")));
ParameterModel descriptionParam = new StringParameter(Image.DESCRIPTION); ParameterModel descriptionParam = new StringParameter(Image.DESCRIPTION);
descriptionParam.addParameterListener(new StringInRangeValidationListener(0, 2000)); descriptionParam.addParameterListener(new StringInRangeValidationListener(0, 500));
TextArea description = new TextArea(descriptionParam); TextArea description = new TextArea(descriptionParam);
description.setRows(10); description.setRows(10);
description.setCols(60); description.setCols(60);
@ -133,9 +133,16 @@ public class ImagePropertyForm
TextField site = new TextField(siteParam); TextField site = new TextField(siteParam);
add(site); add(site);
add(new Label(ImageGlobalizationUtil.globalize("cms.contenttypes.ui.image.license")));
ParameterModel licenseParam = new StringParameter(Image.LICENSE);
licenseParam.addParameterListener(new StringInRangeValidationListener(0, 300));
TextField license = new TextField(licenseParam);
add(license);
} }
/** Form initialisation hook. Fills widgets with data. */ /** Form initialisation hook. Fills widgets with data. */
@Override
public void init(FormSectionEvent fse) { public void init(FormSectionEvent fse) {
// Do some initialization hook stuff // Do some initialization hook stuff
FormData data = fse.getFormData(); FormData data = fse.getFormData();
@ -150,6 +157,7 @@ public class ImagePropertyForm
data.put(Image.MEDIA, image.getMedia()); data.put(Image.MEDIA, image.getMedia());
data.put(Image.COPYRIGHT, image.getCopyright()); data.put(Image.COPYRIGHT, image.getCopyright());
data.put(Image.SITE, image.getSite()); data.put(Image.SITE, image.getSite());
data.put(Image.LICENSE, image.getLicense());
} }
@Override @Override
@ -158,6 +166,7 @@ public class ImagePropertyForm
} }
/** Cancels streamlined editing. */ /** Cancels streamlined editing. */
@Override
public void submitted(FormSectionEvent fse) { public void submitted(FormSectionEvent fse) {
if (m_step != null if (m_step != null
&& getSaveCancelSection().getCancelButton().isSelected(fse.getPageState())) { && getSaveCancelSection().getCancelButton().isSelected(fse.getPageState())) {
@ -166,6 +175,7 @@ public class ImagePropertyForm
} }
/** Form processing hook. Saves Event object. */ /** Form processing hook. Saves Event object. */
@Override
public void process(FormSectionEvent fse) { public void process(FormSectionEvent fse) {
FormData data = fse.getFormData(); FormData data = fse.getFormData();
PageState ps = fse.getPageState(); PageState ps = fse.getPageState();
@ -182,6 +192,7 @@ public class ImagePropertyForm
image.setMedia((String) data.get(Image.MEDIA)); image.setMedia((String) data.get(Image.MEDIA));
image.setCopyright((String) data.get(Image.COPYRIGHT)); image.setCopyright((String) data.get(Image.COPYRIGHT));
image.setSite((String) data.get(Image.SITE)); image.setSite((String) data.get(Image.SITE));
image.setLicense((String) data.get(Image.LICENSE));
image.save(); image.save();
} }

View File

@ -22,6 +22,8 @@
component="com.arsdigita.cms.contenttypes.ui.GenericArticlePropertiesStep" component="com.arsdigita.cms.contenttypes.ui.GenericArticlePropertiesStep"
ordering="1"/> ordering="1"/>
<ctd:include href="/WEB-INF/content-types/edit-body-text-step.xml"/>
<ctd:include href="/WEB-INF/content-types/assign-categories-step.xml"/> <ctd:include href="/WEB-INF/content-types/assign-categories-step.xml"/>
</ctd:authoring-kit> </ctd:authoring-kit>
</ctd:content-type> </ctd:content-type>

View File

@ -185,7 +185,7 @@ com.arsdigita.cms.search.score_title_and_keywords.format=[boolean]
com.arsdigita.cms.skip_asset_steps.title=Asset steps to skip com.arsdigita.cms.skip_asset_steps.title=Asset steps to skip
com.arsdigita.cms.skip_asset_steps.purpose=Specify asset steps that are not relevant for specific content types com.arsdigita.cms.skip_asset_steps.purpose=Specify asset steps that are not relevant for specific content types
com.arsdigita.cms.skip_asset_steps.example=com.arsdigita.cms.contenttypes.MultiPartArticle:com.arsdigita.cms.contenttypes.ui.ImageStep,com.arsdigita.cms.contenttypes.InlineSite:com.arsdigita.cms.contenttypes.ui.ImageStep,com.arsdigita.cms.InlineSite:om.arsdigita.cms.contentassets.ui.FileAttachmentsStep com.arsdigita.cms.skip_asset_steps.example=com.arsdigita.cms.contenttypes.MultiPartArticle:com.arsdigita.cms.contentassets.ui.ImageStep,com.arsdigita.cms.contenttypes.InlineSite:com.arsdigita.cms.contentassets.ui.ImageStep,com.arsdigita.cms.InlineSite:com.arsdigita.cms.contentassets.ui.FileAttachmentsStep,com.arsdigita.cms.contenttypes.Image:com.arsdigita.cms.contentassets.ui.ImageStep
com.arsdigita.cms.skip_asset_steps.format=[string,string,string] com.arsdigita.cms.skip_asset_steps.format=[string,string,string]
com.arsdigita.cms.mandatory_descriptions.title=Mandatory Descriptions com.arsdigita.cms.mandatory_descriptions.title=Mandatory Descriptions

View File

@ -30,11 +30,15 @@ import com.arsdigita.persistence.OID;
import com.arsdigita.persistence.SessionManager; import com.arsdigita.persistence.SessionManager;
import com.arsdigita.versioning.VersionedACSObject; import com.arsdigita.versioning.VersionedACSObject;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.math.BigDecimal; import java.math.BigDecimal;
import javax.imageio.ImageIO;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
/** /**
@ -54,16 +58,14 @@ import org.apache.log4j.Logger;
public class ImageAsset extends BinaryAsset { public class ImageAsset extends BinaryAsset {
public static final String BASE_DATA_OBJECT_TYPE = public static final String BASE_DATA_OBJECT_TYPE =
"com.arsdigita.cms.ImageAsset"; "com.arsdigita.cms.ImageAsset";
public static final String CONTENT = "content"; public static final String CONTENT = "content";
public static final String HEIGHT = "height"; public static final String HEIGHT = "height";
public static final String WIDTH = "width"; public static final String WIDTH = "width";
public static final String MIME_JPEG = "image/jpeg"; public static final String MIME_JPEG = "image/jpeg";
public static final String MIME_GIF = "image/gif"; public static final String MIME_GIF = "image/gif";
private static final Logger s_log = Logger.getLogger(ImageAsset.class);
private static final Logger s_log = Logger.getLogger(ImageAsset.class);
/** /**
* Default constructor. This creates a new image asset. * Default constructor. This creates a new image asset.
*/ */
@ -133,6 +135,7 @@ public class ImageAsset extends BinaryAsset {
* *
* @return the Blob content * @return the Blob content
*/ */
@Override
protected byte[] getContent() { protected byte[] getContent() {
return (byte[]) get(CONTENT); return (byte[]) get(CONTENT);
} }
@ -140,6 +143,7 @@ public class ImageAsset extends BinaryAsset {
/** /**
* Sets the Blob content. * Sets the Blob content.
*/ */
@Override
protected void setContent(byte[] content) { protected void setContent(byte[] content) {
set(CONTENT, content); set(CONTENT, content);
} }
@ -154,13 +158,13 @@ public class ImageAsset extends BinaryAsset {
* @param defaultMimeType The default mime type for the file * @param defaultMimeType The default mime type for the file
*/ */
public void loadFromFile(String fileName, File file, String defaultMimeType) public void loadFromFile(String fileName, File file, String defaultMimeType)
throws IOException { throws IOException {
// Guess mime type // Guess mime type
MimeType mime = MimeType.guessMimeTypeFromFile(fileName); MimeType mime = MimeType.guessMimeTypeFromFile(fileName);
if(mime != null && mime instanceof ImageMimeType) { if (mime != null && mime instanceof ImageMimeType) {
guessSize(file, (ImageMimeType)mime); guessSize(file, (ImageMimeType) mime);
} else { } else {
// Set default mime type // Set default mime type
mime = MimeType.loadMimeType(defaultMimeType); mime = MimeType.loadMimeType(defaultMimeType);
@ -170,12 +174,12 @@ public class ImageAsset extends BinaryAsset {
// Extract the filename // Extract the filename
int i = fileName.lastIndexOf("/"); int i = fileName.lastIndexOf("/");
if(i > 0) { if (i > 0) {
fileName = fileName.substring(i+1); fileName = fileName.substring(i + 1);
} }
i = fileName.lastIndexOf("\\"); // DOS-style i = fileName.lastIndexOf("\\"); // DOS-style
if(i > 0) { if (i > 0) {
fileName = fileName.substring(i+1); fileName = fileName.substring(i + 1);
} }
setName(fileName); setName(fileName);
@ -189,8 +193,9 @@ public class ImageAsset extends BinaryAsset {
* *
* @param file The file on the server to write to. * @param file The file on the server to write to.
*/ */
@Override
public void writeToFile(File file) public void writeToFile(File file)
throws IOException { throws IOException {
FileOutputStream fs = new FileOutputStream(file); FileOutputStream fs = new FileOutputStream(file);
try { try {
fs.write(getContent()); fs.write(getContent());
@ -202,7 +207,6 @@ public class ImageAsset extends BinaryAsset {
} }
} }
/** /**
* Guess image size by loading it from file. Set the WIDTH and HEIGHT * Guess image size by loading it from file. Set the WIDTH and HEIGHT
* attributes, if possible * attributes, if possible
@ -212,11 +216,11 @@ public class ImageAsset extends BinaryAsset {
ImageSizer sizer = ImageSizerFactory.getImageSizer(mime.getMimeType()); ImageSizer sizer = ImageSizerFactory.getImageSizer(mime.getMimeType());
try { try {
if(sizer != null) { if (sizer != null) {
Dimension d = sizer.computeImageSize(file); Dimension d = sizer.computeImageSize(file);
if(d != null) { if (d != null) {
width = new BigDecimal((int)d.getWidth()); width = new BigDecimal((int) d.getWidth());
height = new BigDecimal((int)d.getHeight()); height = new BigDecimal((int) d.getHeight());
} }
} }
} catch (IOException ex) { } catch (IOException ex) {
@ -234,9 +238,8 @@ public class ImageAsset extends BinaryAsset {
* @return a collection of ImageAssets * @return a collection of ImageAssets
*/ */
public static ImageAssetCollection getAllImages() { public static ImageAssetCollection getAllImages() {
DataCollection da = SessionManager.getSession().retrieve DataCollection da = SessionManager.getSession().retrieve(BASE_DATA_OBJECT_TYPE);
(BASE_DATA_OBJECT_TYPE); da.addEqualsFilter(VersionedACSObject.IS_DELETED, new Integer(0));
da.addEqualsFilter(VersionedACSObject.IS_DELETED, new Integer(0));
return new ImageAssetCollection(da); return new ImageAssetCollection(da);
} }
@ -249,8 +252,7 @@ public class ImageAsset extends BinaryAsset {
* @return a collection of images whose name matches the keyword * @return a collection of images whose name matches the keyword
*/ */
public static ImageAssetCollection getImagesByKeyword( public static ImageAssetCollection getImagesByKeyword(
String keyword, String context String keyword, String context) {
) {
ImageAssetCollection c = getAllImages(); ImageAssetCollection c = getAllImages();
c.addOrder(Asset.NAME); c.addOrder(Asset.NAME);
Filter f; Filter f;
@ -271,4 +273,49 @@ public class ImageAsset extends BinaryAsset {
return getImagesByKeyword(keyword, ContentItem.DRAFT); return getImagesByKeyword(keyword, ContentItem.DRAFT);
} }
/**
* Resize this ImageAsset proportional to maxThumbnailWidth, if this ImageAsset
* is wider then maxThumbnailWidth. Else just return this ImageAsset.
*
* @param maxThumbnailWidth max image width
* @return
*/
public ImageAsset proportionalResizeToWidth(int maxThumbnailWidth) {
if (this.getWidth().intValue() <= maxThumbnailWidth) {
return this;
} else {
ImageAsset imageAsset = new ImageAsset();
imageAsset.setMimeType(this.getMimeType());
imageAsset.setName("Scaled" + this.getName());
ByteArrayInputStream in = new ByteArrayInputStream(this.getContent());
try {
BufferedImage origImage = ImageIO.read(in);
ByteArrayOutputStream scaledImageBuffer = new ByteArrayOutputStream();
java.awt.Image scaledImage = origImage.getScaledInstance(maxThumbnailWidth, -1, java.awt.Image.SCALE_SMOOTH);
BufferedImage scaledBufImage = new BufferedImage(scaledImage.getWidth(null), scaledImage.getHeight(null), origImage.getType());
scaledBufImage.getGraphics().drawImage(scaledImage, 0, 0, null);
ImageIO.write(scaledBufImage, this.getMimeType().getFileExtension(), scaledImageBuffer);
imageAsset.setContent(scaledImageBuffer.toByteArray());
imageAsset.setWidth(new BigDecimal(scaledImage.getWidth(null)));
imageAsset.setHeight(new BigDecimal(scaledImage.getHeight(null)));
} catch (IOException e) {
imageAsset.setContent(this.getContent());
imageAsset.setWidth(this.getWidth());
imageAsset.setHeight(this.getHeight());
}
return imageAsset;
}
}
} }

View File

@ -48,8 +48,8 @@ import com.arsdigita.util.Assert;
*/ */
public class GenericArticleBody extends TextAssetBody { public class GenericArticleBody extends TextAssetBody {
private AuthoringKitWizard m_parent; protected AuthoringKitWizard m_parent;
private ItemSelectionModel m_itemModel; protected ItemSelectionModel m_itemModel;
/** /**
* Construct a new GenericArticleBody component * Construct a new GenericArticleBody component
@ -68,6 +68,7 @@ public class GenericArticleBody extends TextAssetBody {
// Rest the component when it is hidden // Rest the component when it is hidden
parent.getList().addActionListener(new ActionListener() { parent.getList().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
PageState state = e.getPageState(); PageState state = e.getPageState();
reset(state); reset(state);