package com.vci.client.ui.swing.components.table.export;
|
|
import java.awt.BorderLayout;
|
import java.awt.Component;
|
import java.awt.Dimension;
|
import java.awt.FlowLayout;
|
import java.awt.GridBagConstraints;
|
import java.awt.GridBagLayout;
|
import java.awt.Point;
|
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionListener;
|
import java.awt.event.KeyAdapter;
|
import java.awt.event.KeyEvent;
|
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseEvent;
|
import java.util.Iterator;
|
import java.util.LinkedHashMap;
|
import java.util.LinkedList;
|
import java.util.regex.Pattern;
|
|
import javax.swing.BoxLayout;
|
import javax.swing.ButtonGroup;
|
import javax.swing.DefaultComboBoxModel;
|
import javax.swing.DefaultListCellRenderer;
|
import javax.swing.DefaultListModel;
|
import javax.swing.ImageIcon;
|
import javax.swing.JList;
|
import javax.swing.text.AttributeSet;
|
import javax.swing.text.BadLocationException;
|
import javax.swing.text.Document;
|
import javax.swing.text.PlainDocument;
|
|
import com.vci.client.ui.swing.VCISwingUtil;
|
import com.vci.client.ui.swing.components.VCIJButton;
|
import com.vci.client.ui.swing.components.VCIJComboBox;
|
import com.vci.client.ui.swing.components.VCIJDialog;
|
import com.vci.client.ui.swing.components.VCIJLabel;
|
import com.vci.client.ui.swing.components.VCIJList;
|
import com.vci.client.ui.swing.components.VCIJOptionPane;
|
import com.vci.client.ui.swing.components.VCIJPanel;
|
import com.vci.client.ui.swing.components.VCIJRadioButton;
|
import com.vci.client.ui.swing.components.VCIJScrollPane;
|
import com.vci.client.ui.swing.components.VCIJTextField;
|
import com.vci.client.ui.swing.components.table.AbstractVCIJTableDataProvider;
|
import com.vci.client.ui.swing.components.table.VCIJTablePanel;
|
|
/**
|
*
|
* <p>Title: </p>
|
* <p>Description: </p>
|
* <p>Copyright: Copyright (c) 2012</p>
|
* <p>Company: VCI</p>
|
* @author xchao
|
* @time 2012-5-10
|
* @version 1.0
|
*/
|
public class VCIJTablePanelExportFilterDialog<T> extends VCIJDialog {
|
|
/**
|
*
|
*/
|
private static final long serialVersionUID = 5179592609825598347L;
|
|
/************************ 导出相关的 *********************************/
|
private VCIJComboBox cbxExportTypes = new VCIJComboBox();
|
private LinkedHashMap<String, ImageIcon> exportSupportTypes = new LinkedHashMap<String, ImageIcon>();
|
|
private VCIJRadioButton rbtnChecked = new VCIJRadioButton("选择", true);
|
private VCIJRadioButton rbtnAll = new VCIJRadioButton("全部", false);
|
private VCIJRadioButton rbtnPageNum = new VCIJRadioButton("页码");
|
private SpecialFormatPageRangeTextField txtPageNum = new SpecialFormatPageRangeTextField("1", 10);
|
private VCIJLabel lblPateNum = new VCIJLabel("(输入页码或页面范围。如:1-10)");
|
|
private VCIJTablePanelExportFilterDialogActionListener<T> actionListener = new VCIJTablePanelExportFilterDialogActionListener<T>(this);
|
// 实例初始化
|
{
|
exportSupportTypes.put("Excel(*.xls|*.xlsx)", VCISwingUtil.createImageIcon("export_excel.png"));
|
// exportSupportTypes.put("Word(*.doc|*.docx)", VCISwingUtil.createImageIcon("export_word.png"));
|
// exportSupportTypes.put("PDF(*.pdf)", VCISwingUtil.createImageIcon("export_pdf.png"));
|
}
|
|
|
private VCIJTablePanel<T> tablePanel = null;
|
public VCIJTablePanelExportFilterDialog(VCIJTablePanel<T> tablePanel){
|
super(VCISwingUtil.getClientMainFrame());
|
this.tablePanel = tablePanel;
|
this.init();
|
}
|
|
private void init(){
|
initSizeAndLocation();
|
initComponents();
|
}
|
|
private void initSizeAndLocation(){
|
setTitle("数据导出属性选择窗口");
|
setSize(new Dimension(700, 550));
|
Point location = VCISwingUtil.getClientMainFrame().getLocation();
|
location.setLocation(location.getX() + 30, location.getY() + 30);
|
setLocation(location);
|
}
|
|
private void initComponents(){
|
setLayout(new BorderLayout());
|
add(createCenterPanel(), BorderLayout.CENTER);
|
add(createBottomButtonPanel(), BorderLayout.SOUTH);
|
}
|
|
private VCIJPanel createCenterPanel(){
|
VCIJPanel pal = new VCIJPanel(new GridBagLayout());
|
GridBagConstraints c = new GridBagConstraints();
|
|
c.gridx = 0;
|
c.gridy = 0;
|
c.gridwidth = 4;
|
c.gridheight = 1;
|
c.weightx = 0;
|
c.weighty = 0;
|
c.fill = GridBagConstraints.EAST;
|
c.anchor = GridBagConstraints.NORTHWEST;
|
pal.add(createCheckBoxPanel(), c);
|
|
c.gridx = 0;
|
c.gridy = 1;
|
c.gridwidth = 1;
|
c.gridheight = 1;
|
c.weightx = 1;
|
c.weighty = 1;
|
c.fill = GridBagConstraints.BOTH;
|
c.anchor = GridBagConstraints.NORTHWEST;
|
VCIJScrollPane jspScrollListLeft = new VCIJScrollPane(createLeftList());
|
jspScrollListLeft.setPreferredSize(new Dimension(100, 100));
|
pal.add(jspScrollListLeft, c);
|
|
c.gridx = 1;
|
c.gridy = 1;
|
c.gridwidth = 1;
|
c.gridheight = 1;
|
c.weightx = 0;
|
c.weighty = 0;
|
c.fill = GridBagConstraints.NONE;
|
c.anchor = GridBagConstraints.CENTER;
|
pal.add(createMoveLeftRightButtonPanel(), c);
|
|
c.gridx = 2;
|
c.gridy = 1;
|
c.gridwidth = 1;
|
c.gridheight = 1;
|
c.weightx = 1;
|
c.weighty = 1;
|
c.fill = GridBagConstraints.BOTH;
|
c.anchor = GridBagConstraints.NORTHEAST;
|
VCIJScrollPane jspScrollListRight = new VCIJScrollPane(createRightList());
|
jspScrollListRight.setPreferredSize(new Dimension(100, 100));
|
pal.add(jspScrollListRight, c);
|
|
c.gridx = 3;
|
c.gridy = 1;
|
c.gridwidth = 1;
|
c.gridheight = 1;
|
c.weightx = 0;
|
c.weighty = 0;
|
c.fill = GridBagConstraints.NONE;
|
c.anchor = GridBagConstraints.CENTER;
|
pal.add(createMoveUpDownButtonPanel(), c);
|
return pal;
|
}
|
|
private VCIJPanel createMoveLeftRightButtonPanel(){
|
VCIJPanel pal = new VCIJPanel();
|
|
pal.setLayout(new BoxLayout(pal, BoxLayout.Y_AXIS));
|
VCIJButton btn = createVCIJButton("move_left_all_to_right", "", "", "control-fast-forward.png");
|
pal.add(btn);
|
pal.add(new VCIJLabel(" "));
|
pal.add(new VCIJLabel(" "));
|
|
btn = createVCIJButton("move_left_part_to_right", "", "", "arrow-right.png");
|
pal.add(btn);
|
pal.add(new VCIJLabel(" "));
|
pal.add(new VCIJLabel(" "));
|
|
btn = createVCIJButton("move_right_part_to_left", "", "", "arrow-left.png");
|
pal.add(btn);
|
pal.add(new VCIJLabel(" "));
|
pal.add(new VCIJLabel(" "));
|
|
btn = createVCIJButton("move_right_all_to_left", "", "", "control-rewind.png");
|
pal.add(btn);
|
return pal;
|
}
|
|
private VCIJPanel createMoveUpDownButtonPanel(){
|
VCIJPanel pal = new VCIJPanel();
|
|
pal.setLayout(new BoxLayout(pal, BoxLayout.Y_AXIS));
|
VCIJButton btn = createVCIJButton("move_down_to_up", "", "", "arrow-up.png");
|
pal.add(btn);
|
pal.add(new VCIJLabel(" "));
|
pal.add(new VCIJLabel(" "));
|
|
btn = createVCIJButton("move_up_to_down", "", "", "arrow-down.png");
|
pal.add(btn);
|
pal.add(new VCIJLabel(" "));
|
pal.add(new VCIJLabel(" "));
|
return pal;
|
}
|
|
private VCIJPanel createCheckBoxPanel(){
|
VCIJPanel pal = new VCIJPanel(new FlowLayout(FlowLayout.LEADING));
|
pal.add(new VCIJLabel("导出类型:"));
|
DefaultComboBoxModel cbxModel = new DefaultComboBoxModel();
|
Iterator<String> keys = this.exportSupportTypes.keySet().iterator();
|
while(keys.hasNext()){
|
String key = keys.next();
|
cbxModel.addElement(key);
|
}
|
this.cbxExportTypes.setModel(cbxModel);
|
this.cbxExportTypes.setRenderer(new DefaultListCellRenderer(){
|
/**
|
*
|
*/
|
private static final long serialVersionUID = -994757979130204768L;
|
|
public Component getListCellRendererComponent(JList list, Object value,int index, boolean isSelected, boolean cellHasFocus){
|
Component compt = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
|
this.setIcon(exportSupportTypes.get(value));
|
return compt;
|
}
|
});
|
pal.add(this.cbxExportTypes);
|
|
|
ButtonGroup rbtnGroup = new ButtonGroup();
|
rbtnGroup.add(rbtnChecked);
|
rbtnGroup.add(rbtnAll);
|
rbtnGroup.add(rbtnPageNum);
|
|
|
pal.add(rbtnChecked);
|
pal.add(rbtnAll);
|
pal.add(rbtnPageNum);
|
pal.add(txtPageNum);
|
pal.add(lblPateNum);
|
txtPageNum.setText(String.valueOf(tablePanel.getPageIndex()));
|
ActionListener rbtnActionListener = new ActionListener() {
|
public void actionPerformed(ActionEvent e) {
|
txtPageNum.setEditable(!rbtnAll.isSelected());
|
}
|
};
|
rbtnAll.addActionListener(rbtnActionListener);
|
rbtnPageNum.addActionListener(rbtnActionListener);
|
rbtnActionListener.actionPerformed(null);
|
return pal;
|
}
|
|
private VCIJList listLeft = new VCIJList();
|
private VCIJList createLeftList(){
|
VCIJList list = new VCIJList();
|
list.setFont(VCISwingUtil.FONT_SONTTI_PLAN_14);
|
DefaultListModel model = new DefaultListModel();
|
for(int i = 1; i < this.tablePanel.getTable().getColumnCount(); i++){
|
String column = this.tablePanel.getTable().getColumnName(i);
|
if(column.equals("序号")) continue;
|
model.addElement(column);
|
}
|
list.setModel(model);
|
list.setCellRenderer(listRender);
|
listLeft = list;
|
listLeft.addMouseListener(new MouseAdapter() {
|
public void mouseClicked(MouseEvent e) {
|
if(e.getClickCount() == 2){
|
actionListener.move_left_part_to_right();
|
listLeft.updateUI();
|
}
|
}
|
});
|
return list;
|
}
|
|
private VCIJList listRight= new VCIJList();
|
private VCIJList createRightList(){
|
VCIJList list = new VCIJList();
|
DefaultListModel model = new DefaultListModel();
|
list.setFont(VCISwingUtil.FONT_SONTTI_PLAN_14);
|
list.setCellRenderer(listRender);
|
list.setModel(model);
|
listRight = list;
|
listRight.addMouseListener(new MouseAdapter() {
|
public void mouseClicked(MouseEvent e) {
|
if(e.getClickCount() == 2){
|
actionListener.move_right_part_to_left();
|
listRight.updateUI();
|
}
|
}
|
});
|
return list;
|
}
|
|
|
private VCIJPanel createBottomButtonPanel(){
|
VCIJPanel pal = new VCIJPanel();
|
VCIJButton btnOk = createVCIJButton("ok", "确定", "确定", "accept.png");
|
VCIJButton btnCancel = createVCIJButton("cancel", "取消", "取消", "cancel.png");
|
pal.add(btnOk);
|
pal.add(btnCancel);
|
return pal;
|
}
|
|
|
private VCIJButton createVCIJButton(String actionCommand, String text, String toolTip, String icon){
|
VCIJButton btn = VCISwingUtil.createVCIJButton(actionCommand, text, toolTip, icon, actionListener);
|
btn.setIcon(VCISwingUtil.createImageIcon(icon));
|
return btn;
|
}
|
|
DefaultListCellRenderer listRender = new DefaultListCellRenderer(){
|
/**
|
*
|
*/
|
private static final long serialVersionUID = 4705852866494910106L;
|
|
public Component getListCellRendererComponent(JList list,
|
Object value, int index, boolean isSelected,
|
boolean cellHasFocus) {
|
Component compt = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
|
setIcon(VCISwingUtil.createImageIcon("attribute.png"));
|
return compt;
|
}
|
};
|
|
public VCIJRadioButton getRbtnChecked() {
|
return rbtnChecked;
|
}
|
|
public VCIJRadioButton getRbtnPageNum() {
|
return rbtnPageNum;
|
}
|
|
public SpecialFormatPageRangeTextField getTxtPageNum() {
|
return txtPageNum;
|
}
|
|
public VCIJList getListLeft() {
|
return listLeft;
|
}
|
|
public void setListLeft(VCIJList listLeft) {
|
this.listLeft = listLeft;
|
}
|
|
public VCIJList getListRight() {
|
return listRight;
|
}
|
|
public void setListRight(VCIJList listRight) {
|
this.listRight = listRight;
|
}
|
|
public boolean isValidPageForamt(){
|
boolean res = false;
|
if(rbtnChecked.isSelected() || rbtnAll.isSelected()) {
|
res = true;
|
return res;
|
}
|
String pageNum = txtPageNum.getText();
|
if(pageNum.equals("")){
|
VCIJOptionPane.showError(this, "页码不能为空");
|
} else{
|
int pageCount = tablePanel.getPageCount();
|
String[] pages = txtPageNum.getText().split("-");
|
|
// 用dobule接收输入的数据,防止输入超大值(大于Integer.MAX_VALUE)
|
// 转换成Integer,进行比较,及在提示内容中去掉double类型数据可能会出现的小数点
|
if(pages.length == 1){
|
double pageD = Double.parseDouble(pages[0]);
|
if(pageD > Integer.MAX_VALUE){
|
VCIJOptionPane.showError(this, "起始页码 " + String.valueOf(pageD) + " 不得大于 " + Integer.MAX_VALUE);
|
} else{
|
int page = (int)pageD;
|
if(page > pageCount){
|
VCIJOptionPane.showError(this, "输入的页码 " + page + " 不得大于总页数 " + pageCount);
|
} else if(page > Integer.MAX_VALUE){
|
VCIJOptionPane.showError(this, "输入的页码 " + page + " 不得大于 " + Integer.MAX_VALUE);
|
} else {
|
res = true;
|
}
|
}
|
} else{
|
double pageStartD = Double.parseDouble(pages[0]);
|
double pageEndD = Double.parseDouble(pages[1]);
|
if(pageStartD > Integer.MAX_VALUE){
|
VCIJOptionPane.showError(this, "起始页码 " + pageStartD + " 不得大于 " + Integer.MAX_VALUE);
|
} else if(pageEndD > Integer.MAX_VALUE){
|
VCIJOptionPane.showError(this, "结束页码 " + pageEndD + " 不得大于 " + Integer.MAX_VALUE);
|
} else{
|
int pageStart = (int)pageStartD;
|
int pageEnd = (int)pageEndD;
|
if(pageStart > pageCount){
|
VCIJOptionPane.showError(this, "起始页码 " + pageStart + " 不得大于总页数 " + pageCount);
|
} else if(pageEnd > pageCount){
|
VCIJOptionPane.showError(this, "结束页码 " + pageEnd + " 不得大于总页数 " + pageCount);
|
} else if(pageStart > pageEnd){
|
VCIJOptionPane.showError(this, "起始页码 " + pageStart + " 不得大于结束页码 " + pageEnd);
|
} else{
|
res = true;
|
}
|
}
|
}
|
}
|
if(!res){
|
pageNumRequestFocus();
|
}
|
return res;
|
}
|
|
/**
|
* 返回需要导出数据的PageIndex列表
|
* <p>Description: </p>
|
*
|
* @author xchao
|
* @time 2012-6-15
|
* @return
|
*/
|
public Integer[] getPageIndexs(){
|
Integer[] res = {};
|
LinkedList<Integer> list = new LinkedList<Integer>();
|
int start = 1;
|
int end = tablePanel.getPageCount();
|
if(rbtnPageNum.isSelected()){
|
String[] pages = txtPageNum.getText().split("-");
|
if(pages.length == 1){
|
start = end = Integer.parseInt(pages[0]);
|
}else{
|
start = Integer.parseInt(pages[0]);
|
end = Integer.parseInt(pages[1]);
|
}
|
}
|
for(int i = start; i <= end; i++){
|
list.add(i);
|
}
|
res = list.toArray(new Integer[]{});
|
return res;
|
}
|
/**
|
* 返回要导出数据的属性名称列表
|
* <p>Description: </p>
|
*
|
* @author xchao
|
* @time 2012-6-15
|
* @return
|
*/
|
public LinkedList<String> getExportFields(){
|
LinkedList<String> list = new LinkedList<String>();
|
DefaultListModel model = (DefaultListModel)getListRight().getModel();
|
int size = model.getSize();
|
for(int i = 0; i < size; i++){
|
list.add(model.getElementAt(i).toString());
|
}
|
return list;
|
}
|
|
private void pageNumRequestFocus(){
|
txtPageNum.requestFocus();
|
txtPageNum.selectAll();
|
}
|
|
class SpecialFormatPageRangeTextField extends VCIJTextField{
|
/**
|
*
|
*/
|
private static final long serialVersionUID = -870828004389831472L;
|
|
public SpecialFormatPageRangeTextField(String value, int columns){
|
super(value, columns);
|
addKeyListener(new KeyAdapter() {
|
public void keyReleased(KeyEvent e) {
|
this_keyReleased(e);
|
}
|
});
|
}
|
private void this_keyReleased(KeyEvent e){
|
String text = getText();
|
if(text.equals("")) return;
|
if(text.startsWith("0")){
|
if(text.length() != 1){
|
text = text.substring(2);
|
} else {
|
text = "";
|
}
|
}
|
// 数值不能以-.或.开头
|
else if(text.startsWith("-")){
|
if(text.length() != 1){
|
text = "1-" + text.substring(2);
|
} else {
|
text = "1-";
|
}
|
} else if(text.startsWith(".")){
|
text = text.substring(1);
|
} else if(text.indexOf("-") != text.lastIndexOf("-")){
|
text = text.substring(0, text.length() - 1);
|
}
|
setText(text);
|
}
|
|
@Override
|
protected Document createDefaultModel(){
|
return new NumberPlainDocument();
|
}
|
}
|
|
|
class NumberPlainDocument extends PlainDocument{
|
/**
|
*
|
*/
|
private static final long serialVersionUID = 7590021361237646854L;
|
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
|
if (str == null) {
|
return;
|
}
|
char[] chars = str.toCharArray();
|
LinkedList<Character> charsList = new LinkedList<Character>();
|
for(char c : chars){
|
// 匹配数字
|
if(pNum.matcher(String.valueOf(c)).matches()){
|
charsList.add(c);
|
}
|
// 匹配减号
|
else if(pMinus.matcher(String.valueOf(c)).matches()){
|
charsList.add(c);
|
}
|
}
|
char[] charsNew = new char[charsList.size()];
|
for(int i = 0; i < charsNew.length; i++){
|
charsNew[i] = charsList.get(i);
|
}
|
super.insertString(offs, new String(charsNew), a);
|
}
|
|
Pattern pNum = Pattern.compile("\\d+");
|
Pattern pMinus = Pattern.compile("-?");
|
}
|
|
|
public VCIJTablePanel<T> getTablePanel() {
|
return tablePanel;
|
}
|
|
public void setTablePanel(VCIJTablePanel<T> tablePanel) {
|
this.tablePanel = tablePanel;
|
}
|
|
}
|