001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: /*
043: * Created on Jun 12, 2003
044: *
045: */
046: package org.netbeans.modules.uml.ui.swing.treetable;
047:
048: import java.awt.event.ActionEvent;
049: import java.awt.event.FocusEvent;
050: import java.awt.event.FocusListener;
051: import java.awt.event.KeyEvent;
052: import java.awt.event.KeyListener;
053:
054: import javax.swing.JComboBox;
055: import javax.swing.plaf.basic.BasicComboBoxUI;
056: import javax.swing.table.TableCellEditor;
057:
058: import org.netbeans.modules.uml.common.ETSystem;
059: import org.netbeans.modules.uml.ui.swing.propertyeditor.PropertyEditor;
060:
061: /**
062: * @author sumitabhk
063: *
064: */
065: public class JDescribeComboBox extends JComboBox {
066: PropertyEditor m_Editor = null;
067:
068: /**
069: *
070: */
071: public JDescribeComboBox() {
072: super ();
073: setEditable(true);
074: setUI(new NewBasicComboBoxUI());
075: }
076:
077: public JDescribeComboBox(PropertyEditor editor) {
078: super ();
079: setEditable(true);
080: setRequestFocusEnabled(true);
081: setFocusable(true);
082: setLightWeightPopupEnabled(false);
083: setUI(new NewBasicComboBoxUI());
084: m_Editor = editor;
085:
086: //Need to add the key listener to the editor of this combo box, else I am not getting key
087: //event after I type in something.
088: getEditor().getEditorComponent().addKeyListener(
089: new KeyListener() {
090:
091: public void keyTyped(KeyEvent e) {
092: }
093:
094: public void keyPressed(KeyEvent e) {
095: if (m_Editor != null) {
096: Object obj = m_Editor.getGrid();
097: if (obj != null
098: && obj instanceof JTreeTable) {
099: TableCellEditor editor = ((JTreeTable) obj)
100: .getCellEditor();
101: if (editor != null
102: && editor instanceof TreeTableCellEditor) {
103: ((TreeTableCellEditor) editor)
104: .handleKeyPress(e);
105: }
106: }
107: }
108: }
109:
110: public void keyReleased(KeyEvent e) {
111: }
112: });
113:
114: getEditor().getEditorComponent().addFocusListener(
115: new FocusListener() {
116:
117: public void focusGained(FocusEvent e) {
118: }
119:
120: public void focusLost(FocusEvent e) {
121: if (e.getOppositeComponent() == null) {
122: ETSystem.out.println("Focus lost on null");
123: // if the component that is taking the focus away from the property editor is null
124: // then we are ASSUMING that it is another application
125: if (m_Editor != null) {
126: m_Editor.handleSave(true, null);
127: m_Editor.setEditingComponent(null);
128: }
129: }
130: }
131: });
132:
133: }
134:
135: public void actionPerformed(ActionEvent e) {
136: super .actionPerformed(e);
137:
138: //when Enter key is pressed, we get this event - in Property Editor we want to commit the change
139: //made at this point, so extra code.
140: if (m_Editor != null) {
141: Object obj = m_Editor.getGrid();
142: if (obj != null && obj instanceof JTreeTable) {
143: TableCellEditor editor = ((JTreeTable) obj)
144: .getCellEditor();
145: if (editor != null
146: && editor instanceof TreeTableCellEditor) {
147: //((TreeTableCellEditor)editor).handleKeyPress(new KeyEvent(this, KeyEvent.KEY_PRESSED, 0, 0, KeyEvent.VK_ENTER, KeyEvent.CHAR_UNDEFINED));
148: }
149: }
150: }
151: }
152:
153: // our extended BasicComboBoxUI class
154: class NewBasicComboBoxUI extends BasicComboBoxUI {
155: /* to catch hold of the focuslistener set in the BasicComboBoxUI */
156:
157: //FocusListener prevFocusListener;
158: KeyListener prevKeyListener;
159:
160: public NewBasicComboBoxUI() {
161: super ();
162: // catch it here after being installed
163: //prevFocusListener = focusListener;
164: prevKeyListener = keyListener;
165: }
166:
167: // protected FocusListener createFocusListener()
168: // {
169: // prevFocusListener = super.createFocusListener();
170: // return new MyFocusHandler();
171: // }
172:
173: protected KeyListener createKeyListener() {
174: prevKeyListener = super .createKeyListener();
175: return new MyKeyHandler();
176: }
177:
178: public class MyKeyHandler implements KeyListener {
179:
180: /* (non-Javadoc)
181: * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
182: */
183: public void keyTyped(KeyEvent e) {
184: }
185:
186: /* (non-Javadoc)
187: * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
188: */
189: public void keyPressed(KeyEvent e) {
190: // if (m_Editor != null)
191: // {
192: // Object obj = m_Editor.getGrid();
193: // if (obj != null && obj instanceof JTreeTable)
194: // {
195: // TableCellEditor editor = ((JTreeTable)obj).getCellEditor();
196: // if (editor != null && editor instanceof TreeTableCellEditor)
197: // {
198: // ((TreeTableCellEditor)editor).handleKeyPress(e);
199: // }
200: // }
201: // }
202: }
203:
204: /* (non-Javadoc)
205: * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
206: */
207: public void keyReleased(KeyEvent e) {
208: }
209:
210: }
211:
212: // public class MyFocusHandler implements FocusListener
213: // {
214: // public void focusLost(FocusEvent e)
215: // {
216: // //when tab key is pressed - we directly get a focusLost and no KeyEvents for the editable
217: // //combo box - so I have to commit the edit mode of this combo field and I am forcing the
218: // //user to start editing the next field. So if the user actually pressed Shift+Tab, things
219: // //will appear wrong. If the user is actually clicking on any other field in the TreeTable
220: // //using mouse he will be fine, as I am doing invokeLater to start editing that field.
221: // if (m_Editor != null)
222: // {
223: // Object source = e.getSource();
224: // Component opp = e.getOppositeComponent();
225: // ETSystem.out.println("Got Focus Lost for comp - " + source);
226: // ETSystem.out.println("Got Focus Lost for comp opp - " + opp);
227: // if (opp != null && !e.isTemporary() && source instanceof JTextField)
228: // {
229: // Object obj = m_Editor.getGrid();
230: // if (obj != null && obj instanceof JTreeTable)
231: // {
232: // TableCellEditor editor = ((JTreeTable)obj).getCellEditor();
233: // if (editor != null && editor instanceof TreeTableCellEditor)
234: // {
235: // editor.stopCellEditing();
236: // ((JTreeTable)obj).editingCanceled(null);
237: // m_Editor.editNextRow();
238: // }
239: // }
240: // }
241: // }
242: // }
243: //
244: // public void focusGained(FocusEvent e)
245: // {
246: // if (m_Editor != null)
247: // {
248: // //m_Editor.handleFocusGainedOnCellEvent(e);
249: // }
250: // }
251: // }
252:
253: }
254:
255: }
|