Skip to content

Instantly share code, notes, and snippets.

@ngohuusang
Last active November 6, 2015 06:58
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save ngohuusang/796b010f72cfcf3891b6 to your computer and use it in GitHub Desktop.
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