/* * CompilePanel.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.compile; import org.rstudio.core.client.CodeNavigationTarget; import org.rstudio.core.client.events.HasSelectionCommitHandlers; import org.rstudio.core.client.widget.LeftRightToggleButton; import org.rstudio.core.client.widget.Toolbar; import org.rstudio.core.client.widget.ToolbarButton; import org.rstudio.studio.client.RStudioGinjector; import org.rstudio.studio.client.common.sourcemarkers.SourceMarker; import org.rstudio.studio.client.common.sourcemarkers.SourceMarkerList; import org.rstudio.studio.client.workbench.commands.Commands; import com.google.gwt.core.client.JsArray; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.SimplePanel; public class CompilePanel extends Composite { public CompilePanel() { this(new CompileOutputBuffer()); } public CompilePanel(CompileOutputDisplay outputDisplay) { panel_ = new SimplePanel(); outputDisplay_ = outputDisplay; panel_.setWidget(outputDisplay_.asWidget()); errorList_ = new SourceMarkerList(); initWidget(panel_); } public void connectToolbar(Toolbar toolbar) { Commands commands = RStudioGinjector.INSTANCE.getCommands(); ImageResource stopImage = commands.interruptR().getImageResource(); stopButton_ = new ToolbarButton(stopImage, null); stopButton_.setVisible(false); toolbar.addRightWidget(stopButton_); showOutputButton_ = new LeftRightToggleButton("Output", "Issues", false); showOutputButton_.setVisible(false); showOutputButton_.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { showOutputButton_.setVisible(false); showErrorsButton_.setVisible(true); panel_.setWidget(outputDisplay_.asWidget()); outputDisplay_.scrollToBottom(); } }); toolbar.addRightWidget(showOutputButton_); showErrorsButton_ = new LeftRightToggleButton("Output", "Issues", true); showErrorsButton_.setVisible(false); showErrorsButton_.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { showOutputButton_.setVisible(true); showErrorsButton_.setVisible(false); panel_.setWidget(errorList_); } }); toolbar.addRightWidget(showErrorsButton_); } // NOTE: targetFileName enables optional suppressing of the file // name header in the error list -- it's fine to pass null for this // and in that case there will always be a header public void compileStarted(String targetFileName) { clearAll(); targetFileName_ = targetFileName; showOutputButton_.setVisible(false); showErrorsButton_.setVisible(false); if (canStop_) stopButton_.setVisible(true); } public void clearAll() { targetFileName_ = null; showOutputButton_.setVisible(false); showErrorsButton_.setVisible(false); stopButton_.setVisible(false); outputDisplay_.clear(); errorList_.clear(); panel_.setWidget(outputDisplay_.asWidget()); } public void showOutput(CompileOutput output, boolean scrollToBottom) { switch(output.getType()) { case CompileOutput.kCommand: outputDisplay_.writeCommand(output.getOutput()); break; case CompileOutput.kNormal: outputDisplay_.writeOutput(output.getOutput()); break; case CompileOutput.kError: outputDisplay_.writeError(output.getOutput()); break; } } public void showOutput(String output) { outputDisplay_.writeOutput(output); } public void showErrors(String basePath, JsArray<SourceMarker> errors, int autoSelect) { showErrors(basePath, errors, autoSelect, false); } public void showErrors(String basePath, JsArray<SourceMarker> errors, int autoSelect, boolean alwaysShowList) { errorList_.showMarkers(targetFileName_, basePath, errors, autoSelect); if (alwaysShowList || SourceMarker.showErrorList(errors)) { panel_.setWidget(errorList_); showOutputButton_.setVisible(true); } else { showErrorsButton_.setVisible(true); } } public void scrollToBottom() { outputDisplay_.scrollToBottom(); } public void compileCompleted() { stopButton_.setVisible(false); if (isErrorPanelShowing()) errorList_.focus(); } public HasClickHandlers stopButton() { return stopButton_; } public HasSelectionCommitHandlers<CodeNavigationTarget> errorList() { return errorList_; } public void setCanStop(boolean canStop) { canStop_ = canStop; } private boolean isErrorPanelShowing() { return errorList_.isAttached(); } private String targetFileName_; private ToolbarButton stopButton_; private LeftRightToggleButton showOutputButton_; private LeftRightToggleButton showErrorsButton_; private SimplePanel panel_; private CompileOutputDisplay outputDisplay_; private SourceMarkerList errorList_; private boolean canStop_ = true; }