/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* EntityPanel.java
*
* Created on 24.03.2009, 17:42:01
*/
package reportgen.gui.genepanel.corepanel.entitypanel;
import reportgen.prototype.entity.QEntity;
import reportgen.gui.genepanel.corepanel.entitypanel.dlg.NewReportEntityDlg;
import java.awt.Window;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import javax.swing.tree.TreePath;
import reportgen.cores.ejb.set.QEntitySet;
import reportgen.prototype.Core;
import reportgen.utils.ReportException;
import reportgen.utils.Message;
/**
*
* @author axe
*/
public class EntityPanel extends javax.swing.JPanel {
private final Core core;
private final Window parent;
private final QEntitySet entitySet;
/** Creates new form EntityPanel */
public EntityPanel(Window parent, Core core) {
initComponents();
this.parent = parent;
this.core = core;
this.entitySet = core.getSet();
mainTree.setModel(new ReportEntityModel(core.getRoot()));
mainTree.setCellRenderer(new ModelRenderer());
distinctValue.setEnabled(true);
distinctValue.setSelected(core.isDistinct());
delReportEntityBtn.setEnabled(false);
}
/** 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.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jPanel4 = new javax.swing.JPanel();
aliasPanel = new javax.swing.JPanel();
distinctValue = new javax.swing.JCheckBox();
leftJoinCheck = new javax.swing.JCheckBox();
jScrollPane1 = new javax.swing.JScrollPane();
mainTree = new javax.swing.JTree();
jPanel1 = new javax.swing.JPanel();
addReportEntityBtn = new javax.swing.JButton();
delReportEntityBtn = new javax.swing.JButton();
jPanel4.setLayout(new java.awt.BorderLayout(5, 5));
aliasPanel.setLayout(new java.awt.GridLayout(0, 1, 5, 5));
distinctValue.setText("Первый объект в отчете должен быть уникальным");
distinctValue.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
distinctValueActionPerformed(evt);
}
});
aliasPanel.add(distinctValue);
leftJoinCheck.setText("Объект необязателен");
leftJoinCheck.setEnabled(false);
leftJoinCheck.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
leftJoinCheckActionPerformed(evt);
}
});
aliasPanel.add(leftJoinCheck);
jPanel4.add(aliasPanel, java.awt.BorderLayout.PAGE_START);
jScrollPane1.setPreferredSize(new java.awt.Dimension(200, 382));
mainTree.setModel(null);
mainTree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
mainTreeValueChanged(evt);
}
});
jScrollPane1.setViewportView(mainTree);
jPanel4.add(jScrollPane1, java.awt.BorderLayout.CENTER);
jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT));
addReportEntityBtn.setText("Добавить");
addReportEntityBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addReportEntityBtnActionPerformed(evt);
}
});
jPanel1.add(addReportEntityBtn);
delReportEntityBtn.setText("Удалить");
delReportEntityBtn.setEnabled(false);
delReportEntityBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
delReportEntityBtnActionPerformed(evt);
}
});
jPanel1.add(delReportEntityBtn);
jPanel4.add(jPanel1, java.awt.BorderLayout.SOUTH);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, 553, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, 405, Short.MAX_VALUE)
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents
private void distinctValueActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_distinctValueActionPerformed
core.setDistinct(distinctValue.isSelected());
}//GEN-LAST:event_distinctValueActionPerformed
private QEntity getSelectedReportEntity() {
TreePath path = mainTree.getSelectionModel().getSelectionPath();
if(path == null) {
return null;
}
return (QEntity) path.getLastPathComponent();
}
private void mainTreeValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_mainTreeValueChanged
try {
QEntity ren = getSelectedReportEntity();
if(ren == null) {
throw new IllegalStateException();
}
delReportEntityBtn.setEnabled(true);
leftJoinCheck.setEnabled(ren.canBeJoined());
leftJoinCheck.setSelected(ren.isJoined());
} catch (IllegalStateException ex) {
delReportEntityBtn.setEnabled(false);
leftJoinCheck.setEnabled(false);
} catch (Exception ex) {
Message.warning(this, ex);
delReportEntityBtn.setEnabled(false);
leftJoinCheck.setEnabled(false);
}
}//GEN-LAST:event_mainTreeValueChanged
private void addReportEntityBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addReportEntityBtnActionPerformed
TreePath path = mainTree.getSelectionPath();
TreePath newpath = null;
ReportEntityModel model = (ReportEntityModel) mainTree.getModel();
QEntity children[] = null;
if(path == null) {
if(core.getRoot() != null) {
Message.warning(this, "Выберите элемент для связи");
return;
}
children = entitySet.getAvailableEntities(core.getContextGroup());
} else {
QEntity ren = (QEntity) path.getLastPathComponent();
children = ren.getAvialiableEntities();
}
if(children == null) {
Message.warning(this, "У данного объекта нет связанных сущностей");
return;
}
ArrayList<QEntity> childrenList = new ArrayList<QEntity>();
ArrayList<QEntity> originalList = new ArrayList<QEntity>();
for(QEntity child: children) {
childrenList.add(child);
originalList.add(child);
}
Collections.sort(childrenList, new Comparator<QEntity>() {
@Override
public int compare(QEntity o1, QEntity o2) {
return o1.toString().compareTo(o2.toString());
}
});
NewReportEntityDlg dlg = new NewReportEntityDlg(parent, childrenList);
dlg.setVisible(true);
if(dlg.isOK()) {
int index = dlg.getSelectedIndex();
QEntity selectedEntity = childrenList.get(index);
if(path == null) {
core.setRoot(selectedEntity);
mainTree.setModel(new ReportEntityModel(selectedEntity));
newpath = new TreePath(selectedEntity);
} else {
QEntity parentEntity = (QEntity) path.getLastPathComponent();
index = originalList.indexOf(selectedEntity);
parentEntity.addSelectedEntity(index);
ArrayList<Object> newTreePath = new ArrayList<Object>();
for(Object obj: path.getPath()) {
newTreePath.add(obj);
}
newTreePath.add(selectedEntity);
newpath = new TreePath(newTreePath.toArray());
model.nodeInserted(newpath);
}
mainTree.setSelectionPath(newpath);
}
}//GEN-LAST:event_addReportEntityBtnActionPerformed
private void delReportEntityBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_delReportEntityBtnActionPerformed
TreePath path = mainTree.getSelectionPath();
if(path == null) {
Message.warning(this, "Выберите объект в дереве для удаления");
return;
}
QEntity ren = (QEntity) path.getLastPathComponent();
if(ren.getSelectedEntities() != null) {
Message.warning(this, "Можно удалять только конечные элементы");
return;
}
try {
if (path.getPathCount() == 1) {
core.removeEntity(null, ren);
mainTree.setModel(new ReportEntityModel(null));
} else {
TreePath parentPath = path.getParentPath();
QEntity parentEnt = (QEntity) parentPath.getLastPathComponent();
QEntity[] children = parentEnt.getSelectedEntities();
for (int i = 0; i < children.length; i++) {
if (children[i] == ren) {
core.removeEntity(parentEnt, ren);
ReportEntityModel model = (ReportEntityModel) mainTree.getModel();
model.nodeRemoved(parentPath, new int[]{i}, new Object[]{ren});
mainTree.setSelectionPath(parentPath);
break;
}
}
}
} catch (ReportException ex) {
Message.warning(this, ex);
}
}//GEN-LAST:event_delReportEntityBtnActionPerformed
private void leftJoinCheckActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_leftJoinCheckActionPerformed
TreePath path = mainTree.getSelectionPath();
if(path == null) {
Message.warning(this, "Выберите объект в дереве");
return;
}
QEntity ren = (QEntity) path.getLastPathComponent();
if(!ren.canBeJoined()) {
leftJoinCheck.setEnabled(false);
} else {
ren.setJoined(leftJoinCheck.isSelected());
}
mainTree.updateUI();
}//GEN-LAST:event_leftJoinCheckActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addReportEntityBtn;
private javax.swing.JPanel aliasPanel;
private javax.swing.JButton delReportEntityBtn;
private javax.swing.JCheckBox distinctValue;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel4;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JCheckBox leftJoinCheck;
private javax.swing.JTree mainTree;
// End of variables declaration//GEN-END:variables
}