|
@@ -12,6 +12,7 @@ internal class DocumentStructureHelper
|
|
{
|
|
{
|
|
private IDocument doc;
|
|
private IDocument doc;
|
|
private DocumentInternalParts internals;
|
|
private DocumentInternalParts internals;
|
|
|
|
+
|
|
public DocumentStructureHelper(IDocument doc, DocumentInternalParts internals)
|
|
public DocumentStructureHelper(IDocument doc, DocumentInternalParts internals)
|
|
{
|
|
{
|
|
this.doc = doc;
|
|
this.doc = doc;
|
|
@@ -29,7 +30,7 @@ internal class DocumentStructureHelper
|
|
if (childName.StartsWith(name))
|
|
if (childName.StartsWith(name))
|
|
count++;
|
|
count++;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
return true;
|
|
return true;
|
|
});
|
|
});
|
|
return $"{name} {count}";
|
|
return $"{name} {count}";
|
|
@@ -43,104 +44,119 @@ internal class DocumentStructureHelper
|
|
Guid guid = Guid.NewGuid();
|
|
Guid guid = Guid.NewGuid();
|
|
//put member on top
|
|
//put member on top
|
|
internals.ActionAccumulator.AddActions(new CreateStructureMember_Action(
|
|
internals.ActionAccumulator.AddActions(new CreateStructureMember_Action(
|
|
- doc.NodeGraphHandler.OutputNode.Id,
|
|
|
|
|
|
+ doc.NodeGraphHandler.OutputNode.Id,
|
|
guid, type));
|
|
guid, type));
|
|
- name ??= GetUniqueName(type == StructureMemberType.Layer ? new LocalizedString("NEW_LAYER") : new LocalizedString("NEW_FOLDER"), doc.NodeGraphHandler.OutputNode);
|
|
|
|
|
|
+ name ??= GetUniqueName(
|
|
|
|
+ type == StructureMemberType.Layer
|
|
|
|
+ ? new LocalizedString("NEW_LAYER")
|
|
|
|
+ : new LocalizedString("NEW_FOLDER"), doc.NodeGraphHandler.OutputNode);
|
|
internals.ActionAccumulator.AddActions(new StructureMemberName_Action(guid, name));
|
|
internals.ActionAccumulator.AddActions(new StructureMemberName_Action(guid, name));
|
|
if (finish)
|
|
if (finish)
|
|
internals.ActionAccumulator.AddFinishedActions();
|
|
internals.ActionAccumulator.AddFinishedActions();
|
|
return guid;
|
|
return guid;
|
|
}
|
|
}
|
|
|
|
+
|
|
if (member is IFolderHandler folder)
|
|
if (member is IFolderHandler folder)
|
|
{
|
|
{
|
|
Guid guid = Guid.NewGuid();
|
|
Guid guid = Guid.NewGuid();
|
|
//put member inside folder on top
|
|
//put member inside folder on top
|
|
internals.ActionAccumulator.AddActions(new CreateStructureMember_Action(folder.Id, guid, type));
|
|
internals.ActionAccumulator.AddActions(new CreateStructureMember_Action(folder.Id, guid, type));
|
|
- name ??= GetUniqueName(type == StructureMemberType.Layer ? new LocalizedString("NEW_LAYER") : new LocalizedString("NEW_FOLDER"), folder);
|
|
|
|
|
|
+ name ??= GetUniqueName(
|
|
|
|
+ type == StructureMemberType.Layer
|
|
|
|
+ ? new LocalizedString("NEW_LAYER")
|
|
|
|
+ : new LocalizedString("NEW_FOLDER"), folder);
|
|
internals.ActionAccumulator.AddActions(new StructureMemberName_Action(guid, name));
|
|
internals.ActionAccumulator.AddActions(new StructureMemberName_Action(guid, name));
|
|
if (finish)
|
|
if (finish)
|
|
internals.ActionAccumulator.AddFinishedActions();
|
|
internals.ActionAccumulator.AddFinishedActions();
|
|
return guid;
|
|
return guid;
|
|
}
|
|
}
|
|
|
|
+
|
|
if (member is ILayerHandler layer)
|
|
if (member is ILayerHandler layer)
|
|
{
|
|
{
|
|
Guid guid = Guid.NewGuid();
|
|
Guid guid = Guid.NewGuid();
|
|
//put member above the layer
|
|
//put member above the layer
|
|
INodeHandler parent = doc.StructureHelper.GetFirstForwardNode(layer);
|
|
INodeHandler parent = doc.StructureHelper.GetFirstForwardNode(layer);
|
|
internals.ActionAccumulator.AddActions(new CreateStructureMember_Action(parent.Id, guid, type));
|
|
internals.ActionAccumulator.AddActions(new CreateStructureMember_Action(parent.Id, guid, type));
|
|
- name ??= GetUniqueName(type == StructureMemberType.Layer ? new LocalizedString("NEW_LAYER") : new LocalizedString("NEW_FOLDER"), parent);
|
|
|
|
|
|
+ name ??= GetUniqueName(
|
|
|
|
+ type == StructureMemberType.Layer
|
|
|
|
+ ? new LocalizedString("NEW_LAYER")
|
|
|
|
+ : new LocalizedString("NEW_FOLDER"), parent);
|
|
internals.ActionAccumulator.AddActions(new StructureMemberName_Action(guid, name));
|
|
internals.ActionAccumulator.AddActions(new StructureMemberName_Action(guid, name));
|
|
if (finish)
|
|
if (finish)
|
|
internals.ActionAccumulator.AddFinishedActions();
|
|
internals.ActionAccumulator.AddFinishedActions();
|
|
return guid;
|
|
return guid;
|
|
}
|
|
}
|
|
|
|
+
|
|
throw new ArgumentException($"Unknown member type: {type}");
|
|
throw new ArgumentException($"Unknown member type: {type}");
|
|
}
|
|
}
|
|
|
|
|
|
- private void HandleMoveInside(List<IStructureMemberHandler> memberToMovePath, List<IStructureMemberHandler> memberToMoveIntoPath)
|
|
|
|
|
|
+ private void HandleMoveInside(Guid memberToMove, Guid memberToMoveInto)
|
|
{
|
|
{
|
|
- if (memberToMoveIntoPath[0] is not IFolderHandler folder || memberToMoveIntoPath.Contains(memberToMovePath[0]))
|
|
|
|
|
|
+ if (memberToMoveInto == memberToMove)
|
|
return;
|
|
return;
|
|
- //int index = folder.Children.Count;
|
|
|
|
- if (memberToMoveIntoPath[0].Id == memberToMovePath[1].Id) // member is already in this folder
|
|
|
|
- //index--;
|
|
|
|
- //internals.ActionAccumulator.AddFinishedActions(new MoveStructureMember_Action(memberToMovePath[0].Id, folder.Id, index));
|
|
|
|
- return;
|
|
|
|
|
|
+
|
|
|
|
+ internals.ActionAccumulator.AddFinishedActions(new MoveStructureMember_Action(memberToMove, memberToMoveInto));
|
|
}
|
|
}
|
|
|
|
|
|
- private void HandleMoveAboveBelow(List<IStructureMemberHandler> memberToMovePath, List<IStructureMemberHandler> memberToMoveRelativeToPath, bool above)
|
|
|
|
|
|
+ private void HandleMoveAboveBelow(Guid memberToMove, Guid referenceMember, bool above)
|
|
{
|
|
{
|
|
- IFolderHandler targetFolder = (IFolderHandler)memberToMoveRelativeToPath[1];
|
|
|
|
|
|
+ /*IFolderHandler targetFolder = (IFolderHandler)memberToMoveRelativeToPath[1];
|
|
if (memberToMovePath[1].Id == memberToMoveRelativeToPath[1].Id)
|
|
if (memberToMovePath[1].Id == memberToMoveRelativeToPath[1].Id)
|
|
- { // members are in the same folder
|
|
|
|
- //int indexOfMemberToMove = targetFolder.Children.IndexOf(memberToMovePath[0]);
|
|
|
|
- //int indexOfMemberToMoveAbove = targetFolder.Children.IndexOf(memberToMoveRelativeToPath[0]);
|
|
|
|
- //int index = indexOfMemberToMoveAbove;
|
|
|
|
- // if (above)
|
|
|
|
- // index++;
|
|
|
|
- // if (indexOfMemberToMove < indexOfMemberToMoveAbove)
|
|
|
|
- // index--;
|
|
|
|
- // internals.ActionAccumulator.AddFinishedActions(new MoveStructureMember_Action(memberToMovePath[0].Id, targetFolder.Id, index));
|
|
|
|
|
|
+ {
|
|
|
|
+ // members are in the same folder
|
|
|
|
+ int indexOfMemberToMove = targetFolder.Children.IndexOf(memberToMovePath[0]);
|
|
|
|
+ int indexOfMemberToMoveAbove = targetFolder.Children.IndexOf(memberToMoveRelativeToPath[0]);
|
|
|
|
+ int index = indexOfMemberToMoveAbove;
|
|
|
|
+ if (above)
|
|
|
|
+ index++;
|
|
|
|
+ if (indexOfMemberToMove < indexOfMemberToMoveAbove)
|
|
|
|
+ index--;
|
|
|
|
+
|
|
|
|
+ Guid targetNodeId = targetFolder.Children[Math.Clamp(index, 0, targetFolder.Children.Count - 1)].Id;
|
|
|
|
+ internals.ActionAccumulator.AddFinishedActions(
|
|
|
|
+ new MoveStructureMember_Action(memberToMovePath[0].Id, targetNodeId));
|
|
}
|
|
}
|
|
else
|
|
else
|
|
- { // members are in different folders
|
|
|
|
|
|
+ {
|
|
|
|
+ // members are in different folders
|
|
if (memberToMoveRelativeToPath.Contains(memberToMovePath[0]))
|
|
if (memberToMoveRelativeToPath.Contains(memberToMovePath[0]))
|
|
return;
|
|
return;
|
|
- // int index = targetFolder.Children.IndexOf(memberToMoveRelativeToPath[0]);
|
|
|
|
- // if (above)
|
|
|
|
- // index++;
|
|
|
|
- // internals.ActionAccumulator.AddFinishedActions(new MoveStructureMember_Action(memberToMovePath[0].Id, targetFolder.Id, index));
|
|
|
|
- }
|
|
|
|
|
|
+ int index = targetFolder.Children.IndexOf(memberToMoveRelativeToPath[0]);
|
|
|
|
+ if (above)
|
|
|
|
+ index++;
|
|
|
|
+
|
|
|
|
+ Guid targetNodeId = targetFolder.Children[Math.Clamp(index, 0, targetFolder.Children.Count - 1)].Id;
|
|
|
|
+ internals.ActionAccumulator.AddFinishedActions(
|
|
|
|
+ new MoveStructureMember_Action(memberToMovePath[0].Id, targetNodeId));
|
|
|
|
+ }*/
|
|
}
|
|
}
|
|
|
|
|
|
- public void TryMoveStructureMember(Guid memberToMove, Guid memberToMoveIntoOrNextTo, StructureMemberPlacement placement)
|
|
|
|
|
|
+ public void TryMoveStructureMember(Guid memberToMove, Guid memberToMoveIntoOrNextTo,
|
|
|
|
+ StructureMemberPlacement placement)
|
|
{
|
|
{
|
|
- List<IStructureMemberHandler> memberPath = doc.StructureHelper.FindPath(memberToMove);
|
|
|
|
- List<IStructureMemberHandler> refPath = doc.StructureHelper.FindPath(memberToMoveIntoOrNextTo);
|
|
|
|
- if (memberPath.Count < 2 || refPath.Count < 2)
|
|
|
|
- return;
|
|
|
|
switch (placement)
|
|
switch (placement)
|
|
{
|
|
{
|
|
case StructureMemberPlacement.Above:
|
|
case StructureMemberPlacement.Above:
|
|
- HandleMoveAboveBelow(memberPath, refPath, true);
|
|
|
|
|
|
+ HandleMoveAboveBelow(memberToMove, memberToMoveIntoOrNextTo, true);
|
|
break;
|
|
break;
|
|
case StructureMemberPlacement.Below:
|
|
case StructureMemberPlacement.Below:
|
|
- HandleMoveAboveBelow(memberPath, refPath, false);
|
|
|
|
|
|
+ //HandleMoveAboveBelow(memberPath, refPath, false);
|
|
break;
|
|
break;
|
|
case StructureMemberPlacement.Inside:
|
|
case StructureMemberPlacement.Inside:
|
|
- HandleMoveInside(memberPath, refPath);
|
|
|
|
|
|
+ HandleMoveInside(memberToMove, memberToMoveIntoOrNextTo);
|
|
break;
|
|
break;
|
|
case StructureMemberPlacement.BelowOutsideFolder:
|
|
case StructureMemberPlacement.BelowOutsideFolder:
|
|
|
|
+ {
|
|
|
|
+ /*IFolderHandler refFolder = (IFolderHandler)refPath[1];
|
|
|
|
+ int refIndexInParent = refFolder.Children.IndexOf(refPath[0]);
|
|
|
|
+ if (refIndexInParent > 0 || refPath.Count == 2)
|
|
{
|
|
{
|
|
- IFolderHandler refFolder = (IFolderHandler)refPath[1];
|
|
|
|
- // int refIndexInParent = refFolder.Children.IndexOf(refPath[0]);
|
|
|
|
- // if (refIndexInParent > 0 || refPath.Count == 2)
|
|
|
|
- {
|
|
|
|
- HandleMoveAboveBelow(memberPath, refPath, false);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- HandleMoveAboveBelow(memberPath, doc.StructureHelper.FindPath(refPath[1].Id), false);
|
|
|
|
|
|
+ HandleMoveAboveBelow(memberPath, refPath, false);
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ HandleMoveAboveBelow(memberPath, doc.StructureHelper.FindPath(refPath[1].Id), false);*/
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|