/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.ui.loaders;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
import javax.annotation.Nullable;
import javax.validation.constraints.NotNull;
/**
* Implementation of PopupLoader.
* This loader is UI widget appearing on the top of the IDE.
*
* @author Vitaliy Guliy
*/
public class PopupLoaderImpl extends Composite implements PopupLoader {
interface LoaderPopupImplUiBinder extends UiBinder<FlowPanel, PopupLoaderImpl> {
}
// Loader title
String title;
// Loader title animation suffix
String titleSuffix = "";
// Loader description
String description;
@UiField
Label titleLabel;
@UiField
Label descriptionLabel;
@UiField
FlowPanel customWidget;
@UiField
Hyperlink downloadOutputs;
private ActionDelegate actionDelegate;
@AssistedInject
public PopupLoaderImpl(LoaderPopupImplUiBinder uiBinder,
@NotNull @Assisted("title") String title,
@NotNull @Assisted("description") String description) {
initWidget(uiBinder.createAndBindUi(this));
this.title = title;
this.description = description;
titleLabel.setText(title);
descriptionLabel.setText(description);
// Start show animation
getElement().addClassName("inDown");
// Attach to the root
RootPanel.get().add(this);
// Start animation timer
playTimer.scheduleRepeating(1000);
}
@AssistedInject
public PopupLoaderImpl(LoaderPopupImplUiBinder uiBinder,
@NotNull @Assisted("title") String title,
@NotNull @Assisted("description") String description,
@Nullable @Assisted("widget") Widget widget) {
this(uiBinder, title, description);
if (widget != null) {
customWidget.clear();
customWidget.setVisible(true);
customWidget.add(widget);
playTimer.cancel();
}
}
@Override
public void setSuccess() {
// Stop animation timer
playTimer.cancel();
// Start hide animation
getElement().addClassName("outDown");
// Remove from the parent
new Timer() {
@Override
public void run() {
removeFromParent();
}
}.schedule(1000);
}
@Override
public void setError() {
// Stop animation
playTimer.cancel();
// Reset title
titleLabel.setText(title);
}
@Override
public void showDownloadButton() {
customWidget.setVisible(true);
downloadOutputs.setVisible(true);
}
@Override
public void setDelegate(ActionDelegate actionDelegate) {
this.actionDelegate = actionDelegate;
}
@UiHandler("downloadOutputs")
void downloadLogsClicked(ClickEvent e) {
if (actionDelegate != null) {
actionDelegate.onDownloadLogs();
}
}
private Timer playTimer = new Timer() {
@Override
public void run() {
titleSuffix += ".";
if (titleSuffix.length() > 3) {
titleSuffix = ".";
}
titleLabel.setText(title + titleSuffix);
}
};
}