/*******************************************************************************
* 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.request;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
import org.eclipse.che.ide.DelayedTask;
import org.eclipse.che.ide.rest.AsyncRequestLoader;
import org.vectomatic.dom.svg.ui.SVGImage;
/**
* Loader that contains configurable message.
* To obtain the instance of this loader you need to inject {@link LoaderFactory} and call one from two methods.
* First one creates loader with default message. Second one allow to pass own loader initial message.
* Loader will be showed to user if total operation time is more that 0.5 second.
*
* @author Vlad Zhukovskiy
*/
public class MessageLoader implements AsyncRequestLoader {
public static final String DEF_MESSAGE = "Loading...";
public static final String MESSAGE_DBG_ID = "loader-message";
public static final String GLASS_DBG_ID = "glass-panel";
public static final String LOADER_DBG_ID = "loader-panel";
public static final int SHOW_DELAY = 500; //500ms
private boolean showing = false;
private final Label label = new Label();
private final FlowPanel glass = new FlowPanel();
private final FlowPanel loader = new FlowPanel();
//show loader if it works more than 0.5 second
private final DelayedTask showLoader = new DelayedTask() {
@Override
public void onExecute() {
RootPanel.get().add(glass);
showing = true;
}
};
@AssistedInject
public MessageLoader(MessageLoaderResources resources) {
this(DEF_MESSAGE, resources);
}
@AssistedInject
public MessageLoader(@Assisted String message, MessageLoaderResources resources) {
label.ensureDebugId(MESSAGE_DBG_ID);
label.setText(message == null || message.isEmpty() ? DEF_MESSAGE : message);
label.setStyleName(resources.Css().label());
loader.setStyleName(resources.Css().loader());
FlowPanel loaderSvg = new FlowPanel();
loaderSvg.setStyleName(resources.Css().loaderSvg());
loaderSvg.add(new SVGImage(resources.loader()));
loader.ensureDebugId(LOADER_DBG_ID);
loader.add(loaderSvg);
loader.add(label);
glass.ensureDebugId(GLASS_DBG_ID);
glass.add(loader);
glass.setStyleName(resources.Css().glass());
}
/** {@inheritDoc} */
@Override
public void show() {
show(null);
}
/** {@inheritDoc} */
@Override
public void show(String message) {
setMessage(message);
if (!showing) {
showLoader.delay(SHOW_DELAY);
}
}
/** {@inheritDoc} */
@Override
public void hide() {
if (showing) {
glass.removeFromParent();
showing = false;
return;
}
showLoader.cancel();
}
/** {@inheritDoc} */
@Override
public void setMessage(String message) {
if (message != null && !message.isEmpty()) {
label.setText(message);
}
}
}