/*
* PanelIntelWriterEditor.java
*
* Created on 6 Август 2008 г., 10:26
*/
package cli_fmw.directory.editors.writer;
import cli_fmw.delegate.directory.DirectoryItemRO;
import cli_fmw.delegate.directory.complex.DirectoryIntelliWriter;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import cli_fmw.delegate.directory.simple.DirectorySimpleItem;
import cli_fmw.delegate.DelegateLine2;
import cli_fmw.delegate.directory.simple.iwtype.DirectoryIWTypeAbstract;
import cli_fmw.delegate.directory.simple.iwtype.DirectoryIWTypeItemAbstract;
import cli_fmw.main.PageContainer;
import cli_fmw.main.PageGeneric;
import cli_fmw.utils.MessageBox;
import cli_fmw.main.ClipsException;
import cli_fmw.main.Persistentable;
import cli_fmw.utils.table_config_states.StateSaver;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import javax.swing.DefaultListModel;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/**
*
* @author petr
*/
public class PanelIntelWriterEditor extends PageGeneric implements ListSelectionListener, Persistentable {
private DirectoryIntelliWriter directoryWriterItems;
private DirectoryIWTypeItemAbstract selectedType;
private boolean canBeEdit;
private String oldtext;
private DirectoryIWTypeAbstract directoryTypes;
public PanelIntelWriterEditor(PageContainer container) throws ClipsException {
super(container);
initComponents();
directoryWriterItems = DirectoryLocator.getDirectory(DirectoryIntelliWriter.class, false);
directoryTypes = DirectoryLocator.getDirectory(DirectoryIWTypeAbstract.class, false);
canBeEdit = directoryWriterItems.canEdit();
updateList();
lstTypes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//выделять можно только 1 строку
lstTypes.addListSelectionListener(this);//добавим листенер (сама панель)
jTextArea1.getDocument().addDocumentListener( new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
changed();
}
@Override
public void removeUpdate(DocumentEvent e) {
changed();
}
@Override
public void changedUpdate(DocumentEvent e) {
changed();
}
public void changed() {
//save();
fireContainerEventStateChanged();
}
});
updateEditor();
StateSaver.attachTo(this);
}
private void updateList() throws ClipsException{
DefaultListModel model = new DefaultListModel();
model = new DefaultListModel();
DirectoryItemRO[] items = directoryTypes.toArray();
for (DirectoryItemRO itemRO : items) {
model.addElement(itemRO);
}
lstTypes.setModel(model);
}
private void setEnabledComponents() {
jTextArea1.setEditable(selectedType != null && canBeEdit);
}
private void updateEditor() throws ClipsException {
oldtext = directoryWriterItems.getItemsAsText(selectedType);
jTextArea1.setText(oldtext);
jTextArea1.setCaretPosition(0);
setEnabledComponents();
}
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
popupMenuTree = new javax.swing.JPopupMenu();
rename = new javax.swing.JMenuItem();
jSplitPane1 = new javax.swing.JSplitPane();
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
lstTypes = new javax.swing.JList();
jPanel3 = new javax.swing.JPanel();
btAddType = new javax.swing.JButton();
btDeleteType = new javax.swing.JButton();
jScrollPane2 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
rename.setText("Переименовать");
rename.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
renameActionPerformed(evt);
}
});
popupMenuTree.add(rename);
setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
setLayout(new java.awt.BorderLayout());
jSplitPane1.setDividerLocation(300);
jPanel1.setLayout(new java.awt.BorderLayout());
jScrollPane1.setBorder(javax.swing.BorderFactory.createTitledBorder("Типы"));
lstTypes.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
lstTypesMouseClicked(evt);
}
});
jScrollPane1.setViewportView(lstTypes);
jPanel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);
jPanel3.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 1, 5, 1));
jPanel3.setLayout(new java.awt.GridLayout(1, 0, 5, 0));
btAddType.setText("Добавить");
btAddType.setActionCommand("<html>Добавить <BR> группу</html>");
btAddType.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btAddTypeActionPerformed(evt);
}
});
jPanel3.add(btAddType);
btDeleteType.setText("Удалить");
btDeleteType.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btDeleteTypeActionPerformed(evt);
}
});
jPanel3.add(btDeleteType);
jPanel1.add(jPanel3, java.awt.BorderLayout.SOUTH);
jSplitPane1.setLeftComponent(jPanel1);
jScrollPane2.setBorder(javax.swing.BorderFactory.createTitledBorder("Значения"));
jTextArea1.setColumns(20);
jTextArea1.setRows(5);
jScrollPane2.setViewportView(jTextArea1);
jSplitPane1.setRightComponent(jScrollPane2);
add(jSplitPane1, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
private void btAddTypeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btAddTypeActionPerformed
try {
String result = JOptionPane.showInputDialog("Введите название");
if (result == null) {
return;
}
DirectorySimpleItem newItem = directoryTypes.initNewItem(result);
directoryTypes.getItems().append(newItem);
updateList();
lstTypes.setSelectedValue(newItem, true);
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}//GEN-LAST:event_btAddTypeActionPerformed
private void btDeleteTypeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btDeleteTypeActionPerformed
try {
Object selectedValue = lstTypes.getSelectedValue();
if (selectedValue == null) {
return;
}
directoryTypes.getItems().remove(selectedType);
updateList();
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}//GEN-LAST:event_btDeleteTypeActionPerformed
private void renameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_renameActionPerformed
DirectorySimpleItem item = (DirectorySimpleItem) lstTypes.getSelectedValue();
String result = JOptionPane.showInputDialog("Введите название");
if (result == null) {
return;
}
try {
item.setTitle(result);//GEN-LAST:event_renameActionPerformed
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}
private void lstTypesMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lstTypesMouseClicked
int selectedIndex = lstTypes.getSelectedIndex();
if (evt.getButton() == MouseEvent.BUTTON3 && selectedIndex >= 0) {
Rectangle rect = lstTypes.getCellBounds(selectedIndex, selectedIndex);
if (rect.contains(evt.getPoint())) {
popupMenuTree.show(lstTypes, evt.getX(), evt.getY());
}
}
}//GEN-LAST:event_lstTypesMouseClicked
@Override
public String getPageTitle() {
return "IntelWriter";
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btAddType;
private javax.swing.JButton btDeleteType;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JList lstTypes;
private javax.swing.JPopupMenu popupMenuTree;
private javax.swing.JMenuItem rename;
// End of variables declaration//GEN-END:variables
@Override
public DelegateLine2 getDelegate() {
return null;
}
@Override
public void valueChanged(ListSelectionEvent e) {
if (isDirty()){//если делегат грязный, то сохраняем
try {
//если делегат грязный, то спросим про сохранить
int res = MessageBox.showConfirmYesNoCancel(MessageBox.C_SAVE_CHANGES);
if (res == MessageBox.ANSWER_CANCEL) {
lstTypes.removeListSelectionListener(this);
lstTypes.setSelectedValue(selectedType, true);
lstTypes.addListSelectionListener(this);
return;
} else if (res == MessageBox.ANSWER_YES) {
save();
} else {
restore();
}
//Если не было отмены то обновляем редактор
selectedType = (DirectoryIWTypeItemAbstract) lstTypes.getSelectedValue();
fireContainerEventStateChanged();
updateEditor();
} catch (ClipsException ex) {
MessageBox.showException(ex);
lstTypes.removeListSelectionListener(this);
lstTypes.setSelectedValue(selectedType, true);
lstTypes.addListSelectionListener(this);
}
} else {
try {
selectedType = (DirectoryIWTypeItemAbstract) lstTypes.getSelectedValue();
fireContainerEventStateChanged();
updateEditor();
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}
}
@Override
public boolean isDirty() {
return !jTextArea1.getText().equals(oldtext);
}
@Override
public void save() throws ClipsException {
if (selectedType == null || !isDirty()) {
return;
}
directoryWriterItems.setItemsAsText(selectedType, jTextArea1.getText());
oldtext = jTextArea1.getText();
fireContainerEventStateChanged();
}
@Override
public void restore() {
jTextArea1.setText(oldtext);
jTextArea1.setCaretPosition(0);
fireContainerEventStateChanged();
}
//Убрано - отладочная сохранялка
/* private void saveToFile() {
final String filename = "../IntellyWriter.log";
File file = new File(filename);
FileWriter writer = null;
try {
if (!file.exists()) {
file.createNewFile();
}
writer = new FileWriter(file, true);
writer.write("\n\n\n" + new GregorianCalendar().getTime().toString() + "\n");
writer.write(selectedType.toString() + "\n");
writer.write(jTextArea1.getText());
} catch (IOException ex) {
MessageBox.showExceptionOnly(new ClipsException("Ошибка при записи изменений редактора IntelWriter", ex));
} finally {
try {
writer.close();
} catch (IOException ex) {
MessageBox.showExceptionOnly(ex);
}
}
}
*/
}