/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.uberfire.ext.layout.editor.client.components.columns; import javax.enterprise.context.Dependent; import javax.enterprise.event.Observes; import javax.inject.Inject; import com.google.gwt.core.client.Scheduler; import org.jboss.errai.common.client.dom.Button; import org.jboss.errai.common.client.dom.Div; import org.jboss.errai.common.client.dom.Document; import org.jboss.errai.ui.client.local.api.IsElement; import org.jboss.errai.ui.shared.api.annotations.DataField; import org.jboss.errai.ui.shared.api.annotations.Templated; import org.uberfire.client.mvp.UberElement; import org.uberfire.client.workbench.docks.UberfireDocksInteractionEvent; import org.uberfire.ext.layout.editor.client.components.rows.Row; import org.uberfire.ext.layout.editor.client.infra.ColumnDrop; import org.uberfire.ext.layout.editor.client.infra.ContainerResizeEvent; import static org.jboss.errai.common.client.dom.DOMUtil.addCSSClass; import static org.jboss.errai.common.client.dom.DOMUtil.hasCSSClass; import static org.jboss.errai.common.client.dom.DOMUtil.removeAllChildren; import static org.jboss.errai.common.client.dom.DOMUtil.removeCSSClass; import static org.uberfire.ext.layout.editor.client.infra.HTML5DnDHelper.extractDndData; @Dependent @Templated public class ColumnWithComponentsView implements UberElement<ColumnWithComponents>, ColumnWithComponents.View, IsElement { private static final String COL_CSS_CLASS = "col-md-"; private final int originalLeftRightWidth = 15; @Inject @DataField Div colWithComponents; @Inject @DataField Div row; String cssSize = ""; private ColumnWithComponents presenter; @Inject @DataField private Div content; @Inject @DataField private Div left; @Inject @DataField("resize-left") private Button resizeLeft; @Inject @DataField private Div right; @Inject @DataField("resize-right") private Button resizeRight; @Inject private Document document; @Override public void init(ColumnWithComponents presenter) { this.presenter = presenter; setupEvents(); } private void setupEvents() { setupLeftEvents(); setupRightEvents(); setupOnResize(); setupResize(); setupResizeEvents(); } private void setupResizeEvents() { resizeLeft.setOnclick(event -> presenter.resizeLeft()); resizeRight.setOnclick(event -> presenter.resizeRight()); } @Override public void setupResize() { resizeLeft.getStyle().setProperty("display", "none"); resizeRight.getStyle().setProperty("display", "none"); } private void setupOnResize() { document.getBody().setOnresize(event -> calculateSize()); } public void dockSelectEvent(@Observes UberfireDocksInteractionEvent event) { calculateSize(); } private void setupRightEvents() { right.setOndragenter(e -> { e.preventDefault(); if (presenter.shouldPreviewDrop()) { addCSSClass(right, "columnDropPreview"); addCSSClass(right, "dropPreview"); addCSSClass(content, "centerPreview"); } }); right.setOndragleave(e -> { e.preventDefault(); if (presenter.shouldPreviewDrop()) { removeCSSClass(right, "columnDropPreview"); removeCSSClass(right, "dropPreview"); removeCSSClass(content, "centerPreview"); } }); right.setOndrop(e -> { e.preventDefault(); if (presenter.shouldPreviewDrop()) { removeCSSClass(right, "columnDropPreview"); removeCSSClass(right, "dropPreview"); removeCSSClass(content, "centerPreview"); presenter.onDrop(ColumnDrop.Orientation.RIGHT, extractDndData(e)); } }); right.setOndragover(e -> { e.preventDefault(); }); right.setOnmouseover(e -> { e.preventDefault(); if (presenter.canResizeRight()) { resizeRight.getStyle().setProperty("display", "block"); } }); right.setOnmouseout(e -> { if (presenter.canResizeRight()) { resizeRight.getStyle().setProperty("display", "none"); } }); } private void setupLeftEvents() { left.setOndragenter(e -> { e.preventDefault(); if (presenter.shouldPreviewDrop()) { addCSSClass(left, "columnDropPreview"); addCSSClass(left, "dropPreview"); addCSSClass(content, "centerPreview"); } }); left.setOndragover(e -> e.preventDefault()); left.setOndragleave(e -> { e.preventDefault(); if (presenter.shouldPreviewDrop()) { removeCSSClass(left, "columnDropPreview"); removeCSSClass(left, "dropPreview"); removeCSSClass(content, "centerPreview"); } }); left.setOndrop(e -> { e.preventDefault(); if (presenter.shouldPreviewDrop()) { removeCSSClass(left, "columnDropPreview"); removeCSSClass(left, "dropPreview"); removeCSSClass(content, "centerPreview"); presenter.onDrop(ColumnDrop.Orientation.LEFT, extractDndData(e)); } }); left.setOnmouseover(e -> { e.preventDefault(); if (presenter.canResizeLeft()) { resizeLeft.getStyle().setProperty("display", "block"); } }); left.setOnmouseout(e -> { if (presenter.canResizeLeft()) { resizeLeft.getStyle().setProperty("display", "none"); } }); } @Override public void setSize(String size) { if (hasCssSizeClass()) { removeCSSClass(colWithComponents, cssSize); } cssSize = COL_CSS_CLASS + size; addCSSClass(colWithComponents, cssSize); addCSSClass(colWithComponents, "container"); } private boolean hasCssSizeClass() { return !cssSize.isEmpty() && hasCSSClass(colWithComponents, cssSize); } @Override public void addRow(UberElement<Row> view) { content.appendChild(view.getElement()); } @Override public void clear() { removeAllChildren(content); } public void resizeEventObserver(@Observes ContainerResizeEvent event) { calculateSize(); } @Override public void calculateSize() { Scheduler.get().scheduleDeferred(() -> { final int colWidth = row.getBoundingClientRect().getWidth().intValue(); int padding = 2; final int contentWidth = colWidth - (originalLeftRightWidth * 2) - padding; left.getStyle().setProperty("width", originalLeftRightWidth + "px"); right.getStyle().setProperty("width", originalLeftRightWidth + "px"); content.getStyle().setProperty("width", contentWidth + "px"); presenter.calculateSizeChilds(); }); } }