@Override
  public void updateItem(LibraryListItem item, boolean empty) {
    super.updateItem(item, empty);
    setText(null);

    if (!empty && item != null) {
      updateLayout(item);
      if (item.getLibItem() != null) {
        // A qualifier needed to discriminate items is kept in the ID:
        // this applies to orientation as well as empty qualifiers.
        // FX8 qualifier is not kept as there's no ambiguity there.
        String id = item.getLibItem().getName();
        if (id.contains(BuiltinLibrary.getFX8Qualifier())) {
          id = id.substring(0, id.indexOf(BuiltinLibrary.getFX8Qualifier()));
        }
        // If QE were about to test a localized version the ID should
        // remain unchanged.
        if (id.contains(BuiltinLibrary.getEmptyQualifier())) {
          id = id.replace(BuiltinLibrary.getEmptyQualifier(), EMPTY_QUALIFIER_ID);
        }
        graphic.setId(id); // for QE
      }

      setGraphic(graphic);
    } else {
      setGraphic(null);
    }
  }
  private void handleMouseEvent(MouseEvent me) {
    // Handle cursor
    final Scene scene = getScene();

    if (scene == null) {
      return;
    }

    // When another window is focused (just like the preview window),
    // we use default cursor
    if (scene.getWindow() != null && !scene.getWindow().isFocused()) {
      setCursor(Cursor.DEFAULT);
      return;
    }

    final LibraryListItem listItem = getItem();
    ILibraryItem item = null;

    if (listItem != null) {
      item = listItem.getLibItem();
    }

    boolean isSection = false;
    if (listItem != null && listItem.getSectionName() != null) {
      isSection = true;
    }

    if (me.getEventType() == MouseEvent.MOUSE_ENTERED) {
      if (isEmpty() || isSection) {
        setCursor(Cursor.DEFAULT);
      } else {
        setCursor(Cursor.OPEN_HAND);
      }
    } else if (me.getEventType() == MouseEvent.MOUSE_PRESSED) {
      if (isEmpty() || isSection) {
        setCursor(Cursor.DEFAULT);
      } else {
        setCursor(Cursor.CLOSED_HAND);
      }
    } else if (me.getEventType() == MouseEvent.MOUSE_RELEASED) {
      if (isEmpty() || isSection) {
        setCursor(Cursor.DEFAULT);
      } else {
        setCursor(Cursor.OPEN_HAND);
      }
    } else if (me.getEventType() == MouseEvent.MOUSE_EXITED) {
      setCursor(Cursor.DEFAULT);
    } else if (me.getEventType() == MouseEvent.MOUSE_CLICKED) {
      // On double click ask for addition of the drag able item on Content
      if (me.getClickCount() == 2 && me.getButton() == MouseButton.PRIMARY) {
        if (!isEmpty() && !isSection && item != null) {
          if (editorController.canPerformInsert(item)) {
            editorController.performInsert(item);
          }
        }
      }
    }
  }
  private void updateLayout(LibraryListItem listItem) {
    assert listItem != null;

    if (listItem.getLibItem() != null) {
      final ILibraryItem item = listItem.getLibItem();
      // The classname shall be space character free (it is an API name).
      // If there is a space character then it means a qualifier comes
      // right after.
      String classname = getClassName(item.getName());
      iconImageView.setManaged(true);
      classNameLabel.setManaged(true);
      qualifierLabel.setManaged(true);
      sectionLabel.setManaged(false);
      iconImageView.setVisible(true);
      classNameLabel.setVisible(true);
      qualifierLabel.setVisible(true);
      sectionLabel.setVisible(false);
      classNameLabel.setText(classname);
      qualifierLabel.setText(getQualifier(item.getName()));
      // getIconURL can return null, this is deliberate.
      URL iconURL = item.getIconURL();
      // Use missing icon
      if (iconURL == null) {
        iconURL = missingIconURL;
      }
      iconImageView.setImage(new Image(iconURL.toExternalForm()));
    } else if (listItem.getSectionName() != null) {
      iconImageView.setManaged(false);
      classNameLabel.setManaged(false);
      qualifierLabel.setManaged(false);
      sectionLabel.setManaged(true);
      iconImageView.setVisible(false);
      classNameLabel.setVisible(false);
      qualifierLabel.setVisible(false);
      sectionLabel.setVisible(true);
      sectionLabel.setText(listItem.getSectionName());
    }
  }