/* * SVNCommitDialog.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.commit; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.TextArea; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; import org.rstudio.core.client.StringUtil; import org.rstudio.core.client.widget.ModalDialogBase; import org.rstudio.core.client.widget.SmallButton; import org.rstudio.core.client.widget.ThemedButton; import org.rstudio.studio.client.common.GlobalDisplay; import org.rstudio.studio.client.common.SimpleRequestCallback; import org.rstudio.studio.client.common.console.ConsoleProcess; import org.rstudio.studio.client.common.console.ProcessExitEvent; import org.rstudio.studio.client.common.console.ProcessExitEvent.Handler; import org.rstudio.studio.client.common.vcs.SVNServerOperations; import org.rstudio.studio.client.workbench.model.ClientState; import org.rstudio.studio.client.workbench.model.Session; import org.rstudio.studio.client.workbench.model.helper.StringStateValue; import org.rstudio.studio.client.workbench.views.vcs.common.ChangelistTable; import org.rstudio.studio.client.workbench.views.vcs.common.ConsoleProgressDialog; import org.rstudio.studio.client.workbench.views.vcs.svn.SVNSelectChangelistTablePresenter; public class SVNCommitDialog extends ModalDialogBase { interface Binder extends UiBinder<Widget, SVNCommitDialog> { } @Inject public SVNCommitDialog(SVNServerOperations server, final SVNSelectChangelistTablePresenter changelistPresenter, GlobalDisplay globalDisplay, Session session) { server_ = server; globalDisplay_ = globalDisplay; session_ = session; setText("Commit"); if (commitDraftStateValue_ == null) { commitDraftStateValue_ = new StringStateValue( MODULE_SVN, KEY_COMMIT_MESSAGE, ClientState.PROJECT_PERSISTENT, session.getSessionInfo().getClientState()) { @Override protected void onInit(String value) { commitDraft_ = value; } @Override protected String getValue() { return commitDraft_; } }; } ThemedButton commitButton = new ThemedButton("Commit", new ClickHandler() { public void onClick(ClickEvent event) { attemptCommit(); } }); addButton(commitButton); addCancelButton(); changelist_ = changelistPresenter.getView(); widget_ = GWT.<Binder>create(Binder.class).createAndBindUi(this); widget_.setSize("500px", "400px"); topHPanel_.setCellWidth(selectLabel_, "99%"); topHPanel_.setCellVerticalAlignment(selectLabel_, HorizontalPanel.ALIGN_BOTTOM); topHPanel_.setCellWidth(btnClearSelection_, "1%"); topHPanel_.setCellVerticalAlignment(btnClearSelection_, HorizontalPanel.ALIGN_TOP); topHPanel_.setCellHorizontalAlignment(btnClearSelection_, HorizontalPanel.ALIGN_RIGHT); btnClearSelection_.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { changelistPresenter.clearSelection(); } }); message_.getElement().setAttribute("spellcheck", "false"); if (!StringUtil.isNullOrEmpty(commitDraft_)) message_.setText(commitDraft_); } @Override protected void onLoad() { super.onLoad(); Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { message_.setFocus(true); } }); } @Override protected void onUnload() { super.onUnload(); commitDraft_ = message_.getText(); session_.persistClientState(); } private void attemptCommit() { if (validateInput()) { server_.svnCommit( changelist_.getSelectedPaths(), message_.getText(), new SimpleRequestCallback<ConsoleProcess>("SVN Commit") { private int exitCode_ = 0; @Override public void onResponseReceived(ConsoleProcess cp) { // hide the dialog -- we'll re-show it if the commit fails SVNCommitDialog.this.setVisible(false); // subscribe to process exit so we can record the // exit code and manage the commit draft persistence cp.addProcessExitHandler(new Handler() { @Override public void onProcessExit(ProcessExitEvent event) { // save the exit code so we can use it to decide // whether to become visible or close the dialog // once the console process dialog exits exitCode_ = event.getExitCode(); // We'll set the commitDraft_ on unload, so clear // out the text box now if (exitCode_ == 0) message_.setText(""); } }); // create the console progress dialog and then subscribe // to its onClose event to figure out whether we need // to re-appear or fully close ConsoleProgressDialog dialog = new ConsoleProgressDialog( cp, server_); dialog.addCloseHandler(new CloseHandler<PopupPanel>() { @Override public void onClose(CloseEvent<PopupPanel> event) { if (exitCode_== 0) closeDialog(); else SVNCommitDialog.this.setVisible(true); } }); // show the dialog dialog.showModal(); } }); } } private boolean validateInput() { if (changelist_.getSelectedPaths().size() == 0) { globalDisplay_.showMessage(GlobalDisplay.MSG_WARNING, "No Items Selected", "Please select one or more items to " + "commit.", message_); return false; } // actually validate if (message_.getText().trim().length() == 0) { globalDisplay_.showMessage(GlobalDisplay.MSG_WARNING, "Message Required", "Please provide a commit message.", message_); return false; } return true; } @Override protected Widget createMainWidget() { return widget_; } @UiField(provided = true) ChangelistTable changelist_; @UiField TextArea message_; @UiField HorizontalPanel topHPanel_; @UiField SmallButton btnClearSelection_; @UiField Label selectLabel_; private Widget widget_; private final SVNServerOperations server_; private final GlobalDisplay globalDisplay_; private final Session session_; private static String commitDraft_; private static StringStateValue commitDraftStateValue_; private static final String MODULE_SVN = "svn"; private static final String KEY_COMMIT_MESSAGE = "commitMessage"; }