/*
 * Copyright 2000-2009 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 consulo.ide.impl.idea.openapi.vcs.changes.committed;

import consulo.project.Project;
import consulo.versionControlSystem.*;
import consulo.versionControlSystem.change.commited.ChangeListFilteringStrategy;
import consulo.versionControlSystem.change.commited.CommittedChangesFilterKey;

import javax.swing.*;

/**
 * @author yole
 */
public class SelectFilteringAction extends LabeledComboBoxAction {
  private final Project myProject;
  private final CommittedChangesTreeBrowser myBrowser;
  private CommittedChangesFilterKey myPreviousSelection;

  public SelectFilteringAction(final Project project, final CommittedChangesTreeBrowser browser) {
    super(VcsBundle.message("committed.changes.filter.title"));
    myProject = project;
    myBrowser = browser;
    myPreviousSelection = null;
  }

  protected ComboBoxModel createModel() {
    final DefaultComboBoxModel model = new DefaultComboBoxModel(new Object[]{
      ChangeListFilteringStrategy.NONE,
      /*new ColumnFilteringStrategy(ChangeListColumn.NAME, provider.getClass()),*/
      new StructureFilteringStrategy(myProject)
    });
    final AbstractVcs[] vcss = ProjectLevelVcsManager.getInstance(myProject).getAllActiveVcss();
    boolean addNameFilter = false;
    for(AbstractVcs vcs: vcss) {
      final CommittedChangesProvider provider = vcs.getCommittedChangesProvider();
      if (provider != null) {
        addNameFilter = true;
        for(ChangeListColumn column: provider.getColumns()) {
          if (ChangeListColumn.isCustom(column)) {
            model.addElement(new ColumnFilteringStrategy(column, provider.getClass()));
          }
        }
      }
    }
    if (addNameFilter) {
      model.addElement(new ColumnFilteringStrategy(ChangeListColumn.NAME, CommittedChangesProvider.class));
    }
    return model;
  }

  protected void selectionChanged(final Object selection) {
    if (selection == null) return;
    if (myPreviousSelection != null) {
        myBrowser.removeFilteringStrategy(myPreviousSelection);
    }
    final ChangeListFilteringStrategy strategy = (ChangeListFilteringStrategy)selection;
    if (!ChangeListFilteringStrategy.NONE.equals(selection)) {
      myBrowser.setFilteringStrategy(strategy);
    }
    myPreviousSelection = strategy.getKey();
  }
}
