com.google.gerrit.client.admin.ProjectInfoScreen.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gerrit.client.admin.ProjectInfoScreen.java

Source

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

    }
}