f97df916144a5217737edb1ceb53a1d6444ca773
[fedora-idea.git] / platform / vcs-impl / src / com / intellij / openapi / vcs / changes / committed / ColumnFilteringStrategy.java
blobf97df916144a5217737edb1ceb53a1d6444ca773
1 /*
2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com.intellij.openapi.vcs.changes.committed;
18 import com.intellij.openapi.vcs.ChangeListColumn;
19 import com.intellij.openapi.vcs.CommittedChangesProvider;
20 import com.intellij.openapi.vcs.VcsBundle;
21 import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList;
22 import com.intellij.ui.ColoredListCellRenderer;
23 import com.intellij.ui.SimpleTextAttributes;
24 import com.intellij.util.ArrayUtil;
25 import com.intellij.util.containers.ContainerUtil;
26 import org.jetbrains.annotations.NotNull;
27 import org.jetbrains.annotations.Nullable;
29 import javax.swing.*;
30 import javax.swing.event.ChangeEvent;
31 import javax.swing.event.ChangeListener;
32 import javax.swing.event.ListSelectionEvent;
33 import javax.swing.event.ListSelectionListener;
34 import java.awt.*;
35 import java.util.ArrayList;
36 import java.util.Collection;
37 import java.util.List;
38 import java.util.TreeSet;
39 import java.util.concurrent.CopyOnWriteArrayList;
41 /**
42 * @author yole
44 public class ColumnFilteringStrategy extends JPanel implements ChangeListFilteringStrategy {
45 private final JList myValueList;
46 private final CopyOnWriteArrayList<ChangeListener> myListeners = ContainerUtil.createEmptyCOWList();
47 private final ChangeListColumn myColumn;
48 private final Class<? extends CommittedChangesProvider> myProviderClass;
50 public ColumnFilteringStrategy(final ChangeListColumn column,
51 final Class<? extends CommittedChangesProvider> providerClass) {
52 setLayout(new BorderLayout());
53 myValueList = new JList();
54 add(new JScrollPane(myValueList));
55 myValueList.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
56 public void valueChanged(final ListSelectionEvent e) {
57 for(ChangeListener listener: myListeners) {
58 listener.stateChanged(new ChangeEvent(this));
61 });
62 myValueList.setCellRenderer(new ColoredListCellRenderer() {
63 protected void customizeCellRenderer(JList list, Object value, int index, boolean selected, boolean hasFocus) {
64 if (index == 0) {
65 append(value.toString(), SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES);
67 else if (value.toString().length() == 0) {
68 append(VcsBundle.message("committed.changes.filter.none"), SimpleTextAttributes.GRAYED_ATTRIBUTES);
70 else {
71 append(value.toString(), SimpleTextAttributes.REGULAR_ATTRIBUTES);
74 });
75 myColumn = column;
76 myProviderClass = providerClass;
79 public String toString() {
80 return myColumn.getTitle();
83 @Override
84 public Dimension getPreferredSize() {
85 return new Dimension(100, 100);
88 @Nullable
89 public JComponent getFilterUI() {
90 return this;
93 public void setFilterBase(List<CommittedChangeList> changeLists) {
94 final Object oldSelection = myValueList.getSelectedValue();
95 final Collection<String> values = new TreeSet<String>();
96 for(CommittedChangeList changeList: changeLists) {
97 if (myProviderClass == null || myProviderClass.isInstance(changeList.getVcs().getCommittedChangesProvider())) {
98 //noinspection unchecked
99 values.add(myColumn.getValue(ReceivedChangeList.unwrap(changeList)).toString());
102 final String[] valueArray = ArrayUtil.toStringArray(values);
103 myValueList.setModel(new AbstractListModel() {
104 public int getSize() {
105 return valueArray.length+1;
108 public Object getElementAt(final int index) {
109 if (index == 0) {
110 return VcsBundle.message("committed.changes.filter.all");
112 return valueArray [index-1];
115 if (oldSelection != null) {
116 myValueList.setSelectedValue(oldSelection, false);
120 public void addChangeListener(final ChangeListener listener) {
121 myListeners.add(listener);
124 public void removeChangeListener(final ChangeListener listener) {
125 myListeners.remove(listener);
128 @NotNull
129 public List<CommittedChangeList> filterChangeLists(List<CommittedChangeList> changeLists) {
130 final Object[] selection = myValueList.getSelectedValues();
131 if (myValueList.getSelectedIndex() == 0 || selection.length == 0) {
132 return changeLists;
134 List<CommittedChangeList> result = new ArrayList<CommittedChangeList>();
135 for(CommittedChangeList changeList: changeLists) {
136 if (myProviderClass == null || myProviderClass.isInstance(changeList.getVcs().getCommittedChangesProvider())) {
137 for(Object value: selection) {
138 //noinspection unchecked
139 if (value.toString().equals(myColumn.getValue(ReceivedChangeList.unwrap(changeList)).toString())) {
140 result.add(changeList);
141 break;
146 return result;