@Override
  public ItemStack onItemRightClick(ItemStack essentiaCell, World world, EntityPlayer player) {
    // Ensure the player is sneaking(holding shift)
    if (!player.isSneaking()) {
      return essentiaCell;
    }

    // TODO: SaveProvider??
    // Get the handler
    IMEInventoryHandler<IAEFluidStack> handler =
        AEApi.instance()
            .registries()
            .cell()
            .getCellInventory(essentiaCell, null, StorageChannel.FLUIDS);

    // Is it the correct handler type?
    if (!(handler instanceof HandlerItemEssentiaCell)) {
      return essentiaCell;
    }

    // Cast
    HandlerItemEssentiaCell cellHandler = (HandlerItemEssentiaCell) handler;

    // If the cell is empty, and the player can hold the casing
    if ((cellHandler.usedBytes() == 0)
        && (player.inventory.addItemStackToInventory(
            ItemEnum.STORAGE_CASING.getItemStackWithSize(1)))) {
      // Return the storage component
      return ItemEnum.STORAGE_COMPONENT.getItemStackWithDamage(essentiaCell.getItemDamage());
    }

    // Can not remove storage component, return the current cell as is.
    return essentiaCell;
  }
  @Override
  public int getStatusForCell(ItemStack essentiaCell, IMEInventory handler) {
    // Do we have a handler?
    if (handler == null) {
      return ItemEssentiaCell.CELL_STATUS_MISSING;
    }

    // Get the inventory handler
    HandlerItemEssentiaCell cellHandler = (HandlerItemEssentiaCell) handler;

    // Full bytes?
    if (cellHandler.usedBytes() == cellHandler.totalBytes()) {
      return ItemEssentiaCell.CELL_STATUS_FULL;
    }

    // Full types?
    if (cellHandler.usedTypes() == cellHandler.totalTypes()) {
      return ItemEssentiaCell.CELL_STATUS_TYPES_FULL;
    }

    return ItemEssentiaCell.CELL_STATUS_HAS_ROOM;
  }
  @Override
  public void addInformation(
      ItemStack essentiaCell, EntityPlayer player, List displayList, boolean advancedItemTooltips) {
    // TODO: Save provider??
    // Get the contents of the cell
    IMEInventoryHandler<IAEFluidStack> handler =
        AEApi.instance()
            .registries()
            .cell()
            .getCellInventory(essentiaCell, null, StorageChannel.FLUIDS);

    // Ensure we have a cell inventory handler
    if (!(handler instanceof HandlerItemEssentiaCell)) {
      return;
    }

    // Cast to cell inventory handler
    HandlerItemEssentiaCell cellHandler = (HandlerItemEssentiaCell) handler;

    // Create the bytes tooltip
    String bytesTip =
        String.format(
            StatCollector.translateToLocal(
                ThaumicEnergistics.MOD_ID + ".tooltip.essentia.cell.bytes"),
            new Object[] {
              cellHandler.usedBytes() / ItemEssentiaCell.CONVERSION_SIZE,
              cellHandler.totalBytes() / ItemEssentiaCell.CONVERSION_SIZE
            });

    // Create the types tooltip
    String typesTip =
        String.format(
            StatCollector.translateToLocal(
                ThaumicEnergistics.MOD_ID + ".tooltip.essentia.cell.types"),
            new Object[] {cellHandler.usedTypes(), cellHandler.totalTypes()});

    // Add the tooltips
    displayList.add(bytesTip);
    displayList.add(typesTip);

    // Is the cell pre-formated?
    if (cellHandler.isPreformatted()) {
      displayList.add(
          StatCollector.translateToLocal("Appeng.GuiITooltip.Partitioned")
              + " - "
              + StatCollector.translateToLocal("Appeng.GuiITooltip.Precise"));
    }

    // Is shift being held?
    if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || (Keyboard.isKeyDown(Keyboard.KEY_RSHIFT))) {
      // Add information about the essentia types in the cell
      this.addContentsToCellDescription(cellHandler, displayList, player);
    }
  }
  private void addContentsToCellDescription(
      HandlerItemEssentiaCell cellHandler, List displayList, EntityPlayer player) {
    // Get the list of stored aspects
    List<AspectStack> cellAspects = cellHandler.getAvailableAspects();

    // Sort the list
    Collections.sort(cellAspects, new AspectStackComparator());

    for (AspectStack currentStack : cellAspects) {
      if (currentStack != null) {
        // Get the chat color
        String aspectChatColor = currentStack.getChatColor();

        // Does this aspect have color?
        if (aspectChatColor != null) {
          // Add the color header
          aspectChatColor = GuiHelper.CHAT_COLOR_HEADER + aspectChatColor;
        } else {
          // It does not, set to gray
          aspectChatColor = EnumChatFormatting.GRAY.toString();
        }

        // Build the display string
        String aspectInfo =
            String.format(
                "%s%s%s x %d",
                aspectChatColor,
                currentStack.getAspectName(player),
                EnumChatFormatting.GRAY.toString(),
                currentStack.amount);

        // Add to the list
        displayList.add(aspectInfo);
      }
    }
  }