/*******************************************************************************
* Copyright (c) 2012-2015 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.loader;
import org.eclipse.che.ide.rest.AsyncRequestLoader;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.inject.Inject;
import java.util.HashMap;
import java.util.Map;
/**
* The loader for rest request.
*
* @author Andrey Plotnikov
* @author Sergii Leschenko
*/
public class IdeLoader implements AsyncRequestLoader {
protected final String DEFAULT_MESSAGE = "Loading ...";
private final MessageHeap messageHeap;
private final ViewLoader loader;
/**
* Create loader.
*/
@Inject
public IdeLoader(LoaderResources resources) {
messageHeap = new MessageHeap();
loader = new ViewLoader(resources);
}
/** {@inheritDoc} */
@Override
public void show() {
//show with default message
show(DEFAULT_MESSAGE);
}
/** {@inheritDoc} */
@Override
public void show(String message) {
messageHeap.push(message);
loader.setMessage(message);
loader.center();
loader.show();
}
/** {@inheritDoc} */
@Override
public void hide() {
hide(DEFAULT_MESSAGE);
}
/** {@inheritDoc} */
@Override
public void hide(String message) {
String newMessage = messageHeap.drop(message);
if (newMessage != null) {
loader.setMessage(newMessage);
} else {
loader.hide();
}
}
private static class ViewLoader extends PopupPanel {
private Grid grid;
public ViewLoader(LoaderResources resources) {
resources.Css().ensureInjected();
FlowPanel container = new FlowPanel();
HTML pinionWidget = new HTML("<i></i><i></i>");
pinionWidget.getElement().setClassName(resources.Css().pinion());
grid = new Grid(1, 2);
grid.setWidget(0, 0, pinionWidget);
container.add(grid);
this.add(container);
this.ensureDebugId("loader");
setGlassEnabled(true);
getGlassElement().getStyle().setOpacity(0);
getGlassElement().getStyle().setZIndex(9999998);
getElement().getStyle().setZIndex(9999999);
}
public void setMessage(String message) {
grid.setText(0, 1, message);
}
public String getMessage() {
return grid.getText(0, 1);
}
}
private class MessageHeap {
private final Map<String, Integer> messages = new HashMap<>();
/**
* Pushes message to heap
*
* @param message
* message for push
*/
public void push(String message) {
if (messages.containsKey(message)) {
messages.put(message, messages.get(message) + 1);
} else {
messages.put(message, 1);
}
}
/**
* Drop message from heap
*
* @param message
* message for drop
* @return any message from heap or <code>null</code> if heap does have message
*/
public String drop(String message) {
int count = messages.get(message) - 1;
if (count == 0) {
messages.remove(message);
// If dropped message that isn't displayed then do not update text
if (!loader.getMessage().equals(message)) {
return loader.getMessage();
}
if (!messages.isEmpty()) {
return messages.keySet().iterator().next();
}
return null;
} else {
messages.put(message, count);
return message;
}
}
}
}