@Override
  public void draw(float fXCenter, float fYCenter, GL2 gl, GLU glu) {

    HashMap<PartialDisc, PDDrawingStrategySelected> mapSelectedDrawingStrategies =
        new HashMap<PartialDisc, PDDrawingStrategySelected>();
    parentIndicatorType = SelectionType.NORMAL;

    initDrawingStrategies(mapSelectedDrawingStrategies);

    PartialDisc pdCurrentRootElement = radialHierarchy.getCurrentRootElement();

    gl.glLoadIdentity();
    gl.glTranslatef(fXCenter, fYCenter, 0);

    float fHierarchyOuterRadius =
        Math.min(
            fXCenter * RadialHierarchyRenderStyle.USED_SCREEN_PERCENTAGE,
            fYCenter * RadialHierarchyRenderStyle.USED_SCREEN_PERCENTAGE);
    float fDiscWidth = fHierarchyOuterRadius / iDisplayedHierarchyDepth;

    pdCurrentRootElement.drawHierarchyFull(gl, glu, fDiscWidth, iDisplayedHierarchyDepth);

    // The selected elements have to be drawn (again using their own drawing
    // strategy) at last for
    // correct antialiasing

    for (PartialDisc pdSelected : mapSelectedDrawingStrategies.keySet()) {
      PDDrawingStrategySelected dsCurrent = mapSelectedDrawingStrategies.get(pdSelected);
      dsCurrent.drawPartialDisc(gl, glu, pdSelected);
    }

    if (parentIndicatorType != SelectionType.NORMAL) {
      gl.glPushClientAttrib(GL.GL_COLOR_BUFFER_BIT);
      if (parentIndicatorType == SelectionType.SELECTION)
        gl.glColor3fv(SelectionType.SELECTION.getColor().getRGB(), 0);
      else gl.glColor3fv(SelectionType.MOUSE_OVER.getColor().getRGB(), 0);
      GLPrimitives.renderCircle(glu, fDiscWidth / 2.0f, 100);
      GLPrimitives.renderCircleBorder(gl, glu, fDiscWidth / 2.0f, 100, 2);
      gl.glPopAttrib();
    }

    LabelManager.get()
        .drawAllLabels(gl, glu, fXCenter * 2.0f, fYCenter * 2.0f, fHierarchyOuterRadius);
    LabelManager.get().clearLabels();

    radialHierarchy.setNewSelection(false);
  }