/**
  * <code>getPartialPlan</code>
  *
  * @param ppId - <code>Long</code> -
  * @return - <code>PwPartialPlan</code> -
  * @exception ResourceNotFoundException if an error occurs
  * @exception CreatePartialPlanException if the user interrupts the plan creation
  */
 public synchronized PwPartialPlan getPartialPlan(final Long ppId)
     throws ResourceNotFoundException, CreatePartialPlanException {
   for (Iterator it = partialPlans.values().iterator(); it.hasNext(); ) {
     PwPartialPlan pp = (PwPartialPlan) it.next();
     if (pp != null && pp.getId().equals(ppId)) return pp;
   }
   return addPartialPlan(ppId);
 }
  /**
   * <code>addSlotNavNode</code>
   *
   * @param slot - <code>PwSlot</code> -
   * @return - <code>SlotNavNode</code> -
   */
  protected final SlotNavNode addSlotNavNode(final PwSlot slot) {
    boolean isDraggable = true;
    PwTimeline timeline = partialPlan.getTimeline(slot.getTimelineId());

    //     System.err.println( "addSlotNavNode id = " + slot.getId());
    //     System.err.println( "entityNavNodeMap ");
    //     List keyList = new ArrayList( entityNavNodeMap.keySet());
    //     Iterator keyItr = keyList.iterator();
    //     while (keyItr.hasNext()) {
    //       Integer key = (Integer) keyItr.next();
    //       System.err.println( "  key " + key + " " + entityNavNodeMap.get( key).getClass());
    //     }

    SlotNavNode slotNavNode = (SlotNavNode) entityNavNodeMap.get(slot.getId());
    if (slotNavNode == null) {
      slotNavNode =
          new SlotNavNode(
              slot,
              new Point(
                  ViewConstants.TIMELINE_VIEW_X_INIT * 2, ViewConstants.TIMELINE_VIEW_Y_INIT * 2),
              getTimelineColor(timeline.getId()),
              isDraggable,
              this);
      entityNavNodeMap.put(slot.getId(), slotNavNode);
      jGoDocument.addObjectAtTail(slotNavNode);
    }
    return slotNavNode;
  } // end addSlotNavNode
 public final String toString() {
   StringBuffer buf = new StringBuffer("key=");
   buf.append(id.toString()).append("; ");
   if (type == DbConstants.D_OBJECT) {
     if (partialPlan.getResource(entityId) != null) {
       buf.append("Resource ");
     } else if (partialPlan.getTimeline(entityId) != null) {
       buf.append("Timeline ");
     } else if (partialPlan.getObject(entityId) != null) {
       buf.append("Object ");
     }
   } else if (type == DbConstants.D_TOKEN) {
     buf.append("Token ");
   } else if (type == DbConstants.D_VARIABLE) {
     buf.append("Variable ");
   }
   buf.append("key=").append(entityId.toString());
   return buf.toString();
 }
 public final String toOutputString() {
   StringBuffer retval =
       new StringBuffer(partialPlan.getId().toString())
           .append("\t")
           .append(id.toString())
           .append("\t")
           .append(type);
   retval.append("\t").append(entityId.toString()).append("\t");
   if (unit) {
     retval.append(1);
   } else {
     retval.append(0);
   }
   retval.append("\t");
   for (Iterator i = choiceList.iterator(); i.hasNext(); ) {
     retval.append(((PwChoice) i.next()).toOutputString());
   }
   retval.append("\n");
   return retval.toString();
 }
  private void mouseRightPopupMenu(final Point viewCoords) {
    String partialPlanName = partialPlan.getPartialPlanName();
    PwPlanningSequence planSequence = PlanWorks.getPlanWorks().getPlanSequence(partialPlan);
    JPopupMenu mouseRightPopup = new JPopupMenu();

    JMenuItem nodeByKeyItem = new JMenuItem("Find by Key");
    createNodeByKeyItem(nodeByKeyItem);
    mouseRightPopup.add(nodeByKeyItem);

    JMenuItem findEntityPathItem = new JMenuItem("Find Entity Path");
    createFindEntityPathItem(findEntityPathItem);
    mouseRightPopup.add(findEntityPathItem);

    if (highlightPathNodesList != null) {
      JMenuItem highlightPathItem = new JMenuItem("Highlight Current Path");
      createHighlightPathItem(highlightPathItem, highlightPathNodesList);
      mouseRightPopup.add(highlightPathItem);
    }

    createOpenViewItems(
        partialPlan,
        partialPlanName,
        planSequence,
        mouseRightPopup,
        viewListenerList,
        ViewConstants.NAVIGATOR_VIEW);

    JMenuItem overviewWindowItem = new JMenuItem("Overview Window");
    createOverviewWindowItem(overviewWindowItem, this, viewCoords);
    mouseRightPopup.add(overviewWindowItem);

    this.createZoomItem(jGoView, zoomFactor, mouseRightPopup, this);

    createAllViewItems(
        partialPlan, partialPlanName, planSequence, viewListenerList, mouseRightPopup);

    ViewGenerics.showPopupMenu(mouseRightPopup, this, viewCoords);
  } // end mouseRightPopupMenu
 private boolean isNodeKeyValid(Integer nodeKey) {
   boolean isValid = false;
   PwPartialPlan partialPlan = partialPlanView.getPartialPlan();
   if ((partialPlanView instanceof TemporalExtentView)
       || (partialPlanView instanceof TokenNetworkView)) {
     if (partialPlan.getToken(nodeKey) != null) {
       return true;
     }
   } else if ((partialPlanView instanceof TimelineView)) {
     if ((partialPlan.getToken(nodeKey) != null) || (partialPlan.getSlot(nodeKey) != null)) {
       return true;
     }
   } else if ((partialPlanView instanceof ConstraintNetworkView)) {
     if ((partialPlan.getToken(nodeKey) != null)
         || (partialPlan.getVariable(nodeKey) != null)
         || (partialPlan.getConstraint(nodeKey) != null)) {
       return true;
     }
   } else {
     System.err.println("AskNodeByKey.isNodeKeyValid: " + partialPlanView + " not handled");
     System.exit(-1);
   }
   return isValid;
 } // end isNodeKeyValid
 /**
  * <code>renderEntityPathNodes</code>
  *
  * @param findEntityPath - <code>FindEntityPath</code> -
  * @return - <code>List</code> -
  */
 public List renderEntityPathNodes(final FindEntityPath findEntityPath) {
   boolean isLayoutNeeded = false;
   List nodeList = new ArrayList();
   Iterator entityItr = findEntityPath.getEntityKeyList().iterator();
   PwEntity entity = null;
   boolean isFirstNode = true;
   while (entityItr.hasNext()) {
     Integer entityKey = (Integer) entityItr.next();
     // System.err.println( "key " + entityKey);
     if ((entity = partialPlan.getToken(entityKey)) != null) {
       TokenNavNode tokenNode = null;
       if (isFirstNode) {
         isFirstNode = false;
         tokenNode = (TokenNavNode) renderInitialNode(entity);
         if (didRenderInitialNodeChange) {
           isLayoutNeeded = true;
         }
       } else {
         PwToken token = (PwToken) entity;
         tokenNode = addTokenNavNode(token);
         if (!tokenNode.areNeighborsShown()) {
           if (tokenNode.addTokenObjects(tokenNode)) {
             isLayoutNeeded = true;
           }
           tokenNode.setAreNeighborsShown(true);
         }
       }
       nodeList.add(tokenNode);
     } else if ((entity = partialPlan.getVariable(entityKey)) != null) {
       VariableNavNode variableNode = null;
       if (isFirstNode) {
         isFirstNode = false;
         variableNode = (VariableNavNode) renderInitialNode(entity);
         if (didRenderInitialNodeChange) {
           isLayoutNeeded = true;
         }
       } else {
         PwVariable variable = (PwVariable) entity;
         variableNode = addVariableNavNode(variable);
         if (!variableNode.areNeighborsShown()) {
           if (variableNode.addVariableObjects(variableNode)) {
             isLayoutNeeded = true;
           }
           variableNode.setAreNeighborsShown(true);
         }
       }
       nodeList.add(variableNode);
     } else if ((entity = partialPlan.getConstraint(entityKey)) != null) {
       ConstraintNavNode constraintNode = null;
       if (isFirstNode) {
         isFirstNode = false;
         constraintNode = (ConstraintNavNode) renderInitialNode(entity);
         if (didRenderInitialNodeChange) {
           isLayoutNeeded = true;
         }
       } else {
         PwConstraint constraint = (PwConstraint) entity;
         constraintNode = addConstraintNavNode(constraint);
         if (!constraintNode.areNeighborsShown()) {
           if (constraintNode.addConstraintObjects(constraintNode)) {
             isLayoutNeeded = true;
           }
           constraintNode.setAreNeighborsShown(true);
         }
       }
       nodeList.add(constraintNode);
     } else if ((entity = partialPlan.getRuleInstance(entityKey)) != null) {
       RuleInstanceNavNode ruleInstanceNode = null;
       if (isFirstNode) {
         isFirstNode = false;
         ruleInstanceNode = (RuleInstanceNavNode) renderInitialNode(entity);
         if (didRenderInitialNodeChange) {
           isLayoutNeeded = true;
         }
       } else {
         PwRuleInstance ruleInstance = (PwRuleInstance) entity;
         ruleInstanceNode = addRuleInstanceNavNode(ruleInstance);
         if (!ruleInstanceNode.areNeighborsShown()) {
           if (ruleInstanceNode.addRuleInstanceObjects(ruleInstanceNode)) {
             isLayoutNeeded = true;
           }
           ruleInstanceNode.setAreNeighborsShown(true);
         }
       }
       nodeList.add(ruleInstanceNode);
     } else if ((entity = partialPlan.getSlot(entityKey)) != null) {
       SlotNavNode slotNode = null;
       if (isFirstNode) {
         isFirstNode = false;
         slotNode = (SlotNavNode) renderInitialNode(entity);
         if (didRenderInitialNodeChange) {
           isLayoutNeeded = true;
         }
       } else {
         PwSlot slot = (PwSlot) entity;
         slotNode = addSlotNavNode(slot);
         if (!slotNode.areNeighborsShown()) {
           if (slotNode.addSlotObjects(slotNode)) {
             isLayoutNeeded = true;
           }
           slotNode.setAreNeighborsShown(true);
         }
       }
       nodeList.add(slotNode);
     } else if ((entity = partialPlan.getTimeline(entityKey)) != null) {
       TimelineNavNode timelineNode = null;
       if (isFirstNode) {
         isFirstNode = false;
         timelineNode = (TimelineNavNode) renderInitialNode(entity);
         if (didRenderInitialNodeChange) {
           isLayoutNeeded = true;
         }
       } else {
         PwTimeline timeline = (PwTimeline) entity;
         timelineNode = addTimelineNavNode(timeline);
         if (!timelineNode.areNeighborsShown()) {
           if (timelineNode.addTimelineObjects(timelineNode)) {
             isLayoutNeeded = true;
           }
           timelineNode.setAreNeighborsShown(true);
         }
       }
       nodeList.add(timelineNode);
     } else if ((entity = partialPlan.getResource(entityKey)) != null) {
       ResourceNavNode resourceNode = null;
       if (isFirstNode) {
         isFirstNode = false;
         resourceNode = (ResourceNavNode) renderInitialNode(entity);
         if (didRenderInitialNodeChange) {
           isLayoutNeeded = true;
         }
       } else {
         PwResource resource = (PwResource) entity;
         resourceNode = addResourceNavNode(resource);
         if (!resourceNode.areNeighborsShown()) {
           if (resourceNode.addResourceObjects(resourceNode)) {
             isLayoutNeeded = true;
           }
           resourceNode.setAreNeighborsShown(true);
         }
       }
       nodeList.add(resourceNode);
     } else if ((entity = partialPlan.getObject(entityKey)) != null) {
       // PwObject must be last
       ModelClassNavNode objectNode = null;
       if (isFirstNode) {
         isFirstNode = false;
         objectNode = (ModelClassNavNode) renderInitialNode(entity);
         if (didRenderInitialNodeChange) {
           isLayoutNeeded = true;
         }
       } else {
         PwObject object = (PwObject) entity;
         objectNode = addModelClassNavNode(object);
         if (!objectNode.areNeighborsShown()) {
           if (objectNode.addObjects(objectNode)) {
             isLayoutNeeded = true;
           }
           objectNode.setAreNeighborsShown(true);
         }
       }
       nodeList.add(objectNode);
     } else {
       System.err.println(
           "NavigatorView.renderEntityPathNodes: entityKey " + entityKey + " not handled");
     }
   }
   if (isLayoutNeeded) {
     // System.err.println( "NavigatorView.renderEntityPathNodes: setLayoutNeeded");
     setLayoutNeeded();
   }
   setFocusNode(null);
   highlightPathNodesList = nodeList;
   redraw();
   return nodeList;
 } // end renderEntityPathNodes
  /**
   * <code>init</code> - wait for instance to become displayable, determine appropriate font
   * metrics, and render the JGo timeline, and slot widgets
   *
   * <p>These functions are not done in the constructor to avoid: "Cannot measure text until a
   * JGoView exists and is part of a visible window". called by componentShown method on the JFrame
   * JGoView.setVisible( true) must be completed -- use runInit in constructor
   */
  public final void init() {
    handleEvent(ViewListener.EVT_INIT_BEGUN_DRAWING);
    // wait for TimelineView instance to become displayable
    while (!this.isDisplayable()) {
      try {
        Thread.currentThread().sleep(50);
      } catch (InterruptedException excp) {
      }
      // System.err.println( "timelineView displayable " + this.isDisplayable());
    }
    this.computeFontMetrics(this);

    QueryHeaderView headerJGoView = new QueryHeaderView(query);
    headerJGoView.validate();
    headerJGoView.setVisible(true);

    FixedHeightPanel variableHeaderPanel = new FixedHeightPanel(headerJGoView, this);
    variableHeaderPanel.setLayout(new BoxLayout(variableHeaderPanel, BoxLayout.Y_AXIS));
    variableHeaderPanel.add(headerJGoView, BorderLayout.NORTH);
    add(variableHeaderPanel, BorderLayout.NORTH);

    String[] columnNames = {
      ViewConstants.DB_TRANSACTION_STEP_NUM_HEADER,
      ViewConstants.QUERY_VARIABLE_KEY_HEADER,
      ViewConstants.QUERY_VARIABLE_TYPE_HEADER,
      ViewConstants.DB_TRANSACTION_PARENT_HEADER,
      // empty last column to allow user adjusting of column widths
      ""
    };
    PwPartialPlan partialPlan = null;
    try {
      partialPlan = planSequence.getPartialPlan(stepNumber);
    } catch (ResourceNotFoundException rnfExcep) {
      int index = rnfExcep.getMessage().indexOf(":");
      JOptionPane.showMessageDialog(
          PlanWorks.getPlanWorks(),
          rnfExcep.getMessage().substring(index + 1),
          "Resource Not Found Exception",
          JOptionPane.ERROR_MESSAGE);
      System.err.println(rnfExcep);
      rnfExcep.printStackTrace();
    }
    Object[][] data = new Object[variableList.size()][columnNames.length];
    for (int row = 0, nRows = variableList.size(); row < nRows; row++) {
      PwVariableQuery variable = (PwVariableQuery) variableList.get(row);
      data[row][0] = variable.getStepNumber().toString();
      data[row][1] = variable.getId().toString();
      data[row][2] = variable.getType();
      data[row][3] = partialPlan.getVariableParentName(variable.getParentId());
    }
    objectKeyColumnIndx = 1;
    stepNumberColumnIndx = 0;
    TableSorter sorter = new TableSorter(new DBTransactionTableModel(columnNames, data));
    variableTable = new DBTransactionTable(sorter, stepNumberColumnIndx, this);
    sorter.setTableHeader(variableTable.getTableHeader());
    contentScrollPane = new JScrollPane(variableTable);
    add(contentScrollPane, BorderLayout.SOUTH);

    this.setVisible(true);

    int maxViewWidth = (int) headerJGoView.getDocumentSize().getWidth();
    int maxViewHeight =
        (int)
            (headerJGoView.getDocumentSize().getHeight()
                +
                // contentJGoView.getDocumentSize().getHeight());
                // keep contentJGoView small
                (ViewConstants.INTERNAL_FRAME_X_DELTA));
    viewFrame.setSize(
        maxViewWidth + ViewConstants.MDI_FRAME_DECORATION_WIDTH,
        maxViewHeight + ViewConstants.MDI_FRAME_DECORATION_HEIGHT);
    int maxQueryFrameY =
        (int)
            (sequenceQueryWindow.getSequenceQueryFrame().getLocation().getY()
                + sequenceQueryWindow.getSequenceQueryFrame().getSize().getHeight());
    int delta =
        Math.min(
            ViewConstants.INTERNAL_FRAME_X_DELTA_DIV_4
                * sequenceQueryWindow.getQueryResultFrameCnt(),
            (int)
                (PlanWorks.getPlanWorks().getSize().getHeight()
                    - maxQueryFrameY
                    - (ViewConstants.MDI_FRAME_DECORATION_HEIGHT * 2)));
    viewFrame.setLocation(ViewConstants.INTERNAL_FRAME_X_DELTA + delta, maxQueryFrameY + delta);
    // prevent right edge from going outside the MDI frame
    expandViewFrame(
        viewFrame,
        Math.max(
            (int) headerJGoView.getDocumentSize().getWidth(),
            variableTable.getColumnModel().getTotalColumnWidth()),
        (int)
            (headerJGoView.getDocumentSize().getHeight()
                + variableTable.getRowCount() * variableTable.getRowHeight()));

    long stopTimeMSecs = System.currentTimeMillis();
    System.err.println(
        "   ... '"
            + this.getName()
            + "'elapsed time: "
            + (stopTimeMSecs - startTimeMSecs)
            + " msecs.");
    handleEvent(ViewListener.EVT_INIT_ENDED_DRAWING);
  } // end init