diff --git a/designer_base/src/com/fr/design/gui/frpane/TreeSettingPane.java b/designer_base/src/com/fr/design/gui/frpane/TreeSettingPane.java index 1039cfac6c..8bf384b313 100644 --- a/designer_base/src/com/fr/design/gui/frpane/TreeSettingPane.java +++ b/designer_base/src/com/fr/design/gui/frpane/TreeSettingPane.java @@ -1,44 +1,52 @@ 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.TreeAttr; 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.NameableCreator; +import com.fr.design.gui.frpane.tree.layer.config.LayerDataControlPane; 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.layout.FRGUIPaneFactory; -import com.fr.design.dialog.BasicPane; import com.fr.form.ui.TreeComboBoxEditor; import com.fr.form.ui.TreeEditor; +import com.fr.form.ui.tree.LayerConfig; 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 { private JTreeControlPane controlPane; + private JTreeAutoBuildPane autoBuildPane; + + /** + * 新的分层构建方式 + */ + private LayerDataControlPane layerDataControlPane; + 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"), - Inter.getLocText("FR-Designer_Auto-Build") }; + private String[] buildWay = new String[]{Inter.getLocText("FR-Designer_DataTable-Build"), + Inter.getLocText("FR-Designer_Auto-Build"), Inter.getLocText("FR-Designer_Layer-Build")}; public TreeSettingPane(boolean isEditor) { this.initComponents(isEditor); - } + } private void initComponents(boolean isEditor) { this.setLayout(FRGUIPaneFactory.createBorderLayout()); @@ -58,18 +66,34 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { controlPane = new JTreeControlPane(new NameableCreator[] { treeNode }, new TreeDataCardPane(), isEditor); autoBuildPane = new JTreeAutoBuildPane(); - this.add(buildWayPanel, BorderLayout.NORTH); - cardChanged(0); - } - + layerDataControlPane = new LayerDataControlPane(); + this.add(buildWayPanel, BorderLayout.NORTH); + cardChanged(0); + } + private void cardChanged(int index) { + this.remove(controlPane); this.remove(autoBuildPane); - this.add(index == 0 ? controlPane : autoBuildPane, BorderLayout.CENTER); - validate(); - repaint(); - revalidate(); - } + 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(); + repaint(); + revalidate(); + } @Override protected String title4PopupWindow() { @@ -101,10 +125,19 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { buildBox.setSelectedIndex(1); TableDataDictionary dictionary = treeEditor.getDictionary(); autoBuildPane.populate(dictionary); - } else { - buildBox.setSelectedIndex(0); - } - } + } else if (treeEditor.isLayerBuild()) { + buildBox.setSelectedIndex(0); + java.util.List 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); + } + } /** * 视图树的update @@ -123,43 +156,46 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { te.setAutoBuild(true); te.setDictionary(dictionary); te.setNodeOrDict(dictionary); - } else { + } else if (buildBox.getSelectedIndex() == 2) { te.setAutoBuild(false); NameObject no = this.controlPane.update(); if (no != null) { TreeEditor editor = (TreeEditor) no.getObject(); - te.setAllowBlank(editor.isAllowBlank()); - te.setEnabled(editor.isEnabled()); - te.setDirectEdit(editor.isDirectEdit()); - te.setErrorMessage(editor.getErrorMessage()); - te.setWidgetName(editor.getWidgetName()); - te.setVisible(editor.isVisible()); - te.setWaterMark(editor.getWaterMark()); - te.setRemoveRepeat(editor.isRemoveRepeat()); - te.setTreeAttr(editor.getTreeAttr()); - te.setTreeNodeAttr(editor.getTreeNodeAttr()); - te.setNodeOrDict(editor.getTreeNodeAttr()); - te.setPerformanceFirst(editor.isPerformanceFirst()); - } - } - return te; - } + te.setAllowBlank(editor.isAllowBlank()); + te.setEnabled(editor.isEnabled()); + te.setDirectEdit(editor.isDirectEdit()); + te.setErrorMessage(editor.getErrorMessage()); + te.setWidgetName(editor.getWidgetName()); + te.setVisible(editor.isVisible()); + te.setWaterMark(editor.getWaterMark()); + te.setRemoveRepeat(editor.isRemoveRepeat()); + te.setTreeAttr(editor.getTreeAttr()); + te.setTreeNodeAttr(editor.getTreeNodeAttr()); + te.setNodeOrDict(editor.getTreeNodeAttr()); + te.setPerformanceFirst(editor.isPerformanceFirst()); + } + } + return te; + } /** * 树节点属性的update * @return */ public Object updateTreeNodeAttrs() { - if(buildBox.getSelectedIndex() == 0) { - NameObject no = controlPane.update(); - if (no != null) { - return no.getObject(); + + if (buildBox.getSelectedIndex() == 2) { + NameObject no = controlPane.update(); + if (no != null) { + return no.getObject(); } - } else { - return autoBuildPane.update(); - } - return null; - } + } else if (buildBox.getSelectedIndex() == 0) { + return layerDataControlPane.update(); + } else { + return autoBuildPane.update(); + } + return null; + } /** * 下拉树的update @@ -172,7 +208,7 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { tcb.setAutoBuild(true); tcb.setDictionary(dictionary); tcb.setNodeOrDict(dictionary); - } else { + } else if (buildBox.getSelectedIndex() == 2) { tcb.setAutoBuild(false); NameObject no = this.controlPane.update(); if (no != null) { @@ -204,12 +240,15 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { */ public void populate(Object nodeOrDict) { if(nodeOrDict instanceof TreeNodeAttr[] || nodeOrDict instanceof TreeNodeWrapper) { - buildBox.setSelectedIndex(0); - NameObject no = new NameObject("name", nodeOrDict); - controlPane.populate(no); - } else if(nodeOrDict instanceof TableDataDictionary) { + buildBox.setSelectedIndex(2); + NameObject no = new NameObject("name", nodeOrDict); + controlPane.populate(no); + } else if(nodeOrDict instanceof TableDataDictionary) { buildBox.setSelectedIndex(1); autoBuildPane.populate((TableDataDictionary)nodeOrDict); - } - } + } else if (nodeOrDict instanceof NameObject) { + buildBox.setSelectedIndex(0); + layerDataControlPane.populate((NameObject) nodeOrDict); + } + } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataConfigPane.java b/designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataConfigPane.java new file mode 100644 index 0000000000..c67dd08d9e --- /dev/null +++ b/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 { + + /** + * 数据集数据字典选择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 columnNames; + if (wrapper != null) { + columnNames = wrapper.calculateColumnNameList(); + } else { + columnNames = new ArrayList(); + } + 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 dependenceList = dependenceSettingPane.updateLayerDependence(); + layerConfig.getDependenceList().clear(); + layerConfig.addAll(dependenceList); + return layerConfig; + } + + @Override + protected String title4PopupWindow() { + + return "Layer Data Config Panel"; + } + + +} diff --git a/designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java b/designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java new file mode 100644 index 0000000000..0ff6164b67 --- /dev/null +++ b/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 nodeList = new ArrayList(); + + 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"; + } + +} diff --git a/designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDependenceSettingPane.java b/designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDependenceSettingPane.java new file mode 100644 index 0000000000..0411afd46c --- /dev/null +++ b/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 dependenceList) { + + this.currentLayerIndex = layerIndex; + //更新Editor + this.layerIndexEditor.layerChanged(layerIndex); + this.fieldEditor.layerChanged(); + + this.model.clear(); + this.model.addAll(dependenceList); + } + + + public List 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 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 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 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 columnNames = getColumnNameList(this.tableDataDictPane); + layerChoseCombobox.removeAllItems(); + for (String columnName : columnNames) { + + layerChoseCombobox.addItem(columnName); + } + } + } + + private static List getColumnNameList(TableDataDictPane tableDataDictPane) { + + TableDataWrapper wrapper = tableDataDictPane.tableDataNameComboBox.getSelectedItem(); + if (wrapper == null) { + return new ArrayList(); + } else { + return wrapper.calculateColumnNameList(); + } + } + + private static class LayerDepenceTableModel extends AbstractTableModel { + + private List dependences; + + public LayerDepenceTableModel() { + + dependences = new ArrayList(); + } + + /** + * 添加一条数据,该方法会请求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 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 update() { + + return this.dependences; + } + } + + +} + + diff --git a/designer_base/src/com/fr/design/images/control/combobox.png b/designer_base/src/com/fr/design/images/control/combobox.png new file mode 100644 index 0000000000..6e5be84e73 Binary files /dev/null and b/designer_base/src/com/fr/design/images/control/combobox.png differ diff --git a/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteBodyLayoutAdapter.java b/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteBodyLayoutAdapter.java new file mode 100644 index 0000000000..e06bb74634 --- /dev/null +++ b/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); + } +} diff --git a/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java b/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java index 8e0a725cd4..c49ecf0f38 100644 --- a/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java +++ b/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java @@ -331,15 +331,6 @@ public class FRAbsoluteLayoutAdapter extends FRBodyLayoutAdapter { @Override public GroupModel getLayoutProperties() { 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); } } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java b/designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java index 19cfe2d8d1..e0fc683552 100644 --- a/designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java +++ b/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(WParameterLayout.class, XWParameterLayout.class); + xLayoutMap.put(WAbsoluteBodyLayout.class, XWAbsoluteBodyLayout.class); xLayoutMap.put(WAbsoluteLayout.class, XWAbsoluteLayout.class); xLayoutMap.put(WHorizontalBoxLayout.class, XWHorizontalBoxLayout.class); xLayoutMap.put(WBorderLayout.class, XWBorderLayout.class); diff --git a/designer_form/src/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java b/designer_form/src/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java new file mode 100644 index 0000000000..b9fea0a0bf --- /dev/null +++ b/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); + } +} diff --git a/designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java b/designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java index 9ac9addc7f..210343f8ed 100644 --- a/designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java +++ b/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)); } - this.editable = widget.isAbsoluteLayoutAsBody(); - - initPercent(); - } - - public XWAbsoluteLayout(WAbsoluteLayout widget, Dimension initSize, boolean isAbsoluteLayoutAsBody) { - this(widget, initSize); - widget.setAbsoluteLayoutAsBody(isAbsoluteLayoutAsBody); - this.editable = isAbsoluteLayoutAsBody; + initPercent(widget); } /** @@ -97,13 +89,14 @@ public class XWAbsoluteLayout extends XLayoutContainer { } //根据屏幕大小来确定显示的百分比, 1440*900默认100%, 1366*768缩放90% - private void initPercent(){ + private void initPercent(WAbsoluteLayout widget){ Toolkit toolkit = Toolkit.getDefaultToolkit(); Dimension scrnsize = toolkit.getScreenSize(); double screenValue = FRScreen.getByDimension(scrnsize).getValue(); if(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); - } } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/properties/AbsoluteStateRenderer.java b/designer_form/src/com/fr/design/designer/properties/AbsoluteStateRenderer.java index 4cc770eec8..e58c7f8abd 100644 --- a/designer_form/src/com/fr/design/designer/properties/AbsoluteStateRenderer.java +++ b/designer_form/src/com/fr/design/designer/properties/AbsoluteStateRenderer.java @@ -1,11 +1,10 @@ package com.fr.design.designer.properties; -import com.fr.design.mainframe.widget.renderer.EncoderCellRenderer; - /** * Created by zhouping on 2016/8/1. */ -public class AbsoluteStateRenderer extends EncoderCellRenderer { +public class AbsoluteStateRenderer extends BodyLayoutAttrRenderer { + public AbsoluteStateRenderer() { super(new AbsoluteStateWrapper()); } diff --git a/designer_form/src/com/fr/design/designer/properties/BodyLayoutAttrRenderer.java b/designer_form/src/com/fr/design/designer/properties/BodyLayoutAttrRenderer.java new file mode 100644 index 0000000000..be05e45986 --- /dev/null +++ b/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); + } +} diff --git a/designer_form/src/com/fr/design/designer/properties/FRAbsoluteBodyLayoutPropertiesGroupModel.java b/designer_form/src/com/fr/design/designer/properties/FRAbsoluteBodyLayoutPropertiesGroupModel.java new file mode 100644 index 0000000000..1a7ab03d3f --- /dev/null +++ b/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; + } + } + } + } +} diff --git a/designer_form/src/com/fr/design/designer/properties/FRAbsoluteLayoutPropertiesGroupModel.java b/designer_form/src/com/fr/design/designer/properties/FRAbsoluteLayoutPropertiesGroupModel.java index f8b695a333..66540fe068 100644 --- a/designer_form/src/com/fr/design/designer/properties/FRAbsoluteLayoutPropertiesGroupModel.java +++ b/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.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.IntegerPropertyEditor; -import com.fr.design.mainframe.widget.editors.LayoutTypeEditor; 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.WBodyLayoutType; import com.fr.general.Inter; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; -import java.awt.*; -import java.util.Arrays; -import java.util.Comparator; /** * Created by zhouping on 2016/8/1. */ public class FRAbsoluteLayoutPropertiesGroupModel implements GroupModel { + private PropertyCellEditor editor; private DefaultTableCellRenderer renderer; - private AbsoluteLayoutDirectionEditor stateEditor; - private AbsoluteStateRenderer stateRenderer; - private WAbsoluteLayout layout; - private XWAbsoluteLayout xwAbsoluteLayout; - private LayoutTypeEditor layoutTypeEditor; - private LayoutTypeRenderer layoutTypeRenderer; - //默认body是0,自适应布局;1,绝对布局. - private WBodyLayoutType layoutType = WBodyLayoutType.FIT; + protected AbsoluteLayoutDirectionEditor stateEditor; + protected AbsoluteStateRenderer stateRenderer; + protected WAbsoluteLayout layout; + protected XWAbsoluteLayout xwAbsoluteLayout; public FRAbsoluteLayoutPropertiesGroupModel(XWAbsoluteLayout xwAbsoluteLayout){ this.xwAbsoluteLayout = xwAbsoluteLayout; @@ -46,65 +33,31 @@ public class FRAbsoluteLayoutPropertiesGroupModel implements GroupModel { stateRenderer = new AbsoluteStateRenderer(); } - public FRAbsoluteLayoutPropertiesGroupModel(XWAbsoluteLayout xwAbsoluteLayout, WBodyLayoutType layoutType){ - this(xwAbsoluteLayout); - this.layoutTypeEditor = new LayoutTypeEditor(); - this.layoutTypeRenderer = new LayoutTypeRenderer(); - this.layoutType = layoutType; - } - /** * 布局管理器自己的属性 */ @Override 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 public int getRowCount() { - return layoutType == WBodyLayoutType.ABSOLUTE ? 2 : 1; + return 1; } @Override public TableCellRenderer getRenderer(int row) { - if (layoutType == WBodyLayoutType.ABSOLUTE) { - return row == 0 ? layoutTypeRenderer : stateRenderer; - } - else { - return stateRenderer; - } + return stateRenderer; } @Override public TableCellEditor getEditor(int row) { - if (layoutType == WBodyLayoutType.ABSOLUTE) { - return row == 0 ? layoutTypeEditor : stateEditor; - } - else{ - return stateEditor; - } + return stateEditor; } @Override 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) { return Inter.getLocText("FR-Designer-Widget_Scaling_Mode"); } else { @@ -114,42 +67,6 @@ public class FRAbsoluteLayoutPropertiesGroupModel implements GroupModel { @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()})); - return true; - } - } - if (row == 1) { - layout.setCompState(state); - return true; - } - return false; - } - } int state = 0; if(value instanceof Integer) { state = (Integer)value; @@ -174,95 +91,4 @@ public class FRAbsoluteLayoutPropertiesGroupModel implements GroupModel { 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; - 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; - } - } - } - } } diff --git a/designer_form/src/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java b/designer_form/src/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java index 25680581c0..f6b8ccaf22 100644 --- a/designer_form/src/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java +++ b/designer_form/src/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java @@ -4,7 +4,7 @@ package com.fr.design.designer.properties; 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.mainframe.FormDesigner; 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.PropertyCellEditor; 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.WBodyLayoutType; import com.fr.form.ui.container.WFitLayout; @@ -132,18 +133,18 @@ public class FRFitLayoutPropertiesGroupModel implements GroupModel { }else if (row == 0) { layout.setLayoutType(WBodyLayoutType.parse(state)); if (state == WBodyLayoutType.ABSOLUTE.getTypeValue()) { - WAbsoluteLayout wAbsoluteLayout = new WAbsoluteLayout("body"); - wAbsoluteLayout.setCompState(WAbsoluteLayout.STATE_FIXED); + WAbsoluteBodyLayout wAbsoluteBodyLayout = new WAbsoluteBodyLayout("body"); + wAbsoluteBodyLayout.setCompState(WAbsoluteLayout.STATE_FIXED); Component[] components = xfl.getComponents(); xfl.removeAll(); - XWAbsoluteLayout xwAbsoluteLayout = new XWAbsoluteLayout(wAbsoluteLayout, new Dimension(0,0), true); - xfl.getLayoutAdapter().addBean(xwAbsoluteLayout, 0, 0); + XWAbsoluteBodyLayout xwAbsoluteBodyLayout = new XWAbsoluteBodyLayout(wAbsoluteBodyLayout, new Dimension(0,0)); + xfl.getLayoutAdapter().addBean(xwAbsoluteBodyLayout, 0, 0); for (Component component : components) { - xwAbsoluteLayout.add(component); + xwAbsoluteBodyLayout.add(component); } FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); formDesigner.getSelectionModel().setSelectedCreators( - FormSelectionUtils.rebuildSelection(xfl, new Widget[]{wAbsoluteLayout})); + FormSelectionUtils.rebuildSelection(xfl, new Widget[]{wAbsoluteBodyLayout})); } else { FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); diff --git a/designer_form/src/com/fr/design/designer/properties/FitStateRenderer.java b/designer_form/src/com/fr/design/designer/properties/FitStateRenderer.java index dfaa1939b6..933c0d17ce 100644 --- a/designer_form/src/com/fr/design/designer/properties/FitStateRenderer.java +++ b/designer_form/src/com/fr/design/designer/properties/FitStateRenderer.java @@ -3,13 +3,11 @@ */ package com.fr.design.designer.properties; -import com.fr.design.mainframe.widget.renderer.EncoderCellRenderer; - /** * @author jim * @date 2014-7-31 */ -public class FitStateRenderer extends EncoderCellRenderer{ +public class FitStateRenderer extends BodyLayoutAttrRenderer{ /** * @param encoder diff --git a/designer_form/src/com/fr/design/designer/properties/LayoutTypeRenderer.java b/designer_form/src/com/fr/design/designer/properties/LayoutTypeRenderer.java index 033552028b..4061245d75 100644 --- a/designer_form/src/com/fr/design/designer/properties/LayoutTypeRenderer.java +++ b/designer_form/src/com/fr/design/designer/properties/LayoutTypeRenderer.java @@ -1,11 +1,9 @@ package com.fr.design.designer.properties; -import com.fr.design.mainframe.widget.renderer.EncoderCellRenderer; - /** * Created by zhouping on 2016/9/18. */ -public class LayoutTypeRenderer extends EncoderCellRenderer { +public class LayoutTypeRenderer extends BodyLayoutAttrRenderer { public LayoutTypeRenderer() { super(new LayoutTypeWrapper()); diff --git a/designer_form/src/com/fr/design/designer/treeview/ComponentTreeModel.java b/designer_form/src/com/fr/design/designer/treeview/ComponentTreeModel.java index e94ea1ad05..c39ea73b51 100644 --- a/designer_form/src/com/fr/design/designer/treeview/ComponentTreeModel.java +++ b/designer_form/src/com/fr/design/designer/treeview/ComponentTreeModel.java @@ -148,8 +148,7 @@ public class ComponentTreeModel implements TreeModel { XWFitLayout bodyFitLayout = (XWFitLayout)xCreator; for (int i = 0;i < bodyFitLayout.getXCreatorCount();i++){ //类型是绝对布局并且还是body - if (bodyFitLayout.getXCreator(i).acceptType(XWAbsoluteLayout.class) - && ((XWAbsoluteLayout)bodyFitLayout.getXCreator(i)).toData().isAbsoluteLayoutAsBody()){ + if (bodyFitLayout.getXCreator(i).acceptType(XWAbsoluteBodyLayout.class)){ index = i; } } diff --git a/designer_form/src/com/fr/design/mainframe/ComponentTree.java b/designer_form/src/com/fr/design/mainframe/ComponentTree.java index a2c5b55e5e..ca84e44c03 100644 --- a/designer_form/src/com/fr/design/mainframe/ComponentTree.java +++ b/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.events.DesignerEditListener; import com.fr.design.designer.beans.events.DesignerEvent; -import com.fr.design.designer.creator.XCreator; -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.creator.*; import com.fr.design.designer.treeview.ComponentTreeCellRenderer; import com.fr.design.designer.treeview.ComponentTreeModel; import com.fr.stable.StringUtils; @@ -244,10 +241,9 @@ public class ComponentTree extends JTree { creator.notShowInComponentTree(path); } //绝对布局作为body的时候不显示自适应布局父层 - if (((XCreator) parent).acceptType(XWAbsoluteLayout.class) + if (((XCreator) parent).acceptType(XWAbsoluteBodyLayout.class) && (parent.getParent() != null) - && ((XCreator)parent.getParent()).acceptType(XWFitLayout.class) - && ((XWAbsoluteLayout)parent).toData().isAbsoluteLayoutAsBody()){ + && ((XCreator)parent.getParent()).acceptType(XWFitLayout.class)){ parent = parent.getParent().getParent(); continue; } diff --git a/designer_form/src/com/fr/design/mainframe/widget/wrappers/TreeModelWrapper.java b/designer_form/src/com/fr/design/mainframe/widget/wrappers/TreeModelWrapper.java index 10ab5f2729..17f9d0c891 100644 --- a/designer_form/src/com/fr/design/mainframe/widget/wrappers/TreeModelWrapper.java +++ b/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.Encoder; import com.fr.general.Inter; +import com.fr.general.NameObject; import com.fr.stable.StringUtils; public class TreeModelWrapper implements Encoder, Decoder { @@ -21,6 +22,8 @@ public class TreeModelWrapper implements Encoder, Decoder { } else if (v instanceof TreeNodeWrapper) { TreeNodeAttr[] treeNodeAttrs = ((TreeNodeWrapper) v).getTreeNodeAttrs(); 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 { return Inter.getLocText("FR-Designer_Auto-Build"); }