3.5 KiB
图层删除
当删除一个节点时,该节点一定满足且只满足以下条件中的一条:
- 是一个Leaf节点,引用了其他的Element;
- 是一个Folder节点,没有GroupElement引用,没有引用任何其他节点(因为是Folder);
- 是一个Folder节点,存在对应的GroupElement引用。
其中,对于第1条,由于Leaf节点被删除只影响其父亲Folder的属性,所以显然在删除Leaf节点时是绝对安全的。
对于第2条,对于其父亲Folder,其被删除只影响其父亲Folder的属性,所以不会影响其父亲;对于其孩子,有可能存在以下情况:
- 孩子中不存在任何被引用的情况:删除安全;
- 孩子中存在Folder节点被GroupElement引用,不安全,需要手动将情况转换为第1条后才可以删除。
对于第3条,必须首先手动解除其本身的引用,然后将转变为第2条。
图元删除
显然,无论是什么种类的图元,删除一个图元会影响到的元素只有引用它的图层,所以我们将SimpleElement与GroupElement合并成一种情况讨论。
当删除一个图元时,该图元一定满足且只满足以下条件中的一条:
- 是一个GraphicElement,未被其他图层引用;
- 是一个GraphicElement,被其他图层引用。
对于第1条,删除绝对安全。
对于第2条,将引用关系手动解除后,删除安全。
图层移动
条件分析
图层移动时,显然,被移动的节点只影响它本身及它的子图层, 移动的目标节点只影响它本身及它的父图层,那么:
(1) 被移动的图层一定满足且只满足以下条件中的一条:
- 是一个Folder节点,无对应的GroupElement引用,子节点无引用GroupElement;
- 是一个Folder节点,无对应的GroupElement引用,子节点存在引用GroupElement;
- 是一个Folder节点,存在对应的GroupElement引用;
- 是一个Leaf节点,引用了GroupElement;
- 是一个Leaf节点,未引用GroupElement。
(2) 目标FolderLayer一定满足且只满足以下条件中的一条:
- 自身无对应的GroupElement引用,无父节点有GroupElement引用;
- 自身无对应的GroupElement引用,存在父节点有GroupElement引用;
- 自身存在对应的GroupElement引用。
显然,以上条件的全组合可以覆盖所有情况。 由于:
(1) 1
与(2) 中的任一条件
进行组合显然是绝对安全的;(1) 3
中自身提供的GroupElement并不会影响移动;(1) 5
与(2) 中的任一条件
进行组合显然是绝对安全的;(1) 中的任一条件
与(2) 1
进行组合显然是绝对安全的。
所以接下来对于除去以上情况的所有组合情况进行讨论。
讨论证明
(1) 2
- (2) 2
当且仅当被移动的图层的子节点引用的GroupElement 与 目标图层父节点提供的GroupElement 相同时,移动不安全。
(1) 4
- (2) 2
当且仅当被移动的图层引用的GroupElement 与 目标图层父节点提供的 GroupElement 相同时,移动不安全。
(2) 3
的特殊讨论
当且仅当自身提供的GroupElement 被 被移动图层或其子节点引用时,需要处理其自身情况,否则无视其自身提供的GroupElement,与 (2) 1
或 (2) 2
视为同情况处理。
结论
当且仅当被移动的图层或其子节点所引用的GroupElement 与 目标图层或其父节点所提供的GroupElement 相同时,移动不安全;其余情况均安全。