Package timeflow.app.ui.filter

Source Code of timeflow.app.ui.filter.FilterControlPanel$FacetSubpanel

package timeflow.app.ui.filter;

import timeflow.model.*;
import timeflow.app.ui.StatusPanel;
import timeflow.data.db.*;
import timeflow.data.db.filter.*;
import timeflow.data.time.RoughTime;

import timeflow.util.*;

import java.util.*;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import java.awt.*;

public class FilterControlPanel extends ModelPanel
{
  FacetSubpanel inside=new FacetSubpanel();
  SearchPanel searchPanel;
  boolean inverted=false;
  JMenu menuToSyncWith;
 
 
  public FilterControlPanel(TFModel model, JMenu menuToSyncWith)
  {
    super(model);
    this.menuToSyncWith=menuToSyncWith;
    searchPanel=new SearchPanel(model, this);
    setLayout(new BorderLayout());
    setBackground(Color.white);
    JPanel top=new JPanel();
    top.setBackground(Color.white);
    top.setLayout(new BorderLayout());
    top.setBackground(Color.white);
   
    top.add(new StatusPanel(model, this), BorderLayout.NORTH);
    top.add(searchPanel, BorderLayout.CENTER);
 
    add(top, BorderLayout.NORTH);
    add(inside, BorderLayout.CENTER);
  }
 
  void setInverted(boolean inverted)
  {
    this.inverted=inverted;
    makeFilter();
  }
 
  void makeFilter()
  {
    AndFilter filter=new AndFilter();
    String s=searchPanel.entry.getText();
    if (s.length()>0)
      filter.and(new StringMatchFilter(getModel().getDB(), s, true));
    for (FilterDefinitionPanel f: inside.facetTable.values())
      filter.and(f.defineFilter());
    getModel().setFilter(inverted ? new NotFilter(filter) : filter, this);
  }
 
  public void clearFilters()
  {

    searchPanel.entry.setText("");
    for (FilterDefinitionPanel d: inside.facetTable.values())
      d.clearFilter();
    inverted=false;
    searchPanel.invert.setSelected(false);
    for (Field f:getModel().getDB().getFields())
    {
      inside.setFacet(f, false);
    }
    makeFilter();
  }

  @Override
  public void note(TFEvent e) {
    if (e.affectsSchema())
    {
      inside.clearFacets();
      searchPanel.entry.setText("");
    }
  }
 
  public void setFacet(Field field, boolean on)
  {
    inside.setFacet(field, on);
    makeFilter();
  }
 
  class FacetSubpanel extends JPanel
 
   
    ArrayList<Field> facets=new ArrayList<Field>();
    HashMap<Field, FilterDefinitionPanel> facetTable=new HashMap<Field, FilterDefinitionPanel>();   
   
    FacetSubpanel()
    {
      setLayout(null);
      setBackground(Color.white);
    }
   
    FilterDefinitionPanel makePanel(Field field)
    {
      if (field.getType()==Double.class)
      {
        final FilterNumberPanel num=new FilterNumberPanel(field, new Runnable() {
          @Override
          public void run() {
            makeFilter();
          }}, FilterControlPanel.this);
        num.setData(DBUtils.getValues(getModel().getDB(), field));
        return num;
      }
     
      if (field.getType()==RoughTime.class)
      {
        final FilterDatePanel date=new FilterDatePanel(field, new Runnable() {
          @Override
          public void run() {
            makeFilter();
          }}, FilterControlPanel.this);
        date.setData(DBUtils.getValues(getModel().getDB(), field));
        return date;
      }
     
      final FilterCategoryPanel p= new FilterCategoryPanel(field, FilterControlPanel.this);
      p.dataList.addListSelectionListener(new ListSelectionListener() {       
        @Override
        public void valueChanged(ListSelectionEvent e) {
          makeFilter()
        }
      });
      Bag<String> data=DBUtils.countValues(getModel().getDB().all(), field);
      p.setData(data);
      return p;
    }
   
    public void clearFacets()
    {
      removeAll();
      facets.clear();
      facetTable.clear();
      revalidate();
      repaint();
    }
   
    public void setFacet(Field field, boolean on)
    {
      FilterDefinitionPanel panel=facetTable.get(field);
      if (on == (panel!=null))
        return;
      if (on)
      {
        panel=makePanel(field);
        add(panel);
        facets.add(field);
        facetTable.put(field,panel);
      }
      else
      {
        remove(panel);
        facets.remove(field);
        facetTable.remove(field);
      }
     
      doFacetLayout();
      if (menuToSyncWith!=null)
        for (int i=0; i<menuToSyncWith.getItemCount(); i++)
        {
          JCheckBoxMenuItem item=(JCheckBoxMenuItem)menuToSyncWith.getItem(i);
          if (item.getText().equals(field.getName()))
          {
            item.setSelected(on);
          }
        }
      revalidate();
      repaint();
    }
   
    public void setBounds(int x, int y, int w, int h)
    {
      super.setBounds(x,y,w,h);
      doFacetLayout();
    }
   
    void doFacetLayout()
    {
      int w=getSize().width, h=getSize().height;
      int goodSize=0;
      for (Field f: facets)
      {
        FilterDefinitionPanel p=facetTable.get(f);
        goodSize+=p.getPreferredSize().height;
      }
      int top=0;
      for (Field f: facets)
      {
        FilterDefinitionPanel p=facetTable.get(f);
        int pref=p.getPreferredSize().height;
        int panelHeight=(goodSize<= h ? pref : (pref*h)/goodSize);
        p.setBounds(0,top,w,panelHeight);
        top+=panelHeight;
      }
    }
  }
TOP

Related Classes of timeflow.app.ui.filter.FilterControlPanel$FacetSubpanel

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.