blob: a06e00326eb39d4cc041992c5565d3eaf60849d9 [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.j2ee.persistence.wizard;
import java.awt.Component;
import java.io.IOException;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.netbeans.api.java.classpath.ClassPath;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.SourceGroup;
import org.netbeans.modules.j2ee.core.api.support.SourceGroups;
import org.netbeans.modules.j2ee.core.api.support.java.JavaIdentifiers;
import org.netbeans.modules.j2ee.persistence.api.EntityClassScope;
import org.netbeans.modules.j2ee.persistence.api.PersistenceScope;
import org.netbeans.modules.j2ee.persistence.api.metadata.orm.Entity;
import org.netbeans.modules.j2ee.persistence.dd.PersistenceMetadata;
import org.netbeans.modules.j2ee.persistence.dd.PersistenceUtils;
import org.netbeans.modules.j2ee.persistence.dd.common.Persistence;
import org.netbeans.modules.j2ee.persistence.provider.InvalidPersistenceXmlException;
import org.netbeans.modules.j2ee.persistence.provider.ProviderUtil;
import org.netbeans.spi.project.ui.templates.support.Templates;
import org.openide.WizardDescriptor;
import org.openide.filesystems.FileObject;
import org.openide.util.ChangeSupport;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle;
import org.openide.util.RequestProcessor;
/**
*
* @author Pavel Buzek
*/
public class PersistenceClientEntitySelectionVisual extends JPanel {
private static final long serialVersionUID = -4552755466067867817L;
private ChangeSupport changeSupport = new ChangeSupport(this);
private Project project;
//private PersistenceUnit persistenceUnit;
private boolean createPU = true;//right now this panel is used in wizards with required pu (but need to handle if pu already created)
private EntityClosure entityClosure;
private final boolean disableNoIdSelection;
public PersistenceClientEntitySelectionVisual(String name,
WizardDescriptor wizard)
{
this( name , wizard , false );
}
public PersistenceClientEntitySelectionVisual(String name,
WizardDescriptor wizard , boolean requireReferencedClasses )
{
setName(name);
initComponents();
ListSelectionListener selectionListener = new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
updateButtons();
}
};
listAvailable.getSelectionModel().addListSelectionListener(selectionListener);
listSelected.getSelectionModel().addListSelectionListener(selectionListener);
disableNoIdSelection = wizard.getProperty(PersistenceClientEntitySelection.DISABLENOIDSELECTION) == Boolean.TRUE;
if ( requireReferencedClasses ){
cbAddRelated.setSelected( true );
cbAddRelated.setVisible( false );
}
}
/**
* @return if wizard have selected option to create new pu.
*/
public boolean getCreatePersistenceUnit() {
return createPU && createPUCheckbox.isVisible();//if checkbox isn't visible, regardless of selection, pu creation is not required
}
private Set<String> getSelectedEntities(JList list) {
Set<String> result = new HashSet<String>();
for (Object elem : Util.getSelectedItems(list, true)){
result.add((String) elem);
}
return result;
}
private Set<String> getEnabledEntities(JList list) {
Set<String> result = new HashSet<String>();
for (Object elem : Util.getEnabledItems(list)){
result.add((String) elem);
}
return result;
}
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
labelAvailableEntities = new javax.swing.JLabel();
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
listAvailable = new javax.swing.JList();
createPUCheckbox = new javax.swing.JCheckBox();
workAround1 = new javax.swing.JPanel();
panelButtons = new javax.swing.JPanel();
buttonAdd = new javax.swing.JButton();
buttonRemove = new javax.swing.JButton();
buttonAddAll = new javax.swing.JButton();
buttonRemoveAll = new javax.swing.JButton();
workAround2 = new javax.swing.JPanel();
labelSelectedEntities = new javax.swing.JLabel();
jPanel2 = new javax.swing.JPanel();
jScrollPane2 = new javax.swing.JScrollPane();
listSelected = new javax.swing.JList();
cbAddRelated = new javax.swing.JCheckBox();
setPreferredSize(new java.awt.Dimension(500, 100));
setLayout(new java.awt.GridBagLayout());
labelAvailableEntities.setDisplayedMnemonic(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "MNE_AvailableEntityClasses").charAt(0));
labelAvailableEntities.setLabelFor(listAvailable);
labelAvailableEntities.setText(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "LBL_AvailableEntities")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.ipadx = 1;
gridBagConstraints.ipady = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
add(labelAvailableEntities, gridBagConstraints);
jPanel1.setLayout(new java.awt.BorderLayout());
listAvailable.setCellRenderer(ENTITY_LIST_RENDERER_AV);
jScrollPane1.setViewportView(listAvailable);
listAvailable.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "LBL_AvailableEntitiesList")); // NOI18N
listAvailable.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "ACSD_AvailableEntitiesList")); // NOI18N
jPanel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.ipadx = 1;
gridBagConstraints.ipady = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(jPanel1, gridBagConstraints);
createPUCheckbox.setSelected(true);
org.openide.awt.Mnemonics.setLocalizedText(createPUCheckbox, org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "LBL_CreatePersistenceUnit")); // NOI18N
createPUCheckbox.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
createPUCheckbox.setEnabled(false);
createPUCheckbox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
createPUCheckboxItemStateChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
add(createPUCheckbox, gridBagConstraints);
javax.swing.GroupLayout workAround1Layout = new javax.swing.GroupLayout(workAround1);
workAround1.setLayout(workAround1Layout);
workAround1Layout.setHorizontalGroup(
workAround1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 1, Short.MAX_VALUE)
);
workAround1Layout.setVerticalGroup(
workAround1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 444, Short.MAX_VALUE)
);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 32;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridheight = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.ipadx = 1;
gridBagConstraints.ipady = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
add(workAround1, gridBagConstraints);
panelButtons.setLayout(new java.awt.GridBagLayout());
buttonAdd.setMnemonic(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "MNE_Add").charAt(0));
buttonAdd.setText(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "LBL_Add")); // NOI18N
buttonAdd.setActionCommand("&Add >");
buttonAdd.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonAddActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.ipadx = 74;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
panelButtons.add(buttonAdd, gridBagConstraints);
buttonAdd.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "ACSD_Add")); // NOI18N
buttonRemove.setMnemonic(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "MNE_Remove").charAt(0));
buttonRemove.setText(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "LBL_Remove")); // NOI18N
buttonRemove.setActionCommand("< &Remove");
buttonRemove.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonRemoveActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.ipadx = 54;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 0, 0, 0);
panelButtons.add(buttonRemove, gridBagConstraints);
buttonRemove.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "ACSD_Remove")); // NOI18N
buttonAddAll.setMnemonic(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "MNE_AddAll").charAt(0));
buttonAddAll.setText(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "LBL_AddAll")); // NOI18N
buttonAddAll.setActionCommand("Add A&ll >>");
buttonAddAll.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonAddAllActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.ipadx = 52;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(20, 0, 0, 0);
panelButtons.add(buttonAddAll, gridBagConstraints);
buttonAddAll.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "ACSD_AddAll")); // NOI18N
buttonRemoveAll.setMnemonic(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "MNE_RemoveAll").charAt(0));
buttonRemoveAll.setText(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "LBL_RemoveAll")); // NOI18N
buttonRemoveAll.setActionCommand("<< Re&moveAll");
buttonRemoveAll.setMaximumSize(new java.awt.Dimension(137, 23));
buttonRemoveAll.setMinimumSize(new java.awt.Dimension(137, 23));
buttonRemoveAll.setPreferredSize(new java.awt.Dimension(137, 23));
buttonRemoveAll.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonRemoveAllActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 0, 0, 0);
panelButtons.add(buttonRemoveAll, gridBagConstraints);
buttonRemoveAll.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "ACSD_RemoveAll")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 33;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.ipadx = 1;
gridBagConstraints.ipady = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 5);
add(panelButtons, gridBagConstraints);
javax.swing.GroupLayout workAround2Layout = new javax.swing.GroupLayout(workAround2);
workAround2.setLayout(workAround2Layout);
workAround2Layout.setHorizontalGroup(
workAround2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 1, Short.MAX_VALUE)
);
workAround2Layout.setVerticalGroup(
workAround2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 444, Short.MAX_VALUE)
);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 34;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridheight = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.ipadx = 1;
gridBagConstraints.ipady = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
add(workAround2, gridBagConstraints);
labelSelectedEntities.setDisplayedMnemonic(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "MNE_SelectedEntityClasses").charAt(0));
labelSelectedEntities.setLabelFor(listSelected);
labelSelectedEntities.setText(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "LBL_SelectedEntities")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 222;
gridBagConstraints.gridy = 0;
gridBagConstraints.ipadx = 1;
gridBagConstraints.ipady = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
add(labelSelectedEntities, gridBagConstraints);
jPanel2.setLayout(new java.awt.BorderLayout());
listSelected.setCellRenderer(ENTITY_LIST_RENDERER_SEL);
jScrollPane2.setViewportView(listSelected);
listSelected.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "LBL_SelectedEntitiesList")); // NOI18N
listSelected.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "ACSD_SelectedEntitiesList")); // NOI18N
jPanel2.add(jScrollPane2, java.awt.BorderLayout.CENTER);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 222;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(jPanel2, gridBagConstraints);
cbAddRelated.setMnemonic(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "MNE_InludeRelated").charAt(0));
cbAddRelated.setSelected(true);
cbAddRelated.setText(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "LBL_IncludeReferenced")); // NOI18N
cbAddRelated.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
cbAddRelated.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cbAddRelatedActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 222;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
add(cbAddRelated, gridBagConstraints);
cbAddRelated.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "LBL_IncludeReferencedCheckbox")); // NOI18N
cbAddRelated.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "ACSD_IncludeReferencedCheckbox")); // NOI18N
}// </editor-fold>//GEN-END:initComponents
private void cbAddRelatedActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbAddRelatedActionPerformed
listSelected.clearSelection();
listAvailable.clearSelection();
entityClosure.setClosureEnabled(cbAddRelated.isSelected());
changeSupport.fireChange();
}//GEN-LAST:event_cbAddRelatedActionPerformed
private void createPUCheckboxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_createPUCheckboxItemStateChanged
createPU = createPUCheckbox.isVisible() && createPUCheckbox.isSelected();
}//GEN-LAST:event_createPUCheckboxItemStateChanged
private void buttonRemoveAllActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonRemoveAllActionPerformed
entityClosure.removeAllEntities(); listSelected.clearSelection(); updateButtons(); changeSupport.fireChange(); }//GEN-LAST:event_buttonRemoveAllActionPerformed
private void buttonAddAllActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonAddAllActionPerformed
listAvailable.clearSelection(); entityClosure.addEntities(getEnabledEntities(listAvailable)); updateButtons(); changeSupport.fireChange(); }//GEN-LAST:event_buttonAddAllActionPerformed
private void buttonRemoveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonRemoveActionPerformed
entityClosure.removeEntities(getSelectedEntities(listSelected)); listSelected.clearSelection(); updateButtons(); changeSupport.fireChange(); }//GEN-LAST:event_buttonRemoveActionPerformed
private void buttonAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonAddActionPerformed
entityClosure.addEntities(getSelectedEntities(listAvailable)); listAvailable.clearSelection(); updateButtons(); changeSupport.fireChange(); }//GEN-LAST:event_buttonAddActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton buttonAdd;
private javax.swing.JButton buttonAddAll;
private javax.swing.JButton buttonRemove;
private javax.swing.JButton buttonRemoveAll;
private javax.swing.JCheckBox cbAddRelated;
private javax.swing.JCheckBox createPUCheckbox;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JLabel labelAvailableEntities;
private javax.swing.JLabel labelSelectedEntities;
private javax.swing.JList listAvailable;
private javax.swing.JList listSelected;
private javax.swing.JPanel panelButtons;
private javax.swing.JPanel workAround1;
private javax.swing.JPanel workAround2;
// End of variables declaration//GEN-END:variables
public void addChangeListener(ChangeListener listener) {
changeSupport.addChangeListener(listener);
}
public boolean valid(WizardDescriptor wizard) {
SourceGroup[] groups = SourceGroups.getJavaSourceGroups(project);
if (groups.length > 0) {
ClassPath compileCP = ClassPath.getClassPath(groups[0].getRootFolder(), ClassPath.COMPILE);
if (compileCP==null || compileCP.findResource("javax/persistence/Entity.class") == null) { // NOI18N
wizard.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "ERR_NoPersistenceProvider"));
return false;
}
}
if (!ProviderUtil.isValidServerInstanceOrNone(project)){
wizard.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE,
NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class,"ERR_MissingServer")); //NOI18N
return false;
}
if (!entityClosure.isModelReady()) {
wizard.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "scanning-in-progress"));
return false;
}
if (listSelected.getModel().getSize() == 0) {
wizard.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "MSG_NoEntityClassesSelected"));
return false;
}
if (entityClosure.isEjbModuleInvolved()) {
wizard.putProperty(WizardDescriptor.PROP_WARNING_MESSAGE, NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "WARN_DetectedEntitiesFromEjbModule"));
return true;
}
wizard.putProperty(WizardDescriptor.PROP_WARNING_MESSAGE, " "); //NOI18N
wizard.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, " "); //NOI18N
return true;
}
public void read(WizardDescriptor settings) {
project = Templates.getProject(settings);
EntityClassScope entityClassScope = EntityClassScope.getEntityClassScope(project.getProjectDirectory());
entityClosure = EntityClosure.create(entityClassScope, project);
entityClosure.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
changeSupport.fireChange();
updateAddAllButton();
}
});
entityClosure.setClosureEnabled(cbAddRelated.isSelected());
listAvailable.setModel(new EntityListModel(entityClosure, true));
listSelected.setModel(new EntityListModel(entityClosure, false));
@SuppressWarnings("unchecked")
List<String> entities = (List<String>) settings.getProperty(WizardProperties.ENTITY_CLASS);
if (entities == null) {
entities = new ArrayList<String>();
}
entityClosure.addEntities(new HashSet<String>(entities));
updateButtons();
updatePersistenceUnitButton();
}
public void store(WizardDescriptor settings) {
ListModel model = listSelected.getModel();
if (model instanceof EntityListModel) {
EntityListModel elm = (EntityListModel) model;
settings.putProperty(WizardProperties.ENTITY_CLASS, elm.getEntityClasses());
}
}
private void updateButtons() {
Set selectedItems = Util.getSelectedItems(listAvailable, true);
buttonAdd.setEnabled(!selectedItems.isEmpty());
updateAddAllButton();
buttonRemove.setEnabled(listSelected.getSelectedValues().length > 0);
buttonRemoveAll.setEnabled(entityClosure.getSelectedEntities().size() > 0);
}
private void updateAddAllButton(){
buttonAddAll.setEnabled(!Util.getEnabledItems(listAvailable).isEmpty());
}
public void updatePersistenceUnitButton() {
boolean visible = true;
if (ProviderUtil.isValidServerInstanceOrNone(project) && visible) {
try {
visible = !ProviderUtil.persistenceExists(project);
} catch (InvalidPersistenceXmlException ex) {
Exceptions.printStackTrace(ex);
}
}
createPUCheckbox.setVisible(visible);
}
private final ListCellRenderer ENTITY_LIST_RENDERER_AV = new EntityListCellRenderer( true );
private final ListCellRenderer ENTITY_LIST_RENDERER_SEL = new EntityListCellRenderer( false );
private class EntityListModel extends AbstractListModel implements ChangeListener {
private EntityClosure entityClosure;
private List<String> entities = new ArrayList<String>();
private boolean available;
EntityListModel(EntityClosure entityClosure, boolean available) {
this.entityClosure = entityClosure;
this.available = available;
entityClosure.addChangeListener(this);
refresh();
}
@Override
public int getSize() {
return entities.size();
}
@Override
public Object getElementAt(int index) {
return entities.get(index);
}
/**
* @return the fully qualified names of the entities in this model.
*/
public List<String> getEntityClasses() {
return entities;
}
@Override
public void stateChanged(ChangeEvent e) {
refresh();
}
private void refresh() {
int oldSize = getSize();
entities = new ArrayList<String>(available ? entityClosure.getAvailableEntities() : entityClosure.getSelectedEntities());
Collections.sort(entities);
fireContentsChanged(this, 0, Math.max(oldSize, getSize()));
}
}
private final class EntityListCellRenderer extends DefaultListCellRenderer {
private boolean available;
public EntityListCellRenderer(boolean available) {
setOpaque(true);
this.available = available;
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Component component = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
JLabel label = (JLabel)component;
String text = null;
boolean disable = false;
if (value instanceof Entity) {
Entity entity = ((Entity) value);
text = entity.getClass2();
if (text != null) {
String simpleName = JavaIdentifiers.unqualify(text);
String packageName = text.length() > simpleName.length() ? text.substring(0, text.length() - simpleName.length() - 1) : "<default package>";
text = simpleName + " (" + packageName + ")";
} else {
Logger.getLogger("global").log(Level.INFO, "Entity:" + value + " returns null from getClass2(); see IZ 80024"); //NOI18N
}
if(disableNoIdSelection && available && entityClosure.haveId(entity.getClass2())!=Boolean.TRUE){
text += " (" + NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "ERR_NoId") + ")";//NOI18N
disable = disableNoIdSelection;
}
}
if (text == null) {
text = value.toString();
if(disableNoIdSelection && available && entityClosure.haveId(text)!=Boolean.TRUE && entityClosure.getEntity(text)!=null){
text += " (" + NbBundle.getMessage(PersistenceClientEntitySelectionVisual.class, "ERR_NoId") + ")";//NOI18N
disable = disableNoIdSelection;
}
}
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
if(text.length() == 0)text = " ";
label.setEnabled((entityClosure.getAvailableEntities().contains(value) || entityClosure.getWantedEntities().contains(value)) && !disable);
//setFont(list.getFont());
label.setText(text);
return label;
}
}
}