forked from fanruan/design
Browse Source
* commit '20f439b7f27dbdc0924a723d2d071dacc2551c5b': (38 commits) REPORT-10202 没用的监听,删了 CORE-116 继续改国际化规范 无JIRA任务,表单添加参数面板后,水印错位 REPORT-9652 优化一下,减少RPC和数据库访问次数 【10.0二轮回归】部署集成-集群-大数据量模板加载时文件夹显示异常 REPORT-10160 10.0冒烟 Mac设计器启动, 字体糊了 REPORT-10181【10.0插件】设计器插件管理这里插件的详细信息jar包显示不全 无JIRA任务 打包 CHART-2699 类型选择弹出框的图表 用图片 CHART-2699 类型选择弹出框的图表 用图片 REPORT-10159 REPORT-10159 REPORT-10185【10.0二轮回归】 远程设计特卡 rt REPORT-9819 【10.0二轮回归】alphafine搜索模板打开后,再次搜索会增加多个重复模板的搜索结果 REPORT-9511【设计器】表单从自适应布局切换到绝对布局,绝对画布块的宽度不能修改 REPORT-10049【10.0二轮回归】设计器右上角登录后,重启仍然显示未登录,打开一下设计器插件管理才出来 rt rt REPORT-9819 【10.0二轮回归】alphafine搜索模板打开后,再次搜索会增加多个重复模板的搜索结果 代码质量 ...master
44 changed files with 495 additions and 1406 deletions
@ -1,33 +1,20 @@
|
||||
package com.fr.design; |
||||
|
||||
import com.fr.locale.InterProviderFactory; |
||||
import junit.framework.TestCase; |
||||
|
||||
import java.util.HashSet; |
||||
import java.util.Locale; |
||||
|
||||
public class DesignerEnvManagerTest extends TestCase{ |
||||
|
||||
public void testGetLocale() { |
||||
DesignerEnvManager envManager = new DesignerEnvManager(); |
||||
assertEquals("默认值", envManager.getLocale(), Locale.CHINA); |
||||
assertEquals("默认值", envManager.getLanguage(), Locale.SIMPLIFIED_CHINESE); |
||||
|
||||
HashSet<Locale> result = new HashSet<>(); |
||||
Locale[] locales = envManager.supportLocale(); |
||||
int len = locales.length; |
||||
assertEquals(len, InterProviderFactory.getProvider().getSupportLocaleMap().size()); |
||||
for (int i = 0; i < len; i++) { |
||||
envManager.setLanguage(i + 1); |
||||
Locale locale = envManager.getLocale(); |
||||
result.add(locale); |
||||
} |
||||
assertEquals("每个int都有对应的locale", result.size(), len); |
||||
|
||||
envManager.setLanguage(998); |
||||
assertEquals("上边界", envManager.getLocale(), Locale.CHINA); |
||||
envManager.setLanguage(Locale.US); |
||||
assertEquals("上边界", envManager.getLanguage(), Locale.US); |
||||
|
||||
envManager.setLanguage(-998); |
||||
assertEquals("下边界", envManager.getLocale(), Locale.CHINA); |
||||
envManager.setLanguage(Locale.SIMPLIFIED_CHINESE); |
||||
assertEquals("下边界", envManager.getLanguage(), Locale.SIMPLIFIED_CHINESE); |
||||
|
||||
} |
||||
} |
||||
|
@ -1,418 +0,0 @@
|
||||
package com.fr.design.mainframe; |
||||
|
||||
|
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.designer.creator.XLayoutContainer; |
||||
import com.fr.design.designer.creator.XWParameterLayout; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.itable.HeaderRenderer; |
||||
import com.fr.design.gui.itextfield.UITextField; |
||||
import com.fr.form.ui.Label; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.form.ui.container.WParameterLayout; |
||||
import com.fr.general.ComparatorUtils; |
||||
|
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.*; |
||||
import javax.swing.event.DocumentEvent; |
||||
import javax.swing.event.DocumentListener; |
||||
import javax.swing.table.*; |
||||
import java.awt.*; |
||||
import java.awt.event.FocusAdapter; |
||||
import java.awt.event.FocusEvent; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.awt.geom.RoundRectangle2D; |
||||
import java.util.EventObject; |
||||
|
||||
/** |
||||
* MobileParaWidgetTable主要显示参数面板容器的控件列表,与MobileWidgetTable的区别就是该表多了UITextField这一列 |
||||
* Created with IntelliJ IDEA. |
||||
* User: zx |
||||
* Date: 14-7-9 |
||||
* Time: 上午11:26 |
||||
* Modified by fanglei during 2017/1/22 - 2017/2/ |
||||
*/ |
||||
class MobileParaWidgetTable extends JTable { |
||||
|
||||
private FormDesigner designer; |
||||
private String[][] cellData; |
||||
private String[] headers = {com.fr.design.i18n.Toolkit.i18nText("FR-Designer_Label"), com.fr.design.i18n.Toolkit.i18nText("FR-Designer_Widgetname")}; |
||||
private static final int WIDGET_TABLE_ROW_HEIGHT = 22; |
||||
private static final int UITEXTFIELD_WIDTH = 0; |
||||
private static final int GAP = 11; |
||||
private UILabel moveComponent = new UILabel(); // 作为拖动时候随鼠标移动的那个半透明控件
|
||||
private int selectedRow = -1; |
||||
private int selectedColumn = -1; |
||||
private boolean draging = false; |
||||
|
||||
private void init(FormDesigner designer) { |
||||
this.designer = designer; |
||||
this.cellData = getData(); |
||||
this.setTableProperties(); |
||||
this.setDefaultEditor(Object.class, new MobileCellEditor()); |
||||
this.setModel(new BeanTableModel()); |
||||
this.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); |
||||
TableColumn tc = this.getColumn(this.getColumnName(0)); |
||||
tc.setMinWidth(UITEXTFIELD_WIDTH); |
||||
tc.setMaxWidth(UITEXTFIELD_WIDTH); |
||||
tc.setPreferredWidth(UITEXTFIELD_WIDTH); |
||||
this.repaint(); |
||||
this.setDefaultRenderer(Object.class, new MobileWidgetTableCellRenderer()); |
||||
refreshData(); |
||||
this.addMouseListener(mouseAdapter); |
||||
this.addMouseMotionListener(mouseAdapter); |
||||
} |
||||
|
||||
MobileParaWidgetTable(FormDesigner designer) { |
||||
init(designer); |
||||
add(moveComponent); |
||||
} |
||||
|
||||
private void setTableProperties() { |
||||
JTableHeader header = getTableHeader(); |
||||
header.setReorderingAllowed(false); |
||||
header.setPreferredSize(new Dimension(0, WIDGET_TABLE_ROW_HEIGHT)); |
||||
header.setDefaultRenderer(new HeaderRenderer()); |
||||
|
||||
this.setRowHeight(WIDGET_TABLE_ROW_HEIGHT); |
||||
this.setGridColor(new Color(212, 208, 200)); |
||||
this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); |
||||
this.setColumnSelectionAllowed(false); |
||||
this.setRowSelectionAllowed(false); |
||||
this.setFillsViewportHeight(true); |
||||
} |
||||
|
||||
private MouseAdapter mouseAdapter = new MouseAdapter() { |
||||
/** |
||||
* 鼠标按下时处理的事件(设置当前选中的行列) |
||||
* @param e |
||||
*/ |
||||
@Override |
||||
public void mousePressed(MouseEvent e) { |
||||
getInstance().setCellSelected(); |
||||
} |
||||
|
||||
/** |
||||
* 鼠标放开时处理的事件(如果是正在拖动则执行换位操作,重新绘制属性表,如果不是则什么也不做) |
||||
* @param e |
||||
*/ |
||||
@Override |
||||
public void mouseReleased(MouseEvent e) { |
||||
if (!draging) { |
||||
return; |
||||
} |
||||
draging = false; |
||||
moveComponent.setVisible(false); |
||||
int toIndex = e.getY() < GAP ? 0 : (int) Math.rint((e.getY() - GAP) / WIDGET_TABLE_ROW_HEIGHT) + 1; |
||||
//当鼠标放开时,将选中的容器调整至新的顺序
|
||||
((WParameterLayout) designer.getParaComponent().toData()).adjustOrder(selectedRow, toIndex); |
||||
//拿取排序后表格数据,然后重绘表格
|
||||
getInstance().refreshData(); |
||||
getInstance().repaint(); |
||||
designer.fireTargetModified(); |
||||
getInstance().setCellSelected(); |
||||
} |
||||
|
||||
/** |
||||
* 设置鼠标在属性表区域移动时候的事件 |
||||
* @param e |
||||
*/ |
||||
@Override |
||||
public void mouseMoved(MouseEvent e) { |
||||
int overColumn = e.getX() < getColumnModel().getColumn(0).getWidth() ? 0 : 1; // 判断当前鼠标在哪一列
|
||||
int overRow = -1; |
||||
for (int i = 0; i < getRowCount(); i++) { |
||||
if (e.getY() > i * WIDGET_TABLE_ROW_HEIGHT && e.getY() <= (i + 1) * WIDGET_TABLE_ROW_HEIGHT) { |
||||
overRow = i; //判断当前鼠标在哪一行
|
||||
} |
||||
} |
||||
//如果鼠标移动到当前选中的行列上面的时候,并且不能在第一列
|
||||
if (overRow == selectedRow && overColumn == selectedColumn && overColumn != 0) { |
||||
//把当前选中的那一列行的光标改成(除了第一列)移动样式MOVE_CURSOR
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); |
||||
} else { |
||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 鼠标拖动事件(如果鼠标当前是<code>MOVE_CURSOR</code>状态则执行开始拖动的代码, |
||||
* 绘制一个<code>moveComponent</code>来跟随鼠标移动) |
||||
* @param e |
||||
*/ |
||||
@Override |
||||
public void mouseDragged(MouseEvent e) { |
||||
int width = getColumnModel().getColumn(1).getWidth(); |
||||
//如果点击选中的是第二列,就可以拖动
|
||||
if (selectedColumn == 1) { |
||||
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); |
||||
draging = true; |
||||
moveComponent.setText(getValueAt(selectedRow, selectedColumn).toString()); |
||||
moveComponent.setLocation(getColumnModel().getColumn(0).getWidth(), e.getY() - GAP); |
||||
moveComponent.setSize(new Dimension(width, WIDGET_TABLE_ROW_HEIGHT)); |
||||
moveComponent.setVisible(true); |
||||
moveComponent.setForeground(Color.lightGray); |
||||
moveComponent.setBorder(BorderFactory.createLineBorder(Color.lightGray)); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 设置鼠标单击时处理的事件(单击第二列的控件列表进入控件属性表) |
||||
* @param e |
||||
*/ |
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
if (getSelectedRow() != -1 && getSelectedColumn() == 1) { |
||||
String widgetName = cellData[getSelectedRow()][getSelectedColumn()]; |
||||
if (StringUtils.isNotEmpty(widgetName)) { |
||||
int count = getEditingDesigner().getParaComponent().getComponentCount(); |
||||
for (int i = 0; i < count; i++) { |
||||
XCreator xCreator = (XCreator) getEditingDesigner().getParaComponent().getComponent(i); |
||||
Widget widget = xCreator.toData(); |
||||
if (!widget.acceptType(Label.class) && ComparatorUtils.equals(widgetName, widget.getWidgetName())) { |
||||
//设置选中的component,这句代码控制点击之后跳转到相应component属性表
|
||||
getEditingDesigner().getSelectionModel().setSelectedCreator(xCreator); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 鼠标离开属性表区域事件 |
||||
* @param e |
||||
*/ |
||||
@Override |
||||
public void mouseExited(MouseEvent e) { |
||||
draging = false; |
||||
moveComponent.setVisible(false); |
||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); |
||||
} |
||||
}; |
||||
|
||||
public MobileParaWidgetTable getInstance() { |
||||
return this; |
||||
} |
||||
|
||||
private FormDesigner getEditingDesigner() { |
||||
return designer; |
||||
} |
||||
|
||||
/** |
||||
* 设置当前get到的行列的单元格为选中状态 |
||||
*/ |
||||
private void setCellSelected() { |
||||
selectedRow = getSelectedRow(); |
||||
selectedColumn = getSelectedColumn(); |
||||
if (selectedRow != -1) { |
||||
this.setRowSelectionInterval(selectedRow, selectedRow); |
||||
} |
||||
if (selectedColumn != -1) { |
||||
this.setColumnSelectionInterval(selectedColumn, selectedColumn); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 重新get排序后的数据 |
||||
*/ |
||||
public void refreshData() { |
||||
cellData = getData(); |
||||
} |
||||
|
||||
/** |
||||
* 获取参数面板的控件列表 |
||||
* |
||||
* @return String[][] 二维数组,[0][0]widgetTag, [0][1]widgetName |
||||
*/ |
||||
private String[][] getData() { |
||||
XLayoutContainer paraContainer = designer.getParaComponent(); |
||||
if (paraContainer == null || !paraContainer.acceptType(XWParameterLayout.class)) { |
||||
return new String[0][0]; |
||||
} |
||||
|
||||
WParameterLayout para = (WParameterLayout) (paraContainer.toData()); |
||||
return para.getWidgetNameTag(); |
||||
} |
||||
|
||||
/** |
||||
* 自定义的tableRender类 |
||||
*/ |
||||
private class MobileWidgetTableCellRenderer extends DefaultTableCellRenderer { |
||||
@Override |
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, |
||||
boolean hasFocus, int row, int column) { |
||||
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); |
||||
if (column == 0) { |
||||
UITextField uiTableTextField; |
||||
if (getSelectedColumn() == column && getSelectedRow() == row) { |
||||
uiTableTextField = new UITableTextField(value.toString()); |
||||
} else { |
||||
uiTableTextField = new UITextField(value.toString()); |
||||
} |
||||
return uiTableTextField; |
||||
} |
||||
return this; |
||||
} |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 自定义的tableEditor类 |
||||
*/ |
||||
private class MobileCellEditor extends AbstractCellEditor implements TableCellEditor { |
||||
UITableTextField uiTableTextField; |
||||
|
||||
MobileCellEditor() { |
||||
uiTableTextField = new UITableTextField(); |
||||
uiTableTextField.addFocusListener(new FocusAdapter() { |
||||
@Override |
||||
public void focusLost(FocusEvent evt) { |
||||
stopCellEditing(); |
||||
designer.fireTargetModified(); |
||||
} |
||||
}); |
||||
uiTableTextField.getDocument().addDocumentListener(new DocumentListener() { |
||||
@Override |
||||
public void insertUpdate(DocumentEvent e) { |
||||
firePropertyChange(); |
||||
} |
||||
|
||||
@Override |
||||
public void removeUpdate(DocumentEvent e) { |
||||
firePropertyChange(); |
||||
} |
||||
|
||||
@Override |
||||
public void changedUpdate(DocumentEvent e) { |
||||
firePropertyChange(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
/** |
||||
* cell改变,相应的nametag改变 |
||||
*/ |
||||
|
||||
private void firePropertyChange() { |
||||
((WParameterLayout) designer.getParaComponent().toData()).add2NameTagMap(uiTableTextField.getText(), |
||||
cellData[getSelectedRow()][1]); |
||||
((WParameterLayout) designer.getParaComponent().toData()).setNameTagModified(cellData[getSelectedRow()][1], |
||||
true); |
||||
} |
||||
|
||||
@Override |
||||
public Object getCellEditorValue() { |
||||
return uiTableTextField.getText(); |
||||
} |
||||
|
||||
/** |
||||
* 双击以编辑, 表示只有双击的情况下才可以编辑 |
||||
*/ |
||||
@Override |
||||
public boolean isCellEditable(EventObject anEvent) { |
||||
return !(anEvent instanceof MouseEvent) || ((MouseEvent) anEvent).getClickCount() >= 2; |
||||
} |
||||
|
||||
@Override |
||||
public Component getTableCellEditorComponent(JTable table, Object value, |
||||
boolean isSelected, int row, int column) { |
||||
uiTableTextField.setText(value.toString()); |
||||
return uiTableTextField; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* BeanTableModel类继承DefaultTableModel类,指定了表格的表头和内容 |
||||
*/ |
||||
private class BeanTableModel extends DefaultTableModel { |
||||
BeanTableModel() { |
||||
super(cellData, headers); |
||||
} |
||||
|
||||
@Override |
||||
public int getRowCount() { |
||||
return cellData.length; |
||||
} |
||||
|
||||
@Override |
||||
public int getColumnCount() { |
||||
return headers.length; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Object getValueAt(int row, int column) { |
||||
if (row >= getRowCount() || column >= getColumnCount()) { |
||||
return null; |
||||
} |
||||
Object[] rowValue = cellData[row]; |
||||
if (column > -1 && column < rowValue.length) { |
||||
return cellData[row][column]; |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public String getColumnName(int column) { |
||||
if (column == 0) { |
||||
return headers[0]; |
||||
} else { |
||||
return headers[1]; |
||||
} |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void setValueAt(Object aValue, int row, int column) { |
||||
if (row >= getRowCount() || column >= getColumnCount()) { |
||||
return; |
||||
} |
||||
if (aValue == null) { |
||||
cellData[row][column] = null; |
||||
return; |
||||
} |
||||
cellData[row][column] = aValue.toString(); |
||||
} |
||||
|
||||
/** |
||||
* 是否可编辑 控件标签列可以编辑,控件名不可编辑 |
||||
* |
||||
* @param row 行号 |
||||
* @param column 列号 |
||||
* @return 是否可编辑 |
||||
*/ |
||||
public boolean isCellEditable(int row, int column) { |
||||
return column != 1; |
||||
} |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 继承自JTextField类,重写了编辑框的样式 |
||||
*/ |
||||
private class UITableTextField extends UITextField { |
||||
public UITableTextField() { |
||||
super(); |
||||
} |
||||
|
||||
public UITableTextField(String string) { |
||||
super(string); |
||||
} |
||||
|
||||
protected void paintBorder(Graphics g) { |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
||||
if (this.isFocusOwner()) { |
||||
g2d.setStroke(new BasicStroke(1.5f)); |
||||
} else { |
||||
g2d.setStroke(new BasicStroke(1f)); |
||||
} |
||||
RoundRectangle2D.Double rect = new RoundRectangle2D.Double(0, 0, this.getWidth() - 2, this.getHeight() - 2, 4, 4); |
||||
g2d.setColor(Color.orange); |
||||
g2d.draw(rect); |
||||
} |
||||
|
||||
} |
||||
} |
@ -1,353 +0,0 @@
|
||||
package com.fr.design.mainframe; |
||||
|
||||
import java.awt.*; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JLabel; |
||||
import javax.swing.JTable; |
||||
import javax.swing.ListSelectionModel; |
||||
import javax.swing.table.*; |
||||
|
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.itable.GroupRenderer; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.form.ui.container.*; |
||||
import com.fr.general.ComparatorUtils; |
||||
|
||||
import com.fr.stable.StringUtils; |
||||
|
||||
/** |
||||
* MobileWidgetTable类主要显示各种容器的控件列表(body,tab,绝对布局快,不包括参数面板) |
||||
* Created with IntelliJ IDEA. |
||||
* User: zx |
||||
* Date: 14-9-15 |
||||
* Time: 下午4:52 |
||||
* Modified by fanglei at 2017/01/23 |
||||
*/ |
||||
public class MobileWidgetTable extends JTable { |
||||
|
||||
private FormDesigner designer; |
||||
private String[][] cellData; |
||||
private String[] headers = {com.fr.design.i18n.Toolkit.i18nText("Form-Widget_Name")}; |
||||
private static final int WIDGET_TABLE_ROW_HEIGHT = 22; |
||||
private UILabel moveComponent = new UILabel(); // 作为拖动时候随鼠标移动的那个半透明控件
|
||||
private int selectedRow = -1; |
||||
private static final int GAP = 11; |
||||
private boolean draging = false; |
||||
private boolean collapsed = false; // 控件列表是否折叠
|
||||
|
||||
@Override |
||||
public TableCellRenderer getCellRenderer(int row, int column) { |
||||
//第一行渲染成为标题的样子
|
||||
if (row == 0) { |
||||
return new GroupRenderer(); |
||||
} |
||||
return super.getCellRenderer(row, column); |
||||
} |
||||
|
||||
|
||||
public MobileWidgetTable(FormDesigner designer) { |
||||
this.designer = designer; |
||||
cellData = getData(); |
||||
this.setTableProperties(); |
||||
TableModel defaultModel = new BeanTableModel(); |
||||
this.setModel(defaultModel); |
||||
this.repaint(); |
||||
this.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()); |
||||
refreshData(); |
||||
this.addMouseListener(mouseAdapter); |
||||
this.addMouseMotionListener(mouseAdapter); |
||||
add(moveComponent); |
||||
} |
||||
|
||||
private void setTableProperties() { |
||||
JTableHeader header = getTableHeader(); |
||||
header.setReorderingAllowed(false); |
||||
header.setPreferredSize(new Dimension(0, 0)); // 隐藏表头
|
||||
GroupRenderer headerRenderer = new GroupRenderer(); |
||||
headerRenderer.setPreferredSize(new Dimension(0, 0)); //这行代码隐藏表头。因为要实现折叠效果,表头不好监听事件
|
||||
headerRenderer.setHorizontalAlignment(JLabel.LEFT); |
||||
header.setDefaultRenderer(headerRenderer); |
||||
|
||||
this.setRowHeight(WIDGET_TABLE_ROW_HEIGHT); |
||||
this.setGridColor(new Color(212, 208, 200)); |
||||
this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); |
||||
this.setColumnSelectionAllowed(false); |
||||
this.setRowSelectionAllowed(false); |
||||
this.setFillsViewportHeight(false); |
||||
this.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); |
||||
} |
||||
|
||||
private MouseAdapter mouseAdapter = new MouseAdapter() { |
||||
/** |
||||
* 鼠标按下时处理的事件(设置当前选中的行列) |
||||
* @param e |
||||
*/ |
||||
@Override |
||||
public void mousePressed(MouseEvent e) { |
||||
getInstance().setCellSelected(); |
||||
if (selectedRow == 0 && !e.isPopupTrigger() && e.getClickCount() == 1 && e.getX() < WIDGET_TABLE_ROW_HEIGHT / 2) { // 如果是点击在第一行
|
||||
toggleCollapse(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 鼠标放开时处理的事件(如果是正在拖动则执行换位操作,重新绘制属性表,如果不是则什么也不做) |
||||
* 所谓的换行就是简单的重新拿到一次表格数据然后重新绘制表格 |
||||
* @param e |
||||
*/ |
||||
@Override |
||||
public void mouseReleased(MouseEvent e) { |
||||
if (!draging) { |
||||
return; |
||||
} |
||||
draging = false; |
||||
moveComponent.setVisible(false); |
||||
int toIndex = e.getY() < GAP ? 0 : (int) Math.rint((e.getY() - GAP) / WIDGET_TABLE_ROW_HEIGHT) + 1; |
||||
//当鼠标放开时,将选中的容器调整至新的顺序
|
||||
((WSortLayout) designer.getSelectionModel().getSelection().getSelectedCreator().toData()).adjustOrder(selectedRow - 1, toIndex - 1); |
||||
//拿取排序后表格数据,然后重绘表格
|
||||
getInstance().refreshData(); |
||||
getInstance().repaint(); |
||||
designer.fireTargetModified(); |
||||
getInstance().setCellSelected(); |
||||
} |
||||
|
||||
/** |
||||
* 设置鼠标在属性表区域移动时候的事件 |
||||
* @param e |
||||
*/ |
||||
@Override |
||||
public void mouseMoved(MouseEvent e) { |
||||
int overRow = 0; |
||||
for (int i = 0; i < getRowCount(); i++) { |
||||
if (e.getY() > i * WIDGET_TABLE_ROW_HEIGHT && e.getY() <= (i + 1) * WIDGET_TABLE_ROW_HEIGHT) { |
||||
overRow = i; //判断鼠标在哪一行
|
||||
} |
||||
} |
||||
//如果鼠标移动到当前选中的行上面的时候
|
||||
if (overRow == selectedRow && selectedRow > 0) { |
||||
//把当前选中的那一行的光标改成(除了第一列)移动样式MOVE_CURSOR
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); |
||||
} else { |
||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 鼠标拖动事件(如果鼠标当前是<code>MOVE_CURSOR</code>状态则执行开始拖动的代码, |
||||
* 绘制一个<code>moveComponent</code>来跟随鼠标移动) |
||||
* @param e |
||||
*/ |
||||
@Override |
||||
public void mouseDragged(MouseEvent e) { |
||||
int width = getColumnModel().getColumn(0).getWidth(); |
||||
//如果当前选中的行的范围是合理的话,就可以拖动
|
||||
if (selectedRow < getRowCount() && selectedRow > 0) { |
||||
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); |
||||
draging = true; |
||||
moveComponent.setText(getValueAt(selectedRow, 0).toString()); |
||||
moveComponent.setLocation(0, e.getY() - GAP); |
||||
moveComponent.setSize(new Dimension(width, WIDGET_TABLE_ROW_HEIGHT)); |
||||
moveComponent.setVisible(true); |
||||
moveComponent.setForeground(Color.lightGray); |
||||
moveComponent.setBorder(BorderFactory.createLineBorder(Color.lightGray)); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 设置鼠标单击时处理的事件(单击控件列表进入控件属性表) |
||||
* @param e |
||||
*/ |
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
if (selectedRow > 0) { |
||||
//当前点击的控件的名字
|
||||
String widgetName = cellData[selectedRow][0]; |
||||
if (StringUtils.isNotEmpty(widgetName)) { |
||||
//当前选择的容器
|
||||
XCreator selectedContainer = designer.getSelectionModel().getSelection().getSelectedCreator(); |
||||
WLayout selectedWidget = (WLayout) selectedContainer.toData(); |
||||
//当前选择的容器中的控件数量
|
||||
int count = selectedWidget.getWidgetCount(); |
||||
for (int i = 0; i < count; i++) { |
||||
XCreator xCreator = (XCreator) selectedContainer.getComponent(i); |
||||
Widget widget = xCreator.toData(); |
||||
if (ComparatorUtils.equals(widgetName, widget.getWidgetName())) { |
||||
getEditingDesigner().getSelectionModel().setSelectedCreator(xCreator); |
||||
} |
||||
} |
||||
} |
||||
} else if (selectedRow == 0) { // 如果是点击在第一行
|
||||
if (!e.isPopupTrigger() && e.getClickCount() > 1) { |
||||
toggleCollapse(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 鼠标离开属性表区域事件 |
||||
* @param e |
||||
*/ |
||||
public void mouseExited(MouseEvent e) { |
||||
draging = false; |
||||
moveComponent.setVisible(false); |
||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); |
||||
} |
||||
}; |
||||
|
||||
public MobileWidgetTable getInstance() { |
||||
return this; |
||||
} |
||||
|
||||
public FormDesigner getEditingDesigner() { |
||||
return designer; |
||||
} |
||||
|
||||
/** |
||||
* 设置当前get到的行列的单元格为选中状态 |
||||
*/ |
||||
private void setCellSelected() { |
||||
selectedRow = getSelectedRow(); |
||||
if (selectedRow != -1) { |
||||
this.setRowSelectionInterval(selectedRow, selectedRow); |
||||
this.setColumnSelectionInterval(0, 0); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 切换属性组折叠属性true/false |
||||
*/ |
||||
private void toggleCollapse() { |
||||
this.setCollapsed(!this.isCollapsed()); |
||||
//这里获取表格的父控件是为了当表格被折叠了后,装表格的父控件也要相应的重新布局一下
|
||||
//比如折叠之后表格行数应该比原来的少,占用父容器空间应该小点,不重新布局父容器,表格大小不会改变
|
||||
Container parent = MobileWidgetTable.this.getParent(); |
||||
if (parent != null) { |
||||
parent.revalidate(); |
||||
} |
||||
repaint(); |
||||
} |
||||
|
||||
/** |
||||
* 重新get排序后的数据 |
||||
*/ |
||||
public void refreshData() { |
||||
cellData = getData(); |
||||
} |
||||
|
||||
/** |
||||
* 获取选中控件的控件列表 |
||||
* |
||||
* @return String[][] 二维数组,[0][0]widgetName |
||||
*/ |
||||
private String[][] getData() { |
||||
List<String> mobileWidgetList = new ArrayList<String>(); |
||||
if (designer.isFormParaDesigner()) { |
||||
return new String[0][0]; |
||||
} |
||||
|
||||
WSortLayout body = (WSortLayout) designer.getRootComponent().toData(); |
||||
|
||||
if (body == null) { |
||||
return new String[0][0]; |
||||
} |
||||
|
||||
body.setSorted(false); |
||||
|
||||
if (body.getWidgetCount() > 0 && body.getWidget(0).acceptType(WAbsoluteBodyLayout.class)) { |
||||
WAbsoluteBodyLayout absoluteBodyLayout = (WAbsoluteBodyLayout) ((WAbsoluteLayout.BoundsWidget) body.getWidget(0)).getWidget(); |
||||
mobileWidgetList = absoluteBodyLayout.getOrderedMobileWidgetList(); |
||||
} else { |
||||
mobileWidgetList = body.getOrderedMobileWidgetList(); |
||||
} |
||||
String[][] widgetName = new String[mobileWidgetList.size() + 1][1]; |
||||
widgetName[0][0] = com.fr.design.i18n.Toolkit.i18nText("FR-Designer_WidgetOrder"); |
||||
for (int i = 0; i < mobileWidgetList.size(); i++) { |
||||
widgetName[i + 1][0] = mobileWidgetList.get(i); |
||||
} |
||||
|
||||
body.setSorted(true); |
||||
return widgetName; |
||||
|
||||
} |
||||
|
||||
public boolean isCollapsed() { |
||||
return collapsed; |
||||
} |
||||
|
||||
public void setCollapsed(boolean collapsed) { |
||||
this.collapsed = collapsed; |
||||
} |
||||
|
||||
/** |
||||
* 自定义的tableEditor类 |
||||
*/ |
||||
public class BeanTableModel extends DefaultTableModel { |
||||
public BeanTableModel() { |
||||
super(cellData, headers); |
||||
} |
||||
|
||||
@Override |
||||
public int getRowCount() { |
||||
if (isCollapsed()) { |
||||
return 1; |
||||
} |
||||
return cellData.length; |
||||
} |
||||
|
||||
@Override |
||||
public int getColumnCount() { |
||||
return 1; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Object getValueAt(int row, int column) { |
||||
if (row >= getRowCount() || column >= getColumnCount()) { |
||||
return null; |
||||
} |
||||
if (row == 0) { |
||||
return (isCollapsed() ? "+" : "-") + cellData[row][0]; |
||||
} |
||||
|
||||
return cellData[row][0]; |
||||
} |
||||
|
||||
@Override |
||||
public String getColumnName(int column) { |
||||
return headers[0]; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void setValueAt(Object aValue, int row, int column) { |
||||
if (row >= getRowCount() || column >= getColumnCount()) { |
||||
return; |
||||
} |
||||
if (aValue == null) { |
||||
cellData[row] = null; |
||||
return; |
||||
} |
||||
cellData[row][0] = aValue.toString(); |
||||
} |
||||
|
||||
/** |
||||
* 是否可编辑 |
||||
* |
||||
* @param row 行号 |
||||
* @param column 列号 |
||||
* @return 是否可编辑 |
||||
*/ |
||||
public boolean isCellEditable(int row, int column) { |
||||
return false; |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue