From 685400f4facf2e545cf65b4cbce56ef1c7fdae9f Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Thu, 30 Jul 2009 15:10:51 +0000
Subject: [PATCH] Fix for issue 4159 ('?' sign in Base DNs table should display the tooltip when clicking on it) Create a new listener that will be in charge of displaying the tool tip when the user clicks on the component that registered it as listener.

---
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/event/ClickTooltipDisplayer.java     |  176 +++++++++++++++++++++++++++++
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/renderer/CustomCellRenderer.java  |   25 ----
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusPanel.java                  |   11 +
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/components/LabelWithHelpIcon.java |  108 +----------------
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java                  |   10 +
 5 files changed, 206 insertions(+), 124 deletions(-)

diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/event/ClickTooltipDisplayer.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/event/ClickTooltipDisplayer.java
new file mode 100644
index 0000000..3f0d183
--- /dev/null
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/event/ClickTooltipDisplayer.java
@@ -0,0 +1,176 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2009 Sun Microsystems, Inc.
+ */
+
+package org.opends.guitools.controlpanel.event;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.JComponent;
+import javax.swing.JTable;
+import javax.swing.JToolTip;
+import javax.swing.Popup;
+import javax.swing.PopupFactory;
+import javax.swing.table.TableCellRenderer;
+
+/**
+ * This class listens to events and displays a tooltip when the user clicks on
+ * the object that registered this listener.
+ *
+ */
+public class ClickTooltipDisplayer extends MouseAdapter
+{
+  private boolean isTooltipVisible = false;
+  private Popup tipWindow;
+
+  /**
+   * {@inheritDoc}
+   */
+  public void mouseExited(MouseEvent event)
+  {
+    hideToolTip(event);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public void mousePressed(MouseEvent event)
+  {
+    if (isTooltipVisible)
+    {
+      hideToolTip(event);
+    }
+    else
+    {
+      displayToolTip(event);
+    }
+  }
+
+  /**
+   * Displays a tooltip depending on the MouseEvent received.
+   * @param event the mouse event.
+   */
+  private void displayToolTip(MouseEvent event)
+  {
+    JComponent component = (JComponent)event.getSource();
+    String toolTipText;
+    if (component instanceof JTable)
+    {
+      JTable table = (JTable)component;
+      int row = table.rowAtPoint(event.getPoint());
+      int column = table.columnAtPoint(event.getPoint());
+      if (row != -1 && column != -1)
+      {
+        TableCellRenderer renderer = table.getCellRenderer(row, column);
+        Component comp = renderer.getTableCellRendererComponent(table,
+            table.getValueAt(row, column), true, true, row, column);
+        if (comp instanceof JComponent)
+        {
+          // The coordinates must be translated.
+          Rectangle rect = table.getCellRect(row, column, true);
+          int x = event.getPoint().x - rect.x;
+          int y = event.getPoint().y - rect.y;
+          MouseEvent tEv = new MouseEvent(table, event.getID(),
+              event.getWhen(), event.getModifiers(), x, y,
+              event.getClickCount(), event.isPopupTrigger(), event.getButton());
+          toolTipText = ((JComponent)comp).getToolTipText(tEv);
+        }
+        else
+        {
+          toolTipText = null;
+        }
+      }
+      else
+      {
+        toolTipText = null;
+      }
+    }
+    else
+    {
+      toolTipText = component.getToolTipText();
+    }
+    if (toolTipText != null)
+    {
+      Point preferredLocation = component.getToolTipLocation(event);
+      Rectangle sBounds = component.getGraphicsConfiguration().
+      getBounds();
+
+      JToolTip tip = component.createToolTip();
+      tip.setTipText(toolTipText);
+      Dimension size = tip.getPreferredSize();
+      Point location = new Point();
+
+      Point screenLocation = component.getLocationOnScreen();
+      if(preferredLocation != null)
+      {
+        location.x = screenLocation.x + preferredLocation.x;
+        location.y = screenLocation.y + preferredLocation.y;
+      }
+      else
+      {
+        location.x = screenLocation.x + event.getX();
+        location.y = screenLocation.y + event.getY() + 20;
+      }
+
+      if (location.x < sBounds.x) {
+        location.x = sBounds.x;
+      }
+      else if (location.x - sBounds.x + size.width > sBounds.width) {
+        location.x = sBounds.x + Math.max(0, sBounds.width - size.width);
+      }
+      if (location.y < sBounds.y) {
+        location.y = sBounds.y;
+      }
+      else if (location.y - sBounds.y + size.height > sBounds.height) {
+        location.y = sBounds.y + Math.max(0, sBounds.height - size.height);
+      }
+
+      PopupFactory popupFactory = PopupFactory.getSharedInstance();
+      tipWindow = popupFactory.getPopup(component, tip, location.x, location.y);
+      tipWindow.show();
+      isTooltipVisible = true;
+    }
+  }
+
+  /**
+   * Hides the tooltip if we are displaying it.
+   * @param event the mouse event.
+   */
+  private void hideToolTip(MouseEvent event)
+  {
+    if (tipWindow != null)
+    {
+      tipWindow.hide();
+      tipWindow = null;
+      isTooltipVisible = false;
+    }
+  }
+}
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusPanel.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusPanel.java
index 09e1ea8..d91560b 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusPanel.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusPanel.java
@@ -760,6 +760,7 @@
     connectionHandlersTable =
       Utilities.createSortableTable(connectionHandlerTableModel,
         new CustomCellRenderer());
+    connectionHandlersTable.setCellSelectionEnabled(false);
 
     gbc.insets.top = 5;
     p.add(connectionHandlersTable.getTableHeader(), gbc);
@@ -797,14 +798,19 @@
 
     dbTableModelWithReplication = new BaseDNTableModel(true);
     dbTableModelWithoutReplication = new BaseDNTableModel(false);
+    BaseDNCellRenderer renderer = new BaseDNCellRenderer();
     noReplicatedBaseDNsTable =
       Utilities.createSortableTable(dbTableModelWithoutReplication,
-        new BaseDNCellRenderer());
+        renderer);
     noReplicatedBaseDNsTable.setVisible(false);
     noReplicatedBaseDNsTable.getTableHeader().setVisible(false);
     replicationBaseDNsTable =
       Utilities.createSortableTable(dbTableModelWithReplication,
-        new BaseDNCellRenderer());
+        renderer);
+    noReplicatedBaseDNsTable.setCellSelectionEnabled(false);
+    replicationBaseDNsTable.setCellSelectionEnabled(false);
+    Utilities.addClickTooltipListener(noReplicatedBaseDNsTable);
+    Utilities.addClickTooltipListener(replicationBaseDNsTable);
 
     gbc.insets.top = 5;
     p.add(noReplicatedBaseDNsTable.getTableHeader(), gbc);
@@ -882,4 +888,3 @@
     return status.toString();
   }
 }
-
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/components/LabelWithHelpIcon.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/components/LabelWithHelpIcon.java
index 2e5b3c5..fb885be 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/components/LabelWithHelpIcon.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/components/LabelWithHelpIcon.java
@@ -22,30 +22,21 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.ui.components;
 
 import java.awt.Color;
-import java.awt.Dimension;
 import java.awt.Font;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 
 import javax.swing.Box;
 import javax.swing.ImageIcon;
-import javax.swing.JComponent;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
-import javax.swing.JToolTip;
-import javax.swing.Popup;
-import javax.swing.PopupFactory;
-import javax.swing.ToolTipManager;
 
 import org.opends.guitools.controlpanel.ui.ColorAndFontConstants;
 import org.opends.guitools.controlpanel.util.Utilities;
@@ -69,11 +60,7 @@
   protected JLabel iconLabel = new JLabel(icon);
   private static final ImageIcon icon =
     Utilities.createImageIcon("org/opends/quicksetup/images/help_small.gif");
-  private static final ToolTipManager ttipManager =
-    ToolTipManager.sharedInstance();
 
-  private Popup tipWindow;
-  private boolean isVisible;
 
   /**
    * The left inset of the help icon.
@@ -109,33 +96,7 @@
     gbc.fill = GridBagConstraints.HORIZONTAL;
     add(Box.createHorizontalGlue(), gbc);
 
-    ttipManager.unregisterComponent(iconLabel);
-
-    iconLabel.addMouseListener(new MouseAdapter()
-    {
-      /**
-       * {@inheritDoc}
-       */
-      public void mouseExited(MouseEvent event)
-      {
-        hideToolTip(event);
-      }
-
-      /**
-       * {@inheritDoc}
-       */
-      public void mousePressed(MouseEvent event)
-      {
-        if (isVisible)
-        {
-          hideToolTip(event);
-        }
-        else
-        {
-          displayToolTip(event);
-        }
-      }
-    });
+    Utilities.addClickTooltipListener(iconLabel);
   }
 
   /**
@@ -221,67 +182,20 @@
   }
 
   /**
-   * Displays a tooltip depending on the MouseEvent received.
-   * @param event the mouse event.
+   * {@inheritDoc}
    */
-  private void displayToolTip(MouseEvent event)
+  public String getToolTipText(MouseEvent ev)
   {
-    JComponent component = (JComponent)event.getSource();
-    String toolTipText = component.getToolTipText();
-    if (toolTipText != null)
+    int x = ev.getPoint().x;
+    boolean display = x > label.getPreferredSize().width - 10;
+
+    if (display)
     {
-      Point preferredLocation = component.getToolTipLocation(event);
-      Rectangle sBounds = component.getGraphicsConfiguration().
-      getBounds();
-
-      JToolTip tip = component.createToolTip();
-      tip.setTipText(toolTipText);
-      Dimension size = tip.getPreferredSize();
-      Point location = new Point();
-
-      Point screenLocation = component.getLocationOnScreen();
-      if(preferredLocation != null)
-      {
-        location.x = screenLocation.x + preferredLocation.x;
-        location.y = screenLocation.y + preferredLocation.y;
-      }
-      else
-      {
-        location.x = screenLocation.x + event.getX();
-        location.y = screenLocation.y + event.getY() + 20;
-      }
-
-      if (location.x < sBounds.x) {
-        location.x = sBounds.x;
-      }
-      else if (location.x - sBounds.x + size.width > sBounds.width) {
-        location.x = sBounds.x + Math.max(0, sBounds.width - size.width);
-      }
-      if (location.y < sBounds.y) {
-        location.y = sBounds.y;
-      }
-      else if (location.y - sBounds.y + size.height > sBounds.height) {
-        location.y = sBounds.y + Math.max(0, sBounds.height - size.height);
-      }
-
-      PopupFactory popupFactory = PopupFactory.getSharedInstance();
-      tipWindow = popupFactory.getPopup(component, tip, location.x, location.y);
-      tipWindow.show();
+      return getHelpTooltip();
     }
-    isVisible = true;
-  }
-
-  /**
-   * Hides the tooltip if we are displaying it.
-   * @param event the mouse event.
-   */
-  private void hideToolTip(MouseEvent event)
-  {
-    if (tipWindow != null)
+    else
     {
-      tipWindow.hide();
-      tipWindow = null;
+      return null;
     }
-    isVisible = false;
   }
 }
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/renderer/CustomCellRenderer.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/renderer/CustomCellRenderer.java
index 4dace8d..661f8da 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/renderer/CustomCellRenderer.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/ui/renderer/CustomCellRenderer.java
@@ -22,14 +22,12 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 
 package org.opends.guitools.controlpanel.ui.renderer;
 
 import java.awt.Component;
-import java.awt.Rectangle;
-import java.awt.event.MouseEvent;
 
 import javax.swing.BorderFactory;
 import javax.swing.JComponent;
@@ -114,27 +112,6 @@
   }
 
   /**
-   * {@inheritDoc}
-   */
-  public String getToolTipText(MouseEvent ev)
-  {
-    Rectangle r = new Rectangle();
-    r.x = label.getPreferredSize().width + INSET_WITH_ICON;
-    r.y = 0;
-    r.width = iconLabel.getPreferredSize().width;
-    r.height = iconLabel.getPreferredSize().height;
-
-    if (r.contains(ev.getPoint()))
-    {
-      return getHelpTooltip();
-    }
-    else
-    {
-      return null;
-    }
-  }
-
-  /**
    * Returns the border to be used for a given cell in a table.
    * @param table the table.
    * @param value the value to be rendered.
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java
index 745e713..6ab40ec 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java
@@ -96,6 +96,7 @@
 import org.opends.guitools.controlpanel.datamodel.MonitoringAttributes;
 import org.opends.guitools.controlpanel.datamodel.SortableTableModel;
 import org.opends.guitools.controlpanel.datamodel.VLVIndexDescriptor;
+import org.opends.guitools.controlpanel.event.ClickTooltipDisplayer;
 import org.opends.guitools.controlpanel.event.TextComponentFocusListener;
 import org.opends.guitools.controlpanel.ui.ColorAndFontConstants;
 import org.opends.guitools.controlpanel.ui.components.LabelWithHelpIcon;
@@ -2452,4 +2453,13 @@
     }
     return returnValue;
   }
+
+  /**
+   * Adds a click tool tip listener to the provided component.
+   * @param comp the component.
+   */
+  public static void addClickTooltipListener(JComponent comp)
+  {
+    comp.addMouseListener(new ClickTooltipDisplayer());
+  }
 }

--
Gitblit v1.10.0