/* * CompilePdfProgressDialog.java * * Copyright (C) 2009-12 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.common.compilepdf.dialog; import org.rstudio.core.client.CodeNavigationTarget; import org.rstudio.core.client.events.HasSelectionCommitHandlers; import org.rstudio.core.client.events.SelectionCommitHandler; import org.rstudio.core.client.widget.ProgressDialog; import org.rstudio.studio.client.RStudioGinjector; import org.rstudio.studio.client.application.events.EventBus; import org.rstudio.studio.client.common.compile.CompileOutputBuffer; import org.rstudio.studio.client.common.compilepdf.events.CompilePdfOutputEvent; import org.rstudio.studio.client.common.compilepdf.events.CompilePdfErrorsEvent; import org.rstudio.studio.client.common.compilepdf.events.CompilePdfCompletedEvent; import org.rstudio.studio.client.common.compilepdf.model.CompilePdfResult; import org.rstudio.studio.client.common.sourcemarkers.SourceMarker; import org.rstudio.studio.client.common.sourcemarkers.SourceMarkerList; import com.google.gwt.core.client.JsArray; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; public class CompilePdfProgressDialog extends ProgressDialog implements CompilePdfOutputEvent.Handler, CompilePdfErrorsEvent.Handler, CompilePdfCompletedEvent.Handler, HasClickHandlers, HasSelectionCommitHandlers<CodeNavigationTarget> { public CompilePdfProgressDialog() { super("Compiling PDF..."); RStudioGinjector.INSTANCE.injectMembers(this); errorList_ = new SourceMarkerList(); addHandlerRegistration(eventBus_.addHandler( CompilePdfOutputEvent.TYPE, this)); addHandlerRegistration(eventBus_.addHandler( CompilePdfErrorsEvent.TYPE, this)); addHandlerRegistration(eventBus_.addHandler( CompilePdfCompletedEvent.TYPE, this)); } @Inject void initialize(EventBus eventBus) { eventBus_ = eventBus; } @Override public HandlerRegistration addClickHandler(ClickHandler handler) { return stopButton().addClickHandler(handler); } @Override public HandlerRegistration addSelectionCommitHandler( SelectionCommitHandler<CodeNavigationTarget> handler) { return errorList_.addSelectionCommitHandler(handler); } public void dismiss() { closeDialog(); } @Override protected Widget createDisplayWidget(Object param) { container_ = new SimplePanel(); int maxHeight = Window.getClientHeight() - 150; int height = Math.min(500, maxHeight); container_.getElement().getStyle().setHeight(height, Unit.PX); output_ = new CompileOutputBuffer(); container_.setWidget(output_); return container_; } @Override public void onCompilePdfOutput(CompilePdfOutputEvent event) { output_.append(event.getOutput().getOutput()); } @Override public void onCompilePdfErrors(CompilePdfErrorsEvent event) { errors_ = event.getErrors(); } @Override public void onCompilePdfCompleted(CompilePdfCompletedEvent event) { hideProgress(); CompilePdfResult result = event.getResult(); if (result.getSucceeded()) { closeDialog(); } else { // show error list if there are errors String label = "Compile PDF failed"; if (SourceMarker.showErrorList(errors_)) { label += " (double-click to view source location of error)"; errorList_.showMarkers(result.getTargetFile(), null, errors_, SourceMarkerList.AUTO_SELECT_FIRST); container_.setWidget(errorList_); errorList_.focus(); } // update the label and stop button setLabel(label); stopButton().setText("Close"); } } private EventBus eventBus_; private SimplePanel container_; private CompileOutputBuffer output_; private SourceMarkerList errorList_; private JsArray<SourceMarker> errors_; }