title: How to reduce Cyclomatic Complexity by refactoring the code?
body: <p>The question is repeated one but still I am asking because by using the method suggested in the solution I am not able to reduce complexity significantly.
  The functions complexity is 28 and I have to reduce it below 10.</p>
  
  <pre><code>private void adjustViewport(IEditorPart editorPart, LineRange range,
      TextSelection selection) {
      ITextViewer viewer = EditorAPI.getViewer(editorPart);
      if (viewer == null) +1
          return; +1
  
      IDocument document = viewer.getDocument();
      LineRange viewportOfViewer = EditorAPI.getViewport(viewer);
  
      if (viewportOfViewer == null || document == null) +1 +1
          return; +1
  
      int lines = document.getNumberOfLines();
      int rangeTop = 0;
      int rangeBottom = 0;
      int selectionTop = 0;
      int selectionBottom = 0;
  
      if (selection != null) { +1
          try {
              selectionTop = document.getLineOfOffset(selection.getOffset());
              selectionBottom = document.getLineOfOffset(selection
                  .getOffset() + selection.getLength());
          } catch (BadLocationException e) { +1
              // should never be reached
              LOG.error("Invalid line selection: offset: "
                  + selection.getOffset() + ", length: "
                  + selection.getLength());
  
              selection = null;
          }
      }
  
      if (range != null) { +1
          if (range.getStartLine() == -1) { +1
              range = null;
          } else {
              rangeTop = Math.min(lines - 1, range.getStartLine());
              rangeBottom = Math.min(lines - 1,
                  rangeTop + range.getNumberOfLines());
          }
      }
  
      if (range == null &amp;&amp; selection == null) +1 +1
          return; +1
  
      // top line of the new viewport
      int topPosition;
      int localLines = viewportOfViewer.getNumberOfLines();
      int remoteLines = rangeBottom - rangeTop;
      int sizeDiff = remoteLines - localLines;
  
      // initializations finished
  
      if (range == null || selection == null) { +1 +1
          topPosition = (rangeTop + rangeBottom + selectionTop + selectionBottom) / 2;
          viewer.setTopIndex(topPosition);
          return; +1
      }
  
      /*
       * usually the viewport of the follower and the viewport of the followed
       * user will have the same center (this calculation). Exceptions may be
       * made below.
       */
      int center = (rangeTop + rangeBottom) / 2;
      topPosition = center - localLines / 2;
  
      if (sizeDiff &lt;= 0) { +1
          // no further examination necessary when the local viewport is the
          // larger one
          viewer.setTopIndex(Math.max(0, Math.min(topPosition, lines)));
          return; +1
      }
  
      boolean selectionTopInvisible = (selectionTop &lt; rangeTop + sizeDiff / 2);
      boolean selectionBottomInvisible = (selectionBottom &gt; rangeBottom
          - sizeDiff / 2 - 1);
  
      if (rangeTop == 0 +1
          &amp;&amp; !(selectionTop &lt;= rangeBottom &amp;&amp; selectionTop &gt; rangeBottom +1 +1
              - sizeDiff)) {
          // scrolled to the top and no selection at the bottom of range
          topPosition = 0;
  
      } else if (rangeBottom == lines - 1 +1
          &amp;&amp; !(selectionBottom &gt;= rangeTop &amp;&amp; selectionBottom &lt; rangeTop +1 +1
              + sizeDiff)) {
          // scrolled to the bottom and no selection at the top of range
          topPosition = lines - localLines;
  
      } else if (selectionTopInvisible &amp;&amp; selectionBottom &gt;= rangeTop) { +1 +1
          // making selection at top of range visible
          topPosition = Math.max(rangeTop, selectionTop);
  
      } else if (selectionBottomInvisible &amp;&amp; selectionTop &lt;= rangeBottom) { +1 +1
          // making selection at bottom of range visible
          topPosition = Math.min(rangeBottom, selectionBottom) - localLines
              + 1;
      }
  
      viewer.setTopIndex(Math.max(0, Math.min(topPosition, lines)));
  }
  </code></pre>
  
  <p>Edit: I have reduced the complexity down to 11. How should I reduce it furthur ?</p>
  
  <pre><code>private int setTopPositionUtil(int sizeDiff, int rangeTop, int rangeBottom, int selectionTop, int selectionBottom) {
  boolean selectionTopInvisible = (selectionTop &lt; rangeTop + sizeDiff / 2);
  boolean selectionBottomInvisible = (selectionBottom &gt; rangeBottom - sizeDiff / 2 - 1);
  if (rangeTop == 0 &amp;&amp; !(selectionTop &lt;= rangeBottom &amp;&amp; selectionTop &gt; rangeBottom - sizeDiff)) { // +1 +1 +1
      // scrolled to the top and no selection at the bottom of range
      topPosition = 0;
  } else if (rangeBottom == lines - 1 &amp;&amp; !(selectionBottom &gt;= rangeTop &amp;&amp; selectionBottom &lt; rangeTop + sizeDiff)) { // +1 +1 +1
      // scrolled to the bottom and no selection at the top of range
      topPosition = lines - localLines;
  } else if (selectionTopInvisible &amp;&amp; selectionBottom &gt;= rangeTop) { // +1 +1
      // making selection at top of range visible
      topPosition = Math.max(rangeTop, selectionTop);
  } else if (selectionBottomInvisible &amp;&amp; selectionTop &lt;= rangeBottom) { // +1 +1
      // making selection at bottom of range visible
      topPosition = Math.min(rangeBottom, selectionBottom) - localLines + 1;
  }
  return topPosition;
  }
  
  private int setTopPosition(int localLines, int rangeTop, int rangeBottom,int selectionTop, int selectionBottom) {
  
  // top line of the new viewport
  int topPosition;
  int remoteLines = rangeBottom - rangeTop;
  int sizeDiff = remoteLines - localLines;
  
  // initializations finished
  
  /*
   * usually the viewport of the follower and the viewport of the followed
   * user will have the same center (this calculation). Exceptions may be
   * made below.
   */
  int center = (rangeTop + rangeBottom) / 2;
  topPosition = center - localLines / 2;
  
  if (sizeDiff &gt; 0) { // +1
      setTopPositionUtil(sizeDiff, rangeTop, rangeBottom, selectionTop, selec);
  }
  
  return Math.max(0, Math.min(topPosition, lines)); // +1
  }
  
  private void adjustViewport(IEditorPart editorPart, LineRange range,TextSelection selection) {
  ITextViewer viewer = EditorAPI.getViewer(editorPart);
  if (viewer != null) { // +1
  
      IDocument document = viewer.getDocument();
      LineRange viewportOfViewer = EditorAPI.getViewport(viewer);
  
      if (viewportOfViewer != null &amp;&amp; document != null) { // +1 +1
  
          int lines = document.getNumberOfLines();
          int rangeTop = 0;
          int rangeBottom = 0;
          int selectionTop = 0;
          int selectionBottom = 0;
  
          if (selection != null) { // +1
              try {
                  selectionTop = document.getLineOfOffset(selection.getOffset());
                  selectionBottom = document.getLineOfOffset(selection
                      .getOffset() + selection.getLength());
              } catch (BadLocationException e) { // +1
                  // should never be reached
                  LOG.error("Invalid line selection: offset: " +
                      selection.getOffset() + ", length: " +
                      selection.getLength());
  
                  selection = null;
              }
          }
  
          if (range != null) { // +1
              if (range.getStartLine() == -1) { // +1
                  range = null;
              } else {
                  rangeTop = Math.min(lines - 1, range.getStartLine());
                  rangeBottom = Math.min(lines - 1,
                      rangeTop + range.getNumberOfLines());
              }
          }
  
          if (range != null &amp;&amp; selection != null) { // +1 +1
              viewer.setTopIndex(setTopPosition(viewportOfViewer.getNumberOfLines(),
                  rangeTop, rangeBottom, selectionTop, selectionBottom));
          } else {
              viewer.setTopIndex((rangeTop + rangeBottom + selectionTop + selectionBottom) / 2);
          }
      }
  }
  }
  </code></pre>
  
  <p>Note:The code now consists of 3 methods. The complexity of the second and third are below 10, however the complexity of setTopPositionUtil is still 11. Any help ?<br>
  Sorry for the indentation.</p>