/*
* WorkbenchContext.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;
import org.rstudio.core.client.files.FileSystemItem;
import org.rstudio.studio.client.application.Desktop;
import org.rstudio.studio.client.application.events.EventBus;
import org.rstudio.studio.client.application.events.RVersionsChangedEvent;
import org.rstudio.studio.client.application.events.RestartStatusEvent;
import org.rstudio.studio.client.application.model.RVersionsInfo;
import org.rstudio.studio.client.common.vcs.BranchesInfo;
import org.rstudio.studio.client.workbench.events.BusyEvent;
import org.rstudio.studio.client.workbench.events.BusyHandler;
import org.rstudio.studio.client.workbench.model.Session;
import org.rstudio.studio.client.workbench.model.SessionInfo;
import org.rstudio.studio.client.workbench.views.console.events.WorkingDirChangedEvent;
import org.rstudio.studio.client.workbench.views.console.events.WorkingDirChangedHandler;
import org.rstudio.studio.client.workbench.views.terminal.events.TerminalBusyEvent;
import org.rstudio.studio.client.workbench.views.vcs.git.model.GitState;
import com.google.gwt.user.client.Timer;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
@Singleton
public class WorkbenchContext
{
@Inject
public WorkbenchContext(Session session, EventBus eventBus,
Provider<GitState> pGitState)
{
session_ = session;
pGitState_ = pGitState;
// track current working dir
currentWorkingDir_ = FileSystemItem.home();
defaultFileDialogDir_ = FileSystemItem.home();
eventBus.addHandler(WorkingDirChangedEvent.TYPE,
new WorkingDirChangedHandler() {
@Override
public void onWorkingDirChanged(WorkingDirChangedEvent event)
{
currentWorkingDir_ = FileSystemItem.createDir(event.getPath());
defaultFileDialogDir_ = FileSystemItem.createDir(event.getPath());;
}
});
eventBus.addHandler(BusyEvent.TYPE, new BusyHandler() {
@Override
public void onBusy(BusyEvent event)
{
isServerBusy_ = event.isBusy();
if (Desktop.isDesktop())
Desktop.getFrame().setBusy(isServerBusy_);
}
});
eventBus.addHandler(RestartStatusEvent.TYPE,
new RestartStatusEvent.Handler()
{
@Override
public void onRestartStatus(RestartStatusEvent event)
{
if (event.getStatus() == RestartStatusEvent.RESTART_INITIATED)
isRestartInProgress_ = true;
else if (event.getStatus() == RestartStatusEvent.RESTART_COMPLETED)
{
// clear the restart in progress event after a delay
// (it basically just controls whether errors are displayed
// from get_environment_state, list_packages, etc.). we've
// seen issues where the flag is cleared too soon -- this
// is likely an underlying logic problem in sendPing, but
// we don't want to make a change to that late in the v0.98
// cycle so instead we just delay the setting of the flag
// finding a better solution is tracked in bug #3651
new Timer() {
@Override
public void run()
{
isRestartInProgress_ = false;
}
}.schedule(500);
}
}
});
// track R version info
eventBus.addHandler(RVersionsChangedEvent.TYPE,
new RVersionsChangedEvent.Handler()
{
@Override
public void onRVersionsChanged(RVersionsChangedEvent event)
{
rVersionsInfo_ = event.getRVersionsInfo();
}
});
// track busy terminals
eventBus.addHandler(TerminalBusyEvent.TYPE,
new TerminalBusyEvent.Handler()
{
@Override
public void onTerminalBusy(TerminalBusyEvent event)
{
isTerminalBusy_ = event.isBusy();
}
});
}
public FileSystemItem getCurrentWorkingDir()
{
return currentWorkingDir_;
}
public FileSystemItem getDefaultFileDialogDir()
{
if (defaultFileDialogDir_ != null)
return defaultFileDialogDir_;
else
return getCurrentWorkingDir();
}
public RVersionsInfo getRVersionsInfo()
{
if (rVersionsInfo_ != null)
return rVersionsInfo_;
else
return session_.getSessionInfo().getRVersionsInfo();
}
public void setDefaultFileDialogDir(FileSystemItem dir)
{
defaultFileDialogDir_ = dir;
}
// NOTE: mirrors behavior of rEnvironmentDir in SessionMain.cpp
public String getREnvironmentPath()
{
SessionInfo sessionInfo = session_.getSessionInfo();
if (sessionInfo != null)
{
FileSystemItem rEnvDir = null;
if (getActiveProjectDir() != null)
{
rEnvDir = FileSystemItem.createDir(
sessionInfo.getProjectUserDataDir());
}
else if (sessionInfo.getMode().equals(SessionInfo.DESKTOP_MODE))
{
rEnvDir = currentWorkingDir_;
}
else
{
rEnvDir = FileSystemItem.createDir(
sessionInfo.getInitialWorkingDir());
}
return rEnvDir.completePath(".RData");
}
else
{
return FileSystemItem.home().completePath(".RData");
}
}
public String getActiveProjectFile()
{
return session_.getSessionInfo().getActiveProjectFile();
}
public FileSystemItem getActiveProjectDir()
{
if (activeProjectDir_ == null)
{
SessionInfo sessionInfo = session_.getSessionInfo();
if (sessionInfo != null &&
sessionInfo.getActiveProjectFile() != null)
{
activeProjectDir_ = FileSystemItem.createFile(
sessionInfo.getActiveProjectFile()).getParentPath();
}
}
return activeProjectDir_;
}
public FileSystemItem getDefaultWorkingDir()
{
if (defaultWorkingDir_ == null)
{
SessionInfo sessionInfo = session_.getSessionInfo();
defaultWorkingDir_ = FileSystemItem.createDir(
sessionInfo.getDefaultWorkingDir());
}
return defaultWorkingDir_;
}
public boolean isProjectActive()
{
SessionInfo sessionInfo = session_.getSessionInfo();
return sessionInfo != null && sessionInfo.getActiveProjectFile() != null;
}
public boolean isServerBusy()
{
return isServerBusy_;
}
public boolean isTerminalBusy()
{
return isTerminalBusy_;
}
public boolean isRestartInProgress()
{
return isRestartInProgress_;
}
public boolean isBuildInProgress()
{
return isBuildInProgress_;
}
public void setBuildInProgress(boolean inProgress)
{
isBuildInProgress_ = inProgress;
}
public String createWindowTitle()
{
FileSystemItem projDir = getActiveProjectDir();
if (projDir != null)
{
String title = projDir.getPath();
BranchesInfo branchInfo = pGitState_.get().getBranchInfo();
if (branchInfo != null)
{
String branch = branchInfo.getActiveBranch();
if (branch != null)
title = title + " - " + branch;
}
return title;
}
return null;
}
private boolean isServerBusy_ = false;
private boolean isTerminalBusy_ = false;
private boolean isRestartInProgress_ = false;
private boolean isBuildInProgress_ = false;
private FileSystemItem currentWorkingDir_ = FileSystemItem.home();
private FileSystemItem defaultFileDialogDir_ = FileSystemItem.home();
private FileSystemItem defaultWorkingDir_ = null;
private FileSystemItem activeProjectDir_ = null;
private final Session session_;
private final Provider<GitState> pGitState_;
private RVersionsInfo rVersionsInfo_ = null;
}