/*
* PanelDangerService.java
*
* Created on 26 Сентябрь 2008 г., 17:32
*/
package clips.directory.editors.danger;
import cli_fmw.delegate.directory.DirectoryItemRO;
import clips.delegate.directory.complex.DangerServiceData;
import clips.delegate.directory.complex.DirectoryDanger;
import clips.delegate.directory.complex.DirectoryDangerItem;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import clips.delegate.directory.filtered.DirectoryServiceItem;
import cli_fmw.delegate.DelegateLine2;
import clips.directory.dialogs.DirectoryDialogService;
import cli_fmw.directory.dialogs.DirectoryDialogTreeModel;
import cli_fmw.main.ClipsException;
import cli_fmw.main.PageContainer;
import cli_fmw.main.PageGeneric;
import cli_fmw.utils.MessageBox;
import cli_fmw.utils.ModalDialog;
import cli_fmw.utils.Selector;
import cli_fmw.utils.SelectorEditableExceptional;
import cli_fmw.utils.table_config_states.StateSaver;
import cli_fmw.utils.table_config_states.TableState;
import com.toedter.components.JSpinField;
import beans.directory.danger.entity.DangerDetails;
import beans.directory.danger.entity.DangerServiceDetails;
import clips.delegate.directory.simple.speciality.DirectorySpeciality;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
/**
*
* @author petr
*/
public class PanelDangerService extends PageGeneric{
private DirectoryDanger directoryDanger;
private DirectoryDangerItem current;
private SelectorEditableExceptional<DangerServiceData> serviceList;
private int spnValue;
private DirectorySpeciality dirSpec;
private JComboBox cbSpec;
/** Creates new form PanelDangerService */
public PanelDangerService(PageContainer container) throws ClipsException {
super(container);
initComponents();
directoryDanger = DirectoryLocator.getDirectory(DirectoryDanger.class);
dirSpec = DirectoryLocator.getDirectory(DirectorySpeciality.class);
cbSpec = new JComboBox(dirSpec.toArray(true));
resetTree(null);
treeDangers.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
btAddService.setEnabled(false);
btRemoveService.setEnabled(false);
tfTitle.setEnabled(false);
taDescription.setEnabled(false);
taDescription.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent arg0) {
setField(arg0.getDocument());
}
@Override
public void removeUpdate(DocumentEvent arg0) {
setField(arg0.getDocument());
}
@Override
public void changedUpdate(DocumentEvent arg0) {
}
private void setField(Document doc) {
try {
if (current != null) {
current.setDescription(doc.getText(0, doc.getLength()));
}
} catch (ClipsException ex) {
MessageBox.showException(ex);
} catch (BadLocationException ex) {
MessageBox.showException(ex);
}
}
});
resizeColumn();
StateSaver.attachTo(this);
}
private JSpinField createSpinner() {
return new com.toedter.components.JSpinField();
}
/**
*
* @param selection selected rows or null
*/
private void resetTree(DirectoryDangerItem item) throws ClipsException{
TreePath selectionPath = treeDangers.getSelectionPath();
DirectoryDialogTreeModel ddtm
= new DirectoryDialogTreeModelImpl(directoryDanger.toArray(false), "\\");
treeDangers.setModel(ddtm);
treeDangers.setSelectionPath(selectionPath);
treeDangers.expandPath(selectionPath);
}
/** 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() {
jSplitPane1 = new javax.swing.JSplitPane();
jPanel1 = new javax.swing.JPanel();
jPanel4 = new javax.swing.JPanel();
jPanel9 = new javax.swing.JPanel();
btAddService = new javax.swing.JButton();
btRemoveService = new javax.swing.JButton();
jPanel12 = new javax.swing.JPanel();
jScrollPane4 = new javax.swing.JScrollPane();
taDescription = new javax.swing.JTextArea();
jPanel5 = new javax.swing.JPanel();
jPanel6 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jScrollPane3 = new javax.swing.JScrollPane();
tfTitle = new javax.swing.JTextArea();
jPanel11 = new javax.swing.JPanel();
btRename = new javax.swing.JButton();
jPanel8 = new javax.swing.JPanel();
jLabel2 = new javax.swing.JLabel();
spnFrequency = createSpinner();
;
jLabel4 = new javax.swing.JLabel();
jPanel10 = new javax.swing.JPanel();
jScrollPane2 = new javax.swing.JScrollPane();
tblService = new cli_fmw.utils.sorted_table.SortedTable();
jPanel2 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
treeDangers = new javax.swing.JTree();
jPanel3 = new javax.swing.JPanel();
btAdd = new javax.swing.JButton();
btRemove = new javax.swing.JButton();
setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
setLayout(new java.awt.BorderLayout());
jSplitPane1.setDividerLocation(300);
jSplitPane1.setResizeWeight(0.3);
jPanel1.setLayout(new java.awt.BorderLayout());
jPanel4.setLayout(new java.awt.BorderLayout());
jPanel9.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT));
btAddService.setText("Добавить");
btAddService.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btAddServiceActionPerformed(evt);
}
});
jPanel9.add(btAddService);
btRemoveService.setText("Удалить");
btRemoveService.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btRemoveServiceActionPerformed(evt);
}
});
jPanel9.add(btRemoveService);
jPanel4.add(jPanel9, java.awt.BorderLayout.PAGE_START);
jPanel12.setBorder(javax.swing.BorderFactory.createTitledBorder("Примечание"));
jPanel12.setLayout(new javax.swing.BoxLayout(jPanel12, javax.swing.BoxLayout.LINE_AXIS));
taDescription.setColumns(20);
taDescription.setLineWrap(true);
taDescription.setRows(5);
taDescription.setWrapStyleWord(true);
jScrollPane4.setViewportView(taDescription);
jPanel12.add(jScrollPane4);
jPanel4.add(jPanel12, java.awt.BorderLayout.PAGE_END);
jPanel1.add(jPanel4, java.awt.BorderLayout.PAGE_END);
jPanel5.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
jPanel5.setLayout(new java.awt.BorderLayout());
jPanel6.setLayout(new java.awt.BorderLayout());
jLabel1.setText("Название: ");
jPanel6.add(jLabel1, java.awt.BorderLayout.LINE_START);
tfTitle.setLineWrap(true);
tfTitle.setRows(3);
tfTitle.setWrapStyleWord(true);
jScrollPane3.setViewportView(tfTitle);
jPanel6.add(jScrollPane3, java.awt.BorderLayout.CENTER);
jPanel11.setLayout(new javax.swing.BoxLayout(jPanel11, javax.swing.BoxLayout.LINE_AXIS));
btRename.setText("Изменить");
btRename.setEnabled(false);
btRename.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btRenameActionPerformed(evt);
}
});
jPanel11.add(btRename);
jPanel6.add(jPanel11, java.awt.BorderLayout.LINE_END);
jPanel5.add(jPanel6, java.awt.BorderLayout.CENTER);
jLabel2.setText("Периодичность осмотров: 1 раз в");
spnFrequency.setEnabled(false);
spnFrequency.setMinimum(0);
spnFrequency.setMinimumSize(new java.awt.Dimension(60, 20));
spnFrequency.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
public void propertyChange(java.beans.PropertyChangeEvent evt) {
spnFrequencyPropertyChange(evt);
}
});
jLabel4.setText("дней");
javax.swing.GroupLayout jPanel8Layout = new javax.swing.GroupLayout(jPanel8);
jPanel8.setLayout(jPanel8Layout);
jPanel8Layout.setHorizontalGroup(
jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel8Layout.createSequentialGroup()
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(spnFrequency, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel4))
);
jPanel8Layout.setVerticalGroup(
jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel2)
.addComponent(spnFrequency, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel4)
);
jPanel8Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {jLabel2, jLabel4, spnFrequency});
jPanel5.add(jPanel8, java.awt.BorderLayout.PAGE_END);
jPanel1.add(jPanel5, java.awt.BorderLayout.PAGE_START);
jPanel10.setBorder(javax.swing.BorderFactory.createTitledBorder("Список необходимых услуг"));
jPanel10.setLayout(new java.awt.BorderLayout());
jScrollPane2.addComponentListener(new java.awt.event.ComponentAdapter() {
public void componentResized(java.awt.event.ComponentEvent evt) {
jScrollPane2ComponentResized(evt);
}
});
tblService.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{},
{},
{},
{}
},
new String [] {
}
));
jScrollPane2.setViewportView(tblService);
jPanel10.add(jScrollPane2, java.awt.BorderLayout.CENTER);
jPanel1.add(jPanel10, java.awt.BorderLayout.CENTER);
jSplitPane1.setRightComponent(jPanel1);
jPanel2.setLayout(new java.awt.BorderLayout());
treeDangers.setEditable(true);
treeDangers.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
treeDangersValueChanged(evt);
}
});
jScrollPane1.setViewportView(treeDangers);
jPanel2.add(jScrollPane1, java.awt.BorderLayout.CENTER);
btAdd.setText("Добавить");
btAdd.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btAddActionPerformed(evt);
}
});
jPanel3.add(btAdd);
btRemove.setText("Удалить");
btRemove.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btRemoveActionPerformed(evt);
}
});
jPanel3.add(btRemove);
jPanel2.add(jPanel3, java.awt.BorderLayout.PAGE_END);
jSplitPane1.setLeftComponent(jPanel2);
add(jSplitPane1, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
private void setScreenFields(){
if (current == null){
tfTitle.setText("");
spnValue = spnFrequency.getMinimum();
spnFrequency.setValue(spnValue);
taDescription.setText("");
}else{
tfTitle.setText(current.getTitle());
spnValue = current.getFrequency();
spnFrequency.setValue(spnValue);
taDescription.setText(current.getDescription());
jPanel5.revalidate();
}
}
/**
*
* @param evt
*/
private void treeDangersValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_treeDangersValueChanged
Object o = treeDangers.getLastSelectedPathComponent();
if (o instanceof DirectoryDangerItem) {
current = (DirectoryDangerItem) o;
if (current.getID() != 0) {
try {
setEnabledControls(true);
resetTableService(current);
serviceList = current.getDangerServices();
setScreenFields();
return;
} catch (ClipsException ex) {
MessageBox.showException(ex);
setEnabledControls(false);
}
}
}
setEnabledControls(false);
serviceList = null;
current = null;
tblService.setModel(new DefaultTableModel());
setScreenFields();
}//GEN-LAST:event_treeDangersValueChanged
private void setEnabledControls(boolean enabled){
btAddService.setEnabled(enabled);
btRemoveService.setEnabled(enabled);
btRename.setEnabled(enabled);
spnFrequency.setEnabled(enabled);
tfTitle.setEnabled(enabled);
taDescription.setEnabled(enabled);
}
private void btAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btAddActionPerformed
try {
DangerDetails dd = new DangerDetails();
dd.title = "введите название";
DirectoryDangerItem item = new DirectoryDangerItem(dd);
if (treeDangers.getLastSelectedPathComponent() instanceof DirectoryDangerItem) {
DirectoryDangerItem parent = (DirectoryDangerItem)
treeDangers.getLastSelectedPathComponent();
dd.parentItem = parent.getID();
parent.getItems().append(item);
treeDangers.updateUI();
}
else {
dd.parentItem = 0;
DirectoryDanger directory = (DirectoryDanger)
DirectoryLocator.getDirectory(DirectoryDanger.class, false);
directory.getItems().append(item);
treeDangers.updateUI();
}
//resetTree(item);
treeDangers.expandPath(treeDangers.getSelectionPath());
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}//GEN-LAST:event_btAddActionPerformed
private void btRemoveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btRemoveActionPerformed
if (current != null){
try {
if (treeDangers.getLastSelectedPathComponent() == treeDangers.getModel().getRoot()
|| treeDangers.getLastSelectedPathComponent() == null) {
return;
}
DirectoryDangerItem item = (DirectoryDangerItem) treeDangers.getLastSelectedPathComponent();
if (item.getItems().size() > 0) {
int answer = MessageBox.showConfirmYesNo(MessageBox.C_DELETE_CHIELD_OBJECTS);
if (answer == MessageBox.ANSWER_NO) {
return;
}
} else {
int answer = MessageBox.showConfirmYesNo(MessageBox.C_DELETE_DANGER_ITEM);
if (answer == MessageBox.ANSWER_NO) {
return;
}
}
deleteDanger(item);
current = null;
treeDangers.updateUI();
treeDangers.getSelectionModel().setSelectionPath(null);
treeDangersValueChanged(null);
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}
}//GEN-LAST:event_btRemoveActionPerformed
private void deleteDanger(DirectoryDangerItem dangerItem) throws ClipsException {
DirectoryDanger dangers = (DirectoryDanger) DirectoryLocator.getDirectory(DirectoryDanger.class, false);
ClipsException hasException = null;
SelectorEditableExceptional<DirectoryDangerItem> iie = dangerItem.getItems();
for (int i = iie.size() - 1; i > -1; i--) {
DirectoryDangerItem item = iie.get(i);
try {
deleteDanger(item);
} catch (ClipsException ex) {
hasException = ex;
}
}
DirectoryDangerItem parent = dangerItem.getParent();
if (parent == null) {
iie = dangers.getItems();
}
else {
iie = parent.getItems();
}
if (hasException == null) {
iie.remove(dangerItem);
} else {
throw hasException;
}
}
private void btAddServiceActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btAddServiceActionPerformed
try {
DirectoryDialogService ddd = new DirectoryDialogService(true, null);
ddd.setVisible(true);
if (current != null) {
if (ddd.getDlgResult() == ModalDialog.DLG_OK) {
Selector s = ddd.getSelectedItems();
for (int i = 0; i < s.size(); i++) {
DangerServiceDetails details = new DangerServiceDetails();
DirectoryServiceItem dsi = (DirectoryServiceItem) s.get(i);
details.dangerId = current.getID();
details.serviceId = dsi.getID();
details.description = "";
details.specialityID = 0;
DangerServiceData dangerService = new DangerServiceData(details);
serviceList.append(dangerService);
}
}
resetTableService(current);
}
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}//GEN-LAST:event_btAddServiceActionPerformed
private void btRemoveServiceActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btRemoveServiceActionPerformed
try {
int[] selectedRows = tblService.getSelectedRowsSorted();
for (int i = selectedRows.length-1; i>=0; i--) {
serviceList.remove(selectedRows[i]);
}
if (current != null){
resetTableService(current);
}
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}//GEN-LAST:event_btRemoveServiceActionPerformed
private void spnFrequencyPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_spnFrequencyPropertyChange
if (current != null && evt.getNewValue() instanceof Integer ){
spnValue = (Integer) evt.getNewValue();
jPanel5.revalidate();
}
}//GEN-LAST:event_spnFrequencyPropertyChange
private void btRenameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btRenameActionPerformed
if (current != null) {
try {
current.setTitle(tfTitle.getText());
current.setFrequency(spnValue);
treeDangers.updateUI();
//resetTree(treeDangers.getSelectionRows());
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}
}//GEN-LAST:event_btRenameActionPerformed
private void jScrollPane2ComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_jScrollPane2ComponentResized
}//GEN-LAST:event_jScrollPane2ComponentResized
private void resetTableService(DirectoryDangerItem ddi) throws ClipsException{
serviceList = ddi.getDangerServices();
tblService.setModel(new TableModelDangerService(serviceList));
tblService.getColumnModel().getColumn(TableModelDangerService.COL_DS_SPECIALITY).setCellEditor(new DefaultCellEditor(cbSpec));
}
private void resizeColumn() {
TableState state = new TableState();
state.setPreferredWidth(TableModelDangerService.COL_DS_TITLE, 10);
state.setPreferredWidth(TableModelDangerService.COL_DS_SPECIALITY, 5);
state.setPreferredWidth(TableModelDangerService.COL_DS_DURATION, 2);
state.setPreferredWidth(TableModelDangerService.COL_DS_DESCRIPTION, 2);
StateSaver.setDefaultState(this, tblService, state);
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btAdd;
private javax.swing.JButton btAddService;
private javax.swing.JButton btRemove;
private javax.swing.JButton btRemoveService;
private javax.swing.JButton btRename;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel4;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel10;
private javax.swing.JPanel jPanel11;
private javax.swing.JPanel jPanel12;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel5;
private javax.swing.JPanel jPanel6;
private javax.swing.JPanel jPanel8;
private javax.swing.JPanel jPanel9;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JScrollPane jScrollPane4;
private javax.swing.JSplitPane jSplitPane1;
private com.toedter.components.JSpinField spnFrequency;
private javax.swing.JTextArea taDescription;
private cli_fmw.utils.sorted_table.SortedTable tblService;
private javax.swing.JTextArea tfTitle;
private javax.swing.JTree treeDangers;
// End of variables declaration//GEN-END:variables
@Override
public String getPageTitle() {
return "Редактор опасных факторов";
}
@Override
public DelegateLine2 getDelegate() {
return null;
}
private class DirectoryDialogTreeModelImpl extends DirectoryDialogTreeModel {
public DirectoryDialogTreeModelImpl(DirectoryItemRO items[], String rootTitle) {
super(items, rootTitle);
}
@Override
public void valueForPathChanged(TreePath path, Object newValue) {
try {
DirectoryDangerItem item = (DirectoryDangerItem) path.getLastPathComponent();
item.setTitle(newValue.toString());
//resetTree(item);
setScreenFields();
treeDangers.updateUI();
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}
}
}