/*
* ReportFiles.java
*
* Created on August 14, 2008, 9:21 AM
*/
package cli_fmw.report;
import cli_fmw.delegate.DelegateLine2;
import cli_fmw.delegate.report.FileLocal;
import cli_fmw.delegate.report.ReportLocal;
import cli_fmw.delegate.report.ReportSearchLocal;
import cli_fmw.main.ContentStateListener;
import cli_fmw.main.PageContainer;
import cli_fmw.main.PageGeneric;
import cli_fmw.main.Persistentable;
import cli_fmw.report.panels.model.delegate.DelegateListModel;
import cli_fmw.report.panels.model.delegate.DelegateTextModel;
import cli_fmw.report.panels.model.report.ReportFilesListModel;
import cli_fmw.utils.MessageBox;
import framework.beans.report.FileDetails;
import cli_fmw.main.ClipsException;
import cli_fmw.report.panels.model.ObjectComboBoxModel;
import cli_fmw.report.panels.model.delegate.DelegateListener;
import cli_fmw.utils.ConfigGui;
import cli_fmw.utils.table_config_states.StateSaver;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JFileChooser;
import javax.swing.JList;
import javax.swing.filechooser.FileNameExtensionFilter;
import net.sf.jasperreports.engine.JRException;
/**
*
* @author finder
*/
public class ReportFiles extends PageGeneric implements Persistentable, ContentStateListener {
private static final long serialVersionUID = 1L;
static final String[] JASPER_EXTENSIONS = {"jasper", "jrxml"};
abstract class RedBlackListCellRenderer extends DefaultListCellRenderer{
protected Color normalColor;
protected Color specialColor;
protected Color newNormalColor(){
return new Color(0, 0, 0);
}
protected Color newSpecialColor(){
return new Color(255, 0, 0);
}
protected Color getNormalColor(){
if (normalColor == null) {
normalColor = newNormalColor();
}
return normalColor;
}
protected Color getSpecialColor(){
if (specialColor == null) {
specialColor = newSpecialColor();
}
return specialColor;
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Component render = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
Color c;
if (isSpecialItem(list, value, index)) {
c = getSpecialColor();
}
else {
c = getNormalColor();
}
render.setForeground(c);
return render;
}
abstract boolean isSpecialItem(JList list, Object value, int index);
}
/*ReportFilesListModel comboModelFilesLists;
ReportFilesListModel lisModeltFilesLists;*/
DelegateListener<ReportLocal> container;
DelegateListModel<ReportLocal> reportListModel;
ReportLocal curReport;
DelegateTextModel<ReportLocal> nameModel;
public ReportFiles(PageContainer container) throws ClipsException {
super(container);
initComponents();
initModels();
rightPanelSetReport(null, false);
DefaultListCellRenderer renrer = new RedBlackListCellRenderer() {
private static final long serialVersionUID = 1L;
@Override
boolean isSpecialItem(JList list, Object value, int index) {
try {
return curReport != null && curReport.getMainFile() == value;
} catch (ClipsException ex) {
MessageBox.showException(ex);
return false;
}
}
};
fileList.setCellRenderer(renrer);
renrer = new RedBlackListCellRenderer() {
private static final long serialVersionUID = 1L;
@Override
boolean isSpecialItem(JList list, Object value, int index) {
if (value instanceof ReportLocal) {
return ((ReportLocal) value).isSpecialReport();
}
return false;
}
};
reportList.setCellRenderer(renrer);
StateSaver.attachTo(this);
}
void initModels(){
try {
reportListModel = new DelegateListModel<ReportLocal>(new ReportSearchLocal(getAuditManager()).getReports());
reportList.setModel(reportListModel);
container = new DelegateListener<ReportLocal>();
new ObjectComboBoxModel<ReportLocal>(mainFileCBox, container, new ReportFilesListModel(mainFileCBox, container, true)) {
private static final long serialVersionUID = 1L;
public void setSelectedItemImp(Object anItem) throws ClipsException {
if (anItem != null){
if (anItem instanceof FileLocal && ((FileLocal)anItem).getFileTypeID() == FileDetails.TYPE_JASPER_REPORT){
try {
getObject().setMainFile((FileLocal) anItem);
} catch (JRException ex) {
MessageBox.showExceptionOnly(ex);
}
}
}
}
public Object getSelectedItemImp() throws ClipsException {
return getObject().getMainFile();
}
};
new ReportFilesListModel(fileList, container, false);
nameModel = new DelegateTextModel<ReportLocal>(reportNameTextField, null) {
private static final long serialVersionUID = 1L;
@Override
public void setModelTextChecked(String text) throws ClipsException {
getObject().setName(text);
}
@Override
public String getModelTextChecked() throws ClipsException {
return getObject().getName();
}
public void setDelegate(ReportLocal delegate) {
throw new UnsupportedOperationException("Not supported yet.");
}
};
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}// initModels
/** 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() {
jLabel3 = new javax.swing.JLabel();
jSplitPane1 = new javax.swing.JSplitPane();
reportEditPanel = new javax.swing.JPanel();
jPanel3 = new javax.swing.JPanel();
jPanel4 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
reportNameTextField = new javax.swing.JTextField();
jPanel5 = new javax.swing.JPanel();
mainFileCBox = new javax.swing.JComboBox();
jLabel2 = new javax.swing.JLabel();
jPanel2 = new javax.swing.JPanel();
addButton = new javax.swing.JButton();
removeButton = new javax.swing.JButton();
saveButton = new javax.swing.JButton();
saveCompiled = new javax.swing.JButton();
jScrollPane2 = new javax.swing.JScrollPane();
fileList = new javax.swing.JList();
jPanel6 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
reportList = new javax.swing.JList();
jPanel1 = new javax.swing.JPanel();
newReportButton = new javax.swing.JButton();
deleteReportButton = new javax.swing.JButton();
jLabel3.setText("Отчеты:");
setMinimumSize(new java.awt.Dimension(192, 235));
setRequestFocusEnabled(false);
setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.LINE_AXIS));
reportEditPanel.setLayout(new java.awt.BorderLayout());
jPanel3.setLayout(new java.awt.GridLayout(3, 1));
jPanel4.setLayout(new java.awt.BorderLayout());
jLabel1.setText("Имя отчета");
jPanel4.add(jLabel1, java.awt.BorderLayout.WEST);
reportNameTextField.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
reportNameTextFieldActionPerformed(evt);
}
});
jPanel4.add(reportNameTextField, java.awt.BorderLayout.CENTER);
jPanel3.add(jPanel4);
jPanel5.setLayout(new java.awt.BorderLayout());
jPanel5.add(mainFileCBox, java.awt.BorderLayout.CENTER);
jLabel2.setText("Основной файл:");
jPanel5.add(jLabel2, java.awt.BorderLayout.LINE_START);
jPanel3.add(jPanel5);
jPanel2.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));
addButton.setText("Добавить файл");
addButton.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
addButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addButtonActionPerformed(evt);
}
});
jPanel2.add(addButton);
removeButton.setText("Удалить файл");
removeButton.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
removeButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
removeButtonActionPerformed(evt);
}
});
jPanel2.add(removeButton);
saveButton.setText("Сохранить Файл");
saveButton.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
saveButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
saveButtonActionPerformed(evt);
}
});
jPanel2.add(saveButton);
saveCompiled.setText("Сохранить Отчет");
saveCompiled.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
saveCompiled.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
saveCompiledActionPerformed(evt);
}
});
jPanel2.add(saveCompiled);
jPanel3.add(jPanel2);
reportEditPanel.add(jPanel3, java.awt.BorderLayout.PAGE_START);
fileList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
fileListValueChanged(evt);
}
});
jScrollPane2.setViewportView(fileList);
reportEditPanel.add(jScrollPane2, java.awt.BorderLayout.CENTER);
jSplitPane1.setRightComponent(reportEditPanel);
jPanel6.setLayout(new java.awt.BorderLayout());
reportList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
reportList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
reportListValueChanged(evt);
}
});
jScrollPane1.setViewportView(reportList);
jPanel6.add(jScrollPane1, java.awt.BorderLayout.CENTER);
newReportButton.setText("Новый отчет");
newReportButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
newReportButtonActionPerformed(evt);
}
});
deleteReportButton.setText("Удалить Отчет");
deleteReportButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
deleteReportButtonActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(newReportButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(deleteReportButton))
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(newReportButton, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(deleteReportButton, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE))
);
jPanel6.add(jPanel1, java.awt.BorderLayout.PAGE_START);
jSplitPane1.setLeftComponent(jPanel6);
add(jSplitPane1);
}// </editor-fold>//GEN-END:initComponents
private void reportListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_reportListValueChanged
int sel = reportList.getSelectedIndex();
boolean reportSet;
if (sel >= 0 && sel < reportListModel.getSize()) {
reportSet = rightPanelSetReport(reportListModel.getElementAt(sel), true);
}
else {
reportSet = rightPanelSetReport(null, true);
}
if (!reportSet && curReport != null) {
reportList.setSelectedValue(curReport, false);
}
}//GEN-LAST:event_reportListValueChanged
private void reportNameTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reportNameTextFieldActionPerformed
}//GEN-LAST:event_reportNameTextFieldActionPerformed
static int newReportCount = 0;
private void newReportButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newReportButtonActionPerformed
if (rightPanelSetReport(curReport, true)){
ReportLocal newRep = new ReportLocal(getAuditManager());
try {
newRep.setName("Новый отчет " + ++newReportCount);
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
reportListModel.addElement(newRep);
reportList.setSelectedValue(newRep, true);
}
}//GEN-LAST:event_newReportButtonActionPerformed
private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addButtonActionPerformed
if (curReport != null){
ConfigGui cfg = ConfigGui.getInstance();
JFileChooser choser = new JFileChooser();
choser.setCurrentDirectory(cfg.getLastOpenDialogPath());
FileNameExtensionFilter filter = new FileNameExtensionFilter("Файлы JasperReport", JASPER_EXTENSIONS);
choser.addChoosableFileFilter(filter);
choser.setFileFilter(choser.getAcceptAllFileFilter());
choser.setMultiSelectionEnabled(true);
int id = choser.showOpenDialog(this);
if (id == JFileChooser.APPROVE_OPTION){
cfg.setLastOpenDialogPath(choser.getCurrentDirectory());
File[] files = choser.getSelectedFiles();
ArrayList<File> exist = new ArrayList<File>();
for (File curFile : files) {
try {
if (curReport.getFile(curFile.getName()) != null) {
exist.add(curFile);
}
}
catch (ClipsException ex) {
MessageBox.showException(ex);
}
}
if (exist.size() > 0){
String str = "";
for (File file : exist) {
str += "\n" + file.getName();
}
int res = MessageBox.showConfirmYesNo(MessageBox.C_OVERWRITE_FILE, str);
if (res != MessageBox.ANSWER_YES){
return;
}
}
for (File curFile : files) {
try {
curReport.addFile(curFile);
}
catch (ClipsException ex) {
MessageBox.showException(ex);
}
catch (FileNotFoundException ex) {
ex.printStackTrace();
MessageBox.showError(MessageBox.E_FILE_NOT_FOUND, curFile.getName());
}
catch (IOException ex) {
ex.printStackTrace();
MessageBox.showError(MessageBox.E_FILE_READ_ERROR, curFile.getName());
}
catch (JRException ex) {
MessageBox.showExceptionOnly(ex);
}
}
}
}
}//GEN-LAST:event_addButtonActionPerformed
private void deleteReportButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteReportButtonActionPerformed
remove();
}//GEN-LAST:event_deleteReportButtonActionPerformed
private void removeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeButtonActionPerformed
if (curReport != null){
Object[] sel = fileList.getSelectedValues();
for (Object item : sel) {
FileLocal file = (FileLocal)item;
try {
if (curReport.getMainFile() != file){
curReport.removeFile(file);
}
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}
}
}//GEN-LAST:event_removeButtonActionPerformed
private void saveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveButtonActionPerformed
int[] sel = fileList.getSelectedIndices();
saveFiles(sel, false);
}//GEN-LAST:event_saveButtonActionPerformed
private void saveCompiledActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveCompiledActionPerformed
int[] sel = fileList.getSelectedIndices();
saveFiles(sel, true);
}//GEN-LAST:event_saveCompiledActionPerformed
private void fileListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_fileListValueChanged
updateButtons();
}//GEN-LAST:event_fileListValueChanged
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addButton;
private javax.swing.JButton deleteReportButton;
private javax.swing.JList fileList;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JPanel jPanel1;
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.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JComboBox mainFileCBox;
private javax.swing.JButton newReportButton;
private javax.swing.JButton removeButton;
private javax.swing.JPanel reportEditPanel;
private javax.swing.JList reportList;
private javax.swing.JTextField reportNameTextField;
private javax.swing.JButton saveButton;
private javax.swing.JButton saveCompiled;
// End of variables declaration//GEN-END:variables
boolean rightPanelSetReport(ReportLocal report, boolean queryUser){
if (curReport != report){
if (curReport != null) {
if (curReport.isDirty() && queryUser){
int res = MessageBox.showConfirmYesNoCancel(MessageBox.C_SAVE_CHANGES);
if (res == MessageBox.ANSWER_YES) {
try {
save();
} catch (ClipsException ex) {
MessageBox.showException(ex);
return false;
}
}
else if (res == MessageBox.ANSWER_NO){
restore();
}
else {
return false;
}
}
if (curReport != null){
curReport.removeContentStateListener(this);
curReport.removeContentStateListener(getContainer());
}
}
curReport = report;
if (curReport != null) {
curReport.addContentStateListener(this);
curReport.addContentStateListener(getContainer());
}
else{
}
}
container.setObject(report);
nameModel.setObject(report);
updateButtons();
getContainer().contentStateChanged();
return true;
}
void updateButtons(){
boolean addEnabled = true, removeEnabled = true,
saveEnabled = true, saveCompiledEnabled = true,
deleteReportEnable = true;
if (curReport == null){
addEnabled = false;
removeEnabled = false;
saveEnabled = false;
saveCompiledEnabled = false;
deleteReportEnable = false;
}
else{
Object[] sel = fileList.getSelectedValues();
if (sel.length == 0){
removeEnabled = false;
saveEnabled = false;
saveCompiledEnabled = false;
}
for (Object item : sel) {
FileLocal file = (FileLocal)item;
if (file.getFileTypeID() != FileDetails.TYPE_JASPER_REPORT) {
saveCompiledEnabled = false;
}
try {
if (curReport.getMainFile() != null && curReport.getMainFile().equals(file)) {
removeEnabled = false;
}
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}
deleteReportEnable = !curReport.isSpecialReport();
}
addButton.setEnabled(addEnabled);
removeButton.setEnabled(removeEnabled);
saveButton.setEnabled(saveEnabled);
saveCompiled.setEnabled(saveCompiledEnabled);
deleteReportButton.setEnabled(deleteReportEnable);
}
@Override
public boolean isDirty() {
if (curReport != null && curReport.isDirty()) {
return true;
}
return false;
}
@Override
public void save() throws ClipsException {
if (curReport != null) {
if (curReport.getMainFile() == null){
MessageBox.showWarning(MessageBox.W_REPORT_MAIN_FILE_NOT_SET, curReport.getName());
return;
}
curReport.save1();
}
}
@Override
public void restore() {
if (curReport != null) {
if (curReport.isNewlyCreated()) {
remove();
}
else {
curReport.restore();
}
}
}
public void remove(){
if (curReport != null && !curReport.isSpecialReport()){
try {
if (curReport.isNewlyCreated()){
ReportLocal tmp = curReport;
rightPanelSetReport(null, false);
reportListModel.removeElement(tmp);
}
else {
int res = MessageBox.showConfirmYesNo(MessageBox.C_DEL_OBJECT);
if (res == MessageBox.ANSWER_YES){
ReportLocal tmp = curReport;
rightPanelSetReport(null, false);
tmp.remove();
reportListModel.removeElement(tmp);
}
}
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}
}
@Override
public void contentStateChanged() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
updateButtons();
}
});
}
@Override
public String getPageTitle() {
return "Отчеты";
}
void saveFiles(int[] ids, boolean compiled){
for (int item : ids){
FileLocal file = (FileLocal)reportList.getModel().getElementAt(item);
ConfigGui cfg = ConfigGui.getInstance();
JFileChooser choser = new JFileChooser();
choser.setCurrentDirectory(cfg.getLastOpenDialogPath());
FileNameExtensionFilter filter = new FileNameExtensionFilter("Файлы JasperReport", JASPER_EXTENSIONS);
choser.addChoosableFileFilter(filter);
switch (file.getFileTypeID()){
case FileDetails.TYPE_JASPER_REPORT:
choser.setFileFilter(filter);
break;
default:
choser.setFileFilter(choser.getAcceptAllFileFilter());
break;
}
choser.setSelectedFile(new File(choser.getCurrentDirectory().getPath() + File.separator + file.getFileName()));
boolean fileSaved = false;
do{
int id = choser.showSaveDialog(this);
if (id == JFileChooser.APPROVE_OPTION){
cfg.setLastOpenDialogPath(choser.getCurrentDirectory());
File f = choser.getSelectedFile();
if (f.exists()) {
if (MessageBox.showConfirmYesNo(MessageBox.C_OVERWRITE_FILE, f.getName()) != MessageBox.ANSWER_YES) {
continue;
}
}
byte[] data;
try {
if (compiled) {
data = file.getFileCompiledData();
}
else {
data = file.getFileData();
}
} catch (ClipsException ex) {
MessageBox.showException(ex);
return;
}
try {
FileOutputStream stream;
stream = new FileOutputStream(f, false);
try{
stream.write(data);
stream.flush();
}
finally{
stream.close();
}
fileSaved = true;
} catch (IOException ex) {
MessageBox.showException(ex);
}
}
else{
return;
}
}
while (!fileSaved);
}
}
@Override
public DelegateLine2 getDelegate() {
return null;
}
}