/*
* ChunkPlotPage.java
*
* Copyright (C) 2009-16 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.studio.client.workbench.views.source.editors.text;
import org.rstudio.core.client.dom.ImageElementEx;
import org.rstudio.core.client.resources.ImageResource2x;
import org.rstudio.core.client.theme.res.ThemeResources;
import org.rstudio.core.client.widget.FixedRatioWidget;
import org.rstudio.studio.client.rmarkdown.model.NotebookPlotMetadata;
import org.rstudio.studio.client.workbench.views.source.editors.text.rmd.ChunkOutputUi;
import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.Style.Position;
import com.google.gwt.dom.client.Style.TextAlign;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Widget;
public class ChunkPlotPage extends ChunkOutputPage
implements EditorThemeListener
{
public ChunkPlotPage(final String url, NotebookPlotMetadata metadata,
int ordinal, final Command onRenderComplete, ChunkOutputSize chunkOutputSize)
{
super(ordinal);
thumbnail_ = new HTMLPanel("");
if (ChunkPlotWidget.isFixedSizePlotUrl(url))
{
final Image thumbnail = new Image();
thumbnail_.add(thumbnail);
thumbnail_.getElement().getStyle().setTextAlign(TextAlign.CENTER);
plot_ = new ChunkPlotWidget(url, metadata, new Command()
{
@Override
public void execute()
{
ImageElementEx plot = plot_.getElement().cast();
ImageElementEx img = thumbnail.getElement().cast();
if (plot.naturalHeight() < plot.naturalWidth())
{
img.getStyle().setProperty("width", "100%");
img.getStyle().setProperty("height", "auto");
}
else
{
img.getStyle().setProperty("height", "100%");
img.getStyle().setProperty("width", "auto");
}
thumbnail.setUrl(url);
onRenderComplete.execute();
}
}, chunkOutputSize);
}
else
{
// automatically expand non-fixed plots
thumbnail_.add(new FixedRatioWidget(new Image(url),
ChunkOutputUi.OUTPUT_ASPECT, 100));
plot_ = new ChunkPlotWidget(url, metadata, onRenderComplete, chunkOutputSize);
}
// look for messages or warnings in metadata
boolean hasMessages = false;
boolean hasWarnings = false;
if (metadata != null)
{
for (int i = 0; i < metadata.getConditions().length(); i++)
{
int condition = metadata.getConditions().get(i).getInt(0);
if (condition == ChunkConditionBar.CONDITION_MESSAGE)
hasMessages = true;
else if (condition == ChunkConditionBar.CONDITION_WARNING)
hasWarnings = true;
}
}
if (hasMessages || hasWarnings)
{
Image condImage = new Image();
if (hasWarnings)
condImage.setResource(new ImageResource2x(ThemeResources.INSTANCE.warningSmall2x()));
else if (hasMessages)
condImage.setResource(new ImageResource2x(ThemeResources.INSTANCE.infoSmall2x()));
condImage.setWidth("8px");
condImage.setHeight("7px");
Style style = condImage.getElement().getStyle();
style.setPosition(Position.ABSOLUTE);
style.setBottom(5, Unit.PX);
style.setRight(5, Unit.PX);
thumbnail_.add(condImage);
}
}
@Override
public Widget thumbnailWidget()
{
return thumbnail_;
}
@Override
public Widget contentWidget()
{
return plot_;
}
@Override
public void onSelected()
{
// no action necessary for plots
}
@Override
public void onEditorThemeChanged(Colors colors)
{
if (conditions_ != null)
conditions_.onEditorThemeChanged(colors);
}
public void updateImageUrl(String url, String pendingStyle)
{
plot_.updateImageUrl(url, pendingStyle);
}
public String plotUrl()
{
return plot_.plotUrl();
}
public Image imageWidget()
{
return plot_.imageWidget();
}
private final ChunkPlotWidget plot_;
private final HTMLPanel thumbnail_;
private ChunkConditionBar conditions_;
}