/* * Copyright 2015 JBoss, by Red Hat, Inc * * 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.widgets.common.client.common; import com.google.gwt.animation.client.Animation; import com.google.gwt.dom.client.Style.Overflow; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; public class LazyStackPanelRow extends VerticalPanel { private static final int ANIMATION_DURATION = 350; private final AbstractLazyStackPanelHeader header; private LoadContentCommand contentLoad; private Widget contentWidget = null; private SimplePanel contentPanel = new SimplePanel(); private boolean expanded; public LazyStackPanelRow(AbstractLazyStackPanelHeader titleWidget, LoadContentCommand contentLoad, boolean expanded) { this.setWidth("100%"); this.expanded = expanded; this.header = titleWidget; this.contentLoad = contentLoad; init(); } public LazyStackPanelRow(AbstractLazyStackPanelHeader titleWidget, LoadContentCommand contentLoad) { this(titleWidget, contentLoad, false); } private void init() { clear(); add(header); if (contentWidget != null) { contentWidget.setVisible(expanded); } } public AbstractLazyStackPanelHeader getHeader() { return header; } public SimplePanel getContentPanel() { return contentPanel; } public void expand() { expanded = true; if (contentWidget == null) { contentWidget = contentLoad.load(); contentPanel.add(contentWidget); } contentPanel.setVisible(true); doAnimation(true); } public void compress() { expanded = false; contentPanel.setVisible(true); doAnimation(false); } public boolean isExpanded() { return expanded; } private void doAnimation(boolean isExpanding) { if (contentPanel.getWidget() != null) { ContentAnimation contentAnimation = new ContentAnimation(contentPanel); contentAnimation.setExpanding(isExpanding); contentAnimation.run(ANIMATION_DURATION); } } private static class ContentAnimation extends Animation { private boolean isExpanding; private SimplePanel content; private int height; ContentAnimation(SimplePanel content) { this.content = content; this.height = content.getOffsetHeight(); } void setExpanding(boolean isExpanding) { this.isExpanding = isExpanding; } @Override protected void onUpdate(double progress) { if (!isExpanding) { progress = 1.0 - progress; } int h = (int) (this.height * progress); content.setHeight(h + "px"); } @Override protected void onStart() { content.getElement().getStyle().setOverflow(Overflow.HIDDEN); super.onStart(); } @Override protected void onComplete() { super.onComplete(); content.setVisible(isExpanding); content.getElement().getStyle().setOverflow(Overflow.VISIBLE); content.setHeight("100%"); } } }