| /* |
| * Copyright 2000-2014 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.intellij.util.xml.ui; |
| |
| import com.intellij.icons.AllIcons; |
| import com.intellij.lang.annotation.HighlightSeverity; |
| import com.intellij.ui.JBColor; |
| import com.intellij.util.xml.DomElement; |
| import com.intellij.util.xml.DomUtil; |
| import com.intellij.util.xml.highlighting.DomElementAnnotationsManager; |
| import com.intellij.util.xml.highlighting.DomElementProblemDescriptor; |
| import com.intellij.util.xml.highlighting.DomElementsProblemsHolder; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import javax.swing.*; |
| import javax.swing.table.DefaultTableCellRenderer; |
| import javax.swing.table.TableCellRenderer; |
| import java.awt.*; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| public class ErrorableTableCellRenderer<T extends DomElement> extends DefaultTableCellRenderer { |
| private final TableCellRenderer myRenderer; |
| private final DomElement myRowDomElement; |
| private final T myCellValueDomElement; |
| private final DomElement myRoot; |
| |
| public ErrorableTableCellRenderer(@Nullable final T cellValueDomElement, final TableCellRenderer renderer, @NotNull final DomElement rowDomElement) { |
| myCellValueDomElement = cellValueDomElement; |
| myRenderer = renderer; |
| myRowDomElement = rowDomElement; |
| |
| myRoot = DomUtil.getRoot(myRowDomElement); |
| } |
| |
| @Override |
| public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { |
| final Component component = myRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); |
| if (!myRoot.isValid()) { |
| return component; |
| } |
| |
| final DomElementAnnotationsManager annotationsManager = DomElementAnnotationsManager.getInstance(myRowDomElement.getManager().getProject()); |
| final DomElementsProblemsHolder holder = annotationsManager.getCachedProblemHolder(myRoot); |
| final List<DomElementProblemDescriptor> errorProblems = holder.getProblems(myCellValueDomElement); |
| final List<DomElementProblemDescriptor> warningProblems = new ArrayList<DomElementProblemDescriptor>(holder.getProblems(myCellValueDomElement, true, HighlightSeverity.WARNING)); |
| warningProblems.removeAll(errorProblems); |
| |
| final boolean hasErrors = errorProblems.size() > 0; |
| if (hasErrors) { |
| component.setForeground(JBColor.RED); |
| if (component instanceof JComponent) { |
| ((JComponent)component).setToolTipText(TooltipUtils.getTooltipText(errorProblems)); |
| } |
| } |
| else { |
| component.setForeground(isSelected ? table.getSelectionForeground() : table.getForeground()); |
| if (component instanceof JComponent) { |
| ((JComponent)component).setToolTipText(null); |
| } |
| } |
| |
| // highlight empty cell with errors |
| if (hasErrors && (value == null || value.toString().trim().length() == 0)) { |
| component.setBackground(BaseControl.ERROR_BACKGROUND); |
| } |
| else if (warningProblems.size() > 0) { |
| component.setBackground(BaseControl.WARNING_BACKGROUND); |
| if(isSelected) component.setForeground(JBColor.foreground()); |
| } |
| |
| final List<DomElementProblemDescriptor> errorDescriptors = |
| annotationsManager.getCachedProblemHolder(myRowDomElement).getProblems(myRowDomElement, true, true); |
| |
| if (table.getModel().getColumnCount() - 1 == column) { |
| if (errorDescriptors.size() > 0) { |
| final JPanel wrapper = new JPanel(new BorderLayout()); |
| wrapper.add(component, BorderLayout.CENTER); |
| |
| wrapper.setBackground(component.getBackground()); |
| |
| final JLabel errorLabel = new JLabel(getErrorIcon()); |
| |
| wrapper.setToolTipText(TooltipUtils.getTooltipText(errorDescriptors)); |
| |
| wrapper.add(errorLabel, BorderLayout.EAST); |
| |
| if (component instanceof JComponent) { |
| final JComponent jComponent = (JComponent)component; |
| wrapper.setBorder(jComponent.getBorder()); |
| jComponent.setBorder(BorderFactory.createEmptyBorder()); |
| jComponent.setToolTipText(TooltipUtils.getTooltipText(errorDescriptors)); |
| } |
| |
| return wrapper; |
| } else { |
| if (component instanceof JComponent) { |
| ((JComponent)component).setToolTipText(null); |
| } |
| } |
| } |
| |
| return component; |
| } |
| |
| private static Icon getErrorIcon() { |
| return AllIcons.General.ExclMark; |
| } |
| } |