/*
* PanelDanger.java
*
* Created on 12 Сентябрь 2008 г., 12:32
*/
package clips.doctor.profcheckup.dialogs;
import clips.delegate.contract.ContractLocal;
import clips.delegate.contract.ServisePriceData;
import clips.delegate.directory.complex.DangerServiceData;
import clips.delegate.directory.filtered.DirectoryCheckupTypeItem;
import clips.delegate.directory.complex.DirectoryDangerItem;
import clips.delegate.directory.filtered.DirectoryServiceItem;
import clips.delegate.doctor.checkup.CheckupXMLData;
import clips.doctor.checkup.prepareCheckup.DialogEditCheckUpList;
import cli_fmw.utils.InfoDialog;
import cli_fmw.utils.MessageBox;
import cli_fmw.utils.ModalDialog;
import cli_fmw.main.ClipsException;
import cli_fmw.main.MainWindow;
import cli_fmw.utils.DefaultColors;
import cli_fmw.utils.Selector;
import cli_fmw.utils.SelectorEditableExceptional;
import cli_fmw.utils.table_config_states.StateSaver;
import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import org.jdom.JDOMException;
/**
*
* @author petr
*/
public class PanelDanger extends javax.swing.JPanel {
public static String PROPERTY_ACTIVE = "Active";
private DirectoryDangerItem current;
// private ArrayList<CheckupXMLData> xmlList;
private Map<Integer, CheckupXMLData> xmlMap;
private boolean xmlFilled;
private String infoText;
private boolean lastState;
private ArrayList<DirectoryServiceItem> serviceList;
private HashMap<DirectoryServiceItem, Integer> servMap;
private boolean isRed;
private boolean isBlocked;
private boolean fullMoney = true;
/**
*
* @param danger
* @param xmlMap can be null, will created
* @param block
* @throws cli_fmw.main.ClipsException
*/
public PanelDanger(DirectoryDangerItem danger, Map<Integer, CheckupXMLData> xmlMap, boolean block, ContractLocal contractLocal) throws ClipsException {
xmlFilled = false;
initComponents();
tfSerpack.setText(danger.getTitle());
lastState = false;
current = danger;
servMap = new HashMap<DirectoryServiceItem, Integer>();
Selector<ServisePriceData> contractServiceList = contractLocal.getContractServiceList();
for (int i = 0; i < contractServiceList.size(); i++) {
ServisePriceData data = contractServiceList.get(i);
servMap.put(data.getService(), data.getPrice() - data.getMoney());
}
createServiceList(contractServiceList);
if (xmlMap != null){
this.xmlMap = xmlMap;
xmlFilled = true;
}else{
createXmlList();
}
isBlocked = block;
if (block){//заблокировано
// btInfo.setEnabled(false);
btAnalises.setEnabled(false);
// isRed = false;
serviceList = new ArrayList<DirectoryServiceItem>();
SelectorEditableExceptional<DangerServiceData> dsChunk = current.getDangerServices();
for (int i = 0; i < dsChunk.size(); i++) {
serviceList.add(dsChunk.get(i).getService());
}
}
if(isInContract()){
if(!fullMoney){
this.setBackground(DefaultColors.middle(Color.YELLOW, Color.WHITE));
}else{
this.setBackground(jPanel1.getBackground());
}
}else{
this.setBackground(Color.RED);
}
if (!xmlFilled){
btAnalises.setBackground(DefaultColors.FIELD_TO_INPUT);
}
tfSerpack.setCaretPosition(0);
StateSaver.attachTo(this);
}
/** 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() {
jLabel1 = new javax.swing.JLabel();
jPanel1 = new javax.swing.JPanel();
jPanel2 = new javax.swing.JPanel();
tfSerpack = new javax.swing.JTextField();
btInfo = new javax.swing.JButton();
btAnalises = new javax.swing.JButton();
jLabel1.setText("Вредный фактор");
setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 2, 2, 2));
setPreferredSize(new java.awt.Dimension(310, 29));
setLayout(new java.awt.BorderLayout());
jPanel1.setPreferredSize(new java.awt.Dimension(310, 29));
jPanel1.setLayout(new java.awt.BorderLayout());
jPanel2.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 10, 0, 5));
jPanel2.setLayout(new java.awt.BorderLayout());
tfSerpack.setEditable(false);
tfSerpack.setText("jTextField1");
tfSerpack.setPreferredSize(new java.awt.Dimension(150, 19));
jPanel2.add(tfSerpack, java.awt.BorderLayout.CENTER);
btInfo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/icons/info.PNG"))); // NOI18N
btInfo.setPreferredSize(new java.awt.Dimension(19, 19));
btInfo.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btInfoActionPerformed(evt);
}
});
jPanel2.add(btInfo, java.awt.BorderLayout.LINE_END);
jPanel1.add(jPanel2, java.awt.BorderLayout.CENTER);
btAnalises.setText("Анализы");
btAnalises.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btAnalisesActionPerformed(evt);
}
});
jPanel1.add(btAnalises, java.awt.BorderLayout.LINE_END);
add(jPanel1, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
/**
* fill info about services in danger factor
* @throws cli_fmw.main.ClipsException
*/
private void createServiceList(Selector<ServisePriceData> contractServiceList) throws ClipsException{
infoText = "<html> <h3> " + current.getTitle() + " </h3><hr>";
serviceList = new ArrayList<DirectoryServiceItem>();
//делаем выбранный активнымt
infoText += "<p><UL>";
ArrayList<DirectoryServiceItem> list = new ArrayList<DirectoryServiceItem>();
SelectorEditableExceptional<DangerServiceData> dsChunk = current.getDangerServices();
for (int i = 0; i < dsChunk.size(); i++) {
DangerServiceData dangerService = dsChunk.get(i);
DirectoryServiceItem service = dangerService.getService();
serviceList.add(service);
String serv = "";
serv += service + (!dangerService.getSpeciality().isNullItem() ? " " + dangerService.getSpeciality() : "");
if (!servMap.containsKey(service)){
serv = "<font color=red>" + serv + " (не включена в договор!) </font>";
isRed = true;
}else{
if (servMap.get(service) != 0){
serv = "<font color=#FF8888>" + serv + " (оплачивается не полностью!) </font>";
fullMoney = false;
}
}
infoText += "<li>" + serv;
}
infoText += "</ul></p>";
infoText += " </html>";
}
/**
* вызывать только после заполнения списка услуг
* (например после вызова createServiceList)
* @throws cli_fmw.main.ClipsException
*/
private void createXmlList() throws ClipsException{
if (serviceList != null) {
//создание списка хмлшег
try {
if (xmlMap == null) {
xmlMap = new HashMap<Integer, CheckupXMLData>();
for (int i = 0; i < serviceList.size(); i++) {
DirectoryServiceItem service = serviceList.get(i);
DirectoryCheckupTypeItem checkupTypeItem = service.getCheckUpType();
if (checkupTypeItem != null && checkupTypeItem.getID() != 0) {
xmlMap.put(service.getID(), new CheckupXMLData(checkupTypeItem));
}
}
}
} catch (JDOMException ex) {
MessageBox.showError(MessageBox.E_INVALID_XML_STRING);
return;
}
if (xmlMap.isEmpty()) {
xmlFilled = true;
btAnalises.setEnabled(false);
}
}
}
private void btAnalisesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btAnalisesActionPerformed
if (!xmlMap.isEmpty()) {
showDialog();
}
}//GEN-LAST:event_btAnalisesActionPerformed
/**
* Show dialog checkup editing
*/
private void showDialog(){
//hindu backup
int size = xmlMap.size();
int[] idxs = new int[size];
String[] xmls = new String[size];
boolean[] dirties = new boolean[size];
DirectoryCheckupTypeItem[] types = new DirectoryCheckupTypeItem[size];
Iterator<Integer> it = xmlMap.keySet().iterator();
int i = 0;
while (it.hasNext()) {
Integer index = it.next();
CheckupXMLData xmlData = xmlMap.get(index);
idxs[i] = index;
xmls[i] = xmlData.getXMLStr();
dirties[i] = xmlData.isDirty();
types[i] = xmlData.getCheckupType();
i++;
}
DialogEditCheckUpList dlg = new DialogEditCheckUpList(MainWindow.mainWindow,
new ArrayList<CheckupXMLData>(xmlMap.values())) {
@Override
public void setVisible(boolean b) {
super.setVisible(b);
this.setLocation(btInfo.getLocationOnScreen());
}
};
dlg.setAlwaysOnTop(true);
dlg.setVisible(true);
if (dlg.getDlgResult() == ModalDialog.DLG_CANCEL) {
//hindu restore
try {
for (int j = 0; j < size; j++) {
xmlMap.put(idxs[j], new CheckupXMLData(types[j], xmls[j], dirties[j]));
}
} catch (JDOMException ex) {
MessageBox.showException(new ClipsException("Произошла ошибка,\n корректность назначения проб не гарантирована.", ex));
xmlFilled = false;
}
xmlFilled = false;
return;
}
if (dlg.getDlgResult() == ModalDialog.DLG_OK) {
xmlFilled = true;
}
if (xmlFilled){
btAnalises.setBackground(DefaultColors.BUTTON_BACKGROUND);
}else{
btAnalises.setBackground(DefaultColors.FIELD_TO_INPUT);
}
}
private void btInfoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btInfoActionPerformed
InfoDialog dialog = new InfoDialog(MainWindow.mainWindow, infoText, "Назначаемые услуги");
dialog.setAlwaysOnTop(true);
dialog.setVisible(true);
}//GEN-LAST:event_btInfoActionPerformed
public boolean isXmlFilled(){
return xmlFilled;
}
public DirectoryDangerItem getDanger() {
return current;
}
public ArrayList<DirectoryServiceItem> getServiceList() {
return serviceList;
}
public CheckupXMLData getXml(DirectoryServiceItem service){
return xmlMap.get(service.getID());
}
public boolean isInContract(){
return !(!isBlocked & isRed);
}
@Override
public void paint(Graphics g) {
super.paint(g);
}
@Override
public String toString() {
return current.getTitle();
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btAnalises;
private javax.swing.JButton btInfo;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JTextField tfSerpack;
// End of variables declaration//GEN-END:variables
}