/*
* BuildPane.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.workbench.views.buildtools;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.MenuItem;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import org.rstudio.core.client.CodeNavigationTarget;
import org.rstudio.core.client.events.HasSelectionCommitHandlers;
import org.rstudio.core.client.events.SelectionCommitEvent;
import org.rstudio.core.client.events.SelectionCommitHandler;
import org.rstudio.core.client.resources.ImageResource2x;
import org.rstudio.core.client.widget.CheckableMenuItem;
import org.rstudio.core.client.widget.Toolbar;
import org.rstudio.core.client.widget.ToolbarButton;
import org.rstudio.core.client.widget.ToolbarPopupMenu;
import org.rstudio.studio.client.common.SimpleRequestCallback;
import org.rstudio.studio.client.common.compile.CompileOutput;
import org.rstudio.studio.client.common.compile.CompileOutputBufferWithHighlight;
import org.rstudio.studio.client.common.compile.CompilePanel;
import org.rstudio.studio.client.common.icons.StandardIcons;
import org.rstudio.studio.client.common.sourcemarkers.SourceMarker;
import org.rstudio.studio.client.workbench.commands.Commands;
import org.rstudio.studio.client.workbench.model.Session;
import org.rstudio.studio.client.workbench.model.SessionInfo;
import org.rstudio.studio.client.workbench.ui.WorkbenchPane;
import org.rstudio.studio.client.workbench.views.buildtools.model.BookdownFormats;
import org.rstudio.studio.client.workbench.views.buildtools.model.BuildServerOperations;
public class BuildPane extends WorkbenchPane
implements BuildPresenter.Display
{
@Inject
public BuildPane(Commands commands,
Session session,
BuildServerOperations server)
{
super("Build");
commands_ = commands;
session_ = session;
server_ = server;
compilePanel_ = new CompilePanel(new CompileOutputBufferWithHighlight());
ensureWidget();
}
@Override
protected Toolbar createMainToolbar()
{
Toolbar toolbar = new Toolbar();
SessionInfo sessionInfo = session_.getSessionInfo();
String type = sessionInfo.getBuildToolsType();
boolean pkg = type.equals(SessionInfo.BUILD_TOOLS_PACKAGE);
boolean makefile = type.equals(SessionInfo.BUILD_TOOLS_MAKEFILE);
boolean website = type.equals(SessionInfo.BUILD_TOOLS_WEBSITE);
// always include build all
ToolbarButton buildAllButton = commands_.buildAll().createToolbarButton();
if (website)
{
if (sessionInfo.getBuildToolsBookdownWebsite())
{
buildAllButton.setText("Build Book");
}
else
{
buildAllButton.setText("Build Website");
}
}
toolbar.addLeftWidget(buildAllButton);
// book build menu
if (sessionInfo.getBuildToolsBookdownWebsite())
{
BookdownBuildPopupMenu buildPopupMenu = new BookdownBuildPopupMenu();
ToolbarButton buildMenuButton = new ToolbarButton(buildPopupMenu, true);
toolbar.addLeftWidget(buildMenuButton);
}
toolbar.addLeftSeparator();
// packages get check package
if (pkg)
{
toolbar.addLeftWidget(commands_.checkPackage().createToolbarButton());
toolbar.addLeftSeparator();
}
// create more menu
if (makefile || website || pkg)
{
ToolbarPopupMenu moreMenu = new ToolbarPopupMenu();
if (makefile || website)
{
if (makefile)
moreMenu.addItem(commands_.rebuildAll().createMenuItem(false));
moreMenu.addItem(commands_.cleanAll().createMenuItem(false));
moreMenu.addSeparator();
}
// packages get additional commands
else if (pkg)
{
moreMenu.addItem(commands_.devtoolsLoadAll().createMenuItem(false));
moreMenu.addItem(commands_.rebuildAll().createMenuItem(false));
moreMenu.addSeparator();
moreMenu.addItem(commands_.testPackage().createMenuItem(false));
moreMenu.addSeparator();
moreMenu.addItem(commands_.checkPackage().createMenuItem(false));
moreMenu.addSeparator();
moreMenu.addItem(commands_.buildSourcePackage().createMenuItem(false));
moreMenu.addItem(commands_.buildBinaryPackage().createMenuItem(false));
moreMenu.addSeparator();
moreMenu.addItem(commands_.roxygenizePackage().createMenuItem(false));
moreMenu.addSeparator();
}
moreMenu.addItem(commands_.buildToolsProjectSetup().createMenuItem(false));
// add more menu
ToolbarButton moreButton = new ToolbarButton(
"More",
new ImageResource2x(StandardIcons.INSTANCE.more_actions2x()),
moreMenu);
toolbar.addLeftWidget(moreButton);
}
// connect compile panel
compilePanel_.connectToolbar(toolbar);
return toolbar;
}
class BookdownBuildPopupMenu extends ToolbarPopupMenu
{
@Override
public void getDynamicPopupMenu(final
ToolbarPopupMenu.DynamicPopupMenuCallback callback)
{
clearItems();
server_.getBookdownFormats(new SimpleRequestCallback<BookdownFormats>() {
@Override
public void onResponseReceived(BookdownFormats formats)
{
String defaultFormat = formats.getOutputFormat();
JsArrayString allFormats = formats.getAllOututFormats();
MenuItem allMenu = new FormatMenuItem(
"all", "All Formats", defaultFormat.equals("all"));
addItem(allMenu);
addSeparator();
for (int i = 0; i<allFormats.length(); i++)
{
String format = allFormats.get(i);
addItem(new FormatMenuItem(format,
defaultFormat.equals(format)));
}
callback.onPopupMenu(BookdownBuildPopupMenu.this);
}
});
}
class FormatMenuItem extends CheckableMenuItem
{
public FormatMenuItem(String format, boolean isChecked)
{
this(format, format, isChecked);
}
public FormatMenuItem(String format, String label, boolean isChecked)
{
super(label);
format_ = format;
label_ = label;
isChecked_ = isChecked;
onStateChanged();
}
@Override
public String getLabel()
{
return label_;
}
@Override
public boolean isChecked()
{
return isChecked_;
}
@Override
public void onInvoked()
{
SelectionCommitEvent.fire(buildSubType(), format_);
}
private String format_;
private String label_;
private boolean isChecked_;
}
}
@Override
protected Widget createMainWidget()
{
return compilePanel_;
}
@Override
public void buildStarted()
{
compilePanel_.compileStarted(null);
}
@Override
public void showOutput(CompileOutput output, boolean scrollToBottom)
{
compilePanel_.showOutput(output, scrollToBottom);
}
@Override
public void showErrors(String basePath,
JsArray<SourceMarker> errors,
boolean ensureVisible,
int autoSelect)
{
compilePanel_.showErrors(basePath, errors, autoSelect);
if (ensureVisible && SourceMarker.showErrorList(errors))
ensureVisible();
}
@Override
public void buildCompleted()
{
compilePanel_.compileCompleted();
}
@Override
public HasClickHandlers stopButton()
{
return compilePanel_.stopButton();
}
@Override
public HasSelectionCommitHandlers<CodeNavigationTarget> errorList()
{
return compilePanel_.errorList();
}
@Override
public HasSelectionCommitHandlers<String> buildSubType()
{
return new HasSelectionCommitHandlers<String>() {
@Override
public void fireEvent(GwtEvent<?> event)
{
BuildPane.this.fireEvent(event);
}
@Override
public HandlerRegistration addSelectionCommitHandler(
SelectionCommitHandler<String> handler)
{
return BuildPane.this.addHandler(handler,
SelectionCommitEvent.getType());
}
};
}
@Override
public void scrollToBottom()
{
compilePanel_.scrollToBottom();
}
private Commands commands_;
private Session session_;
private BuildServerOperations server_;
CompilePanel compilePanel_;
}