/*
* PanelVidalGroupEdit.java
*
* Created on 26 �?юнь 2008 г., 17:18
*/
package cli_fmw.directory.editors.writer.templates;
import cli_fmw.delegate.directory.DirectoryItem;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import cli_fmw.delegate.directory.complex.DirectoryTextTemplate;
import cli_fmw.delegate.directory.complex.DirectoryTextTemplateItem;
import cli_fmw.delegate.directory.complex.DirectoryTextTemplateTree;
import cli_fmw.delegate.directory.complex.DirectoryTextTemplateTreeItem;
import cli_fmw.delegate.DelegateLine2;
import cli_fmw.main.ClipsException;
import cli_fmw.main.PageContainer;
import cli_fmw.main.PageGeneric;
import cli_fmw.utils.MessageBox;
import cli_fmw.utils.Selector;
import cli_fmw.utils.SelectorEditableExceptional;
import cli_fmw.utils.table_config_states.StateSaver;
import framework.beans.directory.writer.template.TextTemplateDetails;
import framework.beans.directory.writer.tree.TextTemplateTreeDetails;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
public class PanelTextTemplatesEdit extends PageGeneric {
private DirectoryTextTemplateTreeItem templateNode;
private DirectoryTextTemplate dirTextTemplate;
private DirectoryTextTemplateTree templateTree;
/** Creates new form PanelVidalGroupEdit */
public PanelTextTemplatesEdit(PageContainer container) throws ClipsException {
super(container);
initComponents();
updateTree();
searchField.getDocument().addDocumentListener(new SearchListener());
dirTextTemplate = (DirectoryTextTemplate) DirectoryLocator.getDirectory(DirectoryTextTemplate.class, false);
StateSaver.attachTo(this);
}
private void updateTree() throws ClipsException{
DirectoryTextTemplateTree vdls = (DirectoryTextTemplateTree)
DirectoryLocator.getDirectory(DirectoryTextTemplateTree.class, false);
TreeModelTextTemplates model = new TreeModelTextTemplates(vdls);
treeTextTemplates.setRootVisible(true);
treeTextTemplates.setModel(model);
treeTextTemplates.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
expandTree();
templateTree = vdls;
}
private void updateTable(ArrayList<DirectoryTextTemplateItem> items) throws ClipsException {
TableModelTextTemplate model = new TableModelTextTemplate(items);
tblTemplates.setModel(model);
}
private void updateTable(DirectoryTextTemplateTreeItem item) throws ClipsException{
ArrayList<DirectoryTextTemplateItem> ttItemList
= (ArrayList<DirectoryTextTemplateItem>) dirTextTemplate.getItems(item);
// new ArrayList<DirectoryTextTemplateItem>();
// SelectorEditableExceptional<DirectoryTextTemplateItem> s = dirTextTemplate.getItems(Item);
// for (int i = 0; i<s.size();i++){
// ttItemList.add(s.get(i));
// }
updateTable(ttItemList);
}
private void expandTree() {
for (int i = 1; i <= treeTextTemplates.getRowCount(); i++) {
treeTextTemplates.expandRow(i);
}
treeTextTemplates.setSelectionPath(null);
}
/** 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() {
pnlNewNode = new javax.swing.JPanel();
jPanel10 = new javax.swing.JPanel();
jPanel9 = new javax.swing.JPanel();
tfName = new javax.swing.JTextField();
jLabel2 = new javax.swing.JLabel();
jSplitPane1 = new javax.swing.JSplitPane();
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
treeTextTemplates = new javax.swing.JTree();
jPanel3 = new javax.swing.JPanel();
btAddAtcNode = new javax.swing.JButton();
btDeleteAtcNode = new javax.swing.JButton();
jPanel5 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
searchField = new javax.swing.JTextField();
jPanel2 = new javax.swing.JPanel();
jPanel6 = new javax.swing.JPanel();
jPanel4 = new javax.swing.JPanel();
btDeleteTemplate = new javax.swing.JButton();
btAddTemplate = new javax.swing.JButton();
jScrollPane2 = new javax.swing.JScrollPane();
tblTemplates = new cli_fmw.utils.sorted_table.SortedTable();
pnlNewNode.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
pnlNewNode.setLayout(new java.awt.BorderLayout());
jPanel10.setLayout(new java.awt.BorderLayout());
jPanel9.setLayout(new java.awt.BorderLayout());
jPanel9.add(tfName, java.awt.BorderLayout.CENTER);
jLabel2.setText("Название:");
jLabel2.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 10));
jPanel9.add(jLabel2, java.awt.BorderLayout.WEST);
jPanel10.add(jPanel9, java.awt.BorderLayout.CENTER);
pnlNewNode.add(jPanel10, java.awt.BorderLayout.NORTH);
jSplitPane1.setDividerLocation(200);
jPanel1.setLayout(new java.awt.BorderLayout());
treeTextTemplates.setEditable(true);
treeTextTemplates.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
treeTextTemplatesValueChanged(evt);
}
});
jScrollPane1.setViewportView(treeTextTemplates);
jPanel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);
jPanel3.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 1, 5, 1));
jPanel3.setPreferredSize(new java.awt.Dimension(100, 50));
jPanel3.setLayout(new java.awt.GridLayout(1, 0, 5, 0));
btAddAtcNode.setText("<html><center>Добавить <BR> группу</center></html>");
btAddAtcNode.setActionCommand("<html>Добавить <BR> группу</html>");
btAddAtcNode.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btAddAtcNodeActionPerformed(evt);
}
});
jPanel3.add(btAddAtcNode);
btDeleteAtcNode.setText("<html><center>Удалить<br>группу</center></html>");
btDeleteAtcNode.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btDeleteAtcNodeActionPerformed(evt);
}
});
jPanel3.add(btDeleteAtcNode);
jPanel1.add(jPanel3, java.awt.BorderLayout.PAGE_END);
jPanel5.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
jPanel5.setPreferredSize(new java.awt.Dimension(30, 30));
jPanel5.setVisible(false);
jPanel5.setLayout(new java.awt.BorderLayout());
jLabel1.setText("Поиск:");
jLabel1.setAlignmentY(0.0F);
jLabel1.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 5));
jPanel5.add(jLabel1, java.awt.BorderLayout.LINE_START);
searchField.setColumns(10);
searchField.setEnabled(false);
jPanel5.add(searchField, java.awt.BorderLayout.CENTER);
jPanel1.add(jPanel5, java.awt.BorderLayout.PAGE_START);
jSplitPane1.setLeftComponent(jPanel1);
jPanel2.setLayout(new java.awt.BorderLayout());
jPanel6.setBorder(javax.swing.BorderFactory.createEmptyBorder(15, 1, 10, 1));
jPanel6.setLayout(new java.awt.BorderLayout());
jPanel4.setLayout(new java.awt.GridLayout(1, 2, 5, 0));
btDeleteTemplate.setText("Удалить");
btDeleteTemplate.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btDeleteTemplateActionPerformed(evt);
}
});
jPanel4.add(btDeleteTemplate);
btAddTemplate.setText("Добавить");
btAddTemplate.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btAddTemplateActionPerformed(evt);
}
});
jPanel4.add(btAddTemplate);
jPanel6.add(jPanel4, java.awt.BorderLayout.EAST);
jPanel2.add(jPanel6, java.awt.BorderLayout.SOUTH);
jScrollPane2.setViewportView(tblTemplates);
jPanel2.add(jScrollPane2, java.awt.BorderLayout.CENTER);
jSplitPane1.setRightComponent(jPanel2);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 636, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 299, Short.MAX_VALUE)
);
}// </editor-fold>//GEN-END:initComponents
private void treeTextTemplatesValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_treeTextTemplatesValueChanged
Object value = treeTextTemplates.getLastSelectedPathComponent();
if (value instanceof DirectoryTextTemplateTreeItem){
try {
templateNode = (DirectoryTextTemplateTreeItem)value;
updateTable(templateNode);
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
} else {
tblTemplates.setModel(new DefaultTableModel());
templateNode = null;
}
}//GEN-LAST:event_treeTextTemplatesValueChanged
private void btAddAtcNodeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btAddAtcNodeActionPerformed
Object value = treeTextTemplates.getLastSelectedPathComponent();
if (value instanceof DirectoryTextTemplateTreeItem){
try {
DirectoryTextTemplateTreeItem selected = (DirectoryTextTemplateTreeItem) value;
tfName.setText("");
int res = JOptionPane.showConfirmDialog(
null, pnlNewNode, "Заполните поля", JOptionPane.OK_CANCEL_OPTION, -1);
if (res == JOptionPane.OK_OPTION) {
if (tfName.getText().isEmpty()) {
MessageBox.showWarning(MessageBox.W_INCORRECT_DATA);
return;
} else {
TextTemplateTreeDetails details = new TextTemplateTreeDetails();
details.title = tfName.getText();
details.parentItem = selected.getID();
DirectoryTextTemplateTreeItem newItem = new DirectoryTextTemplateTreeItem(details);
selected.getItems().append(newItem);
}
updateTree();
}
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}else{
try {
tfName.setText("");
int res = JOptionPane.showConfirmDialog(
null, pnlNewNode, "Заполните поля", JOptionPane.OK_CANCEL_OPTION, -1);
if (res == JOptionPane.OK_OPTION) {
if (tfName.getText().isEmpty()) {
MessageBox.showWarning(MessageBox.W_INCORRECT_DATA);
return;
} else {
TextTemplateTreeDetails details = new TextTemplateTreeDetails();
details.title = tfName.getText();
DirectoryTextTemplateTreeItem newItem = new DirectoryTextTemplateTreeItem(details);
templateTree.getItems().append(newItem);
}
updateTree();
}
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}
}//GEN-LAST:event_btAddAtcNodeActionPerformed
private void btDeleteAtcNodeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btDeleteAtcNodeActionPerformed
if (treeTextTemplates.getSelectionCount()>0 && templateNode != null) {
try {
if (templateNode.getItems().size() > 0) {
MessageBox.showWarning(MessageBox.W_CANT_DEL_HAVE_CHILDREN);
} else {
if (templateNode.getParent() != null) {
templateNode.getParent().getItems().remove(templateNode);
} else {
templateTree.getItems().remove(templateNode);
}
updateTree();
}
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}
}//GEN-LAST:event_btDeleteAtcNodeActionPerformed
private void btAddTemplateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btAddTemplateActionPerformed
try {
TextTemplateDetails details = new TextTemplateDetails();
details.title = "Введите текст шаблона";
details.groupId = templateNode.getID();
DirectoryTextTemplateItem item = new DirectoryTextTemplateItem(details);
dirTextTemplate.getItems().append(item);
updateTable(templateNode);
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}//GEN-LAST:event_btAddTemplateActionPerformed
private void btDeleteTemplateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btDeleteTemplateActionPerformed
try {
ArrayList<DirectoryTextTemplateItem> items =
(ArrayList<DirectoryTextTemplateItem>) dirTextTemplate.getItems(templateNode);
int[] sels = tblTemplates.getSelectedRowsSorted();
for (int j = sels.length - 1; j > -1; j--) {
DirectoryTextTemplateItem template = items.get(sels[j]);
dirTextTemplate.getItems().remove(template);
}
updateTable(templateNode);
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}//GEN-LAST:event_btDeleteTemplateActionPerformed
class SearchListener implements DocumentListener {
@Override
public void insertUpdate(DocumentEvent arg0) {
try {
onSearchFieldChanged(arg0.getDocument().getText(0, arg0.getDocument().getLength()));
} catch(Exception ex) {
MessageBox.showException(ex);
}
}
@Override
public void removeUpdate(DocumentEvent arg0) {
try {
onSearchFieldChanged(arg0.getDocument().getText(0, arg0.getDocument().getLength()));
} catch(Exception ex) {
MessageBox.showException(ex);
}
}
@Override
public void changedUpdate(DocumentEvent arg0) {
try {
onSearchFieldChanged(arg0.getDocument().getText(0, arg0.getDocument().getLength()));
} catch(Exception ex) {
MessageBox.showException(ex);
}
}
}
@SuppressWarnings("unchecked")
private void onSearchFieldChanged(String value) throws ClipsException {
if(value.isEmpty()) {
return;
}
DirectoryTextTemplate dva = DirectoryLocator.getDirectory(DirectoryTextTemplate.class, false);
SelectorEditableExceptional<DirectoryTextTemplateItem> sel = dva.getItems();
for(int i=0; i<sel.size(); i++) {
DirectoryTextTemplateItem item = sel.get(i);
List found = findMatch(item, value);
if(found != null) {
found.add(treeTextTemplates.getModel().getRoot());
ArrayList reordered = new ArrayList();
for(int j=found.size()-1; j>=0; j--) {
reordered.add(found.get(j));
}
TreePath fullPath = new TreePath(reordered.toArray());
treeTextTemplates.setSelectionPath(fullPath);
treeTextTemplates.scrollPathToVisible(fullPath);
treeTextTemplates.updateUI();
return;
}
}
}
@SuppressWarnings("unchecked")
private List<Object> findMatch(DirectoryItem item, String pattern) throws ClipsException {
int pos = item.getTitle().indexOf(pattern);
if(pos == 0) {
ArrayList path = new ArrayList();
path.add(item);
return path;
}
if(item instanceof DirectoryTextTemplateTreeItem) {
DirectoryTextTemplateTreeItem parent = (DirectoryTextTemplateTreeItem)item;
Selector ii = parent.getItems();
for(int i=0; i<ii.size(); i++) {
DirectoryItem child = (DirectoryItem) ii.get(i);
List path = findMatch(child, pattern);
if(path != null) {
path.add(parent);
return path;
}
}
}
return null;
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btAddAtcNode;
private javax.swing.JButton btAddTemplate;
private javax.swing.JButton btDeleteAtcNode;
private javax.swing.JButton btDeleteTemplate;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel10;
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 jPanel9;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JPanel pnlNewNode;
private javax.swing.JTextField searchField;
private cli_fmw.utils.sorted_table.SortedTable tblTemplates;
private javax.swing.JTextField tfName;
private javax.swing.JTree treeTextTemplates;
// End of variables declaration//GEN-END:variables
@Override
public String getPageTitle() {
return "Редактор текстовых шаблонов";
}
@Override
public DelegateLine2 getDelegate() {
return null;
}
}