Merge remote-tracking branch 'origin/bug2978'

This commit is contained in:
fmittag committed 2015-10-09 16:01:55 +02:00
commit f3eef221cd
4 files changed
+147 -59

No files matched your search

@@ -14,17 +14,20 @@ public class ImageCreateDialog extends ImageDialog {
super(new Date(), new ImageParameterValidator(stringMessages), stringMessages, callback);
createdAtLabel = new Label(creationDate.toString());
titleTextBox = createTextBox(null);
titleTextBox.setVisibleLength(50);
titleTextBox.setVisibleLength(40);
subtitleTextBox = createTextBox(null);
subtitleTextBox.setVisibleLength(50);
subtitleTextBox.setVisibleLength(40);
copyrightTextBox = createTextBox(null);
copyrightTextBox.setVisibleLength(50);
copyrightTextBox.setVisibleLength(40);
widthInPxBox = createIntegerBox(null, 10);
widthInPxBox.setEnabled(false);
heightInPxBox = createIntegerBox(null, 10);
heightInPxBox.setEnabled(false);
List<String> tags = new ArrayList<>();
if(initialTag != null && !initialTag.isEmpty()) {
tags.add(initialTag);
}
tagsListEditor.setValue(tags);
image = null;
}
}
@@ -5,20 +5,25 @@ import java.util.Collections;
import java.util.Date;
import java.util.List;
import com.google.gwt.dom.client.Style.Position;
import com.google.gwt.dom.client.Style.Visibility;
import com.google.gwt.dom.client.Style.BorderStyle;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.LoadEvent;
import com.google.gwt.event.dom.client.LoadHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.media.MediaConstants;
import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.media.MediaTagConstants;
import com.sap.sse.gwt.adminconsole.URLFieldWithFileUpload;
import com.sap.sse.gwt.client.IconResources;
import com.sap.sse.gwt.client.controls.IntegerBox;
@@ -37,9 +42,9 @@ public abstract class ImageDialog extends DataEntryDialog<ImageDTO> {
protected IntegerBox widthInPxBox;
protected IntegerBox heightInPxBox;
protected StringListInlineEditorComposite tagsListEditor;
final Image image;
protected Image image;
protected SimplePanel imageHolder;
protected static class ImageParameterValidator implements Validator<ImageDTO> {
private StringMessages stringMessages;
@@ -50,12 +55,39 @@ public abstract class ImageDialog extends DataEntryDialog<ImageDTO> {
@Override
public String getErrorMessage(ImageDTO imageToValidate) {
String errorMessage = null;
Integer imageWidth = imageToValidate.getWidthInPx();
Integer imageHeight = imageToValidate.getHeightInPx();
if(imageToValidate.getSourceRef() == null || imageToValidate.getSourceRef().isEmpty()) {
errorMessage = stringMessages.pleaseEnterNonEmptyUrl();
} else if(imageWidth == null || imageHeight == null) {
errorMessage = "The width and height of the image could not retrieved yet.";
} else if(imageToValidate.hasTag(MediaTagConstants.LOGO) && !isValidSize(imageWidth, imageHeight, MediaConstants.MIN_LOGO_IMAGE_WIDTH,
MediaConstants.MAX_LOGO_IMAGE_WIDTH, MediaConstants.MIN_LOGO_IMAGE_HEIGHT, MediaConstants.MAX_LOGO_IMAGE_HEIGHT)) {
errorMessage = getSizeErrorMessage("Logo", MediaConstants.MIN_LOGO_IMAGE_WIDTH,
MediaConstants.MAX_LOGO_IMAGE_WIDTH, MediaConstants.MIN_LOGO_IMAGE_HEIGHT, MediaConstants.MAX_LOGO_IMAGE_HEIGHT);
} else if(imageToValidate.hasTag(MediaTagConstants.TEASER) && !isValidSize(imageWidth, imageHeight, MediaConstants.MIN_EVENTTEASER_IMAGE_WIDTH,
MediaConstants.MAX_EVENTTEASER_IMAGE_WIDTH, MediaConstants.MIN_EVENTTEASER_IMAGE_HEIGHT, MediaConstants.MAX_EVENTTEASER_IMAGE_HEIGHT)) {
errorMessage = getSizeErrorMessage("Event-Teaser", MediaConstants.MIN_EVENTTEASER_IMAGE_WIDTH,
MediaConstants.MAX_EVENTTEASER_IMAGE_WIDTH, MediaConstants.MIN_EVENTTEASER_IMAGE_HEIGHT, MediaConstants.MAX_EVENTTEASER_IMAGE_HEIGHT);
} else if(imageToValidate.hasTag(MediaTagConstants.STAGE) && !isValidSize(imageWidth, imageHeight, MediaConstants.MIN_STAGE_IMAGE_WIDTH,
MediaConstants.MAX_STAGE_IMAGE_WIDTH, MediaConstants.MIN_STAGE_IMAGE_HEIGHT, MediaConstants.MAX_STAGE_IMAGE_HEIGHT)) {
errorMessage = getSizeErrorMessage("Stage", MediaConstants.MIN_STAGE_IMAGE_WIDTH,
MediaConstants.MAX_STAGE_IMAGE_WIDTH, MediaConstants.MIN_STAGE_IMAGE_HEIGHT, MediaConstants.MAX_STAGE_IMAGE_HEIGHT);
}
return errorMessage;
}
private boolean isValidSize(int width, int height, int minWidth, int maxWidth, int minHeight, int maxHeight) {
return width >= minWidth && width <= maxWidth && height >= minHeight && height <= maxHeight;
}
private String getSizeErrorMessage(String imageType, int minWidth, int maxWidth, int minHeight, int maxHeight) {
String errorMessage = "The size of the " + imageType + " image does not fit. ";
errorMessage += "The width should be between " + minWidth + " and " + maxWidth + " px ";
errorMessage += " and the height between " + minHeight + " and " + maxHeight + " px.";
return errorMessage;
}
}
public ImageDialog(Date creationDate, ImageParameterValidator validator, StringMessages stringMessages, DialogCallback<ImageDTO> callback) {
@@ -64,36 +96,25 @@ public abstract class ImageDialog extends DataEntryDialog<ImageDTO> {
this.stringMessages = stringMessages;
this.creationDate = creationDate;
getDialogBox().getWidget().setWidth("730px");
image = new Image();
image.addLoadHandler(new LoadHandler() {
@Override
public void onLoad(LoadEvent event) {
int width = image.getOffsetWidth();
int height = image.getOffsetHeight();
if(width > 0 && height > 0) {
widthInPxBox.setValue(width);
heightInPxBox.setValue(height);
}
}
});
image.getElement().getStyle().setPosition(Position.ABSOLUTE);
image.getElement().getStyle().setVisibility(Visibility.HIDDEN);
imageHolder = new SimplePanel();
imageURLAndUploadComposite = new URLFieldWithFileUpload(stringMessages);
imageURLAndUploadComposite.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
image = loadImageFromURL(event.getValue());
imageHolder.setWidget(image);
image.getElement().getStyle().setBorderWidth(1, Unit.PX);
image.getElement().getStyle().setBorderStyle(BorderStyle.SOLID);
image.getElement().getStyle().setBorderColor("#cccccc");
validate();
image.setUrl(event.getValue());
}
});
tagsListEditor = new StringListInlineEditorComposite(Collections.<String> emptyList(),
new StringListInlineEditorComposite.ExpandedUi(stringMessages, IconResources.INSTANCE.removeIcon(), /* suggestValues */
MediaConstants.imageTagSuggestions, "Enter tags for the image", 50));
MediaConstants.imageTagSuggestions, "Enter tags for the image", 30));
}
@Override
@@ -122,27 +143,38 @@ public abstract class ImageDialog extends DataEntryDialog<ImageDTO> {
panel.add(additionalWidget);
}
Grid formGrid = new Grid(8, 2);
panel.add(formGrid);
HorizontalPanel hPanel = new HorizontalPanel();
Grid grid1 = new Grid(2, 2);
Grid grid2 = new Grid(6, 2);
Grid grid3 = new Grid(1, 2);
formGrid.setWidget(0, 0, new Label("Created at:"));
formGrid.setWidget(0, 1, createdAtLabel);
formGrid.setWidget(1, 0, new Label("Image URL:"));
formGrid.setWidget(1, 1, imageURLAndUploadComposite);
formGrid.setWidget(2, 0, new Label(stringMessages.title() + ":"));
formGrid.setWidget(2, 1, titleTextBox);
formGrid.setWidget(3, 0, new Label("Subtitle:"));
formGrid.setWidget(3, 1, subtitleTextBox);
formGrid.setWidget(4, 0, new Label("Copyright:"));
formGrid.setWidget(4, 1, copyrightTextBox);
formGrid.setWidget(5, 0, new Label("Width in px:"));
formGrid.setWidget(5, 1, widthInPxBox);
formGrid.setWidget(6, 0, new Label("Height in px:"));
formGrid.setWidget(6, 1, heightInPxBox);
formGrid.setWidget(7, 0, new Label("Tags:"));
formGrid.setWidget(7, 1, tagsListEditor);
grid1.setWidget(0, 0, new Label("Created at:"));
grid1.setWidget(0, 1, createdAtLabel);
grid1.setWidget(1, 0, new Label("Image URL:"));
grid1.setWidget(1, 1, imageURLAndUploadComposite);
panel.add(image);
grid2.setWidget(0, 0, new Label(stringMessages.title() + ":"));
grid2.setWidget(0, 1, titleTextBox);
grid2.setWidget(1, 0, new Label("Subtitle:"));
grid2.setWidget(1, 1, subtitleTextBox);
grid2.setWidget(2, 0, new Label("Copyright:"));
grid2.setWidget(2, 1, copyrightTextBox);
grid2.setWidget(3, 0, new Label("Width in px:"));
grid2.setWidget(3, 1, widthInPxBox);
grid2.setWidget(4, 0, new Label("Height in px:"));
grid2.setWidget(4, 1, heightInPxBox);
grid3.setWidget(0, 0, new Label("Tags:"));
grid3.setWidget(0, 1, tagsListEditor);
panel.add(grid1);
hPanel.add(grid2);
hPanel.add(imageHolder);
hPanel.setCellWidth(grid1, "50%");
hPanel.setCellWidth(imageHolder, "50%");
panel.add(hPanel);
panel.add(grid3);
return panel;
}
@@ -152,4 +184,35 @@ public abstract class ImageDialog extends DataEntryDialog<ImageDTO> {
super.show();
imageURLAndUploadComposite.setFocus(true);
}
protected Image loadImageFromURL(String url) {
final int maxImageHolderWidth = 300;
final int maxImageHolderHeight = 300;
final Image image = new Image(url);
image.addLoadHandler(new LoadHandler() {
@Override
public void onLoad(LoadEvent event) {
int width = image.getOffsetWidth();
int height = image.getOffsetHeight();
if(width > 0 && height > 0) {
widthInPxBox.setValue(width);
heightInPxBox.setValue(height);
}
Pair<Integer, Integer> fitToBox = fitSizeToBox(maxImageHolderWidth, maxImageHolderHeight, width, height, true);
image.setWidth(fitToBox.getA() + "px");
image.setHeight(fitToBox.getB() + "px");
validate();
}
});
return image;
}
private Util.Pair<Integer, Integer> fitSizeToBox(int boxWidth, int boxHeight, int imageWidth, int imageHeight, boolean neverScaleUp) {
double scale = Math.min((double) boxWidth / (double) imageWidth, (double) boxHeight / (double) imageHeight);
int h = (int) (!neverScaleUp || scale < 1.0 ? scale * imageHeight : imageHeight);
int w = (int) (!neverScaleUp || scale < 1.0 ? scale * imageWidth : imageWidth);
return new Util.Pair<Integer, Integer>(w,h);
}
}
@@ -8,20 +8,24 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.media.ImageDTO;
public class ImageEditDialog extends ImageDialog {
public ImageEditDialog(ImageDTO image, StringMessages stringMessages, DialogCallback<ImageDTO> callback) {
super(image.getCreatedAtDate(), new ImageParameterValidator(stringMessages), stringMessages, callback);
createdAtLabel = new Label(image.getCreatedAtDate().toString());
imageURLAndUploadComposite.setURL(image.getSourceRef());
titleTextBox = createTextBox(image.getTitle());
titleTextBox.setVisibleLength(50);
subtitleTextBox = createTextBox(image.getSubtitle());
subtitleTextBox.setVisibleLength(50);
copyrightTextBox = createTextBox(image.getCopyright());
copyrightTextBox.setVisibleLength(50);
widthInPxBox = createIntegerBox(image.getWidthInPx(), 10);
heightInPxBox = createIntegerBox(image.getHeightInPx(), 10);
public ImageEditDialog(ImageDTO imageDTO, StringMessages stringMessages, DialogCallback<ImageDTO> callback) {
super(imageDTO.getCreatedAtDate(), new ImageParameterValidator(stringMessages), stringMessages, callback);
createdAtLabel = new Label(imageDTO.getCreatedAtDate().toString());
imageURLAndUploadComposite.setURL(imageDTO.getSourceRef());
titleTextBox = createTextBox(imageDTO.getTitle());
titleTextBox.setVisibleLength(40);
subtitleTextBox = createTextBox(imageDTO.getSubtitle());
subtitleTextBox.setVisibleLength(40);
copyrightTextBox = createTextBox(imageDTO.getCopyright());
copyrightTextBox.setVisibleLength(40);
widthInPxBox = createIntegerBox(imageDTO.getWidthInPx(), 10);
widthInPxBox.setEnabled(false);
heightInPxBox = createIntegerBox(imageDTO.getHeightInPx(), 10);
heightInPxBox.setEnabled(false);
List<String> tags = new ArrayList<String>();
tags.addAll(image.getTags());
tags.addAll(imageDTO.getTags());
tagsListEditor.setValue(tags);
image = loadImageFromURL(imageDTO.getSourceRef());
imageHolder.setWidget(image);
}
}
@@ -10,6 +10,24 @@ import com.sap.sse.common.media.MimeType;
public final class MediaConstants {
// perfect fit would be 1440 x 580
public static final int MIN_STAGE_IMAGE_WIDTH = 1440 / 2;
public static final int MAX_STAGE_IMAGE_WIDTH = 1440 * 2;
public static final int MIN_STAGE_IMAGE_HEIGHT = 580 / 2;
public static final int MAX_STAGE_IMAGE_HEIGHT = 580 * 2;
// perfect fit would be 370 x 240
public static final int MIN_EVENTTEASER_IMAGE_WIDTH = 370 / 2;
public static final int MAX_EVENTTEASER_IMAGE_WIDTH = 370 * 3;
public static final int MIN_EVENTTEASER_IMAGE_HEIGHT = 240 / 2;
public static final int MAX_EVENTTEASER_IMAGE_HEIGHT = 240 * 3;
// perfect fit would be 140 x 140
public static final int MIN_LOGO_IMAGE_WIDTH = 140 / 2;
public static final int MAX_LOGO_IMAGE_WIDTH = 140 * 4;
public static final int MIN_LOGO_IMAGE_HEIGHT = 140 / 2;
public static final int MAX_LOGO_IMAGE_HEIGHT = 140 * 4;
public static final List<String> imageTagSuggestions = Arrays.asList(new String[] { MediaTagConstants.STAGE, MediaTagConstants.TEASER,
MediaTagConstants.SPONSOR, MediaTagConstants.LOGO, MediaTagConstants.GALLERY });
public static final List<String> videoTagSuggestions = Arrays.asList(new String[] { MediaTagConstants.LIVESTREAM, MediaTagConstants.HIGHLIGHT, MediaTagConstants.FEATURED, MediaTagConstants.STAGE });