@Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    if (myPluginDescriptor != null) {
      Couple<Color> colors = UIUtil.getCellColors(table, isSelected, row, column);
      Color fg = colors.getFirst();
      final Color background = colors.getSecond();
      Color grayedFg = isSelected ? fg : new JBColor(Gray._130, Gray._120);

      myPanel.setBackground(background);

      myName.setForeground(fg);
      myCategory.setForeground(grayedFg);
      myStatus.setForeground(grayedFg);
      myLastUpdated.setForeground(grayedFg);
      myDownloads.setForeground(grayedFg);

      myName.clear();
      myName.setOpaque(false);
      myCategory.clear();
      myCategory.setOpaque(false);
      SpeedSearchSupply speedSearch = SpeedSearchSupply.getSupply(table);
      String query = speedSearch == null ? null : speedSearch.getEnteredPrefix();
      SimpleTextAttributes attr = new SimpleTextAttributes(UIUtil.getListBackground(isSelected, hasFocus),
                                                           UIUtil.getListForeground(isSelected, hasFocus),
                                                           JBColor.RED,
                                                           SimpleTextAttributes.STYLE_PLAIN);
      Matcher matcher = NameUtil.buildMatcher("*" + query, NameUtil.MatchingCaseSensitivity.NONE);

      String category = myPluginDescriptor.getDisplayCategory() == null ? null : StringUtil.toUpperCase(myPluginDescriptor.getDisplayCategory());
      if (category != null) {
        if (query != null) {
          SpeedSearchUtil.appendColoredFragmentForMatcher(category, myCategory, attr, matcher, UIUtil.getTableBackground(isSelected, hasFocus), true);
        }
        else {
          myCategory.append(category);
        }
      }
      else if (!myPluginsView) {
        myCategory.append(IdeBundle.message("plugin.info.not.available"));
      }

      myStatus.setIcon(AllIcons.Nodes.Plugin);
      if (myPluginDescriptor.isBundled()) {
        myCategory.append(" [Bundled]"); //NON-NLS
        myStatus.setIcon(AllIcons.Nodes.PluginJB);
      }
      String vendor = myPluginDescriptor.getVendor();
      if (vendor != null && StringUtil.containsIgnoreCase(vendor, "jetbrains")) {
        myStatus.setIcon(AllIcons.Nodes.PluginJB);
      }

      @NlsSafe String downloads;
      if (myPluginDescriptor instanceof PluginNode && (downloads = ((PluginNode)myPluginDescriptor).getDownloads()) != null) {
        if (downloads.length() > 3) {
          downloads = new DecimalFormat("#,###").format(Integer.parseInt(downloads));
        }
        myDownloads.setText(downloads);

        myRating.setRate(((PluginNode)myPluginDescriptor).getRating());
        myLastUpdated.setText(DateFormatUtil.formatBetweenDates(((PluginNode)myPluginDescriptor).getDate(), System.currentTimeMillis()));
      }

      // plugin state-dependent rendering

      PluginId pluginId = myPluginDescriptor.getPluginId();
      IdeaPluginDescriptor installed = PluginManagerCore.getPlugin(pluginId);
      Color initialNameForeground = myName.getForeground();

      if (installed != null && ((IdeaPluginDescriptorImpl)installed).isDeleted()) {
        // existing plugin uninstalled (both views)
        myStatus.setIcon(AllIcons.Nodes.PluginRestart);
        if (!isSelected) myName.setForeground(FileStatus.DELETED.getColor());
        myPanel.setToolTipText(IdeBundle.message("plugin.manager.uninstalled.tooltip"));
      }
      else {
        InstalledPluginsState state = InstalledPluginsState.getInstance();
        if (state.wasInstalled(pluginId)) {
          // new plugin installed (both views)
          myStatus.setIcon(AllIcons.Nodes.PluginRestart);
          if (!isSelected) myName.setForeground(FileStatus.ADDED.getColor());
          myPanel.setToolTipText(IdeBundle.message("plugin.manager.installed.tooltip"));
        }
        else if (state.wasUpdated(pluginId)) {
          // existing plugin updated (both views)
          myStatus.setIcon(AllIcons.Nodes.PluginRestart);
          if (!isSelected) myName.setForeground(FileStatus.ADDED.getColor());
          myPanel.setToolTipText(IdeBundle.message("plugin.manager.updated.tooltip"));
        }
        else if (state.hasNewerVersion(pluginId)) {
          // existing plugin has a newer version (both views)
          myStatus.setIcon(AllIcons.Nodes.Pluginobsolete);
          if (!isSelected) myName.setForeground(FileStatus.MODIFIED.getColor());
          if (!myPluginsView && installed != null) {
            myPanel.setToolTipText(IdeBundle.message("plugin.manager.new.version.tooltip", installed.getVersion()));
          }
          else {
            myPanel.setToolTipText(IdeBundle.message("plugin.manager.update.available.tooltip"));
          }
        }
        else if (isIncompatible(myPluginDescriptor)) {
          // a plugin is incompatible with current installation (both views)
          if (!isSelected) myName.setForeground(JBColor.RED);
          myPanel.setToolTipText(
            IdeBundle.message("plugin.manager.incompatible.tooltip", ApplicationNamesInfo.getInstance().getFullProductName()));
        }
        else if (!myPluginDescriptor.isEnabled() && myPluginsView) {
          // a plugin is disabled (plugins view only)
          Icon icon = myStatus.getIcon();
          if (icon != null) {
            myStatus.setIcon(IconLoader.getDisabledIcon(icon));
          }
        }
      }
      String pluginName = myPluginDescriptor.getName() + "  ";
      if (query != null) {
        if (!Objects.equals(initialNameForeground, myName.getForeground())) {
          attr = attr.derive(attr.getStyle(), myName.getForeground(), attr.getBgColor(), attr.getWaveColor());
        }
        SpeedSearchUtil.appendColoredFragmentForMatcher(pluginName, myName, attr, matcher, UIUtil.getTableBackground(isSelected, hasFocus), true);
      }
      else {
        myName.append(pluginName);
      }
    }

    return myPanel;
  }
@Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)