private void showPage() {
   if (treeNodesArray != null) {
     int pageCount = treeNodesArray.size() / maxNodesPerPage;
     if (currentPage < 0) {
       currentPage = 0;
     }
     if (currentPage > pageCount) {
       currentPage = pageCount;
     }
     final int startNode = currentPage * maxNodesPerPage;
     int endNode = startNode + maxNodesPerPage;
     if (endNode > treeNodesArray.size()) {
       endNode = treeNodesArray.size();
     }
     currentPageLabel.setText((currentPage + 1) + " of " + (pageCount + 1));
     rootNode.setChildNodes(
         treeNodesArray.subList(startNode, endNode).toArray(new ArbilNode[] {}));
     kinTree.requestResort();
   }
   progressBar.setVisible(false);
   ProjectTreePanel.this.remove(progressBar);
   ProjectTreePanel.this.add(pagePanel, BorderLayout.PAGE_END);
   this.revalidate();
 }
 public void loadProjectTree() {
   ProjectTreePanel.this.remove(pagePanel);
   ProjectTreePanel.this.add(progressBar, BorderLayout.PAGE_END);
   progressBar.setVisible(true);
   progressBar.setIndeterminate(true);
   this.revalidate();
   kinTree.requestResort();
   new Thread() {
     @Override
     public void run() {
       boolean projectQueryRunning = ATOMIC_BOOLEAN.getAndSet(true);
       synchronized (lockObject) {
         final ArrayList<KinTreeNode> tempTreeNodesArray = new ArrayList<KinTreeNode>();
         if (!projectQueryRunning && updateRequired) {
           try {
             EntityData[] projectEntities =
                 entityCollection.getEntityByEndPoint(
                     DataTypes.RelationType.ancestor, graphPanel.getIndexParameters());
             for (EntityData entityData : projectEntities) {
               boolean isHorizontalEndPoint = true;
               // this check is for end points that have a sibling or spouse who are not an end
               // point, but it is removed because it is not possible to browse to a spouse or
               // sibling in a directional branch
               //                    for (EntityRelation entityRelation :
               // entityData.getAllRelations()) {
               //                        if (entityRelation.getAlterNode() == null) {
               //                            // if the alter node has not been loaded then it must
               // not be an end point
               //                            if (entityRelation.getRelationType() ==
               // DataTypes.RelationType.union || entityRelation.getRelationType() ==
               // DataTypes.RelationType.sibling) {
               //                                isHorizontalEndPoint = false;
               //                                break;
               //                            }
               //                        }
               //                    }
               if (isHorizontalEndPoint) {
                 // todo: add cache and update (on change) of the tree nodes
                 tempTreeNodesArray.add(
                     new KinTreeNode(
                         symbolGraphic,
                         entityData.getUniqueIdentifier(),
                         entityData,
                         graphPanel.dataStoreSvg,
                         graphPanel.getIndexParameters(),
                         dialogHandler,
                         entityCollection,
                         dataNodeLoader));
               }
             }
             Collections.sort(tempTreeNodesArray);
             updateRequired = false;
           } catch (EntityServiceException exception) {
             dialogHandler.addMessageDialogToQueue(exception.getMessage(), "Get Project Entities");
           }
         }
         treeNodesArray = tempTreeNodesArray;
         SwingUtilities.invokeLater(
             new Runnable() {
               public void run() {
                 showPage();
               }
             });
         ATOMIC_BOOLEAN.set(false);
       }
     }
   }.start();
 }