/*
 * Copyright 2000-2013 JetBrains s.r.o.
 *
 * 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.intellij.dvcs.ui;

import com.intellij.dvcs.DvcsUtil;
import com.intellij.dvcs.repo.Repository;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.util.IconUtil;
import org.jetbrains.annotations.NotNull;

import java.util.List;

public abstract class NewBranchAction<T extends Repository> extends DumbAwareAction {
  protected final List<T> myRepositories;
  protected Project myProject;

  public NewBranchAction(@NotNull Project project, @NotNull List<T> repositories) {
    super("New Branch", "Create and checkout new branch", IconUtil.getAddIcon());
    myRepositories = repositories;
    myProject = project;
  }


  @Override
  public void update(AnActionEvent e) {
    if (DvcsUtil.anyRepositoryIsFresh(myRepositories)) {
      e.getPresentation().setEnabled(false);
      e.getPresentation().setDescription("Checkout of a new branch is not possible before the first commit");
    }
  }

  @Override
  public abstract void actionPerformed(AnActionEvent e);
}
