blob: bbab38f642c03f4b16b7d2d4d1fec160e754e927 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.css.core.internal.contentmodel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
/**
*
*/
public class PropCMProperty extends PropCMContainer {
// static fields
private static java.util.Hashtable instances = null;
private static java.util.Hashtable cachedIdMap = null;
public final static String P_AZIMUTH = "azimuth";//$NON-NLS-1$
public final static String P_BG = "background";//$NON-NLS-1$
public final static String P_BG_ATTACHMENT = "background-attachment";//$NON-NLS-1$
public final static String P_BG_COLOR = "background-color";//$NON-NLS-1$
public final static String P_BG_IMAGE = "background-image";//$NON-NLS-1$
public final static String P_BG_POSITION = "background-position";//$NON-NLS-1$
public final static String P_BG_REPEAT = "background-repeat";//$NON-NLS-1$
public final static String P_BORDER = "border";//$NON-NLS-1$
public final static String P_BORDER_COLLAPSE = "border-collapse";//$NON-NLS-1$
public final static String P_BORDER_COLOR = "border-color";//$NON-NLS-1$
public final static String P_BORDER_SPACING = "border-spacing";//$NON-NLS-1$
public final static String P_BORDER_STYLE = "border-style";//$NON-NLS-1$
public final static String P_BORDER_TOP = "border-top";//$NON-NLS-1$
public final static String P_BORDER_RIGHT = "border-right";//$NON-NLS-1$
public final static String P_BORDER_BOTTOM = "border-bottom";//$NON-NLS-1$
public final static String P_BORDER_LEFT = "border-left";//$NON-NLS-1$
public final static String P_BORDER_TOP_COLOR = "border-top-color";//$NON-NLS-1$
public final static String P_BORDER_RIGHT_COLOR = "border-right-color";//$NON-NLS-1$
public final static String P_BORDER_BOTTOM_COLOR = "border-bottom-color";//$NON-NLS-1$
public final static String P_BORDER_LEFT_COLOR = "border-left-color";//$NON-NLS-1$
public final static String P_BORDER_TOP_STYLE = "border-top-style";//$NON-NLS-1$
public final static String P_BORDER_RIGHT_STYLE = "border-right-style";//$NON-NLS-1$
public final static String P_BORDER_BOTTOM_STYLE = "border-bottom-style";//$NON-NLS-1$
public final static String P_BORDER_LEFT_STYLE = "border-left-style";//$NON-NLS-1$
public final static String P_BORDER_TOP_WIDTH = "border-top-width";//$NON-NLS-1$
public final static String P_BORDER_RIGHT_WIDTH = "border-right-width";//$NON-NLS-1$
public final static String P_BORDER_BOTTOM_WIDTH = "border-bottom-width";//$NON-NLS-1$
public final static String P_BORDER_LEFT_WIDTH = "border-left-width";//$NON-NLS-1$
public final static String P_BORDER_WIDTH = "border-width";//$NON-NLS-1$
public final static String P_BOTTOM = "bottom";//$NON-NLS-1$
public final static String P_CAPTION_SIDE = "caption-side";//$NON-NLS-1$
public final static String P_CLEAR = "clear";//$NON-NLS-1$
public final static String P_CLIP = "clip";//$NON-NLS-1$
public final static String P_COLOR = "color";//$NON-NLS-1$
public final static String P_CONTENT = "content";//$NON-NLS-1$
public final static String P_COUNTER_INCREMENT = "counter-increment";//$NON-NLS-1$
public final static String P_COUNTER_RESET = "counter-reset";//$NON-NLS-1$
public final static String P_CUE = "cue";//$NON-NLS-1$
public final static String P_CUE_AFTER = "cue-after";//$NON-NLS-1$
public final static String P_CUE_BEFORE = "cue-before";//$NON-NLS-1$
public final static String P_CURSOR = "cursor";//$NON-NLS-1$
public final static String P_DIRECTION = "direction";//$NON-NLS-1$
public final static String P_DISPLAY = "display";//$NON-NLS-1$
public final static String P_ELEVATION = "elevation";//$NON-NLS-1$
public final static String P_EMPTY_CELLS = "empty-cells";//$NON-NLS-1$
public final static String P_FLOAT = "float";//$NON-NLS-1$
public final static String P_FONT = "font";//$NON-NLS-1$
public final static String P_FONT_FAMILY = "font-family";//$NON-NLS-1$
public final static String P_FONT_SIZE = "font-size";//$NON-NLS-1$
public final static String P_FONT_SIZE_ADJUST = "font-size-adjust";//$NON-NLS-1$
public final static String P_FONT_STRETCH = "font-stretch";//$NON-NLS-1$
public final static String P_FONT_STYLE = "font-style";//$NON-NLS-1$
public final static String P_FONT_VARIANT = "font-variant";//$NON-NLS-1$
public final static String P_FONT_WEIGHT = "font-weight";//$NON-NLS-1$
public final static String P_HEIGHT = "height";//$NON-NLS-1$
public final static String P_LEFT = "left";//$NON-NLS-1$
public final static String P_LETTER_SPACING = "letter-spacing";//$NON-NLS-1$
public final static String P_LINE_HEIGHT = "line-height";//$NON-NLS-1$
public final static String P_LIST_STYLE = "list-style";//$NON-NLS-1$
public final static String P_LIST_STYLE_IMAGE = "list-style-image";//$NON-NLS-1$
public final static String P_LIST_STYLE_POSITION = "list-style-position";//$NON-NLS-1$
public final static String P_LIST_STYLE_TYPE = "list-style-type";//$NON-NLS-1$
public final static String P_MARGIN = "margin";//$NON-NLS-1$
public final static String P_MARGIN_TOP = "margin-top";//$NON-NLS-1$
public final static String P_MARGIN_RIGHT = "margin-right";//$NON-NLS-1$
public final static String P_MARGIN_BOTTOM = "margin-bottom";//$NON-NLS-1$
public final static String P_MARGIN_LEFT = "margin-left";//$NON-NLS-1$
public final static String P_MARKER_OFFSET = "marker-offset";//$NON-NLS-1$
public final static String P_MARKS = "marks";//$NON-NLS-1$
public final static String P_MAX_HEIGHT = "max-height";//$NON-NLS-1$
public final static String P_MAX_WIDTH = "max-width";//$NON-NLS-1$
public final static String P_MIN_HEIGHT = "min-height";//$NON-NLS-1$
public final static String P_MIN_WIDTH = "min-width";//$NON-NLS-1$
public final static String P_ORPHANS = "orphans";//$NON-NLS-1$
public final static String P_OUTLINE = "outline";//$NON-NLS-1$
public final static String P_OUTLINE_COLOR = "outline-color";//$NON-NLS-1$
public final static String P_OUTLINE_STYLE = "outline-style";//$NON-NLS-1$
public final static String P_OUTLINE_WIDTH = "outline-width";//$NON-NLS-1$
public final static String P_OVERFLOW = "overflow";//$NON-NLS-1$
public final static String P_PADDING = "padding";//$NON-NLS-1$
public final static String P_PADDING_TOP = "padding-top";//$NON-NLS-1$
public final static String P_PADDING_RIGHT = "padding-right";//$NON-NLS-1$
public final static String P_PADDING_BOTTOM = "padding-bottom";//$NON-NLS-1$
public final static String P_PADDING_LEFT = "padding-left";//$NON-NLS-1$
public final static String P_PAGE = "page";//$NON-NLS-1$
public final static String P_PAGE_BREAK_AFTER = "page-break-after";//$NON-NLS-1$
public final static String P_PAGE_BREAK_BEFORE = "page-break-before";//$NON-NLS-1$
public final static String P_PAGE_BREAK_INSIDE = "page-break-inside";//$NON-NLS-1$
public final static String P_PAUSE = "pause";//$NON-NLS-1$
public final static String P_PAUSE_AFTER = "pause-after";//$NON-NLS-1$
public final static String P_PAUSE_BEFORE = "pause-before";//$NON-NLS-1$
public final static String P_PITCH = "pitch";//$NON-NLS-1$
public final static String P_PITCH_RANGE = "pitch-range";//$NON-NLS-1$
public final static String P_PLAY_DURING = "play-during";//$NON-NLS-1$
public final static String P_POSITION = "position";//$NON-NLS-1$
public final static String P_QUOTES = "quotes";//$NON-NLS-1$
public final static String P_RICHNESS = "richness";//$NON-NLS-1$
public final static String P_RIGHT = "right";//$NON-NLS-1$
public final static String P_SIZE = "size";//$NON-NLS-1$
public final static String P_SPEAK = "speak";//$NON-NLS-1$
public final static String P_SPEAK_HEADER = "speak-header";//$NON-NLS-1$
public final static String P_SPEAK_NUMERAL = "speak-numeral";//$NON-NLS-1$
public final static String P_SPEAK_PUNCTUATION = "speak-punctuation";//$NON-NLS-1$
public final static String P_SPEECH_RATE = "speech-rate";//$NON-NLS-1$
public final static String P_STRESS = "stress";//$NON-NLS-1$
public final static String P_TABLE_LAYOUT = "table-layout";//$NON-NLS-1$
public final static String P_TEXT_ALIGN = "text-align";//$NON-NLS-1$
public final static String P_TEXT_DECORATION = "text-decoration";//$NON-NLS-1$
public final static String P_TEXT_INDENT = "text-indent";//$NON-NLS-1$
public final static String P_TEXT_SHADOW = "text-shadow";//$NON-NLS-1$
public final static String P_TEXT_TRANSFORM = "text-transform";//$NON-NLS-1$
public final static String P_TOP = "top";//$NON-NLS-1$
public final static String P_UNICODE_BIDI = "unicode-bidi";//$NON-NLS-1$
public final static String P_VERTICAL_ALIGN = "vertical-align";//$NON-NLS-1$
public final static String P_VISIBILITY = "visibility";//$NON-NLS-1$
public final static String P_VOICE_FAMILY = "voice-family";//$NON-NLS-1$
public final static String P_VOLUME = "volume";//$NON-NLS-1$
public final static String P_WHITE_SPACE = "white-space";//$NON-NLS-1$
public final static String P_WIDOWS = "widows";//$NON-NLS-1$
public final static String P_WIDTH = "width";//$NON-NLS-1$
public final static String P_WORD_SPACING = "word-spacing";//$NON-NLS-1$
public final static String P_Z_INDEX = "z-index";//$NON-NLS-1$
// instance fields
private int fMinValueCount = 1;
private int fMaxValueCount = 1;
private Object[] mediaGroups;
protected List containers;
/**
*
*/
protected PropCMProperty(String name) {
super(name);
}
/**
*
*/
Object appendChild(Object node) {
Object ret = super.appendChild(node);
if (node instanceof PropCMProperty) {
// register shorthand container
PropCMProperty cm = (PropCMProperty) node;
if (cm.containers == null)
cm.containers = new Vector();
if (!cm.containers.contains(this))
cm.containers.add(this);
}
return ret;
}
/**
*
*/
void appendMediaGroup(Object mg) {
if (mediaGroups == null)
mediaGroups = new Object[1];
else {
Object[] oldMediaGroups = mediaGroups;
mediaGroups = new Object[oldMediaGroups.length + 1];
System.arraycopy(oldMediaGroups, 0, mediaGroups, 0, oldMediaGroups.length);
}
mediaGroups[mediaGroups.length - 1] = mg;
}
/**
*
*/
public static PropCMProperty getInstanceOf(String name) {
// initialize
if (instances == null)
instances = new Hashtable(200);
// Initialize of DB
if (isNeedInitialize())
PropCMNode.initPropertyCM();
// query
Object node = instances.get(name);
if (node != null)
return (PropCMProperty) node;
// register
if (PropCMNode.isLoading()) {
node = new PropCMProperty(name);
instances.put(name, node);
}
return (PropCMProperty) node;
}
/**
*
*/
public int getMaxValueCount() {
return fMaxValueCount;
}
/**
*
*/
public List getMediaGroups() {
if (mediaGroups != null)
return Arrays.asList(mediaGroups);
else
return new ArrayList();
}
/**
*
*/
public int getMinValueCount() {
return fMinValueCount;
}
/**
*
*/
public static Enumeration getNameEnum() {
// Initialize of DB
if (isNeedInitialize())
PropCMNode.initPropertyCM();
return instances.keys();
}
/**
*
*/
public static Enumeration getPropertyEnum() {
// Initialize of DB
if (isNeedInitialize())
PropCMNode.initPropertyCM();
return instances.elements();
}
/**
*
*/
public int getShorthandContainerCount() {
return (containers == null) ? 0 : containers.size();
}
/**
*
*/
public short getType() {
return VAL_PROPERTY;
}
/**
*
*/
public boolean isShorthand() {
int nChild = getNumChild();
for (int i = 0; i < nChild; i++) {
Object obj = getChildAt(i);
if (obj instanceof PropCMProperty && !(obj instanceof PropCMSubProperty))
return true;
}
return false;
}
/**
*
*/
public static Vector names() {
// Initialize of DB
if (isNeedInitialize())
PropCMNode.initPropertyCM();
return new Vector(instances.keySet());
}
/**
*
*/
public static List names(Object mediaGroup) {
if (mediaGroup == null)
return names();
// Initialize of DB
if (isNeedInitialize())
PropCMNode.initPropertyCM();
Vector properties = new Vector();
Iterator it = instances.values().iterator();
while (it.hasNext()) {
PropCMProperty prop = (PropCMProperty) it.next();
if (prop.getMediaGroups().contains(mediaGroup))
properties.add(prop.getName());
}
return properties;
}
/**
* If identifier is null, get all properties
*/
public static Vector propertiesFor(String identifier, boolean shorthands) {
// Initialize of DB
if (isNeedInitialize())
PropCMNode.initPropertyCM();
// if identifier is null, get all properties
if (identifier == null)
return new Vector(instances.values());
if (cachedIdMap == null) {
// start cacheing
cachedIdMap = new Hashtable();
}
else {
// search cached
Object ret = cachedIdMap.get(identifier + String.valueOf(shorthands));
if (ret != null)
return new Vector((Collection) ret);
}
// create
Enumeration propertyEnum = getPropertyEnum();
HashSet set = new HashSet();
while (propertyEnum.hasMoreElements()) {
PropCMProperty prop = (PropCMProperty) propertyEnum.nextElement();
if (!shorthands && prop.isShorthand())
continue;
if (prop.canHave(identifier))
set.add(prop);
}
// cache
cachedIdMap.put(identifier + String.valueOf(shorthands), set);
return new Vector(set);
}
/**
*
*/
protected void setMaxValueCount(int newMaxValueCount) {
fMaxValueCount = newMaxValueCount;
}
/**
*
*/
protected void setMinValueCount(int newMinValueCount) {
fMinValueCount = newMinValueCount;
}
/**
*
*/
public PropCMProperty shorthandContainerAt(int i) {
if (containers == null)
return null;
if (i < 0 || containers.size() <= i)
return null;
return (PropCMProperty) containers.get(i);
}
/**
*
*/
public Iterator shorthandContainerIterator() {
if (containers == null) {
return new Iterator() {
public boolean hasNext() {
return false;
}
public Object next() {
return null;
}
public void remove() {
}
};
}
else
return containers.iterator();
}
}