JTreeTable

//其中大部分是多余代码 没有整理 有需要自己慢慢找

package com.bestway.bcus.client.checkstock;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.EventObject;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.TableCellRenderer;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;

import org.apache.commons.io.FileUtils;
import com.bestway.bcus.client.checkcancel.DgCancelOwner;
import com.bestway.bcus.client.checkstock.jtreeTable.*;

import com.bestway.bcus.checkcancel.action.CheckCancelAction;
import com.bestway.bcus.checkcancel.entity.CancelOwnerHead;
import com.bestway.bcus.checkstock.action.ECSCheckStockAction;
import com.bestway.bcus.checkstock.action.ECSCheckStockAuthority;
import com.bestway.bcus.checkstock.entity.ECSAttachmentManagement;
import com.bestway.bcus.checkstock.entity.ECSSection;
import com.bestway.bcus.client.common.CommonDataSource;
import com.bestway.bcus.client.common.CommonProgress;
import com.bestway.bcus.client.common.CommonVars;
import com.bestway.bcus.client.common.DgReportViewer;
import com.bestway.bcus.system.entity.Company;
import com.bestway.client.util.JTableListModel;
import com.bestway.client.util.JTableListModelAdapter;
import com.bestway.common.Request;
import com.bestway.ui.winuicontrol.JInternalFrameBase;
import javax.swing.JSplitPane;

/**
 * @author lyh
 * 
 *         // change the template for this generated type comment go to Window -
 *         Preferences - Java - Code Style - Code Templates
 */
@SuppressWarnings({ "serial", "rawtypes", "unchecked" })
public class FmECSAttachment extends JInternalFrameBase {

    private javax.swing.JPanel jContentPane = null;
    private JTableListModel tableModel = null;
    private ECSCheckStockAction ecsCheckStockAction = null;
    private JPanel panel;
    private JToolBar toolBar;
    private JScrollPane scrollPane;
    private JTable table;
    private JButton btnUpLoad;
    private JButton btnDown;
    private Request request;
    private JScrollPane scrollPane_1;
    private JButton btnAdd;
    private JButton btnAddParent;
    private JButton btnAddChild;
    private JButton btnHidden;
    private JButton btnReportPreview;
    private JSplitPane splitPane_1;
    private JTreeTable treeTable;
    private JButton btnEdit;
    private JButton btnSaveData;
    private JButton btnDelette;
    private JPanel panel_1;
    private JToolBar toolBar_1;
    private JButton btnDeleteSection;
    private JButton btnExportExcel;
    AttachmentTableModel treeModel;
    List treeColumnName = new ArrayList();
    private CheckCancelAction checkCancelAction = null;

    /**
     * This is the default constructor
     */
    public FmECSAttachment() {
        super();
        request = new Request(CommonVars.getCurrUser());
        ecsCheckStockAction = (ECSCheckStockAction) CommonVars
                .getApplicationContext().getBean("ecsCheckStockAction");
        ECSCheckStockAuthority authority = (ECSCheckStockAuthority) CommonVars
                .getApplicationContext().getBean("ecsCheckStockAuthority");
        authority.checkAnalyse(request);
        checkCancelAction = (CheckCancelAction) CommonVars
                .getApplicationContext().getBean("checkCancelAction");

        initialize();
    }

    /**
     * This method initializes this
     * 
     * @return void
     */
    private void initialize() {
        this.setSize(1088, 566);
        this.setContentPane(getJContentPane());
        this.setTitle("核查资料附件管理");
        List list = ecsCheckStockAction.findAttachmentSection(request, true);
        if (list == null) {
            list = new ArrayList();
        }
        treeColumnName.add("项目内容");
        treeColumnName.add("资料内容");
        treeColumnName.add("提供单位");
        treeColumnName.add("资料类型");
        treeColumnName.add("资料提供要求");
        treeColumnName.add("是否用印");
        treeColumnName.add("资料签名/手印");
        treeColumnName.add("附件名");
        treeColumnName.add("");
        treeColumnName.add("创建时间");
        treeColumnName.add("创建人");
        treeColumnName.add("修改时间");
        treeColumnName.add("修改人");
        treeColumnName.add("是否隐藏");
        initTable(list);
        initTreeTable();
    }

    public JTreeTable getTreeTable() {
        if (treeTable == null) {
            treeModel = new AttachmentTableModel(treeColumnName,
                    new ArrayList());
            treeTable = new JTreeTable(treeModel);
            treeTable.setTextProperty("projectContent");
        }
        return treeTable;
    }

    // ///
    class ButtonEditor extends DefaultCellEditor {

        protected JButton button;
        private String label;
        private boolean isPushed;

        public ButtonEditor(JTextField checkBox) {
            super(checkBox);
            this.setClickCountToStart(1);
            button = new JButton();
            button.setOpaque(true);
            button.setPreferredSize(new Dimension(20, 16));
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    fireEditingStopped();
                    ECSAttachmentManagement attachment = getDataByRow();
                    if (attachment != null) {
                        if (ECSAttachmentManagement.UPLOAD_AND_DOWNLOAD.equals(attachment.getControlsState())) {
                            Object[] options ={ "上传文件", "下载文件!","取消选择"};
                            int m = JOptionPane.showOptionDialog(null, "请选择!", "标题",JOptionPane.YES_NO_OPTION,
                                    JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
                            if(m==0){
                                // 上传文件
                                upLoad(attachment);
                                initTreeTable();
                            }else if(m==1){
                                // 下载文件
                                download(attachment);
                            }
                            return;
                        } else if (ECSAttachmentManagement.EXPORP_EXCEL.equals(attachment.getControlsState())) {
                            File file = getSelectFile(attachment.getProjectContent()
                                    + ".xls");
                            AttachmentExportExcel exportExecl = new AttachmentExportExcel(
                                    attachment, file);
                            exportExecl.exportExcel();
                        } else if (ECSAttachmentManagement.PRINT.equals(attachment.getControlsState())) {
                            print(attachment);
                        }
                    }else{
                        JOptionPane.showMessageDialog(FmECSAttachment.this, "当前行信息为空!");
                    }
                }
            });

        }

        public Component getTableCellEditorComponent(final JTable table,
                Object value, boolean isSelected, int row, int column) {
            if (isSelected) {
                button.setForeground(table.getSelectionForeground());
                button.setBackground(table.getSelectionBackground());
            } else {
                button.setForeground(table.getForeground());
                button.setBackground(table.getBackground());
            }
            // label = (value == null) ? "" : value.toString();
            if (value != null) {
                if (ECSAttachmentManagement.UPLOAD_AND_DOWNLOAD.equals(value
                        .toString())) {
                    label = "上传/下载";
                } else if (ECSAttachmentManagement.EXPORP_EXCEL.equals(value
                        .toString())) {
                    label = "导出Excel";
                } else if (ECSAttachmentManagement.PRINT.equals(value
                        .toString())) {
                    label = "打印报表";
                }
            }
            isPushed = true;
            if (value == null) {
                return null;
            }
            return button;
        }

        public Object getCellEditorValue() {
            isPushed = false;
            return new String(label);
        }

        public boolean stopCellEditing() {
            isPushed = false;
            return super.stopCellEditing();
        }

        @Override
        public boolean shouldSelectCell(EventObject anEvent) {
            return super.shouldSelectCell(anEvent);
        }

    }

    class ButtonRenderer extends JButton implements TableCellRenderer {

        public ButtonRenderer() {
            setOpaque(true);
        }

        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            if (isSelected) {
                setForeground(table.getSelectionForeground());
                setBackground(table.getSelectionBackground());
            } else {
                setForeground(table.getForeground());
                setBackground(UIManager.getColor("UIManager"));
            }
            // setText((value == null) ? "" : value.toString());

            if (value == null) {
                return null;
            } else {
                if (ECSAttachmentManagement.UPLOAD_AND_DOWNLOAD.equals(value
                        .toString())) {
                    setText("上传/下载");
                } else if (ECSAttachmentManagement.EXPORP_EXCEL.equals(value
                        .toString())) {
                    setText("导出Excel");
                } else if (ECSAttachmentManagement.PRINT.equals(value
                        .toString())) {
                    setText("打印报表");
                }
            }
            return this;
        }
    }

    // ///
    /**
     * 
     * @param jTable
     * @param list
     * @return
     */
    private void initTable(List list) {
        tableModel = new JTableListModel(table, list,
                new JTableListModelAdapter() {
                    public List InitColumns() {
                        List list = new ArrayList();
                        list.add(addColumn("报核次数",
                                "cancelOwnerHead.cancelTimes", 80));
                        list.add(addColumn("批次号", "verificationNo", 60));
                        list.add(addColumn("盘点开始日期", "beginDate", 120));
                        list.add(addColumn("盘点结束日期", "endDate", 120));
                        list.add(addColumn("报核开始日期",
                                "cancelOwnerHead.beginDate", 120));
                        list.add(addColumn("报核结束日期", "cancelOwnerHead.endDate",
                                120));
                        return list;
                    }
                });
    }

    /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */
    private javax.swing.JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new javax.swing.JPanel();
            jContentPane.setLayout(new java.awt.BorderLayout());
            jContentPane.add(getSplitPane_1(), BorderLayout.CENTER);
        }
        return jContentPane;
    }

    /**
     * @return Returns the tableModel.
     */
    public JTableListModel getTableModel() {
        return tableModel;
    }

    /**
     * @param tableModel
     *            The tableModel to set.
     */
    public void setTableModel(JTableListModel tableModel) {
        this.tableModel = tableModel;
    }

    /**
     * 
     * @return
     */
    private JPanel getPanel() {
        if (panel == null) {
            panel = new JPanel();
            panel.setLayout(new BorderLayout(0, 0));
            panel.add(getToolBar(), BorderLayout.NORTH);
            panel.add(getScrollPane(), BorderLayout.CENTER);
        }
        return panel;
    }

    /**
     * 
     * @return
     */
    private JToolBar getToolBar() {
        if (toolBar == null) {
            toolBar = new JToolBar();
            toolBar.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 0));
            toolBar.add(getBtnAddParent());
            toolBar.add(getBtnAddChild());
            toolBar.add(getBtnEdit());
            toolBar.add(getBtnSaveData());
            toolBar.add(getBtnDelette());
            toolBar.add(getBtnHidden());
//            toolBar.add(getBtnUpLoad());
//            toolBar.add(getBtnDown());
//            toolBar.add(getBtnReportPreview());
//            toolBar.add(getBtnExportExcel());
        }
        return toolBar;
    }

    /**
     * 
     * @return
     */
    private JButton getBtnUpLoad() {
        if (btnUpLoad == null) {
            btnUpLoad = new JButton("上传附件");
            btnUpLoad.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    // 上传文件
//                    upLoad();
                    initTreeTable();
                }
            });
        }
        return btnUpLoad;
    }

//    // 上传文件
//    class upLoadFileDataRunnable implements Runnable {
//        public void run() {
//        }
//    }
    
    public void upLoad(ECSAttachmentManagement attachment){
        if (attachment == null) {
            JOptionPane.showMessageDialog(FmECSAttachment.this, "请选择一行!");
        }
        System.out.println(attachment.getAttachmentName());
        if (attachment.getAttachmentName() != null
                && !attachment.getAttachmentName().trim().isEmpty()) {
            if (JOptionPane.YES_NO_OPTION != JOptionPane.showOptionDialog(
                    getParent(), "确定覆盖上传文档吗?", "提示",
                    JOptionPane.YES_NO_OPTION,
                    JOptionPane.QUESTION_MESSAGE, null, new Object[] {
                            "是(Y)", "否(N)" }, "否(N)")) {
                return;
            }
        }
            JFileChooser fileChooser = new JFileChooser();
            fileChooser.removeChoosableFileFilter(fileChooser
                    .getFileFilter());
            // fileChooser.setFileFilter(new CommonFileFilter(
            // new String[] { "*" }, "选择文件"));
            int state = fileChooser.showOpenDialog(FmECSAttachment.this);
            if (state != JFileChooser.APPROVE_OPTION) {
                return;
            }
            File attachmentFile = fileChooser.getSelectedFile();
            if (attachmentFile == null || !attachmentFile.exists()) {
                return;
            }

            upLoadFileData(attachmentFile, attachment);

            initTreeTable();
        

    }

    public void upLoadFileData(File attachmentFile,
            ECSAttachmentManagement attachmentManagement) {
        try {
            // CommonProgress.showProgressDialog(FmECSAttachment.this);
            // CommonProgress.setMessage("系统正在上传文件资料,请稍后...");

            ZipUtil zip = new ZipUtil();
            if (attachmentFile == null) {
                JOptionPane.showMessageDialog(FmECSAttachment.this, "清先选择文件");
            }
            String fileName = attachmentFile.getName();
            if (fileName.indexOf(".") >= 0) {
                fileName = fileName.substring(0, fileName.lastIndexOf("."));
            }
            String newFile = attachmentFile.getParentFile() + "\\" + fileName
                    + ".zip";
            zip.zip(newFile, attachmentFile);

            byte[] fileEntity = zip.fileToBytes(newFile);// 将文件转成byte[]
            ECSAttachmentManagement attachment = attachmentManagement;
            attachment.setAttachmentName(attachmentFile.getName());// 文件名称
            attachment.setCreateDate(new Date());
            attachment.setCreatePeople(CommonVars.getCurrUser().getUserName());
            ecsCheckStockAction.updateAttachment(
                    new Request(CommonVars.getCurrUser()), attachment);
            ecsCheckStockAction.upLoadAttachment(
                    new Request(CommonVars.getCurrUser()), fileEntity, fileName
                            + attachment.getId() + ".zip");
            new File(newFile).delete();
            // CommonProgress.closeProgressDialog();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // CommonProgress.closeProgressDialog();
        }
    }

    private JButton getBtnDown() {
        if (btnDown == null) {
            btnDown = new JButton("下载附件");
            btnDown.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    ECSAttachmentManagement attachment = getDataByRow();
                    if (attachment != null) {
                        // 下载文件
//                        download();
                    } else {
                        JOptionPane.showMessageDialog(FmECSAttachment.this,
                                "请选择要下载的文件!");
                        return;
                    }
                }
            });
        }
        return btnDown;
    }

    /**
     * 
     * @return
     */
    private JScrollPane getScrollPane() {
        if (scrollPane == null) {
            scrollPane = new JScrollPane();
            scrollPane.setViewportView(getTreeTable());
            // scrollPane
            // .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
            // scrollPane
            // .setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        }
        return scrollPane;
    }

    public void initTreeTable() {

        if (tableModel == null) {
            return;
        }
        ECSSection section = (ECSSection) tableModel.getCurrentRow();
        List listData = ecsCheckStockAction.findECSAttachmentManagement(
                new Request(CommonVars.getCurrUser()), section);
        if (listData == null) {
            listData = new ArrayList();
        }
        treeModel = new AttachmentTableModel(treeColumnName, listData);
        treeTable.setModel(treeModel);

        setColumnWidth(treeTable);
        treeTable.getSelectionModel().addListSelectionListener(
                new ListSelectionListener() {
                    @Override
                    public void valueChanged(ListSelectionEvent e) {
                        if (e.getValueIsAdjusting()) {
                            ECSAttachmentManagement attachment = getDataByRow();
                            if (attachment!=null&&attachment.getIsHidden() != null
                                    && attachment.getIsHidden() == true) {
                                btnHidden.setText("显示");
                            } else {
                                btnHidden.setText("隐藏");
                            }
                            setButtonStatus(attachment);
                        }
                    }
                });
        scrollPane.setViewportView(treeTable);
        btnEdit.setEnabled(true);

        treeTable.getColumnModel().getColumn(8)
                .setCellRenderer(new ButtonRenderer());
        treeTable.getColumnModel().getColumn(8)
                .setCellEditor(new ButtonEditor(new JTextField()));
    }

    private void setButtonStatus(ECSAttachmentManagement att) {
        if (att == null) {
            btnAddChild.setEnabled(false);
            btnHidden.setEnabled(false);
//            btnDown.setEnabled(false);
//            btnUpLoad.setEnabled(false);
//            btnReportPreview.setEnabled(false);
//            btnExportExcel.setEnabled(false);
        } else {
            btnAddChild.setEnabled(isStringEmpty(att.getParentId()));
            btnHidden.setEnabled(isStringEmpty(att.getParentId()));
//            btnDown.setEnabled(ECSAttachmentManagement.UPLOAD_AND_DOWNLOAD
//                    .equals(att.getControlsState()));
//            btnUpLoad.setEnabled(ECSAttachmentManagement.UPLOAD_AND_DOWNLOAD
//                    .equals(att.getControlsState()));
//            btnReportPreview.setEnabled(ECSAttachmentManagement.PRINT
//                    .equals(att.getControlsState()));
//            btnExportExcel.setEnabled(ECSAttachmentManagement.EXPORP_EXCEL
//                    .equals(att.getControlsState()));
        }
    }

    private boolean isStringEmpty(String s) {
        return s == null || s.isEmpty();
    }

    public void setColumnWidth(JTreeTable treeTable) {
        treeTable.getColumnModel().getColumn(0).setPreferredWidth(240);
        treeTable.getColumnModel().getColumn(1).setPreferredWidth(100);
        treeTable.getColumnModel().getColumn(2).setPreferredWidth(100);
        treeTable.getColumnModel().getColumn(3).setPreferredWidth(130);
        treeTable.getColumnModel().getColumn(4).setPreferredWidth(80);
        treeTable.getColumnModel().getColumn(5).setPreferredWidth(125);
        treeTable.getColumnModel().getColumn(6).setPreferredWidth(80);
        treeTable.getColumnModel().getColumn(7).setPreferredWidth(150);
        treeTable.getColumnModel().getColumn(8).setPreferredWidth(100);
        treeTable.getColumnModel().getColumn(9).setPreferredWidth(70);
        treeTable.getColumnModel().getColumn(10).setPreferredWidth(70);
        treeTable.getColumnModel().getColumn(11).setPreferredWidth(50);
        treeTable.getColumnModel().getColumn(12).setPreferredWidth(50);
        treeTable.getColumnModel().getColumn(12).setPreferredWidth(50);
    }

//    // 下载文件
//    class DownLoadFileDataRunnable implements Runnable {
//        public void run() {
//        }
//    }

    public void download(ECSAttachmentManagement attachment){
        if (attachment == null) {
            return;
        }
        String fileName = attachment.getAttachmentName() == null ? null
                : attachment.getAttachmentName();
        if (fileName == null || fileName.trim().equals("")) {
            return;
        }
        JFileChooser fileChooser = new JFileChooser("./");
        fileChooser.setDialogTitle("请选择文件的存放路径!");
        String extensions = getFileExtension(fileName);
        if (extensions != null) {
            fileChooser.addChoosableFileFilter(new FileNameExtensionFilter(
                    extensions, extensions));
        }
        // fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);//
        fileChooser.setSelectedFile(new File(fileName));
        int state = fileChooser.showDialog(FmECSAttachment.this, "保存");
        File file = null;
        if (state == JFileChooser.APPROVE_OPTION) {
            file = fileChooser.getSelectedFile();
        } else {
            return;
        }
        if (attachment.getId() != null) {
            downLoadFileData(file, attachment.getId(), fileName);
        }
    }
    
    /**
     * 下载文件
     * 
     * @param depositFile
     *            存放路径
     * @param fileId
     * @param fileName
     */
    public void downLoadFileData(File depositFile, String fileId,
            String fileName) {
        try {
            if (depositFile == null) {
                JOptionPane.showMessageDialog(FmECSAttachment.this,
                        "选择的文件存放地址为空,无法保存!");
                return;
            }
            if (fileId != null) {
                CommonProgress.showProgressDialog(FmECSAttachment.this);
                CommonProgress.setMessage("系统正在下载文件资料,请稍后...");

                if (fileName.indexOf(".") >= 0) {
                    fileName = fileName.substring(0, fileName.lastIndexOf("."));
                }

                // 下载服务器端的文件 文件名加id
                byte[] fileContent = ecsCheckStockAction.downLoadAttachment(
                        new Request(CommonVars.getCurrUser()), fileName
                                + fileId + ".zip");
                if (fileContent == null) {
                    JOptionPane.showMessageDialog(FmECSAttachment.this,
                            "请确认该文件在服务器存在!");
                    return;
                }

                // 将文件写入到选择的目录中
                File zipFile = new File(depositFile.getAbsoluteFile()
                        .getParent() + "\\" + fileName + ".zip");
                FileUtils.writeByteArrayToFile(zipFile, fileContent);

                ZipUtil zip = new ZipUtil();
                // 解压文件
                zip.unzip(zipFile.getAbsolutePath(),
                        depositFile.getAbsolutePath());
                zipFile.delete();
            } else {
                JOptionPane.showMessageDialog(FmECSAttachment.this,
                        "选择下载的文件id为空!");
                return;
            }
            CommonProgress.closeProgressDialog();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            CommonProgress.closeProgressDialog();
        }
    }

    private String getFileExtension(String fileName) {
        int index = fileName.lastIndexOf(".");
        if (index >= 0 && fileName.length() > index + 2) {
            return fileName.substring(index + 1);
        }
        return null;
    }

    private JScrollPane getScrollPane_1() {
        if (scrollPane_1 == null) {
            scrollPane_1 = new JScrollPane();
            scrollPane_1.setViewportView(getTable());
        }
        return scrollPane_1;
    }

    private JTable getTable() {
        if (table == null) {
            table = new JTable();
            table.getSelectionModel().addListSelectionListener(
                    new ListSelectionListener() {
                        @Override
                        public void valueChanged(ListSelectionEvent e) {
                            // if (e.getValueIsAdjusting()) {
                            // }
                            initTreeTable();
                            setButtonStatus(null);
                        }
                    });
        }
        return table;
    }

    private JButton getBtnAdd() {
        if (btnAdd == null) {
            btnAdd = new JButton("新增");
            btnAdd.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    DgAttachmentSectionSel addSection = new DgAttachmentSectionSel();
                    addSection.setVisible(true);
                    if (addSection.isOk()) {
                        tableModel.addRow(addSection.getSection());
                    }
                    initTreeTable();
                }
            });
        }
        return btnAdd;
    }

    private JButton getBtnAddParent() {
        if (btnAddParent == null) {
            btnAddParent = new JButton("新增大纲");
            btnAddParent.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    ECSAttachmentManagement attahment = new ECSAttachmentManagement();
                    ECSSection ecssection = (ECSSection) tableModel
                            .getCurrentRow();
                    attahment.setProjectContent("请输入大纲名称");
                    attahment.setEcssection(ecssection);
                    attahment.setIsTemplate(false);
                    ecsCheckStockAction.saveECSAttachment(request, attahment);
                    initTreeTable();
                }
            });
        }
        return btnAddParent;
    }

    private JButton getBtnAddChild() {
        if (btnAddChild == null) {
            btnAddChild = new JButton("新增内容");
            btnAddChild.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    ECSAttachmentManagement patentAttahment = getDataByRow();
                    if (patentAttahment == null) {
                        return;
                    }
                    if (patentAttahment.getParentId() == null) {
                        ECSAttachmentManagement childAttahment = new ECSAttachmentManagement();
                        ECSSection ecssection = (ECSSection) tableModel
                                .getCurrentRow();
                        childAttahment.setEcssection(ecssection);
                        childAttahment.setCreateDate(new Date());
                        childAttahment.setControlsState("0");
                        childAttahment.setParentId(patentAttahment.getId());
                        childAttahment.setIsTemplate(false);
                        childAttahment.setProjectContent("请输入大纲内容");
                        ecsCheckStockAction.saveECSAttachment(request,
                                childAttahment);
                        initTreeTable();
                    }
                }
            });
        }
        return btnAddChild;
    }

    private JButton getBtnHidden() {
        if (btnHidden == null) {
            btnHidden = new JButton("隐藏");
            btnHidden.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    ECSAttachmentManagement attachment = getDataByRow();
                    if (attachment == null) {
                        return;
                    }
                    attachment.setIsHidden(!Boolean.TRUE.equals(attachment
                            .getIsHidden()));
                    ecsCheckStockAction.saveECSAttachment(request, attachment);
                    initTreeTable();
                }
            });
        }
        return btnHidden;
    }

    private JButton getBtnReportPreview() {
        if (btnReportPreview == null) {
            btnReportPreview = new JButton("报表预览");
            btnReportPreview.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    

                }
            });
        }
        return btnReportPreview;
    }

    public void print(ECSAttachmentManagement attachment){
        ECSSection section = (ECSSection) tableModel
                .getCurrentRow();
        if (section == null) {
            return;
        }
        if (attachment == null) {
            return;
        }

        if (ECSAttachmentManagement.PRINT_BEGINDELCARE
                .equals(attachment.getOperateState())) {
            // 打印预报核
            printReport(true, section.getCancelOwnerHead());
        } else if (ECSAttachmentManagement.PRINT_DELCARE
                .equals(attachment.getOperateState())) {
            // 打印正式报核
            printReport(false, section.getCancelOwnerHead());
        } else if (ECSAttachmentManagement.PRINT_DELCARE_ONE
                .equals(attachment.getOperateState())) {
            // 打印正式报核前一次
            String cancelTimes = String.valueOf((Integer
                    .parseInt(section.getCancelOwnerHead()
                            .getCancelTimes()) - 1));
            CancelOwnerHead cancelOwnerHead = ecsCheckStockAction
                    .findCancelOwnerHead(request, cancelTimes);
            printReport(false, cancelOwnerHead);
        } else if (ECSAttachmentManagement.PRINT_DELCARE_TWO
                .equals(attachment.getOperateState())) {
            // 打印正式报核前两次
            String cancelTimes = String.valueOf((Integer
                    .parseInt(section.getCancelOwnerHead()
                            .getCancelTimes()) - 2));
            CancelOwnerHead cancelOwnerHead = ecsCheckStockAction
                    .findCancelOwnerHead(request, cancelTimes);
            printReport(false, cancelOwnerHead);
        }
    }
    /**
     * 打印
     * 
     * @param boo
     *            为true打印预报核 false 正式报核
     * @param cancelHead
     */
    public void printReport(boolean boo, CancelOwnerHead cancelHead) {
        if (boo) {// 预报核
            List list = checkCancelAction.getCustomsIEToTemp(new Request(
                    CommonVars.getCurrUser()), cancelHead, true);
            if (list == null && list.size() < 0) {
                JOptionPane.showMessageDialog(FmECSAttachment.this,
                        "没有可打印的记录!", "提示", 2);
                return;
            }
            Company company = (Company) CommonVars.getCurrUser().getCompany();
            CommonDataSource imgExgDS = new CommonDataSource(list);
            List headlist = new Vector(); // 只有一条记录
            headlist.add(cancelHead);
            CommonDataSource companyDS = new CommonDataSource(headlist);
            InputStream masterReportStream = DgCancelOwner.class
                    .getResourceAsStream("report/cancelYReport.jasper");
            InputStream detailReportStream = DgCancelOwner.class
                    .getResourceAsStream("report/cancelYReportSub.jasper");
            try {
                JasperReport detailReport = (JasperReport) JRLoader
                        .loadObject(detailReportStream);
                Map<String, Object> parameters = new HashMap<String, Object>();
                parameters.put("name", company.getName());
                parameters.put("code", company.getCode());
                parameters.put("imgExgDS", imgExgDS);// 子数据源
                parameters.put("detailReport", detailReport);// 子报表
                JasperPrint jasperPrint;
                jasperPrint = JasperFillManager.fillReport(masterReportStream,
                        parameters, companyDS);
                DgReportViewer viewer = new DgReportViewer(jasperPrint);
                viewer.setVisible(true);
            } catch (JRException e1) {
                e1.printStackTrace();
            }
        } else {// 正式报核
            List imgExgs = checkCancelAction.findCancelImgResult(new Request(
                    CommonVars.getCurrUser()), cancelHead, true); // 表体
            Company company = (Company) CommonVars.getCurrUser().getCompany();
            CommonDataSource imgExgDS = new CommonDataSource(imgExgs);
            List headlist = new Vector();
            headlist.add(cancelHead);
            CommonDataSource companyDS = new CommonDataSource(headlist);
            InputStream masterReportStream = DgCancelOwner.class
                    .getResourceAsStream("report/cancelReport.jasper");
            InputStream detailReportStream = DgCancelOwner.class
                    .getResourceAsStream("report/cancelReportSub.jasper");
            try {
                JasperReport detailReport = (JasperReport) JRLoader
                        .loadObject(detailReportStream);
                Map<String, Object> parameters = new HashMap<String, Object>();
                parameters.put("name", company.getName());
                parameters.put("code", company.getCode());
                parameters.put("imgExgDS", imgExgDS);// 子数据源
                parameters.put("detailReport", detailReport);// 子报表

                parameters.put("tel", company.getTel());
                parameters.put("owner", company.getOwner());
                JasperPrint jasperPrint;
                jasperPrint = JasperFillManager.fillReport(masterReportStream,
                        parameters, companyDS);
                DgReportViewer viewer = new DgReportViewer(jasperPrint);
                viewer.setVisible(true);
            } catch (JRException e1) {
                e1.printStackTrace();
            }
        }
    }

    private JSplitPane getSplitPane_1() {
        if (splitPane_1 == null) {
            splitPane_1 = new JSplitPane();
            splitPane_1.setOrientation(JSplitPane.VERTICAL_SPLIT);
            splitPane_1.setOneTouchExpandable(true);
            splitPane_1.setDividerSize(5);
            splitPane_1.setBottomComponent(getPanel());
            splitPane_1.setLeftComponent(getPanel_1());
            splitPane_1.setDividerLocation(120);
        }
        return splitPane_1;
    }

    private JButton getBtnEdit() {
        if (btnEdit == null) {
            btnEdit = new JButton("修改");
            btnEdit.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    if ("修改".equals(btnEdit.getText())) {
                        // btnEdit.setEnabled(false);
                        btnEdit.setText("取消修改");
                        btnSaveData.setEnabled(true);
                        if (treeModel != null) {
                            treeModel.setCellEditable(true);
                        }
                    } else {
                        btnEdit.setText("修改");
                        initTreeTable();
                    }
                    setState(false);
                }
            });
        }
        return btnEdit;
    }

    public void setState(boolean boo) {
        btnAddParent.setEnabled(boo);
        btnAddChild.setEnabled(boo);
        btnEdit.setEnabled(boo);
        btnSaveData.setEnabled(!boo);
        btnDelette.setEnabled(boo);
        btnHidden.setEnabled(boo);
    }

    private JButton getBtnSaveData() {
        if (btnSaveData == null) {
            btnSaveData = new JButton("保存");
            btnSaveData.setEnabled(false);
            btnSaveData.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    List<ECSAttachmentManagement> ls = ((AttachmentTableModel) ((TreeTableModelAdapter) treeTable
                            .getModel()).getModel()).getData();
                    ecsCheckStockAction.saveECSAttachment(request, ls);
                    btnEdit.setEnabled(true);
                    if (treeModel != null) {
                        treeModel.setCellEditable(false);
                    }
                    btnSaveData.setEnabled(false);
                    btnEdit.setText("修改");
                    initTreeTable();
                    setState(true);
                }
            });
        }
        return btnSaveData;
    }

    private JButton getBtnDelette() {
        if (btnDelette == null) {
            btnDelette = new JButton("删除");
            btnDelette.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    ECSAttachmentManagement attachment = getDataByRow();
                    if (attachment == null) {
                        return;
                    }
                    if (attachment.getIsTemplate() != null
                            && attachment.getIsTemplate()) {
                        JOptionPane.showMessageDialog(FmECSAttachment.this,
                                "模板允许删除!");
                        return;
                    }
                    ecsCheckStockAction.deleteAttachment(request, attachment);
                    initTreeTable();
                }
            });
        }
        return btnDelette;
    }

    public ECSAttachmentManagement getDataByRow() {
        int row = treeTable.getSelectedRow();
        Object obj = ((TreeTableModelAdapter) treeTable.getModel())
                .getDataByRow(row);
        if (obj instanceof ECSAttachmentManagement) {
            return (ECSAttachmentManagement) obj;
        }
        return null;
    }

    private JPanel getPanel_1() {
        if (panel_1 == null) {
            panel_1 = new JPanel();
            panel_1.setLayout(new BorderLayout(0, 0));
            panel_1.add(getToolBar_1(), BorderLayout.NORTH);
            panel_1.add(getScrollPane_1(), BorderLayout.CENTER);
        }
        return panel_1;
    }

    private JToolBar getToolBar_1() {
        if (toolBar_1 == null) {
            toolBar_1 = new JToolBar();
            toolBar_1.add(getBtnAdd());
            toolBar_1.add(getBtnDeleteSection());
        }
        return toolBar_1;
    }

    private JButton getBtnDeleteSection() {
        if (btnDeleteSection == null) {
            btnDeleteSection = new JButton("删除");
            btnDeleteSection.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    ECSSection section = (ECSSection) tableModel
                            .getCurrentRow();
                    section.setIsExist(false);
                    ecsCheckStockAction.saveEcsSection(request, section);
                    tableModel.deleteRow(section);
                    ecsCheckStockAction.deleteAttachment(request, section);
                    initTreeTable();
                }
            });
        }
        return btnDeleteSection;
    }

    private JButton getBtnExportExcel() {
        if (btnExportExcel == null) {
            btnExportExcel = new JButton("导出Excel");
            btnExportExcel.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    ECSAttachmentManagement attachment = getDataByRow();
                    if (attachment == null) {
                        return;
                    }
                    File file = getSelectFile(attachment.getProjectContent()
                            + ".xls");
                    AttachmentExportExcel exportExecl = new AttachmentExportExcel(
                            attachment, file);
                    exportExecl.exportExcel();

                }
            });
        }
        return btnExportExcel;
    }

    /**
     * 获得保存的文件名
     * 
     * @return
     */
    private File getSelectFile(String fileName) {
        JFileChooser fileChooser = new JFileChooser("./");
        fileChooser.setDialogTitle("请选择文件的存放路径!");
        fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("xls",
                "xls"));
        fileChooser.setSelectedFile(new File(fileName));
        int state = fileChooser.showDialog(FmECSAttachment.this, "保存");
        File file = null;
        if (state == JFileChooser.APPROVE_OPTION) {
            file = fileChooser.getSelectedFile();
        } else {
            return null;
        }

        if (getFileExtension(file.getAbsolutePath()) != null
                && !"xls".equals(getFileExtension(file.getAbsolutePath()))) {
            file = new File(file.getAbsolutePath().substring(0,
                    file.getAbsolutePath().lastIndexOf("."))
                    + ".xls");
        }
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
        return file;
    }
}

//

package com.bestway.bcus.client.checkstock.jtreeTable;

import javax.swing.tree.*;
import javax.swing.event.*;



/**
 * An abstract implementation of the TreeTableModel interface, handling 
 * the list of listeners. 
 *
 * @version %I% %G%
 *
 * @author Philip Milne
 */

public abstract class AbstractTreeTableModel implements TreeTableModel {
    protected Object root;     
    protected EventListenerList listenerList = new EventListenerList();
  
    
    public AbstractTreeTableModel() {
    }
    
    public AbstractTreeTableModel(Object root) {
        this.root = root; 
    }

    //
    // Default implementations for methods in the TreeModel interface. 
    //

    public Object getRoot() {
        return root;
    }
    
    public void setRoot(Object root) {
         this.root = root; 
    }

    public boolean isLeaf(Object node) {
        return getChildCount(node) == 0; 
    }

    public void valueForPathChanged(TreePath path, Object newValue) {}

    // This is not called in the JTree's default mode: 
    // use a naive implementation. 
    public int getIndexOfChild(Object parent, Object child) {
        for (int i = 0; i < getChildCount(parent); i++) {
        if (getChild(parent, i).equals(child)) { 
            return i; 
        }
        }
    return -1; 
    }

    public void addTreeModelListener(TreeModelListener l) {
        listenerList.add(TreeModelListener.class, l);
    }

    public void removeTreeModelListener(TreeModelListener l) {
        listenerList.remove(TreeModelListener.class, l);
    }

    /*
     * Notifies all listeners that have registered interest for
     * notification on this event type.  The event instance 
     * is lazily created using the parameters passed into 
     * the fire method.
     * @see EventListenerList
     */
    protected void fireTreeNodesChanged(Object source, Object[] path, 
                                        int[] childIndices, 
                                        Object[] children) {
        // Guaranteed to return a non-null array
        Object[] listeners = listenerList.getListenerList();
        TreeModelEvent e = null;
        // Process the listeners last to first, notifying
        // those that are interested in this event
        for (int i = listeners.length-2; i>=0; i-=2) {
            if (listeners[i]==TreeModelListener.class) {
                // Lazily create the event:
                if (e == null)
                    e = new TreeModelEvent(source, path, 
                                           childIndices, children);
                ((TreeModelListener)listeners[i+1]).treeNodesChanged(e);
            }          
        }
    }

    /*
     * Notifies all listeners that have registered interest for
     * notification on this event type.  The event instance 
     * is lazily created using the parameters passed into 
     * the fire method.
     * @see EventListenerList
     */
    protected void fireTreeNodesInserted(Object source, Object[] path, 
                                        int[] childIndices, 
                                        Object[] children) {
        // Guaranteed to return a non-null array
        Object[] listeners = listenerList.getListenerList();
        TreeModelEvent e = null;
        // Process the listeners last to first, notifying
        // those that are interested in this event
        for (int i = listeners.length-2; i>=0; i-=2) {
            if (listeners[i]==TreeModelListener.class) {
                // Lazily create the event:
                if (e == null)
                    e = new TreeModelEvent(source, path, 
                                           childIndices, children);
                ((TreeModelListener)listeners[i+1]).treeNodesInserted(e);
            }          
        }
    }

    /*
     * Notifies all listeners that have registered interest for
     * notification on this event type.  The event instance 
     * is lazily created using the parameters passed into 
     * the fire method.
     * @see EventListenerList
     */
    protected void fireTreeNodesRemoved(Object source, Object[] path, 
                                        int[] childIndices, 
                                        Object[] children) {
        // Guaranteed to return a non-null array
        Object[] listeners = listenerList.getListenerList();
        TreeModelEvent e = null;
        // Process the listeners last to first, notifying
        // those that are interested in this event
        for (int i = listeners.length-2; i>=0; i-=2) {
            if (listeners[i]==TreeModelListener.class) {
                // Lazily create the event:
                if (e == null)
                    e = new TreeModelEvent(source, path, 
                                           childIndices, children);
                ((TreeModelListener)listeners[i+1]).treeNodesRemoved(e);
            }          
        }
    }

    /*
     * Notifies all listeners that have registered interest for
     * notification on this event type.  The event instance 
     * is lazily created using the parameters passed into 
     * the fire method.
     * @see EventListenerList
     */
    protected void fireTreeStructureChanged(Object source, Object[] path, 
                                        int[] childIndices, 
                                        Object[] children) {
        // Guaranteed to return a non-null array
        Object[] listeners = listenerList.getListenerList();
        TreeModelEvent e = null;
        // Process the listeners last to first, notifying
        // those that are interested in this event
        for (int i = listeners.length-2; i>=0; i-=2) {
            if (listeners[i]==TreeModelListener.class) {
                // Lazily create the event:
                if (e == null)
                    e = new TreeModelEvent(source, path, 
                                           childIndices, children);
                ((TreeModelListener)listeners[i+1]).treeStructureChanged(e);
            }          
        }
    }

    //
    // Default impelmentations for methods in the TreeTableModel interface. 
    //

    public Class getColumnClass(int column) { return Object.class; }

   /** By default, make the column with the Tree in it the only editable one. 
    *  Making this column editable causes the JTable to forward mouse 
    *  and keyboard events in the Tree column to the underlying JTree. 
    */ 
    public boolean isCellEditable(Object node, int column) { 
         return getColumnClass(column) == TreeTableModel.class; 
    }

    public void setValueAt(Object aValue, Object node, int column) {}


    // Left to be implemented in the subclass:

    /* 
     *   public Object getChild(Object parent, int index)
     *   public int getChildCount(Object parent) 
     *   public int getColumnCount() 
     *   public String getColumnName(Object node, int column)  
     *   public Object getValueAt(Object node, int column) 
     */
}

//

package com.bestway.bcus.client.checkstock.jtreeTable;

import java.util.List;
import java.util.Vector;

import javax.swing.tree.DefaultMutableTreeNode;

import org.apache.commons.lang.time.DateFormatUtils;

import com.bestway.bcus.checkstock.entity.ECSAttachmentManagement;
import com.bestway.common.BaseEntity;

public class AttachmentTableModel extends AbstractTreeTableModel implements TreeTableModel {
    private boolean isCellEditable = false;
    
    //列名
    public List<String> colNames;
    //数据
    public List<ECSAttachmentManagement> data;
    
    
    public AttachmentTableModel(Object root) {
        super(root);
    }
    
    //列的类型
    static protected Class[] colTypes = {
        TreeTableModel.class,String.class,String.class,
        String.class,String.class,String.class,
        String.class,String.class,String.class,
        String.class,String.class,String.class,
        String.class,String.class};
    
    //
    public AttachmentTableModel(List<String> columnNames,
            List<ECSAttachmentManagement> dataVector) {
        this.colNames = columnNames;
        this.data = dataVector;
        DefaultMutableTreeNode top = new DefaultMutableTreeNode("ROOT");
        createNodes(top);
        this.setRoot(top);
    }
    
    public void setCellEditable(boolean isCellEditable) {
        this.isCellEditable = isCellEditable;
    }
    public boolean isCellEditable(){
        return isCellEditable;
    }

    //设置数据
    public List<ECSAttachmentManagement> getData(){
        return this.data;
    }
        
    public void setData(Vector<ECSAttachmentManagement> entityVector) {
        data = entityVector;
    }
    //创建节点 
    private void createNodes(DefaultMutableTreeNode top) {
        for (int i = 0; i < data.size(); i++) {
            ECSAttachmentManagement parentAttachment = data.get(i);
            DefaultMutableTreeNode parentNode = new DefaultMutableTreeNode(parentAttachment);
            if(parentAttachment.getChildren()!=null){
                //当是否隐藏为空或者为false时候才添加节点
                if(parentAttachment.getIsHidden()==null||parentAttachment.getIsHidden()==false){
                    for (int j = 0; j < parentAttachment.getChildren().size(); j++) {
                        ECSAttachmentManagement childAttachment = parentAttachment.getChildren().get(j);
                        DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(childAttachment);
                        parentNode.add(childNode);
                    }
                }
                
            }
            top.add(parentNode);
        }
    }
    
    /**
     * @return 获得节点对象
     * @param rowIndex
     * 
     * */
    public Object getObjectByNode(Object node) {
        Object obj = null;
        if (node instanceof DefaultMutableTreeNode) {
            obj = ((DefaultMutableTreeNode) node).getUserObject();
        } else {
            obj = node;
        }

        return obj;
    }
    public Class<?> getColumnClass(int column) {
        return colTypes[column];
    }

    @Override
    public int getColumnCount() {
        return colNames.size();
    }
    
    @Override
    public String getColumnName(int column) {
        return colNames.get(column);
    }
    /**
     * 获取行数据
     * @param index
     * @return
     */
    public <T> T getRowData(int index){
        return (T)data.get(index);
    }
    
    @Override
    public boolean isCellEditable(Object node, int column) {
        if(column==8){
            return true;
        }
        if(column != 0 && isCellEditable == false)
            return false;
        ECSAttachmentManagement attachment = (ECSAttachmentManagement)getObjectByNode(node);
        if(attachment.getParentId() == null){
            return column == 0;
        }else {
            return column < 5;
        }    
    }
    
    @Override
    public Object getValueAt(Object node, int column) {  //渲染表格 显示数据        
        ECSAttachmentManagement attachment = null;
        Object useObj = getObjectByNode(node);
        if (useObj == null) {
            return null;
        }
        if(useObj instanceof BaseEntity){
            attachment=(ECSAttachmentManagement) useObj;
        }else{
            return column == 0 ? useObj.toString() : "";
        }
        
        switch (column) { //现在我把名称渲染到第二列
        case 0:
            return attachment.getProjectContent();
        case 1:
            return attachment.getDataContent();
        case 2:
            return attachment.getProvideUnit();
        case 3:
            return attachment.getDataType();
        case 4:
            return attachment.getRequirements();
        case 5:
            return attachment.getUsingSeal();
        case 6:
            return attachment.getDataSignature();
        case 7:
            return attachment.getAttachmentName();
        case 8:
            return attachment.getControlsState();
        case 9:
            if(attachment.getCreateDate()==null){
                return null;
            }else{
                return DateFormatUtils.format(attachment.getCreateDate(),"yyyy-MM-dd");
            }
        case 10:
            return attachment.getCreatePeople();
        case 11:
            if(attachment.getUpdateDate()==null){
                return null;
            }else{
                return DateFormatUtils.format(attachment.getUpdateDate(),"yyyy-MM-dd");
            }
        case 12:
            return attachment.getUpdatePeople();
        case 13:
            if(attachment.getIsHidden()==null||attachment.getIsHidden()==false){
                return "";
            }else{
                return "是";    
            }
        }
        
        return null;
    }
    
    @Override
    public void setValueAt(Object aValue, Object node, int column) {
        ECSAttachmentManagement attachment = ((ECSAttachmentManagement)getObjectByNode(node));
        String value = (String)aValue;
        switch (column) { //现在我把名称渲染到第二列
        case 0:
            attachment.setProjectContent(value);
            break;
        case 1:
            attachment.setDataContent(value);
            break;
        case 2:
            attachment.setProvideUnit(value);
            break;
        case 3:
            attachment.setDataType(value);
            break;
        case 4:
            attachment.setRequirements(value);
            break;
        case 5:
            attachment.setUsingSeal(value);
            break;
        case 6:
            attachment.setDataSignature(value);
            break;
        }
        
    }

    @Override
    public Object getChild(Object parent, int index) {
        if (parent instanceof DefaultMutableTreeNode) {
            return ((DefaultMutableTreeNode) parent).getChildAt(index);
        } else {
            return null;
        }
    }

    @Override
    public int getChildCount(Object parent) {
        Object o = getObjectByNode(parent);
        if(o instanceof ECSAttachmentManagement){
            ECSAttachmentManagement att =((ECSAttachmentManagement)o);
            List<ECSAttachmentManagement> ch = att.getChildren();
            return ch == null || Boolean.TRUE.equals(att.getIsHidden()) ? 0 : ch.size();
        }else{
            return ((DefaultMutableTreeNode)parent).getChildCount();
        }
    }

     public boolean isLeaf(Object node) {
        Object o = getObjectByNode(node);
        if(o instanceof ECSAttachmentManagement){
            String pid = ((ECSAttachmentManagement)getObjectByNode(node)).getParentId();
            return pid != null;
        }
        return ((DefaultMutableTreeNode)node).getChildCount() == 0;
     }
}

//

package com.bestway.bcus.client.checkstock.jtreeTable;

import javax.swing.DefaultCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.ListSelectionModel;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.tree.*;
import javax.swing.table.*;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;

import com.bestway.bcus.checkstock.entity.ECSAttachmentManagement;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.util.Enumeration;
import java.util.EventObject;

/**
 * This example shows how to create a simple JTreeTable component, by using a
 * JTree as a renderer (and editor) for the cells in a particular column in the
 * JTable.
 * 
 * @version %I% %G%
 * 
 * @author Philip Milne
 * @author Scott Violet
 */

public class JTreeTable extends JTable {
    /** A subclass of JTree. */
    protected TreeTableCellRenderer tree;
    private String textProperty;

    public String getTextProperty() {
        return textProperty;
    }

    public void setTextProperty(String textProperty) {
        this.textProperty = textProperty;
    }

    public JTreeTable(TreeTableModel treeTableModel) {
        super();
        init(treeTableModel);
    }
    
    public void setModel(TreeTableModel treeTableModel){
        init(treeTableModel);
    }
    
    private void init(TreeTableModel treeTableModel){
        // Creates the tree. It will be used as a renderer and editor.
        tree = new TreeTableCellRenderer(treeTableModel);
        tree.setRootVisible(false);
        // Installs a tableModel representing the visible rows in the tree.
        super.setModel(new TreeTableModelAdapter(treeTableModel, tree));

        // Forces the JTable and JTree to share their row selection models.
        ListToTreeSelectionModelWrapper selectionWrapper = new ListToTreeSelectionModelWrapper();
        tree.setSelectionModel(selectionWrapper);
        setSelectionModel(selectionWrapper.getListSelectionModel());

        // Installs the tree editor renderer and editor.
        setDefaultRenderer(TreeTableModel.class, tree);
        setDefaultEditor(TreeTableModel.class, new TreeTableCellEditor());
        TableCellEditor cellEditor = getDefaultEditor(String.class);        
        if(cellEditor instanceof DefaultCellEditor){
            ((DefaultCellEditor)cellEditor).setClickCountToStart(1);
        }
        // 显示格子线
        setShowGrid(true);
        //不显示垂直线条
        setShowVerticalLines(false);
        setAutoResizeMode(AUTO_RESIZE_OFF);
        // No intercell spacing
        setIntercellSpacing(new Dimension(0,2));

        // And update the height of the trees row to match that of
        // the table.
//                if (tree.getRowHeight() < 1) {
//                    // Metal looks better like this.
//                }
        setRowHeight(35);
        TreeNode root = (TreeNode) tree.getModel().getRoot();
        expandAll(tree, new TreePath(root));
    }
    /**
     * 展开所有节点
     * @param tree
     * @param parent
     */
    private void expandAll(TreeTableCellRenderer tree, TreePath parent) {
        TreeNode node = (TreeNode) parent.getLastPathComponent();
        if (node.getChildCount() >= 0) {
            for (Enumeration e = node.children(); e.hasMoreElements();) {
                TreeNode n = (TreeNode) e.nextElement();
                TreePath path = parent.pathByAddingChild(n);
                expandAll(tree, path);
                tree.expandPath(parent); 
            }
        }
    }

    
    /**
     * Overridden to message super and forward the method to the tree. Since the
     * tree is not actually in the component hierarchy it will never receive
     * this unless we forward it in this manner.
     */
    public void updateUI() {
        super.updateUI();
        if (tree != null) {
            tree.updateUI();
            // Do this so that the editor is referencing the current renderer
            // from the tree. The renderer can potentially change each time
            // laf changes.
            setDefaultEditor(TreeTableModel.class, new TreeTableCellEditor());
        }
        // Use the tree's default foreground and background colors in the
        // table.
        LookAndFeel.installColorsAndFont(this, "Tree.background",
                "Tree.foreground", "Tree.font");
    }

    /**
     * Workaround for BasicTableUI anomaly. Make sure the UI never tries to
     * resize the editor. The UI currently uses different techniques to paint
     * the renderers and editors; overriding setBounds() below is not the right
     * thing to do for an editor. Returning -1 for the editing row in this case,
     * ensures the editor is never painted.
     */
    public int getEditingRow() {
        return (getColumnClass(editingColumn) == TreeTableModel.class) ? -1
                : editingRow;
    }

    /**
     * Returns the actual row that is editing as <code>getEditingRow</code> will
     * always return -1.
     */
    private int realEditingRow() {
        return editingRow;
    }

    /**
     * This is overridden to invoke super's implementation, and then, if the
     * receiver is editing a Tree column, the editor's bounds is reset. The
     * reason we have to do this is because JTable doesn't think the table is
     * being edited, as <code>getEditingRow</code> returns -1, and therefore
     * doesn't automatically resize the editor for us.
     */
    public void sizeColumnsToFit(int resizingColumn) {
        super.sizeColumnsToFit(resizingColumn);
        if (getEditingColumn() != -1
                && getColumnClass(editingColumn) == TreeTableModel.class) {
            Rectangle cellRect = getCellRect(realEditingRow(),getEditingColumn(), false);
            Component component = getEditorComponent();
            component.setBounds(cellRect);
            component.validate();
        }
    }

    /**
     * Overridden to pass the new rowHeight to the tree.
     */
    public void setRowHeight(int rowHeight) {
        super.setRowHeight(rowHeight);
        if (tree != null && tree.getRowHeight() != rowHeight) {
            tree.setRowHeight(getRowHeight());
        }
    }

//    @Override
//    public void changeSelection(int rowIndex, int columnIndex, boolean toggle,
//            boolean extend) {
//        boolean editable = ((TreeTableModelAdapter)getModel()).getModel().isCellEditable();
//        if(editable){
//            super.changeSelection(rowIndex, columnIndex, toggle, extend);
//            super.editCellAt(rowIndex, columnIndex, null);
//        }
//    }
    /**
     * Returns the tree that is being shared between the model.
     */
    public JTree getTree() {
        return tree;
    }

    /**
     * Overridden to invoke repaint for the particular location if the column
     * contains the tree. This is done as the tree editor does not fill the
     * bounds of the cell, we need the renderer to paint the tree in the
     * background, and then draw the editor over it.
     */
    public boolean editCellAt(int row, int column, EventObject e) {
        boolean retValue = super.editCellAt(row, column, e);
        if (retValue && getColumnClass(column) == TreeTableModel.class) {
            repaint(getCellRect(row, column, false));
        }
        return retValue;
    }

    /**
     * 一个TreeCellRender JTree的子类 用语显示一棵树
     */
    public class TreeTableCellRenderer extends JTree implements
            TableCellRenderer {
        /** Last table/tree row asked to renderer. */
        protected int visibleRow;
        /**
         * Border to draw around the tree, if this is non-null, it will be
         * painted.
         */
        protected Border highlightBorder;

        public TreeTableCellRenderer(TreeModel model) {
            super(model);
        }
        
        /**
         * updateUI is overridden to set the colors of the Tree's renderer to
         * match that of the table.
         */
        public void updateUI() {
            super.updateUI();
            // Make the tree's cell renderer use the table's cell selection
            // colors.
            TreeCellRenderer tcr = getCellRenderer();
            if (tcr instanceof DefaultTreeCellRenderer) {
                DefaultTreeCellRenderer dtcr = ((DefaultTreeCellRenderer) tcr);
                // For 1.1 uncomment this, 1.2 has a bug that will cause an
                // exception to be thrown if the border selection color is
                // null.
                // dtcr.setBorderSelectionColor(null);
                dtcr.setTextSelectionColor(UIManager
                        .getColor("Table.selectionForeground"));
                dtcr.setBackgroundSelectionColor(UIManager
                        .getColor("Table.selectionBackground"));
            }
        }

        /**
         * Sets the row height of the tree, and forwards the row height to the
         * table.
         */
        public void setRowHeight(int rowHeight) {
            if (rowHeight > 0) {
                super.setRowHeight(rowHeight);
                if (JTreeTable.this != null
                        && JTreeTable.this.getRowHeight() != rowHeight) {
                    JTreeTable.this.setRowHeight(getRowHeight());
                }
            }
        }

        /**
         * This is overridden to set the height to match that of the JTable.
         */
        public void setBounds(int x, int y, int w, int h) {
            super.setBounds(x, 0, w, JTreeTable.this.getHeight());
        }

        /**
         * Sublcassed to translate the graphics such that the last visible row
         * will be drawn at 0,0.
         */
        public void paint(Graphics g) {
            g.translate(0, -visibleRow * getRowHeight());
            super.paint(g);
            // Draw the Table border if we have focus.
            if (highlightBorder != null) {
                highlightBorder.paintBorder(this, g, 0, visibleRow
                        * getRowHeight(), getWidth(), getRowHeight());
            }
        }
        @Override
        public String convertValueToText(Object value, boolean selected,
                boolean expanded, boolean leaf, int row, boolean hasFocus) {
//            if(leaf){
//                 if(value instanceof DefaultMutableTreeNode){
//                    value = ((DefaultMutableTreeNode)value).getUserObject();
//                    try {
//                        if(value instanceof ECSAttachmentManagement){
//                            ECSAttachmentManagement attachment = (ECSAttachmentManagement)value;
//                            return attachment.getProjectContent();
//                        }
//                        return value.toString();
//                    } catch (Exception e) {
//                        e.printStackTrace();
//                    }
//                }
//            }
            
            if(value instanceof DefaultMutableTreeNode){
                value = ((DefaultMutableTreeNode)value).getUserObject();
                try {
                    if(value instanceof String){
                        return (String)value;
//                        ECSAttachmentManagement attachment = (ECSAttachmentManagement)value;
//                        Pro
//                        return attachment.getProjectContent();
                    }else{
                        return BeanUtils.getSimpleProperty(value, textProperty);
                    }
//                    return value.toString();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return super.convertValueToText(value, selected, expanded, leaf, row, hasFocus);
        }
        /**
         * TreeCellRenderer method. Overridden to update the visible row.
         */
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            Color background;
            Color foreground;
            
            if (isSelected) {
                background = table.getSelectionBackground();
                foreground = table.getSelectionForeground();
            } else {
                background = table.getBackground();
                foreground = table.getForeground();
            }
            highlightBorder = null;
            if (realEditingRow() == row && getEditingColumn() == column) {
                background = UIManager.getColor("Table.focusCellBackground");
                foreground = UIManager.getColor("Table.focusCellForeground");
            } else if (hasFocus) {
                highlightBorder = UIManager
                        .getBorder("Table.focusCellHighlightBorder");
                if (isCellEditable(row, column)) {
                    background = UIManager
                            .getColor("Table.focusCellBackground");
                    foreground = UIManager
                            .getColor("Table.focusCellForeground");
                }
            }

            visibleRow = row;
            setBackground(background);            
            TreeCellRenderer tcr = getCellRenderer();
            
            if (tcr instanceof DefaultTreeCellRenderer) {
                DefaultTreeCellRenderer dtcr = ((DefaultTreeCellRenderer) tcr);
//                ImageIcon image = new ImageIcon("/1.png");
                ImageIcon image1 = new ImageIcon(getClass().getResource("1.png"));
                ImageIcon image2 = new ImageIcon(getClass().getResource("2.png"));
                ImageIcon image3 = new ImageIcon(getClass().getResource("3.png"));
                dtcr.setClosedIcon(image2);
                dtcr.setOpenIcon(image1);
                dtcr.setLeafIcon(image3);
                if (isSelected) {
                    dtcr.setTextSelectionColor(foreground);
                    dtcr.setBackgroundSelectionColor(background);
                } else {
                    dtcr.setTextNonSelectionColor(foreground);
                    dtcr.setBackgroundNonSelectionColor(background);
                }
            }            
            return this;
        }
    }

    public class TreeTableCellEditor extends DefaultCellEditor {
        public TreeTableCellEditor() {
            super(new TreeTableTextField());
        }

        /**
         * Overridden to determine an offset that tree would place the editor
         * at. The offset is determined from the <code>getRowBounds</code> JTree
         * method, and additionally from the icon DefaultTreeCellRenderer will
         * use.
         * <p>
         * The offset is then set on the TreeTableTextField component created in
         * the constructor, and returned.
         */
        public Component getTableCellEditorComponent(JTable table,
                Object value, boolean isSelected, int r, int c) {
            Component component = super.getTableCellEditorComponent(table,
                    value, isSelected, r, c);
//            JTree t = getTree();
//            boolean rv = t.isRootVisible();
//            int offsetRow = rv ? r : r - 1;
//            Rectangle bounds = t.getRowBounds(offsetRow);
//            if(bounds == null)
//                return component;
//            int offset = bounds.x;
//            TreeCellRenderer tcr = t.getCellRenderer();
//            if (tcr instanceof DefaultTreeCellRenderer) {
//                Object node = t.getPathForRow(offsetRow).getLastPathComponent();
//                Icon icon;
//                if (t.getModel().isLeaf(node))
//                    icon = ((DefaultTreeCellRenderer) tcr).getLeafIcon();
//                else if (tree.isExpanded(offsetRow))
//                    icon = ((DefaultTreeCellRenderer) tcr).getOpenIcon();
//                else
//                    icon = ((DefaultTreeCellRenderer) tcr).getClosedIcon();
//                if (icon != null) {
//                    offset += ((DefaultTreeCellRenderer) tcr).getIconTextGap()
//                            + icon.getIconWidth();
//                }
//            }
//            ((TreeTableTextField) getComponent()).offset = offset;
//            System.out.println(value);
            return component;
        }

        /**
         * This is overridden to forward the event to the tree. This will return
         * true if the click count >= 3, or the event is null.
         */
        public boolean isCellEditable(EventObject e) {
            if (e instanceof MouseEvent) {
                MouseEvent me = (MouseEvent) e;
                // If the modifiers are not 0 (or the left mouse button),
                // tree may try and toggle the selection, and table
                // will then try and toggle, resulting in the
                // selection remaining the same. To avoid this, we
                // only dispatch when the modifiers are 0 (or the left mouse
                // button).
                if (me.getModifiers() == 0
                        || me.getModifiers() == InputEvent.BUTTON1_MASK) {
                    for (int counter = getColumnCount() - 1; counter >= 0; counter--) {
                        if (getColumnClass(counter) == TreeTableModel.class) {
                            MouseEvent newME = new MouseEvent(
                                    JTreeTable.this.tree, me.getID(),
                                    me.getWhen(), me.getModifiers(), me.getX()- getCellRect(0, counter, true).x,
                                    me.getY(), me.getClickCount(),
                                    me.isPopupTrigger());
                            JTreeTable.this.tree.dispatchEvent(newME);
                            break;
                        }
                    }
                }
                boolean editable = ((TreeTableModelAdapter)getModel()).getModel().isCellEditable();
                if (editable && me.getClickCount() >= 1) {
                    return true;
                }
                return false;
            }
            if (e == null) {
                return true;
            }
            return false;
        }
    }

    /**
     * Component used by TreeTableCellEditor. The only thing this does is to
     * override the <code>reshape</code> method, and to ALWAYS make the x
     * location be <code>offset</code>.
     */
    static class TreeTableTextField extends JTextField {
        public int offset;

        public void reshape(int x, int y, int w, int h) {
            int newX = Math.max(x, offset);
            super.reshape(newX, y, w - (newX - x), h);
        }
    }

    /**
     * ListToTreeSelectionModelWrapper extends DefaultTreeSelectionModel to
     * listen for changes in the ListSelectionModel it maintains. Once a change
     * in the ListSelectionModel happens, the paths are updated in the
     * DefaultTreeSelectionModel.
     */
    class ListToTreeSelectionModelWrapper extends DefaultTreeSelectionModel {
        /** Set to true when we are updating the ListSelectionModel. */
        protected boolean updatingListSelectionModel;

        public ListToTreeSelectionModelWrapper() {
            super();
            getListSelectionModel().addListSelectionListener(
                    createListSelectionListener());
        }

        /**
         * Returns the list selection model. ListToTreeSelectionModelWrapper
         * listens for changes to this model and updates the selected paths
         * accordingly.
         */
        ListSelectionModel getListSelectionModel() {
            return listSelectionModel;
        }

        /**
         * This is overridden to set <code>updatingListSelectionModel</code> and
         * message super. This is the only place DefaultTreeSelectionModel
         * alters the ListSelectionModel.
         */
        public void resetRowSelection() {
            if (!updatingListSelectionModel) {
                updatingListSelectionModel = true;
                try {
                    super.resetRowSelection();
                } finally {
                    updatingListSelectionModel = false;
                }
            }
            // Notice how we don't message super if
            // updatingListSelectionModel is true. If
            // updatingListSelectionModel is true, it implies the
            // ListSelectionModel has already been updated and the
            // paths are the only thing that needs to be updated.
        }

        /**
         * Creates and returns an instance of ListSelectionHandler.
         */
        protected ListSelectionListener createListSelectionListener() {
            return new ListSelectionHandler();
        }

        /**
         * If <code>updatingListSelectionModel</code> is false, this will reset
         * the selected paths from the selected rows in the list selection
         * model.
         */
        protected void updateSelectedPathsFromSelectedRows() {
            if (!updatingListSelectionModel) {
                updatingListSelectionModel = true;
                try {
                    // This is way expensive, ListSelectionModel needs an
                    // enumerator for iterating.
                    int min = listSelectionModel.getMinSelectionIndex();
                    int max = listSelectionModel.getMaxSelectionIndex();

                    clearSelection();
                    if (min != -1 && max != -1) {
                        for (int counter = min; counter <= max; counter++) {
                            if (listSelectionModel.isSelectedIndex(counter)) {
                                TreePath selPath = tree.getPathForRow(counter);

                                if (selPath != null) {
                                    addSelectionPath(selPath);
                                }
                            }
                        }
                    }
                } finally {
                    updatingListSelectionModel = false;
                }
            }
        }

        /**
         * Class responsible for calling updateSelectedPathsFromSelectedRows
         * when the selection of the list changse.
         */
        class ListSelectionHandler implements ListSelectionListener {
            public void valueChanged(ListSelectionEvent e) {
                updateSelectedPathsFromSelectedRows();
            }
        }
    }
}

//

package com.bestway.bcus.client.checkstock.jtreeTable;

import javax.swing.tree.TreeModel;

/**
 * TreeTableModel is the model used by a JTreeTable. It extends TreeModel
 * to add methods for getting inforamtion about the set of columns each 
 * node in the TreeTableModel may have. Each column, like a column in 
 * a TableModel, has a name and a type associated with it. Each node in 
 * the TreeTableModel can return a value for each of the columns and 
 * set that value if isCellEditable() returns true. 
 *
 * @version %I% %G%
 *
 * @author Philip Milne 
 * @author Scott Violet
 */
public interface TreeTableModel extends TreeModel
{
    /**
     * Returns the number of available columns.
     */
    public int getColumnCount();

    /**
     * Returns the name for column number <code>column</code>.
     */
    public String getColumnName(int column);

    /**
     * Returns the type for column number <code>column</code>.
     */
    public Class getColumnClass(int column);

    /**
     * Returns the value to be displayed for node <code>node</code>, 
     * at column number <code>column</code>.
     */
    public Object getValueAt(Object node, int column);

    /**
     * Indicates whether the the value for node <code>node</code>, 
     * at column number <code>column</code> is editable.
     */
    public boolean isCellEditable(Object node, int column);
    /*
     * 是否可编辑
     */
    public boolean isCellEditable();

    /**
     * Sets the value for node <code>node</code>, 
     * at column number <code>column</code>.
     */
    public void setValueAt(Object aValue, Object node, int column);
}

///

package com.bestway.bcus.client.checkstock.jtreeTable;

import javax.swing.JTree;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;

/**
 * This is a wrapper class takes a TreeTableModel and implements the table model
 * interface. The implementation is trivial, with all of the event dispatching
 * support provided by the superclass: the AbstractTableModel.
 * 
 * @version %I% %G%
 * 
 * @author Philip Milne
 * @author Scott Violet
 */

public class TreeTableModelAdapter extends AbstractTableModel {
    JTree tree;
    TreeTableModel treeTableModel;

    public TreeTableModelAdapter(TreeTableModel treeTableModel, JTree tree) {
        this.tree = tree;
        this.treeTableModel = treeTableModel;

        tree.addTreeExpansionListener(new TreeExpansionListener() {
            // Don't use fireTableRowsInserted() here;
            // the selection model would get updated twice.
            public void treeExpanded(TreeExpansionEvent event) {
                fireTableDataChanged();
            }

            public void treeCollapsed(TreeExpansionEvent event) {
                fireTableDataChanged();
            }
        });
    }
    
    public TreeTableModel getModel() {
        return treeTableModel;
    }

    // Wrappers, implementing TableModel interface.

    public int getColumnCount() {
        return treeTableModel.getColumnCount();
    }

    public String getColumnName(int column) {
        return treeTableModel.getColumnName(column);
    }

    public Class getColumnClass(int column) {
        return treeTableModel.getColumnClass(column);
    }

    public int getRowCount() {
        return tree.getRowCount();
    }

    protected Object nodeForRow(int row) {
        TreePath treePath = tree.getPathForRow(row);
        return treePath.getLastPathComponent();
    }
    /**
     * 获取行数据
     * @param row
     * @return
     */
    public <T> T getDataByRow(int row){
        TreePath treePath = tree.getPathForRow(row);
        if(treePath==null){
            return null;
        }
        return (T)((DefaultMutableTreeNode)treePath.getLastPathComponent()).getUserObject();
    }

    public Object getValueAt(int row, int column) {
        return treeTableModel.getValueAt(nodeForRow(row), column);
    }

    public boolean isCellEditable(int row, int column) {
        return treeTableModel.isCellEditable(nodeForRow(row), column);
    }

    public void setValueAt(Object value, int row, int column) {
        treeTableModel.setValueAt(value, nodeForRow(row), column);
    }
}

//

 

转载于:https://www.cnblogs.com/keweizhi/p/3569933.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值