/*
* PanelSheduleIndividual.java
*
*/
package cli_fmw.utils.chooser;
import cli_fmw.delegate.directory.Directory;
import cli_fmw.delegate.directory.DirectoryItemRO;
import cli_fmw.delegate.directory.DirectoryItemRecursive;
import cli_fmw.main.ClipsException;
import cli_fmw.utils.MessageBox;
import cli_fmw.utils.Selector;
import cli_fmw.utils.ModalDialog;
import cli_fmw.utils.table_config_states.StateSaver;
import java.util.ArrayList;
import java.util.LinkedList;
import javax.swing.JLabel;
/**
*
* @author Axe Ilshat
*/
public class ChoosePanel extends javax.swing.JPanel {
private ChoosePanelData items[];
ChoosePanelComboModel boxModel = new ChoosePanelComboModel();
/**
* Creates new form PanelSheduleIndividual
*/
public ChoosePanel() {
initComponents();
}
public void setData(Directory<? extends DirectoryItemRO> dir, DirectoryItemRO current,
String label) throws ClipsException {
Selector<?> selector = dir.getItems();
ArrayList<ChoosePanelData> data = new ArrayList<ChoosePanelData>();
for(int i=0; i< selector.size(); i++) {
DirectoryItemRO item = (DirectoryItemRO) selector.get(i);
/*if(!item.isVisible()) {
continue;
}*/
ChoosePanelData d = buildData(item);
data.add(d);
}
ChoosePanelData array[] = new ChoosePanelData[data.size()];
data.toArray(array);
ChoosePanelData currentData = null;
if (current != null) {
currentData = find(array, current.getID(), 0);
if (currentData == null) {
currentData = buildData(current);
}
}
setData(array, currentData, label);
StateSaver.attachTo(this);
}
/**
*
* @param dir
* @param current
* @param label
* @param button
* @throws cli_fmw.main.ClipsException
*/
public void setData(DirectoryItemRO dir[], DirectoryItemRO current,
String label) throws ClipsException {
ArrayList<ChoosePanelData> data = new ArrayList<ChoosePanelData>();
for(int i=0; i< dir.length; i++) {
ChoosePanelData d = buildData(dir[i]);
data.add(d);
}
ChoosePanelData array[] = new ChoosePanelData[data.size()];
data.toArray(array);
ChoosePanelData currentData = null;
if (current != null) {
currentData = find(array, current.getID(), 0);
if (currentData == null) {
currentData = buildData(current);
}
}
setData(array, currentData, label);
StateSaver.attachTo(this);
}
/**
*
* @param item
* @return
* @throws cli_fmw.main.ClipsException
*/
private ChoosePanelData buildData(DirectoryItemRO item) throws ClipsException {
ChoosePanelData d = new ChoosePanelData();
d.value = item.getID();
d.title = item.toString();
d.canBeSelected = true;
if(item instanceof DirectoryItemRecursive) {
DirectoryItemRecursive thisItem = (DirectoryItemRecursive)item;
Selector ii = thisItem.getItems();
if(ii.size() > 0) {
LinkedList<ChoosePanelData> ll = new LinkedList<ChoosePanelData>();
for(int j=0; j<ii.size(); j++) {
DirectoryItemRecursive it = (DirectoryItemRecursive) ii.get(j);
if(!it.isVisible()) {
continue;
}
ChoosePanelData d2 = buildData(it);
ll.add(d2);
}
if(ll.size() > 0) {
d.items = new ChoosePanelData[ll.size()];
ll.toArray(d.items);
}
}
}
return d;
}
private ChoosePanelData find (ChoosePanelData list[], int id, int type) {
for(int i=0; i<list.length; i++) {
ChoosePanelData d = list[i];
if(d.value == id && d.type == type) {
return d;
}
if(d.items != null) {
d = find(d.items, id, type);
if(d != null) {
return d;
}
}
}
return null;
}
/**
* инициализирует панель
* @param list список опций
* @param current элемент из списка list, который будет выбран после инициализации панели
* @param label подпись к панели
* @param button подпись на кнопке
* @throws ClipsException
*/
public void setData(ChoosePanelData list[], ChoosePanelData current,
String label) throws ClipsException {
this.items = list;
jLabel1.setText(label);
int size = list.length;
if(size == 0) {
itemsCombo.setEnabled(false);
selectBtn.setVisible(false);
add(new JLabel("Нет вариантов для выбора"));
System.out.println("В панель выбора передан пустой список");
}
itemsCombo.removeAllItems();
for(int i=0; i<items.length; i++) {
append(items[i]);
}
boxModel.setSelectedItem(current);
}
public void setEnableChoose(boolean b) {
itemsCombo.setEnabled(b);
selectBtn.setEnabled(b);
}
private void append(ChoosePanelData item) throws ClipsException {
if(item.canBeSelected) {
itemsCombo.addItem(item);
}
if(item.items != null) {
for(int i=0; i<item.items.length; i++) {
append(item.items[i]);
}
}
}
public void addChoosePanelListener(ChoosePanelComboListener listener) {
boxModel.addChoosePanelListener(listener);
}
public void removeChoosePanelListener(ChoosePanelComboListener listener) {
boxModel.removeChoosePanelListener(listener);
}
/**
* Назначает текущий выбранный итем, при этом не вызываются слушатели изменений
* @param type тип каталога (0, если панель сгенерирована по каталогу)
* @param id идентификатор итема, (-1, если убрать выделение)
*/
public void setCurrentSelection(int type, int id) {
boxModel.setSilent(true);
if(id == -1) {
itemsCombo.setSelectedIndex(-1);
} else {
ChoosePanelData selection = find(items, id, type);
itemsCombo.setSelectedItem(selection);
}
boxModel.setSilent(false);
}
public ChoosePanelData getCurrent(){
return (ChoosePanelData) boxModel.getSelectedItem();
}
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
itemsCombo = new javax.swing.JComboBox(boxModel);
selectBtn = new javax.swing.JButton();
setLayout(new java.awt.BorderLayout(5, 5));
jLabel1.setText("Label");
add(jLabel1, java.awt.BorderLayout.WEST);
add(itemsCombo, java.awt.BorderLayout.CENTER);
selectBtn.setText("...");
selectBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
selectBtnActionPerformed(evt);
}
});
add(selectBtn, java.awt.BorderLayout.EAST);
}// </editor-fold>//GEN-END:initComponents
private void selectBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectBtnActionPerformed
try {
//fixme default selected
ChooseDialog dlg = new ChooseDialog(items, false, null);
dlg.setVisible(true);
if (dlg.getDlgResult() == ModalDialog.DLG_OK) {
Selector coll = dlg.getSelectedItems();
ChoosePanelData selected = (ChoosePanelData) coll.get(0);
itemsCombo.setSelectedItem(selected);
}
} catch (ClipsException ex) {
MessageBox.showExceptionOnly(ex);
}
}//GEN-LAST:event_selectBtnActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JComboBox itemsCombo;
private javax.swing.JLabel jLabel1;
private javax.swing.JButton selectBtn;
// End of variables declaration//GEN-END:variables
}