/*
* PanelCertificate.java
*
* Created on 22 Декабрь 2008 г., 10:30
*/
package clips.doctor.certificate;
import clips.delegate.directory.complex.DirectoryCertificateType;
import clips.delegate.directory.complex.DirectoryCertificateTypeItem;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import clips.delegate.doctor.DiseaseLocal;
import clips.delegate.doctor.certificate.CertificateLocal;
import clips.delegate.doctor.certificate.tag.interfaces.CertTag;
import clips.delegate.doctor.certificate.tag.CertTagFactory;
import clips.delegate.doctor.certificate.tag.interfaces.TypeDate;
import clips.delegate.doctor.certificate.tag.interfaces.TypeMultiSelectable;
import clips.delegate.doctor.certificate.tag.interfaces.TypeSelectableRO;
import clips.delegate.doctor.certificate.tag.interfaces.TypeTextArea;
import clips.delegate.doctor.certificate.tag.interfaces.TypeTextField;
import cli_fmw.delegate.DelegateLine2;
import cli_fmw.delegate.report.ReportLocal;
import cli_fmw.delegate.report.ReportParam;
import clips.doctor.certificate.controlPanels.PanelDate;
import clips.doctor.certificate.controlPanels.PanelMultiSelectable;
import clips.doctor.certificate.controlPanels.PanelSelectable;
import clips.doctor.certificate.controlPanels.PanelTextField;
import clips.doctor.certificate.controlPanels.PanelTextArea;
import cli_fmw.main.ClipsException;
import cli_fmw.main.PageContainer;
import cli_fmw.main.PageGeneric;
import cli_fmw.main.Persistentable;
import cli_fmw.main.Printable;
import cli_fmw.report.implemenatation.ReportPreview;
import cli_fmw.report.panels.model.delegate.DirectoryComboBoxModel;
import cli_fmw.utils.MessageBox;
import cli_fmw.utils.table_config_states.StateSaver;
import clips.delegate.doctor.certificate.tag.interfaces.TypeSelectable;
import clips.delegate.doctor.certificate.tag.interfaces.TypeSelectableEdit;
import clips.doctor.PanelEMC;
import clips.doctor.certificate.controlPanels.PanelSelectableEdit;
import framework.utils.Converter;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperPrint;
/**
*
* @author vip
*/
public class PanelCertificate extends PageGeneric implements Persistentable, Printable {
private CertificateLocal cert;
private boolean canBeEdit;
private DiseaseLocal disease;
private ArrayList<CertTag> tagList;
private DirectoryComboBoxModel<CertificateLocal, DirectoryCertificateTypeItem> cbTypeModel;
//для запоминания положения скрола
private boolean shown = false;
private static int lastDelegateID;
private static int lastScrollBarValue;
/**
*
* @param container
* @param cert_
* @param diseaseLocal can be null
* @throws ClipsException
*/
public PanelCertificate(PageContainer container, CertificateLocal cert_) throws ClipsException {
super(container);
initComponents();
this.cert = cert_;
this.canBeEdit = cert_.isCanBeEdit();
this.disease = cert.getDisease();
jScrollPane1.getVerticalScrollBar().setUnitIncrement(10);
DirectoryCertificateType directoryCertType = DirectoryLocator.getDirectory(DirectoryCertificateType.class, false);
/* Selector ii = certificateType.getItems();
for (int i = 0; i < ii.size(); i++) {
DirectoryCertificateTypeItem item = (DirectoryCertificateTypeItem) ii.get(i);
cbType.addItem(item);
}*/
cbTypeModel = new DirectoryComboBoxModel
<CertificateLocal, DirectoryCertificateTypeItem>(cbType, directoryCertType, cert) {
@Override
public DirectoryCertificateTypeItem getSelectedDirectoryItem() throws ClipsException {
return getObject().getType();
}
@Override
public void setSelectedDirectoryItem(DirectoryCertificateTypeItem item) throws ClipsException {
if (getObject().getType().getID() != item.getID()) {
getObject().setType(item);
setScreenFields();
}
}
@Override
public boolean isEnabled() {
if (!super.isEnabled()) return false;
try {
return getObject().getType().getID() == 0;
} catch (ClipsException ex) {
MessageBox.showException(ex);
return false;
}
}
};
setScreenFields();
StateSaver.attachTo(this);
System.out.println("formComponentCreated");
System.out.println(getSize());
}
public void setScreenFields() throws ClipsException {
initMyComponents();
DirectoryCertificateTypeItem item = cert.getType();
chooserDate.setDate(cert.getDate());
tfCollab.setText(cert.getCollaborator().getTitle());
setEnableComponents();
}
private void initMyComponents() throws ClipsException {
ReportLocal reportLocal = cert.getType().getReportLocal();
//System.out.println("REPORT: "+ reportLocal.toString());
ArrayList<ReportParam> params;
Map<String, Object> defaultParameters;
if (reportLocal != null) {
params = reportLocal.getParams();
defaultParameters = reportLocal.getDefaultParameters();
} else {
params = new ArrayList<ReportParam>();
defaultParameters = new HashMap<String, Object>();
}
//Создание массива тегов
tagList = new ArrayList<CertTag>();
for (int i = 0; i < params.size(); i++) {
ReportParam reportParam = params.get(i);
//обход дефолтных параметров
if (defaultParameters.containsKey(reportParam.getRealName())) {
continue;
}
Class<? extends CertTag> classByTag = CertTagFactory.getClassByTag(reportParam.getRealName());
try {
Constructor<? extends CertTag> constructor = classByTag.getConstructor(CertificateLocal.class, ReportParam.class, DiseaseLocal.class);
CertTag tag = constructor.newInstance(cert, reportParam, disease);
tagList.add(tag);
} catch (NoSuchMethodException ex) {
throw new ClipsException("Ошибка в теге справки", ex);
} catch (SecurityException ex) {
throw new ClipsException("Ошибка в теге справки", ex);
} catch (InstantiationException ex) {
throw new ClipsException("Ошибка в теге справки", ex);
} catch (IllegalAccessException ex) {
throw new ClipsException("Ошибка в теге справки", ex);
} catch (IllegalArgumentException ex) {
throw new ClipsException("Ошибка в теге справки", ex);
} catch (InvocationTargetException ex) {
throw new ClipsException("Ошибка в теге справки", ex);
}
}
//Создание компонентов по типу матрешки - панели одна в другой, BorderLayout.NORTH
JComponent last = jScrollPane1;
for (int i = 0; i < tagList.size(); i++) {
CertTag tag = tagList.get(i);
//System.out.println(tag.getClass().toString());
JPanel border = new JPanel(new BorderLayout(0, 5));
JPanel panel = null;
if (tag instanceof TypeTextField) {
panel = new PanelTextField((TypeTextField) tag, jScrollPane1);
} else if (tag instanceof TypeTextArea) {
panel = new PanelTextArea((TypeTextArea) tag, jScrollPane1);
} else if (tag instanceof TypeSelectableEdit) {
panel = new PanelSelectableEdit((TypeSelectableEdit) tag, jScrollPane1);
} else if (tag instanceof TypeSelectableRO) {
panel = new PanelSelectable((TypeSelectableRO) tag, jScrollPane1);
} else if (tag instanceof TypeSelectable) {
panel = new PanelSelectable((TypeSelectable) tag, jScrollPane1);
} else if (tag instanceof TypeMultiSelectable) {
panel = new PanelMultiSelectable((TypeMultiSelectable) tag, jScrollPane1);
} else if (tag instanceof TypeDate) {
panel = new PanelDate((TypeDate) tag, jScrollPane1);
}
border.add(panel, BorderLayout.NORTH);
if (last instanceof JScrollPane) {
jScrollPane1.setViewportView(border);
} else {
last.add(border, BorderLayout.CENTER);
}
last = border;
}
}
//предполагается, что тип справки изменить можно только один раз при создании справки
public void setEnableComponents() throws ClipsException {
chooserDate.setEnabled(false);
cbType.setEnabled(canBeEdit && cert.getType().getID() == 0);
}
@Override
public void paint(Graphics g) {
if (!shown && lastDelegateID == cert.getID()) {
jScrollPane1.getVerticalScrollBar().getModel().setValue(lastScrollBarValue);
}
shown = true;
super.paint(g);
}
/** 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() {
jPanel5 = new javax.swing.JPanel();
jPanel2 = new javax.swing.JPanel();
jPanel4 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
chooserDate = new org.infotechservice.ICalendar.components.ICDateChooser();
jPanel6 = new javax.swing.JPanel();
jPanel3 = new javax.swing.JPanel();
jLabel2 = new javax.swing.JLabel();
cbType = new javax.swing.JComboBox();
jPanel1 = new javax.swing.JPanel();
jLabel3 = new javax.swing.JLabel();
tfCollab = new javax.swing.JTextField();
jScrollPane1 = new javax.swing.JScrollPane();
jPanel5.setLayout(new java.awt.BorderLayout(5, 5));
jPanel2.setLayout(new java.awt.BorderLayout(10, 10));
jPanel4.setLayout(new java.awt.GridLayout(0, 1, 5, 5));
jLabel1.setText("Дата выписки:");
jPanel4.add(jLabel1);
chooserDate.setEnabled(false);
chooserDate.setMinimumSize(new java.awt.Dimension(41, 47));
chooserDate.setVerifyInputWhenFocusTarget(false);
jPanel4.add(chooserDate);
jPanel2.add(jPanel4, java.awt.BorderLayout.WEST);
jPanel6.setLayout(new java.awt.BorderLayout(10, 10));
jPanel3.setLayout(new java.awt.GridLayout(0, 1, 5, 5));
jLabel2.setText("Тип документа:");
jPanel3.add(jLabel2);
jPanel3.add(cbType);
jPanel6.add(jPanel3, java.awt.BorderLayout.WEST);
jPanel1.setLayout(new java.awt.GridLayout(0, 1, 0, 5));
jLabel3.setText("Выписал:");
jPanel1.add(jLabel3);
tfCollab.setEditable(false);
jPanel1.add(tfCollab);
jPanel6.add(jPanel1, java.awt.BorderLayout.CENTER);
jPanel2.add(jPanel6, java.awt.BorderLayout.CENTER);
jPanel5.add(jPanel2, java.awt.BorderLayout.NORTH);
jPanel5.add(jScrollPane1, java.awt.BorderLayout.CENTER);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, 598, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel5, javax.swing.GroupLayout.PREFERRED_SIZE, 234, Short.MAX_VALUE)
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JComboBox cbType;
private org.infotechservice.ICalendar.components.ICDateChooser chooserDate;
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.JTextField tfCollab;
// End of variables declaration//GEN-END:variables
@Override
public String getPageTitle() {
return "Справка";
}
@Override
public DelegateLine2 getDelegate() {
return cert;
}
@Override
public boolean isDirty() {
return cert.isDirty();
}
@Override
public void save() throws ClipsException {
cert.save1();
lastScrollBarValue = jScrollPane1.getVerticalScrollBar().getModel().getValue();
lastDelegateID = cert.getID();
}
@Override
public void restore() {
if (isDirty()) {
if (cert.isNewlyCreated()) {
try {
getContainer().removePage(this, true);
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
} else {
cert.restore();
try {
setScreenFields();
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}
}
}
@Override
public boolean readyForPrint() {
return !cert.isDirty();
}
@Override
public void print() {
try {
ReportLocal reportLocal = cert.getType().getReportLocal();
Map<String, Object> map = new HashMap<String, Object>();
for (int i = 0; i < tagList.size(); i++) {
CertTag certTag = tagList.get(i);
map.put(certTag.getTagName(), certTag.getValue());
}
JasperPrint clientReport = reportLocal.getClientReport(map);
ReportPreview.showReport(clientReport);
} catch (ClipsException ex) {
MessageBox.showException(ex);
} catch (JRException ex) {
MessageBox.showExceptionOnly(ex);
}
}
}