blob: 40921309c0bc554f867c33f838bd830292021593 [file] [log] [blame]
// Copyright (C) 2008 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.admin;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.download.DownloadPanel;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.OnEditEnabler;
import com.google.gerrit.client.ui.SmallHeading;
import com.google.gerrit.common.data.ProjectDetail;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand;
import com.google.gerrit.reviewdb.client.InheritedBoolean;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.Project.InheritableBoolean;
import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwtexpui.globalkey.client.NpTextArea;
public class ProjectInfoScreen extends ProjectScreen {
private String projectName;
private Project project;
private LabeledWidgetsGrid grid;
// Section: Project Options
private ListBox requireChangeID;
private ListBox submitType;
private ListBox state;
private ListBox contentMerge;
// Section: Contributor Agreements
private ListBox contributorAgreements;
private ListBox signedOffBy;
private NpTextArea descTxt;
private Button saveProject;
private OnEditEnabler saveEnabler;
public ProjectInfoScreen(final Project.NameKey toShow) {
super(toShow);
projectName = toShow.get();
}
@Override
protected void onInitUI() {
super.onInitUI();
saveProject = new Button(Util.C.buttonSaveChanges());
saveProject.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
doSave();
}
});
add(new ProjectDownloadPanel(projectName, true));
initDescription();
grid = new LabeledWidgetsGrid();
initProjectOptions();
initAgreements();
add(grid);
add(saveProject);
}
@Override
protected void onLoad() {
super.onLoad();
Util.PROJECT_SVC.projectDetail(getProjectKey(),
new ScreenLoadCallback<ProjectDetail>(this) {
public void preDisplay(final ProjectDetail result) {
enableForm(result.canModifyAgreements,
result.canModifyDescription, result.canModifyMergeType, result.canModifyState);
saveProject.setVisible(
result.canModifyAgreements ||
result.canModifyDescription ||
result.canModifyMergeType ||
result.canModifyState);
display(result);
}
});
savedPanel = INFO;
}
private void enableForm(final boolean canModifyAgreements,
final boolean canModifyDescription, final boolean canModifyMergeType,
final boolean canModifyState) {
submitType.setEnabled(canModifyMergeType);
state.setEnabled(canModifyState);
contentMerge.setEnabled(canModifyMergeType);
descTxt.setEnabled(canModifyDescription);
contributorAgreements.setEnabled(canModifyAgreements);
signedOffBy.setEnabled(canModifyAgreements);
requireChangeID.setEnabled(canModifyMergeType);
}
private void initDescription() {
final VerticalPanel vp = new VerticalPanel();
vp.add(new SmallHeading(Util.C.headingDescription()));
descTxt = new NpTextArea();
descTxt.setVisibleLines(6);
descTxt.setCharacterWidth(60);
vp.add(descTxt);
add(vp);
saveEnabler = new OnEditEnabler(saveProject);
saveEnabler.listenTo(descTxt);
}
private void initProjectOptions() {
grid.addHeader(new SmallHeading(Util.C.headingProjectOptions()));
submitType = new ListBox();
for (final Project.SubmitType type : Project.SubmitType.values()) {
submitType.addItem(Util.toLongString(type), type.name());
}
submitType.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
setEnabledForUseContentMerge();
}
});
saveEnabler.listenTo(submitType);
grid.add(Util.C.headingProjectSubmitType(), submitType);
state = new ListBox();
for (final Project.State stateValue : Project.State.values()) {
state.addItem(Util.toLongString(stateValue), stateValue.name());
}
saveEnabler.listenTo(state);
grid.add(Util.C.headingProjectState(), state);
contentMerge = newInheritedBooleanBox();
saveEnabler.listenTo(contentMerge);
grid.add(Util.C.useContentMerge(), contentMerge);
requireChangeID = newInheritedBooleanBox();
saveEnabler.listenTo(requireChangeID);
grid.addHtml(Util.C.requireChangeID(), requireChangeID);
}
private static ListBox newInheritedBooleanBox() {
ListBox box = new ListBox();
for (InheritableBoolean b : InheritableBoolean.values()) {
box.addItem(b.name(), b.name());
}
return box;
}
/**
* Enables the {@link #contentMerge} checkbox if the selected submit type
* allows the usage of content merge.
* If the submit type (currently only 'Fast Forward Only') does not allow
* content merge the useContentMerge checkbox gets disabled.
*/
private void setEnabledForUseContentMerge() {
if (SubmitType.FAST_FORWARD_ONLY.equals(Project.SubmitType
.valueOf(submitType.getValue(submitType.getSelectedIndex())))) {
contentMerge.setEnabled(false);
final InheritedBoolean inheritedBoolean = new InheritedBoolean();
inheritedBoolean.setValue(InheritableBoolean.FALSE);
setBool(contentMerge, inheritedBoolean);
} else {
contentMerge.setEnabled(submitType.isEnabled());
}
}
private void initAgreements() {
grid.addHeader(new SmallHeading(Util.C.headingAgreements()));
contributorAgreements = newInheritedBooleanBox();
if (Gerrit.getConfig().isUseContributorAgreements()) {
saveEnabler.listenTo(contributorAgreements);
grid.add(Util.C.useContributorAgreements(), contributorAgreements);
}
signedOffBy = newInheritedBooleanBox();
saveEnabler.listenTo(signedOffBy);
grid.addHtml(Util.C.useSignedOffBy(), signedOffBy);
}
private void setSubmitType(final Project.SubmitType newSubmitType) {
int index = -1;
if (submitType != null) {
for (int i = 0; i < submitType.getItemCount(); i++) {
if (newSubmitType.name().equals(submitType.getValue(i))) {
index = i;
break;
}
}
submitType.setSelectedIndex(index);
setEnabledForUseContentMerge();
}
}
private void setState(final Project.State newState) {
if (state != null) {
for (int i = 0; i < state.getItemCount(); i++) {
if (newState.name().equals(state.getValue(i))) {
state.setSelectedIndex(i);
break;
}
}
}
}
private void setBool(ListBox box, InheritedBoolean inheritedBoolean) {
int inheritedIndex = -1;
for (int i = 0; i < box.getItemCount(); i++) {
if (box.getValue(i).startsWith(InheritableBoolean.INHERIT.name())) {
inheritedIndex = i;
}
if (box.getValue(i).startsWith(inheritedBoolean.value.name())) {
box.setSelectedIndex(i);
}
}
if (inheritedIndex >= 0) {
if (project.getParent(Gerrit.getConfig().getWildProject()) == null) {
if (box.getSelectedIndex() == inheritedIndex) {
for (int i = 0; i < box.getItemCount(); i++) {
if (box.getValue(i).equals(InheritableBoolean.FALSE.name())) {
box.setSelectedIndex(i);
break;
}
}
}
box.removeItem(inheritedIndex);
} else {
box.setItemText(inheritedIndex, InheritableBoolean.INHERIT.name() + " ("
+ inheritedBoolean.inheritedValue + ")");
}
}
}
private static InheritableBoolean getBool(ListBox box) {
int i = box.getSelectedIndex();
if (i >= 0) {
final String selectedValue = box.getValue(i);
if (selectedValue.startsWith(InheritableBoolean.INHERIT.name())) {
return InheritableBoolean.INHERIT;
}
return InheritableBoolean.valueOf(selectedValue);
}
return InheritableBoolean.INHERIT;
}
void display(final ProjectDetail result) {
project = result.project;
descTxt.setText(project.getDescription());
setBool(contributorAgreements, result.useContributorAgreements);
setBool(signedOffBy, result.useSignedOffBy);
setBool(contentMerge, result.useContentMerge);
setBool(requireChangeID, result.requireChangeID);
setSubmitType(project.getSubmitType());
setState(project.getState());
saveProject.setEnabled(false);
}
private void doSave() {
project.setDescription(descTxt.getText().trim());
project.setUseContributorAgreements(getBool(contributorAgreements));
project.setUseSignedOffBy(getBool(signedOffBy));
project.setUseContentMerge(getBool(contentMerge));
project.setRequireChangeID(getBool(requireChangeID));
if (submitType.getSelectedIndex() >= 0) {
project.setSubmitType(Project.SubmitType.valueOf(submitType
.getValue(submitType.getSelectedIndex())));
}
if (state.getSelectedIndex() >= 0) {
project.setState(Project.State.valueOf(state
.getValue(state.getSelectedIndex())));
}
enableForm(false, false, false, false);
Util.PROJECT_SVC.changeProjectSettings(project,
new GerritCallback<ProjectDetail>() {
public void onSuccess(final ProjectDetail result) {
enableForm(result.canModifyAgreements,
result.canModifyDescription, result.canModifyMergeType, result.canModifyState);
display(result);
}
});
}
public class ProjectDownloadPanel extends DownloadPanel {
public ProjectDownloadPanel(String project, boolean isAllowsAnonymous) {
super(project, null, isAllowsAnonymous);
}
@Override
public void populateDownloadCommandLinks() {
if (!urls.isEmpty()) {
if (allowedCommands.contains(DownloadCommand.CHECKOUT)
|| allowedCommands.contains(DownloadCommand.DEFAULT_DOWNLOADS)) {
commands.add(cmdLinkfactory.new CloneCommandLink());
}
}
}
}
private class LabeledWidgetsGrid extends FlexTable {
private String labelSuffix;
public LabeledWidgetsGrid() {
super();
labelSuffix = ":";
}
private void addHeader(Widget widget) {
int row = getRowCount();
insertRow(row);
setWidget(row, 0, widget);
getCellFormatter().getElement(row, 0).setAttribute("colSpan", "2");
}
private void add(String label, boolean labelIsHtml, Widget widget) {
int row = getRowCount();
insertRow(row);
if (label != null) {
if (labelIsHtml) {
setHTML(row, 0, label + labelSuffix);
} else {
setText(row, 0, label + labelSuffix);
}
}
setWidget(row, 1, widget);
}
public void add(String label, Widget widget) {
add(label, false, widget);
}
public void addHtml(String label, Widget widget) {
add(label, true, widget);
}
}
}