001    /*
002            Copyright (c) 2009 Olivier Chafik, All Rights Reserved
003            
004            This file is part of JNAerator (http://jnaerator.googlecode.com/).
005            
006            JNAerator is free software: you can redistribute it and/or modify
007            it under the terms of the GNU General Public License as published by
008            the Free Software Foundation, either version 3 of the License, or
009            (at your option) any later version.
010            
011            JNAerator is distributed in the hope that it will be useful,
012            but WITHOUT ANY WARRANTY; without even the implied warranty of
013            MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014            GNU General Public License for more details.
015            
016            You should have received a copy of the GNU General Public License
017            along with JNAerator.  If not, see <http://www.gnu.org/licenses/>.
018    */
019    package com.ochafik.swing;
020    
021    import java.awt.BorderLayout;
022    import java.awt.Component;
023    import java.awt.GridBagConstraints;
024    import java.awt.GridBagLayout;
025    import java.awt.Insets;
026    import java.awt.event.ActionEvent;
027    import java.beans.PropertyChangeEvent;
028    import java.beans.PropertyChangeListener;
029    
030    import javax.swing.AbstractAction;
031    import javax.swing.Action;
032    import javax.swing.ActionMap;
033    import javax.swing.Box;
034    import javax.swing.InputMap;
035    import javax.swing.JComponent;
036    import javax.swing.JLabel;
037    import javax.swing.JPanel;
038    import javax.swing.KeyStroke;
039    import javax.swing.text.JTextComponent;
040    import javax.swing.undo.UndoManager;
041    
042    import com.ochafik.beans.BeansController;
043    
044    
045    public class FormUtils {
046            
047            @SuppressWarnings("serial")
048            public static Action createUndoAction(final UndoManager undoManager, String name) {
049                    return new AbstractAction(name) {
050                public void actionPerformed(ActionEvent arg0) {
051                    if (undoManager.canUndo()) {
052                        undoManager.undo();
053                    }
054                }
055            };
056            }
057            @SuppressWarnings("serial")
058            public static Action createRedoAction(final UndoManager undoManager, String name) {
059                    return new AbstractAction(name) {
060                public void actionPerformed(ActionEvent arg0) {
061                    if (undoManager.canRedo()) {
062                        undoManager.redo();
063                    }
064                }
065            };
066            }
067            public static void registerUndoRedoActions(JComponent jtc, Action undoAction, Action redoAction) {
068            InputMap inputMap = jtc.getInputMap();
069            inputMap.put(KeyStroke.getKeyStroke("pressed UNDO"), "undo");
070            inputMap.put(KeyStroke.getKeyStroke("ctrl pressed Z"), "undo");
071            inputMap.put(KeyStroke.getKeyStroke("meta pressed Z"), "undo");
072            
073            inputMap.put(KeyStroke.getKeyStroke("pressed REDO"), "redo");
074            inputMap.put(KeyStroke.getKeyStroke("ctrl pressed Y"), "redo");
075            inputMap.put(KeyStroke.getKeyStroke("meta pressed Y"), "redo");
076            
077            ActionMap actionMap = jtc.getActionMap();
078            actionMap.put("undo", undoAction);
079            actionMap.put("redo", redoAction);
080            }
081            
082        public final static void addUndoRedoSupport(final JTextComponent jtc) {
083            jtc.addPropertyChangeListener("document", new PropertyChangeListener() {
084                    public void propertyChange(PropertyChangeEvent evt) {
085                            UndoRedoUtils.registerNewUndoManager(jtc);
086                    }
087                    
088            });
089            UndoRedoUtils.registerNewUndoManager(jtc);
090        }
091        public final static JPanel makeEntriesPanel(BeansController<?> beansController,int widthMin,FormElement[] formElements)  {
092            GridBagLayout gbl = new GridBagLayout();
093            GridBagConstraints gbc = new GridBagConstraints();
094            gbc.weighty=1;
095            
096            JPanel panel=new JPanel(gbl);//new GridLayout(captionsAndProperties.length,2));
097            int space=5,pad=1;
098            Insets labelsInsets=new Insets(pad,space,pad,space);
099            Insets editorsInsets=new Insets(pad,pad,pad,pad);
100            for (int i=0;i<formElements.length;i++) {
101                gbc.gridy=i;
102                
103                FormElement formElement=formElements[i];
104                
105                JLabel label=new JLabel(formElement.name,JLabel.RIGHT);
106                gbc.fill=GridBagConstraints.NONE;
107                gbc.anchor=GridBagConstraints.NORTHEAST;
108                gbc.gridx=0;
109                gbc.weightx=0;
110                gbc.insets=labelsInsets;
111                gbl.setConstraints(label, gbc);
112                panel.add(label);
113                
114                Component editor=
115                    formElement.editorComponent==null ?
116                        beansController.createScrollableViewComponent(
117                            formElement.propertyName, 
118                            null, 
119                            formElement.title, 
120                            formElement.toolTip, 
121                            formElement.largeComponent
122                        ) :
123                            formElement.editorComponent;
124                gbc.fill=GridBagConstraints.HORIZONTAL;
125                gbc.gridx=1;
126                gbc.weightx=6;
127                gbc.insets=editorsInsets;
128                gbl.setConstraints(editor, gbc);
129                panel.add(editor);
130            }
131            JPanel ret=new JPanel(new BorderLayout());
132            ret.add("Center",panel);
133            ret.add("South",Box.createHorizontalStrut(widthMin));
134            return ret;
135        }
136    }