blob: 58e6385658c2a3ef7e70c421c61fca438f59b458 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.jakarta.web.beans.navigation;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.util.List;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.DeclaredType;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListModel;
import org.netbeans.api.java.source.CompilationController;
import org.netbeans.api.java.source.ElementHandle;
import org.netbeans.api.java.source.ui.ElementIcons;
import org.netbeans.api.java.source.ui.ElementOpen;
/**
* @author ads
*
*/
public class InjectablesPopup extends JPanel implements FocusListener {
private static final long serialVersionUID = -6156872540472708548L;
/** Creates new form DeclarationPopup */
public InjectablesPopup(String title, List<ElementHandle<? extends Element>> handles,
CompilationController controller )
{
myTitle = title;
myHandles = handles;
myController = controller;
initComponents();
jList1.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
addFocusListener(this);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
jLabel1 = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
jList1 = new javax.swing.JList();
setFocusCycleRoot(true);
setLayout(new java.awt.GridBagLayout());
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jLabel1.setText(myTitle
);
jLabel1.setFocusable(false);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
add(jLabel1, gridBagConstraints);
jList1.setModel(createListModel());
jList1.setCellRenderer(new RendererImpl( myController ));
jList1.setSelectedIndex(0);
jList1.setVisibleRowCount(myHandles.size()
);
jList1.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
jList1KeyPressed(evt);
}
});
jList1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jList1MouseClicked(evt);
}
});
jScrollPane1.setViewportView(jList1);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(jScrollPane1, gridBagConstraints);
}// </editor-fold>//GEN-END:initComponents
private void jList1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jList1MouseClicked
if (evt.getButton() == MouseEvent.BUTTON1 && evt.getClickCount() == 1) {
openSelected();
}
}//GEN-LAST:event_jList1MouseClicked
private void jList1KeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jList1KeyPressed
if (evt.getKeyCode() == KeyEvent.VK_ENTER && evt.getModifiers() == 0) {
openSelected();
}
}//GEN-LAST:event_jList1KeyPressed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel jLabel1;
private javax.swing.JList jList1;
private javax.swing.JScrollPane jScrollPane1;
// End of variables declaration//GEN-END:variables
private void openSelected() {
ElementHandle<Element> handle = (ElementHandle<Element>) jList1.getSelectedValue();
ElementOpen.open(myController.getClasspathInfo(), handle);
PopupUtil.hidePopup();
}
private ListModel createListModel() {
DefaultListModel<ElementHandle<? extends Element>> dlm = new DefaultListModel<>();
for (ElementHandle<? extends Element> el: myHandles) {
dlm.addElement(el);
}
return dlm;
}
private static class RendererImpl extends DefaultListCellRenderer {
private static final long serialVersionUID = -15584610894401459L;
RendererImpl(CompilationController controller){
myController = controller;
}
@Override
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
Component c = super.getListCellRendererComponent(list, value, index,
isSelected, cellHasFocus);
if (value instanceof ElementHandle<?>) {
ElementHandle<?> handle = (ElementHandle<?>)value;
Element resolve = handle.resolve( myController);
if ( resolve!= null) {
DeclaredType parent = null;
if ( resolve instanceof VariableElement ||
resolve instanceof ExecutableElement )
{
TypeElement enclosingTypeElement =
myController.getElementUtilities().
enclosingTypeElement(resolve);
parent = (DeclaredType)enclosingTypeElement.asType();
}
setIcon(ElementIcons.getElementIcon(resolve.getKind(),
resolve.getModifiers()));
setText(Utils.format(resolve, parent , myController));
}
}
return c;
}
private CompilationController myController;
}
@Override
public void focusGained(FocusEvent arg0) {
jList1.requestFocus();
jList1.requestFocusInWindow();
}
@Override
public void focusLost(FocusEvent arg0) {
}
private String myTitle;
private List<ElementHandle<? extends Element>> myHandles;
private CompilationController myController;
}