blob: 1a9fc4bbdf28e5ddd6acc92d1102af11d7030a5b [file] [log] [blame]
// Copyright (C) 2015 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.client.ui;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.changes.ChangeList;
import com.google.gerrit.client.changes.Util;
import com.google.gerrit.client.info.ChangeInfo;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.extensions.client.ListChangesOption;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
import com.google.gwtexpui.globalkey.client.GlobalKey;
import com.google.gwtexpui.safehtml.client.HighlightSuggestOracle;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public abstract class RebaseDialog extends CommentedActionDialog {
private final SuggestBox base;
private final CheckBox changeParent;
private List<ChangeInfo> candidateChanges;
private final boolean sendEnabled;
public RebaseDialog(final String project, final String branch,
final Change.Id changeId, final boolean sendEnabled) {
super(Util.C.rebaseTitle(), null);
this.sendEnabled = sendEnabled;
sendButton.setText(Util.C.buttonRebaseChangeSend());
// Create the suggestion box to filter over a list of recent changes
// open on the same branch. The list of candidates is primed by the
// changeParent CheckBox (below) getting enabled by the user.
base = new SuggestBox(new HighlightSuggestOracle() {
@Override
protected void onRequestSuggestions(Request request, Callback done) {
String query = request.getQuery().toLowerCase();
List<ChangeSuggestion> suggestions = new ArrayList<>();
for (ChangeInfo ci : candidateChanges) {
if (changeId.equals(ci.legacyId())) {
continue; // do not suggest current change
}
String id = String.valueOf(ci.legacyId().get());
if (id.contains(query) || ci.subject().toLowerCase().contains(query)) {
suggestions.add(new ChangeSuggestion(ci));
if (suggestions.size() >= 50) { // limit to 50 suggestions
break;
}
}
}
done.onSuggestionsReady(request, new Response(suggestions));
}
});
base.getElement().setAttribute("placeholder",
Util.C.rebasePlaceholderMessage());
base.setStyleName(Gerrit.RESOURCES.css().rebaseSuggestBox());
// The changeParent checkbox must be clicked to load into browser memory
// a list of open changes from the same project and same branch that this
// change may rebase onto.
changeParent = new CheckBox(Util.C.rebaseConfirmMessage());
changeParent.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (changeParent.getValue()) {
ChangeList.query(
PageLinks.projectQuery(new Project.NameKey(project))
+ " " + PageLinks.op("branch", branch)
+ " is:open -age:90d",
Collections.<ListChangesOption> emptySet(),
new GerritCallback<ChangeList>() {
@Override
public void onSuccess(ChangeList result) {
candidateChanges = Natives.asList(result);
updateControls(true);
}
@Override
public void onFailure(Throwable err) {
updateControls(false);
changeParent.setValue(false);
super.onFailure(err);
}
});
} else {
updateControls(false);
}
}
});
// add the checkbox and suggestbox widgets to the content panel
contentPanel.add(changeParent);
contentPanel.add(base);
contentPanel.setStyleName(Gerrit.RESOURCES.css().rebaseContentPanel());
}
@Override
public void center() {
super.center();
GlobalKey.dialog(this);
updateControls(false);
}
private void updateControls(boolean changeParentEnabled) {
if (changeParentEnabled) {
sendButton.setTitle(null);
sendButton.setEnabled(true);
base.setEnabled(true);
base.setFocus(true);
} else {
base.setEnabled(false);
sendButton.setEnabled(sendEnabled);
if (sendEnabled) {
sendButton.setTitle(null);
sendButton.setFocus(true);
} else {
sendButton.setTitle(Util.C.rebaseNotPossibleMessage());
cancelButton.setFocus(true);
}
}
}
public String getBase() {
return changeParent.getValue() ? base.getText() : null;
}
private static class ChangeSuggestion implements Suggestion {
private ChangeInfo change;
public ChangeSuggestion(ChangeInfo change) {
this.change = change;
}
@Override
public String getDisplayString() {
return String.valueOf(change.legacyId().get()) + ": " + change.subject();
}
@Override
public String getReplacementString() {
return String.valueOf(change.legacyId().get());
}
}
}