/*
|
* 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 2008-2010 Sun Microsystems, Inc.
|
*/
|
|
package org.opends.guitools.controlpanel.browser;
|
|
import static org.opends.messages.AdminToolMessages.*;
|
|
import java.awt.Canvas;
|
import java.awt.Image;
|
import java.awt.MediaTracker;
|
import java.awt.image.ColorModel;
|
import java.awt.image.ImageObserver;
|
import java.awt.image.MemoryImageSource;
|
import java.awt.image.PixelGrabber;
|
import java.util.HashMap;
|
import java.util.Set;
|
import java.util.SortedSet;
|
|
import javax.swing.ImageIcon;
|
|
import org.opends.guitools.controlpanel.util.Utilities;
|
import org.opends.quicksetup.ui.UIFactory;
|
|
/**
|
* This class is used as a cache containing the icons that are used by the
|
* BrowserController to update the nodes. It keeps some icons associated with
|
* some entry types, to suffixes, to the root node, etc.
|
*/
|
public class IconPool {
|
|
/**
|
* Mask for the leaf node.
|
*/
|
public static final int MODIFIER_LEAF = 0x01;
|
/**
|
* Mask for the referral node.
|
*/
|
public static final int MODIFIER_REFERRAL = 0x02;
|
/**
|
* Mask for the node that has an error.
|
*/
|
public static final int MODIFIER_ERROR = 0x04;
|
|
private HashMap<String, ImageIcon> iconTable =
|
new HashMap<String, ImageIcon>();
|
private HashMap<String, String> pathTable = new HashMap<String, String>();
|
private HashMap<String, String> descriptionTable =
|
new HashMap<String, String>();
|
private ImageIcon defaultLeafIcon;
|
private ImageIcon suffixIcon;
|
private ImageIcon defaultContainerIcon;
|
private ImageIcon rootNodeIcon;
|
private ImageIcon errorIcon;
|
private ImageIcon errorMaskIcon;
|
private ImageIcon referralMaskIcon;
|
|
/**
|
* The path that contains the icons.
|
*/
|
public static final String IMAGE_PATH =
|
"org/opends/guitools/controlpanel/images";
|
|
|
private static final String[] ICON_PATH = {
|
"person", "ds-user.png",
|
"organization", "ds-folder.png",
|
"organizationalunit", "ds-ou.png",
|
"groupofuniquenames", "ds-group.png",
|
"groupofurls", "ds-group.png",
|
"ds-virtual-static-group", "ds-group.png",
|
"passwordpolicy", "ds-ppol.png"
|
};
|
|
private static final String[] DESCRIPTION = {
|
"person", INFO_PERSON_ICON_DESCRIPTION.get().toString(),
|
"organization", INFO_ORGANIZATION_ICON_DESCRIPTION.get().toString(),
|
"organizationalunit",
|
INFO_ORGANIZATIONAL_UNIT_ICON_DESCRIPTION.get().toString(),
|
"groupofuniquenames", INFO_STATIC_GROUP_ICON_DESCRIPTION.get().toString(),
|
"groupofurls", INFO_DYNAMIC_GROUP_ICON_DESCRIPTION.get().toString(),
|
"ds-virtual-static-group",
|
INFO_VIRTUAL_STATIC_GROUP_ICON_DESCRIPTION.get().toString(),
|
"passwordpolicy", INFO_PASSWORD_POLICY_ICON_DESCRIPTION.get().toString()
|
};
|
|
private String GENERIC_OBJECT_DESCRIPTION = "Generic entry";
|
|
/**
|
* The default constructor.
|
*
|
*/
|
public IconPool() {
|
// Recopy ICON_PATH in pathTable for fast access
|
for (int i = 0; i < ICON_PATH.length; i = i+2) {
|
pathTable.put(ICON_PATH[i], ICON_PATH[i+1]);
|
}
|
for (int i = 0; i < DESCRIPTION.length; i = i+2) {
|
descriptionTable.put(DESCRIPTION[i], DESCRIPTION[i+1]);
|
}
|
}
|
|
|
/**
|
* If objectClass is null, a default icon is used.
|
* @param objectClasses the objectclass values of the entry for which we want
|
* an icon.
|
* @param modifiers the modifiers associated with the entry (if there was
|
* an error, if it is a referral, etc.).
|
* @return the icon corresponding to the provided object classes and
|
* modifiers.
|
*/
|
public ImageIcon getIcon(SortedSet<String> objectClasses, int modifiers) {
|
ImageIcon result;
|
|
String key = makeKey(objectClasses, modifiers);
|
result = iconTable.get(key);
|
if (result == null) {
|
result = makeIcon(objectClasses, modifiers);
|
iconTable.put(key, result);
|
}
|
|
return result;
|
}
|
|
/**
|
* Creates an icon for a given path.
|
* @param path the path of the icon.
|
* @param description the description of the icon
|
* @return the associated ImageIcon.
|
*/
|
private ImageIcon createIcon(String path, String description)
|
{
|
ImageIcon icon = Utilities.createImageIcon(path);
|
if (description != null)
|
{
|
icon.setDescription(description);
|
icon.getAccessibleContext().setAccessibleDescription(description);
|
}
|
return icon;
|
}
|
|
/**
|
* Returns the icon associated with a leaf node.
|
* @return the icon associated with a leaf node.
|
*/
|
public ImageIcon getDefaultLeafIcon() {
|
if (defaultLeafIcon == null) {
|
defaultLeafIcon = createIcon(IMAGE_PATH + "/ds-generic.png",
|
GENERIC_OBJECT_DESCRIPTION);
|
}
|
return defaultLeafIcon;
|
}
|
|
|
/**
|
* Returns the icon associated with a container node.
|
* @return the icon associated with a container node.
|
*/
|
public ImageIcon getDefaultContainerIcon() {
|
if (defaultContainerIcon == null) {
|
defaultContainerIcon = createIcon(IMAGE_PATH + "/ds-folder.png",
|
"Folder entry");
|
}
|
return defaultContainerIcon;
|
}
|
|
/**
|
* Returns the icon associated with a suffix node.
|
* @return the icon associated with a suffix node.
|
*/
|
public ImageIcon getSuffixIcon() {
|
if (suffixIcon == null) {
|
suffixIcon = createIcon(IMAGE_PATH + "/ds-suffix.png",
|
"Suffix entry");
|
}
|
return suffixIcon;
|
}
|
|
/**
|
* Returns the icon associated with a root node.
|
* @return the icon associated with a root node.
|
*/
|
public ImageIcon getIconForRootNode() {
|
if (rootNodeIcon == null) {
|
rootNodeIcon = createIcon(IMAGE_PATH + "/ds-directory.png",
|
"Root entry");
|
}
|
return rootNodeIcon;
|
}
|
|
/**
|
* Returns the icon associated with a node for which an error occurred.
|
* @return the icon associated with a node for which an error occurred.
|
*/
|
public ImageIcon getErrorIcon() {
|
if (errorIcon == null) {
|
errorIcon = UIFactory.getImageIcon(UIFactory.IconType.ERROR);
|
}
|
return errorIcon;
|
}
|
|
|
/**
|
* Returns the icon associated with the error mask icon.
|
* @return the icon associated with the error mask icon.
|
*/
|
public ImageIcon getErrorMaskIcon() {
|
if (errorMaskIcon == null) {
|
errorMaskIcon = UIFactory.getImageIcon(UIFactory.IconType.ERROR);
|
}
|
return errorMaskIcon;
|
}
|
|
|
/**
|
* Returns the icon associated with the referral mask icon.
|
* @return the icon associated with the referral mask icon.
|
*/
|
public ImageIcon getReferralMaskIcon() {
|
if (referralMaskIcon == null) {
|
referralMaskIcon = createIcon(IMAGE_PATH + "/ds-referral.png",
|
"Referral mask");
|
}
|
return referralMaskIcon;
|
}
|
|
|
/**
|
* Returns an icon for a given objectclass applying some modifiers.
|
* @param objectClasses the objectclasses of the entry
|
* @param modifiers the modifiers of the icon (if the entry is inactivated,
|
* if it is a referral...).
|
* @return an icon for a given objectclass applying some modifiers.
|
*/
|
private ImageIcon makeIcon(Set<String> objectClasses, int modifiers) {
|
ImageIcon result;
|
|
// Find the icon associated to the object class
|
if ((objectClasses == null) || (objectClasses.size() == 0)) {
|
result = getDefaultContainerIcon();
|
}
|
else {
|
String iconFile = null;
|
for (String value : objectClasses)
|
{
|
iconFile = pathTable.get(value.toLowerCase());
|
if (iconFile != null)
|
{
|
break;
|
}
|
}
|
if (iconFile == null) {
|
if ((modifiers & MODIFIER_LEAF) != 0) {
|
result = getDefaultLeafIcon();
|
}
|
else {
|
result = getDefaultContainerIcon();
|
}
|
}
|
else {
|
String description = null;
|
for (String value : objectClasses)
|
{
|
description = descriptionTable.get(value.toLowerCase());
|
if (description != null)
|
{
|
break;
|
}
|
}
|
if (description == null)
|
{
|
description = GENERIC_OBJECT_DESCRIPTION;
|
}
|
result = createIcon(IMAGE_PATH + "/" + iconFile,
|
description);
|
}
|
}
|
|
// Alter this icon according the modifiers
|
if ((modifiers & MODIFIER_REFERRAL) != 0) {
|
result = getReferralMaskIcon();
|
}
|
if ((modifiers & MODIFIER_ERROR) != 0) {
|
result = getErrorMaskIcon();
|
}
|
|
return result;
|
}
|
|
|
private String makeKey(SortedSet<String> ocValues, int modifiers) {
|
// TODO: verify the performance of IconPool.makeKey()
|
StringBuilder result = new StringBuilder();
|
if(ocValues != null) {
|
result.append(Utilities.getStringFromCollection(ocValues, ""));
|
}
|
result.append(String.valueOf(modifiers));
|
return result.toString();
|
}
|
|
|
|
/**
|
* Returns a RemoteImage corresponding to the superposition of the icon
|
* Image and the mask Image.
|
*
|
* @param icon the RemoteImage that we want to bar.
|
* @param mask the ImageIcond to be used as mask.
|
* @return a RemoteImage corresponding to the superposition of the icon
|
* Image and the mask Image.
|
*/
|
public static ImageIcon maskedIcon(ImageIcon icon, ImageIcon mask) {
|
ImageIcon fReturn;
|
int TRANSPARENT = 16711165; // The value of a transparent pixel
|
|
int h = icon.getIconHeight();
|
int w = icon.getIconWidth();
|
|
if (mask.getImageLoadStatus() != MediaTracker.COMPLETE) {
|
return null;
|
}
|
Image maskImage = mask.getImage();
|
|
Image scaledMaskImage = maskImage.getScaledInstance(w, h ,
|
Image.SCALE_SMOOTH);
|
|
ImageIcon scaledMask = new ImageIcon(scaledMaskImage);
|
if (scaledMask.getImageLoadStatus() != MediaTracker.COMPLETE) {
|
return null;
|
}
|
|
int[] iconPixels = new int[w * h];
|
try {
|
PixelGrabber pg =
|
new PixelGrabber(icon.getImage(), 0, 0, w, h, iconPixels, 0, w);
|
pg.grabPixels();
|
|
if ((pg.status() & ImageObserver.ABORT) !=0) {
|
return null;
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
return null;
|
}
|
int[] filterPixels = new int[w * h];
|
try {
|
PixelGrabber pgf =
|
new PixelGrabber(scaledMask.getImage(), 0, 0, w, h, filterPixels, 0, w);
|
pgf.grabPixels();
|
|
if ((pgf.status() & ImageObserver.ABORT) !=0) {
|
fReturn = null;
|
return fReturn;
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
fReturn = null;
|
return fReturn;
|
}
|
|
|
int[] newPixels = new int[w * h];
|
|
for( int i = 0; i < h; i++)
|
for (int j = 0; j < w; j++)
|
if (filterPixels[j + i*w] != TRANSPARENT) {
|
newPixels[j + i*w] = filterPixels[j + i*w];
|
} else {
|
newPixels[j + i*w] = iconPixels[j + i*w];
|
}
|
Canvas component = new Canvas();
|
|
Image newImage = component.getToolkit().createImage(
|
new MemoryImageSource(
|
w, h, ColorModel.getRGBdefault(), newPixels, 0, w));
|
fReturn = new ImageIcon(newImage, icon.getDescription());
|
|
return fReturn;
|
}
|
}
|