protected void searchSubProcess(SubProcess sub) {
    StringBuilder temp = new StringBuilder();

    int num = 0;
    for (FlowElement fe : sub.getFlowElements()) {
      if (fe instanceof SubProcess) {
        SubProcess ssub = (SubProcess) fe;
        // System.out.format("Found a SubProcess: %s\n", ssub.getName());
        this.searchSubProcess(ssub);
      } else if (fe instanceof IntermediateCatchEvent) {

        IntermediateCatchEvent a = (IntermediateCatchEvent) fe;
        if (a.getName() == null || (a.getName().length() == 0)) {
          // System.out.println(fe.eClass().getName() + ": name="+ fe.getName()!=null? fe.getName()
          // : "Unlabeled" + " ID=" + fe.getId());
          num++;

          elementsBPMN.add(fe);
          String name =
              fe.getName() != null
                  ? fe.getName()
                  : Messages.getString("Generic.LabelEmpty", l); // $NON-NLS-1$
          setElements(fe.getId(), IDProcess, name);
          temp.append(
              "* name="
                  + name
                  + " ID="
                  + fe.getId() // $NON-NLS-1$ //$NON-NLS-2$
                  + "\n"); //$NON-NLS-1$
        }

      } else if (fe instanceof IntermediateThrowEvent) {
        IntermediateThrowEvent a = (IntermediateThrowEvent) fe;
        if (a.getName() == null || (a.getName().length() == 0)) {
          num++;

          elementsBPMN.add(fe);
          String name =
              fe.getName() != null
                  ? fe.getName()
                  : Messages.getString("Generic.LabelEmpty", l); // $NON-NLS-1$
          setElements(fe.getId(), IDProcess, name);
          temp.append(
              "* name="
                  + name
                  + " ID="
                  + fe.getId() // $NON-NLS-1$ //$NON-NLS-2$
                  + "\n"); //$NON-NLS-1$
        }
      }
    }
    if (num > 0) {
      this.Suggestion +=
          Messages.getString("LabelingEvents.SuggestionSubProcessKO", l)
              + sub.getName()
              + " "; //$NON-NLS-1$ //$NON-NLS-2$
      this.status = false;
    }
  }
  public static void updateCategoryValues(IFeatureProvider fp, PictogramElement pe) {

    Resource resource = ObjectPropertyProvider.getResource(pe);
    if (Bpmn2Preferences.getInstance(resource).getPropagateGroupCategories()) {
      // only do this if User Preference is enabled: assign the Group's CategoryValue
      // to the FlowElement represented by the given PictogramElement
      Diagram diagram = fp.getDiagramTypeProvider().getDiagram();
      FlowElement flowElement = BusinessObjectUtil.getFirstElementOfType(pe, FlowElement.class);
      if (flowElement == null) return;
      // remove any previous Category Values from this FlowElement
      flowElement.getCategoryValueRef().clear();

      // find all Groups in this Resource and check if it contains the given FlowElement
      if (pe instanceof ContainerShape) {
        for (Group group : ModelUtil.getAllObjectsOfType(resource, Group.class)) {
          CategoryValue cv = group.getCategoryValueRef();
          if (cv == null) continue;

          for (PictogramElement groupShape :
              Graphiti.getLinkService().getPictogramElements(diagram, group)) {
            if (groupShape instanceof ContainerShape) {
              for (ContainerShape flowElementShape :
                  FeatureSupport.findGroupedShapes((ContainerShape) groupShape)) {
                FlowElement fe =
                    BusinessObjectUtil.getFirstElementOfType(flowElementShape, FlowElement.class);
                if (fe == flowElement) {
                  fe.getCategoryValueRef().add(cv);
                  break;
                }
              }
            }
          }
        }
      } else if (pe instanceof Connection && flowElement instanceof SequenceFlow) {
        SequenceFlow sf = (SequenceFlow) flowElement;
        FlowNode source = sf.getSourceRef();
        FlowNode target = sf.getTargetRef();

        sf.getCategoryValueRef().clear();
        sf.getCategoryValueRef().addAll(source.getCategoryValueRef());
        sf.getCategoryValueRef().addAll(target.getCategoryValueRef());
      }
    }
  }
  @Override
  protected void findGL(Definitions diagram) {
    StringBuilder temp = new StringBuilder();

    int num = 0;

    for (RootElement rootElement : diagram.getRootElements()) {
      if (rootElement instanceof Process) {
        Process process = (Process) rootElement;
        // System.out.format("Found a process: %s\n", process.getName());

        IDProcess = process.getId();
        for (FlowElement fe : process.getFlowElements()) {
          if (fe instanceof SubProcess) {
            SubProcess sub = (SubProcess) fe;
            // System.out.format("Found a SubProcess: %s\n", sub.getName());
            this.searchSubProcess(sub);
          } else if (fe instanceof IntermediateCatchEvent) {
            IntermediateCatchEvent a = (IntermediateCatchEvent) fe;
            if (a.getName() == null || (a.getName().length() == 0)) {
              num++;

              elementsBPMN.add(fe);
              String name =
                  fe.getName() != null
                      ? fe.getName()
                      : Messages.getString("Generic.LabelEmpty", l); // $NON-NLS-1$
              setElements(fe.getId(), IDProcess, name);
              temp.append(
                  "* name="
                      + name
                      + " ID="
                      + fe.getId() // $NON-NLS-1$ //$NON-NLS-2$
                      + "\n"); //$NON-NLS-1$
            }

          } else if (fe instanceof IntermediateThrowEvent) {
            IntermediateThrowEvent a = (IntermediateThrowEvent) fe;
            if (a.getName() == null || (a.getName().length() == 0)) {
              num++;

              elementsBPMN.add(fe);
              String name =
                  fe.getName() != null
                      ? fe.getName()
                      : Messages.getString("Generic.LabelEmpty", l); // $NON-NLS-1$
              setElements(fe.getId(), IDProcess, name);
              temp.append(
                  "* name="
                      + name
                      + " ID="
                      + fe.getId() // $NON-NLS-1$ //$NON-NLS-2$
                      + "\n"); //$NON-NLS-1$
            }
          }
        }
      }
    }
    if (num > 0) {

      this.Suggestion += Messages.getString("LabelingEvents.SuggestionKO", l); // $NON-NLS-1$
      this.status = false;
    } else {
      this.status = true;
      this.Suggestion += Messages.getString("LabelingEvents.SuggestionOK", l); // $NON-NLS-1$
    }
  }