Advertisement
Guest User

HighlighterExtDemo.java

a guest
Aug 18th, 2014
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 17.02 KB | None | 0 0
  1. /*
  2.   * Created on 06.12.2008
  3.   *
  4.   */
  5.  package org.jdesktop.swingx.demos.highlighterext;
  6.  
  7.  import static org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ;
  8.  
  9.  import java.awt.BorderLayout;
  10.  import java.awt.Color;
  11.  import java.awt.Dimension;
  12.  import java.awt.event.ActionEvent;
  13.  import java.net.URI;
  14.  import java.util.HashMap;
  15.  import java.util.Map;
  16.  import java.util.logging.Logger;
  17.  
  18.  import javax.swing.JButton;
  19.  import javax.swing.JCheckBox;
  20.  import javax.swing.JComponent;
  21.  import javax.swing.JFrame;
  22.  import javax.swing.JPanel;
  23.  import javax.swing.JScrollPane;
  24.  import javax.swing.JTabbedPane;
  25.  import javax.swing.SwingUtilities;
  26.  import javax.swing.table.TableCellRenderer;
  27.  import javax.swing.tree.DefaultTreeModel;
  28.  
  29.  import org.jdesktop.application.Action;
  30.  import org.jdesktop.application.Application;
  31.  import org.jdesktop.beans.AbstractBean;
  32.  import org.jdesktop.beansbinding.BeanProperty;
  33.  import org.jdesktop.beansbinding.BindingGroup;
  34.  import org.jdesktop.beansbinding.Bindings;
  35.  import org.jdesktop.swingx.JXList;
  36.  import org.jdesktop.swingx.JXTable;
  37.  import org.jdesktop.swingx.JXTree;
  38.  import org.jdesktop.swingx.JXTreeTable;
  39.  import org.jdesktop.swingx.decorator.ComponentAdapter;
  40.  import org.jdesktop.swingx.decorator.HighlightPredicate;
  41.  import org.jdesktop.swingx.demos.search.Contributor;
  42.  import org.jdesktop.swingx.demos.search.Contributors;
  43.  import org.jdesktop.swingx.hyperlink.AbstractHyperlinkAction;
  44.  import org.jdesktop.swingx.hyperlink.HyperlinkAction;
  45.  import org.jdesktop.swingx.painter.MattePainter;
  46.  import org.jdesktop.swingx.renderer.DefaultListRenderer;
  47.  import org.jdesktop.swingx.renderer.DefaultTableRenderer;
  48.  import org.jdesktop.swingx.renderer.DefaultTreeRenderer;
  49.  import org.jdesktop.swingx.renderer.HyperlinkProvider;
  50.  import org.jdesktop.swingx.renderer.StringValue;
  51.  import org.jdesktop.swingx.renderer.StringValues;
  52.  import org.jdesktop.swingx.treetable.TreeTableModelAdapter;
  53.  import org.jdesktop.swingx.util.PaintUtils;
  54.  import org.jdesktop.swingxset.util.DemoUtils;
  55.  import org.jdesktop.swingxset.util.RelativePainterHighlighter;
  56.  import org.jdesktop.swingxset.util.RelativePainterHighlighter.NumberRelativizer;
  57.  import org.pushingpixels.trident.Timeline;
  58.  import org.pushingpixels.trident.ease.Spline;
  59.  
  60.  import com.sun.swingset3.DemoProperties;
  61.  
  62.  @DemoProperties(
  63.          value = "Highlighter (extended)",
  64.          category = "Functionality",
  65.          description = "Demonstrates value based highlighting.",
  66.          sourceFiles = {
  67.                  "org/jdesktop/swingx/demos/highlighterext/HighlighterExtDemo.java",
  68.                  "org/jdesktop/swingxset/util/RelativePainterHighlighter.java"
  69.                  }
  70.  )
  71.  
  72.  public class HighlighterExtDemo extends JPanel {
  73.      @SuppressWarnings("unused")
  74.      private static final Logger LOG = Logger.getLogger(HighlighterExtDemo.class
  75.              .getName());
  76.  
  77.      private Contributors contributors;
  78.      private JXTreeTable treeTable;
  79.      private JXTree tree;
  80.      private JXList list;
  81.      private JXTable table;
  82.      private JCheckBox extendedMarkerBox;
  83.      private JButton raceButton;
  84.      private String[] keys = {"name", "date", "merits", "email"};
  85.      private Map<String, StringValue> stringValues;
  86.      private int meritColumn = 2;
  87.      private HighlighterControl highlighterControl;
  88.      private JButton fadeInButton;
  89.  
  90.      
  91.      public HighlighterExtDemo() {
  92.          super(new BorderLayout());
  93.          initComponents();
  94.          Application.getInstance().getContext().getResourceMap(getClass()).injectComponents(this);
  95.          bind();
  96.          // simple setup of per-column renderers, so can do only after binding
  97.          installRenderers();
  98.      }
  99.  
  100.      //----------------------- bind    
  101.      /**
  102.       *  
  103.       */
  104.      private void bind() {
  105.          // set the models
  106.          contributors = new Contributors();
  107.          table.setModel(contributors.getTableModel());
  108.          list.setModel(contributors.getListModel());
  109.          tree.setModel(new DefaultTreeModel(contributors.getRootNode()));
  110.          treeTable.setTreeTableModel(new TreeTableModelAdapter(
  111.                  tree.getModel(), contributors.getContributorNodeModel()));
  112.          // init highlighter control
  113.          highlighterControl = new HighlighterControl();  
  114.          raceButton.setAction(getAction("race"));
  115.          fadeInButton.setAction(getAction("fadeIn"));
  116.      }
  117.      
  118.      @Action  
  119.      public void race() {
  120.          highlighterControl.race();
  121.      }
  122.      
  123.      @Action  
  124.      public void fadeIn() {
  125.          highlighterControl.fadeIn();
  126.      }
  127.      
  128.      private javax.swing.Action getAction(String string) {
  129.          return Application.getInstance().getContext().getActionMap(this).get(string);
  130.      }
  131.  
  132.      // <snip> Relativizer
  133.      // implement custom Relativizer class
  134.      public static class MeritRelativizer extends NumberRelativizer {
  135.  
  136.          public MeritRelativizer(int column, boolean spreadColumns,  
  137.                  Number max, Number current) {
  138.              super(column, spreadColumns, max, current);
  139.          }
  140.  
  141.          // custom mapping of content to a Number
  142.          @Override
  143.          protected Number getNumber(ComponentAdapter adapter) {
  144.              if (!(adapter.getValue(getValueColumn()) instanceof Contributor)) {
  145.                  return null;
  146.              }
  147.              return ((Contributor) adapter.getValue(getValueColumn())).getMerits();
  148.          }
  149.          // </snip>
  150.          
  151.      }
  152.      
  153.      public class HighlighterControl extends AbstractBean {
  154.          
  155.          private RelativePainterHighlighter tableValueBasedHighlighter;
  156.          private boolean spreadColumns;
  157.          private RelativePainterHighlighter valueBasedHighlighter;
  158.          
  159.          private Timeline raceTimeline;
  160.          private Timeline fadeInTimeline;
  161.          private MattePainter matte;
  162.          private Color base = PaintUtils.setSaturation(Color.MAGENTA, .7f);
  163.          
  164.          public HighlighterControl() {
  165.              matte = new MattePainter(PaintUtils.setAlpha(base, 125));
  166.              tableValueBasedHighlighter = new RelativePainterHighlighter(matte);
  167.              table.addHighlighter(tableValueBasedHighlighter);
  168.              treeTable.addHighlighter(tableValueBasedHighlighter);
  169.  
  170.              valueBasedHighlighter = new RelativePainterHighlighter(matte);
  171.              list.addHighlighter(valueBasedHighlighter);
  172.              tree.addHighlighter(valueBasedHighlighter);
  173.              
  174.              setSpreadColumns(false);
  175.              
  176.              BindingGroup group = new BindingGroup();
  177.              group.addBinding(Bindings.createAutoBinding(READ,  
  178.                      extendedMarkerBox, BeanProperty.create("selected"),
  179.                      this, BeanProperty.create("spreadColumns")));
  180.              group.bind();
  181.          }
  182.  
  183.          // PENDING JW: how-to find the resource of this action for injection?
  184.          @Action
  185.          public void race() {
  186.              if (raceTimeline == null) {
  187.                  raceTimeline = new Timeline(this);
  188.                  raceTimeline.addPropertyToInterpolate("currentMerit", 0, 100);
  189.              }
  190.              raceTimeline.replay();
  191.          }
  192.          
  193.          @Action
  194.          public void fadeIn() {
  195.              if (fadeInTimeline == null) {
  196.                  fadeInTimeline = new Timeline(this);
  197.                  fadeInTimeline.addPropertyToInterpolate("background",  
  198.                          PaintUtils.setAlpha(base, 0), PaintUtils.setAlpha(base, 125));
  199.                  fadeInTimeline.setDuration(2000);
  200.                  fadeInTimeline.setEase(new Spline(0.7f));
  201.              }
  202.              fadeInTimeline.replay();
  203.          }
  204.          
  205.          public void setBackground(Color color) {
  206.              matte.setFillPaint(color);
  207.          }
  208.          
  209.          public void setCurrentMerit(int merit) {
  210.              MeritRelativizer relativizer = createMeritRelativizer(merit);
  211.              tableValueBasedHighlighter.setRelativizer(relativizer);
  212.              valueBasedHighlighter.setRelativizer(relativizer);
  213.          }
  214.  
  215.  
  216.          /**
  217.           * Creates and returns a relativizer with the given intermediate value.
  218.           *  
  219.           */
  220.          private MeritRelativizer createMeritRelativizer(int intermediate) {
  221.              return new MeritRelativizer(meritColumn, isSpreadColumns(), 100, intermediate);
  222.          }
  223.          
  224.          /**
  225.           *  
  226.           */
  227.          private void updateTableHighlighter() {
  228.              tableValueBasedHighlighter.setRelativizer(createMeritRelativizer(100));
  229.              valueBasedHighlighter.setRelativizer(
  230.                      tableValueBasedHighlighter.getRelativizer());
  231.              if (isSpreadColumns()) {
  232.                  tableValueBasedHighlighter.setHighlightPredicate(HighlightPredicate.ALWAYS);
  233.              } else {
  234.                  tableValueBasedHighlighter.setHighlightPredicate(
  235.                          new HighlightPredicate.ColumnHighlightPredicate(meritColumn));
  236.              }    
  237.          }
  238.  
  239.          public boolean isSpreadColumns() {
  240.              return spreadColumns;
  241.          }
  242.          
  243.          public void setSpreadColumns(boolean extendedMarker) {
  244.              boolean old = isSpreadColumns();
  245.              this.spreadColumns = extendedMarker;
  246.              updateTableHighlighter();
  247.              firePropertyChange("spreadColumns", old, isSpreadColumns());
  248.          }
  249.  
  250.      }
  251.  
  252.  //---------------------- renderers
  253.      
  254.  
  255.      /**
  256.       * Install renderers which use the prepared string representations.
  257.       * Note: this method is called after the binding (aka: attach models)
  258.       * because it installs per-column renderers which in this setup can be done only  
  259.       * after the columns are created.  
  260.       */
  261.      private void installRenderers() {
  262.          initStringRepresentation();
  263.          StringValue sv = stringValues.get("name");
  264.          table.setDefaultRenderer(Contributor.class, new DefaultTableRenderer(sv));
  265.          list.setCellRenderer(new DefaultListRenderer(sv));
  266.          tree.setCellRenderer(new DefaultTreeRenderer(sv));
  267.          treeTable.setTreeCellRenderer(new DefaultTreeRenderer(sv));
  268.          
  269.          for (int i = 1; i < keys.length; i++) {
  270.              installColumnRenderers(i, new DefaultTableRenderer(stringValues.get(keys[i])));
  271.          }
  272.          // <snip> Unrelated, just for fun: Hyperlink  
  273.          // Use a hyperlinkRenderer for the email column
  274.          HyperlinkProvider provider = new HyperlinkProvider(new ContributorMailAction(
  275.                  stringValues.get("email")));
  276.          installColumnRenderers(keys.length - 1, new DefaultTableRenderer(provider));
  277.          table.getColumnExt(keys.length - 1).setToolTipText(
  278.                  "Note: the mail-to action will do nothing in security restricted environments");
  279.          // </snip>
  280.          table.packAll();
  281.      }
  282.  
  283.      private void installColumnRenderers(int column, TableCellRenderer renderer) {
  284.          if (column >= table.getColumnCount()) return;
  285.          table.getColumn(column).setCellRenderer(renderer);
  286.          treeTable.getColumn(column).setCellRenderer(renderer);
  287.      }
  288.  
  289.      /**
  290.       * Prepare different String representations.
  291.       */
  292.      private void initStringRepresentation() {
  293.          stringValues = new HashMap<String, StringValue>();
  294.          StringValue nameValue = new StringValue() {
  295.  
  296.              public String getString(Object value) {
  297.                  if (value instanceof Contributor) {
  298.                      Contributor c = (Contributor) value;
  299.                      return c.getLastName() + ", " + c.getFirstName();
  300.                  }
  301.                  return StringValues.TO_STRING.getString(value);
  302.              }
  303.              
  304.          };
  305.          stringValues.put("name", nameValue);
  306.  
  307.          // show the joined date
  308.          StringValue dateValue = new StringValue() {
  309.  
  310.              @Override
  311.              public String getString(Object value) {
  312.                  if (value instanceof Contributor) {
  313.                      return StringValues.DATE_TO_STRING.getString(
  314.                              ((Contributor) value).getJoinedDate());
  315.                  }
  316.                  return StringValues.TO_STRING.getString(value);
  317.              }
  318.              
  319.          };
  320.          stringValues.put("date", dateValue);
  321.          
  322.          // show the merits
  323.          StringValue meritValue = new StringValue() {
  324.  
  325.              @Override
  326.              public String getString(Object value) {
  327.                  if (value instanceof Contributor) {
  328.                      return StringValues.NUMBER_TO_STRING.getString(
  329.                              ((Contributor) value).getMerits());
  330.                  }
  331.                  return StringValues.TO_STRING.getString(value);
  332.              }
  333.              
  334.          };
  335.          stringValues.put("merits", meritValue);
  336.          // <snip> Unrelated, just for fun: Hyperlink  
  337.          // string representation of contributor's email
  338.          StringValue emailValue = new StringValue() {
  339.  
  340.              @Override
  341.              public String getString(Object value) {
  342.                  if (value instanceof Contributor) {
  343.                      URI mail = ((Contributor) value).getEmail();
  344.                      // strip mailto:
  345.                      String path = mail.toString();
  346.                      return path.replace("mailto:", "");
  347.                  }
  348.                  return StringValues.EMPTY.getString(value);
  349.              }
  350.              
  351.          };
  352.          // </snip>
  353.          stringValues.put("email", emailValue);
  354.  
  355.      }
  356.  
  357.      // <snip> Unrelated, just for fun: Hyperlink  
  358.      // custom hyperlink action which delegates to Desktop  
  359.      public static class ContributorMailAction extends AbstractHyperlinkAction<Contributor> {
  360.          HyperlinkAction browse = HyperlinkAction.createHyperlinkAction(null,
  361.                  java.awt.Desktop.Action.MAIL);
  362.  
  363.          StringValue sv;
  364.          
  365.          public ContributorMailAction(StringValue sv) {
  366.              this.sv = sv;
  367.          }
  368.          
  369.          @Override
  370.          protected void installTarget() {
  371.              if (sv == null) return;
  372.              // configure the name based on the StringValue
  373.              setName(sv.getString(getTarget()));
  374.          }
  375.  
  376.          @Override
  377.          public void actionPerformed(ActionEvent e) {
  378.              if (target == null) return;
  379.              browse.setTarget(target.getEmail());
  380.              browse.actionPerformed(null);
  381.          }
  382.          // </snip>
  383.      }
  384.      
  385.  //------------------ init ui
  386.      
  387.      private void initComponents() {
  388.          setLayout(new BorderLayout());
  389.          
  390.          table = new JXTable();
  391.          list = new JXList(true);
  392.          tree = new JXTree();
  393.          treeTable = new JXTreeTable();
  394.          
  395.          table.setColumnControlVisible(true);
  396.          treeTable.setColumnControlVisible(true);
  397.  
  398.          JTabbedPane tab = new JTabbedPane();
  399.          addTab(tab, table, "tableTabTitle", true);
  400.          addTab(tab, list, "listTabTitle", true);
  401.  //        addTab(tab, tree, "HighlighterExtDemo.tree", true);
  402.  //        addTab(tab, treeTable, "HighlighterExtDemo.treeTable", true);
  403.          add(tab);
  404.          
  405.          extendedMarkerBox = new JCheckBox();
  406.          extendedMarkerBox.setName("extendedMarkerBox");
  407.          raceButton = new JButton();
  408.          raceButton.setName("playButton");
  409.          fadeInButton = new JButton();
  410.          fadeInButton.setName("fadeInButton");
  411.          
  412.          JPanel control = new JPanel();
  413.          control.add(extendedMarkerBox);
  414.          control.add(raceButton);
  415.          control.add(fadeInButton);
  416.          add(control, BorderLayout.SOUTH);
  417.      }
  418.  
  419.      private void addTab(JTabbedPane tab, JComponent comp, String string, boolean createScroll) {
  420.          String name = DemoUtils.getResourceString(getClass(), string);
  421.          tab.addTab(name, createScroll ? new JScrollPane(comp) : comp);
  422.      }
  423.      
  424.      /**
  425.       * main method allows us to run as a standalone demo.
  426.       */
  427.      public static void main(String[] args) {
  428.          SwingUtilities.invokeLater(new Runnable() {
  429.              public void run() {
  430.                  JFrame frame = new JFrame(HighlighterExtDemo.class.getAnnotation(DemoProperties.class).value());
  431.                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  432.                  frame.getContentPane().add(new HighlighterExtDemo());
  433.                  frame.setPreferredSize(new Dimension(800, 600));
  434.                  frame.pack();
  435.                  frame.setLocationRelativeTo(null);
  436.                  frame.setVisible(true);
  437.              }
  438.          });
  439.      }
  440.  
  441.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement