package net.bitpot.railways.gui; import com.intellij.ui.SimpleTextAttributes; import net.bitpot.railways.models.RailsActionInfo; import net.bitpot.railways.models.Route; import net.bitpot.railways.models.RouteTableModel; import net.bitpot.railways.models.RoutesFilter; import net.bitpot.railways.models.routes.SimpleRoute; import net.bitpot.railways.parser.route.*; import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.util.List; /** * @author Basil Gren * on 21.02.14. */ public class RouteCellRenderer extends FilterHighlightRenderer { public RouteCellRenderer(@NotNull RoutesFilter filter) { super(filter); setTransparentIconBackground(true); } @Override protected void customizeCellRenderer(JTable table, Object value, boolean selected, boolean hasFocus, int row, int column) { // Value can be null in older JDKs (below 1.7, I suppose). // Info: http://stackoverflow.com/questions/3054775/jtable-strange-behavior-from-getaccessiblechild-method-resulting-in-null-point if (value == null) return; Route route = (Route) value; int modelCol = table.convertColumnIndexToModel(column); switch (modelCol) { case RouteTableModel.COL_ACTION: renderRouteAction(route); break; default: renderRoutePath(route); } } private void renderRouteAction(Route route) { String tooltipText = null; RailsActionInfo action = null; // Set icons and hints if (route instanceof SimpleRoute) { action = ((SimpleRoute)route).getActionInfo(); if (action.getPsiMethod() == null) tooltipText = action.getPsiClass() != null ? "Cannot find action declaration" : "Cannot find controller declaration"; } setIcon(route.getActionIcon()); setToolTipText(tooltipText); // Now append text taking into account colors and highlighting. List<TextChunk> chunks = RouteActionParser.getInstance().highlight( route.getActionChunks(), getFilter().getPathFilter()); for(TextChunk chunk: chunks) { SimpleTextAttributes textAttrs; if (action != null && ((chunk.getType() == RouteActionChunk.CONTAINER && action.getPsiClass() == null) || (chunk.getType() == RouteActionChunk.ACTION && action.getPsiMethod() == null))) { textAttrs = chunk.isHighlighted() ? RailwaysColors.DISABLED_ITEM_HL_ATTR : RailwaysColors.DISABLED_ITEM_ATTR; } else textAttrs = chunk.getTextAttrs(); append(chunk.getText(), textAttrs); } } private void renderRoutePath(Route route) { List<TextChunk> chunks = RoutePathParser.getInstance().highlight( route.getPathChunks(), getFilter().getPathFilter()); for(TextChunk chunk: chunks) append(chunk.getText(), chunk.getTextAttrs()); setToolTipText(null); setIcon(route.getRequestMethod().getIcon()); } }