/*
* ApplicationWindow.java
*
* Copyright (C) 2009-15 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.application.ui;
import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.*;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.rstudio.core.client.widget.Operation;
import org.rstudio.studio.client.application.ApplicationView;
import org.rstudio.studio.client.application.ui.appended.ApplicationEndedPopupPanel;
import org.rstudio.studio.client.application.ui.serializationprogress.ApplicationSerializationProgress;
import org.rstudio.studio.client.common.GlobalDisplay;
@Singleton
public class ApplicationWindow extends Composite
implements ApplicationView,
RequiresResize,
ProvidesResize
{
@Inject
public ApplicationWindow(ApplicationHeader applicationHeader,
GlobalDisplay globalDisplay,
CodeSearchLauncher launcher)
{
globalDisplay_ = globalDisplay;
// occupy full client area of the window
Window.enableScrolling(false);
Window.setMargin("0px");
// app ui contained within a vertical panel
applicationPanel_ = new LayoutPanel();
// header bar
applicationHeader_ = applicationHeader;
Widget applicationHeaderWidget = applicationHeader_.asWidget();
applicationHeaderWidget.setWidth("100%");
applicationPanel_.add(applicationHeader_);
updateHeaderTopBottom();
applicationHeaderWidget.setVisible(false);
// main view container
initWidget(applicationPanel_);
}
public void showToolbar(boolean showToolbar)
{
applicationHeader_.showToolbar(showToolbar);
updateHeaderTopBottom();
updateWorkbenchTopBottom();
applicationPanel_.forceLayout();
}
public boolean isToolbarShowing()
{
return applicationHeader_.isToolbarVisible();
}
public void showApplicationAgreement(String title,
String contents,
Operation doNotAcceptOperation,
Operation acceptOperation)
{
new ApplicationAgreementDialog(title,
contents,
doNotAcceptOperation,
acceptOperation).showModal();
}
public Widget getWidget()
{
return this ;
}
public void showApplicationQuit()
{
ApplicationEndedPopupPanel.showQuit();
}
public void showApplicationMultiSessionQuit()
{
ApplicationEndedPopupPanel.showMultiSessionQuit();
}
public void showApplicationSuicide(String reason)
{
ApplicationEndedPopupPanel.showSuicide(reason);
}
public void showApplicationDisconnected()
{
ApplicationEndedPopupPanel.showDisconnected();
}
public void showApplicationOffline()
{
ApplicationEndedPopupPanel.showOffline();
}
public void showApplicationUpdateRequired()
{
globalDisplay_.showMessage(
GlobalDisplay.MSG_INFO,
"Application Updated",
"An updated version of RStudio is available. Your browser will " +
"now be refreshed with the new version. All current work and data " +
"will be preserved during the update.",
new Operation() {
public void execute()
{
Window.Location.reload();
}
});
}
public void showWorkbenchView(Widget workbenchScreen)
{
workbenchScreen_ = workbenchScreen;
applicationHeader_.asWidget().setVisible(true);
applicationPanel_.add(workbenchScreen_);
updateWorkbenchTopBottom();
applicationPanel_.setWidgetLeftRight(workbenchScreen_,
COMPONENT_SPACING,
Style.Unit.PX,
COMPONENT_SPACING,
Style.Unit.PX);
}
public void showWarning(boolean severe, String message)
{
if (warningBar_ == null)
{
warningBar_ = new WarningBar();
warningBar_.addCloseHandler(new CloseHandler<WarningBar>()
{
public void onClose(CloseEvent<WarningBar> warningBarCloseEvent)
{
hideWarning();
}
});
applicationPanel_.add(warningBar_);
applicationPanel_.setWidgetBottomHeight(warningBar_,
COMPONENT_SPACING,
Unit.PX,
warningBar_.getHeight(),
Unit.PX);
applicationPanel_.setWidgetLeftRight(warningBar_,
COMPONENT_SPACING, Unit.PX,
COMPONENT_SPACING, Unit.PX);
workbenchBottom_ = COMPONENT_SPACING*2 + warningBar_.getHeight();
if (workbenchScreen_ != null)
updateWorkbenchTopBottom();
applicationPanel_.animate(250);
}
warningBar_.setSeverity(severe);
warningBar_.setText(message);
}
private void updateHeaderTopBottom()
{
int headerHeight = applicationHeader_.getPreferredHeight();
applicationPanel_.setWidgetTopHeight(applicationHeader_,
0,
Style.Unit.PX,
headerHeight,
Style.Unit.PX);
applicationPanel_.setWidgetLeftRight(applicationHeader_,
0,
Style.Unit.PX,
0,
Style.Unit.PX);
}
private void updateWorkbenchTopBottom()
{
applicationPanel_.setWidgetTopBottom(
workbenchScreen_,
applicationHeader_.getPreferredHeight(),
Unit.PX,
workbenchBottom_,
Unit.PX);
}
public void hideWarning()
{
if (warningBar_ != null)
{
applicationPanel_.remove(warningBar_);
warningBar_ = null;
workbenchBottom_ = COMPONENT_SPACING;
if (workbenchScreen_ != null)
updateWorkbenchTopBottom();
applicationPanel_.animate(250);
}
}
public void showSessionAbendWarning()
{
globalDisplay_.showErrorMessage(
"R Session Error",
"The previous R session was abnormally terminated due to " +
"an unexpected crash.\n\n" +
"You may have lost workspace data as a result of this crash.");
}
public void showSerializationProgress(String msg,
boolean modal,
int delayMs,
int timeoutMs)
{
// hide any existing progress
hideSerializationProgress();
// create and show progress
activeSerializationProgress_ =
new ApplicationSerializationProgress(msg, modal, delayMs);
// implement timeout for *this* serialization progress instance if
// requested (check to ensure the same instance because another
// serialization progress could occur in the meantime and we don't
// want to hide it)
if (timeoutMs > 0)
{
final ApplicationSerializationProgress timeoutSerializationProgress =
activeSerializationProgress_;
new Timer() {
@Override
public void run()
{
if (timeoutSerializationProgress == activeSerializationProgress_)
hideSerializationProgress();
}
}.schedule(timeoutMs);
}
}
public void hideSerializationProgress()
{
if (activeSerializationProgress_ != null)
{
activeSerializationProgress_.hide();
activeSerializationProgress_ = null;
}
}
public void onResize()
{
applicationPanel_.onResize();
}
// main application UI components
private LayoutPanel applicationPanel_ ;
private ApplicationHeader applicationHeader_ ;
// active serialization progress message
private ApplicationSerializationProgress activeSerializationProgress_;
private static final int COMPONENT_SPACING = 6;
private Widget workbenchScreen_;
private WarningBar warningBar_;
private int workbenchBottom_ = COMPONENT_SPACING;
private final GlobalDisplay globalDisplay_;
}