/*
 * Copyright 2000-2013 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.ui;

import com.intellij.util.ui.JBInsets;

import javax.swing.*;
import java.awt.*;

/**
 * Cell renderer CPU optimization.
 * @see javax.swing.table.DefaultTableCellRenderer#invalidate()
 *
 * @author gregsh
 */
public class CellRendererPanel extends JPanel {

  private boolean mySelected;

  public CellRendererPanel() {
    super(null); // we do the layout ourselves
  }

  public final boolean isSelected() {
    return mySelected;
  }

  public final void setSelected(boolean isSelected) {
    mySelected = isSelected;
  }

  // property change support ----------------
  protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
  }

  public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {
  }

  // isOpaque() optimization ----------------
  public boolean isOpaque() {
    return false;
  }

  @Override
  protected void paintComponent(Graphics g) {
    if (mySelected) {
      g.setColor(getBackground());
      g.fillRect(0, 0, getWidth(), getHeight());
    }
  }

  // BEGIN no validation methods --------------
  @Override
  public void doLayout() {
    int count = getComponentCount();
    if (count == 1) {
      Rectangle bounds = new Rectangle(getWidth(), getHeight());
      JBInsets.removeFrom(bounds, getInsets());
      Component child = getComponent(0);
      child.setBounds(bounds);
      if (child instanceof CellRendererPanel) {
        child.doLayout();
      }
    }
    else {
      LayoutManager layout = getLayout();
      if (layout instanceof LayoutManager2) {
        ((LayoutManager2)layout).invalidateLayout(this);
      }
      super.doLayout();
      for (int i = 0; i < count; i++) {
        Component c = getComponent(i);
        if (c instanceof CellRendererPanel) {
          c.doLayout();
        }
      }
    }
  }

  @Override
  public Dimension getPreferredSize() {
    if (getComponentCount() != 1) return super.getPreferredSize();
    return getComponent(0).getPreferredSize();
  }

  public void invalidate() {
  }

  public void validate() {
    doLayout();
  }

  public void revalidate() {
  }

  public void repaint(long tm, int x, int y, int width, int height) {
  }

  public void repaint(Rectangle r) {
  }

  public void repaint() {
  }

// END no validation methods --------------
}

@@ -2052,172 +2052,112 @@
     
-child.doLayout();%0A      %7D%0A    %7D%0A    else %7B%0A      LayoutManager layout = getLayout();%0A      if (layout instanceof LayoutManager2) %7B%0A        ((LayoutManager2)layout).
+((CellRendererPanel)child).invalidateLayout();%0A        child.doLayout();%0A      %7D%0A    %7D%0A    else %7B%0A      
 inva
@@ -2173,22 +2173,10 @@
 out(
-this);%0A      %7D
+);
 %0A   
@@ -2459,16 +2459,24 @@
 () != 1)
+ %7B%0A     
  return 
@@ -2497,24 +2497,30 @@
 rredSize();%0A
+    %7D%0A
     return g
@@ -2585,32 +2585,218 @@
 lidate() %7B%0A  %7D%0A%0A
+  private void invalidateLayout() %7B%0A    LayoutManager layout = getLayout();%0A    if (layout instanceof LayoutManager2) %7B%0A      ((LayoutManager2)layout).invalidateLayout(this);%0A    %7D%0A  %7D%0A%0A
   public void va

support nesting & box-layout 2