Changeset 3004 for trunk


Ignore:
Timestamp:
07/20/07 15:32:36 (13 years ago)
Author:
curtis
Message:

Some work on cache GUI component (not finished yet).

Location:
trunk/loci/formats
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/cache/Cache.java

    r3003 r3004  
    286286          ru.setVar("axes", new String[] {"Z", "C", "T"}); 
    287287          ru.setVar("id", id); 
    288           ru.exec("widget = new CacheComponent(cache, doSource, axes, id)"); 
     288          ru.exec("widget = new CacheComponent(cache, axes, id)"); 
    289289          ru.setVar("frame", frame); 
    290290          ru.exec("frame.setContentPane(widget)"); 
  • trunk/loci/formats/gui/CacheComponent.java

    r3003 r3004  
    77import com.jgoodies.forms.layout.*; 
    88import java.awt.event.*; 
    9 import java.util.Vector; 
    109import javax.swing.*; 
    1110import javax.swing.event.*; 
     
    1514/** GUI component for managing a cache. */ 
    1615public class CacheComponent extends JPanel 
    17   implements ActionListener, ChangeListener 
     16  implements ActionListener, CacheListener, ChangeListener 
    1817{ 
    1918 
    2019  // -- Constants -- 
    2120 
     21  protected static final String[] SOURCES = 
     22    {"Byte arrays", "BufferedImages", "ImageProcessors"}; 
    2223  protected static final String[] STRATEGIES = {"Crosshair", "Rectangle"}; 
    2324  protected static final String[] PRIORITIES = 
    24     {"maximum", "high", "normal", "low", "minimum"}; 
    25   protected static final String[] ORDER = {"centered", "forward", "backward"}; 
     25    {"Maximum", "High", "Normal", "Low", "Minimum"}; 
     26  protected static final String[] ORDERS = {"Centered", "Forward", "Backward"}; 
    2627 
    2728  // -- Fields -- 
     
    3031  private Cache cache; 
    3132 
    32   /** File that the cache is working with. */ 
     33  /** Spinners for choosing range of slices to cache. */ 
     34  private JSpinner[] range; 
     35 
     36  /** Combo boxes for choosing axis priority. */ 
     37  private JComboBox[] priority; 
     38 
     39  /** Combo boxes for choosing planar ordering. */ 
     40  private JComboBox[] order; 
     41 
     42  /** File that the cache is working with (debugging only). */ 
    3343  private String file; 
    3444 
    35   /** Spinners for choosing range of slices to cache. */ 
    36   private Vector range; 
    37  
    38   /** Buttons for choosing axis priority. */ 
    39   private JRadioButton[][] priority; 
    40  
    41   // -- Constructor -- 
    42  
    43   public CacheComponent(Cache cache, boolean doSource, String[] axisLabels, 
    44     String file) 
    45   { 
     45  // -- Constructors -- 
     46 
     47  public CacheComponent(Cache cache, String[] axisLabels) { 
     48    this(cache, axisLabels, null); 
     49  } 
     50 
     51  public CacheComponent(Cache cache, String[] axisLabels, String file) { 
    4652    super(); 
    4753    this.cache = cache; 
     
    5258    CellConstraints cc = new CellConstraints(); 
    5359 
    54     range = new Vector(); 
    55  
    5660    JPanel top = new JPanel(); 
    5761    FormLayout layout = new FormLayout("pref,3dlu,pref:grow", 
    58       doSource ? "pref:grow,3dlu,pref:grow" : "pref:grow"); 
     62      file == null ? "pref:grow" : "pref:grow,3dlu,pref:grow"); 
    5963    top.setLayout(layout); 
     64 
     65    int col = 1, row = 1; 
    6066 
    6167    // add source choices, if desired 
    6268    JComboBox sourceChooser = null; 
    63     if (doSource) { 
     69    if (file != null) { 
    6470      JLabel label = new JLabel("Objects to cache: "); 
    65       top.add(label, cc.xy(1, 1)); 
    66       String[] sources = 
    67         new String[] {"byte arrays", "BufferedImages", "ImageProcessors"}; 
    68       sourceChooser = new JComboBox(sources); 
     71      sourceChooser = new JComboBox(SOURCES); 
    6972      sourceChooser.setActionCommand("source"); 
    7073      sourceChooser.addActionListener(this); 
    71       top.add(sourceChooser, cc.xy(3, 1)); 
     74 
     75      col = 1; 
     76      top.add(label, cc.xy(col, row)); 
     77      col += 2; 
     78      top.add(sourceChooser, cc.xy(col, row)); 
     79      row += 2; 
    7280    } 
    7381 
    7482    // add strategy choices 
    7583    JLabel label = new JLabel("Caching strategy: "); 
    76     top.add(label, cc.xy(1, doSource ? 3 : 1)); 
    7784    JComboBox strategyChooser = new JComboBox(STRATEGIES); 
    7885    strategyChooser.setActionCommand("strategy"); 
    7986    strategyChooser.addActionListener(this); 
    80     top.add(strategyChooser, cc.xy(3, doSource ? 3 : 1)); 
    81     add(top); 
     87 
     88    col = 1; 
     89    top.add(label, cc.xy(col, row)); 
     90    col += 2; 
     91    top.add(strategyChooser, cc.xy(col, row)); 
     92    row += 2; 
    8293 
    8394    // add cache size choices 
    8495 
    85     JPanel middle = new JPanel(); 
     96    JPanel bottom = new JPanel(); 
    8697    StringBuffer rows = new StringBuffer(); 
    8798    rows.append("pref:grow"); 
     
    90101      "pref:grow,3dlu,pref:grow,3dlu,pref:grow,3dlu,pref:grow", 
    91102      rows.toString()); 
    92     middle.setLayout(layout); 
    93  
    94     middle.add(new JLabel("Axis"), cc.xy(1, 1)); 
    95     middle.add(new JLabel("Range"), cc.xy(3, 1)); 
    96     middle.add(new JLabel("Priority"), cc.xy(5, 1)); 
    97     middle.add(new JLabel("Order"), cc.xy(7, 1)); 
     103    bottom.setLayout(layout); 
     104 
     105    col = row = 1; 
     106    bottom.add(new JLabel("Axis"), cc.xy(col, row)); 
     107    col += 2; 
     108    bottom.add(new JLabel("Range"), cc.xy(col, row)); 
     109    col += 2; 
     110    bottom.add(new JLabel("Priority"), cc.xy(col, row)); 
     111    col += 2; 
     112    bottom.add(new JLabel("Order"), cc.xy(col, row)); 
     113    row += 2; 
    98114 
    99115    int[] lengths = cache.getStrategy().getLengths(); 
     116 
     117    range = new JSpinner[lengths.length]; 
     118    priority = new JComboBox[lengths.length]; 
     119    order = new JComboBox[lengths.length]; 
     120 
    100121    for (int i=0; i<axisLabels.length; i++) { 
    101122      JLabel l = new JLabel(axisLabels[i]); 
    102       middle.add(l, cc.xy(1, i*2 + 3)); 
    103       JSpinner r = new JSpinner(new SpinnerNumberModel(1, 0, lengths[i], 1)); 
    104       middle.add(r, cc.xy(3, i*2 + 3)); 
    105       range.add(r); 
    106       JComboBox prio = new JComboBox(PRIORITIES); 
    107       prio.setSelectedIndex(PRIORITIES.length / 2); 
    108       middle.add(prio, cc.xy(5, i*2 + 3)); 
    109       JComboBox ord = new JComboBox(ORDER); 
    110       middle.add(ord, cc.xy(7, i*2 + 3)); 
    111     } 
    112  
    113     add(middle); 
    114  
    115     if (sourceChooser != null) updateSource(sourceChooser); 
    116     updateStrategy(strategyChooser); 
    117  
    118     JButton reset = new JButton("Reset"); 
    119     reset.setActionCommand("reset"); 
    120     reset.addActionListener(this); 
    121     add(reset); 
     123      range[i] = new JSpinner(new SpinnerNumberModel(0, 0, lengths[i], 1)); 
     124      priority[i] = new JComboBox(PRIORITIES); 
     125      order[i] = new JComboBox(ORDERS); 
     126 
     127      col = 1; 
     128      bottom.add(l, cc.xy(col, row)); 
     129      col += 2; 
     130      bottom.add(range[i], cc.xy(col, row)); 
     131      col += 2; 
     132      bottom.add(priority[i], cc.xy(col, row)); 
     133      col += 2; 
     134      bottom.add(order[i], cc.xy(col, row)); 
     135      row += 2; 
     136 
     137      range[i].addChangeListener(this); 
     138      priority[i].addActionListener(this); 
     139      order[i].addActionListener(this); 
     140    } 
     141 
     142    add(top); 
     143    add(Box.createVerticalStrut(9)); 
     144    add(bottom); 
     145 
     146    cache.addCacheListener(this); 
    122147  } 
    123148 
     
    126151  public Cache getCache() { return cache; } 
    127152 
     153  public void dispose() { 
     154    cache.removeCacheListener(this); 
     155  } 
     156 
    128157  // -- ActionListener API methods -- 
    129158 
     159  /** Handles combo box changes. */ 
    130160  public void actionPerformed(ActionEvent e) { 
    131161    String cmd = e.getActionCommand(); 
    132  
    133     if (cmd.equals("reset")) { 
    134       // TODO - reset to reasonable defaults 
    135     } 
    136     else if (cmd.equals("source")) { 
    137       updateSource((JComboBox) e.getSource()); 
    138     } 
    139     else if (cmd.equals("strategy")) { 
    140       updateStrategy((JComboBox) e.getSource()); 
    141     } 
     162    Object src = e.getSource(); 
     163 
     164    if ("source".equals(cmd)) updateSource((JComboBox) src); 
     165    else if ("strategy".equals(cmd)) updateStrategy((JComboBox) src); 
     166    else { // priority or order change 
     167      for (int i=0; i<priority.length; i++) { 
     168        if (src == priority[i]) { 
     169          updatePriority(i); 
     170          return; 
     171        } 
     172      } 
     173      for (int i=0; i<order.length; i++) { 
     174        if (src == order[i]) { 
     175          updateOrder(i); 
     176          return; 
     177        } 
     178      } 
     179    } 
     180  } 
     181 
     182  // -- CacheListener API methods -- 
     183 
     184  public void cacheUpdated(CacheEvent e) { 
     185    //TODO 
    142186  } 
    143187 
    144188  // -- ChangeListener API methods -- 
    145189 
     190  /** Handles range spinner changes. */ 
    146191  public void stateChanged(ChangeEvent e) { 
    147     // make sure each axis is chosen only once 
    148     for (int ct=0; ct<priority.length; ct++) { 
    149       for (int col=0; col<priority.length; col++) { 
    150         int chosenNdx = -1; 
    151  
    152         for (int row=0; row<priority.length; row++) { 
    153           if (priority[row][col].equals(e.getSource()) && 
    154             priority[row][col].isSelected()) 
    155           { 
    156             chosenNdx = row; 
    157             break; 
    158           } 
    159           else if (priority[row][col].isSelected() && chosenNdx == -1) { 
    160             chosenNdx = row; 
    161           } 
    162         } 
    163  
    164         for (int row=0; row<priority.length; row++) { 
    165           if (priority[row][col].isSelected() && row != chosenNdx) { 
    166             priority[row][(col + 1) % priority.length].setSelected(true); 
    167           } 
    168         } 
    169       } 
    170     } 
    171  
    172     // reset the cache's priorities 
    173     ICacheStrategy strategy = cache.getStrategy(); 
    174  
    175     for (int row=0; row<priority.length; row++) { 
    176       for (int col=0; col<priority.length; col++) { 
    177         if (priority[row][col].isSelected()) { 
    178           strategy.setPriority(row, col); 
    179         } 
    180       } 
    181     } 
    182  
    183     for (int i=0; i<range.size(); i++) { 
    184       JSpinner r = (JSpinner) range.get(i); 
    185       strategy.setRange(((Integer) r.getValue()).intValue(), i); 
     192    Object src = e.getSource(); 
     193    for (int i=0; i<range.length; i++) { 
     194      if (src == range[i]) { 
     195        updateRange(i); 
     196        return; 
     197      } 
    186198    } 
    187199  } 
    188200 
    189201  // -- Helper methods -- 
    190  
    191   private int[] getRange() { 
    192     int[] n = new int[range.size()]; 
    193     for (int i=0; i<n.length; i++) { 
    194       n[i] = ((Integer) ((JSpinner) range.get(i)).getValue()).intValue(); 
    195     } 
    196     return n; 
    197   } 
    198202 
    199203  private void updateSource(JComboBox box) { 
    200204    String s = (String) box.getSelectedItem(); 
    201205 
    202     CacheSource source = null; 
     206    ICacheSource source = null; 
    203207    try { 
    204       if (s.equals("byte arrays")) { 
     208      if (s.equals(SOURCES[0])) { // byte arrays 
     209        if (cache.getSource().getClass() == ByteArraySource.class) return; 
    205210        source = new ByteArraySource(file); 
    206211      } 
    207       else if (s.equals("BufferedImages")) { 
     212      else if (s.equals(SOURCES[1])) { // BufferedImages 
     213        if (cache.getSource().getClass() == BufferedImageSource.class) return; 
    208214        source = new BufferedImageSource(file); 
    209215      } 
    210       else if (s.equals("ImageProcessors")) { 
     216      else if (s.equals(SOURCES[2])) { // ImageProcessors 
     217        if (cache.getSource().getClass() == ImageProcessorSource.class) return; 
    211218        source = new ImageProcessorSource(file); 
    212219      } 
     
    220227  private void updateStrategy(JComboBox box) { 
    221228    String s = (String) box.getSelectedItem(); 
    222     CacheStrategy strategy = null; 
    223  
    224     boolean forwardFirst = s.indexOf("forward") != -1; 
     229    ICacheStrategy strategy = null; 
    225230 
    226231    try { 
    227232      int[] lengths = cache.getStrategy().getLengths(); 
    228       if (s.startsWith("Crosshair")) { 
     233      if (s.equals(STRATEGIES[0])) { // Crosshair 
     234        if (cache.getStrategy().getClass() == CrosshairStrategy.class) return; 
    229235        strategy = new CrosshairStrategy(lengths); 
    230236      } 
    231       else if (s.startsWith("Rectangle")) { 
     237      else if (s.equals(STRATEGIES[1])) { // Rectangle 
     238        if (cache.getStrategy().getClass() == RectangleStrategy.class) return; 
    232239        strategy = new RectangleStrategy(lengths); 
    233240      } 
    234       int[] rng = getRange(); 
    235       for (int i=0; i<rng.length; i++) strategy.setRange(rng[i], i); 
    236241      cache.setStrategy(strategy); 
    237242    } 
     
    241246  } 
    242247 
     248  private void updateRange(int index) { 
     249    int rng = ((Integer) range[index].getValue()).intValue(); 
     250 
     251    ICacheStrategy strategy = cache.getStrategy(); 
     252    int[] ranges = strategy.getRange(); 
     253    if (rng != ranges[index]) strategy.setRange(rng, index); 
     254  } 
     255 
     256  private void updatePriority(int index) { 
     257    String s = (String) priority[index].getSelectedItem(); 
     258 
     259    int prio = 0; 
     260    if (s.equals(PRIORITIES[0])) { // Maximum 
     261      prio = ICacheStrategy.MAX_PRIORITY; 
     262    } 
     263    else if (s.equals(PRIORITIES[1])) { // High 
     264      prio = ICacheStrategy.HIGH_PRIORITY; 
     265    } 
     266    else if (s.equals(PRIORITIES[2])) { // Normal 
     267      prio = ICacheStrategy.NORMAL_PRIORITY; 
     268    } 
     269    else if (s.equals(PRIORITIES[3])) { // Low 
     270      prio = ICacheStrategy.LOW_PRIORITY; 
     271    } 
     272    else if (s.equals(PRIORITIES[4])) { // Minimum 
     273      prio = ICacheStrategy.MIN_PRIORITY; 
     274    } 
     275 
     276    ICacheStrategy strategy = cache.getStrategy(); 
     277    int[] priorities = strategy.getPriorities(); 
     278    if (prio != priorities[index]) strategy.setPriority(prio, index); 
     279  } 
     280 
     281  private void updateOrder(int index) { 
     282    String s = (String) order[index].getSelectedItem(); 
     283 
     284    int ord = 0; 
     285    if (s.equals(ORDERS[0])) { // Centered 
     286      ord = ICacheStrategy.CENTERED_ORDER; 
     287    } 
     288    else if (s.equals(ORDERS[1])) { // Forward 
     289      ord = ICacheStrategy.FORWARD_ORDER; 
     290    } 
     291    else if (s.equals(ORDERS[2])) { // Backward 
     292      ord = ICacheStrategy.BACKWARD_ORDER; 
     293    } 
     294 
     295    ICacheStrategy strategy = cache.getStrategy(); 
     296    int[] orders = strategy.getOrder(); 
     297    if (ord != orders[index]) strategy.setOrder(ord, index); 
     298  } 
     299 
    243300} 
Note: See TracChangeset for help on using the changeset viewer.