group.shiftInputsAndOutputs(bi, true);
group.shiftBeans(bi, true);
  private void checkSubFlow(int startX, int startY,                            int endX, int endY) {    java.awt.Rectangle r =       new java.awt.Rectangle((startX < endX) ? startX : endX,                             (startY < endY) ? startY: endY,                             Math.abs(startX - endX),                             Math.abs(startY - endY));    Vector selected = BeanInstance.findInstances(r);    // check if sub flow is valid    Vector inputs = BeanConnection.inputs(selected);    Vector outputs = BeanConnection.outputs(selected);        // screen the inputs and outputs    if (inputs.size() == 0 || outputs.size() == 0) {      return;    }    // dissallow MetaBeans in the selected set (for the    // time being).    for (int i = 0; i < selected.size(); i++) {      BeanInstance temp = (BeanInstance)selected.elementAt(i);      if (temp.getBean() instanceof MetaBean) {        return;      }    }    // show connector dots for selected beans    for (int i = 0; i < selected.size(); i++) {      BeanInstance temp = (BeanInstance)selected.elementAt(i);      if (temp.getBean() instanceof Visible) {        ((Visible)temp.getBean()).getVisual().setDisplayConnectors(true);      }    }    // show connector dots for input beans    for (int i = 0; i < inputs.size(); i++) {      BeanInstance temp = (BeanInstance)inputs.elementAt(i);      if (temp.getBean() instanceof Visible) {        ((Visible)temp.getBean()).getVisual().          setDisplayConnectors(true, java.awt.Color.red);      }    }    // show connector dots for output beans    for (int i = 0; i < outputs.size(); i++) {      BeanInstance temp = (BeanInstance)outputs.elementAt(i);      if (temp.getBean() instanceof Visible) {        ((Visible)temp.getBean()).getVisual().          setDisplayConnectors(true, java.awt.Color.green);      }    }    // Confirmation pop-up    int result = JOptionPane.showConfirmDialog(KnowledgeFlowApp.this,                                               "Group this sub-flow?",                                               "Group Components",                                               JOptionPane.YES_NO_OPTION);    if (result == JOptionPane.YES_OPTION) {      Vector associatedConnections =         BeanConnection.associatedConnections(selected);      String name = JOptionPane.showInputDialog(KnowledgeFlowApp.this,                                                "Enter a name for this group",                                                "MyGroup");      if (name != null) {               MetaBean group = new MetaBean();        group.setSubFlow(selected);        group.setAssociatedConnections(associatedConnections);        group.setInputs(inputs);        group.setOutputs(outputs);        if (name.length() > 0) {          group.getVisual().setText(name);        }                if (group instanceof BeanContextChild) {          m_bcSupport.add(group);        }        BeanInstance bi = new BeanInstance(m_beanLayout, group,                                            (int)r.getX()+(int)(r.getWidth()/2),                                           (int)r.getY()+(int)(r.getHeight()/2));        for (int i = 0; i < selected.size(); i++) {          BeanInstance temp = (BeanInstance)selected.elementAt(i);          temp.removeBean(m_beanLayout);          if (temp.getBean() instanceof Visible) {            ((Visible)temp.getBean()).getVisual().removePropertyChangeListener(this);          }        }        for (int i = 0; i < associatedConnections.size(); i++) {          BeanConnection temp = (BeanConnection)associatedConnections.elementAt(i);          temp.setHidden(true);        }        group.shiftInputsAndOutputs(bi, true);                addComponent(bi, true);      }    }    // hide connector dots    for (int i = 0; i < selected.size(); i++) {      BeanInstance temp = (BeanInstance)selected.elementAt(i);      if (temp.getBean() instanceof Visible) {        ((Visible)temp.getBean()).getVisual().setDisplayConnectors(false);      }    }      }