Changeset 2649


Ignore:
Timestamp:
04/20/07 11:38:19 (13 years ago)
Author:
melissa
Message:

Improved template editor - can now define groups, remove tabs/groups/fields,
and dynamically add or remove rows and columns from the template.

Location:
trunk/loci/ome/notebook
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/ome/notebook/Notebook.java

    r2646 r2649  
    279279            if (field.getRow() != -1) {  
    280280              panel.add(new JLabel(field.getName()),  
    281                 cc.xy(field.getColumn() + paddingColumns + 1,  
     281                cc.xy(field.getColumn() + paddingColumns,  
    282282                field.getRow() + 1)); 
    283283              panel.add(field.getComponent(),  
    284                 cc.xy(field.getColumn() + paddingColumns + 2,  
     284                cc.xy(field.getColumn() + paddingColumns + 1,  
    285285                field.getRow() + 1)); 
    286286            }  
  • trunk/loci/ome/notebook/Template.java

    r2645 r2649  
    318318 
    319319        writer.write("  group {\n"); 
    320         writer.write("    count\"" + g.getRepetitions() + "\"\n"); 
    321         writer.write("    name\"" + g.getName() + "\"\n"); 
     320        writer.write("    count \"" + g.getRepetitions() + "\"\n"); 
     321        writer.write("    name \"" + g.getName() + "\"\n"); 
    322322 
    323323        for (int k=0; k<g.getNumFields(); k++) { 
  • trunk/loci/ome/notebook/TemplateField.java

    r2645 r2649  
    134134    rtn.setName(getName()); 
    135135    rtn.setMap(getMap()); 
    136     
     136    rtn.setRow(getRow()); 
     137    rtn.setColumn(getColumn()); 
     138 
    137139    // copy the component 
    138140    JComponent comp = null; 
  • trunk/loci/ome/notebook/TemplateGroup.java

    r2513 r2649  
    102102  } 
    103103 
     104  public void removeField(int ndx) {  
     105    for (int i=0; i<repetitions; i++) { 
     106      fields.remove(new Point(i, ndx)); 
     107    } 
     108  } 
     109 
    104110  // -- Helper methods -- 
    105111 
    106   /** Adjust the mapping so that the node index matches the repetition number. */ 
     112  /**  
     113   * Adjust the mapping so that the node index matches the repetition number.  
     114   */ 
    107115  private void adjustMap(TemplateField t, int repetition) { 
    108116    String map = t.getMap(); 
  • trunk/loci/ome/notebook/TemplateTab.java

    r2629 r2649  
    8888  public void addField(TemplateField t) { fields.add(t); } 
    8989 
     90  public void removeGroup(int ndx) { groups.removeElementAt(ndx); } 
     91 
     92  public void removeField(int ndx) { fields.removeElementAt(ndx); } 
     93 
    9094  public String getName() { return name; } 
    9195 
  • trunk/loci/ome/notebook/editor/TemplateEditor.java

    r2513 r2649  
    66OME Metadata Notebook application for exploration and editing of OME-XML and 
    77OME-TIFF metadata. Copyright (C) 2006-@year@ Christopher Peterson. 
    8    
     8    
    99This program is free software; you can redistribute it and/or modify 
    1010it under the terms of the GNU Library General Public License as published by 
    1111the Free Software Foundation; either version 2 of the License, or 
    1212(at your option) any later version. 
    13      
     13        
    1414This program is distributed in the hope that it will be useful, 
    1515but WITHOUT ANY WARRANTY; without even the implied warranty of 
    1616MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
    1717GNU Library General Public License for more details. 
    18        
     18            
    1919You should have received a copy of the GNU Library General Public License 
    2020along with this program; if not, write to the Free Software 
     
    2424package loci.ome.notebook.editor; 
    2525 
     26import com.jgoodies.forms.layout.*; 
    2627import java.awt.*; 
    2728import java.awt.event.*; 
    28 import java.awt.image.BufferedImage; 
     29import java.io.*; 
     30import java.util.*; 
    2931import javax.swing.*; 
    30 import javax.swing.event.*; 
    31  
    32 /** Graphical application for creating OME Notebook template files. */ 
    33 public class TemplateEditor extends JFrame implements ActionListener { 
     32import javax.swing.filechooser.FileFilter; 
     33import loci.ome.notebook.*; 
     34import loci.ome.viewer.MetadataPane; 
     35import org.openmicroscopy.xml.OMENode; 
     36 
     37/** Main class for notebook template editor. */ 
     38public class TemplateEditor extends JFrame  
     39  implements ActionListener, MouseListener  
     40{ 
    3441 
    3542  // -- Constants -- 
    3643 
    37   /** Original window width. */ 
    38   private static final int WINDOW_WIDTH = 800; 
    39  
    40   /** Original window height. */ 
    41   private static final int WINDOW_HEIGHT = 700; 
     44  /** List of component names. */ 
     45  private String[] COMPONENT_NAMES = new String[] {"Text field",  
     46    "Number field", "Choice field", "Checkbox field" 
     47  }; 
     48 
     49  /** List of component classes. */ 
     50  private Class[] COMPONENTS = new Class[] { 
     51    JTextField.class, JSpinner.class, JComboBox.class, JCheckBox.class 
     52  }; 
     53 
     54  /** List of component types. */ 
     55  private String[] COMPONENT_TYPES = new String[] { 
     56    "var", "int", "enum", "bool" 
     57  }; 
     58 
     59  public static int TAB = 0, GROUP = 1, FIELD = 2; 
    4260 
    4361  // -- Fields -- 
    4462 
     63  /** Menu for choosing which tab to edit. */ 
     64  private JMenu tabMenu; 
     65 
     66  /** Menus for choosing which tab, group, or field to remove. */ 
     67  private JMenu removeTab, removeGroup, removeField; 
     68 
     69  /** Menu for choosing a field to edit. */ 
     70  private JMenu fieldOptions; 
     71 
     72  /** Layout for the template panel. */ 
     73  private FormLayout templateLayout; 
     74 
     75  /** Panel that shows the template. */ 
     76  private JPanel template; 
     77 
     78  /** Panel that contains organization options. */ 
     79  private JPanel organization; 
     80 
     81  /** List of TemplateTabs. */ 
     82  private Vector tabs; 
     83 
     84  /** List of tab panels corresponding to TemplateTabs. */ 
     85  private Vector tabPanels; 
     86  
     87  /** Current tab index. */ 
     88  private int currentTab; 
     89 
     90  /** General template options. */ 
     91  private Hashtable options; 
     92 
     93  /** Popup menu for dynamically adding/removing rows. */ 
     94  private JPopupMenu popup; 
     95 
    4596  // -- Constructor -- 
    4697 
     98  /** Constructs a new window with a blank template. */ 
    4799  public TemplateEditor() { 
    48     super("OME Notebook Template Editor");  
     100    super("OME Notebook Template Editor"); 
     101 
     102    tabs = new Vector(); 
     103    tabPanels = new Vector(); 
     104 
     105    // set up menu bar  
     106 
     107    JMenuBar menubar = new JMenuBar(); 
     108 
     109    JMenu file = new JMenu("File"); 
     110 
     111    JMenuItem newFile = new JMenuItem("New..."); 
     112    newFile.setActionCommand("new"); 
     113    newFile.addActionListener(this); 
     114    file.add(newFile); 
     115 
     116    JMenuItem openFile = new JMenuItem("Open..."); 
     117    openFile.setActionCommand("open"); 
     118    openFile.addActionListener(this); 
     119    file.add(openFile); 
     120 
     121    JMenuItem saveFile = new JMenuItem("Save..."); 
     122    saveFile.setActionCommand("save"); 
     123    saveFile.addActionListener(this); 
     124    file.add(saveFile); 
     125 
     126    JMenuItem quit = new JMenuItem("Quit"); 
     127    quit.setActionCommand("quit"); 
     128    quit.addActionListener(this); 
     129    file.add(quit); 
     130  
     131    menubar.add(file); 
    49132   
    50     JTabbedPane tabPane = new JTabbedPane(); 
     133    JMenu view = new JMenu("View"); 
     134 
     135    tabMenu = new JMenu("Tab"); 
     136    view.add(tabMenu); 
     137    menubar.add(view); 
     138 
     139    JMenu add = new JMenu("Add"); 
     140 
     141    JMenuItem newTab = new JMenuItem("Tab"); 
     142    newTab.setActionCommand("new tab"); 
     143    newTab.addActionListener(this); 
     144    add.add(newTab); 
     145 
     146    JMenuItem newGroup = new JMenuItem("Group"); 
     147    newGroup.setActionCommand("new group"); 
     148    newGroup.addActionListener(this); 
     149    add.add(newGroup); 
     150 
     151    add.add(new JSeparator()); 
     152 
     153    for (int i=0; i<COMPONENT_NAMES.length; i++) { 
     154      JMenuItem item = new JMenuItem(COMPONENT_NAMES[i]); 
     155      item.setActionCommand(COMPONENT_NAMES[i]); 
     156      item.addActionListener(this); 
     157      add.add(item); 
     158    } 
     159 
     160    menubar.add(add);  
     161 
     162    JMenu remove = new JMenu("Remove"); 
     163 
     164    removeTab = new JMenu("Tab"); 
     165    remove.add(removeTab); 
     166 
     167    removeGroup = new JMenu("Group"); 
     168    remove.add(removeGroup); 
     169 
     170    removeField = new JMenu("Field"); 
     171    remove.add(removeField); 
     172 
     173    menubar.add(remove); 
     174 
     175    JMenu optionsMenu = new JMenu("Options"); 
     176 
     177    JMenuItem general = new JMenuItem("General"); 
     178    general.setActionCommand("general options"); 
     179    general.addActionListener(this); 
     180    optionsMenu.add(general); 
     181 
     182    fieldOptions = new JMenu("Field"); 
     183    optionsMenu.add(fieldOptions); 
     184 
     185    menubar.add(optionsMenu); 
     186 
     187    setJMenuBar(menubar); 
     188 
     189    // set up popup menu 
     190       
     191    popup = new JPopupMenu(); 
     192    JMenuItem item = new JMenuItem("Add row"); 
     193    item.setActionCommand("add row"); 
     194    item.addActionListener(this); 
     195    popup.add(item); 
     196 
     197    item = new JMenuItem("Remove row"); 
     198    item.setActionCommand("remove row"); 
     199    item.addActionListener(this); 
     200    popup.add(item); 
     201 
     202    popup.add(new JSeparator()); 
     203 
     204    item = new JMenuItem("Add column"); 
     205    item.setActionCommand("add column"); 
     206    item.addActionListener(this); 
     207    popup.add(item); 
     208 
     209    item = new JMenuItem("Remove column"); 
     210    item.setActionCommand("remove column"); 
     211    item.addActionListener(this); 
     212    popup.add(item); 
     213 
     214    // set up template panel 
     215 
     216    CellConstraints cc = new CellConstraints(); 
     217 
     218    templateLayout = new FormLayout("pref:grow, pref:grow", "pref:grow"); 
     219    template = new JPanel(templateLayout); 
     220    template.addMouseListener(this); 
     221 
     222    String rowString = "2dlu, pref:grow"; 
     223    for (int i=1; i<COMPONENT_NAMES.length; i++) { 
     224      rowString += ", 2dlu, pref:grow"; 
     225    } 
     226 
     227    setContentPane(template);  
     228    setPreferredSize(new Dimension(768, 768)); 
     229    pack(); 
     230    setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     231    setVisible(true); 
     232  } 
     233 
     234  // -- TemplateEditor API methods -- 
     235 
     236  /** Add a new tab to this template. */ 
     237  private void addTab(TemplateTab tab) { 
     238    addTab(tab, tab.getNumFields(), 1); 
     239  } 
     240 
     241  /** Add a new tab with the specified number of rows and columns. */ 
     242  private void addTab(TemplateTab tab, int rows, int columns) { 
     243    tabs.add(tab); 
     244 
     245    StringBuffer row = new StringBuffer(); 
     246    StringBuffer col = new StringBuffer(); 
     247 
     248    for (int i=0; i<rows; i++) { 
     249      row.append("pref:grow"); 
     250      if (i < rows - 1) row.append(", "); 
     251    } 
     252   
     253    for (int i=0; i<columns; i++) { 
     254      col.append("pref:grow, pref:grow"); 
     255      if (i < columns - 1) col.append(", "); 
     256    }  
     257 
     258    FormLayout layout = new FormLayout(col.toString(), row.toString()); 
     259    JPanel panel = new JPanel(layout);  
    51260    
    52     // set up general options tab 
    53  
    54     JScrollPane general = new JScrollPane(); 
    55     JPanel content = new JPanel(new GridLayout(10, 2));  
    56  
    57     // get available fonts 
    58     GraphicsEnvironment local =  
    59       GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    60     String[] fonts = local.getAvailableFontFamilyNames(); 
    61  
    62     // prompt for font properties  
    63  
    64     content.add(new JLabel("Font: ")); 
    65     JComboBox fontNames = new JComboBox(fonts); 
    66     content.add(fontNames); 
    67  
    68     content.add(new JLabel("Font Size: ")); 
    69     JSpinner size = new JSpinner(new SpinnerNumberModel(12, 1, 50, 1)); 
    70     content.add(size); 
    71  
    72     content.add(new JLabel("Font Color: ")); 
    73     ImageIcon ii = new ImageIcon(); 
    74     BufferedImage font = new BufferedImage(40, 40, BufferedImage.TYPE_INT_RGB); 
    75     setPixels(font, 0);  
    76     ii.setImage(font);  
    77  
    78     JButton fontColor = new JButton("Black", ii); 
    79     fontColor.setActionCommand("fontColor"); 
    80     fontColor.addActionListener(this); 
    81     content.add(fontColor); 
    82  
    83     // prompt for background color 
    84  
    85     content.add(new JLabel("Background Color: ")); 
    86     ImageIcon back = new ImageIcon(); 
    87     BufferedImage background = new BufferedImage(40, 40,  
    88       BufferedImage.TYPE_INT_RGB); 
    89     setPixels(background, 16777215); 
    90     back.setImage(background); 
    91     JButton backgroundColor = new JButton("White", back); 
    92     backgroundColor.setActionCommand("backgroundColor"); 
    93     backgroundColor.addActionListener(this); 
    94     content.add(backgroundColor); 
    95  
    96     // prompt for default window dimensions 
    97  
    98     content.add(new JLabel("Default Window Width: ")); 
    99     JSpinner width = new JSpinner(new SpinnerNumberModel(800, 1, 1024, 1)); 
    100     content.add(width); 
    101  
    102     content.add(new JLabel("Default Window Height: ")); 
    103     JSpinner height = new JSpinner(new SpinnerNumberModel(700, 1, 768, 1)); 
    104     content.add(height); 
    105  
    106     // prompt for boolean options 
    107  
    108     content.add(new JLabel("Can Edit Fields?")); 
    109     JCheckBox edit = new JCheckBox("", true); 
    110     content.add(edit); 
    111     content.add(new JLabel("Prefer Companion File?")); 
    112     JCheckBox companion = new JCheckBox("", true); 
    113     content.add(companion); 
    114     content.add(new JLabel("Can Dynamically Edit Template?")); 
    115     JCheckBox editTemplate = new JCheckBox("", true); 
    116     content.add(editTemplate); 
    117     content.add(new JLabel("Can Dynamically Edit OME-CA Mappings?")); 
    118     JCheckBox editMap = new JCheckBox("", true); 
    119     content.add(editMap); 
    120  
    121     general.getViewport().add(content); 
    122     tabPane.add("General Options", general);  
    123  
    124     // set up tab options tab 
    125  
    126     JScrollPane tab = new JScrollPane(); 
    127     tab.getViewport().add(new JPanel()); 
    128     tabPane.add("Tab Options", tab);  
    129     
    130     // set up group options tab 
    131  
    132     JScrollPane group = new JScrollPane(); 
    133     group.getViewport().add(new JPanel()); 
    134     tabPane.add("Group Options", group);  
     261    CellConstraints cc = new CellConstraints(); 
     262       
     263    for (int i=0; i<tab.getNumFields(); i++) { 
     264      TemplateField f = tab.getField(i);  
     265      panel.add(new JLabel(f.getName()), cc.xy(1, i + 1)); 
     266      panel.add(f.getComponent(), cc.xy(2, i + 1));     
     267    } 
     268    tabPanels.add(panel);  
    135269   
    136     // set up field options tab 
    137  
    138     JScrollPane field = new JScrollPane(); 
    139     field.getViewport().add(new JPanel()); 
    140     tabPane.add("Field Options", field);  
    141  
    142     getContentPane().add(tabPane); 
     270    // add this tab to the menu bar 
     271    JMenuItem item = new JMenuItem(tab.getName()); 
     272    item.setActionCommand("tab" + (tabs.size() - 1)); 
     273    item.addActionListener(this); 
     274    tabMenu.add(item); 
     275    pack();  
     276  } 
     277 
     278  private void updateRemoveLists() { 
     279    removeTab.removeAll(); 
     280    removeGroup.removeAll(); 
     281    removeField.removeAll(); 
    143282  
    144     setPreferredSize(new Dimension(WINDOW_WIDTH, WINDOW_HEIGHT)); 
    145     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    146     pack(); 
    147     setVisible(true); 
    148   } 
    149  
    150   // -- TemplateEditor API methods -- 
    151  
    152   /** Sets all of the pixels in the given image to the specified RGB value. */ 
    153   public static void setPixels(BufferedImage bi, int value) { 
    154     for (int x=0; x<bi.getWidth(); x++) { 
    155       for (int y=0; y<bi.getHeight(); y++) { 
    156         bi.setRGB(x, y, value); 
    157       } 
    158     } 
    159   }  
     283    for (int i=0; i<tabs.size(); i++) { 
     284      TemplateTab tab = (TemplateTab) tabs.get(i);  
     285       
     286      JMenuItem item = new JMenuItem(tab.getName()); 
     287      item.setActionCommand("removeTab " + i); 
     288      item.addActionListener(this); 
     289      removeTab.add(item); 
     290 
     291      int numFields = 0; 
     292 
     293      for (int j=0; j<tab.getNumGroups(); j++) { 
     294        TemplateGroup g = tab.getGroup(j); 
     295 
     296        JMenuItem group = new JMenuItem(g.getName()); 
     297        group.setActionCommand("removeGroup " + j); 
     298        group.addActionListener(this); 
     299        removeGroup.add(group); 
     300 
     301        for (int k=0; k<g.getNumFields(); k++) { 
     302          JMenuItem f = new JMenuItem(g.getField(0, k).getName()); 
     303          f.setActionCommand("removeField " + j + "-" + (numFields + k)); 
     304          f.addActionListener(this); 
     305          removeField.add(f); 
     306        } 
     307        numFields += g.getNumFields();  
     308      } 
     309       
     310      for (int j=0; j<tab.getNumFields(); j++) { 
     311        JMenuItem f = new JMenuItem(tab.getField(j).getName()); 
     312        f.setActionCommand("removeField " + (numFields + j));  
     313        f.addActionListener(this); 
     314        removeField.add(f); 
     315      } 
     316    } 
     317  
     318  } 
    160319 
    161320  // -- ActionListener API methods -- 
     
    163322  public void actionPerformed(ActionEvent e) { 
    164323    String cmd = e.getActionCommand(); 
    165  
    166     if (cmd.equals("fontColor")) { 
    167       new RGBWindow(); 
    168     } 
    169     else if (cmd.equals("backgroundColor")) { 
    170       new RGBWindow(); 
     324    if (cmd == null) return; 
     325 
     326    if (cmd.equals("new")) { 
     327    } 
     328    else if (cmd.equals("open")) { 
     329      // prompt for template file to open 
     330      JFileChooser chooser = new JFileChooser(); 
     331      FileFilter filter = new FileFilter() { 
     332        public boolean accept(File f) { 
     333          return f.getAbsolutePath().endsWith(".template") || f.isDirectory(); 
     334        } 
     335        public String getDescription() { return "OME Notebook templates"; }  
     336      }; 
     337 
     338      chooser.setFileFilter(filter); 
     339 
     340      if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { 
     341        try {  
     342          Template t =  
     343            new Template(chooser.getSelectedFile().getAbsolutePath()); 
     344          TemplateTab[] newTabs = t.getTabs(); 
     345          for (int i=0; i<newTabs.length; i++) addTab(newTabs[i]); 
     346        } 
     347        catch (IOException exc) { 
     348          exc.printStackTrace(); 
     349        } 
     350      } 
     351     
     352    } 
     353    else if (cmd.equals("save")) { 
     354      // prompt for path to save to 
     355      try {  
     356        JFileChooser chooser = new JFileChooser(); 
     357        if (chooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { 
     358          Hashtable h = new Hashtable(); 
     359          if (options != null && options.size() > 0) {   
     360            Object[] keys = options.keySet().toArray(); 
     361            for (int i=0; i<keys.length; i++) { 
     362              String value = ((Option) options.get(keys[i])).value;  
     363              if (value != null) h.put(keys[i], value);  
     364            }  
     365          }  
     366 
     367          Template t = new Template( 
     368            (TemplateTab[]) tabs.toArray(new TemplateTab[0]), h); 
     369          t.save(chooser.getSelectedFile().getAbsolutePath());  
     370        } 
     371      } 
     372      catch (IOException exc) { 
     373        exc.printStackTrace(); 
     374      } 
     375    } 
     376    else if (cmd.equals("quit")) dispose();  
     377    else if (cmd.equals("new tab")) { 
     378      TemplateTab t = new TemplateTab(); 
     379      Prompter fp =  
     380        new Prompter(this, null, Integer.MAX_VALUE, Integer.MAX_VALUE, TAB);  
     381      if (!fp.wasCanceled()) {  
     382        t.setName(fp.getName());  
     383        addTab(t, fp.getRow(), fp.getColumn());  
     384      }   
     385      updateRemoveLists();  
     386    } 
     387    else if (cmd.equals("new group")) { 
     388      TemplateGroup g = new TemplateGroup(); 
     389 
     390      Prompter fp = new Prompter(this, null, 0, 0, GROUP); 
     391      if (fp.wasCanceled()) return; 
     392 
     393      g.setName(fp.getName()); 
     394      g.setRepetitions(fp.getRepetitions()); 
     395 
     396      ((TemplateTab) tabs.get(currentTab)).addGroup(g); 
     397      updateRemoveLists();  
     398    } 
     399    else if (cmd.startsWith("removeTab")) { 
     400      int ndx = Integer.parseInt(cmd.substring(cmd.indexOf(" ") + 1)); 
     401      tabs.removeElementAt(ndx);  
     402      
     403      tabMenu.removeAll(); 
     404 
     405      for (int i=0; i<tabs.size(); i++) { 
     406        JMenuItem item = new JMenuItem(((TemplateTab) tabs.get(i)).getName()); 
     407        item.setActionCommand("tab" + i); 
     408        item.addActionListener(this); 
     409        tabMenu.add(item); 
     410      } 
     411       
     412      updateRemoveLists();   
     413    } 
     414    else if (cmd.startsWith("removeGroup")) { 
     415      int ndx = Integer.parseInt(cmd.substring(cmd.indexOf(" ") + 1)); 
     416      ((TemplateTab) tabs.get(currentTab)).removeGroup(ndx); 
     417      updateRemoveLists();  
     418    } 
     419    else if (cmd.startsWith("removeField")) { 
     420      String s = cmd.substring(cmd.indexOf(" ") + 1); 
     421      if (s.indexOf("-") != -1) { 
     422        int groupIdx = Integer.parseInt(s.substring(0, s.indexOf("-"))); 
     423        int fieldIdx = Integer.parseInt(s.substring(s.indexOf("-") + 1)); 
     424 
     425        ((TemplateTab) tabs.get(currentTab)).getGroup( 
     426          groupIdx).removeField(fieldIdx); 
     427      } 
     428      else { 
     429        int fieldIdx = Integer.parseInt(s); 
     430        ((TemplateTab) tabs.get(currentTab)).removeField(fieldIdx); 
     431      } 
     432      updateRemoveLists();  
     433    } 
     434    else if (cmd.equals("general options")) { 
     435      // pop up a dialog with general template options  
     436   
     437      if (options == null) { 
     438        options = new Hashtable(); 
     439        //options.put("font-style", new Option("Font", new JTextField(""))); 
     440        //options.put("font-size", new Option("Font size",  
     441        //  new JSpinner(new SpinnerNumberModel(12, 1, Integer.MAX_VALUE, 1)))); 
     442        //options.put("font-color", new Option()); 
     443        //options.put("background-color", new Option()); 
     444        options.put("default-width", new Option("Window width", 
     445          new JSpinner(new SpinnerNumberModel(800, 1, Integer.MAX_VALUE, 1)))); 
     446        options.put("default-height", new Option("Window height", 
     447          new JSpinner(new SpinnerNumberModel(600, 1, Integer.MAX_VALUE, 1)))); 
     448        options.put("editable", new Option("Allow editing",  
     449          new JCheckBox("", true))); 
     450        options.put("prefer-companion",  
     451          new Option("Prefer metadata companion file",  
     452          new JCheckBox("", true))); 
     453        //options.put("edit-template-fields", new Options()); 
     454        //options.put("edit-mapping", new Options()); 
     455        options.put("rows",  
     456          new JSpinner(new SpinnerNumberModel(1, 1, Integer.MAX_VALUE, 1)));  
     457        options.put("columns",  
     458          new JSpinner(new SpinnerNumberModel(1, 1, Integer.MAX_VALUE, 1)));  
     459      }  
     460 
     461      Options window = new Options(this, options); 
     462      options = window.getOptions(); 
     463    } 
     464    else if (cmd.startsWith("tab")) { 
     465      // switch which tab we're editing 
     466    
     467      currentTab = Integer.parseInt(cmd.substring(3)); 
     468      template = (JPanel) tabPanels.get(currentTab); 
     469      template.addMouseListener(this);  
     470      setContentPane(template);  
     471       
     472      fieldOptions.removeAll(); 
     473      TemplateTab tab = (TemplateTab) tabs.get(currentTab); 
     474      for (int i=0; i<tab.getNumFields(); i++) { 
     475        JMenuItem item = new JMenuItem(tab.getField(i).getName()); 
     476        item.setActionCommand("field" + i); 
     477        item.addActionListener(this); 
     478        fieldOptions.add(item); 
     479      }  
     480       
     481      pack(); 
     482      updateRemoveLists();  
     483    } 
     484    else if (cmd.equals("add row")) { 
     485      FormLayout current =  
     486        (FormLayout) ((JPanel) tabPanels.get(currentTab)).getLayout(); 
     487      current.appendRow(new RowSpec("pref:grow"));  
     488      ((JPanel) tabPanels.get(currentTab)).setLayout(current);  
     489    } 
     490    else if (cmd.equals("remove row")) { 
     491      FormLayout current =  
     492        (FormLayout) ((JPanel) tabPanels.get(currentTab)).getLayout(); 
     493      current.removeRow(current.getRowCount());  
     494      ((JPanel) tabPanels.get(currentTab)).setLayout(current);  
     495    } 
     496    else if (cmd.equals("add column")) { 
     497      FormLayout current =  
     498        (FormLayout) ((JPanel) tabPanels.get(currentTab)).getLayout(); 
     499      current.appendColumn(new ColumnSpec("pref:grow"));  
     500      current.appendColumn(new ColumnSpec("pref:grow"));  
     501      ((JPanel) tabPanels.get(currentTab)).setLayout(current);  
     502    } 
     503    else if (cmd.equals("remove column")) { 
     504      FormLayout current =  
     505        (FormLayout) ((JPanel) tabPanels.get(currentTab)).getLayout(); 
     506      current.removeColumn(current.getColumnCount());  
     507      current.removeColumn(current.getColumnCount());  
     508      ((JPanel) tabPanels.get(currentTab)).setLayout(current);  
     509    } 
     510    else { 
     511      // prompt for name and location  
     512      FormLayout current =  
     513        (FormLayout) ((JPanel) tabPanels.get(currentTab)).getLayout();  
     514      int maxRow = current.getRowCount(); 
     515      int maxCol = current.getColumnCount() / 2; 
     516       
     517      String[] groupNames =  
     518        new String[((TemplateTab) tabs.get(currentTab)).getNumGroups() + 1];  
     519      for (int i=1; i<=groupNames.length-1; i++) { 
     520        groupNames[i] =  
     521          ((TemplateTab) tabs.get(currentTab)).getGroup(i - 1).getName(); 
     522      } 
     523 
     524      Prompter fp = new Prompter(this, groupNames, maxRow, maxCol, FIELD);  
     525      
     526      if (fp.wasCanceled()) return;  
     527 
     528      int row = fp.getRow(); 
     529      int col = fp.getColumn(); 
     530      String name = fp.getName(); 
     531    
     532      int ndx = -1; 
     533      for (int i=0; i<COMPONENT_NAMES.length; i++) { 
     534        if (cmd.equals(COMPONENT_NAMES[i])) { 
     535          ndx = i; 
     536          break; 
     537        } 
     538      } 
     539 
     540      // now add this component to the panel  
     541  
     542      // TODO : need to handle group layouts  
     543      try { 
     544        CellConstraints cc = new CellConstraints(); 
     545        JPanel pane = (JPanel) tabPanels.get(currentTab); 
     546        pane.add(new JLabel(name), cc.xy(col*2 - 1, row)); 
     547        pane.add((JComponent) COMPONENTS[ndx].newInstance(), cc.xy(col*2, row)); 
     548        tabPanels.setElementAt(pane, currentTab); 
     549        pack();  
     550      } 
     551      catch (Exception exc) { 
     552        exc.printStackTrace(); 
     553      } 
     554 
     555      // add this field to the current tab  
     556      TemplateField field = new TemplateField(); 
     557      field.setName(name); 
     558      field.setRow(row); 
     559      field.setColumn(col); 
     560      field.setType(COMPONENT_TYPES[ndx]); 
     561      field.setMap(fp.getMap());  
     562 
     563      String group = fp.getGroup(); 
     564      if (group.length() == 0) { 
     565        ((TemplateTab) tabs.get(currentTab)).addField(field); 
     566      } 
     567      else { 
     568        TemplateTab thisTab = (TemplateTab) tabs.get(currentTab); 
     569        for (int i=0; i<thisTab.getNumGroups(); i++) { 
     570          if (thisTab.getGroup(i).getName().equals(group)) { 
     571            thisTab.getGroup(i).addField(field);   
     572            break;  
     573          } 
     574        }  
     575      } 
     576 
     577      // add this field to the menu 
     578      JMenuItem menuItem = new JMenuItem(name); 
     579      menuItem.setActionCommand("field" + fieldOptions.getItemCount()); 
     580      menuItem.addActionListener(this); 
     581      fieldOptions.add(menuItem); 
     582      pack(); 
     583      updateRemoveLists();  
     584    } 
     585   
     586  } 
     587  
     588  // -- MouseListener API methods -- 
     589 
     590  public void mouseClicked(MouseEvent e) { } 
     591 
     592  public void mouseEntered(MouseEvent e) { } 
     593 
     594  public void mouseExited(MouseEvent e) { } 
     595 
     596  public void mousePressed(MouseEvent e) { 
     597    int button = e.getButton(); 
     598    if (button == MouseEvent.BUTTON3) { 
     599      if (e.isPopupTrigger()) { 
     600        popup.show(e.getComponent(), e.getX(), e.getY()); 
     601      } 
     602    } 
     603  } 
     604 
     605  public void mouseReleased(MouseEvent e) { 
     606    int button = e.getButton(); 
     607    if (button == MouseEvent.BUTTON3) { 
     608      if (e.isPopupTrigger()) { 
     609        popup.setVisible(false); 
     610      } 
    171611    } 
    172612  } 
     
    174614  // -- Helper classes -- 
    175615 
    176   /** Displays a window for interactively choosing a color. */ 
    177   public class RGBWindow extends JFrame implements ChangeListener { 
     616  /** Prompts for necessary information about a tab, group or field. */ 
     617  public class Prompter extends JDialog implements ActionListener { 
     618   
     619    // -- Static fields -- 
     620 
     621    private Hashtable omexmlMaps = buildMappings(); 
     622 
     623    Hashtable buildMappings() { 
     624      InputStream stream =  
     625        TemplateEditor.class.getResourceAsStream("mapping.txt");   
     626      BufferedReader b = new BufferedReader(new InputStreamReader(stream));  
     627     
     628      Hashtable h = new Hashtable(); 
     629       
     630      try { 
     631        String line = b.readLine().trim(); 
     632        while (line != null) { 
     633          String key = line.substring(1, line.indexOf("\"", 1)); 
     634          line = line.substring(line.indexOf("\"", 1) + 1).trim(); 
     635          String value = line.substring(1, line.indexOf("\"", 1)); 
     636          h.put(key, value); 
     637 
     638          line = b.readLine(); 
     639        } 
     640        b.close(); 
     641      } 
     642      catch (IOException e) { 
     643        e.printStackTrace(); 
     644      } 
     645      return h; 
     646    }; 
    178647 
    179648    // -- Fields -- 
    180649 
    181     /** Red, green, and blue sliders. */ 
    182     private JSlider red, green, blue; 
    183  
    184     /** Image showing what color is selected. */ 
    185     private BufferedImage current; 
    186  
    187     private JPanel content; 
    188     private JLabel imageLabel; 
     650    private JTextField name; 
     651    private JSpinner row, col; 
     652    private JComboBox omexml; 
     653    private JComboBox group;  
     654    private JSpinner groupSpinner;  
     655    private boolean canceled = false; 
    189656 
    190657    // -- Constructor -- 
    191  
    192     public RGBWindow() { 
    193       super("Color Picker"); 
    194        
    195       GridBagLayout gridbag = new GridBagLayout(); 
    196       GridBagConstraints c = new GridBagConstraints(); 
    197       setLayout(gridbag); 
    198  
    199       current = new BufferedImage(128, 128, BufferedImage.TYPE_INT_RGB); 
    200       TemplateEditor.setPixels(current, 0); 
    201  
    202       // set up color sliders   
    203     
    204       red = new JSlider(0, 255, 0); 
    205       red.addChangeListener(this);  
    206       green = new JSlider(0, 255, 0); 
    207       green.addChangeListener(this);  
    208       blue = new JSlider(0, 255, 0); 
    209       blue.addChangeListener(this);  
    210  
    211       c.gridwidth = GridBagConstraints.RELATIVE; 
    212  
    213       content = new JPanel(); 
    214       imageLabel = new JLabel(new ImageIcon(current)); 
    215       gridbag.setConstraints(imageLabel, c);  
    216       content.add(imageLabel); 
    217        
    218       c.gridwidth = GridBagConstraints.REMAINDER;  
    219        
    220       gridbag.setConstraints(red, c);  
    221       content.add(red); 
    222       gridbag.setConstraints(green, c);  
    223       content.add(green); 
    224  
    225       c.gridheight = GridBagConstraints.REMAINDER; 
    226       gridbag.setConstraints(blue, c);  
    227       content.add(blue); 
    228       setContentPane(content); 
    229  
    230       setPreferredSize(new Dimension(214, 230));  
     658   
     659    public Prompter(JFrame owner, String[] groups, int rowMax, int colMax,  
     660      int type)  
     661    { 
     662      super(owner, "New " + (type == TemplateEditor.FIELD ? "field" :  
     663        type == TemplateEditor.TAB ? "tab" : "group") + "...", true);  
     664 
     665      FormLayout layout = 
     666        new FormLayout("2dlu, pref:grow, 2dlu, pref:grow, 2dlu", 
     667        "pref:grow, pref:grow, pref:grow, pref:grow, pref:grow, pref:grow"); 
     668      JPanel pane = new JPanel(layout); 
     669      CellConstraints cc = new CellConstraints(); 
     670 
     671      name = new JTextField(); 
     672 
     673      String n = type == TemplateEditor.TAB ? "Tab" :  
     674        type == TemplateEditor.GROUP ? "Group" : "Field"; 
     675 
     676      pane.add(new JLabel(n + " name:"), cc.xy(2, 1)); 
     677      pane.add(name, cc.xy(4, 1));  
     678       
     679      if (type != TemplateEditor.GROUP) {  
     680        boolean field = type == TemplateEditor.FIELD;  
     681         
     682        row = new JSpinner(new SpinnerNumberModel(1, 1, rowMax, 1)); 
     683        col = new JSpinner(new SpinnerNumberModel(1, 1, colMax, 1)); 
     684        pane.add(new JLabel(field ? "Row:" : "Rows:"), cc.xy(2, 2)); 
     685        pane.add(new JLabel(field ? "Column:" : "Columns:"), cc.xy(2, 3)); 
     686        pane.add(row, cc.xy(4, 2)); 
     687        pane.add(col, cc.xy(4, 3)); 
     688      }  
     689       
     690      if (type == TemplateEditor.FIELD) { 
     691        pane.add(new JLabel("OME-XML mapping:"), cc.xy(2, 5));  
     692        pane.add(new JLabel("Group:"), cc.xy(2, 4)); 
     693        group = new JComboBox(groups); 
     694        pane.add(group, cc.xy(4, 4)); 
     695 
     696        omexml = new JComboBox(omexmlMaps.keySet().toArray()); 
     697        pane.add(omexml, cc.xy(4, 5));  
     698      }  
     699      
     700      if (type == TemplateEditor.GROUP) { 
     701        groupSpinner = new JSpinner(new SpinnerNumberModel(0, 0,  
     702          Integer.MAX_VALUE, 1)); 
     703        pane.add(new JLabel("Repetitions:"), cc.xy(2, 2)); 
     704        pane.add(groupSpinner, cc.xy(4, 2)); 
     705      } 
     706 
     707      JButton ok = new JButton("OK"); 
     708      ok.setActionCommand("ok"); 
     709      ok.addActionListener(this); 
     710      pane.add(ok, cc.xy(2, 6));  
     711 
     712      JButton cancel = new JButton("Cancel"); 
     713      cancel.setActionCommand("cancel"); 
     714      cancel.addActionListener(this); 
     715      pane.add(cancel, cc.xy(4, 6)); 
     716 
     717      setContentPane(pane);   
     718      setPreferredSize(new Dimension(325, 130)); 
     719      pack(); 
     720      setDefaultCloseOperation(DISPOSE_ON_CLOSE);  
     721      setVisible(true);  
     722    } 
     723 
     724    // -- Prompter API methods -- 
     725 
     726    public int getRow() { return ((Integer) row.getValue()).intValue(); } 
     727 
     728    public int getColumn() { return ((Integer) col.getValue()).intValue(); } 
     729 
     730    public String getName() { return name.getText(); } 
     731 
     732    public String getMap() {  
     733      return (String) omexmlMaps.get(omexml.getSelectedItem());  
     734    } 
     735 
     736    public String getGroup() { return (String) group.getSelectedItem(); } 
     737 
     738    public int getRepetitions() {  
     739      return ((Integer) groupSpinner.getValue()).intValue();  
     740    } 
     741 
     742    public boolean wasCanceled() { return canceled; } 
     743 
     744    // -- ActionListener API methods -- 
     745 
     746    public void actionPerformed(ActionEvent e) { 
     747      if (e.getActionCommand().equals("ok")) dispose(); 
     748      else if (e.getActionCommand().equals("mapping")) { 
     749      } 
     750      else if (e.getActionCommand().equals("cancel")) { 
     751        canceled = true; 
     752        dispose();  
     753      } 
     754    } 
     755  } 
     756 
     757  /** Displays a list of general template options. */ 
     758  public class Options extends JDialog implements ActionListener { 
     759 
     760    // -- Fields -- 
     761 
     762    private Hashtable options; 
     763 
     764    // -- Constructor -- 
     765 
     766    public Options(JFrame parent, Hashtable options) { 
     767      super(parent, "General Template Options", true); 
     768      this.options = options; 
     769   
     770      String rowString = "2dlu"; 
     771      for (int i=0; i<=options.size(); i++) { 
     772        rowString += ", pref:grow, 2dlu"; 
     773      } 
     774 
     775      FormLayout layout =  
     776        new FormLayout("2dlu, pref:grow, 2dlu, pref:grow, 2dlu", rowString); 
     777      JPanel panel = new JPanel(layout); 
     778 
     779      CellConstraints cc = new CellConstraints(); 
     780      Object[] keys = options.keySet().toArray(); 
     781      Arrays.sort(keys); 
     782 
     783      for (int i=0; i<keys.length; i++) { 
     784        Option o = (Option) options.get(keys[i]); 
     785        panel.add(new JLabel(o.label), cc.xy(2, 2*(i + 1))); 
     786        panel.add(o.component, cc.xy(4, 2*(i + 1)));  
     787      } 
     788 
     789      JButton ok = new JButton("OK"); 
     790      ok.setActionCommand("ok"); 
     791      ok.addActionListener(this); 
     792      panel.add(ok, cc.xyw(2, 2*(keys.length + 1), 3)); 
     793 
     794      setContentPane(panel); 
     795      setPreferredSize(new Dimension(400, 400)); 
    231796      setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    232       pack(); 
     797      pack();  
    233798      setVisible(true); 
    234799    } 
    235800 
    236     // -- ChangeListener API methods -- 
    237  
    238     public void stateChanged(ChangeEvent e) { 
    239       // update the image color  
    240       int r = red.getValue(); 
    241       int g = green.getValue(); 
    242       int b = blue.getValue(); 
    243       TemplateEditor.setPixels(current, (r << 16) | (g << 8) | b);  
    244       imageLabel.setIcon(new ImageIcon(current)); 
    245     } 
    246  
     801    // -- Options API methods -- 
     802 
     803    public Hashtable getOptions() { return options; } 
     804 
     805    // -- ActionListener API methods -- 
     806 
     807    public void actionPerformed(ActionEvent e) { 
     808      if (e.getActionCommand().equals("ok")) { 
     809        Component[] components = getContentPane().getComponents(); 
     810        for (int i=0; i<components.length; i++) {  
     811          Component src = components[i];  
     812 
     813          Option o = null; 
     814          String cmd = null; 
     815 
     816          Object[] keys = options.keySet().toArray(); 
     817          for (int j=0; j<keys.length; j++) { 
     818            if (((Option) options.get(keys[j])).component.equals(src)) { 
     819              o = (Option) options.get(keys[j]); 
     820              cmd = (String) keys[j];  
     821              break; 
     822            } 
     823          } 
     824           
     825          if (src instanceof JTextField) { 
     826            o.value = ((JTextField) src).getText(); 
     827            options.put(cmd, o);  
     828          } 
     829          else if (src instanceof JSpinner) { 
     830            o.value = ((JSpinner) src).getValue().toString(); 
     831            options.put(cmd, o); 
     832          } 
     833          else if (src instanceof JComboBox) { 
     834            o.value = ((JComboBox) src).getSelectedItem().toString(); 
     835            options.put(cmd, o); 
     836          } 
     837          else if (src instanceof JCheckBox) { 
     838            o.value = "" + ((JCheckBox) src).isSelected(); 
     839            options.put(cmd, o); 
     840          } 
     841        }  
     842        dispose();  
     843      } 
     844    } 
     845 
     846  } 
     847 
     848  public class Option { 
     849    public String label; 
     850    public String value; 
     851    public JComponent component; 
     852   
     853    public Option(String label, JComponent component) { 
     854      this.label = label; 
     855      this.component = component; 
     856    } 
    247857  } 
    248858 
     
    251861  public static void main(String[] args) { 
    252862    new TemplateEditor(); 
    253   }  
    254  
     863  } 
    255864} 
  • trunk/loci/ome/notebook/templates/editor.template

    r2513 r2649  
    6363tab { 
    6464  name "Image Information" 
    65   
     65 
    6666  group { 
    6767    count "2" 
  • trunk/loci/ome/notebook/templates/viewer.template

    r2513 r2649  
    11# Template designed specifically for viewing (not editing) metadata. 
    22 
    3 font-style "Courier" 
    4 font-size "13" 
    5 font-color "0,100,255" 
    6 background-color "50,50,50" 
     3#font-style "Courier" 
     4#font-size "13" 
     5#font-color "0,100,255" 
     6#background-color "50,50,50" 
    77 
    88default-width "600" 
Note: See TracChangeset for help on using the changeset viewer.