/* * SVNPresenter.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.vcs.svn; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.dom.client.ContextMenuEvent; import com.google.gwt.event.dom.client.ContextMenuHandler; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; import org.rstudio.core.client.Size; import org.rstudio.core.client.command.CommandBinder; import org.rstudio.core.client.command.Handler; import org.rstudio.core.client.files.FileSystemItem; import org.rstudio.core.client.widget.MessageDialog; import org.rstudio.studio.client.common.GlobalDisplay; import org.rstudio.studio.client.common.satellite.SatelliteManager; import org.rstudio.studio.client.common.vcs.SVNServerOperations; import org.rstudio.studio.client.common.vcs.StatusAndPath; import org.rstudio.studio.client.vcs.VCSApplicationParams; import org.rstudio.studio.client.workbench.WorkbenchView; import org.rstudio.studio.client.workbench.commands.Commands; import org.rstudio.studio.client.workbench.views.vcs.BaseVcsPresenter; import org.rstudio.studio.client.workbench.views.vcs.common.ProcessCallback; import org.rstudio.studio.client.workbench.views.vcs.common.VCSFileOpener; import org.rstudio.studio.client.workbench.views.vcs.common.events.VcsRefreshEvent; import org.rstudio.studio.client.workbench.views.vcs.common.events.VcsRefreshHandler; import org.rstudio.studio.client.workbench.views.vcs.common.model.GitHubViewRequest; import org.rstudio.studio.client.workbench.views.vcs.svn.model.SVNState; import java.util.ArrayList; public class SVNPresenter extends BaseVcsPresenter { public interface Binder extends CommandBinder<Commands, SVNPresenter> { } public interface Display extends WorkbenchView, IsWidget, SVNPresenterDisplay { void setItems(ArrayList<StatusAndPath> items); void showContextMenu(int clientX, int clientY); } @Inject public SVNPresenter(Display view, GlobalDisplay globalDisplay, Binder binder, Commands commands, SVNServerOperations server, SVNState svnState, SatelliteManager satelliteManager, VCSFileOpener vcsFileOpener) { super(view); view_ = view; globalDisplay_ = globalDisplay; server_ = server; svnState_ = svnState; satelliteManager_ = satelliteManager; commandHandler_ = new SVNCommandHandler(view, globalDisplay, commands, server, svnState, vcsFileOpener); binder.bind(commands, this); svnState_.addVcsRefreshHandler(new VcsRefreshHandler() { @Override public void onVcsRefresh(VcsRefreshEvent event) { view_.setItems(svnState_.getStatus()); } }); view_.getChangelistTable().addContextMenuHandler(new ContextMenuHandler(){ @Override public void onContextMenu(ContextMenuEvent event) { NativeEvent nativeEvent = event.getNativeEvent(); view_.showContextMenu(nativeEvent.getClientX(), nativeEvent.getClientY()); } }); } private void showChanges(ArrayList<StatusAndPath> items) { showReviewPane(false, null, items); } private void showReviewPane(boolean showHistory, FileSystemItem historyFileFilter, ArrayList<StatusAndPath> items) { // setup params VCSApplicationParams params = VCSApplicationParams.create( showHistory, historyFileFilter, items); // open the window satelliteManager_.openSatellite("review_changes", params, new Size(1000,1200)); } @Override public Widget asWidget() { return view_.asWidget(); } @Handler void onVcsDiff() { showChanges(view_.getSelectedItems()); } // the following commands are BaseVcsPresenter overrides rather than // direct handlers (they are handled within the base class and then // dispatched to via these overrides) @Override public void onVcsCommit() { commandHandler_.onVcsCommit(); } @Override public void onVcsShowHistory() { showHistory(null); } @Override public void onVcsPull() { commandHandler_.onVcsPull(); } @Override public void onVcsCleanup() { server_.svnCleanup(new ProcessCallback( "SVN Cleanup", "Cleaning up working directory...", 750)); // pad progress for feedback } @Override public void onVcsIgnore() { commandHandler_.onVcsIgnore(); } @Override public void showHistory(FileSystemItem fileFilter) { showReviewPane(true, fileFilter, new ArrayList<StatusAndPath>()); } @Override public void showDiff(FileSystemItem file) { // build an ArrayList<StatusAndPath> so we can call the core helper ArrayList<StatusAndPath> diffList = new ArrayList<StatusAndPath>(); for (StatusAndPath item : svnState_.getStatus()) { if (item.getRawPath().equals(file.getPath())) { diffList.add(item); break; } } if (diffList.size() > 0) { showChanges(diffList); } else { globalDisplay_.showMessage(MessageDialog.INFO, "No Changes to File", "There are no changes to the file \"" + file.getName() + "\" to diff."); } } @Override public void revertFile(FileSystemItem file) { commandHandler_.revertFile(file); } @Override public void onVcsPush() { // git specific, not supported by svn } @Override public void viewOnGitHub(GitHubViewRequest viewRequest) { // git specific, not supported by svn } private final Display view_; private final GlobalDisplay globalDisplay_; private final SVNServerOperations server_; private final SVNCommandHandler commandHandler_; private final SVNState svnState_; private final SatelliteManager satelliteManager_; }