/*
 * 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.settings.ui;

import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataProvider;
import com.intellij.openapi.project.Project;
import java.awt.LayoutManager;
import javax.annotation.Nullable;
import javax.swing.JPanel;

/**
 * A normal JPanel which implements DataProvider, providing the specified IntelliJ Project.
 *
 * <p>This is used by IntelliJ's action system to determine the relevant project associated with a
 * UI component.
 */
public class JPanelProvidingProject extends JPanel implements DataProvider {

  private final Project project;

  public JPanelProvidingProject(Project project, LayoutManager layoutManager) {
    super(layoutManager);
    this.project = project;
  }

  public JPanelProvidingProject(Project project) {
    super();
    this.project = project;
  }

  @Nullable
  @Override
  public Object getData(String dataId) {
    return CommonDataKeys.PROJECT.is(dataId) ? project : null;
  }
}
