Quellcode durchsuchen

风险管理9月24日提交代码-liu.bolan-天津掉期

Liu.bolan vor 4 Jahren
Ursprung
Commit
dce6d4fcf1
21 geänderte Dateien mit 1756 neuen und 15 gelöschten Zeilen
  1. 10 0
      RMA/app/src/main/java/cn/muchinfo/rma/global/GlobalDataCollection.kt
  2. 210 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/TreeNode.java
  3. 206 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/TreeView.java
  4. 277 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/TreeViewAdapter.java
  5. 70 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/base/BaseNodeViewBinder.java
  6. 56 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/base/BaseNodeViewFactory.java
  7. 51 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/base/BaseTreeAction.java
  8. 48 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/base/CheckableNodeViewBinder.java
  9. 36 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/base/SelectableTreeAction.java
  10. 291 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/helper/TreeHelper.java
  11. 91 15
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/AddRoleSetActivity.kt
  12. 44 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/rootviewfactory/FirstLevelNodeViewBinder.java
  13. 30 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/rootviewfactory/FourLevelNodeViewBinder.java
  14. 47 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/rootviewfactory/MyNodeViewFactory.java
  15. 46 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/rootviewfactory/SecondLevelNodeViewBinder.java
  16. 45 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/rootviewfactory/ThirdLevelNodeViewBinder.java
  17. 9 0
      RMA/app/src/main/res/drawable/ic_keyboard_arrow_right_white_24px.xml
  18. 49 0
      RMA/app/src/main/res/layout/item_first_level.xml
  19. 43 0
      RMA/app/src/main/res/layout/item_four_level.xml
  20. 48 0
      RMA/app/src/main/res/layout/item_second_level.xml
  21. 49 0
      RMA/app/src/main/res/layout/item_third_level.xml

+ 10 - 0
RMA/app/src/main/java/cn/muchinfo/rma/global/GlobalDataCollection.kt

@@ -43,6 +43,16 @@ class GlobalDataCollection : BaseGlobalData() {
     }
 
     /**
+     * 获取四级菜单权限
+     */
+    fun getFourLevelMenu(firstCode : String,secondCode : String,threeCode : String,fourCode : String) : Boolean{
+        val secondChildList = ermcpRoleFuncMenuDataArrayList.find { firstCode == it.code }?.children
+        val threeChildList = secondChildList?.find { secondCode == it.code }?.children
+        val fourChildList  = threeChildList?.find { threeCode == it.code }?.children
+        return fourChildList?.find { fourCode == it.code }?.isshow ?: false
+    }
+
+    /**
      * 根据trademode 获取marketid
      * @return Long
      */

+ 210 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/TreeNode.java

@@ -0,0 +1,210 @@
+/*
+ * Copyright 2016 - 2017 ShineM (Xinyuan)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
+ * file except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+ * ANY KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under.
+ */
+
+package cn.muchinfo.rma.view.autoWidget.treeview;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import cn.muchinfo.rma.view.autoWidget.treeview.helper.TreeHelper;
+
+
+/**
+ * Created by xinyuanzhong on 2017/4/20.
+ */
+
+public class TreeNode {
+    private int level;
+
+    private Object value;
+
+    private TreeNode parent;
+
+    //用于选择后提交的给服务的code
+    private String code;
+
+    private List<TreeNode> children;
+
+    private int index;
+
+    private boolean expanded;
+
+    private boolean selected;
+
+    private boolean itemClickEnable = true;
+
+    public TreeNode(Object value) {
+        this.value = value;
+        this.children = new ArrayList<>();
+    }
+
+    public TreeNode(Object value, int level) {
+        this(value);
+        setLevel(level);
+    }
+
+    public static TreeNode root() {
+        TreeNode treeNode = new TreeNode(null);
+        return treeNode;
+    }
+
+    public void addChild(TreeNode treeNode) {
+        if (treeNode == null) {
+            return;
+        }
+        children.add(treeNode);
+        treeNode.setIndex(getChildren().size());
+        treeNode.setParent(this);
+    }
+
+
+    public void removeChild(TreeNode treeNode) {
+        if (treeNode == null || getChildren().size() < 1) {
+            return;
+        }
+        if (getChildren().indexOf(treeNode) != -1) {
+            getChildren().remove(treeNode);
+        }
+    }
+
+    public boolean isLastChild() {
+        if (parent == null) {
+            return false;
+        }
+        List<TreeNode> children = parent.getChildren();
+        return children.size() > 0 && children.indexOf(this) == children.size() - 1;
+    }
+
+    public boolean isRoot() {
+        return parent == null;
+    }
+
+    public int getLevel() {
+        return level;
+    }
+
+    public void setLevel(int level) {
+        this.level = level;
+    }
+
+    public Object getValue() {
+        return value;
+    }
+
+    public void setValue(Object value) {
+        this.value = value;
+    }
+
+    public TreeNode getParent() {
+        return parent;
+    }
+
+    public void setParent(TreeNode parent) {
+        this.parent = parent;
+    }
+
+    public List<TreeNode> getChildren() {
+        if (children == null) {
+            return new ArrayList<>();
+        }
+        return children;
+    }
+
+    public List<TreeNode> getSelectedChildren() {
+        List<TreeNode> selectedChildren = new ArrayList<>();
+        for (TreeNode child : getChildren()) {
+            if (child.isSelected()) {
+                selectedChildren.add(child);
+            }
+        }
+        return selectedChildren;
+    }
+    
+    public void setChildren(List<TreeNode> children) {
+        if (children == null) {
+            return;
+        }        
+        this.children = new ArrayList<>();
+        for (TreeNode child : children) {
+            addChild(child);
+        }
+    }
+
+    /**
+     * Updating the list of children while maintaining the tree structure
+     */
+    public void updateChildren(List<TreeNode> children) {
+        List<Boolean> expands = new ArrayList<>();
+        List<TreeNode> allNodesPre = TreeHelper.getAllNodes(this);
+        for (TreeNode node : allNodesPre) {
+            expands.add(node.isExpanded());
+        }
+
+        this.children = children;
+        List<TreeNode> allNodes = TreeHelper.getAllNodes(this);
+        if (allNodes.size() == expands.size()) {
+            for (int i = 0; i < allNodes.size(); i++) {
+                allNodes.get(i).setExpanded(expands.get(i));
+            }
+        }
+    }
+
+    public void setExpanded(boolean expanded) {
+        this.expanded = expanded;
+    }
+
+    public boolean isExpanded() {
+        return expanded;
+    }
+
+    public boolean hasChild() {
+        return children.size() > 0;
+    }
+
+    public boolean isItemClickEnable() {
+        return itemClickEnable;
+    }
+
+    public void setItemClickEnable(boolean itemClickEnable) {
+        this.itemClickEnable = itemClickEnable;
+    }
+
+    public String getId() {
+        return getLevel() + "," + getIndex();
+    }
+
+    public int getIndex() {
+        return index;
+    }
+
+    public void setIndex(int index) {
+        this.index = index;
+    }
+
+    public boolean isSelected() {
+        return selected;
+    }
+
+    public void setSelected(boolean selected) {
+        this.selected = selected;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+}

+ 206 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/TreeView.java

@@ -0,0 +1,206 @@
+/*
+ * Copyright 2016 - 2017 ShineM (Xinyuan)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
+ * file except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+ * ANY KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under.
+ */
+
+package cn.muchinfo.rma.view.autoWidget.treeview;
+
+import android.content.Context;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.recyclerview.widget.SimpleItemAnimator;
+
+import java.util.List;
+
+import cn.muchinfo.rma.view.autoWidget.treeview.base.BaseNodeViewFactory;
+import cn.muchinfo.rma.view.autoWidget.treeview.base.SelectableTreeAction;
+import cn.muchinfo.rma.view.autoWidget.treeview.helper.TreeHelper;
+
+
+/**
+ * Created by xinyuanzhong on 2017/4/20.
+ */
+
+public class TreeView implements SelectableTreeAction {
+    private TreeNode root;
+
+    private Context context;
+
+    private BaseNodeViewFactory baseNodeViewFactory;
+
+    private RecyclerView rootView;
+
+    private TreeViewAdapter adapter;
+
+    private boolean itemSelectable = true;
+
+    public TreeView(@NonNull TreeNode root, @NonNull Context context, @NonNull BaseNodeViewFactory baseNodeViewFactory) {
+        this.root = root;
+        this.context = context;
+        this.baseNodeViewFactory = baseNodeViewFactory;
+        if (baseNodeViewFactory == null) {
+            throw new IllegalArgumentException("You must assign a BaseNodeViewFactory!");
+        }
+    }
+
+    public View getView() {
+        if (rootView == null) {
+            this.rootView = buildRootView();
+        }
+
+        return rootView;
+    }
+
+    @NonNull
+    private RecyclerView buildRootView() {
+        RecyclerView recyclerView = new RecyclerView(context);
+        /**
+         * disable multi touch event to prevent terrible data set error when calculate list.
+         */
+        recyclerView.setMotionEventSplittingEnabled(false);
+        ((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
+
+        recyclerView.setLayoutManager(new LinearLayoutManager(context));
+        adapter = new TreeViewAdapter(context, root, baseNodeViewFactory);
+        adapter.setTreeView(this);
+        recyclerView.setAdapter(adapter);
+        return recyclerView;
+    }
+
+    @Override
+    public void expandAll() {
+        if (root == null) {
+            return;
+        }
+        TreeHelper.expandAll(root);
+
+        refreshTreeView();
+    }
+
+
+    public void refreshTreeView() {
+        if (rootView != null) {
+            ((TreeViewAdapter) rootView.getAdapter()).refreshView();
+        }
+    }
+
+    public void updateTreeView() {
+        if (rootView != null) {
+            rootView.getAdapter().notifyDataSetChanged();
+        }
+    }
+
+    @Override
+    public void expandNode(TreeNode treeNode) {
+        adapter.expandNode(treeNode);
+    }
+
+    @Override
+    public void expandLevel(int level) {
+        TreeHelper.expandLevel(root, level);
+
+        refreshTreeView();
+    }
+
+    @Override
+    public void collapseAll() {
+        if (root == null) {
+            return;
+        }
+        TreeHelper.collapseAll(root);
+
+        refreshTreeView();
+    }
+
+    @Override
+    public void collapseNode(TreeNode treeNode) {
+        adapter.collapseNode(treeNode);
+    }
+
+    @Override
+    public void collapseLevel(int level) {
+        TreeHelper.collapseLevel(root, level);
+
+        refreshTreeView();
+    }
+
+    @Override
+    public void toggleNode(TreeNode treeNode) {
+        if (treeNode.isExpanded()) {
+            collapseNode(treeNode);
+        } else {
+            expandNode(treeNode);
+        }
+    }
+
+    @Override
+    public void deleteNode(TreeNode node) {
+        adapter.deleteNode(node);
+    }
+
+    @Override
+    public void addNode(TreeNode parent, TreeNode treeNode) {
+        parent.addChild(treeNode);
+
+        refreshTreeView();
+    }
+
+    @Override
+    public List<TreeNode> getAllNodes() {
+        return TreeHelper.getAllNodes(root);
+    }
+
+    @Override
+    public void selectNode(TreeNode treeNode) {
+        if (treeNode != null) {
+            adapter.selectNode(true, treeNode);
+        }
+    }
+
+    @Override
+    public void deselectNode(TreeNode treeNode) {
+        if (treeNode != null) {
+            adapter.selectNode(false, treeNode);
+        }
+    }
+
+    @Override
+    public void selectAll() {
+        TreeHelper.selectNodeAndChild(root, true);
+
+        refreshTreeView();
+    }
+
+    @Override
+    public void deselectAll() {
+        TreeHelper.selectNodeAndChild(root, false);
+
+        refreshTreeView();
+    }
+
+    @Override
+    public List<TreeNode> getSelectedNodes() {
+        return TreeHelper.getSelectedNodes(root);
+    }
+
+    public boolean isItemSelectable() {
+        return itemSelectable;
+    }
+
+    public void setItemSelectable(boolean itemSelectable) {
+        this.itemSelectable = itemSelectable;
+    }
+
+}

+ 277 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/TreeViewAdapter.java

@@ -0,0 +1,277 @@
+/*
+ * Copyright 2016 - 2017 ShineM (Xinyuan)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
+ * file except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+ * ANY KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under.
+ */
+
+package cn.muchinfo.rma.view.autoWidget.treeview;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Checkable;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import cn.muchinfo.rma.view.autoWidget.treeview.base.BaseNodeViewBinder;
+import cn.muchinfo.rma.view.autoWidget.treeview.base.BaseNodeViewFactory;
+import cn.muchinfo.rma.view.autoWidget.treeview.base.CheckableNodeViewBinder;
+import cn.muchinfo.rma.view.autoWidget.treeview.helper.TreeHelper;
+
+/**
+ * Created by xinyuanzhong on 2017/4/21.
+ */
+
+public class TreeViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+    private Context context;
+
+    private TreeNode root;
+
+    private List<TreeNode> expandedNodeList;
+
+    private BaseNodeViewFactory baseNodeViewFactory;
+
+    private TreeView treeView;
+
+    TreeViewAdapter(Context context, TreeNode root,
+                    @NonNull BaseNodeViewFactory baseNodeViewFactory) {
+        this.context = context;
+        this.root = root;
+        this.baseNodeViewFactory = baseNodeViewFactory;
+
+        this.expandedNodeList = new ArrayList<>();
+
+        buildExpandedNodeList();
+    }
+
+    private void buildExpandedNodeList() {
+        expandedNodeList.clear();
+
+        for (TreeNode child : root.getChildren()) {
+            insertNode(expandedNodeList, child);
+        }
+    }
+
+    private void insertNode(List<TreeNode> nodeList, TreeNode treeNode) {
+        nodeList.add(treeNode);
+
+        if (!treeNode.hasChild()) {
+            return;
+        }
+        if (treeNode.isExpanded()) {
+            for (TreeNode child : treeNode.getChildren()) {
+                insertNode(nodeList, child);
+            }
+        }
+    }
+
+    @Override
+    public int getItemViewType(int position) {
+        // return expandedNodeList.get(position).getLevel(); // this old code row used to always return the level
+        TreeNode treeNode = expandedNodeList.get(position);
+        int viewType = this.baseNodeViewFactory.getViewType(treeNode); // default implementation returns the three node level but it can be overridden
+        return viewType;
+    }
+
+    @NonNull
+    @Override
+    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int level) {
+        View view = LayoutInflater.from(context).inflate(baseNodeViewFactory.getNodeLayoutId(level), parent, false);
+
+        BaseNodeViewBinder nodeViewBinder = baseNodeViewFactory.getNodeViewBinder(view, level);
+        nodeViewBinder.setTreeView(treeView);
+        return nodeViewBinder;
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) {
+        final View nodeView = holder.itemView;
+        final TreeNode treeNode = expandedNodeList.get(position);
+        final BaseNodeViewBinder viewBinder = (BaseNodeViewBinder) holder;
+
+        if (viewBinder.getToggleTriggerViewId() != 0) {
+            View triggerToggleView = nodeView.findViewById(viewBinder.getToggleTriggerViewId());
+
+            if (triggerToggleView != null) {
+                triggerToggleView.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        onNodeToggled(treeNode);
+                        viewBinder.onNodeToggled(treeNode, treeNode.isExpanded());
+                    }
+                });
+            }
+        } else if (treeNode.isItemClickEnable()) {
+            nodeView.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    onNodeToggled(treeNode);
+                    viewBinder.onNodeToggled(treeNode, treeNode.isExpanded());
+                }
+            });
+        }
+
+        if (viewBinder instanceof CheckableNodeViewBinder) {
+            setupCheckableItem(nodeView, treeNode, (CheckableNodeViewBinder) viewBinder);
+        }
+
+        viewBinder.bindView(treeNode);
+    }
+
+    private void setupCheckableItem(View nodeView,
+                                    final TreeNode treeNode,
+                                    final CheckableNodeViewBinder viewBinder) {
+        final View view = nodeView.findViewById(viewBinder.getCheckableViewId());
+
+        if (view instanceof Checkable) {
+            final Checkable checkableView = (Checkable) view;
+            checkableView.setChecked(treeNode.isSelected());
+
+            view.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    boolean checked = checkableView.isChecked();
+                    selectNode(checked, treeNode);
+                    viewBinder.onNodeSelectedChanged(treeNode, checked);
+                }
+            });
+        } else {
+            throw new ClassCastException("The getCheckableViewId() " +
+                    "must return a CheckBox's id");
+        }
+    }
+
+    void selectNode(boolean checked, TreeNode treeNode) {
+        treeNode.setSelected(checked);
+
+        selectChildren(treeNode, checked);
+        selectParentIfNeed(treeNode, checked);
+    }
+
+    private void selectChildren(TreeNode treeNode, boolean checked) {
+        List<TreeNode> impactedChildren = TreeHelper.selectNodeAndChild(treeNode, checked);
+        int index = expandedNodeList.indexOf(treeNode);
+        if (index != -1 && impactedChildren.size() > 0) {
+            notifyItemRangeChanged(index, impactedChildren.size() + 1);
+        }
+    }
+
+    private void selectParentIfNeed(TreeNode treeNode, boolean checked) {
+        List<TreeNode> impactedParents = TreeHelper.selectParentIfNeedWhenNodeSelected(treeNode, checked);
+        if (impactedParents.size() > 0) {
+            for (TreeNode parent : impactedParents) {
+                int position = expandedNodeList.indexOf(parent);
+                if (position != -1) notifyItemChanged(position);
+            }
+        }
+    }
+
+    private void onNodeToggled(TreeNode treeNode) {
+        treeNode.setExpanded(!treeNode.isExpanded());
+
+        if (treeNode.isExpanded()) {
+            expandNode(treeNode);
+        } else {
+            collapseNode(treeNode);
+        }
+    }
+
+    @Override
+    public int getItemCount() {
+        return expandedNodeList == null ? 0 : expandedNodeList.size();
+    }
+
+    /**
+     * Refresh all,this operation is only used for refreshing list when a large of nodes have
+     * changed value or structure because it take much calculation.
+     */
+    void refreshView() {
+        buildExpandedNodeList();
+        notifyDataSetChanged();
+    }
+
+    // Insert a node list after index.
+    private void insertNodesAtIndex(int index, List<TreeNode> additionNodes) {
+        if (index < 0 || index > expandedNodeList.size() - 1 || additionNodes == null) {
+            return;
+        }
+        expandedNodeList.addAll(index + 1, additionNodes);
+        notifyItemRangeInserted(index + 1, additionNodes.size());
+    }
+
+    //Remove a node list after index.
+    private void removeNodesAtIndex(int index, List<TreeNode> removedNodes) {
+        if (index < 0 || index > expandedNodeList.size() - 1 || removedNodes == null) {
+            return;
+        }
+        expandedNodeList.removeAll(removedNodes);
+        notifyItemRangeRemoved(index + 1, removedNodes.size());
+    }
+
+    /**
+     * Expand node. This operation will keep the structure of children(not expand children)
+     */
+    void expandNode(TreeNode treeNode) {
+        if (treeNode == null) {
+            return;
+        }
+        List<TreeNode> additionNodes = TreeHelper.expandNode(treeNode, false);
+        int index = expandedNodeList.indexOf(treeNode);
+
+        insertNodesAtIndex(index, additionNodes);
+    }
+
+
+    /**
+     * Collapse node. This operation will keep the structure of children(not collapse children)
+     */
+    void collapseNode(TreeNode treeNode) {
+        if (treeNode == null) {
+            return;
+        }
+        List<TreeNode> removedNodes = TreeHelper.collapseNode(treeNode, false);
+        int index = expandedNodeList.indexOf(treeNode);
+
+        removeNodesAtIndex(index, removedNodes);
+    }
+
+    /**
+     * Delete a node from list.This operation will also delete its children.
+     */
+    void deleteNode(TreeNode node) {
+        if (node == null || node.getParent() == null) {
+            return;
+        }
+        List<TreeNode> allNodes = TreeHelper.getAllNodes(root);
+        if (allNodes.indexOf(node) != -1) {
+            node.getParent().removeChild(node);
+        }
+
+        //remove children form list before delete
+        collapseNode(node);
+
+        int index = expandedNodeList.indexOf(node);
+        if (index != -1) {
+            expandedNodeList.remove(node);
+        }
+        notifyItemRemoved(index);
+    }
+
+    void setTreeView(TreeView treeView) {
+        this.treeView = treeView;
+    }
+}

+ 70 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/base/BaseNodeViewBinder.java

@@ -0,0 +1,70 @@
+/*
+ * Copyright 2016 - 2017 ShineM (Xinyuan)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
+ * file except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+ * ANY KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under.
+ */
+
+package cn.muchinfo.rma.view.autoWidget.treeview.base;
+
+import android.view.View;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import cn.muchinfo.rma.view.autoWidget.treeview.TreeNode;
+import cn.muchinfo.rma.view.autoWidget.treeview.TreeView;
+
+
+/**
+ * Created by zxy on 17/4/23.
+ */
+
+public abstract class BaseNodeViewBinder extends RecyclerView.ViewHolder {
+    /**
+     * This reference of TreeView make BaseNodeViewBinder has the ability
+     * to expand node or select node.
+     */
+    protected TreeView treeView;
+
+    public BaseNodeViewBinder(View itemView) {
+        super(itemView);
+    }
+
+    public void setTreeView(TreeView treeView) {
+        this.treeView = treeView;
+    }
+
+    /**
+     * Bind your data to view,you can get the data from treeNode by getValue()
+     *
+     * @param treeNode Node data
+     */
+    public abstract void bindView(TreeNode treeNode);
+
+    /**
+     * if you do not want toggle the node when click whole item view,then you can assign a view to
+     * trigger the toggle action
+     *
+     * @return The assigned view id to trigger expand or collapse.
+     */
+    public int getToggleTriggerViewId() {
+        return 0;
+    }
+
+    /**
+     * Callback when a toggle action happened (only by clicked)
+     *
+     * @param treeNode The toggled node
+     * @param expand   Expanded or collapsed
+     */
+    public void onNodeToggled(TreeNode treeNode, boolean expand) {
+        //empty
+    }
+}

+ 56 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/base/BaseNodeViewFactory.java

@@ -0,0 +1,56 @@
+/*
+ * Copyright 2016 - 2017 ShineM (Xinyuan)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
+ * file except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+ * ANY KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under.
+ */
+
+package cn.muchinfo.rma.view.autoWidget.treeview.base;
+
+import android.view.View;
+
+import cn.muchinfo.rma.view.autoWidget.treeview.TreeNode;
+
+/**
+ * Created by zxy on 17/4/23.
+ */
+
+public abstract class BaseNodeViewFactory {
+
+    /**
+    * The default implementation below behaves as in previous version when TreeViewAdapter.getItemViewType always returned the level,
+    * but you can override it if you want some other viewType value to become the parameter to the method getNodeViewBinder.
+    * @param treeNode
+    * @return
+    */
+    public int getViewType(TreeNode treeNode) {
+        return treeNode.getLevel();
+    }
+
+    /**
+     * If you want build a tree view,you must implement this factory method
+     *
+     * @param view  The parameter for BaseNodeViewBinder's constructor, do not use this for other
+     *              purpose!
+     * @param viewType The viewType value is the treeNode level in the default implementation.
+     * @return BaseNodeViewBinder
+     */
+    public abstract BaseNodeViewBinder getNodeViewBinder(View view, int viewType);
+
+
+    /**
+     * If you want build a tree view,you must implement this factory method
+     *
+     * @param level Level of view, returned from {@link #getViewType}
+     * @return node layout id
+     */
+    public abstract int getNodeLayoutId(int level);
+
+}

+ 51 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/base/BaseTreeAction.java

@@ -0,0 +1,51 @@
+/*
+ * Copyright 2016 - 2017 ShineM (Xinyuan)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
+ * file except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+ * ANY KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under.
+ */
+
+package cn.muchinfo.rma.view.autoWidget.treeview.base;
+
+
+import java.util.List;
+
+import cn.muchinfo.rma.view.autoWidget.treeview.TreeNode;
+
+/**
+ * Created by xinyuanzhong on 2017/4/20.
+ */
+
+public interface BaseTreeAction {
+    void expandAll();
+
+    void expandNode(TreeNode treeNode);
+
+    void expandLevel(int level);
+
+    void collapseAll();
+
+    void collapseNode(TreeNode treeNode);
+
+    void collapseLevel(int level);
+
+    void toggleNode(TreeNode treeNode);
+
+    void deleteNode(TreeNode node);
+
+    void addNode(TreeNode parent, TreeNode treeNode);
+
+    List<TreeNode> getAllNodes();
+
+    // TODO: 17/4/30
+    // 1.add node at position
+    // 2.add slide delete or other operations
+
+}

+ 48 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/base/CheckableNodeViewBinder.java

@@ -0,0 +1,48 @@
+/*
+ * Copyright 2016 - 2017 ShineM (Xinyuan)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
+ * file except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+ * ANY KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under.
+ */
+
+package cn.muchinfo.rma.view.autoWidget.treeview.base;
+
+import android.view.View;
+
+import cn.muchinfo.rma.view.autoWidget.treeview.TreeNode;
+
+
+/**
+ * Created by xinyuanzhong on 2017/4/27.
+ */
+
+public abstract class CheckableNodeViewBinder extends BaseNodeViewBinder {
+
+    public CheckableNodeViewBinder(View itemView) {
+        super(itemView);
+    }
+
+    /**
+     * Get the checkable view id. MUST BE A Checkable type!
+     *
+     * @return
+     */
+    public abstract int getCheckableViewId();
+
+    /**
+     * Do something when a node select or deselect(only triggered by clicked)
+     *
+     * @param treeNode
+     * @param selected
+     */
+    public void onNodeSelectedChanged(TreeNode treeNode, boolean selected) {
+        /*empty*/
+    }
+}

+ 36 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/base/SelectableTreeAction.java

@@ -0,0 +1,36 @@
+/*
+ * Copyright 2016 - 2017 ShineM (Xinyuan)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
+ * file except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+ * ANY KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under.
+ */
+
+package cn.muchinfo.rma.view.autoWidget.treeview.base;
+
+
+import java.util.List;
+
+import cn.muchinfo.rma.view.autoWidget.treeview.TreeNode;
+
+/**
+ * Created by xinyuanzhong on 2017/4/27.
+ */
+
+public interface SelectableTreeAction extends BaseTreeAction {
+    void selectNode(TreeNode treeNode);
+
+    void deselectNode(TreeNode treeNode);
+
+    void selectAll();
+
+    void deselectAll();
+
+    List<TreeNode> getSelectedNodes();
+}

+ 291 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/autoWidget/treeview/helper/TreeHelper.java

@@ -0,0 +1,291 @@
+/*
+ * Copyright 2016 - 2017 ShineM (Xinyuan)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
+ * file except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+ * ANY KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under.
+ */
+
+package cn.muchinfo.rma.view.autoWidget.treeview.helper;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import cn.muchinfo.rma.view.autoWidget.treeview.TreeNode;
+
+
+/**
+ * Created by xinyuanzhong on 2017/4/27.
+ */
+
+public class TreeHelper {
+
+    public static void expandAll(TreeNode node) {
+        if (node == null) {
+            return;
+        }
+        expandNode(node, true);
+    }
+
+    /**
+     * Expand node and calculate the visible addition nodes.
+     *
+     * @param treeNode     target node to expand
+     * @param includeChild should expand child
+     * @return the visible addition nodes
+     */
+    public static List<TreeNode> expandNode(TreeNode treeNode, boolean includeChild) {
+        List<TreeNode> expandChildren = new ArrayList<>();
+
+        if (treeNode == null) {
+            return expandChildren;
+        }
+
+        treeNode.setExpanded(true);
+
+        if (!treeNode.hasChild()) {
+            return expandChildren;
+        }
+
+        for (TreeNode child : treeNode.getChildren()) {
+            expandChildren.add(child);
+
+            if (includeChild || child.isExpanded()) {
+                expandChildren.addAll(expandNode(child, includeChild));
+            }
+        }
+
+        return expandChildren;
+    }
+
+    /**
+     * Expand the same deep(level) nodes.
+     *
+     * @param root  the tree root
+     * @param level the level to expand
+     */
+    public static void expandLevel(TreeNode root, int level) {
+        if (root == null) {
+            return;
+        }
+
+        for (TreeNode child : root.getChildren()) {
+            if (child.getLevel() == level) {
+                expandNode(child, false);
+            } else {
+                expandLevel(child, level);
+            }
+        }
+    }
+
+    public static void collapseAll(TreeNode node) {
+        if (node == null) {
+            return;
+        }
+        for (TreeNode child : node.getChildren()) {
+            performCollapseNode(child, true);
+        }
+    }
+
+    /**
+     * Collapse node and calculate the visible removed nodes.
+     *
+     * @param node         target node to collapse
+     * @param includeChild should collapse child
+     * @return the visible addition nodes before remove
+     */
+    public static List<TreeNode> collapseNode(TreeNode node, boolean includeChild) {
+        List<TreeNode> treeNodes = performCollapseNode(node, includeChild);
+        node.setExpanded(false);
+        return treeNodes;
+    }
+
+    private static List<TreeNode> performCollapseNode(TreeNode node, boolean includeChild) {
+        List<TreeNode> collapseChildren = new ArrayList<>();
+
+        if (node == null) {
+            return collapseChildren;
+        }
+        if (includeChild) {
+            node.setExpanded(false);
+        }
+        for (TreeNode child : node.getChildren()) {
+            collapseChildren.add(child);
+
+            if (child.isExpanded()) {
+                collapseChildren.addAll(performCollapseNode(child, includeChild));
+            } else if (includeChild) {
+                performCollapseNodeInner(child);
+            }
+        }
+
+        return collapseChildren;
+    }
+
+    /**
+     * Collapse all children node recursive
+     *
+     * @param node target node to collapse
+     */
+    private static void performCollapseNodeInner(TreeNode node) {
+        if (node == null) {
+            return;
+        }
+        node.setExpanded(false);
+        for (TreeNode child : node.getChildren()) {
+            performCollapseNodeInner(child);
+        }
+    }
+
+    public static void collapseLevel(TreeNode root, int level) {
+        if (root == null) {
+            return;
+        }
+        for (TreeNode child : root.getChildren()) {
+            if (child.getLevel() == level) {
+                collapseNode(child, false);
+            } else {
+                collapseLevel(child, level);
+            }
+        }
+    }
+
+    public static List<TreeNode> getAllNodes(TreeNode root) {
+        List<TreeNode> allNodes = new ArrayList<>();
+
+        fillNodeList(allNodes, root);
+        allNodes.remove(root);
+
+        return allNodes;
+    }
+
+    private static void fillNodeList(List<TreeNode> treeNodes, TreeNode treeNode) {
+        treeNodes.add(treeNode);
+
+        if (treeNode.hasChild()) {
+            for (TreeNode child : treeNode.getChildren()) {
+                fillNodeList(treeNodes, child);
+            }
+        }
+    }
+
+    /**
+     * Select the node and node's children,return the visible nodes
+     */
+    public static List<TreeNode> selectNodeAndChild(TreeNode treeNode, boolean select) {
+        List<TreeNode> expandChildren = new ArrayList<>();
+
+        if (treeNode == null) {
+            return expandChildren;
+        }
+
+        treeNode.setSelected(select);
+
+        if (!treeNode.hasChild()) {
+            return expandChildren;
+        }
+
+        if (treeNode.isExpanded()) {
+            for (TreeNode child : treeNode.getChildren()) {
+                expandChildren.add(child);
+
+                if (child.isExpanded()) {
+                    expandChildren.addAll(selectNodeAndChild(child, select));
+                } else {
+                    selectNodeInner(child, select);
+                }
+            }
+        } else {
+            selectNodeInner(treeNode, select);
+        }
+        return expandChildren;
+    }
+
+    private static void selectNodeInner(TreeNode treeNode, boolean select) {
+        if (treeNode == null) {
+            return;
+        }
+        treeNode.setSelected(select);
+        if (treeNode.hasChild()) {
+            for (TreeNode child : treeNode.getChildren()) {
+                selectNodeInner(child, select);
+            }
+        }
+    }
+
+    /**
+     * Select parent when all the brothers have been selected, otherwise deselect parent,
+     * and check the grand parent recursive.
+     */
+    public static List<TreeNode> selectParentIfNeedWhenNodeSelected(TreeNode treeNode, boolean select) {
+        List<TreeNode> impactedParents = new ArrayList<>();
+        if (treeNode == null) {
+            return impactedParents;
+        }
+
+        //ensure that the node's level is bigger than 1(first level is 1)
+        TreeNode parent = treeNode.getParent();
+        if (parent == null || parent.getParent() == null) {
+            return impactedParents;
+        }
+
+        List<TreeNode> brothers = parent.getChildren();
+        int selectedBrotherCount = 0;
+        for (TreeNode brother : brothers) {
+            if (brother.isSelected()) selectedBrotherCount++;
+        }
+
+        if (select && selectedBrotherCount == brothers.size()) {
+            parent.setSelected(true);
+            impactedParents.add(parent);
+            impactedParents.addAll(selectParentIfNeedWhenNodeSelected(parent, true));
+        } else if (!select && selectedBrotherCount == brothers.size() - 1) {
+            // only the condition that the size of selected's brothers
+            // is one less than total count can trigger the deselect
+            parent.setSelected(false);
+            impactedParents.add(parent);
+            impactedParents.addAll(selectParentIfNeedWhenNodeSelected(parent, false));
+        }
+        return impactedParents;
+    }
+
+    /**
+     * Get the selected nodes under current node, include itself
+     */
+    public static List<TreeNode> getSelectedNodes(TreeNode treeNode) {
+        List<TreeNode> selectedNodes = new ArrayList<>();
+        if (treeNode == null) {
+            return selectedNodes;
+        }
+
+        if (treeNode.isSelected() && treeNode.getParent() != null) selectedNodes.add(treeNode);
+
+        for (TreeNode child : treeNode.getChildren()) {
+            selectedNodes.addAll(getSelectedNodes(child));
+        }
+        return selectedNodes;
+    }
+
+    /**
+     * Return true when the node has one selected child(recurse all children) at least,
+     * otherwise return false
+     */
+    public static boolean hasOneSelectedNodeAtLeast(TreeNode treeNode) {
+        if (treeNode == null || treeNode.getChildren().size() == 0) {
+            return false;
+        }
+        List<TreeNode> children = treeNode.getChildren();
+        for (TreeNode child : children) {
+            if (child.isSelected() || hasOneSelectedNodeAtLeast(child)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}

+ 91 - 15
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/AddRoleSetActivity.kt

@@ -3,17 +3,21 @@ package cn.muchinfo.rma.view.base.home.rolemanagement
 import android.os.Bundle
 import android.view.Gravity
 import android.view.View
+import android.view.ViewGroup
 import android.view.inputmethod.EditorInfo
 import android.widget.EditText
+import android.widget.RelativeLayout
 import cn.muchinfo.rma.R
 import cn.muchinfo.rma.global.data.AccMgrRoleData
 import cn.muchinfo.rma.global.data.AccMgrRoleMenuData
-import cn.muchinfo.rma.global.data.RoleSonMenuData
 import cn.muchinfo.rma.lifecycle.bindOptional
 import cn.muchinfo.rma.view.autoWidget.*
+import cn.muchinfo.rma.view.autoWidget.treeview.TreeNode
+import cn.muchinfo.rma.view.autoWidget.treeview.TreeView
 import cn.muchinfo.rma.view.base.BaseActivity
-import cn.muchinfo.rma.view.base.future.trade.itemView
 import cn.muchinfo.rma.view.base.home.contract.emptyView
+import cn.muchinfo.rma.view.base.home.rolemanagement.rootviewfactory.MyNodeViewFactory
+import com.blankj.utilcode.util.LogUtils
 import com.blankj.utilcode.util.ToastUtils
 import mtp.polymer.com.autowidget.adapter.BaseAdapter
 import mtp.polymer.com.autowidget.dialog.createLoadingDialog
@@ -25,6 +29,12 @@ import org.jetbrains.anko.*
  */
 class AddRoleSetActivity : BaseActivity<RoleSetViewModel>() {
 
+    lateinit var viewGroup : RelativeLayout
+
+    private var treeView: TreeView? = null
+    private var root: TreeNode? = null
+
+
     /**
      * 1 新增 2修改 3 详情
      */
@@ -143,10 +153,19 @@ class AddRoleSetActivity : BaseActivity<RoleSetViewModel>() {
                             }
                         }.lparams(matchParent, autoSize(104))
 
+
+                        relativeLayout {
+                            viewGroup = this
+
+                        }.lparams(matchParent, matchParent){
+                            bottomMargin = autoSize(200)
+                        }
+
                         /**
                          * 角色权限的列表
                          */
                         recyclerView {
+                            visibility = View.GONE
                             background = resources.getDrawable(R.color.add_role_bg_color)
                             adapter = addRoleAdapter
                             isNestedScrollingEnabled = false
@@ -155,6 +174,15 @@ class AddRoleSetActivity : BaseActivity<RoleSetViewModel>() {
                         }
 
                         viewModel.roleMenuDataList.bindOptional(context){
+                            root = TreeNode.root()
+                            buildTree(it ?: arrayListOf())
+                            treeView = TreeView(root!!, this@AddRoleSetActivity, MyNodeViewFactory())
+                            val view = treeView!!.view
+                            view.layoutParams = ViewGroup.LayoutParams(
+                                ViewGroup.LayoutParams.MATCH_PARENT,
+                                ViewGroup.LayoutParams.MATCH_PARENT
+                            )
+                            viewGroup.addView(view)
                             addRoleAdapter.setNewData(it)
                         }
                     }
@@ -171,19 +199,20 @@ class AddRoleSetActivity : BaseActivity<RoleSetViewModel>() {
 
                     textView {
                         onThrottleFirstClick {
-                            if (check().not()){
-                                return@onThrottleFirstClick
-                            }
-
-                            if (type == "1"){
-                                viewModel.ManagerRoleOperateReq(operatetype = 1,rolename = role_name_edittext.text.toString(),memberfuncmenus = viewModel.getUpdateMenuDataList()){
-                                    finish()
-                                }
-                            }else if (type == "2"){
-                                viewModel.ManagerRoleOperateReq(autoid = data.autoid?.toLong() ?: 0,operatetype = 2,rolename = role_name_edittext.text.toString(),memberfuncmenus = viewModel.getUpdateMenuDataList()){
-                                    finish()
-                                }
-                            }
+                            getSelectedNodes()
+//                            if (check().not()){
+//                                return@onThrottleFirstClick
+//                            }
+//
+//                            if (type == "1"){
+//                                viewModel.ManagerRoleOperateReq(operatetype = 1,rolename = role_name_edittext.text.toString(),memberfuncmenus = viewModel.getUpdateMenuDataList()){
+//                                    finish()
+//                                }
+//                            }else if (type == "2"){
+//                                viewModel.ManagerRoleOperateReq(autoid = data.autoid?.toLong() ?: 0,operatetype = 2,rolename = role_name_edittext.text.toString(),memberfuncmenus = viewModel.getUpdateMenuDataList()){
+//                                    finish()
+//                                }
+//                            }
                         }
                         gravity = Gravity.CENTER
                         backgroundResource = R.mipmap.rma_submit_bg
@@ -201,6 +230,53 @@ class AddRoleSetActivity : BaseActivity<RoleSetViewModel>() {
         }
     }
 
+    private fun getSelectedNodes(): String? {
+        val stringBuilder = StringBuilder("You have selected: ")
+        val selectedNodes = treeView!!.selectedNodes
+        for (i in selectedNodes.indices) {
+            stringBuilder.append(selectedNodes[i].code.toString() + ",")
+        }
+        LogUtils.eTag("selectcode",stringBuilder.toString())
+        return stringBuilder.toString()
+    }
+
+
+    fun buildTree(oldList : List<AccMgrRoleMenuData>){
+        oldList.forEach {firstdata ->
+            //第一层数据组装
+            val firstTreeNode = TreeNode(firstdata.Menu?.resourcename,0)
+            firstTreeNode.isSelected = firstdata.Menu?.ishadrole ?: false
+            firstTreeNode.code = firstdata.Menu?.resourcecode
+            firstdata.SubMenu?.forEach { secondData ->
+                //第二层数据组装
+                val secondTreeNode = TreeNode(secondData.Menu?.resourcename,1)
+                secondTreeNode.isSelected = secondData.Menu?.ishadrole ?: false
+                secondTreeNode.code = secondData.Menu?.resourcecode
+                secondData.SubMenu?.forEach { threedata ->
+                    //第三层数据组装
+                    val threeTreeNode = TreeNode(threedata.Menu?.resourcename,2)
+                    threeTreeNode.isSelected = threedata.Menu?.ishadrole ?: false
+                    threeTreeNode.code = threedata.Menu?.resourcecode
+                    if (threedata.SubMenu.isNullOrEmpty().not()){
+                        threedata.SubMenu?.forEach { fourdata ->
+                            //第四层数据组装
+                            val fourTreeNode = TreeNode(fourdata.Menu?.resourcename,3)
+                            fourTreeNode.isSelected = fourdata.Menu?.ishadrole ?: false
+                            fourTreeNode.code = fourdata.Menu?.resourcecode
+                            threeTreeNode.addChild(fourTreeNode)
+                        }
+                    }
+
+                    secondTreeNode.addChild(threeTreeNode)
+                }
+
+                firstTreeNode.addChild(secondTreeNode)
+            }
+
+            root?.addChild(firstTreeNode)
+        }
+    }
+
     fun check() : Boolean{
         if (role_name_edittext.text.toString().isNullOrEmpty()){
             ToastUtils.showLong("请输入角色名称")

+ 44 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/rootviewfactory/FirstLevelNodeViewBinder.java

@@ -0,0 +1,44 @@
+package cn.muchinfo.rma.view.base.home.rolemanagement.rootviewfactory;
+
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import cn.muchinfo.rma.R;
+import cn.muchinfo.rma.view.autoWidget.treeview.TreeNode;
+import cn.muchinfo.rma.view.autoWidget.treeview.base.CheckableNodeViewBinder;
+
+/**
+ * Created by zxy on 17/4/23.
+ */
+
+public class FirstLevelNodeViewBinder extends CheckableNodeViewBinder {
+    TextView textView;
+    ImageView imageView;
+    public FirstLevelNodeViewBinder(View itemView) {
+        super(itemView);
+        textView = itemView.findViewById(R.id.node_name_view);
+        imageView = itemView.findViewById(R.id.arrow_img);
+    }
+
+    @Override
+    public int getCheckableViewId() {
+        return R.id.checkBox;
+    }
+
+    @Override
+    public void bindView(final TreeNode treeNode) {
+        textView.setText(treeNode.getValue().toString());
+        imageView.setRotation(treeNode.isExpanded() ? 90 : 0);
+        imageView.setVisibility(treeNode.hasChild() ? View.VISIBLE : View.INVISIBLE);
+    }
+
+    @Override
+    public void onNodeToggled(TreeNode treeNode, boolean expand) {
+        if (expand) {
+            imageView.animate().rotation(90).setDuration(200).start();
+        } else {
+            imageView.animate().rotation(0).setDuration(200).start();
+        }
+    }
+}

+ 30 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/rootviewfactory/FourLevelNodeViewBinder.java

@@ -0,0 +1,30 @@
+package cn.muchinfo.rma.view.base.home.rolemanagement.rootviewfactory;
+
+import android.view.View;
+import android.widget.TextView;
+
+import cn.muchinfo.rma.R;
+import cn.muchinfo.rma.view.autoWidget.treeview.TreeNode;
+import cn.muchinfo.rma.view.autoWidget.treeview.base.CheckableNodeViewBinder;
+
+/**
+ * Created by zxy on 17/4/23.
+ */
+
+public class FourLevelNodeViewBinder extends CheckableNodeViewBinder {
+    TextView textView;
+    public FourLevelNodeViewBinder(View itemView) {
+        super(itemView);
+        textView = (TextView) itemView.findViewById(R.id.node_name_view);
+    }
+
+    @Override
+    public int getCheckableViewId() {
+        return R.id.checkBox;
+    }
+
+    @Override
+    public void bindView(TreeNode treeNode) {
+        textView.setText(treeNode.getValue().toString());
+    }
+}

+ 47 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/rootviewfactory/MyNodeViewFactory.java

@@ -0,0 +1,47 @@
+package cn.muchinfo.rma.view.base.home.rolemanagement.rootviewfactory;
+
+import android.view.View;
+
+import cn.muchinfo.rma.R;
+import cn.muchinfo.rma.view.autoWidget.treeview.base.BaseNodeViewBinder;
+import cn.muchinfo.rma.view.autoWidget.treeview.base.BaseNodeViewFactory;
+
+
+/**
+ * Created by zxy on 17/4/23.
+ */
+
+public class MyNodeViewFactory extends BaseNodeViewFactory {
+
+    @Override
+    public BaseNodeViewBinder getNodeViewBinder(View view, int level) {
+        switch (level) {
+            case 0:
+                return new FirstLevelNodeViewBinder(view);
+            case 1:
+                return new SecondLevelNodeViewBinder(view);
+            case 2:
+                return new ThirdLevelNodeViewBinder(view);
+            case 3:
+                return new FourLevelNodeViewBinder(view);
+            default:
+                return null;
+        }
+    }
+
+    @Override
+    public int getNodeLayoutId(int level) {
+        switch (level) {
+            case 0:
+                return R.layout.item_first_level;
+            case 1:
+                return R.layout.item_second_level;
+            case 2:
+                return R.layout.item_third_level;
+            case 3:
+                return R.layout.item_four_level;
+            default:
+                return 0;
+        }
+    }
+}

+ 46 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/rootviewfactory/SecondLevelNodeViewBinder.java

@@ -0,0 +1,46 @@
+package cn.muchinfo.rma.view.base.home.rolemanagement.rootviewfactory;
+
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import cn.muchinfo.rma.R;
+import cn.muchinfo.rma.view.autoWidget.treeview.TreeNode;
+import cn.muchinfo.rma.view.autoWidget.treeview.base.CheckableNodeViewBinder;
+
+
+/**
+ * Created by zxy on 17/4/23.
+ */
+
+public class SecondLevelNodeViewBinder extends CheckableNodeViewBinder {
+
+    TextView textView;
+    ImageView imageView;
+    public SecondLevelNodeViewBinder(View itemView) {
+        super(itemView);
+        textView = (TextView) itemView.findViewById(R.id.node_name_view);
+        imageView = (ImageView) itemView.findViewById(R.id.arrow_img);
+    }
+
+    @Override
+    public int getCheckableViewId() {
+        return R.id.checkBox;
+    }
+
+    @Override
+    public void bindView(final TreeNode treeNode) {
+        textView.setText(treeNode.getValue().toString());
+        imageView.setRotation(treeNode.isExpanded() ? 90 : 0);
+        imageView.setVisibility(treeNode.hasChild() ? View.VISIBLE : View.INVISIBLE);
+    }
+
+    @Override
+    public void onNodeToggled(TreeNode treeNode, boolean expand) {
+        if (expand) {
+            imageView.animate().rotation(90).setDuration(200).start();
+        } else {
+            imageView.animate().rotation(0).setDuration(200).start();
+        }
+    }
+}

+ 45 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/rootviewfactory/ThirdLevelNodeViewBinder.java

@@ -0,0 +1,45 @@
+package cn.muchinfo.rma.view.base.home.rolemanagement.rootviewfactory;
+
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import cn.muchinfo.rma.R;
+import cn.muchinfo.rma.view.autoWidget.treeview.TreeNode;
+import cn.muchinfo.rma.view.autoWidget.treeview.base.CheckableNodeViewBinder;
+
+
+/**
+ * Created by zxy on 17/4/23.
+ */
+
+public class ThirdLevelNodeViewBinder extends CheckableNodeViewBinder {
+    TextView textView;
+    ImageView imageView;
+    public ThirdLevelNodeViewBinder(View itemView) {
+        super(itemView);
+        textView = (TextView) itemView.findViewById(R.id.node_name_view);
+        imageView = (ImageView) itemView.findViewById(R.id.arrow_img);
+    }
+
+    @Override
+    public int getCheckableViewId() {
+        return R.id.checkBox;
+    }
+
+    @Override
+    public void bindView(final TreeNode treeNode) {
+        textView.setText(treeNode.getValue().toString());
+        imageView.setRotation(treeNode.isExpanded() ? 90 : 0);
+        imageView.setVisibility(treeNode.hasChild() ? View.VISIBLE : View.INVISIBLE);
+    }
+
+    @Override
+    public void onNodeToggled(TreeNode treeNode, boolean expand) {
+        if (expand) {
+            imageView.animate().rotation(90).setDuration(200).start();
+        } else {
+            imageView.animate().rotation(0).setDuration(200).start();
+        }
+    }
+}

+ 9 - 0
RMA/app/src/main/res/drawable/ic_keyboard_arrow_right_white_24px.xml

@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:pathData="M8.59,16.34l4.58,-4.59 -4.58,-4.59L10,5.75l6,6 -6,6z"
+        android:fillColor="#333333"/>
+</vector>

+ 49 - 0
RMA/app/src/main/res/layout/item_first_level.xml

@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="50dp"
+    android:background="#ffffff"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:id="@+id/node_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_marginLeft="10dp"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:id="@+id/arrow_img"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/ic_keyboard_arrow_right_white_24px" />
+
+        <TextView
+            android:id="@+id/node_name_view"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:fontFamily="monospace"
+            android:textSize="15dp"
+            android:text="Tree Node" />
+    </LinearLayout>
+
+
+    <androidx.appcompat.widget.AppCompatCheckBox
+        android:button="@null"
+        android:background="@drawable/yrdz_check_select_backgrond"
+        android:id="@+id/checkBox"
+        android:layout_width="20dp"
+        android:layout_height="20dp"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:layout_marginRight="10dp" />
+
+    <View
+        android:layout_marginLeft="10dp"
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:layout_alignParentBottom="true"
+        android:background="#B8C9D5"></View>
+</RelativeLayout>

+ 43 - 0
RMA/app/src/main/res/layout/item_four_level.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="40dp"
+    android:background="#ffffff"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:id="@+id/node_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_marginLeft="100dp"
+        android:orientation="horizontal">
+
+
+        <TextView
+            android:id="@+id/node_name_view"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:fontFamily="monospace"
+            android:text="Tree Node"
+            android:textSize="15dp" />
+    </LinearLayout>
+
+    <androidx.appcompat.widget.AppCompatCheckBox
+        android:button="@null"
+        android:background="@drawable/yrdz_check_select_backgrond"
+        android:id="@+id/checkBox"
+        android:layout_width="20dp"
+        android:layout_height="20dp"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:layout_marginRight="10dp" />
+
+    <View
+        android:layout_marginLeft="100dp"
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:layout_alignParentBottom="true"
+        android:background="#B8C9D5"></View>
+</RelativeLayout>

+ 48 - 0
RMA/app/src/main/res/layout/item_second_level.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="50dp"
+    android:background="#ffffff"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:id="@+id/node_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_marginLeft="40dp"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:id="@+id/arrow_img"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/ic_keyboard_arrow_right_white_24px" />
+
+        <TextView
+            android:id="@+id/node_name_view"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:fontFamily="monospace"
+            android:text="Tree Node"
+            android:textSize="15dp" />
+    </LinearLayout>
+
+    <androidx.appcompat.widget.AppCompatCheckBox
+        android:button="@null"
+        android:background="@drawable/yrdz_check_select_backgrond"
+        android:id="@+id/checkBox"
+        android:layout_width="20dp"
+        android:layout_height="20dp"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:layout_marginRight="10dp" />
+
+    <View
+        android:layout_marginLeft="40dp"
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:layout_alignParentBottom="true"
+        android:background="#B8C9D5"></View>
+</RelativeLayout>

+ 49 - 0
RMA/app/src/main/res/layout/item_third_level.xml

@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="50dp"
+    android:background="#ffffff"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:id="@+id/node_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_marginLeft="70dp"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:id="@+id/arrow_img"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/ic_keyboard_arrow_right_white_24px" />
+
+
+        <TextView
+            android:id="@+id/node_name_view"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:fontFamily="monospace"
+            android:text="Tree Node"
+            android:textSize="15dp" />
+    </LinearLayout>
+
+    <androidx.appcompat.widget.AppCompatCheckBox
+        android:button="@null"
+        android:background="@drawable/yrdz_check_select_backgrond"
+        android:id="@+id/checkBox"
+        android:layout_width="20dp"
+        android:layout_height="20dp"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:layout_marginRight="10dp" />
+
+    <View
+        android:layout_marginLeft="70dp"
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:layout_alignParentBottom="true"
+        android:background="#B8C9D5"></View>
+</RelativeLayout>