blob: a92015cca6151e52175fcb5aa7ee03a7052ca763 [file] [log] [blame]
/*
* 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;
}
}