/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.rioproject.tools.ui.browser;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.plaf.metal.MetalLookAndFeel;
import java.io.Serializable;
import javax.swing.Icon;
/**
* Based on "MetalIconFactory.java"
*
*/
class MetalIcons implements Serializable {
private static Icon blueFolderIcon;
private static Icon blueFileIcon;
private static Icon orangeFolderIcon;
private static Icon orangeFileIcon;
private static Icon grayFolderIcon;
private static Icon grayFileIcon;
private static Icon unusableFolderIcon;
private static Icon unusableFileIcon;
// Colors for Orange icons
private static Color orangeDarkShadowColor = new Color(0xcc, 0x99, 0x66);
private static Color orangeColor = new Color(0xff, 0x99, 0x33);
private static Color orangeShadowColor = new Color(0xcc, 0x99, 0x66);
private static Color orangeInfoColor = new Color(0x99, 0x00, 0x33);
private static Color orangeHighlightColor = new Color(0xff, 0xff, 0x33);
// Colors for Gray icons
private static Color grayDarkShadowColor = new Color(0x99, 0x99, 0x99);
private static Color grayColor = new Color(0xbb, 0xbb, 0xbb);
private static Color grayShadowColor = new Color(0xaa, 0xaa, 0xaa);
private static Color grayInfoColor = new Color(0x88, 0x88, 0x88);
private static Color grayHighlightColor = new Color(0xdd, 0xdd, 0xdd);
// Constants
public static final boolean DARK = false;
public static final boolean LIGHT = true;
// Accessor functions for Icons. Does the caching work.
public static Icon getBlueFolderIcon() {
if(blueFolderIcon == null)
blueFolderIcon = new BlueFolderIcon();
return blueFolderIcon;
}
public static Icon getBlueFileIcon() {
if(blueFileIcon == null)
blueFileIcon = new BlueFileIcon();
return blueFileIcon;
}
public static Icon getOrangeFolderIcon() {
if(orangeFolderIcon == null)
orangeFolderIcon = new OrangeFolderIcon();
return orangeFolderIcon;
}
public static Icon getOrangeFileIcon() {
if(orangeFileIcon == null)
orangeFileIcon = new OrangeFileIcon();
return orangeFileIcon;
}
public static Icon getGrayFolderIcon() {
if(grayFolderIcon == null)
grayFolderIcon = new GrayFolderIcon();
return grayFolderIcon;
}
public static Icon getGrayFileIcon() {
if(grayFileIcon == null)
grayFileIcon = new GrayFileIcon();
return grayFileIcon;
}
public static Icon getUnusableFolderIcon() {
if(unusableFolderIcon == null)
unusableFolderIcon = new UnusableFolderIcon();
return unusableFolderIcon;
}
public static Icon getUnusableFileIcon() {
if(unusableFileIcon == null)
unusableFileIcon = new UnusableFileIcon();
return unusableFileIcon;
}
static private final Dimension folderIcon16Size = new Dimension( 16, 16 );
static private final Dimension fileIcon16Size = new Dimension( 16, 16 );
/**
*/
static class BlueFolderIcon extends FolderIcon16 implements Icon {
public void paintIcon(Component c, Graphics g, int x, int y) {
super.paintIcon(c, g, x, y,
MetalLookAndFeel.getPrimaryControlDarkShadow(),
MetalLookAndFeel.getPrimaryControl(),
MetalLookAndFeel.getPrimaryControlShadow(),
MetalLookAndFeel.getPrimaryControlInfo(),
MetalLookAndFeel.getPrimaryControlHighlight());
}
public int getShift() { return -1; }
public int getAdditionalHeight() { return 2; }
}
static class OrangeFolderIcon extends FolderIcon16 implements Icon {
public void paintIcon(Component c, Graphics g, int x, int y) {
super.paintIcon(c, g, x, y,
orangeDarkShadowColor,
orangeColor,
orangeShadowColor,
orangeInfoColor,
orangeHighlightColor);
}
public int getShift() { return -1; }
public int getAdditionalHeight() { return 2; }
}
static class GrayFolderIcon extends FolderIcon16 implements Icon {
public void paintIcon(Component c, Graphics g, int x, int y) {
super.paintIcon(c, g, x, y,
grayDarkShadowColor,
grayColor,
grayShadowColor,
grayInfoColor,
grayHighlightColor);
}
public int getShift() { return -1; }
public int getAdditionalHeight() { return 2; }
}
static class UnusableFolderIcon extends FolderIcon16 implements Icon {
public void paintIcon(Component c, Graphics g, int x, int y) {
super.paintIcon(c, g, x, y,
grayDarkShadowColor,
grayColor,
grayShadowColor,
grayInfoColor,
grayHighlightColor);
super.drawCross(c, g, x, y);
}
public int getShift() { return -1; }
public int getAdditionalHeight() { return 2; }
}
/**
*/
private static abstract class FolderIcon16 implements Serializable {
public void paintIcon(Component c, Graphics g, int x, int y,
Color controlDarkShadowColor,
Color controlColor,
Color controlShadowColor,
Color controlInfoColor,
Color controlHighlightColor) {
g.translate( x, y + getShift() );
int right = folderIcon16Size.width - 1;
int bottom = folderIcon16Size.height - 1;
// Draw tab top
g.setColor( controlDarkShadowColor );
g.drawLine( right - 5, 3, right, 3 );
g.drawLine( right - 6, 4, right, 4 );
// Draw folder front
g.setColor( controlColor );
g.fillRect( 2, 7, 13, 8 );
// Draw tab bottom
g.setColor( controlShadowColor );
g.drawLine( right - 6, 5, right - 1, 5 );
// Draw outline
g.setColor( controlInfoColor );
g.drawLine( 0, 6, 0, bottom ); // left side
g.drawLine( 1, 5, right - 7, 5 ); // first part of top
g.drawLine( right - 6, 6, right - 1, 6 ); // second part of top
g.drawLine( right, 5, right, bottom ); // right side
g.drawLine( 0, bottom, right, bottom ); // bottom
// Draw highlight
g.setColor( controlHighlightColor );
g.drawLine( 1, 6, 1, bottom - 1 );
g.drawLine( 1, 6, right - 7, 6 );
g.drawLine( right - 6, 7, right - 1, 7 );
g.translate( -x, -(y + getShift()) );
}
public void drawCross(Component c, Graphics g, int x, int y) {
g.translate( x, y + getShift() );
int right = folderIcon16Size.width - 1;
int bottom = folderIcon16Size.height - 1;
// Draw tab top
Color crossColor = Color.red;
g.setColor( crossColor );
g.drawLine( 2, 2, right, bottom );
g.drawLine( 2, bottom, right, 2 );
}
public int getShift() { return 0; }
public int getAdditionalHeight() { return 0; }
public int getIconWidth() { return folderIcon16Size.width; }
public int getIconHeight() { return folderIcon16Size.height + getAdditionalHeight(); }
}
static class BlueFileIcon extends FileIcon16 implements Icon {
public void paintIcon(Component c, Graphics g, int x, int y) {
super.paintIcon(c, g, x, y,
MetalLookAndFeel.getPrimaryControlHighlight(),
MetalLookAndFeel.getPrimaryControlInfo(),
MetalLookAndFeel.getPrimaryControl());
}
public int getShift() { return -1; }
public int getAdditionalHeight() { return 2; }
}
static class OrangeFileIcon extends FileIcon16 implements Icon {
public void paintIcon(Component c, Graphics g, int x, int y) {
super.paintIcon(c, g, x, y,
orangeHighlightColor,
orangeInfoColor,
orangeColor);
}
public int getShift() { return -1; }
public int getAdditionalHeight() { return 2; }
}
static class GrayFileIcon extends FileIcon16 implements Icon {
public void paintIcon(Component c, Graphics g, int x, int y) {
super.paintIcon(c, g, x, y,
grayHighlightColor,
grayInfoColor,
grayColor);
}
public int getShift() { return -1; }
public int getAdditionalHeight() { return 2; }
}
static class UnusableFileIcon extends FileIcon16 implements Icon {
public void paintIcon(Component c, Graphics g, int x, int y) {
super.paintIcon(c, g, x, y,
grayHighlightColor,
grayInfoColor,
grayColor);
super.drawCross(c, g, x, y);
}
public int getShift() { return -1; }
public int getAdditionalHeight() { return 2; }
}
/**
*/
private static abstract class FileIcon16 implements Serializable {
public void paintIcon(Component c, Graphics g, int x, int y,
Color controlHighlightColor,
Color controlInfoColor,
Color controlColor) {
g.translate( x, y + getShift() );
int right = fileIcon16Size.width - 1;
int bottom = fileIcon16Size.height - 1;
// Draw fill
g.setColor( controlHighlightColor );
g.fillRect( 4, 2, 9, 12 );
// Draw frame
g.setColor( controlInfoColor );
g.drawLine( 2, 0, 2, bottom ); // left
g.drawLine( 2, 0, right - 4, 0 ); // top
g.drawLine( 2, bottom, right - 1, bottom ); // bottom
g.drawLine( right - 1, 6, right - 1, bottom ); // right
g.drawLine( right - 6, 2, right - 2, 6 ); // slant 1
g.drawLine( right - 5, 1, right - 4, 1 ); // part of slant 2
g.drawLine( right - 3, 2, right - 3, 3 ); // part of slant 2
g.drawLine( right - 2, 4, right - 2, 5 ); // part of slant 2
// Draw highlight
g.setColor( controlColor );
g.drawLine( 3, 1, 3, bottom - 1 ); // left
g.drawLine( 3, 1, right - 6, 1 ); // top
g.drawLine( right - 2, 7, right - 2, bottom - 1 ); // right
g.drawLine( right - 5, 2, right - 3, 4 ); // slant
g.drawLine( 3, bottom - 1, right - 2, bottom - 1 ); // bottom
g.translate( -x, -(y + getShift()) );
}
public void drawCross(Component c, Graphics g, int x, int y) {
g.translate( x, y + getShift() );
int right = folderIcon16Size.width - 1;
int bottom = folderIcon16Size.height - 1;
// Draw tab top
Color crossColor = Color.red;
g.setColor( crossColor );
g.drawLine( 1, 1, right - 1, bottom - 1 );
g.drawLine( 1, bottom - 1, right - 1, 1 );
}
public int getShift() { return 0; }
public int getAdditionalHeight() { return 0; }
public int getIconWidth() { return fileIcon16Size.width; }
public int getIconHeight() { return fileIcon16Size.height + getAdditionalHeight(); }
}
static class TreeLeafIcon extends FileIcon16 {
public int getShift() { return 2; }
public int getAdditionalHeight() { return 4; }
}
}