/*
* PanelSheduleWeek.java
*
* Created on 27 Декабрь 2007 г., 3:25
*/
package cli_fmw.directory.editors;
import cli_fmw.delegate.directory.simple.DirectorySimple;
import cli_fmw.delegate.directory.simple.DirectorySimpleItem;
import cli_fmw.delegate.DelegateLine2;
import cli_fmw.delegate.directory.Directory;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import cli_fmw.delegate.directory.simple.arm.DirectoryArmAbstract;
import cli_fmw.delegate.directory.simple.documentGivenPlace.DirectoryDocumentPlaceAbstract;
import cli_fmw.delegate.directory.simple.documentType.DirectoryDocumentTypeAbstract;
import cli_fmw.delegate.directory.simple.name.DirectoryNameAbstract;
import cli_fmw.delegate.directory.simple.pathron.DirectoryPathronAbstract;
import cli_fmw.delegate.directory.simple.surname.DirectorySurnameAbstract;
import cli_fmw.main.ClipsException;
import cli_fmw.directory.DialogDirectorySimpleM;
import cli_fmw.main.PageContainer;
import cli_fmw.main.PageGeneric;
import cli_fmw.main.PrintCreators;
import cli_fmw.main.Printable;
import cli_fmw.utils.MessageBox;
import cli_fmw.utils.ModalDialog;
import cli_fmw.utils.SelectorEditableExceptional;
import cli_fmw.utils.table_config_states.StateSaver;
import cli_fmw.utils.table_config_states.TableState;
import java.awt.Frame;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ListSelectionModel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableColumn;
import javax.swing.text.BadLocationException;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
/**
*
* @author Axe Ilshat
*/
public abstract class PanelDirectoryEditorAbstract
extends PageGeneric implements Printable {
DirectorySimple currentDirectory;
String filter = "";
/**
* Creates new form PanelSheduleWeek
*/
public PanelDirectoryEditorAbstract(PageContainer container) throws ClipsException {
super(container);
initComponents();
jTree1.setModel(new DefaultTreeModel(makeTree()));
jTable1.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jTable1.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent arg0) {
setEnabledComponents();
}
});
jTextField1.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent arg0) {
setFilter(arg0);
}
@Override
public void removeUpdate(DocumentEvent arg0) {
setFilter(arg0);
}
@Override
public void changedUpdate(DocumentEvent arg0) {
}
private void setFilter(DocumentEvent arg0) {
try {
filter = arg0.getDocument().getText(0, arg0.getDocument().getLength());
refreshTable();
} catch (ClipsException ex) {
MessageBox.showException(ex);
} catch (BadLocationException ex) {
MessageBox.showException(ex);
}
}
});
refreshTable();
resizeColumn();
StateSaver.attachTo(this);
}
/**
* Создание начальной заготовки дерева
* @return
*/
private TreeNode makeTree() throws ClipsException {
ArrayList<Directory> directoryList = new ArrayList<Directory>();
Directory d = DirectoryLocator.getDirectory(DirectorySurnameAbstract.class, false);
directoryList.add(d);
d = DirectoryLocator.getDirectory(DirectoryNameAbstract.class, false);
directoryList.add(d);
d = DirectoryLocator.getDirectory(DirectoryPathronAbstract.class, false);
directoryList.add(d);
d = DirectoryLocator.getDirectory(DirectoryArmAbstract.class, false);
directoryList.add(d);
d = DirectoryLocator.getDirectory(DirectoryDocumentTypeAbstract.class, false);
directoryList.add(d);
d = DirectoryLocator.getDirectory(DirectoryDocumentPlaceAbstract.class, false);
directoryList.add(d);
initExtra(directoryList);
//сортируем список справочников
Collections.sort(directoryList, new Comparator<Directory>() {
@Override
public int compare(Directory o1, Directory o2) {
return o1.getDirectoryTitle().compareTo(o2.getDirectoryTitle());
}
});
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Справочники"); //создали корень
for (Directory directory : directoryList) {
root.add(new DefaultMutableTreeNode(directory));
}
return root;
}
protected abstract void initExtra(ArrayList<Directory> directoryList) throws ClipsException;
/**
* returns title for the page
* @return String, HUD title for page
*/
@Override
public String getPageTitle()
{
return "Редактор справочников";
}
/**
* Обновляет таблицу и разрешает.запрещает кнопки редактирования
*/
private void refreshTable() throws ClipsException {
jTable1.setModel(new TableModelDirectoryEdit(currentDirectory, filter));
TableColumn colExt = jTable1.getColumnModel().getColumn(TableModelDirectoryEdit.COL_EXT_CODE);
TableColumn colDirty = jTable1.getColumnModel().getColumn(TableModelDirectoryEdit.COL_DIRTY);
TableColumn colTrash = jTable1.getColumnModel().getColumn(TableModelDirectoryEdit.COL_TRASH);
if (currentDirectory == null || !currentDirectory.isExternal()) {
jTable1.removeColumn(colExt);
}
if (currentDirectory == null || !currentDirectory.isDirty()) {
jTable1.removeColumn(colDirty);
}
if (currentDirectory == null || !currentDirectory.isTrash()) {
jTable1.removeColumn(colTrash);
}
setEnabledComponents();
}
private void setEnabledComponents() {
jTextField1.setEditable(currentDirectory != null);
btAdd.setEnabled(currentDirectory != null && !filter.equals("") && currentDirectory.isInDirectory(filter) == null);
if (jTable1.getSelectedRowCount() > 0 && ((TableModelDirectoryEdit) jTable1.getModel()).getItemAt(jTable1.getSelectedRowSorted()).getID() != 0) {
btDelete.setEnabled(true);
btChange.setEnabled(true);
} else {
btDelete.setEnabled(false);
btChange.setEnabled(false);
}
}
private void resizeColumn() {
TableState state = new TableState();
state.setPreferredWidth(TableModelDirectoryEdit.COL_ID, 1);
state.setPreferredWidth(TableModelDirectoryEdit.COL_TITLE, 7);
state.setPreferredWidth(TableModelDirectoryEdit.COL_DIRTY, 2);
state.setPreferredWidth(TableModelDirectoryEdit.COL_EXT_CODE, 4);
StateSaver.setDefaultState(this, jTable1, state);
}
/** 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() {
jSplitPane1 = new javax.swing.JSplitPane();
jPanel3 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
jTree1 = new javax.swing.JTree();
jPanel1 = new javax.swing.JPanel();
jPanel2 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jTextField1 = new javax.swing.JTextField();
btAdd = new javax.swing.JButton();
btDelete = new javax.swing.JButton();
btChange = new javax.swing.JButton();
jPanel4 = new javax.swing.JPanel();
jScrollPane2 = new javax.swing.JScrollPane();
jTable1 = new cli_fmw.utils.sorted_table.SortedTable();
jSplitPane1.setDividerLocation(180);
jTree1.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
jTree1ValueChanged(evt);
}
});
jScrollPane1.setViewportView(jTree1);
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 156, Short.MAX_VALUE)
.addContainerGap())
);
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 245, Short.MAX_VALUE)
.addContainerGap())
);
jSplitPane1.setLeftComponent(jPanel3);
jLabel1.setText("Фильтр:");
btAdd.setText("Добавить");
btAdd.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btAddActionPerformed(evt);
}
});
btDelete.setText(" Удалить ");
btDelete.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btDeleteActionPerformed(evt);
}
});
btChange.setText("Заменить");
btChange.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btChangeActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 59, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btAdd)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btDelete)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btChange)
.addContainerGap())
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
.addComponent(btChange)
.addComponent(btDelete)
.addComponent(btAdd)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jPanel4.setLayout(new java.awt.BorderLayout());
jScrollPane2.addComponentListener(new java.awt.event.ComponentAdapter() {
public void componentResized(java.awt.event.ComponentEvent evt) {
jScrollPane2ComponentResized(evt);
}
});
jScrollPane2.setViewportView(jTable1);
jPanel4.add(jScrollPane2, java.awt.BorderLayout.CENTER);
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, 414, Short.MAX_VALUE)
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, 186, Short.MAX_VALUE)
.addContainerGap())
);
jSplitPane1.setRightComponent(jPanel1);
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, 600, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 269, Short.MAX_VALUE)
);
}// </editor-fold>//GEN-END:initComponents
private void jTree1ValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_jTree1ValueChanged
try {
Object element = ((DefaultMutableTreeNode) jTree1.getLastSelectedPathComponent()).getUserObject();
if (element instanceof DirectorySimple) {
currentDirectory = (DirectorySimple) element;
} else {
currentDirectory = null;
}
fireContainerEventStateChanged();
jTextField1.setText("");
refreshTable();
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}//GEN-LAST:event_jTree1ValueChanged
protected abstract DirectorySimpleItem getNewItem(String title);
private void btDeleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btDeleteActionPerformed
try {
if (jTable1.getSelectedRowCount() > 0) {
DirectorySimpleItem item = ((TableModelDirectoryEdit) jTable1.getModel()).getItemAt(jTable1.getSelectedRowSorted());
try {
SelectorEditableExceptional iie = currentDirectory.getItems();
for (int i = 0; i < iie.size(); i++) {
if (iie.get(i) == item) {
iie.remove(i);
break;
}
}
} catch (Exception ex) {
MessageBox.showException(ex);
}
refreshTable();
}
} catch (ClipsException ex) {
Logger.getLogger(PanelDirectoryEditorAbstract.class.getName()).log(Level.SEVERE, null, ex);
}
}//GEN-LAST:event_btDeleteActionPerformed
private void btChangeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btChangeActionPerformed
try {
DirectorySimpleItem item = ((TableModelDirectoryEdit) jTable1.getModel()).getItemAt(jTable1.getSelectedRowSorted());
DialogDirectorySimpleM dialog = new DialogDirectorySimpleM((Frame) getContainer(), currentDirectory, item.getTitle());
dialog.setVisible(true);
if (dialog.getDlgResult() == ModalDialog.DLG_OK) {
DirectorySimpleItem selectedItem = dialog.getSelectedItem();
if (item == selectedItem) {
MessageBox.showWarning(MessageBox.W_SAME_DIRECTORY_ITEM);
return;
}
currentDirectory.replace(item, selectedItem);
}
refreshTable();
} catch (ClipsException ex) {
//Не вызвался диалог
MessageBox.showException(ex);
}
}//GEN-LAST:event_btChangeActionPerformed
private void jScrollPane2ComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_jScrollPane2ComponentResized
}//GEN-LAST:event_jScrollPane2ComponentResized
private void btAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btAddActionPerformed
try {
currentDirectory.getItems().append(currentDirectory.initNewItem(filter));
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
jTextField1.setText("");
}//GEN-LAST:event_btAddActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btAdd;
private javax.swing.JButton btChange;
private javax.swing.JButton btDelete;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JSplitPane jSplitPane1;
private cli_fmw.utils.sorted_table.SortedTable jTable1;
private javax.swing.JTextField jTextField1;
private javax.swing.JTree jTree1;
// End of variables declaration//GEN-END:variables
@Override
public boolean readyForPrint() {
return currentDirectory != null;
}
@Override
public void print() {
if (readyForPrint()) {
String title = "Данные простого справочника: " + currentDirectory.getDirectoryTitle();
PrintCreators.createGeneratedReport(title, null, null, null, jTable1.getModel(), getClass());
}
}
@Override
public DelegateLine2 getDelegate() {
return null;
}
}