001: package org.umlgraph.doclet;
002:
003: import java.io.IOException;
004: import java.util.regex.Pattern;
005:
006: import com.sun.javadoc.ClassDoc;
007: import com.sun.javadoc.RootDoc;
008:
009: /**
010: * A view designed for UMLDoc, filters out everything that it's not directly
011: * connected to the center class of the context.
012: * <p>
013: * As such, can be viewed as a simplified version of a {@linkplain View} using a
014: * single {@linkplain ContextMatcher}, but provides some extra configuration
015: * such as context highlighting and output path configuration (and it is
016: * specified in code rather than in javadoc comments).
017: * @author wolf
018: *
019: */
020: public class ContextView implements OptionProvider {
021:
022: private ClassDoc cd;
023: private ContextMatcher matcher;
024: private Options globalOptions;
025: private Options myGlobalOptions;
026: private Options hideOptions;
027: private Options centerOptions;
028: private Options packageOptions;
029: private static final String[] HIDE_OPTIONS = new String[] { "-hide" };
030:
031: public ContextView(String outputFolder, ClassDoc cd, RootDoc root,
032: Options parent) throws IOException {
033: this .cd = cd;
034: String outputPath = cd.containingPackage().name().replace('.',
035: '/')
036: + "/" + cd.name() + ".dot";
037:
038: // setup options statically, so that we won't need to change them so
039: // often
040: this .globalOptions = parent.getGlobalOptions();
041:
042: this .packageOptions = parent.getGlobalOptions();
043: this .packageOptions.showQualified = false;
044:
045: this .myGlobalOptions = parent.getGlobalOptions();
046: this .myGlobalOptions.setOption(new String[] { "-output",
047: outputPath });
048: this .myGlobalOptions.setOption(HIDE_OPTIONS);
049:
050: this .hideOptions = parent.getGlobalOptions();
051: this .hideOptions.setOption(HIDE_OPTIONS);
052:
053: this .centerOptions = parent.getGlobalOptions();
054: this .centerOptions.nodeFillColor = "lemonChiffon";
055: this .centerOptions.showQualified = false;
056:
057: this .matcher = new ContextMatcher(root, Pattern.compile(cd
058: .qualifiedName()), myGlobalOptions, true);
059:
060: }
061:
062: public void setContextCenter(ClassDoc contextCenter) {
063: this .cd = contextCenter;
064: String outputPath = cd.containingPackage().name().replace('.',
065: '/')
066: + "/" + cd.name() + ".dot";
067: this .myGlobalOptions.setOption(new String[] { "-output",
068: outputPath });
069: matcher.setContextCenter(Pattern.compile(cd.toString()));
070: }
071:
072: public String getDisplayName() {
073: return "Context view for class " + cd;
074: }
075:
076: public Options getGlobalOptions() {
077: return myGlobalOptions;
078: }
079:
080: public Options getOptionsFor(ClassDoc cd) {
081: if (globalOptions.matchesHideExpression(cd.toString())
082: || !matcher.matches(cd)) {
083: return hideOptions;
084: } else if (cd.equals(this .cd)) {
085: return centerOptions;
086: } else if (cd.containingPackage().equals(
087: this .cd.containingPackage())) {
088: return packageOptions;
089: } else {
090: return globalOptions;
091: }
092: }
093:
094: public Options getOptionsFor(String name) {
095: if (!matcher.matches(name))
096: return hideOptions;
097: else if (name.equals(cd.name()))
098: return centerOptions;
099: else
100: return globalOptions;
101: }
102:
103: public void overrideForClass(Options opt, ClassDoc cd) {
104: if (opt.matchesHideExpression(cd.toString())
105: || !matcher.matches(cd))
106: opt.setOption(HIDE_OPTIONS);
107: if (cd.equals(this .cd))
108: opt.nodeFillColor = "lemonChiffon";
109: }
110:
111: public void overrideForClass(Options opt, String className) {
112: if (!matcher.matches(className))
113: opt.setOption(HIDE_OPTIONS);
114: }
115:
116: }
|