diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/BackgroundSize.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/BackgroundSize.java new file mode 100644 index 0000000000000000000000000000000000000000..5900972da9cbc3bb47bd2242198f1875d706ccad --- /dev/null +++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/BackgroundSize.java @@ -0,0 +1,43 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.ims.qti21.ui.editor.interactions; + +/** + * + * Initial date: 4 mars 2019<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public enum BackgroundSize { + + s1024(1024), + s800(800), + s480(480); + + private final int size; + + private BackgroundSize(int size) { + this.size = size; + } + + public int size() { + return size; + } +} diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/DrawingEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/DrawingEditorController.java index 337753345f3d11b10c786f86d9714cd31baed413..63e4776ef40dc1294dcda9230ee2b595c3e3946f 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/DrawingEditorController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/DrawingEditorController.java @@ -34,6 +34,7 @@ import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.FileElement; import org.olat.core.gui.components.form.flexible.elements.RichTextElement; +import org.olat.core.gui.components.form.flexible.elements.SingleSelection; import org.olat.core.gui.components.form.flexible.elements.TextElement; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; @@ -42,6 +43,7 @@ import org.olat.core.gui.components.form.flexible.impl.elements.FileElementEvent import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.CodeHelper; +import org.olat.core.util.FileUtils; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.ValidationStatus; @@ -74,6 +76,7 @@ public class DrawingEditorController extends FormBasicController { private TextElement titleEl; private RichTextElement textEl; + private SingleSelection resizeEl; private FileElement backgroundEl; private final File itemFile; @@ -144,6 +147,15 @@ public class DrawingEditorController extends FormBasicController { backgroundEl.setDeleteEnabled(true); backgroundEl.limitToMimeType(mimeTypes, "error.mimetype", new String[]{ mimeTypes.toString() }); + String[] resizeKeys = new String[] { "no" }; + String[] resizeValues = new String[] { translate("form.imd.background.resize.no") }; + resizeEl = uifactory.addRadiosHorizontal("form.imd.background.resize", formLayout, resizeKeys, resizeValues); + resizeEl.setVisible(false); + resizeEl.setEnabled(!readOnly); + if(initialBackgroundImage != null) { + Size size = imageService.getSize(new LocalFileImpl(initialBackgroundImage), null); + optimizeResizeEl(size, false); + } // Submit Button FormLayoutContainer buttonsContainer = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); @@ -222,6 +234,8 @@ public class DrawingEditorController extends FormBasicController { backgroundEl.setUploadFileName(uniqueFilename); backgroundImage = backgroundEl.moveUploadFileTo(itemFile.getParentFile()); backgroundEl.setInitialFile(backgroundImage); + Size size = imageService.getSize(new LocalFileImpl(backgroundImage), null); + optimizeResizeEl(size, true); } } } @@ -244,7 +258,18 @@ public class DrawingEditorController extends FormBasicController { if(objectImg != null) { String filename = objectImg.getName(); String mimeType = WebappHelper.getMimeType(filename); - Size size = imageService.getSize(new LocalFileImpl(objectImg), null); + Size currentSize = imageService.getSize(new LocalFileImpl(objectImg), null); + + Size size = currentSize; + if(resizeEl.isVisible() && !resizeEl.isSelected(0)) { + int maxSize = Integer.parseInt(resizeEl.getSelectedKey()); + if(maxSize < currentSize.getHeight() || maxSize < currentSize.getWidth()) { + String extension = FileUtils.getFileSuffix(filename); + size = imageService.scaleImage(objectImg, extension, objectImg, maxSize, maxSize, false); + optimizeResizeEl(size, false); + } + } + int height = -1; int width = -1; if(size != null) { @@ -260,4 +285,42 @@ public class DrawingEditorController extends FormBasicController { fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem(), QTI21QuestionType.drawing)); } + + private void optimizeResizeEl(Size size, boolean selectSize) { + List<String> keys = new ArrayList<>(); + List<String> values = new ArrayList<>(); + + String selectedSize = null; + for(BackgroundSize availableSize:BackgroundSize.values()) { + int proposedSize = availableSize.size(); + if(proposedSize <= size.getHeight() || proposedSize <= size.getWidth()) { + String s = Integer.toString(availableSize.size()); + keys.add(s); + values.add(s + " x " + s); + if((proposedSize == size.getHeight() && proposedSize >= size.getWidth()) + || (proposedSize == size.getWidth() && proposedSize >= size.getHeight())) { + selectedSize = s; + } + } + } + if(selectedSize == null) { + keys.add(0, "no"); + values.add(0, translate("form.imd.background.resize.no")); + } + resizeEl.setKeysAndValues(keys.toArray(new String[keys.size()]), values.toArray(new String[values.size()]), null); + + if(keys.size() == 1) { + resizeEl.select(keys.get(0), true); + resizeEl.setVisible(false); + } else { + if(selectedSize != null) { + resizeEl.select(selectedSize, true); + } else if(selectSize && keys.size() > 1 && keys.get(1).equals(Integer.toString(BackgroundSize.s1024.size()))) { + resizeEl.select(Integer.toString(BackgroundSize.s1024.size()), true); + } else { + resizeEl.select(keys.get(0), true); + } + resizeEl.setVisible(true); + } + } } \ No newline at end of file diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/HotspotEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/HotspotEditorController.java index 446c02193beaadcbc45fc33b53d7c9de38a6cdc6..779bf90b2df6c03714ab5c6c20668bb86232f451 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/HotspotEditorController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/HotspotEditorController.java @@ -598,8 +598,8 @@ public class HotspotEditorController extends FormBasicController { } else { if(selectedSize != null) { resizeEl.select(selectedSize, true); - } else if(selectSize && keys.size() > 1 && keys.get(1).equals(Integer.toString(BackgroundSize.s1024.size))) { - resizeEl.select(Integer.toString(BackgroundSize.s1024.size), true); + } else if(selectSize && keys.size() > 1 && keys.get(1).equals(Integer.toString(BackgroundSize.s1024.size()))) { + resizeEl.select(Integer.toString(BackgroundSize.s1024.size()), true); } else { resizeEl.select(keys.get(0), true); } @@ -779,20 +779,4 @@ public class HotspotEditorController extends FormBasicController { coords.set(3, (bottomY - translateY)); } } - - public enum BackgroundSize { - s1024(1024), - s800(800), - s480(480); - - private final int size; - - private BackgroundSize(int size) { - this.size = size; - } - - public int size() { - return size; - } - } }