Browse Source

Merging in latest from upstream (BA/design:refs/heads/dev)

* commit '677b8311d6ecf23b4f20e421d6aa8908813005b8':
  解决修改依赖之后,保存按钮仍然置灰的问题
  代码与UITable比较难兼容,将Table的Renderer和Editor改为UI***来统一风格
  implements DataCreatorUI
  REPORT-533 表单初始化布局新功能 bugfix: 1.抽出一个类extends absolute 2.代码质量 3.初始化布局的测试bug
  极速分层构建
  implements DataCreatorUI
  极速分层构建
  下拉树极速分层构建
master
xiaoxia 8 years ago
parent
commit
a7555fd564
  1. 79
      designer_base/src/com/fr/design/gui/frpane/TreeSettingPane.java
  2. 102
      designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataConfigPane.java
  3. 254
      designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java
  4. 459
      designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDependenceSettingPane.java
  5. BIN
      designer_base/src/com/fr/design/images/control/combobox.png
  6. 30
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteBodyLayoutAdapter.java
  7. 9
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java
  8. 1
      designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java
  9. 45
      designer_form/src/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java
  10. 24
      designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java
  11. 5
      designer_form/src/com/fr/design/designer/properties/AbsoluteStateRenderer.java
  12. 23
      designer_form/src/com/fr/design/designer/properties/BodyLayoutAttrRenderer.java
  13. 239
      designer_form/src/com/fr/design/designer/properties/FRAbsoluteBodyLayoutPropertiesGroupModel.java
  14. 188
      designer_form/src/com/fr/design/designer/properties/FRAbsoluteLayoutPropertiesGroupModel.java
  15. 15
      designer_form/src/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java
  16. 4
      designer_form/src/com/fr/design/designer/properties/FitStateRenderer.java
  17. 4
      designer_form/src/com/fr/design/designer/properties/LayoutTypeRenderer.java
  18. 3
      designer_form/src/com/fr/design/designer/treeview/ComponentTreeModel.java
  19. 10
      designer_form/src/com/fr/design/mainframe/ComponentTree.java
  20. 3
      designer_form/src/com/fr/design/mainframe/widget/wrappers/TreeModelWrapper.java

79
designer_base/src/com/fr/design/gui/frpane/TreeSettingPane.java

@ -1,40 +1,48 @@
package com.fr.design.gui.frpane; package com.fr.design.gui.frpane;
import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import com.fr.data.impl.TreeNodeWrapper;
import com.fr.design.data.DataCreatorUI;
import com.fr.design.gui.ilable.UILabel;
import javax.swing.*;
import com.fr.general.NameObject;
import com.fr.data.impl.TableDataDictionary; import com.fr.data.impl.TableDataDictionary;
import com.fr.data.impl.TreeAttr; import com.fr.data.impl.TreeAttr;
import com.fr.data.impl.TreeNodeAttr; import com.fr.data.impl.TreeNodeAttr;
import com.fr.data.impl.TreeNodeWrapper;
import com.fr.design.data.DataCreatorUI;
import com.fr.design.dialog.BasicPane;
import com.fr.design.gui.controlpane.NameObjectCreator; import com.fr.design.gui.controlpane.NameObjectCreator;
import com.fr.design.gui.controlpane.NameableCreator; import com.fr.design.gui.controlpane.NameableCreator;
import com.fr.design.gui.frpane.tree.layer.config.LayerDataControlPane;
import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.itree.refreshabletree.TreeDataCardPane; import com.fr.design.gui.itree.refreshabletree.TreeDataCardPane;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.dialog.BasicPane;
import com.fr.form.ui.TreeComboBoxEditor; import com.fr.form.ui.TreeComboBoxEditor;
import com.fr.form.ui.TreeEditor; import com.fr.form.ui.TreeEditor;
import com.fr.form.ui.tree.LayerConfig;
import com.fr.general.Inter; import com.fr.general.Inter;
import com.fr.general.NameObject;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class TreeSettingPane extends BasicPane implements DataCreatorUI { public class TreeSettingPane extends BasicPane implements DataCreatorUI {
private JTreeControlPane controlPane; private JTreeControlPane controlPane;
private JTreeAutoBuildPane autoBuildPane; private JTreeAutoBuildPane autoBuildPane;
/**
* 新的分层构建方式
*/
private LayerDataControlPane layerDataControlPane;
private UIComboBox buildBox; private UIComboBox buildBox;
/** /**
* *
*/ */
private static final long serialVersionUID = 1762889323082827111L; private static final long serialVersionUID = 1762889323082827111L;
private String[] buildWay = new String[] { Inter.getLocText("FR-Designer_Layer-Build"), private String[] buildWay = new String[]{Inter.getLocText("FR-Designer_DataTable-Build"),
Inter.getLocText("FR-Designer_Auto-Build") }; Inter.getLocText("FR-Designer_Auto-Build"), Inter.getLocText("FR-Designer_Layer-Build")};
public TreeSettingPane(boolean isEditor) { public TreeSettingPane(boolean isEditor) {
this.initComponents(isEditor); this.initComponents(isEditor);
@ -58,14 +66,30 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI {
controlPane = new JTreeControlPane(new NameableCreator[] { treeNode }, controlPane = new JTreeControlPane(new NameableCreator[] { treeNode },
new TreeDataCardPane(), isEditor); new TreeDataCardPane(), isEditor);
autoBuildPane = new JTreeAutoBuildPane(); autoBuildPane = new JTreeAutoBuildPane();
layerDataControlPane = new LayerDataControlPane();
this.add(buildWayPanel, BorderLayout.NORTH); this.add(buildWayPanel, BorderLayout.NORTH);
cardChanged(0); cardChanged(0);
} }
private void cardChanged(int index) { private void cardChanged(int index) {
this.remove(controlPane); this.remove(controlPane);
this.remove(autoBuildPane); this.remove(autoBuildPane);
this.add(index == 0 ? controlPane : autoBuildPane, BorderLayout.CENTER); this.remove(layerDataControlPane);
switch (index) {
case 0:
this.add(layerDataControlPane);
break;
case 1:
this.add(autoBuildPane);
break;
case 2:
this.add(controlPane);
break;
default:
break;
}
validate(); validate();
repaint(); repaint();
revalidate(); revalidate();
@ -101,8 +125,17 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI {
buildBox.setSelectedIndex(1); buildBox.setSelectedIndex(1);
TableDataDictionary dictionary = treeEditor.getDictionary(); TableDataDictionary dictionary = treeEditor.getDictionary();
autoBuildPane.populate(dictionary); autoBuildPane.populate(dictionary);
} else { } else if (treeEditor.isLayerBuild()) {
buildBox.setSelectedIndex(0); buildBox.setSelectedIndex(0);
java.util.List<LayerConfig> layerConfigList = treeEditor.getLayerConfigs();
LayerConfig[] layerConfigs = new LayerConfig[layerConfigList.size()];
int i = 0;
for (LayerConfig layerConfig : layerConfigList) {
layerConfigs[i++] = layerConfig;
}
this.layerDataControlPane.populate(new NameObject("tree", layerConfigs));
} else {
buildBox.setSelectedIndex(2);
} }
} }
@ -123,7 +156,7 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI {
te.setAutoBuild(true); te.setAutoBuild(true);
te.setDictionary(dictionary); te.setDictionary(dictionary);
te.setNodeOrDict(dictionary); te.setNodeOrDict(dictionary);
} else { } else if (buildBox.getSelectedIndex() == 2) {
te.setAutoBuild(false); te.setAutoBuild(false);
NameObject no = this.controlPane.update(); NameObject no = this.controlPane.update();
if (no != null) { if (no != null) {
@ -150,11 +183,14 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI {
* @return * @return
*/ */
public Object updateTreeNodeAttrs() { public Object updateTreeNodeAttrs() {
if(buildBox.getSelectedIndex() == 0) {
if (buildBox.getSelectedIndex() == 2) {
NameObject no = controlPane.update(); NameObject no = controlPane.update();
if (no != null) { if (no != null) {
return no.getObject(); return no.getObject();
} }
} else if (buildBox.getSelectedIndex() == 0) {
return layerDataControlPane.update();
} else { } else {
return autoBuildPane.update(); return autoBuildPane.update();
} }
@ -172,7 +208,7 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI {
tcb.setAutoBuild(true); tcb.setAutoBuild(true);
tcb.setDictionary(dictionary); tcb.setDictionary(dictionary);
tcb.setNodeOrDict(dictionary); tcb.setNodeOrDict(dictionary);
} else { } else if (buildBox.getSelectedIndex() == 2) {
tcb.setAutoBuild(false); tcb.setAutoBuild(false);
NameObject no = this.controlPane.update(); NameObject no = this.controlPane.update();
if (no != null) { if (no != null) {
@ -204,12 +240,15 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI {
*/ */
public void populate(Object nodeOrDict) { public void populate(Object nodeOrDict) {
if(nodeOrDict instanceof TreeNodeAttr[] || nodeOrDict instanceof TreeNodeWrapper) { if(nodeOrDict instanceof TreeNodeAttr[] || nodeOrDict instanceof TreeNodeWrapper) {
buildBox.setSelectedIndex(0); buildBox.setSelectedIndex(2);
NameObject no = new NameObject("name", nodeOrDict); NameObject no = new NameObject("name", nodeOrDict);
controlPane.populate(no); controlPane.populate(no);
} else if(nodeOrDict instanceof TableDataDictionary) { } else if(nodeOrDict instanceof TableDataDictionary) {
buildBox.setSelectedIndex(1); buildBox.setSelectedIndex(1);
autoBuildPane.populate((TableDataDictionary)nodeOrDict); autoBuildPane.populate((TableDataDictionary)nodeOrDict);
} else if (nodeOrDict instanceof NameObject) {
buildBox.setSelectedIndex(0);
layerDataControlPane.populate((NameObject) nodeOrDict);
} }
} }
} }

102
designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataConfigPane.java

@ -0,0 +1,102 @@
package com.fr.design.gui.frpane.tree.layer.config;
import com.fr.base.TableData;
import com.fr.data.impl.TableDataDictionary;
import com.fr.design.beans.BasicBeanPane;
import com.fr.design.data.tabledata.wrapper.TableDataWrapper;
import com.fr.design.present.dict.TableDataDictPane;
import com.fr.form.ui.tree.LayerConfig;
import com.fr.form.ui.tree.LayerDependence;
import java.awt.*;
import java.util.*;
import java.util.List;
/**
* Created by juhaoyu on 16/9/13.
*/
public class LayerDataConfigPane extends BasicBeanPane<LayerConfig> {
/**
* 数据集数据字典选择panel
*/
private TableDataDictPane tableDataDictPane;
/**
* 与父级关联的字段选择
*/
private LayerDependenceSettingPane dependenceSettingPane;
/**
* 当前用户正在修改的LayerData
*/
private LayerConfig layerConfig;
public LayerDataConfigPane() {
//初始化组件及布局
this.tableDataDictPane = new TableDataDictPane();
this.dependenceSettingPane = new LayerDependenceSettingPane(tableDataDictPane);
this.setLayout(new BorderLayout(2, 2));
this.add(tableDataDictPane, BorderLayout.NORTH);
this.add(dependenceSettingPane, BorderLayout.CENTER);
}
/**
* 1.切换层级时
*
* @param layerConfig
*/
@Override
public void populateBean(LayerConfig layerConfig) {
if (layerConfig != null) {
this.layerConfig = layerConfig;
TableDataDictionary ta = layerConfig.getDictionary();
this.tableDataDictPane.populateBean(ta);
this.dependenceSettingPane.populate(layerConfig.getIndex(), layerConfig.getDependenceList());
}
}
@Override
public LayerConfig updateBean() {
if (layerConfig == null) {
return null;
}
//从下层panel中读取数据
TableData tableData = tableDataDictPane.updateBean().getTableData();
TableDataWrapper wrapper = tableDataDictPane.tableDataNameComboBox.getSelectedItem();
List<String> columnNames;
if (wrapper != null) {
columnNames = wrapper.calculateColumnNameList();
} else {
columnNames = new ArrayList<String>();
}
String viewColStr = tableDataDictPane.updateBean().getValueColumnName();
String modelColStr = tableDataDictPane.updateBean().getKeyColumnName();
TableDataDictionary dictionary = tableDataDictPane.updateBean();
int viewCol = columnNames.indexOf(viewColStr);
int modelCol = columnNames.indexOf(modelColStr);
//将数据设置到当前正在修改的layerData中
this.layerConfig.setDictionary(dictionary);
this.layerConfig.setModelColumn(modelCol);
this.layerConfig.setViewColumn(viewCol);
this.layerConfig.setTableData(tableData);
//添加依赖
java.util.List<LayerDependence> dependenceList = dependenceSettingPane.updateLayerDependence();
layerConfig.getDependenceList().clear();
layerConfig.addAll(dependenceList);
return layerConfig;
}
@Override
protected String title4PopupWindow() {
return "Layer Data Config Panel";
}
}

254
designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java

@ -0,0 +1,254 @@
package com.fr.design.gui.frpane.tree.layer.config;
import com.fr.base.BaseUtils;
import com.fr.design.actions.UpdateAction;
import com.fr.design.gui.controlpane.ControlPane;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.gui.itoolbar.UIToolbar;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.menu.ToolBarDef;
import com.fr.form.ui.tree.LayerConfig;
import com.fr.general.ComparatorUtils;
import com.fr.general.Inter;
import com.fr.general.NameObject;
import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
/**
* Created by juhaoyu on 16/9/21.
*/
public class LayerDataControlPane extends ControlPane {
public static final String BEAN_NAME = "Tree Layer Data";
// 添加一个treeNode
private AddTreeNodeAction addTreeNode;
// 移除一个treeNode
private RemoveTreeNodeAction removeTreeNode;
private LayerDataConfigPane configPane;
private JTree tree;
private DefaultTreeModel defaultTreeModel;
public LayerDataControlPane() {
this.setLayout(new BorderLayout(2, 2));
//创建层编辑panel
configPane = new LayerDataConfigPane();
//创建树结构及树控件
JPanel leftPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(Inter.getLocText("FR-Designer_Root"));
defaultTreeModel = new DefaultTreeModel(rootNode);
tree = new JTree(defaultTreeModel);
DefaultMutableTreeNode firstLayer = new DefaultMutableTreeNode(new NameObject(Inter.getLocText("FR-Designer_Gradation") + 1, new LayerConfig(1)));
tree.setRootVisible(false);
((DefaultMutableTreeNode) defaultTreeModel.getRoot()).getLastLeaf().add(firstLayer);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
leftPane.add(new UIScrollPane(tree), BorderLayout.CENTER);
tree.setPreferredSize(new Dimension(170, 350));
tree.setCellRenderer(renderer);
tree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
configPane.updateBean();
refreshCurrentUpdatePane();
checkButtonEnabled();
}
});
// JTreeControlPane控制栏
ToolBarDef toolbarDef = new ToolBarDef();
toolbarDef.addShortCut(addTreeNode = new AddTreeNodeAction());
toolbarDef.addShortCut(removeTreeNode = new RemoveTreeNodeAction());
UIToolbar toolBar = ToolBarDef.createJToolBar();
toolbarDef.updateToolBar(toolBar);
leftPane.add(toolBar, BorderLayout.NORTH);
this.add(leftPane, BorderLayout.WEST);
this.add(this.configPane, BorderLayout.CENTER);
defaultTreeModel.reload();
TreePath path = new TreePath(defaultTreeModel.getPathToRoot(rootNode.getLastLeaf()));
tree.setSelectionPath(path);
this.checkButtonEnabled();
}
public void refreshCurrentUpdatePane() {
TreePath selectTreePath = this.tree.getSelectionPath();
if (selectTreePath != null) {
NameObject object = (NameObject) ((DefaultMutableTreeNode) selectTreePath.getLastPathComponent()).getUserObject();
if (object != null && object.getObject() != null) {
configPane.populateBean((LayerConfig) object.getObject());
}
}
}
TreeCellRenderer renderer = new DefaultTreeCellRenderer() {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
if (leaf) {
this.setIcon(BaseUtils.readIcon("com/fr/design/images/data/default_widget.png"));
} else {
this.setIcon(BaseUtils.readIcon("com/fr/design/images/data/arrow_branch.png"));
}
if (value instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
Object userObj = node.getUserObject();
if (userObj instanceof NameObject) {
this.setText(((NameObject) userObj).getName());
}
}
this.setBorder(BorderFactory.createEmptyBorder(0, 0, 2, 0));
return this;
}
};
private void checkButtonEnabled() {
this.addTreeNode.setEnabled(true);
this.removeTreeNode.setEnabled(true);
// richer:当选择了树根节点时,不能被删除、上移和下移
DefaultMutableTreeNode root = (DefaultMutableTreeNode) defaultTreeModel.getRoot();
TreePath rootPath = new TreePath(defaultTreeModel.getPathToRoot(root));
if (ComparatorUtils.equals(rootPath, tree.getSelectionPath())) {
this.removeTreeNode.setEnabled(false);
}
}
private class AddTreeNodeAction extends UpdateAction {
public AddTreeNodeAction() {
this.setName(Inter.getLocText("FR-Designer_Add"));
this.setMnemonic('A');
this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/add.png"));
}
public void actionPerformed(ActionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) defaultTreeModel.getRoot();
DefaultMutableTreeNode innerNode = node;
int nodeCount = 0;
do {
nodeCount++;
} while ((innerNode = innerNode.getNextNode()) != null);
NameObject nameable = new NameObject(Inter.getLocText("FR-Designer_Gradation") + nodeCount, new LayerConfig(nodeCount));
node.getLastLeaf().add(new DefaultMutableTreeNode(nameable));
defaultTreeModel.reload();
TreePath path = new TreePath(defaultTreeModel.getPathToRoot(node.getLastLeaf()));
tree.setSelectionPath(path);
}
}
private class RemoveTreeNodeAction extends UpdateAction {
public RemoveTreeNodeAction() {
this.setName(Inter.getLocText("FR-Designer_Remove"));
this.setMnemonic('R');
this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png"));
}
public void actionPerformed(ActionEvent e) {
// TODO remove tree node
int val = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Utils-Are_you_sure_to_remove_the_selected_item") + "?",
Inter.getLocText("FR-Designer_Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if (val != JOptionPane.OK_OPTION) {
return;
}
TreePath selectionPath = tree.getSelectionPath();
DefaultMutableTreeNode tmpNode = (DefaultMutableTreeNode) selectionPath.getLastPathComponent();
tmpNode.removeFromParent();
defaultTreeModel.reload();
DefaultMutableTreeNode node = (DefaultMutableTreeNode) defaultTreeModel.getRoot();
TreePath path = new TreePath(defaultTreeModel.getPathToRoot(node.getLastLeaf()));
tree.setSelectionPath(path);
}
}
public void populate(NameObject nameObject) {
// 重新添加tree节点的时候需要remove掉原来的所有子节点
((DefaultMutableTreeNode) defaultTreeModel.getRoot()).removeAllChildren();
if (BEAN_NAME.equals(nameObject.getName())) {
Object obj = nameObject.getObject();
LayerConfig[] layerConfigs = null;
if (obj instanceof LayerConfig[]) {
layerConfigs = ((LayerConfig[]) obj);
}
int count = layerConfigs == null ? 0 : layerConfigs.length;
//将树的层次一层一层的加上去
DefaultMutableTreeNode node4root = (DefaultMutableTreeNode) defaultTreeModel.getRoot();
for (int i = 0; i < count; i++) {
DefaultMutableTreeNode node4add = new DefaultMutableTreeNode(
new NameObject(Inter.getLocText("FR-Designer_Gradation") + (i + 1), layerConfigs[i].clone()));
node4root.add(node4add);
node4root = node4add;
}
defaultTreeModel.reload();
expandAll(tree, true);
tree.setSelectionRow(0);
}
}
public NameObject update() {
return new NameObject(BEAN_NAME, updateLayerDatas());
}
private LayerConfig[] updateLayerDatas() {
//保存最后一个设置的层级
configPane.updateBean();
DefaultMutableTreeNode root = (DefaultMutableTreeNode) defaultTreeModel.getRoot();
java.util.List<LayerConfig> nodeList = new ArrayList<LayerConfig>();
for (; root != null; root = root.getNextNode()) {
if (!(root.getUserObject() instanceof NameObject)) {
continue;
}
NameObject no = (NameObject) root.getUserObject();
if (no.getObject() instanceof LayerConfig) {
nodeList.add((LayerConfig) no.getObject());
}
}
return nodeList.toArray(new LayerConfig[nodeList.size()]);
}
@Override
protected String title4PopupWindow() {
return "Layer Data Control Pane";
}
}

459
designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDependenceSettingPane.java

@ -0,0 +1,459 @@
package com.fr.design.gui.frpane.tree.layer.config;
import com.fr.design.data.tabledata.wrapper.TableDataWrapper;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.present.dict.TableDataDictPane;
import com.fr.form.ui.tree.LayerDependence;
import com.fr.general.Inter;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List;
/**
* Created by juhaoyu on 16/9/19.
*/
public class LayerDependenceSettingPane extends JPanel implements ItemListener {
/**
* 用户选择数据集的pane,在LayerDataConfigPane中传入
*/
private TableDataDictPane tableDataDictPane;
/**
* 添加依赖按钮
*/
private UIButton addButton;
/**
* 删除依赖按钮
*/
private UIButton delButton;
/**
* 依赖关系编辑Table
*/
private JTable dependenceTable;
/**
* Table的数据模型,两个按钮的操作直接对应于model
*/
private LayerDepenceTableModel model;
/**
* 当前该panel所设置的层级
*/
private int currentLayerIndex = 1;
private FieldRenderer fieldRenderer;
private LayerIndexEditor layerIndexEditor;
private FiledEditor fieldEditor;
public LayerDependenceSettingPane(TableDataDictPane tableDictPane) {
//关联数据集选择,并添加监听
this.tableDataDictPane = tableDictPane;
tableDataDictPane.tableDataNameComboBox.addItemListener(this);
//初始化按钮对象
addButton = new UIButton(Inter.getLocText("add"));
delButton = new UIButton(Inter.getLocText("Delete"));
//初始化Table对象,并添加renderer和editor
model = new LayerDepenceTableModel();
dependenceTable = new JTable();
dependenceTable.setModel(model);
//初始化辅助组件
fieldEditor = new FiledEditor(tableDataDictPane);
fieldRenderer = new FieldRenderer(tableDictPane);
layerIndexEditor = new LayerIndexEditor(currentLayerIndex);
//添加renderer
dependenceTable.getColumnModel().getColumn(0).setCellRenderer(new FirstRenderer());
dependenceTable.getColumnModel().getColumn(1).setCellRenderer(fieldRenderer);
//添加第一列editor
dependenceTable.getColumnModel().getColumn(0).setCellEditor(layerIndexEditor);
//添加第二列editor
dependenceTable.getColumnModel().getColumn(1).setCellEditor(fieldEditor);
//添加add按钮监听
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//先要停止编辑,然后再添加
fieldEditor.stopCellEditing();
layerIndexEditor.stopCellEditing();
LayerDependenceSettingPane.this.model.addDependence();
}
});
//添加del按钮监听
delButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (0 == dependenceTable.getSelectedRowCount()) {
return;
}
//获取视图索引,并根据视图索引获取model索引,删除model指定行
int selectedRow = dependenceTable.getSelectedRow();
int selectedRowModelIndex = dependenceTable.convertRowIndexToModel(selectedRow);
//先要停止编辑,然后再删除
fieldEditor.stopCellEditing();
layerIndexEditor.stopCellEditing();
model.delDependence(selectedRowModelIndex);
}
});
//生成布局
this.setLayout(new BorderLayout(2, 2));
//添加按钮panel
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout(2));
buttonPanel.add(addButton);
buttonPanel.add(delButton);
this.add(buttonPanel, BorderLayout.NORTH);
//添加Table的panel
JScrollPane tablePanel = new JScrollPane(dependenceTable);
this.add(tablePanel, BorderLayout.CENTER);
}
public void populate(int layerIndex, List<LayerDependence> dependenceList) {
this.currentLayerIndex = layerIndex;
//更新Editor
this.layerIndexEditor.layerChanged(layerIndex);
this.fieldEditor.layerChanged();
this.model.clear();
this.model.addAll(dependenceList);
}
public List<LayerDependence> updateLayerDependence() {
//保存现有编辑
this.fieldEditor.stopCellEditing();
this.layerIndexEditor.stopCellEditing();
return this.model.update();
}
/**
* 当tableDataDictPane变化时,调用该方法
*/
@Override
public void itemStateChanged(ItemEvent e) {
clearDependences();
}
/**
* 清楚当前设置的依赖关系
*/
private void clearDependences() {
this.model.clear();
}
/**
* 第一列renderer
*/
private static final class FirstRenderer extends UILabel implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value != null) {
//value是用户选择的字段索引值,从1开始的
this.setText(String.valueOf(value));
} else {
this.setText("");
}
if (hasFocus) {
this.setBorder(UIManager.getBorder("Table.focusCelHighlightBorder"));
} else {
this.setBorder(null);
}
return this;
}
}
/**
* 第二列renderer
* 由于从model中获取的数据是数据集列的索引值,这里要转换为列的名称
*/
private static final class FieldRenderer extends UILabel implements TableCellRenderer {
//用于将字段索引转换为字段名;保存改pane,是为了当用户选择其他数据集时,renderer可同步更新
private TableDataDictPane tableDataDictPane;
public FieldRenderer(TableDataDictPane tableDataDictPane) {
this.tableDataDictPane = tableDataDictPane;
}
/**
* 由于数据是从tableDataDictPane中现取的,所以用户选择不同的数据集时,renderer同步更新;
* 此时只需要在用户选择数据集时,刷新Table即可,不需要对renderer处理
*/
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value != null) {
List<String> columnNames = getColumnNameList(this.tableDataDictPane);
//value是用户选择的字段索引值,从1开始的
this.setText(columnNames.get(Integer.valueOf(String.valueOf(value))));
} else {
this.setText("");
}
if (hasFocus) {
this.setBorder(UIManager.getBorder("Table.focusCelHighlightBorder"));
} else {
this.setBorder(null);
}
return this;
}
}
/**
* 第一列editor
* 该editor于layerIndex关联,当用户选择不同的层时,这个editor要同步更新
*/
private static final class LayerIndexEditor extends AbstractCellEditor implements TableCellEditor {
private int currentLayerIndex;
private UIComboBox layerChoseCombobox = new UIComboBox();
public LayerIndexEditor(int currentLayerIndex) {
this.currentLayerIndex = currentLayerIndex;
for (int i = 1; i < currentLayerIndex; i++) {
layerChoseCombobox.addItem(i);
}
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
if (value != null) {
layerChoseCombobox.setSelectedIndex(Integer.valueOf(String.valueOf(value)) - 1);
}
return layerChoseCombobox;
}
@Override
public Object getCellEditorValue() {
return layerChoseCombobox.getSelectedItem();
}
public void layerChanged(int newLayerIndex) {
this.currentLayerIndex = newLayerIndex;
layerChoseCombobox.removeAllItems();
for (int i = 1; i < currentLayerIndex; i++) {
layerChoseCombobox.addItem(i);
}
}
}
/**
* 第二列editor
*/
private static final class FiledEditor extends AbstractCellEditor implements TableCellEditor {
private UIComboBox layerChoseCombobox = new UIComboBox();
TableDataDictPane tableDataDictPane;
public FiledEditor(TableDataDictPane tableDataDictPane) {
this.tableDataDictPane = tableDataDictPane;
List<String> columnNames = getColumnNameList(this.tableDataDictPane);
for (String columnName : columnNames) {
this.layerChoseCombobox.addItem(columnName);
}
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
List<String> columnNames = getColumnNameList(this.tableDataDictPane);
layerChoseCombobox.removeAllItems();
for (String columnName : columnNames) {
layerChoseCombobox.addItem(columnName);
}
if (value != null) {
layerChoseCombobox.setSelectedIndex(Integer.valueOf(String.valueOf(value)));
}
return layerChoseCombobox;
}
@Override
public Object getCellEditorValue() {
//转化为数据集的列索引(从0开始)
return layerChoseCombobox.getSelectedIndex();
}
public void layerChanged() {
List<String> columnNames = getColumnNameList(this.tableDataDictPane);
layerChoseCombobox.removeAllItems();
for (String columnName : columnNames) {
layerChoseCombobox.addItem(columnName);
}
}
}
private static List<String> getColumnNameList(TableDataDictPane tableDataDictPane) {
TableDataWrapper wrapper = tableDataDictPane.tableDataNameComboBox.getSelectedItem();
if (wrapper == null) {
return new ArrayList<String>();
} else {
return wrapper.calculateColumnNameList();
}
}
private static class LayerDepenceTableModel extends AbstractTableModel {
private List<LayerDependence> dependences;
public LayerDepenceTableModel() {
dependences = new ArrayList<LayerDependence>();
}
/**
* 添加一条数据,该方法会请求Table进行重绘(通过发送时间,告诉JTable数据更新,JTable会自动重绘)
*/
public void addDependence() {
dependences.add(new LayerDependence());
fireTableRowsInserted(dependences.size(), dependences.size());
}
/**
* 删除一条数据
*
* @param rowIndex
*/
public void delDependence(int rowIndex) {
if (rowIndex < 0 || rowIndex >= dependences.size()) {
return;
}
dependences.remove(rowIndex);
fireTableRowsDeleted(rowIndex + 1, rowIndex + 1);
}
public void addAll(List<LayerDependence> dependenceList) {
dependences.addAll(dependenceList);
fireTableRowsInserted(1, dependenceList.size());
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
@Override
public Class<?> getColumnClass(int column) {
return Integer.class;
}
@Override
public String getColumnName(int column) {
String name;
if (column == 0) {
name = Inter.getLocText("FR-Designer_layerIndex");
} else {
name = Inter.getLocText("FR-Designer_filedChosen");
}
return name;
}
@Override
public int getRowCount() {
return dependences.size();
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
LayerDependence dependence = dependences.get(rowIndex);
Object obj;
if (columnIndex == 0) {
obj = dependence.getLayerIndex();
} else {
obj = dependence.getThisColumnIndex();
}
return obj;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
LayerDependence dependence = dependences.get(rowIndex);
if (aValue != null) {
if (columnIndex == 0) {
dependence.setLayerIndex((Integer) aValue);
} else {
dependence.setThisColumnIndex((Integer) aValue);
}
}
}
public void clear() {
int length = dependences.size();
dependences.clear();
fireTableRowsDeleted(1, length);
}
public List<LayerDependence> update() {
return this.dependences;
}
}
}

BIN
designer_base/src/com/fr/design/images/control/combobox.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

30
designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteBodyLayoutAdapter.java

@ -0,0 +1,30 @@
package com.fr.design.designer.beans.adapters.layout;
import com.fr.design.beans.GroupModel;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWAbsoluteBodyLayout;
import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.designer.properties.FRAbsoluteBodyLayoutPropertiesGroupModel;
import com.fr.design.designer.properties.FRAbsoluteLayoutPropertiesGroupModel;
import com.fr.form.ui.container.WBodyLayoutType;
/**
* Created by zhouping on 2016/10/14.
*/
public class FRAbsoluteBodyLayoutAdapter extends FRAbsoluteLayoutAdapter {
public FRAbsoluteBodyLayoutAdapter(XLayoutContainer container) {
super(container);
}
@Override
public GroupModel getLayoutProperties() {
XWAbsoluteBodyLayout xwAbsoluteBodyLayout = (XWAbsoluteBodyLayout) container;
//如果body是绝对布局,那么获取原来自适应body的属性--布局类型
WBodyLayoutType layoutType = WBodyLayoutType.FIT;
if (container.getParent() != null) {
layoutType = ((XWFitLayout)container.getParent()).toData().getBodyLayoutType();
}
return new FRAbsoluteBodyLayoutPropertiesGroupModel(xwAbsoluteBodyLayout, layoutType);
}
}

9
designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java

@ -331,15 +331,6 @@ public class FRAbsoluteLayoutAdapter extends FRBodyLayoutAdapter {
@Override @Override
public GroupModel getLayoutProperties() { public GroupModel getLayoutProperties() {
XWAbsoluteLayout xwAbsoluteLayout = (XWAbsoluteLayout) container; XWAbsoluteLayout xwAbsoluteLayout = (XWAbsoluteLayout) container;
if (xwAbsoluteLayout.toData().isAbsoluteLayoutAsBody()){
//如果body是绝对布局,那么获取原来自适应body的属性--布局类型
WBodyLayoutType layoutType = WBodyLayoutType.FIT;
if (container.getParent() != null) {
layoutType = ((XWFitLayout)container.getParent()).toData().getBodyLayoutType();
}
return new FRAbsoluteLayoutPropertiesGroupModel(xwAbsoluteLayout, layoutType);
} else {
return new FRAbsoluteLayoutPropertiesGroupModel(xwAbsoluteLayout); return new FRAbsoluteLayoutPropertiesGroupModel(xwAbsoluteLayout);
} }
} }
}

1
designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java

@ -77,6 +77,7 @@ public class XCreatorUtils {
xLayoutMap.put(WAbsoluteLayout.class, XWAbsoluteLayout.class); xLayoutMap.put(WAbsoluteLayout.class, XWAbsoluteLayout.class);
xLayoutMap.put(WParameterLayout.class, XWParameterLayout.class); xLayoutMap.put(WParameterLayout.class, XWParameterLayout.class);
xLayoutMap.put(WAbsoluteBodyLayout.class, XWAbsoluteBodyLayout.class);
xLayoutMap.put(WAbsoluteLayout.class, XWAbsoluteLayout.class); xLayoutMap.put(WAbsoluteLayout.class, XWAbsoluteLayout.class);
xLayoutMap.put(WHorizontalBoxLayout.class, XWHorizontalBoxLayout.class); xLayoutMap.put(WHorizontalBoxLayout.class, XWHorizontalBoxLayout.class);
xLayoutMap.put(WBorderLayout.class, XWBorderLayout.class); xLayoutMap.put(WBorderLayout.class, XWBorderLayout.class);

45
designer_form/src/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java

@ -0,0 +1,45 @@
package com.fr.design.designer.creator;
import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.adapters.layout.FRAbsoluteBodyLayoutAdapter;
import com.fr.form.ui.container.WAbsoluteBodyLayout;
import java.awt.*;
/**
* Created by zhouping on 2016/10/14.
* 用作body的绝对布局
*/
public class XWAbsoluteBodyLayout extends XWAbsoluteLayout {
public XWAbsoluteBodyLayout(WAbsoluteBodyLayout widget, Dimension initSize) {
super(widget, initSize);
this.editable = true;
}
/**
* 返回对应的widget容器
*
* @return 返回WAbsoluteLayout
*/
@Override
public WAbsoluteBodyLayout toData() {
return (WAbsoluteBodyLayout)data;
}
@Override
public LayoutAdapter getLayoutAdapter() {
return new FRAbsoluteBodyLayoutAdapter(this);
}
/**
* 假如是body的话始终要能编辑不会出现蒙层
*
* @param isEditable 可否编辑
*/
@Override
public void setEditable(boolean isEditable) {
super.setEditable(true);
}
}

24
designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java

@ -75,15 +75,7 @@ public class XWAbsoluteLayout extends XLayoutContainer {
xConnectorMap.put(connector, new XConnector(connector, this)); xConnectorMap.put(connector, new XConnector(connector, this));
} }
this.editable = widget.isAbsoluteLayoutAsBody(); initPercent(widget);
initPercent();
}
public XWAbsoluteLayout(WAbsoluteLayout widget, Dimension initSize, boolean isAbsoluteLayoutAsBody) {
this(widget, initSize);
widget.setAbsoluteLayoutAsBody(isAbsoluteLayoutAsBody);
this.editable = isAbsoluteLayoutAsBody;
} }
/** /**
@ -97,13 +89,14 @@ public class XWAbsoluteLayout extends XLayoutContainer {
} }
//根据屏幕大小来确定显示的百分比, 1440*900默认100%, 1366*768缩放90% //根据屏幕大小来确定显示的百分比, 1440*900默认100%, 1366*768缩放90%
private void initPercent(){ private void initPercent(WAbsoluteLayout widget){
Toolkit toolkit = Toolkit.getDefaultToolkit(); Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension scrnsize = toolkit.getScreenSize(); Dimension scrnsize = toolkit.getScreenSize();
double screenValue = FRScreen.getByDimension(scrnsize).getValue(); double screenValue = FRScreen.getByDimension(scrnsize).getValue();
if(screenValue != FormArea.DEFAULT_SLIDER){ if(screenValue != FormArea.DEFAULT_SLIDER){
this.setContainerPercent(screenValue / FormArea.DEFAULT_SLIDER); this.setContainerPercent(screenValue / FormArea.DEFAULT_SLIDER);
} }
widget.setDesigningResolution(scrnsize);
} }
/** /**
@ -451,15 +444,4 @@ public class XWAbsoluteLayout extends XLayoutContainer {
} }
} }
} }
/**
* 设置布局是否可编辑不可则显示编辑蒙层
* 假如是body的话始终要能编辑不会出现蒙层
*
* @param isEditable 可否编辑
*/
@Override
public void setEditable(boolean isEditable) {
super.setEditable(toData().isAbsoluteLayoutAsBody() || isEditable);
}
} }

5
designer_form/src/com/fr/design/designer/properties/AbsoluteStateRenderer.java

@ -1,11 +1,10 @@
package com.fr.design.designer.properties; package com.fr.design.designer.properties;
import com.fr.design.mainframe.widget.renderer.EncoderCellRenderer;
/** /**
* Created by zhouping on 2016/8/1. * Created by zhouping on 2016/8/1.
*/ */
public class AbsoluteStateRenderer extends EncoderCellRenderer { public class AbsoluteStateRenderer extends BodyLayoutAttrRenderer {
public AbsoluteStateRenderer() { public AbsoluteStateRenderer() {
super(new AbsoluteStateWrapper()); super(new AbsoluteStateWrapper());
} }

23
designer_form/src/com/fr/design/designer/properties/BodyLayoutAttrRenderer.java

@ -0,0 +1,23 @@
package com.fr.design.designer.properties;
import com.fr.design.mainframe.widget.renderer.EncoderCellRenderer;
import com.fr.general.IOUtils;
import java.awt.*;
import java.awt.image.BufferedImage;
/**
* Created by zhouping on 2016/10/14.
*/
public class BodyLayoutAttrRenderer extends EncoderCellRenderer {
public BodyLayoutAttrRenderer(Encoder encoder) {
super(encoder);
}
@Override
public void paint(Graphics g) {
super.paint(g);
BufferedImage image = IOUtils.readImage("com/fr/design/images/control/combobox.png");
g.drawImage(image, getWidth() - image.getWidth(), 0, image.getWidth(), image.getHeight(), null, this);
}
}

239
designer_form/src/com/fr/design/designer/properties/FRAbsoluteBodyLayoutPropertiesGroupModel.java

@ -0,0 +1,239 @@
package com.fr.design.designer.properties;
import com.fr.design.designer.creator.XWAbsoluteBodyLayout;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelectionUtils;
import com.fr.design.mainframe.WidgetPropertyPane;
import com.fr.design.mainframe.widget.editors.LayoutTypeEditor;
import com.fr.design.utils.gui.LayoutUtils;
import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WBodyLayoutType;
import com.fr.general.FRScreen;
import com.fr.general.Inter;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.awt.geom.Arc2D;
import java.util.Arrays;
import java.util.Comparator;
/**
* Created by zhouping on 2016/10/14.
*/
public class FRAbsoluteBodyLayoutPropertiesGroupModel extends FRAbsoluteLayoutPropertiesGroupModel {
private LayoutTypeEditor layoutTypeEditor;
private LayoutTypeRenderer layoutTypeRenderer;
//默认body是0,自适应布局;1,绝对布局.
private WBodyLayoutType layoutType = WBodyLayoutType.ABSOLUTE;
public FRAbsoluteBodyLayoutPropertiesGroupModel(XWAbsoluteBodyLayout xwAbsoluteBodyLayout) {
super(xwAbsoluteBodyLayout);
}
public FRAbsoluteBodyLayoutPropertiesGroupModel(XWAbsoluteBodyLayout xwAbsoluteBodyLayout, WBodyLayoutType layoutType){
this(xwAbsoluteBodyLayout);
this.layoutTypeEditor = new LayoutTypeEditor();
this.layoutTypeRenderer = new LayoutTypeRenderer();
this.layoutType = layoutType;
}
/**
* 布局管理器自己的属性
*/
@Override
public String getGroupName() {
return Inter.getLocText("FR-Designer_Attr_Layout");
}
@Override
public int getRowCount() {
return 2;
}
@Override
public TableCellRenderer getRenderer(int row) {
return row == 0 ? layoutTypeRenderer : stateRenderer;
}
@Override
public TableCellEditor getEditor(int row) {
return row == 0 ? layoutTypeEditor : stateEditor;
}
@Override
public Object getValue(int row, int column) {
if (column == 0) {
switch (row) {
case 0:
return Inter.getLocText("FR-Designer_Attr_Layout_Type");
default:
return Inter.getLocText("FR-Designer-Widget_Scaling_Mode");
}
} else {
switch (row) {
case 0:
return layoutType.getTypeValue();
default:
return layout.getCompState();
}
}
}
@Override
public boolean setValue(Object value, int row, int column) {
if (layoutType == WBodyLayoutType.ABSOLUTE){
int state = 0;
if(value instanceof Integer) {
state = (Integer)value;
}
if (column == 0 || state < 0) {
return false;
} else {
if (row == 0) {
if (state == WBodyLayoutType.FIT.getTypeValue()) {
XWFitLayout xfl = (XWFitLayout) xwAbsoluteLayout.getBackupParent();
Component[] components = xwAbsoluteLayout.getComponents();
Arrays.sort(components, new ComparatorComponentLocation());
xfl.getLayoutAdapter().removeBean(xwAbsoluteLayout, xwAbsoluteLayout.getWidth(), xwAbsoluteLayout.getHeight());
xfl.remove(xwAbsoluteLayout);
xfl.toData().setLayoutType(WBodyLayoutType.FIT);
for (Component comp : components) {
xfl.add(comp);
}
moveComponents2FitLayout(xfl, components);
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner();
formDesigner.getSelectionModel().setSelectedCreators(
FormSelectionUtils.rebuildSelection(xfl, new Widget[]{xfl.toData()}));
xfl.convert();
LayoutUtils.layoutContainer(xfl);
xfl.adjustCreatorsWhileSlide(xfl.getContainerPercent() - 1.0);
return true;
}
}
if (row == 1) {
layout.setCompState(state);
return true;
}
return false;
}
}
int state = 0;
if(value instanceof Integer) {
state = (Integer)value;
}
if (column == 0 || state < 0) {
return false;
} else {
if (row == 0) {
layout.setCompState(state);
return true;
}
return false;
}
}
/**
* 是否可编辑
* @param row
* @return
*/
@Override
public boolean isEditable(int row) {
return true;
}
//把绝对布局中的元素按规则移动到自适应布局中
private void moveComponents2FitLayout(XWFitLayout xwFitLayout, Component[] components) {
int eachRowCount = 4;
if (components.length <= 1){
return;
}
int layoutWidth = xwFitLayout.getWidth() - xwFitLayout.toData().getMargin().getLeft() - xwFitLayout.toData().getMargin().getRight();
int layoutHeight = xwFitLayout.getHeight() - xwFitLayout.toData().getMargin().getTop() - xwFitLayout.toData().getMargin().getBottom();
int leftMargin = xwFitLayout.toData().getMargin().getLeft();
int topMargin = xwFitLayout.toData().getMargin().getTop();
int row = (components.length / eachRowCount) + (components.length % eachRowCount == 0 ? 0 : 1);
//最后一行的列数不定
int column = components.length % eachRowCount == 0 ? eachRowCount : components.length % eachRowCount;
int componentWidth = layoutWidth / eachRowCount;
int componentHeight = layoutHeight / row;
for(int i = 0;i < row - 1;i++){
for(int j = 0;j < eachRowCount;j++){
components[eachRowCount * i + j].setBounds(
leftMargin + componentWidth * j,
topMargin + componentHeight * i,
j == eachRowCount - 1 ? layoutWidth - componentWidth * (eachRowCount - 1) : componentWidth,
componentHeight
);
}
}
//最后一行列数是特殊的,要单独处理
int lastRowWidth = layoutWidth / column;
int lastRowHeight = layoutHeight - componentHeight * (row - 1);
for (int i = 0;i < column;i++) {
components[eachRowCount * (row - 1) + i].setBounds(
leftMargin + lastRowWidth * i,
topMargin + componentHeight * (row - 1),
i == column - 1 ? layoutWidth - lastRowWidth * (column - 1) : lastRowWidth,
lastRowHeight
);
}
xwFitLayout.updateBoundsWidget();
}
private class ComponentLocationInfo{
private Component component;
private int horizontalNO;
private int verticalNO;
public ComponentLocationInfo(Component component, int horizontalNO, int verticalNO){
this.component = component;
this.horizontalNO = horizontalNO;
this.verticalNO = verticalNO;
}
public int getHorizontalNO() {
return this.horizontalNO;
}
public int getVerticalNO() {
return this.verticalNO;
}
public void setHorizontalNO(int horizontalNO){
this.horizontalNO = horizontalNO;
}
public void setVerticalNO(int verticalNO){
this.verticalNO = verticalNO;
}
}
//以组件的位置来确定先后顺序,y小的在前,x小的在前
private class ComparatorComponentLocation implements Comparator {
@Override
public int compare(Object o1, Object o2) {
if(((Component)o1).getY() < ((Component)o2).getY()){
return -1;
}
else if (((Component)o1).getY() > ((Component)o2).getY()) {
return 1;
}
else {
if (((Component)o1).getX() < ((Component)o2).getX()){
return -1;
}
else if (((Component)o1).getX() > ((Component)o2).getX()) {
return 1;
}
else{
return 0;
}
}
}
}
}

188
designer_form/src/com/fr/design/designer/properties/FRAbsoluteLayoutPropertiesGroupModel.java

@ -2,40 +2,27 @@ package com.fr.design.designer.properties;
import com.fr.design.beans.GroupModel; import com.fr.design.beans.GroupModel;
import com.fr.design.designer.creator.XWAbsoluteLayout; import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelectionUtils;
import com.fr.design.mainframe.WidgetPropertyPane;
import com.fr.design.mainframe.widget.editors.AbsoluteLayoutDirectionEditor; import com.fr.design.mainframe.widget.editors.AbsoluteLayoutDirectionEditor;
import com.fr.design.mainframe.widget.editors.IntegerPropertyEditor; import com.fr.design.mainframe.widget.editors.IntegerPropertyEditor;
import com.fr.design.mainframe.widget.editors.LayoutTypeEditor;
import com.fr.design.mainframe.widget.editors.PropertyCellEditor; import com.fr.design.mainframe.widget.editors.PropertyCellEditor;
import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WAbsoluteLayout; import com.fr.form.ui.container.WAbsoluteLayout;
import com.fr.form.ui.container.WBodyLayoutType;
import com.fr.general.Inter; import com.fr.general.Inter;
import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer; import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.util.Arrays;
import java.util.Comparator;
/** /**
* Created by zhouping on 2016/8/1. * Created by zhouping on 2016/8/1.
*/ */
public class FRAbsoluteLayoutPropertiesGroupModel implements GroupModel { public class FRAbsoluteLayoutPropertiesGroupModel implements GroupModel {
private PropertyCellEditor editor; private PropertyCellEditor editor;
private DefaultTableCellRenderer renderer; private DefaultTableCellRenderer renderer;
private AbsoluteLayoutDirectionEditor stateEditor; protected AbsoluteLayoutDirectionEditor stateEditor;
private AbsoluteStateRenderer stateRenderer; protected AbsoluteStateRenderer stateRenderer;
private WAbsoluteLayout layout; protected WAbsoluteLayout layout;
private XWAbsoluteLayout xwAbsoluteLayout; protected XWAbsoluteLayout xwAbsoluteLayout;
private LayoutTypeEditor layoutTypeEditor;
private LayoutTypeRenderer layoutTypeRenderer;
//默认body是0,自适应布局;1,绝对布局.
private WBodyLayoutType layoutType = WBodyLayoutType.FIT;
public FRAbsoluteLayoutPropertiesGroupModel(XWAbsoluteLayout xwAbsoluteLayout){ public FRAbsoluteLayoutPropertiesGroupModel(XWAbsoluteLayout xwAbsoluteLayout){
this.xwAbsoluteLayout = xwAbsoluteLayout; this.xwAbsoluteLayout = xwAbsoluteLayout;
@ -46,65 +33,31 @@ public class FRAbsoluteLayoutPropertiesGroupModel implements GroupModel {
stateRenderer = new AbsoluteStateRenderer(); stateRenderer = new AbsoluteStateRenderer();
} }
public FRAbsoluteLayoutPropertiesGroupModel(XWAbsoluteLayout xwAbsoluteLayout, WBodyLayoutType layoutType){
this(xwAbsoluteLayout);
this.layoutTypeEditor = new LayoutTypeEditor();
this.layoutTypeRenderer = new LayoutTypeRenderer();
this.layoutType = layoutType;
}
/** /**
* 布局管理器自己的属性 * 布局管理器自己的属性
*/ */
@Override @Override
public String getGroupName() { public String getGroupName() {
return Inter.getLocText(layoutType == WBodyLayoutType.ABSOLUTE ? "FR-Designer_Attr_Layout" : "FR-Designer-Widget_Area_Scaling"); return Inter.getLocText("FR-Designer-Widget_Area_Scaling");
} }
@Override @Override
public int getRowCount() { public int getRowCount() {
return layoutType == WBodyLayoutType.ABSOLUTE ? 2 : 1; return 1;
} }
@Override @Override
public TableCellRenderer getRenderer(int row) { public TableCellRenderer getRenderer(int row) {
if (layoutType == WBodyLayoutType.ABSOLUTE) {
return row == 0 ? layoutTypeRenderer : stateRenderer;
}
else {
return stateRenderer; return stateRenderer;
} }
}
@Override @Override
public TableCellEditor getEditor(int row) { public TableCellEditor getEditor(int row) {
if (layoutType == WBodyLayoutType.ABSOLUTE) {
return row == 0 ? layoutTypeEditor : stateEditor;
}
else{
return stateEditor; return stateEditor;
} }
}
@Override @Override
public Object getValue(int row, int column) { public Object getValue(int row, int column) {
if (layoutType == WBodyLayoutType.ABSOLUTE){
if (column == 0) {
switch (row) {
case 0:
return Inter.getLocText("FR-Designer_Attr_Layout_Type");
default:
return Inter.getLocText("FR-Designer-Widget_Scaling_Mode");
}
} else {
switch (row) {
case 0:
return layoutType.getTypeValue();
default:
return layout.getCompState();
}
}
}
if (column == 0) { if (column == 0) {
return Inter.getLocText("FR-Designer-Widget_Scaling_Mode"); return Inter.getLocText("FR-Designer-Widget_Scaling_Mode");
} else { } else {
@ -114,42 +67,6 @@ public class FRAbsoluteLayoutPropertiesGroupModel implements GroupModel {
@Override @Override
public boolean setValue(Object value, int row, int column) { public boolean setValue(Object value, int row, int column) {
if (layoutType == WBodyLayoutType.ABSOLUTE){
int state = 0;
if(value instanceof Integer) {
state = (Integer)value;
}
if (column == 0 || state < 0) {
return false;
} else {
if (row == 0) {
if (state == WBodyLayoutType.FIT.getTypeValue()) {
XWFitLayout xfl = (XWFitLayout) xwAbsoluteLayout.getBackupParent();
Component[] components = xwAbsoluteLayout.getComponents();
Arrays.sort(components, new ComparatorComponentLocation());
xfl.getLayoutAdapter().removeBean(xwAbsoluteLayout, xwAbsoluteLayout.getWidth(), xwAbsoluteLayout.getHeight());
xfl.remove(xwAbsoluteLayout);
xfl.toData().setLayoutType(WBodyLayoutType.FIT);
for (Component comp : components) {
xfl.add(comp);
}
moveComponents2FitLayout(xfl, components);
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner();
formDesigner.getSelectionModel().setSelectedCreators(
FormSelectionUtils.rebuildSelection(xfl, new Widget[]{xfl.toData()}));
return true;
}
}
if (row == 1) {
layout.setCompState(state);
return true;
}
return false;
}
}
int state = 0; int state = 0;
if(value instanceof Integer) { if(value instanceof Integer) {
state = (Integer)value; state = (Integer)value;
@ -174,95 +91,4 @@ public class FRAbsoluteLayoutPropertiesGroupModel implements GroupModel {
public boolean isEditable(int row) { public boolean isEditable(int row) {
return true; return true;
} }
//把绝对布局中的元素按规则移动到自适应布局中
private void moveComponents2FitLayout(XWFitLayout xwFitLayout, Component[] components) {
int eachRowCount = 4;
if (components.length <= 1){
return;
}
int layoutWidth = xwFitLayout.getWidth() - xwFitLayout.toData().getMargin().getLeft() - xwFitLayout.toData().getMargin().getRight();
int layoutHeight = xwFitLayout.getHeight() - xwFitLayout.toData().getMargin().getTop() - xwFitLayout.toData().getMargin().getBottom();
int leftMargin = xwFitLayout.toData().getMargin().getLeft();
int topMargin = xwFitLayout.toData().getMargin().getTop();
int row = (components.length / eachRowCount) + (components.length % eachRowCount == 0 ? 0 : 1);
//最后一行的列数不定
int column = components.length % eachRowCount;
int componentWidth = layoutWidth / eachRowCount;
int componentHeight = layoutHeight / row;
for(int i = 0;i < row - 1;i++){
for(int j = 0;j < eachRowCount;j++){
components[eachRowCount * i + j].setBounds(
leftMargin + componentWidth * j,
topMargin + componentHeight * i,
j == eachRowCount - 1 ? layoutWidth - componentWidth * (eachRowCount-1) : componentWidth,
componentHeight
);
}
}
//最后一行列数是特殊的,要单独处理
int lastRowWidth = layoutWidth / column;
int lastRowHeight = layoutHeight - componentHeight * (row - 1);
for (int i = 0;i < column;i++) {
components[eachRowCount * (row - 1) + i].setBounds(
leftMargin + lastRowWidth * i,
topMargin + componentHeight * (row - 1),
i == column - 1 ? layoutWidth - lastRowWidth * (column-1) : lastRowWidth,
lastRowHeight
);
}
xwFitLayout.updateBoundsWidget();
}
private class ComponentLocationInfo{
private Component component;
private int horizontalNO;
private int verticalNO;
public ComponentLocationInfo(Component component, int horizontalNO, int verticalNO){
this.component = component;
this.horizontalNO = horizontalNO;
this.verticalNO = verticalNO;
}
public int getHorizontalNO() {
return this.horizontalNO;
}
public int getVerticalNO() {
return this.verticalNO;
}
public void setHorizontalNO(int horizontalNO){
this.horizontalNO = horizontalNO;
}
public void setVerticalNO(int verticalNO){
this.verticalNO = verticalNO;
}
}
//以组件的位置来确定先后顺序,y小的在前,x小的在前
private class ComparatorComponentLocation implements Comparator {
@Override
public int compare(Object o1, Object o2) {
if(((Component)o1).getY() < ((Component)o2).getY()){
return -1;
}
else if (((Component)o1).getY() > ((Component)o2).getY()) {
return 1;
}
else {
if (((Component)o1).getX() < ((Component)o2).getX()){
return -1;
}
else if (((Component)o1).getX() > ((Component)o2).getX()) {
return 1;
}
else{
return 0;
}
}
}
}
} }

15
designer_form/src/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java

@ -4,7 +4,7 @@
package com.fr.design.designer.properties; package com.fr.design.designer.properties;
import com.fr.design.beans.GroupModel; import com.fr.design.beans.GroupModel;
import com.fr.design.designer.creator.XWAbsoluteLayout; import com.fr.design.designer.creator.XWAbsoluteBodyLayout;
import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelectionUtils; import com.fr.design.mainframe.FormSelectionUtils;
@ -14,6 +14,7 @@ import com.fr.design.mainframe.widget.editors.LayoutTypeEditor;
import com.fr.design.mainframe.widget.editors.IntegerPropertyEditor; import com.fr.design.mainframe.widget.editors.IntegerPropertyEditor;
import com.fr.design.mainframe.widget.editors.PropertyCellEditor; import com.fr.design.mainframe.widget.editors.PropertyCellEditor;
import com.fr.form.ui.Widget; import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WAbsoluteBodyLayout;
import com.fr.form.ui.container.WAbsoluteLayout; import com.fr.form.ui.container.WAbsoluteLayout;
import com.fr.form.ui.container.WBodyLayoutType; import com.fr.form.ui.container.WBodyLayoutType;
import com.fr.form.ui.container.WFitLayout; import com.fr.form.ui.container.WFitLayout;
@ -132,18 +133,18 @@ public class FRFitLayoutPropertiesGroupModel implements GroupModel {
}else if (row == 0) { }else if (row == 0) {
layout.setLayoutType(WBodyLayoutType.parse(state)); layout.setLayoutType(WBodyLayoutType.parse(state));
if (state == WBodyLayoutType.ABSOLUTE.getTypeValue()) { if (state == WBodyLayoutType.ABSOLUTE.getTypeValue()) {
WAbsoluteLayout wAbsoluteLayout = new WAbsoluteLayout("body"); WAbsoluteBodyLayout wAbsoluteBodyLayout = new WAbsoluteBodyLayout("body");
wAbsoluteLayout.setCompState(WAbsoluteLayout.STATE_FIXED); wAbsoluteBodyLayout.setCompState(WAbsoluteLayout.STATE_FIXED);
Component[] components = xfl.getComponents(); Component[] components = xfl.getComponents();
xfl.removeAll(); xfl.removeAll();
XWAbsoluteLayout xwAbsoluteLayout = new XWAbsoluteLayout(wAbsoluteLayout, new Dimension(0,0), true); XWAbsoluteBodyLayout xwAbsoluteBodyLayout = new XWAbsoluteBodyLayout(wAbsoluteBodyLayout, new Dimension(0,0));
xfl.getLayoutAdapter().addBean(xwAbsoluteLayout, 0, 0); xfl.getLayoutAdapter().addBean(xwAbsoluteBodyLayout, 0, 0);
for (Component component : components) { for (Component component : components) {
xwAbsoluteLayout.add(component); xwAbsoluteBodyLayout.add(component);
} }
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner();
formDesigner.getSelectionModel().setSelectedCreators( formDesigner.getSelectionModel().setSelectedCreators(
FormSelectionUtils.rebuildSelection(xfl, new Widget[]{wAbsoluteLayout})); FormSelectionUtils.rebuildSelection(xfl, new Widget[]{wAbsoluteBodyLayout}));
} }
else { else {
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner();

4
designer_form/src/com/fr/design/designer/properties/FitStateRenderer.java

@ -3,13 +3,11 @@
*/ */
package com.fr.design.designer.properties; package com.fr.design.designer.properties;
import com.fr.design.mainframe.widget.renderer.EncoderCellRenderer;
/** /**
* @author jim * @author jim
* @date 2014-7-31 * @date 2014-7-31
*/ */
public class FitStateRenderer extends EncoderCellRenderer{ public class FitStateRenderer extends BodyLayoutAttrRenderer{
/** /**
* @param encoder * @param encoder

4
designer_form/src/com/fr/design/designer/properties/LayoutTypeRenderer.java

@ -1,11 +1,9 @@
package com.fr.design.designer.properties; package com.fr.design.designer.properties;
import com.fr.design.mainframe.widget.renderer.EncoderCellRenderer;
/** /**
* Created by zhouping on 2016/9/18. * Created by zhouping on 2016/9/18.
*/ */
public class LayoutTypeRenderer extends EncoderCellRenderer { public class LayoutTypeRenderer extends BodyLayoutAttrRenderer {
public LayoutTypeRenderer() { public LayoutTypeRenderer() {
super(new LayoutTypeWrapper()); super(new LayoutTypeWrapper());

3
designer_form/src/com/fr/design/designer/treeview/ComponentTreeModel.java

@ -148,8 +148,7 @@ public class ComponentTreeModel implements TreeModel {
XWFitLayout bodyFitLayout = (XWFitLayout)xCreator; XWFitLayout bodyFitLayout = (XWFitLayout)xCreator;
for (int i = 0;i < bodyFitLayout.getXCreatorCount();i++){ for (int i = 0;i < bodyFitLayout.getXCreatorCount();i++){
//类型是绝对布局并且还是body //类型是绝对布局并且还是body
if (bodyFitLayout.getXCreator(i).acceptType(XWAbsoluteLayout.class) if (bodyFitLayout.getXCreator(i).acceptType(XWAbsoluteBodyLayout.class)){
&& ((XWAbsoluteLayout)bodyFitLayout.getXCreator(i)).toData().isAbsoluteLayoutAsBody()){
index = i; index = i;
} }
} }

10
designer_form/src/com/fr/design/mainframe/ComponentTree.java

@ -16,10 +16,7 @@ import com.fr.design.designer.beans.AdapterBus;
import com.fr.design.designer.beans.ComponentAdapter; import com.fr.design.designer.beans.ComponentAdapter;
import com.fr.design.designer.beans.events.DesignerEditListener; import com.fr.design.designer.beans.events.DesignerEditListener;
import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.*;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.designer.treeview.ComponentTreeCellRenderer; import com.fr.design.designer.treeview.ComponentTreeCellRenderer;
import com.fr.design.designer.treeview.ComponentTreeModel; import com.fr.design.designer.treeview.ComponentTreeModel;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
@ -244,10 +241,9 @@ public class ComponentTree extends JTree {
creator.notShowInComponentTree(path); creator.notShowInComponentTree(path);
} }
//绝对布局作为body的时候不显示自适应布局父层 //绝对布局作为body的时候不显示自适应布局父层
if (((XCreator) parent).acceptType(XWAbsoluteLayout.class) if (((XCreator) parent).acceptType(XWAbsoluteBodyLayout.class)
&& (parent.getParent() != null) && (parent.getParent() != null)
&& ((XCreator)parent.getParent()).acceptType(XWFitLayout.class) && ((XCreator)parent.getParent()).acceptType(XWFitLayout.class)){
&& ((XWAbsoluteLayout)parent).toData().isAbsoluteLayoutAsBody()){
parent = parent.getParent().getParent(); parent = parent.getParent().getParent();
continue; continue;
} }

3
designer_form/src/com/fr/design/mainframe/widget/wrappers/TreeModelWrapper.java

@ -7,6 +7,7 @@ import com.fr.design.Exception.ValidationException;
import com.fr.design.designer.properties.Decoder; import com.fr.design.designer.properties.Decoder;
import com.fr.design.designer.properties.Encoder; import com.fr.design.designer.properties.Encoder;
import com.fr.general.Inter; import com.fr.general.Inter;
import com.fr.general.NameObject;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
public class TreeModelWrapper implements Encoder, Decoder { public class TreeModelWrapper implements Encoder, Decoder {
@ -21,6 +22,8 @@ public class TreeModelWrapper implements Encoder, Decoder {
} else if (v instanceof TreeNodeWrapper) { } else if (v instanceof TreeNodeWrapper) {
TreeNodeAttr[] treeNodeAttrs = ((TreeNodeWrapper) v).getTreeNodeAttrs(); TreeNodeAttr[] treeNodeAttrs = ((TreeNodeWrapper) v).getTreeNodeAttrs();
return TemplateUtils.render(Inter.getLocText("FR-Designer_Total_N_Grade"), new String[]{"N"}, new String[]{treeNodeAttrs.length + ""}); return TemplateUtils.render(Inter.getLocText("FR-Designer_Total_N_Grade"), new String[]{"N"}, new String[]{treeNodeAttrs.length + ""});
} else if (v instanceof NameObject) {
return Inter.getLocText("FR-Designer_DataTable-Build");
} else { } else {
return Inter.getLocText("FR-Designer_Auto-Build"); return Inter.getLocText("FR-Designer_Auto-Build");
} }

Loading…
Cancel
Save