org.eclipse.che.plugin.languageserver.ide.rename.RenameViewImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.che.plugin.languageserver.ide.rename.RenameViewImpl.java

Source

/*
 * Copyright (c) 2012-2018 Red Hat, Inc.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   Red Hat, Inc. - initial API and implementation
 */
package org.eclipse.che.plugin.languageserver.ide.rename;

import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.SplitLayoutPanel;
import elemental.dom.Element;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.eclipse.che.api.languageserver.shared.model.ExtendedTextDocumentEdit;
import org.eclipse.che.api.languageserver.shared.model.ExtendedWorkspaceEdit;
import org.eclipse.che.ide.Resources;
import org.eclipse.che.ide.api.editor.codeassist.AutoCompleteResources;
import org.eclipse.che.ide.api.parts.base.BaseView;
import org.eclipse.che.ide.api.theme.Style;
import org.eclipse.che.ide.ui.SplitterFancyUtil;
import org.eclipse.che.ide.ui.list.SimpleList;
import org.eclipse.che.ide.ui.list.SimpleList.ListEventDelegate;
import org.eclipse.che.ide.ui.list.SimpleList.ListItemRenderer;
import org.eclipse.che.ide.ui.smartTree.NodeLoader;
import org.eclipse.che.ide.ui.smartTree.NodeStorage;
import org.eclipse.che.ide.ui.smartTree.NodeUniqueKeyProvider;
import org.eclipse.che.ide.ui.smartTree.Tree;
import org.eclipse.che.ide.ui.smartTree.data.Node;
import org.eclipse.che.ide.util.dom.Elements;
import org.eclipse.che.plugin.languageserver.ide.LanguageServerLocalization;
import org.eclipse.che.plugin.languageserver.ide.rename.RenameView.ActionDelegate;
import org.eclipse.che.plugin.languageserver.ide.rename.model.RenameProject;
import org.eclipse.che.plugin.languageserver.ide.rename.node.ProjectNode;
import org.eclipse.che.plugin.languageserver.ide.rename.node.RenameNodeFactory;

/**
 * Implementation of the rename view. Presents rename edits as tree of changes: Project-> Folder->
 * File-> Edits
 */
public class RenameViewImpl extends BaseView<ActionDelegate> implements RenameView {

    private final Tree tree;
    private final RenameNodeFactory nodeFactory;
    private SplitLayoutPanel splitLayoutPanel;
    private DockLayoutPanel treeDock;

    private FlowPanel editPanel;

    private SimpleList<String> lsList;
    private Map<String, ExtendedWorkspaceEdit> editMap;
    private String currentLSId;

    @Inject
    public RenameViewImpl(SplitterFancyUtil splitterFancyUtil, Resources coreRes,
            AutoCompleteResources autoCompleteResources, RenameNodeFactory nodeFactory,
            LanguageServerLocalization localization) {
        this.nodeFactory = nodeFactory;
        splitLayoutPanel = new SplitLayoutPanel(1);
        splitLayoutPanel.setSize("100%", "100%");
        editPanel = new FlowPanel();
        splitLayoutPanel.addWest(editPanel, 185);
        setContentWidget(splitLayoutPanel);

        Element itemHolder = Elements.createDivElement();
        itemHolder.setClassName(autoCompleteResources.autocompleteComponentCss().items());
        editPanel.getElement().appendChild(((com.google.gwt.dom.client.Element) itemHolder));

        lsList = SimpleList.create(editPanel.getElement().cast(), editPanel.getElement().cast(), itemHolder,
                coreRes.defaultSimpleListCss(), new ListItemRenderer<String>() {
                    @Override
                    public void render(Element listItemBase, String itemData) {
                        listItemBase.setInnerText(itemData);
                    }
                }, new ListEventDelegate<String>() {
                    @Override
                    public void onListItemClicked(Element listItemBase, String itemData) {
                        selectedEditSet(itemData);
                    }

                    @Override
                    public void onListItemDoubleClicked(Element listItemBase, String itemData) {
                    }
                });
        splitterFancyUtil.tuneSplitter(splitLayoutPanel);
        splitLayoutPanel.setWidgetHidden(editPanel, true);

        treeDock = new DockLayoutPanel(Unit.PX);
        FlowPanel buttonPanel = new FlowPanel();
        treeDock.addSouth(buttonPanel, 25);
        splitLayoutPanel.add(treeDock);

        Button refactorButton = new Button();
        refactorButton.addClickHandler(event -> delegate.applyRename());
        refactorButton.setText(localization.renameViewDoRenameLabel());
        refactorButton.getElement().getStyle().setMarginLeft(1, Unit.EM);
        refactorButton.getElement().getStyle().setBackgroundColor(Style.theme.getPrimaryButtonBackground());

        Button cancelButton = new Button();
        cancelButton.addClickHandler(event -> delegate.cancel());
        cancelButton.setText(localization.renameViewCancelLabel());
        cancelButton.getElement().getStyle().setMarginLeft(1, Unit.EM);

        buttonPanel.add(refactorButton);
        buttonPanel.add(cancelButton);

        NodeStorage storage = new NodeStorage((NodeUniqueKeyProvider) item -> String.valueOf(item.hashCode()));
        NodeLoader loader = new NodeLoader(Collections.emptySet());
        tree = new Tree(storage, loader);
        treeDock.add(tree);
    }

    private void selectedEditSet(String editSetId) {
        if (editSetId.equals(currentLSId)) {
            return;
        }
        if (editMap.containsKey(editSetId)) {
            ExtendedWorkspaceEdit workspaceEdit = editMap.get(editSetId);
            tree.getNodeStorage().clear();
            List<ExtendedTextDocumentEdit> documentChanges = workspaceEdit.getDocumentChanges();
            List<RenameProject> projects = delegate.convert(documentChanges);
            for (RenameProject project : projects) {
                tree.getNodeStorage().add(nodeFactory.create(project));
            }
            tree.expandAll();
        }
    }

    @Override
    public void showRenameResult(Map<String, ExtendedWorkspaceEdit> editMap) {
        if (editMap.size() == 1) {
            splitLayoutPanel.setWidgetHidden(editPanel, true);
        } else {
            splitLayoutPanel.setWidgetHidden(editPanel, false);
        }
        this.editMap = editMap;
        currentLSId = null;
        lsList.render(new ArrayList<>(editMap.keySet()));
        lsList.getSelectionModel().selectNext();
        selectedEditSet(lsList.getSelectionModel().getSelectedItem());
    }

    @Override
    public List<RenameProject> getRenameProjects() {
        List<RenameProject> result = new ArrayList<>();
        List<Node> rootNodes = tree.getRootNodes();
        for (Node node : rootNodes) {
            if (node instanceof ProjectNode) {
                result.add(((ProjectNode) node).getProject());
            }
        }
        return result;
    }
}