|
What this is
Other links
The source code/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original * Code is Sun Microsystems, Inc. Portions Copyright 1997-2003 Sun * Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.refactoring.ui; import java.awt.Container; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.jmi.reflect.RefObject; import javax.swing.JEditorPane; import javax.swing.JTree; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import org.netbeans.modules.refactoring.api.RefactoringElement; import org.netbeans.jmi.javamodel.Feature; import org.netbeans.jmi.javamodel.Import; import org.netbeans.jmi.javamodel.Resource; import org.netbeans.modules.refactoring.NbAbstractRefactoring; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; import org.openide.text.CloneableEditorSupport; import org.openide.text.PositionBounds; import org.openide.text.PositionRef; import org.openide.util.NbBundle; import org.openide.windows.TopComponent; /** * This listener controls click and double click on the CheckNodes. In addition * to it provides support for keyboard node checking/unchecking and opening * document. * * todo (#pf): Improve behaviour and comments. * * @author Pavel Flaska */ class CheckNodeListener implements MouseListener, KeyListener { private final boolean isQuery; public CheckNodeListener(boolean isQuery) { this.isQuery = isQuery; } public void mouseClicked(MouseEvent e) { // todo (#pf): we need to solve problem between click and double // click - click should be possible only on the check box area // and double click should be bordered by title text. // we need a test how to detect where the mouse pointer is JTree tree = (JTree) e.getSource(); Point p = e.getPoint(); int x = e.getX(); int y = e.getY(); int row = tree.getRowForLocation(x, y); TreePath path = tree.getPathForRow(row); // if path exists and mouse is clicked exactly once if (path != null) { CheckNode node = (CheckNode) path.getLastPathComponent(); if (isQuery) { if (e.getClickCount() == 2) { findInSource(node); } } else { Rectangle chRect = CheckRenderer.getCheckBoxRectangle(); Rectangle rowRect = tree.getPathBounds(path); chRect.setLocation(chRect.x + rowRect.x, chRect.y + rowRect.y); if (e.getClickCount() == 1 && chRect.contains(p)) { boolean isSelected = !(node.isSelected()); node.setSelected(isSelected); if (node.getSelectionMode() == CheckNode.DIG_IN_SELECTION) { if (isSelected) tree.expandPath(path); else tree.collapsePath(path); } ((DefaultTreeModel) tree.getModel()).nodeChanged(node); if (row == 0) { tree.revalidate(); tree.repaint(); } } // double click, open the document else if (e.getClickCount() == 2 && chRect.contains(p) == false) { findInSource(node); } } } } public void keyTyped(KeyEvent e) { } public void keyReleased(KeyEvent e) { // Enter key was pressed, find the reference in document if (e.getKeyCode() == KeyEvent.VK_ENTER) { JTree tree = (JTree) e.getSource(); TreePath path = tree.getSelectionPath(); if (path != null) { CheckNode node = (CheckNode) path.getLastPathComponent(); findInSource(node); e.getComponent().requestFocus(); } } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void keyPressed(KeyEvent e) { if (e.getKeyChar() == ' ') { JTree tree = (JTree) e.getSource(); TreePath path = tree.getSelectionPath(); if (path != null) { CheckNode node = (CheckNode) path.getLastPathComponent(); node.setSelected(!node.isSelected()); e.consume(); } } } private static void findInSource(CheckNode node) { PositionBounds bounds = node.getPosition(); if (bounds == null) return; Object o = node.getUserObject(); boolean highlight; if (o instanceof RefactoringElement) { highlight = true; } else if (o instanceof Feature || o instanceof Import || o instanceof Resource) { highlight = false; } else { return; } PositionRef beginPos=bounds.getBegin(); CloneableEditorSupport editSupp=beginPos.getCloneableEditorSupport(); JEditorPane[] panes=editSupp.getOpenedPanes(); if (panes==null) { editSupp.open(); panes=editSupp.getOpenedPanes(); } if (panes!=null) { if (highlight) { panes[0].setCaretPosition(bounds.getEnd().getOffset()); panes[0].moveCaretPosition(beginPos.getOffset()); } else { panes[0].setCaretPosition(beginPos.getOffset()); //panes[0].requestFocus(); } Container temp = panes[0]; while (!(temp instanceof TopComponent)) { temp = temp.getParent(); } ((TopComponent) temp).requestActive(); } else { // todo (#pf): what to do if there is no pane? -- now, there // is a error message. I'm not sure, maybe this code will be // never called. DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message( NbBundle.getMessage(CheckNodeListener.class,"ERR_ErrorOpeningEditor")) ); } } } // end CheckNodeListener |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.