@Override
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		super.setValueAt(aValue, rowIndex, columnIndex);

		// We only care about the install column here, as it's the only one that
		// is editable. 
		if (columnIndex != INSTALLED_COL) {
			return;
		}

		PluginDescription targetPluginDescription = getRowObject(rowIndex);
		boolean install = ((Boolean) aValue).booleanValue();
		if (install) {
			addPlugin(targetPluginDescription);
		}
		else {
			List<PluginDescription> pluginsThatUseTarget =
				model.getDependencies(targetPluginDescription);
			String dependenciesToUnloadHtmlList =
				pluginsThatUseTarget.stream()
						.map(PluginDescription::getName)
						.sorted()
						.collect(
							Collectors.joining("<li>", "<ul><li>", "</ul>"));

			if (pluginsThatUseTarget.isEmpty() ||
				OptionDialog.showYesNoDialog(parentComponent, "Confirm plugin removal",
					"<html>Other plugins depend on " +
						HTMLUtilities.escapeHTML(targetPluginDescription.getName()) + "<p><p>" +
						"Removing it will also remove:" + dependenciesToUnloadHtmlList + "<p><p>" +
						"Continue?") == OptionDialog.YES_OPTION) {
				model.removePlugin(targetPluginDescription);
			}

		}

		// Full repaint, as other row data may be changed when adding/removing plugins
		parentComponent.repaint();
	}
Overridden to handle the case where a user has toggled the installation column checkbox.
Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginInstallerTableModel.java