/**
* @(#)FontFaceNode.java
*
* Copyright (c) 2008 The authors and contributors of JHotDraw.
* You may not use, copy or modify this file, except in compliance with the
* accompanying license terms.
*/
package org.jhotdraw.gui.fontchooser;
import edu.umd.cs.findbugs.annotations.Nullable;
import java.awt.Font;
import java.util.Collections;
import java.util.Enumeration;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;
/**
* A FontFaceNode is a MutableTreeNode which does not allow children.
*
* @author Werner Randelshofer
* @version $Id$
*/
public class FontFaceNode implements MutableTreeNode, Comparable<FontFaceNode>, Cloneable {
@Nullable private FontFamilyNode parent;
private Font typeface;
private String name;
public FontFaceNode(Font typeface) {
this.typeface = typeface;
this.name = beautifyName(typeface.getPSName());
}
protected String beautifyName(String name) {
// 'Beautify' the name
int p = name.lastIndexOf('-');
if (p != -1) {
name = name.substring(p + 1);
String lcName = name.toLowerCase();
if ("plain".equals(lcName)) {
name = "Plain";
} else if ("bolditalic".equals(lcName)) {
name = "Bold Italic";
} else if ("italic".equals(lcName)) {
name = "Italic";
} else if ("bold".equals(lcName)) {
name = "Bold";
}
} else {
String lcName = name.toLowerCase();
if (lcName.endsWith("plain")) {
name = "Plain";
} else if (lcName.endsWith("boldoblique")) {
name = "Bold Oblique";
} else if (lcName.endsWith("bolditalic")) {
name = "Bold Italic";
} else if (lcName.endsWith("bookita")) {
name = "Book Italic";
} else if (lcName.endsWith("bookit")) {
name = "Book Italic";
} else if (lcName.endsWith("demibold")) {
name = "Demi Bold";
} else if (lcName.endsWith("semiita")) {
name = "Semi Italic";
} else if (lcName.endsWith("italic")) {
name = "Italic";
} else if (lcName.endsWith("book")) {
name = "Book";
} else if (lcName.endsWith("bold")) {
name = "Bold";
} else if (lcName.endsWith("bol")) {
name = "Bold";
} else if (lcName.endsWith("oblique")) {
name = "Oblique";
} else if (lcName.endsWith("regular")) {
name = "Regular";
} else if (lcName.endsWith("semi")) {
name = "Semi";
} else {
name = "Plain";
}
}
StringBuilder buf = new StringBuilder();
char prev = name.charAt(0);
buf.append(prev);
for (int i = 1; i < name.length(); i++) {
char ch = name.charAt(i);
if (prev != ' ' && prev != '-' &&
Character.isUpperCase(ch) && !Character.isUpperCase(prev) ||
Character.isDigit(ch) && !Character.isDigit(prev)) {
buf.append(' ');
}
buf.append(ch);
prev = ch;
}
name = buf.toString();
return name;
}
public void setName(String newValue) {
this.name = newValue;
}
public String getName() {
return name;
}
public Font getFont() {
return typeface;
}
@Override
public String toString() {
return name;
}
@Override
public void insert(MutableTreeNode child, int index) {
throw new UnsupportedOperationException("Not allowed.");
}
@Override
public void remove(int index) {
throw new UnsupportedOperationException("Not allowed.");
}
@Override
public void remove(MutableTreeNode node) {
throw new UnsupportedOperationException("Not allowed.");
}
@Override
public void setUserObject(Object object) {
throw new UnsupportedOperationException("Not allowed.");
}
@Override
public void removeFromParent() {
if (parent != null) {
parent.remove(this);
}
}
@Override @Nullable
public void setParent(MutableTreeNode newParent) {
this.parent = (FontFamilyNode) newParent;
}
@Override
public TreeNode getChildAt(int childIndex) {
throw new IndexOutOfBoundsException("" + childIndex);
}
@Override
public int getChildCount() {
return 0;
}
@Override @Nullable
public TreeNode getParent() {
return parent;
}
@Override
public int getIndex(TreeNode node) {
return -1;
}
@Override
public boolean getAllowsChildren() {
return false;
}
@Override
public boolean isLeaf() {
return true;
}
@SuppressWarnings("unchecked")
@Override
public Enumeration<TreeNode> children() {
return Collections.enumeration(Collections.EMPTY_LIST);
}
@Override
public int compareTo(FontFaceNode that) {
return this.name.compareTo(that.name);
}
@Override
public FontFaceNode clone() {
FontFaceNode that;
try {
that = (FontFaceNode) super.clone();
} catch (CloneNotSupportedException ex) {
InternalError error = new InternalError("Clone failed");
error.initCause(ex);
throw error;
}
that.parent = null;
return that;
}
public boolean isEditable() {
return false;
}
}