forked from fanruan/design
Browse Source
* commit '23e90d2b5f96007379d3e22305e100e3b82ce573': REPORT-69422 产品调整部分UI 【问题原因】有些小细节还需要调整下 【改动思路】调整 【review建议】无 Update designer-base/src/main/java/com/fr/design/record/analyzer/advice/MonitorAdvice.java 无jira任务,屏蔽部分功能入口 REPORT-69324 插件-新插件管理-设计器内插件管理版本号显示异常 REPORT-69422 && REPORT-69426 产品调整部分UI && 复制单元格会影响数据集的展开/收起状态 【问题原因】1.产品验收功能的时候改了一些UI;2.因为粘贴单元格的时候会获取当前数据集面板,getInstance方法里会refresh一次整个数据集树,然后将所有节点重置到收起状态 【改动思路】1.调整UI;2.提供一个获取数据集树面板单例不刷新自己的方法,粘贴时使用 【review建议】无 BI-103979 【6.0回归】fr连接bi闪退 REPORT-69213 函数在公式编辑器内不标蓝显示 REPORT-69213 函数在公式编辑器内不标蓝显示 REPORT-68212 表头排序功能-国际化-交互问题 && REPORT-68931 表头排序图标配置颜色后大小发生变化feature/x
superman
3 years ago
28 changed files with 3171 additions and 2827 deletions
@ -0,0 +1,170 @@ |
|||||||
|
package com.fr.design.gui.ilist; |
||||||
|
|
||||||
|
import com.fr.design.event.StateChangeListener; |
||||||
|
import com.fr.design.gui.icheckbox.UICheckBox; |
||||||
|
import com.fr.design.gui.itree.checkboxtree.TristateCheckBox; |
||||||
|
import com.fr.design.i18n.Toolkit; |
||||||
|
import com.fr.design.layout.FRGUIPaneFactory; |
||||||
|
|
||||||
|
import javax.swing.AbstractListModel; |
||||||
|
import javax.swing.DefaultListCellRenderer; |
||||||
|
import javax.swing.JList; |
||||||
|
import javax.swing.JPanel; |
||||||
|
import javax.swing.ListCellRenderer; |
||||||
|
import java.awt.BorderLayout; |
||||||
|
import java.awt.Component; |
||||||
|
import java.awt.event.MouseAdapter; |
||||||
|
import java.awt.event.MouseEvent; |
||||||
|
import java.awt.event.MouseListener; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* 支持全选、全不选、半选的CheckBoxList面板 |
||||||
|
* @author Yvan |
||||||
|
*/ |
||||||
|
public class CheckBoxListWithPartialSelect extends JPanel { |
||||||
|
|
||||||
|
private UICheckBox[] dataCheckBoxes; |
||||||
|
|
||||||
|
private TristateCheckBox chooseAllCheckBox; |
||||||
|
|
||||||
|
private UIList dataList; |
||||||
|
|
||||||
|
public CheckBoxListWithPartialSelect (Object[] data) { |
||||||
|
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||||
|
init(data); |
||||||
|
this.add(chooseAllCheckBox, BorderLayout.NORTH); |
||||||
|
this.add(dataList, BorderLayout.CENTER); |
||||||
|
} |
||||||
|
|
||||||
|
private void init(Object[] data) { |
||||||
|
// 复选框组
|
||||||
|
dataCheckBoxes = new UICheckBox[data.length]; |
||||||
|
for (int i = 0; i < dataCheckBoxes.length; i++) { |
||||||
|
dataCheckBoxes[i] = new UICheckBox(transferDataValue2Show(data[i])); |
||||||
|
dataCheckBoxes[i].setSelected(true); |
||||||
|
} |
||||||
|
|
||||||
|
// UIList
|
||||||
|
dataList = new UIList(dataCheckBoxes); |
||||||
|
dataList.setModel(getListModel()); |
||||||
|
dataList.setCellRenderer(getListCellRenderer()); |
||||||
|
|
||||||
|
// 全选框
|
||||||
|
chooseAllCheckBox = new TristateCheckBox(Toolkit.i18nText("Fine-Design_Basic_Remove_All_Selected")) { |
||||||
|
@Override |
||||||
|
protected State getNextState(State current) { |
||||||
|
if (current == TristateCheckBox.SELECTED || current == TristateCheckBox.DO_NOT_CARE) { |
||||||
|
return TristateCheckBox.NOT_SELECTED; |
||||||
|
} |
||||||
|
return TristateCheckBox.SELECTED; |
||||||
|
} |
||||||
|
}; |
||||||
|
chooseAllCheckBox.setState(TristateCheckBox.SELECTED); |
||||||
|
chooseAllCheckBox.setFocusable(false); |
||||||
|
chooseAllCheckBox.addStateChangeListener(getChooseAllCheckBoxStateChangeListener()); |
||||||
|
dataList.addMouseListener(getDataListMouseListener()); |
||||||
|
} |
||||||
|
|
||||||
|
public List<Object> getSelectedObjects() { |
||||||
|
return dataList.getSelectedValuesList(); |
||||||
|
} |
||||||
|
|
||||||
|
protected MouseListener getDataListMouseListener() { |
||||||
|
return new MouseAdapter() { |
||||||
|
@Override |
||||||
|
public void mousePressed(MouseEvent e) { |
||||||
|
super.mousePressed(e); |
||||||
|
int index = dataList.getSelectedIndex(); |
||||||
|
if (index < 0) { |
||||||
|
return; |
||||||
|
} |
||||||
|
UICheckBox checkBox = (UICheckBox) dataList.getModel().getElementAt(index); |
||||||
|
checkBox.setSelected(!checkBox.isSelected()); |
||||||
|
//根据CheckBoxes中的选择情况来更新全选框的状态
|
||||||
|
int selectedCount = calculateSelectedNum(); |
||||||
|
if (selectedCount == 0) { |
||||||
|
chooseAllCheckBox.setState(TristateCheckBox.NOT_SELECTED); |
||||||
|
} else if (selectedCount == dataCheckBoxes.length) { |
||||||
|
chooseAllCheckBox.setState(TristateCheckBox.SELECTED); |
||||||
|
} else { |
||||||
|
chooseAllCheckBox.setState(TristateCheckBox.DO_NOT_CARE); |
||||||
|
} |
||||||
|
dataList.repaint(); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取全选框状态改变监听 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
protected StateChangeListener getChooseAllCheckBoxStateChangeListener() { |
||||||
|
return () -> { |
||||||
|
if (chooseAllCheckBox.getState() == TristateCheckBox.DO_NOT_CARE) { |
||||||
|
return; |
||||||
|
} |
||||||
|
boolean isSelected = chooseAllCheckBox.isSelected(); |
||||||
|
for (int i = 0; i < dataList.getModel().getSize(); i++) { |
||||||
|
UICheckBox checkBox = (UICheckBox) dataList.getModel().getElementAt(i); |
||||||
|
checkBox.setSelected(isSelected); |
||||||
|
} |
||||||
|
dataList.repaint(); |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 计算CheckBox的选中情况,用来更新全选框的状态 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
protected int calculateSelectedNum() { |
||||||
|
int count = 0; |
||||||
|
for (UICheckBox dataCheckBox : dataCheckBoxes) { |
||||||
|
if (dataCheckBox.isSelected()) { |
||||||
|
count++; |
||||||
|
} |
||||||
|
} |
||||||
|
return count; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将传入的Object转化为字符串展示,默认调用toString方法 |
||||||
|
* @param object |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
protected String transferDataValue2Show(Object object) { |
||||||
|
return object.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
protected AbstractListModel getListModel() { |
||||||
|
return new SelectedListDataModel(); |
||||||
|
} |
||||||
|
|
||||||
|
protected ListCellRenderer getListCellRenderer() { |
||||||
|
return new SelectedListCellRender(); |
||||||
|
} |
||||||
|
|
||||||
|
private class SelectedListCellRender extends DefaultListCellRenderer { |
||||||
|
|
||||||
|
@Override |
||||||
|
public Component getListCellRendererComponent(JList list, Object value, int index, final boolean isSelected, boolean cellHasFocus) { |
||||||
|
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); |
||||||
|
dataCheckBoxes[index] = (UICheckBox) value; |
||||||
|
dataCheckBoxes[index].setBackground(list.getBackground()); |
||||||
|
return dataCheckBoxes[index]; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
private class SelectedListDataModel extends AbstractListModel { |
||||||
|
@Override |
||||||
|
public int getSize() { |
||||||
|
return dataCheckBoxes.length; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Object getElementAt(int index) { |
||||||
|
return (index > getSize() - 1 || index < 0) ? null : dataCheckBoxes[index]; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 1014 B |
Loading…
Reference in new issue