This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Index: ../../git-repositories/mgnl-5.4-repo/ui/magnolia-ui-vaadin-common-widgets/src/main/java/info/magnolia/ui/vaadin/gwt/client/richtext/TextAreaStretcherConnector.java | |
| IDEA additional info: | |
| Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP | |
| <+>UTF-8 | |
| =================================================================== | |
| --- ../../git-repositories/mgnl-5.4-repo/ui/magnolia-ui-vaadin-common-widgets/src/main/java/info/magnolia/ui/vaadin/gwt/client/richtext/TextAreaStretcherConnector.java (revision 7203fef314cb301f7e023083337f688ba63b90af) | |
| +++ ../../git-repositories/mgnl-5.4-repo/ui/magnolia-ui-vaadin-common-widgets/src/main/java/info/magnolia/ui/vaadin/gwt/client/richtext/TextAreaStretcherConnector.java (revision ) | |
| @@ -70,44 +70,59 @@ | |
| public static final String COLLAPSED = "collapsed"; | |
| public static final String CKEDITOR_TOOLBOX = ".cke_top"; | |
| public static final String TEXTAREA_STRETCHED = "textarea-stretched"; | |
| - | |
| public static final String RICH_TEXT_STYLE_NAME = "rich-text"; | |
| public static final String SIMPLE_STYLE_NAME = "simple"; | |
| - | |
| public static final int DELAY_MS = 500; | |
| + private static final int UNCALCULATED_SIZE = -1; | |
| + private static final int TOP = 0; | |
| + private static final int RIGHT = 1; | |
| + private static final int BOTTOM = 2; | |
| + private static final int LEFT = 3; | |
| + | |
| private Widget form; | |
| private Widget dialog; | |
| private Widget textWidget; | |
| - | |
| private Element stretchControl = DOM.createDiv(); | |
| - private WindowResizeListener windowResizeListener = new WindowResizeListener(); | |
| + // Border, padding, margin property for dialog-wrapper, dialog-header, dialog-content class, contain values for top, right, bottom, left. | |
| + private int[] dialogWrapperBorder; | |
| + private int[] dialogHeaderPadding; | |
| + private int[] dialogContentMargin; | |
| + private int[] dialogMargin; | |
| + private int[] dialogPadding; | |
| + private String formHeight; | |
| + private int dialogHeaderFooterOuterHeight = UNCALCULATED_SIZE; | |
| private boolean isOverlay = false; | |
| private boolean isRichTextEditor = false; | |
| private StateChangeEvent.StateChangeHandler textAreaSizeHandler = new StateChangeEvent.StateChangeHandler() { | |
| @Override | |
| public void onStateChanged(StateChangeEvent stateChangeEvent) { | |
| - stretchTextArea(textWidget.getElement().getStyle()); | |
| + adjustTextAreaSizeToScreen(); | |
| } | |
| }; | |
| + private WindowResizeListener windowResizeListener = new WindowResizeListener(); | |
| + | |
| private ElementResizeListener formResizeListener = new ElementResizeListener() { | |
| @Override | |
| public void onElementResize(ElementResizeEvent e) { | |
| - if (isRichTextEditor) { | |
| - Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { | |
| + doElementResize(); | |
| + } | |
| + }; | |
| + | |
| + private StateChangeEvent.StateChangeHandler formStateChangeHandler = new StateChangeEvent.StateChangeHandler() { | |
| - @Override | |
| + @Override | |
| - public void execute() { | |
| - updateSize(); | |
| + public void onStateChanged(StateChangeEvent stateChangeEvent) { | |
| + if (stateChangeEvent.hasPropertyChanged("descriptionsVisible") || stateChangeEvent.hasPropertyChanged("errorAmount")) { | |
| + if (!getState().isCollapsed) { | |
| + unregisterSizeChangeListeners(); | |
| + getRpcProxy(TextAreaStretcherServerRpc.class).toggle(textWidget.getOffsetWidth(), textWidget.getOffsetHeight()); | |
| - } | |
| + } | |
| - }); | |
| - } else { | |
| - updateSize(); | |
| } | |
| } | |
| - };; | |
| + }; | |
| @Override | |
| public void onStateChanged(StateChangeEvent stateChangeEvent) { | |
| @@ -198,6 +213,7 @@ | |
| final ComponentConnector formConnector = Util.findConnectorFor(this.form); | |
| if (formConnector != null) { | |
| formConnector.getLayoutManager().addElementResizeListener(this.form.getElement(), formResizeListener); | |
| + formConnector.addStateChangeHandler(formStateChangeHandler); | |
| } | |
| } | |
| @@ -209,24 +225,18 @@ | |
| Style style = textWidget.getElement().getStyle(); | |
| style.setPosition(Style.Position.ABSOLUTE); | |
| - Element header = getDialogHeaderElement(); | |
| - ComputedStyle headerCS = new ComputedStyle(header); | |
| + style.setZIndex(5); | |
| - int top = form.getAbsoluteTop() - dialog.getAbsoluteTop(); | |
| - top = isOverlay ? top : top + headerCS.getPadding()[0] + headerCS.getPadding()[2]; | |
| + int top = calculateTextWidgetTop(); | |
| + int left = calculateTextWidgetLeft(); | |
| - int left = isOverlay ? 0 : form.getAbsoluteLeft(); | |
| - | |
| style.setLeft(left, Style.Unit.PX); | |
| style.setTop(top, Style.Unit.PX); | |
| - stretchTextArea(style); | |
| - style.setZIndex(5); | |
| + adjustTextAreaSizeToScreen(); | |
| - if (!isOverlay && !isRichTextEditor) { | |
| - stretchControl.getStyle().setTop(top + 5, Style.Unit.PX); | |
| - stretchControl.getStyle().setLeft(left + textWidget.getOffsetWidth() - stretchControl.getOffsetWidth() - 5, Style.Unit.PX); | |
| - | |
| + if (!isRichTextEditor) { | |
| + setStretchControlPosition(top, left); | |
| } | |
| hideOtherStretchers(); | |
| @@ -234,6 +244,8 @@ | |
| stretchControl.replaceClassName(STRETCHED, COLLAPSED); | |
| stretchControl.replaceClassName("icon-close-fullscreen-2", "icon-open-fullscreen-2"); | |
| form.asWidget().removeStyleName(TEXTAREA_STRETCHED); | |
| + // Restore form height | |
| + form.setHeight(formHeight); | |
| clearTraces(); | |
| } | |
| } | |
| @@ -244,6 +256,20 @@ | |
| clearTraces(); | |
| } | |
| + private void setStretchControlPosition(int top, int left) { | |
| + stretchControl.getStyle().setTop(top + 5, Style.Unit.PX); | |
| + stretchControl.getStyle().setLeft(left + textWidget.getOffsetWidth() - stretchControl.getOffsetWidth() - 5, Style.Unit.PX); | |
| + } | |
| + | |
| + private int calculateTextWidgetTop() { | |
| + int top = form.getAbsoluteTop() - dialog.getAbsoluteTop(); | |
| + return isOverlay ? top + getDialogMargin()[TOP] + getDialogPadding()[TOP] : top + getDialogHeaderPadding()[TOP] + getDialogHeaderPadding()[BOTTOM]; | |
| + } | |
| + | |
| + private int calculateTextWidgetLeft() { | |
| + return isOverlay ? getDialogPadding()[LEFT] : form.getAbsoluteLeft(); | |
| + } | |
| + | |
| private void hideOtherStretchers() { | |
| JQueryWrapper.select("." + STRETCHER_BASE).setCss("display", "none"); | |
| this.stretchControl.getStyle().setDisplay(Style.Display.BLOCK); | |
| @@ -258,15 +284,11 @@ | |
| stretchControl.getStyle().clearTop(); | |
| stretchControl.getStyle().clearLeft(); | |
| + stretchControl.getStyle().clearDisplay(); | |
| JQueryWrapper.select("." + STRETCHER_BASE).setCss("display", ""); | |
| } | |
| - private void stretchTextArea(Style style) { | |
| - style.setWidth(form.getOffsetWidth(), Style.Unit.PX); | |
| - adjustTextAreaHeightToScreen(getConnection().getUIConnector().getWidget().getOffsetHeight()); | |
| - } | |
| - | |
| private void unregisterSizeChangeListeners() { | |
| final LayoutManager lm = getParent().getLayoutManager(); | |
| final UIConnector ui = getConnection().getUIConnector(); | |
| @@ -278,13 +300,10 @@ | |
| final ComponentConnector formConnector = Util.findConnectorFor(this.form); | |
| if (formConnector != null) { | |
| formConnector.getLayoutManager().removeElementResizeListener(this.form.getElement(), formResizeListener); | |
| + formConnector.removeStateChangeHandler(formStateChangeHandler); | |
| } | |
| } | |
| - private Element getDialogHeaderElement() { | |
| - return JQueryWrapper.select(dialog.asWidget()).find(".dialog-header").get(0); | |
| - } | |
| - | |
| private void checkOverlay() { | |
| Widget it = this.dialog.asWidget(); | |
| while (it != null && !isOverlay) { | |
| @@ -303,17 +322,116 @@ | |
| it = it.getParent(); | |
| } | |
| this.form = (it instanceof FormView) ? it : null; | |
| + // Keep original form's height | |
| + this.formHeight = this.form.getElement().getStyle().getHeight(); | |
| } | |
| - private void adjustTextAreaHeightToScreen(int uiHeight) { | |
| - int formTop = form.getAbsoluteTop(); | |
| - textWidget.setHeight((uiHeight - formTop) + "px"); | |
| + private void adjustTextAreaSizeToScreen() { | |
| + int formHeight = calculateFormHeight(); | |
| + form.setHeight(formHeight + "px"); | |
| + textWidget.setWidth((form.getOffsetWidth() + getDialogWrapperBorder()[RIGHT] + getDialogWrapperBorder()[LEFT]) + "px"); | |
| + textWidget.setHeight(formHeight + "px"); | |
| } | |
| + private int calculateFormHeight() { | |
| + int formHeight = dialog.getOffsetHeight(); | |
| + formHeight -= getDialogHeaderFooterOuterHeight(); | |
| + formHeight -= getDialogMargin()[TOP]; | |
| + formHeight -= getDialogContentMargin()[TOP] - getDialogContentMargin()[BOTTOM]; | |
| + formHeight -= getElementsOuterHeight(".dialog-description", ".dialog-error"); | |
| + | |
| + return formHeight; | |
| + } | |
| + | |
| + private void doElementResize() { | |
| + if (isRichTextEditor) { | |
| + Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { | |
| + @Override | |
| + public void execute() { | |
| + updateSize(); | |
| + } | |
| + }); | |
| + } else { | |
| + updateSize(); | |
| + } | |
| + } | |
| + | |
| + private int getElementsOuterHeight(String... elementClasses) { | |
| + int elementsOuterHeight = 0; | |
| + for (String clazzName : elementClasses) { | |
| + Element element = JQueryWrapper.select(dialog.asWidget()).find(clazzName).get(0); | |
| + if (element != null) { | |
| + int margin[] = new ComputedStyle(element).getMargin(); | |
| + elementsOuterHeight += element.getOffsetHeight() + margin[TOP] + margin[BOTTOM]; | |
| + } | |
| + } | |
| + return elementsOuterHeight; | |
| + } | |
| + | |
| + private int[] getDialogHeaderPadding() { | |
| + if (dialogHeaderPadding == null) { | |
| + Element headerElement = JQueryWrapper.select(dialog.asWidget()).find(".dialog-header").get(0); | |
| + if (headerElement != null) { | |
| + dialogHeaderPadding = new ComputedStyle(headerElement).getPadding(); | |
| + } else { | |
| + dialogHeaderPadding = new int[]{0, 0, 0, 0}; | |
| + } | |
| + } | |
| + return dialogHeaderPadding; | |
| + } | |
| + | |
| + private int[] getDialogContentMargin() { | |
| + if (dialogContentMargin == null) { | |
| + Element contentElement = JQueryWrapper.select(dialog.asWidget()).find(".dialog-content").get(0); | |
| + if (contentElement != null) { | |
| + dialogContentMargin = new ComputedStyle(contentElement).getMargin(); | |
| + } else { | |
| + dialogContentMargin = new int[]{0, 0, 0, 0}; | |
| + } | |
| + } | |
| + | |
| + return dialogContentMargin; | |
| + } | |
| + | |
| + private int[] getDialogPadding() { | |
| + if (dialogPadding == null) { | |
| + dialogPadding = new ComputedStyle(dialog.getElement()).getPadding(); | |
| + } | |
| + return dialogPadding; | |
| + } | |
| + | |
| + private int[] getDialogMargin() { | |
| + if (dialogMargin == null) { | |
| + dialogMargin = new ComputedStyle(dialog.getElement()).getMargin(); | |
| + } | |
| + | |
| + return dialogMargin; | |
| + } | |
| + | |
| + private int[] getDialogWrapperBorder() { | |
| + if (dialogWrapperBorder == null) { | |
| + Element dialogWrapperElement = JQueryWrapper.select(dialog.asWidget()).find(".dialog-wrapper").get(0); | |
| + if (dialogWrapperElement != null) { | |
| + dialogWrapperBorder = new ComputedStyle(dialogWrapperElement).getBorder(); | |
| + } else { | |
| + dialogWrapperBorder = new int[]{0, 0, 0, 0}; | |
| + } | |
| + } | |
| + return dialogWrapperBorder; | |
| + } | |
| + | |
| + private int getDialogHeaderFooterOuterHeight() { | |
| + if (dialogHeaderFooterOuterHeight == UNCALCULATED_SIZE) { | |
| + dialogHeaderFooterOuterHeight = getElementsOuterHeight(".dialog-header", ".dialog-footer"); | |
| + } | |
| + | |
| + return dialogHeaderFooterOuterHeight; | |
| + } | |
| + | |
| private class WindowResizeListener implements ElementResizeListener { | |
| @Override | |
| public void onElementResize(ElementResizeEvent e) { | |
| - adjustTextAreaHeightToScreen(e.getLayoutManager().getOuterHeight(e.getElement())); | |
| + doElementResize(); | |
| } | |
| } | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment