/*
* Copyright 2014 Red Hat, Inc. and/or its affiliates.
*
* 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.dashbuilder.displayer.client.widgets;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.ui.*;
import org.dashbuilder.common.client.error.ClientRuntimeError;
import org.dashbuilder.displayer.DisplayerSettings;
import org.dashbuilder.displayer.client.AbstractDisplayerListener;
import org.dashbuilder.displayer.client.Displayer;
import org.dashbuilder.displayer.client.DisplayerListener;
import org.dashbuilder.displayer.client.DisplayerLocator;
import org.uberfire.mvp.Command;
import static org.uberfire.commons.validation.PortablePreconditions.checkNotNull;
@Dependent
public class DisplayerViewer extends Composite {
protected DisplayerSettings displayerSettings;
protected Panel container = new FlowPanel();
protected Label label = new Label();
protected Displayer displayer;
protected Boolean isShowRendererSelector = false;
protected DisplayerError errorWidget = new DisplayerError();
protected boolean error = true;
protected DisplayerLocator displayerLocator;
protected RendererSelector rendererSelector;
DisplayerListener displayerListener = new AbstractDisplayerListener() {
public void onDraw(Displayer displayer) {
if (error) {
show();
}
}
public void onRedraw(Displayer displayer) {
if (error) {
show();
}
}
public void onError(Displayer displayer, ClientRuntimeError error) {
error(error);
}
};
@Inject
public DisplayerViewer(DisplayerLocator displayerLocator, RendererSelector rendererSelector) {
this.displayerLocator = displayerLocator;
this.rendererSelector = rendererSelector;
initWidget(container);
}
public DisplayerSettings getDisplayerSettings() {
return displayerSettings;
}
public void setIsShowRendererSelector(Boolean isShowRendererSelector) {
this.isShowRendererSelector = isShowRendererSelector;
}
public Displayer getDisplayer() {
return displayer;
}
public void init(DisplayerSettings displayerSettings) {
try {
// Lookup the displayer
checkNotNull("displayerSettings", displayerSettings);
this.displayerSettings = displayerSettings;
this.displayer = displayerLocator.lookupDisplayer(displayerSettings);
this.displayer.addListener(displayerListener);
// Make the displayer visible
show();
}
catch (Exception e) {
error(new ClientRuntimeError(e));
}
}
protected void show() {
// Add the displayer into a container
container.clear();
final FlowPanel displayerContainer = new FlowPanel();
displayerContainer.add(displayer);
// Add the renderer selector (if enabled)
if (isShowRendererSelector) {
rendererSelector.init(displayerSettings, RendererSelector.SelectorType.TAB, 300, new Command() {
public void execute() {
displayerSettings.setRenderer(rendererSelector.getRendererLibrary().getUUID());
displayer = displayerLocator.lookupDisplayer(displayerSettings);
displayer.draw();
displayerContainer.clear();
displayerContainer.add(displayer);
}
});
container.add(rendererSelector);
}
container.add(displayerContainer);
error = false;
}
public Displayer draw() {
try {
// Draw the displayer
displayer.draw();
}
catch (Exception e) {
error(new ClientRuntimeError(e));
}
return displayer;
}
public Displayer redraw() {
try {
checkNotNull("displayerSettings", displayerSettings);
checkNotNull("displayer", displayer);
displayer.setDisplayerSettings(displayerSettings);
displayer.redraw();
} catch (Exception e) {
error(new ClientRuntimeError(e));
}
return displayer;
}
public void error(ClientRuntimeError e) {
container.clear();
container.add(errorWidget);
errorWidget.show(e.getMessage(), e.getCause());
error = true;
GWT.log(e.getMessage(), e.getThrowable());
}
}