| // 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); |
| } |
| |
| } |
| } |