PickOrPlaceProgramNodeContribution.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package com.ur.urcap.examples.pickorplaceswing.pickorplace;
  2. import com.ur.urcap.api.contribution.ProgramNodeContribution;
  3. import com.ur.urcap.api.contribution.program.CreationContext;
  4. import com.ur.urcap.api.contribution.program.CreationContext.NodeCreationType;
  5. import com.ur.urcap.api.contribution.program.ProgramAPIProvider;
  6. import com.ur.urcap.api.domain.ProgramAPI;
  7. import com.ur.urcap.api.domain.data.DataModel;
  8. import com.ur.urcap.api.domain.program.ProgramModel;
  9. import com.ur.urcap.api.domain.program.nodes.ProgramNodeFactory;
  10. import com.ur.urcap.api.domain.program.structure.TreeNode;
  11. import com.ur.urcap.api.domain.program.structure.TreeStructureException;
  12. import com.ur.urcap.api.domain.script.ScriptWriter;
  13. import com.ur.urcap.api.domain.undoredo.UndoableChanges;
  14. import com.ur.urcap.examples.pickorplaceswing.close.GripperCloseProgramNodeService;
  15. import com.ur.urcap.examples.pickorplaceswing.open.GripperOpenProgramNodeService;
  16. public class PickOrPlaceProgramNodeContribution implements ProgramNodeContribution {
  17. private static final String TEMPLATE_KEY = "templateType";
  18. private final ProgramAPIProvider apiProvider;
  19. private final PickOrPlaceProgramNodeView view;
  20. private final DataModel model;
  21. public PickOrPlaceProgramNodeContribution(ProgramAPIProvider apiProvider, PickOrPlaceProgramNodeView view,
  22. DataModel model, CreationContext context) {
  23. this.apiProvider = apiProvider;
  24. this.view = view;
  25. this.model = model;
  26. lockChildSequence(apiProvider);
  27. if (context.getNodeCreationType() == NodeCreationType.NEW) {
  28. this.setModel(TemplateType.EMPTY.getName());
  29. }
  30. }
  31. @Override
  32. public String getTitle() {
  33. return getTemplateType().getName();
  34. }
  35. @Override
  36. public void openView() {
  37. this.view.update(this);
  38. }
  39. @Override
  40. public void closeView() {
  41. }
  42. @Override
  43. public boolean isDefined() {
  44. return true;
  45. }
  46. @Override
  47. public void generateScript(ScriptWriter writer) {
  48. writer.writeChildren();
  49. }
  50. private void setModel(final String variable) {
  51. model.set(TEMPLATE_KEY, variable);
  52. }
  53. public void reset() {
  54. apiProvider.getProgramAPI().getUndoRedoManager().recordChanges(new UndoableChanges() {
  55. @Override
  56. public void executeChanges() {
  57. setModel(TemplateType.EMPTY.getName());
  58. clearSubtree();
  59. view.update(PickOrPlaceProgramNodeContribution.this);
  60. }
  61. });
  62. }
  63. public void createPick() {
  64. apiProvider.getProgramAPI().getUndoRedoManager().recordChanges(new UndoableChanges() {
  65. @Override
  66. public void executeChanges() {
  67. setModel(TemplateType.PICK.getName());
  68. createSubtree(TemplateType.PICK);
  69. view.update(PickOrPlaceProgramNodeContribution.this);
  70. }
  71. });
  72. }
  73. public void createPlace() {
  74. apiProvider.getProgramAPI().getUndoRedoManager().recordChanges(new UndoableChanges() {
  75. @Override
  76. public void executeChanges() {
  77. setModel(TemplateType.PLACE.getName());
  78. createSubtree(TemplateType.PLACE);
  79. view.update(PickOrPlaceProgramNodeContribution.this);
  80. }
  81. });
  82. }
  83. public TemplateType getTemplateType() {
  84. String templateTypeName = model.get(TEMPLATE_KEY, TemplateType.EMPTY.getName());
  85. return TemplateType.valueOfByName(templateTypeName);
  86. }
  87. private void clearSubtree() {
  88. ProgramAPI programAPI = apiProvider.getProgramAPI();
  89. ProgramModel programModel = programAPI.getProgramModel();
  90. TreeNode tree = programModel.getRootTreeNode(this);
  91. int size = childrenCount();
  92. try {
  93. for (int i = 0; i < size; i++) {
  94. tree.removeChild(tree.getChildren().get(0));
  95. }
  96. } catch (TreeStructureException e) {
  97. e.printStackTrace();
  98. // See e.getMessage() for explanation
  99. }
  100. }
  101. private int childrenCount() {
  102. ProgramAPI programAPI = apiProvider.getProgramAPI();
  103. ProgramModel programModel = programAPI.getProgramModel();
  104. return programModel.getRootTreeNode(this).getChildren().size();
  105. }
  106. private void createSubtree(TemplateType template) {
  107. ProgramAPI programAPI = apiProvider.getProgramAPI();
  108. ProgramModel programModel = programAPI.getProgramModel();
  109. ProgramNodeFactory nf = programModel.getProgramNodeFactory();
  110. TreeNode root = programModel.getRootTreeNode(this);
  111. try {
  112. root.addChild(nf.createMoveNode());
  113. addGripper(template, root, nf);
  114. TreeNode folderRetract = root.addChild(nf.createFolderNode());
  115. folderRetract.addChild(nf.createCommentNode().setComment("Please customize your functionality here"));
  116. } catch (TreeStructureException e) {
  117. e.printStackTrace();
  118. // See e.getMessage() for explanation
  119. }
  120. }
  121. private void addGripper(TemplateType template, TreeNode root, ProgramNodeFactory nf) throws TreeStructureException {
  122. switch (template) {
  123. case PICK:
  124. root.addChild(nf.createURCapProgramNode(GripperCloseProgramNodeService.class));
  125. break;
  126. case PLACE:
  127. root.addChild(nf.createURCapProgramNode(GripperOpenProgramNodeService.class));
  128. break;
  129. default:
  130. break;
  131. }
  132. }
  133. private void lockChildSequence(ProgramAPIProvider apiProvider) {
  134. ProgramAPI programAPI = apiProvider.getProgramAPI();
  135. ProgramModel programModel = programAPI.getProgramModel();
  136. TreeNode root = programModel.getRootTreeNode(this);
  137. root.setChildSequenceLocked(true);
  138. }
  139. }