FeatureMapEditorDialog.java
001 /*
002  *  Copyright (c) 1995-2012, The University of Sheffield. See the file
003  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
004  *
005  *  This file is part of GATE (see http://gate.ac.uk/), and is free
006  *  software, licenced under the GNU Library General Public License,
007  *  Version 2, June 1991 (in the distribution as file licence.html,
008  *  and also available at http://gate.ac.uk/gate/licence.html).
009  *
010  *  Valentin Tablan 16/10/2001
011  *
012  *  $Id: FeatureMapEditorDialog.java 17606 2014-03-09 12:12:49Z markagreenwood $
013  *
014  */
015 
016 package gate.gui;
017 
018 import java.awt.BorderLayout;
019 import java.awt.Component;
020 import java.awt.Dimension;
021 import java.awt.event.ActionEvent;
022 import java.awt.event.ActionListener;
023 import javax.swing.*;
024 
025 import gate.Factory;
026 import gate.FeatureMap;
027 import gate.Gate;
028 import gate.creole.ResourceInstantiationException;
029 import gate.util.*;
030 
031 /**
032  * A simple editor for List values.
033  */
034 @SuppressWarnings("serial")
035 public class FeatureMapEditorDialog extends JDialog {
036 
037   /**
038    * Contructs a new FeatureMapEditorDialog.
039    
040    @param owner the component this dialog will be centred on.
041    @param data a feature map with the initial values. This map will
042    *          not be changed, its values will be cached and if the user
043    *          selects the OK option a new map with the updated contents
044    *          will be returned.
045    */
046   public FeatureMapEditorDialog(Component owner, FeatureMap data) {
047     super(MainFrame.getInstance());
048     setLocationRelativeTo(owner);
049     initLocalData(data);
050     initGuiComponents();
051     initListeners();
052   }
053 
054   protected void initLocalData(FeatureMap data) {
055     if(data != null) {
056       FeatureMap fm = Factory.newFeatureMap();
057       fm.putAll(data);
058       tempFMHolder.setFeatures(fm);
059     }
060   }
061 
062   protected void initGuiComponents() {
063     this.setMinimumSize(new Dimension(150300));
064     getContentPane().setLayout(new BorderLayout());
065 
066     // create the FeaturesSchemaEditor for the main body of the dialog
067     fmView = new FeaturesSchemaEditor();
068     try {
069       fmView.init();
070     }
071     catch(ResourceInstantiationException rie) {
072       // can't happen, but needs to be caught to satisfy the compiler
073       throw new LuckyException("FeaturesSchemaEditor.init() threw "
074               "ResourceInstantiationException!");
075     }
076     fmView.setTarget(tempFMHolder);
077     // make sure the window is a sensible size
078     Dimension preferredSize = fmView.getPreferredSize();
079     if(preferredSize.height < 150) {
080       preferredSize.height = 150;
081     }
082     else if(preferredSize.height > 300) {
083       preferredSize.height = 300;
084     }
085     fmView.setPreferredSize(preferredSize);
086     JPanel fmViewPanel = new JPanel(new BorderLayout());
087     fmViewPanel.add(fmView, BorderLayout.CENTER);
088     fmViewPanel.setBorder(BorderFactory.createEmptyBorder(5555));
089 
090     getContentPane().add(fmViewPanel, BorderLayout.CENTER);
091 
092     // the bottom buttons
093     Box buttonsBox = Box.createHorizontalBox();
094     buttonsBox.add(Box.createHorizontalGlue());
095     okButton = new JButton("OK");
096     buttonsBox.add(okButton);
097     buttonsBox.add(Box.createHorizontalStrut(5));
098     cancelButton = new JButton("Cancel");
099     buttonsBox.add(cancelButton);
100     buttonsBox.add(Box.createHorizontalGlue());
101     getContentPane().add(buttonsBox, BorderLayout.SOUTH);
102   }
103 
104   protected void initListeners() {
105     okButton.addActionListener(new ActionListener() {
106       @Override
107       public void actionPerformed(ActionEvent e) {
108         userCancelled = false;
109         setVisible(false);
110       }
111     });
112 
113     cancelButton.addActionListener(new ActionListener() {
114       @Override
115       public void actionPerformed(ActionEvent e) {
116         userCancelled = true;
117         setVisible(false);
118       }
119     });
120   }
121 
122   /**
123    * Make this dialog visible allowing the editing of the list. If the
124    * user selects the <b>OK</b> option a new list with the updated
125    * contents will be returned; it the <b>Cancel</b> option is selected
126    * this method return <tt>null</tt>.
127    */
128   public FeatureMap showDialog() {
129     pack();
130     userCancelled = true;
131     setModal(true);
132     super.setVisible(true);
133     return userCancelled ? null : tempFMHolder.getFeatures();
134   }
135 
136   /**
137    * test code
138    */
139   public static void main(String[] args) {
140     try {
141       Gate.init();
142     }
143     catch(Exception e) {
144       e.printStackTrace();
145     }
146     JFrame frame = new JFrame("Foo frame");
147 
148     FeatureMapEditorDialog dialog = new FeatureMapEditorDialog(frame, null);
149 
150     frame.setSize(300300);
151     frame.setVisible(true);
152     System.out.println(dialog.showDialog());
153   }
154 
155   /**
156    * A dummy FeatureBearer used to hold the temporary feature map used
157    * for the editor.
158    */
159   FeatureBearer tempFMHolder = new FeatureBearer() {
160     private FeatureMap fm;
161 
162     @Override
163     public void setFeatures(FeatureMap map) {
164       fm = map;
165     }
166 
167     @Override
168     public FeatureMap getFeatures() {
169       return fm;
170     }
171   };
172 
173   /**
174    * The GUI compoenent used to display the feature map.
175    */
176   FeaturesSchemaEditor fmView;
177 
178   /**
179    * The OK button for this dialog
180    */
181   JButton okButton;
182 
183   /**
184    * The cancel button for this dialog
185    */
186   JButton cancelButton;
187 
188   /**
189    * Did the user press the cancel button?
190    */
191   boolean userCancelled;
192 }