/*
* Copyright 2014-2016 CyberVision, 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.kaaproject.kaa.server.admin.client.layout;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.layout.client.Layout.AnimationCallback;
import com.google.gwt.layout.client.Layout.Layer;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
import org.kaaproject.avro.ui.gwt.client.AvroUiResources.AvroUiStyle;
import org.kaaproject.kaa.server.admin.client.KaaAdminResources.KaaAdminStyle;
import org.kaaproject.kaa.server.admin.client.util.Utils;
import org.kaaproject.kaa.server.common.Version;
public class AppLayout extends Composite {
private static final String OPEN = "<<";
private static final String CLOSE = ">>";
private static final int PANEL_WIDTH = 200;
private static final String PANEL_WIDTH_IN_PX = PANEL_WIDTH + "px";
private static final double DELTA_FACTOR = 2.0;
private static AppLayoutUiBinder uiBinder = GWT.create(AppLayoutUiBinder.class);
@UiField(provided = true)
final KaaAdminStyle kaaAdminStyle;
@UiField(provided = true)
final AvroUiStyle avroUiStyle;
@UiField
FlowPanel mainLayoutPanel;
@UiField
SimplePanel appHeader;
@UiField
FlowPanel navPanel;
@UiField
SimpleWidgetPanel appContent;
CustomDeckLayoutPanel navContent;
@UiField
HTMLPanel footerPanel;
private int clickCount = 1;
/**
* Instantiates a new AppLayout.
*/
public AppLayout() {
kaaAdminStyle = Utils.kaaAdminStyle;
avroUiStyle = Utils.avroUiStyle;
initWidget(uiBinder.createAndBindUi(this));
init();
}
public SimplePanel getAppHeaderHolder() {
return this.appHeader;
}
public CustomDeckLayoutPanel getNavContentHolder() {
return this.navContent;
}
public SimpleWidgetPanel getAppContentHolder() {
return this.appContent;
}
private void incr() {
++clickCount;
}
private void init() {
final SimplePanel emptyPanel = new SimplePanel();
navContent = new CustomDeckLayoutPanel();
navContent.setAnimationVertical(false);
navContent.setAnimationDuration(0);
navContent.setStyleName(kaaAdminStyle.bNavContent());
navContent.setSize("200px", "100%");
navPanel.add(navContent);
final Label back = new Label(OPEN);
back.setStyleName(kaaAdminStyle.bNavLabel());
navPanel.add(back);
appHeader.setSize("100%", "60px");
appContent.setStyleName(avroUiStyle.bAppContent());
navPanel.setStyleName(kaaAdminStyle.bNavPanel());
footerPanel.getElement().setInnerHTML(Utils.messages.footerMessage(Version.PROJECT_VERSION));
back.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (clickCount == 1) {
navContent.add(emptyPanel);
navContent.setAnimationDuration(100);
navContent.showWidget(clickCount, new CustomAnimationCallback(true));
back.setText(CLOSE);
} else if (clickCount % 2 == 0) {
navContent.showWidget(0, new CustomAnimationCallback(false));
back.setText(OPEN);
} else {
navContent.showWidget(1, new CustomAnimationCallback(true));
back.setText(CLOSE);
}
incr();
}
});
}
interface AppLayoutUiBinder extends UiBinder<Widget, AppLayout> {
}
class CustomAnimationCallback implements AnimationCallback {
private boolean isOpen;
public CustomAnimationCallback(boolean isOpen) {
this.isOpen = isOpen;
}
@Override
public void onAnimationComplete() {
if (isOpen) {
navContent.setSize("0", "100%");
} else {
navContent.setSize(PANEL_WIDTH_IN_PX, "100%");
}
}
@Override
public void onLayout(Layer arg0, double progres) {
navContent.setSize(getNewSize(progres) + "px", "100%");
}
private double getNewSize(double progres) {
double delta = getDelta(progres);
if (isOpen) {
double newSize = PANEL_WIDTH - delta;
if (newSize < 0) {
return 0;
} else {
return newSize;
}
} else {
double newSize = delta;
if (newSize > PANEL_WIDTH) {
return PANEL_WIDTH;
} else {
return newSize;
}
}
}
private double getDelta(double progres) {
if (isOpen) {
return PANEL_WIDTH * progres * DELTA_FACTOR;
} else {
return PANEL_WIDTH * progres;
}
}
}
}