Package org.sylfra.idea.plugins.revu.ui.toolwindow.tree.filters

Source Code of org.sylfra.idea.plugins.revu.ui.toolwindow.tree.filters.AbstractListUiIssueTreeFilter

package org.sylfra.idea.plugins.revu.ui.toolwindow.tree.filters;

import com.intellij.ui.ColoredListCellRenderer;
import com.intellij.ui.SimpleTextAttributes;
import org.jetbrains.annotations.NotNull;
import org.sylfra.idea.plugins.revu.RevuBundle;
import org.sylfra.idea.plugins.revu.model.Issue;
import org.sylfra.idea.plugins.revu.model.Review;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;

/**
* @author <a href="mailto:syllant@gmail.com">Sylvain FRANCOIS</a>
* @version $Id$
*/
public abstract class AbstractListUiIssueTreeFilter<T> extends AbstractIssueTreeFilter<T>
{
  public static final Object ALL_CHOICE = "ALL";
  public static final Object NONE_CHOICE = "NONE";

  private JScrollPane contentPane;
  private JList jList;

  public JComponent buildUI()
  {
    if (contentPane == null)
    {
      jList = new JList();

      jList.addListSelectionListener(new ListSelectionListener()
      {
        public void valueChanged(ListSelectionEvent e)
        {
          fireValueChanged(e, jList.getSelectedValue());
        }
      });

      jList.setCellRenderer(new ColoredListCellRenderer()
      {
        @Override
        protected void customizeCellRenderer(JList list, Object value, int index, boolean selected, boolean hasFocus)
        {
          String text;
          SimpleTextAttributes textAttributes;
          if (value.equals(ALL_CHOICE))
          {
            text = RevuBundle.message("browsing.filter.values.all.text");
            textAttributes = SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES;
          }
          else if (value.equals(NONE_CHOICE))
          {
            text = RevuBundle.message("browsing.filter.values.none.text");
            textAttributes = SimpleTextAttributes.GRAY_ATTRIBUTES;
          }
          else
          {
            textAttributes = SimpleTextAttributes.REGULAR_ATTRIBUTES;
            text = getListItemText((T) value);
          }

          append(text, textAttributes);
        }
      });

      contentPane = new JScrollPane(jList);
    }

    final List<Object> items = retrieveItemsForReview();
    jList.setModel(new AbstractListModel()
    {
      public int getSize()
      {
        return items.size();
      }

      public Object getElementAt(int index)
      {
        return items.get(index);
      }
    });

    if (!items.isEmpty())
    {
      jList.setSelectedIndex(0);
    }

    return contentPane;
  }

  protected List<Object> retrieveItemsForReview()
  {
    Review review = getReview();

    boolean includeNoneValue = false;
    SortedSet<T> set = new TreeSet<T>();
    for (Issue issue : review.getIssues())
    {
      List<T> users = retrieveItemsForIssue(issue);
      if (users.isEmpty())
      {
        includeNoneValue = true;
      }
      for (T user : users)
      {
        set.add(user);
      }
    }

    ArrayList<Object> result = new ArrayList<Object>(set);
    result.add(0, ALL_CHOICE);
    if (includeNoneValue)
    {
      result.add(1, NONE_CHOICE);
    }

    return result;
  }

  @Override
  protected boolean match(Issue issue, T filterValue)
  {
    if (ALL_CHOICE.equals(filterValue))
    {
      return true;
    }

    List<T> items = retrieveItemsForIssue(issue);
    return NONE_CHOICE.equals(filterValue) ? items.isEmpty() : items.contains(filterValue);
  }

  protected abstract List<T> retrieveItemsForIssue(@NotNull Issue issue);

  protected abstract String getListItemText(@NotNull T item);
}
TOP

Related Classes of org.sylfra.idea.plugins.revu.ui.toolwindow.tree.filters.AbstractListUiIssueTreeFilter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.