replaced <code></code> with more concise {@code}
[idea/community.git] / plugins / ui-designer / src / com / intellij / uiDesigner / designSurface / Painter.java
index a2026af6fe0ddda7cf4d9d83a6e20daac187e0b9..c47aead4ef4d3a6fbf97b0c235c1454b8ae4e78b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2012 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.
@@ -15,6 +15,8 @@
  */
 package com.intellij.uiDesigner.designSurface;
 
+import com.intellij.ide.ui.UISettings;
+import com.intellij.ui.JBColor;
 import com.intellij.ui.LightColors;
 import com.intellij.uiDesigner.FormEditingUtil;
 import com.intellij.uiDesigner.SwingProperties;
@@ -23,6 +25,8 @@ import com.intellij.uiDesigner.lw.IProperty;
 import com.intellij.uiDesigner.lw.StringDescriptor;
 import com.intellij.uiDesigner.radComponents.*;
 import com.intellij.uiDesigner.shared.BorderType;
+import com.intellij.util.ui.PlatformColors;
+import org.intellij.lang.annotations.JdkConstants;
 import org.jetbrains.annotations.NotNull;
 
 import javax.swing.*;
@@ -74,32 +78,32 @@ public final class Painter {
   private Painter() {
   }
 
-  public static void paintComponentDecoration(final GuiEditor editor, final RadComponent component, final Graphics g){
+  public static void paintComponentDecoration(final GuiEditor editor, final RadComponent component, final Graphics g) {
     // Collect selected components and paint decoration for non selected components
-    final ArrayList<RadComponent> selection = new ArrayList<RadComponent>();
+    final ArrayList<RadComponent> selection = new ArrayList<>();
     final Rectangle layeredPaneRect = editor.getLayeredPane().getVisibleRect();
     FormEditingUtil.iterate(
       component,
       new FormEditingUtil.ComponentVisitor<RadComponent>() {
         public boolean visit(final RadComponent component) {
-          if(!component.getDelegee().isShowing()){ // Skip invisible components
+          if (!component.getDelegee().isShowing()) { // Skip invisible components
             return true;
           }
           final Shape oldClip = g.getClip();
           final RadContainer parent = component.getParent();
-          if(parent != null){
+          if (parent != null) {
             final Point p = SwingUtilities.convertPoint(component.getDelegee(), 0, 0, editor.getLayeredPane());
             final Rectangle visibleRect = layeredPaneRect.intersection(new Rectangle(p.x, p.y, parent.getWidth(), parent.getHeight()));
             g.setClip(visibleRect);
           }
-          if(component.isSelected()){ // we will paint selection later
+          if (component.isSelected()) { // we will paint selection later
             selection.add(component);
           }
-          else{
+          else {
             paintComponentBoundsImpl(editor, component, g);
           }
           paintGridOutline(editor, component, g);
-          if(parent != null){
+          if (parent != null) {
             g.setClip(oldClip);
           }
           return true;
@@ -108,17 +112,17 @@ public final class Painter {
     );
 
     // Let's paint decoration for selected components
-    for(int i = selection.size() - 1; i >= 0; i--){
+    for (int i = selection.size() - 1; i >= 0; i--) {
       final Shape oldClip = g.getClip();
       final RadComponent c = selection.get(i);
       final RadContainer parent = c.getParent();
-      if(parent != null){
+      if (parent != null) {
         final Point p = SwingUtilities.convertPoint(c.getDelegee(), 0, 0, editor.getLayeredPane());
         final Rectangle visibleRect = layeredPaneRect.intersection(new Rectangle(p.x, p.y, parent.getWidth(), parent.getHeight()));
         g.setClip(visibleRect);
       }
       paintComponentBoundsImpl(editor, c, g);
-      if(parent != null){
+      if (parent != null) {
         g.setClip(oldClip);
       }
     }
@@ -127,18 +131,18 @@ public final class Painter {
   /**
    * Paints container border. For grids the method also paints vertical and
    * horizontal lines that indicate bounds of the rows and columns.
-   * Method does nothing if the <code>component</code> is not an instance
-   * of <code>RadContainer</code>.
+   * Method does nothing if the {@code component} is not an instance
+   * of {@code RadContainer}.
    */
-  private static void paintComponentBoundsImpl(final GuiEditor editor, @NotNull final RadComponent component, final Graphics g){
-    if (!(component instanceof RadContainer) && !(component instanceof RadNestedForm) && !component.isDragBorder()){
+  private static void paintComponentBoundsImpl(final GuiEditor editor, @NotNull final RadComponent component, final Graphics g) {
+    if (!(component instanceof RadContainer) && !(component instanceof RadNestedForm) && !component.isDragBorder()) {
       return;
     }
 
     boolean highlightBoundaries = (getDesignTimeInsets(component) > 2);
 
     if (component instanceof RadContainer && !component.isDragBorder()) {
-      RadContainer container = (RadContainer) component;
+      RadContainer container = (RadContainer)component;
       if (!highlightBoundaries && (container.getBorderTitle() != null || container.getBorderType() != BorderType.NONE)) {
         return;
       }
@@ -150,9 +154,9 @@ public final class Painter {
       editor.getRootContainer().getDelegee()
     );
     g.translate(point.x, point.y);
-    try{
+    try {
       if (component.isDragBorder()) {
-        Graphics2D g2d = (Graphics2D) g;
+        Graphics2D g2d = (Graphics2D)g;
         g2d.setColor(LightColors.YELLOW);
         g2d.setStroke(new BasicStroke(2.0f));
         g2d.translate(1, 1);
@@ -170,13 +174,14 @@ public final class Painter {
       if (component.isDragBorder()) {
         g.translate(-1, -1);
       }
-    }finally{
+    }
+    finally {
       g.translate(-point.x, -point.y);
     }
   }
 
   private static int getDesignTimeInsets(RadComponent component) {
-    while(component != null) {
+    while (component != null) {
       Integer designTimeInsets = (Integer)component.getDelegee().getClientProperty(GridLayoutManager.DESIGN_TIME_INSETS);
       if (designTimeInsets != null) {
         return designTimeInsets.intValue();
@@ -189,15 +194,15 @@ public final class Painter {
   /**
    * This method paints grid bounds for "grid" containers
    */
-  public static void paintGridOutline(final GuiEditor editor, @NotNull final RadComponent component, final Graphics g){
+  public static void paintGridOutline(final GuiEditor editor, @NotNull final RadComponent component, final Graphics g) {
     if (!editor.isShowGrid()) {
       return;
     }
-    if (!(component instanceof RadContainer)){
+    if (!(component instanceof RadContainer)) {
       return;
     }
     final RadContainer container = (RadContainer)component;
-    if(!container.getLayoutManager().isGrid()){
+    if (!container.getLayoutManager().isGrid()) {
       return;
     }
 
@@ -217,25 +222,26 @@ public final class Painter {
       editor.getRootContainer().getDelegee()
     );
     g.translate(point.x, point.y);
-    try{
+    try {
       // Paint grid
       if (container.getWidth() > 0 && container.getHeight() > 0) {
         Image gridImage = CachedGridImage.getGridImage(container);
         g.drawImage(gridImage, 0, 0, null);
       }
-    }finally{
+    }
+    finally {
       g.translate(-point.x, -point.y);
     }
   }
 
   /**
-   * Paints selection for the specified <code>component</code>.
+   * Paints selection for the specified {@code component}.
    */
   public static void paintSelectionDecoration(@NotNull RadComponent component, Graphics g,
-                                              boolean focused){
+                                              boolean focused) {
     if (component.isSelected()) {
       if (focused) {
-        g.setColor(Color.BLUE);
+        g.setColor(PlatformColors.BLUE);
       }
       else {
         g.setColor(Color.GRAY);
@@ -245,6 +251,22 @@ public final class Painter {
         g.fillRect(point.x - R, point.y - R, 2 * R + 1, 2 * R + 1);
       }
     }
+    else if (component.getWidth() < FormEditingUtil.EMPTY_COMPONENT_SIZE || component.getHeight() < FormEditingUtil.EMPTY_COMPONENT_SIZE) {
+      Graphics2D g2d = (Graphics2D)g;
+      Composite oldComposite = g2d.getComposite();
+      Stroke oldStroke = g2d.getStroke();
+      Color oldColor = g2d.getColor();
+
+      g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));
+      g2d.setStroke(new BasicStroke(0.7f));
+      g2d.setColor(Color.black);
+      g2d.drawRect(0, 0, Math.max(component.getWidth(), FormEditingUtil.EMPTY_COMPONENT_SIZE),
+                   Math.max(component.getHeight(), FormEditingUtil.EMPTY_COMPONENT_SIZE));
+
+      g2d.setComposite(oldComposite);
+      g2d.setStroke(oldStroke);
+      g2d.setColor(oldColor);
+    }
   }
 
   /**
@@ -263,36 +285,36 @@ public final class Painter {
     }
     */
 
-    final int width=component.getWidth();
-    final int height=component.getHeight();
+    final int width = component.getWidth();
+    final int height = component.getHeight();
 
     final Point[] points = getPoints(width, height);
 
     if (isInside(x, y, points[SE])) {
       return EAST_MASK | SOUTH_MASK;
     }
-    else if (isInside(x,y,points[NW])) {
+    else if (isInside(x, y, points[NW])) {
       return WEST_MASK | NORTH_MASK;
     }
-    else if(isInside(x,y,points[N])){
+    else if (isInside(x, y, points[N])) {
       return NORTH_MASK;
     }
-    else if(isInside(x,y,points[NE])){
+    else if (isInside(x, y, points[NE])) {
       return EAST_MASK | NORTH_MASK;
     }
-    else if (isInside(x, y, points[W])){
+    else if (isInside(x, y, points[W])) {
       return WEST_MASK;
     }
-    else if (isInside(x, y, points[E])){
+    else if (isInside(x, y, points[E])) {
       return EAST_MASK;
     }
-    else if (isInside(x, y, points[SW])){
+    else if (isInside(x, y, points[SW])) {
       return WEST_MASK | SOUTH_MASK;
     }
-    else if (isInside(x, y, points[S])){
+    else if (isInside(x, y, points[S])) {
       return SOUTH_MASK;
     }
-    else{
+    else {
       return 0;
     }
   }
@@ -301,7 +323,8 @@ public final class Painter {
     return x >= r.x - R && x <= r.x + R && y >= r.y - R && y <= r.y + R;
   }
 
-  public static int getResizeCursor(final int resizeMask){
+  @JdkConstants.CursorType
+  public static int getResizeCursor(final int resizeMask) {
     if (resizeMask == (WEST_MASK | NORTH_MASK)) {
       return Cursor.NW_RESIZE_CURSOR;
     }
@@ -352,13 +375,13 @@ public final class Painter {
     Rectangle[] allBounds = new Rectangle[components.size()];
     int lastTop = -1;
     int minLeft = Integer.MAX_VALUE;
-    for(int i=0; i<components.size(); i++) {
+    for (int i = 0; i < components.size(); i++) {
       final Rectangle rc = SwingUtilities.convertRectangle(
         components.get(i).getParent().getDelegee(),
         components.get(i).getBounds(),
         rootContainer.getDelegee()
       );
-      allBounds [i] = rc;
+      allBounds[i] = rc;
 
       minLeft = Math.min(minLeft, rc.x);
       if (i == 0) {
@@ -369,7 +392,7 @@ public final class Painter {
       }
     }
 
-    Graphics2D g2d = (Graphics2D) g;
+    Graphics2D g2d = (Graphics2D)g;
     Stroke oldStroke = g2d.getStroke();
     g2d.setStroke(new BasicStroke(2.0f));
     g2d.setColor(new Color(104, 107, 130));
@@ -377,42 +400,42 @@ public final class Painter {
       // all items in group have same Y
       int left = Integer.MAX_VALUE;
       int right = Integer.MIN_VALUE;
-      for(Rectangle rc: allBounds) {
+      for (Rectangle rc : allBounds) {
         final int midX = (int)rc.getCenterX();
         left = Math.min(left, midX);
         right = Math.max(right, midX);
-        g2d.drawLine(midX, lastTop-8, midX, lastTop);
+        g2d.drawLine(midX, lastTop - 8, midX, lastTop);
       }
-      g2d.drawLine(left, lastTop-8, right, lastTop-8);
+      g2d.drawLine(left, lastTop - 8, right, lastTop - 8);
     }
     else {
       int top = Integer.MAX_VALUE;
       int bottom = Integer.MIN_VALUE;
-      for(Rectangle rc: allBounds) {
+      for (Rectangle rc : allBounds) {
         final int midY = (int)rc.getCenterY();
         top = Math.min(top, midY);
         bottom = Math.max(bottom, midY);
-        g2d.drawLine(minLeft-8, midY, rc.x, midY);
+        g2d.drawLine(minLeft - 8, midY, rc.x, midY);
       }
-      g2d.drawLine(minLeft-8, top, minLeft-8, bottom);
+      g2d.drawLine(minLeft - 8, top, minLeft - 8, bottom);
     }
     g2d.setStroke(oldStroke);
   }
 
   public static void paintComponentTag(final RadComponent component, final Graphics g) {
     if (component instanceof RadContainer) return;
-    for(IProperty prop: component.getModifiedProperties()) {
+    for (IProperty prop : component.getModifiedProperties()) {
       if (prop.getName().equals(SwingProperties.TEXT)) {
         final Object desc = prop.getPropertyValue(component);
-        if (!(desc instanceof StringDescriptor) || ((StringDescriptor) desc).getValue() == null ||
-            ((StringDescriptor) desc).getValue().length() > 0) {
+        if (!(desc instanceof StringDescriptor) || ((StringDescriptor)desc).getValue() == null ||
+            ((StringDescriptor)desc).getValue().length() > 0) {
           return;
         }
       }
       else if (prop.getName().equals(SwingProperties.MODEL)) {
         // don't paint tags on non-empty lists
         final Object value = prop.getPropertyValue(component);
-        if (value instanceof String[] && ((String[]) value).length > 0) {
+        if (value instanceof String[] && ((String[])value).length > 0) {
           return;
         }
       }
@@ -427,16 +450,17 @@ public final class Painter {
       String className = component.getComponentClassName();
       int pos = className.lastIndexOf('.');
       if (pos >= 0) {
-        tagBuilder.append(className.substring(pos+1));
+        tagBuilder.append(className.substring(pos + 1));
       }
       else {
         tagBuilder.append(className);
       }
       final Rectangle2D stringBounds = g.getFontMetrics().getStringBounds(tagBuilder.toString(), g);
-      Graphics2D g2d = (Graphics2D) g;
-      g2d.setColor(Color.BLUE);
-      g2d.fillRect(0, 0, (int) stringBounds.getWidth(), (int) stringBounds.getHeight());
-      g2d.setColor(Color.WHITE);
+      Graphics2D g2d = (Graphics2D)g;
+      g2d.setColor(PlatformColors.BLUE);
+      g2d.fillRect(0, 0, (int)stringBounds.getWidth(), (int)stringBounds.getHeight());
+      g2d.setColor(JBColor.WHITE);
+      UISettings.setupAntialiasing(g);
       g.drawString(tagBuilder.toString(), 0, g.getFontMetrics().getAscent());
     }
   }