code: protected boolean addNextItem() {
  
          // this method is so complicated because to add the next item,
          // you may need to skip to another group and create the corresponding widget
  
          if (m_model.isEmpty()) {
              return false;
          }
          // now we know there is at least one group
          if (m_currentGroupPanel == null) {
              // this case happens if the method is called for the first time
              m_currentGroupPanel = addGroupPanel(m_model.getGroups().get(0), 0);
          }
          while (true) {
              if (m_currentGroupPanel.hasMoreItems()) {
                  // found next item in the current group
                  boolean found = m_currentGroupPanel.addNextItem();
                  if (found) {
                      m_scrollPanel.onResizeDescendant();
                      return true;
                  }
              } else if (m_currentGroupIndex < (m_model.getGroups().size() - 1)) {
                  // didn't find item in the current group, so skip to next group if available
                  // and create the group widget
                  m_currentGroupIndex += 1;
                  m_currentGroupPanel = addGroupPanel(m_model.getGroups().get(m_currentGroupIndex), m_currentGroupIndex);
              } else {
                  // all groups exhausted
                  m_scrollPanel.onResizeDescendant();
                  return false;
              }
          }
      }
docs: Tries to add a new publish list item to the panel, and returns false if there aren't any items left.<p>
  
  @return true if an item could be added, false if no items are left