com.google.idea.blaze.base.wizard2.ImportFromWorkspaceProjectViewOption.java Source code

Java tutorial

Introduction

Here is the source code for com.google.idea.blaze.base.wizard2.ImportFromWorkspaceProjectViewOption.java

Source

/*
 * Copyright 2016 The Bazel Authors. All rights reserved.
 *
 * 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.idea.blaze.base.wizard2;

import com.google.common.collect.Lists;
import com.google.idea.blaze.base.model.primitives.WorkspacePath;
import com.google.idea.blaze.base.projectview.ProjectViewStorageManager;
import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
import com.google.idea.blaze.base.ui.BlazeValidationError;
import com.google.idea.blaze.base.ui.BlazeValidationResult;
import com.google.idea.blaze.base.ui.UiUtil;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDialog;
import com.intellij.openapi.fileChooser.FileChooserFactory;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.TextFieldWithStoredHistory;
import java.awt.Dimension;
import java.io.File;
import java.util.List;
import javax.annotation.Nullable;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;

class ImportFromWorkspaceProjectViewOption implements BlazeSelectProjectViewOption {
    private static final String LAST_WORKSPACE_PATH = "import-from-workspace.last-workspace-path";

    final BlazeNewProjectBuilder builder;
    final BlazeWizardUserSettings userSettings;
    final JComponent component;
    final TextFieldWithStoredHistory projectViewPathField;

    ImportFromWorkspaceProjectViewOption(BlazeNewProjectBuilder builder) {
        this.builder = builder;
        this.userSettings = builder.getUserSettings();

        this.projectViewPathField = new TextFieldWithStoredHistory(LAST_WORKSPACE_PATH);
        projectViewPathField.setHistorySize(BlazeNewProjectBuilder.HISTORY_SIZE);
        projectViewPathField.setText(userSettings.get(LAST_WORKSPACE_PATH, ""));

        JButton button = new JButton("...");
        button.addActionListener(action -> chooseWorkspacePath());
        int buttonSize = projectViewPathField.getPreferredSize().height;
        button.setPreferredSize(new Dimension(buttonSize, buttonSize));

        JComponent box = UiUtil.createHorizontalBox(HORIZONTAL_LAYOUT_GAP, new JLabel("Project view:"),
                projectViewPathField, button);
        UiUtil.setPreferredWidth(box, PREFERRED_COMPONENT_WIDTH);
        this.component = box;
    }

    @Override
    public String getOptionName() {
        return "import-from-workspace";
    }

    @Override
    public String getOptionText() {
        return "Import from workspace";
    }

    @Override
    public JComponent getUiComponent() {
        return component;
    }

    @Override
    public BlazeValidationResult validate() {
        if (getProjectViewPath().isEmpty()) {
            return BlazeValidationResult.failure("Workspace path to project view file cannot be empty.");
        }
        List<BlazeValidationError> errors = Lists.newArrayList();
        if (!WorkspacePath.validate(getProjectViewPath(), errors)) {
            return BlazeValidationResult.failure(errors.get(0));
        }
        WorkspacePathResolver workspacePathResolver = builder.getWorkspaceOption().getWorkspacePathResolver();
        File file = workspacePathResolver.resolveToFile(getSharedProjectView());
        if (!file.exists()) {
            return BlazeValidationResult.failure("Project view file does not exist.");
        }

        return BlazeValidationResult.success();
    }

    @Nullable
    @Override
    public WorkspacePath getSharedProjectView() {
        return new WorkspacePath(getProjectViewPath());
    }

    @Override
    public void commit() {
        userSettings.put(LAST_WORKSPACE_PATH, getProjectViewPath());
        projectViewPathField.addCurrentTextToHistory();
    }

    private String getProjectViewPath() {
        return projectViewPathField.getText().trim();
    }

    private void chooseWorkspacePath() {
        FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, false, false)
                .withShowHiddenFiles(true) // Show root project view file
                .withHideIgnored(false).withTitle("Select Project View File")
                .withDescription("Select a project view file to import.")
                .withFileFilter(virtualFile -> ProjectViewStorageManager
                        .isProjectViewFile(new File(virtualFile.getPath())));
        FileChooserDialog chooser = FileChooserFactory.getInstance().createFileChooser(descriptor, null, null);

        WorkspacePathResolver workspacePathResolver = builder.getWorkspaceOption().getWorkspacePathResolver();
        File fileBrowserRoot = builder.getWorkspaceOption().getFileBrowserRoot();
        File startingLocation = fileBrowserRoot;
        String projectViewPath = getProjectViewPath();
        if (!projectViewPath.isEmpty()) {
            // If the user has typed part of the path then clicked the '...', try to start from the
            // partial state
            projectViewPath = StringUtil.trimEnd(projectViewPath, '/');
            if (WorkspacePath.validate(projectViewPath)) {
                File fileLocation = workspacePathResolver.resolveToFile(new WorkspacePath(projectViewPath));
                if (fileLocation.exists() && FileUtil.isAncestor(fileBrowserRoot, fileLocation, true)) {
                    startingLocation = fileLocation;
                }
            }
        }
        VirtualFile toSelect = LocalFileSystem.getInstance().refreshAndFindFileByPath(startingLocation.getPath());
        VirtualFile[] files = chooser.choose(null, toSelect);
        if (files.length == 0) {
            return;
        }
        VirtualFile file = files[0];

        if (!FileUtil.isAncestor(fileBrowserRoot.getPath(), file.getPath(), true)) {
            Messages.showErrorDialog(String.format(
                    "You must choose a project view file under %s. "
                            + "To use an external project view, please use the 'Copy external' option.",
                    fileBrowserRoot.getPath()), "Cannot Use Project View File");
            return;
        }

        String newWorkspacePath = FileUtil.getRelativePath(fileBrowserRoot, new File(file.getPath()));
        projectViewPathField.setText(newWorkspacePath);
    }
}