org.rstudio.studio.client.workbench.views.vcs.dialog.ReviewPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.rstudio.studio.client.workbench.views.vcs.dialog.ReviewPanel.java

Source

/*
 * ReviewPanel.java
 *
 * Copyright (C) 2009-11 by RStudio, Inc.
 *
 * 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.dialog;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Document;
import com.google.gwt.event.dom.client.*;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.resources.client.ImageResource.ImageOptions;
import com.google.gwt.resources.client.ImageResource.RepeatStyle;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.ui.*;
import com.google.inject.Inject;
import org.rstudio.core.client.StringUtil;
import org.rstudio.core.client.ValueSink;
import org.rstudio.core.client.files.FileSystemItem;
import org.rstudio.core.client.widget.*;
import org.rstudio.studio.client.common.filetypes.FileTypeRegistry;
import org.rstudio.studio.client.common.vcs.StatusAndPath;
import org.rstudio.studio.client.workbench.commands.Commands;
import org.rstudio.studio.client.workbench.views.vcs.BranchToolbarButton;
import org.rstudio.studio.client.workbench.views.vcs.ChangelistTable;
import org.rstudio.studio.client.workbench.views.vcs.ChangelistTablePresenter;
import org.rstudio.studio.client.workbench.views.vcs.console.ConsoleBarFramePanel;
import org.rstudio.studio.client.workbench.views.vcs.diff.ChunkOrLine;
import org.rstudio.studio.client.workbench.views.vcs.diff.LineTablePresenter;
import org.rstudio.studio.client.workbench.views.vcs.diff.LineTableView;
import org.rstudio.studio.client.workbench.views.vcs.diff.NavGutter;
import org.rstudio.studio.client.workbench.views.vcs.dialog.ReviewPresenter.Display;

import java.util.ArrayList;

public class ReviewPanel extends Composite implements Display {
    interface Resources extends ClientBundle {
        @Source("ReviewPanel.css")
        Styles styles();

        @ImageOptions(repeatStyle = RepeatStyle.Horizontal)
        @Source("images/toolbarTile.png")
        ImageResource toolbarTile();

        @Source("images/stageAllFiles.png")
        ImageResource stageAllFiles();

        @Source("images/discard.png")
        ImageResource discard();

        @Source("images/ignore.png")
        ImageResource ignore();

        @Source("images/stage.png")
        ImageResource stage();

        @Source("images/splitterTileV.png")
        @ImageOptions(repeatStyle = RepeatStyle.Horizontal)
        ImageResource splitterTileV();

        @Source("images/splitterTileH.png")
        @ImageOptions(repeatStyle = RepeatStyle.Vertical)
        ImageResource splitterTileH();

        @Source("images/blankFileIcon.png")
        ImageResource blankFileIcon();
    }

    interface Styles extends SharedStyles {
        String diffToolbar();

        String stagedLabel();

        String staged();

        String unstaged();

        String diffViewOptions();

        String commitMessage();

        String commitButton();

        String splitPanelCommit();

        String filenameLabel();

        String fileInfoWrapper();

        String fileIcon();
    }

    private static class ClickCommand implements HasClickHandlers, Command {
        @Override
        public void execute() {
            ClickEvent.fireNativeEvent(Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false),
                    this);
        }

        @Override
        public HandlerRegistration addClickHandler(ClickHandler handler) {
            return handlerManager_.addHandler(ClickEvent.getType(), handler);
        }

        @Override
        public void fireEvent(GwtEvent<?> event) {
            handlerManager_.fireEvent(event);
        }

        private final HandlerManager handlerManager_ = new HandlerManager(this);
    }

    private static class ListBoxAdapter implements HasValue<Integer> {
        private ListBoxAdapter(ListBox listBox) {
            listBox_ = listBox;
            listBox_.addChangeHandler(new ChangeHandler() {
                @Override
                public void onChange(ChangeEvent event) {
                    ValueChangeEvent.fire(ListBoxAdapter.this, getValue());
                }
            });
        }

        @Override
        public Integer getValue() {
            return Integer.parseInt(listBox_.getValue(listBox_.getSelectedIndex()));
        }

        @Override
        public void setValue(Integer value) {
            setValue(value, true);
        }

        @Override
        public void setValue(Integer value, boolean fireEvents) {
            String valueStr = value.toString();
            for (int i = 0; i < listBox_.getItemCount(); i++) {
                if (listBox_.getValue(i).equals(valueStr)) {
                    listBox_.setSelectedIndex(i);
                    break;
                }
            }
        }

        @Override
        public HandlerRegistration addValueChangeHandler(ValueChangeHandler<Integer> handler) {
            return handlers_.addHandler(ValueChangeEvent.getType(), handler);
        }

        @Override
        public void fireEvent(GwtEvent<?> event) {
            handlers_.fireEvent(event);
        }

        private final ListBox listBox_;
        private final HandlerManager handlers_ = new HandlerManager(this);
    }

    interface Binder extends UiBinder<Widget, ReviewPanel> {
    }

    @Inject
    public ReviewPanel(ChangelistTablePresenter changelist, LineTableView diffPane,
            ConsoleBarFramePanel consoleBarFramePanel, final Commands commands, FileTypeRegistry fileTypeRegistry,
            BranchToolbarButton branchToolbarButton) {
        fileTypeRegistry_ = fileTypeRegistry;
        splitPanel_ = new SplitLayoutPanel(4);
        splitPanelCommit_ = new SplitLayoutPanel(4);

        commitButton_ = new ThemedButton("Commit");
        commitButton_.addStyleName(RES.styles().commitButton());

        changelist_ = changelist.getView();
        lines_ = diffPane;
        lines_.getElement().setTabIndex(-1);

        Widget widget = GWT.<Binder>create(Binder.class).createAndBindUi(this);
        consoleBarFramePanel.setWidget(widget);

        initWidget(consoleBarFramePanel);

        fileIcon_.setResource(RES.blankFileIcon());
        fileIcon_.addStyleName(RES.styles().fileIcon());

        topToolbar_.addStyleName(RES.styles().toolbar());

        switchViewButton_ = new LeftRightToggleButton("Changes", "History", true);
        topToolbar_.addLeftWidget(switchViewButton_);

        topToolbar_.addLeftWidget(branchToolbarButton);

        stageAllFilesButton_ = topToolbar_
                .addLeftWidget(new ToolbarButton("Stage All Files", RES.stageAllFiles(), (ClickHandler) null));

        topToolbar_.addLeftSeparator();

        ToolbarPopupMenu discardMenu = new ToolbarPopupMenu();
        discardSelectedFiles_ = new ClickCommand();
        discardAllFiles_ = new ClickCommand();
        discardMenu.addItem(new MenuItem("Discard Selected", discardSelectedFiles_));
        discardMenu.addItem(new MenuItem("Discard All Files", discardAllFiles_));
        topToolbar_.addLeftWidget(new ToolbarButton("Discard", RES.discard(), discardMenu));

        topToolbar_.addLeftSeparator();

        ignoreButton_ = topToolbar_.addLeftWidget(new ToolbarButton("Ignore", RES.ignore(), (ClickHandler) null));

        topToolbar_.addRightWidget(
                new ToolbarButton("Refresh", commands.vcsRefresh().getImageResource(), new ClickHandler() {
                    @Override
                    public void onClick(ClickEvent event) {
                        changelist_.showProgress();
                        commands.vcsRefresh().execute();
                    }
                }));

        topToolbar_.addRightSeparator();

        topToolbar_.addRightWidget(
                new ToolbarButton("Pull", commands.vcsPull().getImageResource(), commands.vcsPull()));

        topToolbar_.addRightSeparator();

        topToolbar_.addRightWidget(
                new ToolbarButton("Push", commands.vcsPush().getImageResource(), commands.vcsPush()));

        diffToolbar_.addStyleName(RES.styles().toolbar());
        diffToolbar_.addStyleName(RES.styles().diffToolbar());

        stageAllButton_ = diffToolbar_
                .addLeftWidget(new ToolbarButton("Stage All", RES.stage(), (ClickHandler) null));
        diffToolbar_.addLeftSeparator();
        discardAllButton_ = diffToolbar_
                .addLeftWidget(new ToolbarButton("Discard All", RES.discard(), (ClickHandler) null));

        unstageAllButton_ = diffToolbar_
                .addLeftWidget(new ToolbarButton("Unstage All", RES.discard(), (ClickHandler) null));
        unstageAllButton_.setVisible(false);

        unstagedCheckBox_.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
            @Override
            public void onValueChange(ValueChangeEvent<Boolean> e) {
                ValueChangeEvent.fire(stagedCheckBox_, stagedCheckBox_.getValue());
            }
        });

        stagedCheckBox_.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
            @Override
            public void onValueChange(ValueChangeEvent<Boolean> e) {
                stageAllButton_.setVisible(!e.getValue());
                discardAllButton_.setVisible(!e.getValue());
                unstageAllButton_.setVisible(e.getValue());
                diffToolbar_.invalidateSeparators();
            }
        });

        listBoxAdapter_ = new ListBoxAdapter(contextLines_);

        FontSizer.applyNormalFontSize(commitMessage_);
    }

    @Override
    public HasClickHandlers getSwitchViewButton() {
        return switchViewButton_;
    }

    @Override
    public HasClickHandlers getStageAllFilesButton() {
        return stageAllFilesButton_;
    }

    @Override
    public HasClickHandlers getDiscardSelectedFiles() {
        return discardSelectedFiles_;
    }

    @Override
    public HasClickHandlers getDiscardAllFiles() {
        return discardAllFiles_;
    }

    @Override
    public HasClickHandlers getIgnoreButton() {
        return ignoreButton_;
    }

    @Override
    public HasClickHandlers getStageAllButton() {
        return stageAllButton_;
    }

    @Override
    public HasClickHandlers getDiscardAllButton() {
        return discardAllButton_;
    }

    @Override
    public HasClickHandlers getUnstageAllButton() {
        return unstageAllButton_;
    }

    @Override
    public void setStageButtonLabel(String label) {
        stageAllButton_.setText(label);
    }

    @Override
    public void setDiscardButtonLabel(String label) {
        discardAllButton_.setText(label);
    }

    @Override
    public void setUnstageButtonLabel(String label) {
        unstageAllButton_.setText(label);
    }

    @Override
    public void setFilename(String filename) {
        if (StringUtil.isNullOrEmpty(filename)) {
            filenameLabel_.setText("");
            fileIcon_.setResource(RES.blankFileIcon());
        } else {
            filenameLabel_.setText(filename);
            ImageResource icon = fileTypeRegistry_.getIconForFile(FileSystemItem.createFile(filename));
            fileIcon_.setResource(icon);
        }
    }

    @Override
    public HasText getCommitMessage() {
        return commitMessage_;
    }

    @Override
    public HasClickHandlers getCommitButton() {
        return commitButton_;
    }

    @Override
    public HasValue<Boolean> getCommitIsAmend() {
        return commitIsAmend_;
    }

    @Override
    public ArrayList<String> getSelectedPaths() {
        return changelist_.getSelectedPaths();
    }

    @Override
    public void setSelectedStatusAndPaths(ArrayList<StatusAndPath> selectedPaths) {
        changelist_.setSelectedStatusAndPaths(selectedPaths);
    }

    @Override
    public ArrayList<String> getSelectedDiscardablePaths() {
        return changelist_.getSelectedDiscardablePaths();
    }

    @Override
    public HasValue<Boolean> getStagedCheckBox() {
        return stagedCheckBox_;
    }

    @Override
    public HasValue<Boolean> getUnstagedCheckBox() {
        return unstagedCheckBox_;
    }

    @Override
    public LineTablePresenter.Display getLineTableDisplay() {
        return lines_;
    }

    @Override
    public ChangelistTable getChangelistTable() {
        return changelist_;
    }

    @Override
    public ValueSink<ArrayList<ChunkOrLine>> getGutter() {
        return gutter_;
    }

    @Override
    public HasValue<Integer> getContextLines() {
        return listBoxAdapter_;
    }

    @UiField(provided = true)
    SplitLayoutPanel splitPanel_;
    @UiField(provided = true)
    SplitLayoutPanel splitPanelCommit_;
    @UiField(provided = true)
    ChangelistTable changelist_;
    @UiField(provided = true)
    ThemedButton commitButton_;
    @UiField
    RadioButton stagedCheckBox_;
    @UiField
    RadioButton unstagedCheckBox_;
    @UiField(provided = true)
    LineTableView lines_;
    @UiField
    NavGutter gutter_;
    @UiField
    ListBox contextLines_;
    @UiField
    Toolbar topToolbar_;
    @UiField
    Toolbar diffToolbar_;
    @UiField
    Image fileIcon_;
    @UiField
    Label filenameLabel_;
    @UiField
    TextArea commitMessage_;
    @UiField
    CheckBox commitIsAmend_;

    private ListBoxAdapter listBoxAdapter_;

    private ToolbarButton stageAllFilesButton_;
    private ToolbarButton ignoreButton_;
    private ToolbarButton stageAllButton_;
    private ToolbarButton discardAllButton_;
    private ToolbarButton unstageAllButton_;
    private ClickCommand discardSelectedFiles_;
    private ClickCommand discardAllFiles_;
    private final FileTypeRegistry fileTypeRegistry_;
    private LeftRightToggleButton switchViewButton_;

    private static final Resources RES = GWT.create(Resources.class);
    static {
        RES.styles().ensureInjected();
    }
}