BEGIN {
foreach (qw(Mac::Files)) {
$MOD_AVAIL{$_} = eval "use $_; 1";
}
}
package HeaderDoc::CPPClass;
use HeaderDoc::Utilities qw(findRelativePath safeName getAPINameAndDisc printArray printHash sanitize);
use HeaderDoc::APIOwner;
use strict;
use vars qw($VERSION @ISA);
$VERSION = '$Revision: 1.13.2.14.2.28 $';
@ISA = qw( HeaderDoc::APIOwner );
my $isMacOS;
my $pathSeparator;
if ($^O =~ /MacOS/io) {
$pathSeparator = ":";
$isMacOS = 1;
} else {
$pathSeparator = "/";
$isMacOS = 0;
}
my $debugging = 0;
my $tracing = 0;
my $outputExtension = ".html";
my $tocFrameName = "toc.html";
sub _initialize {
my($self) = shift;
$self->SUPER::_initialize();
$self->tocTitlePrefix('Class:');
$self->{ISCOMINTERFACE} = 0;
$self->{CLASS} = "HeaderDoc::CPPClass";
}
sub clone {
my $self = shift;
my $clone = undef;
if (@_) {
$clone = shift;
} else {
$clone = HeaderDoc::CPPClass->new();
}
$self->SUPER::clone($clone);
$clone->{ISCOMINTERFACE} = $self->{ISCOMINTERFACE};
return $clone;
}
sub isCOMInterface {
my $self = shift;
if (@_) {
$self->{ISCOMINTERFACE} = shift;
}
return $self->{ISCOMINTERFACE};
}
sub _getCompositePageString {
my $self = shift;
my $name = $self->name();
my $compositePageString;
my $contentString;
my $list_attributes = $self->getAttributeLists(1);
$compositePageString .= $self->compositePageAPIRef();
my $abstract = $self->abstract();
if (length($abstract)) {
$compositePageString .= "<h2>Abstract</h2>\n";
$compositePageString .= $abstract;
}
my $namespace = $self->namespace();
my $availability = $self->availability();
my $updated = $self->updated();
if (length($namespace) || length($updated) || length($availability)) {
$compositePageString .= "<p></p>\n";
}
if (length($namespace)) {
$compositePageString .= "<b>Namespace:</b> $namespace<br>\n";
}
if (length($availability)) {
$compositePageString .= "<b>Availability:</b> $availability<br>\n";
}
if (length($updated)) {
$compositePageString .= "<b>Updated:</b> $updated<br>\n";
}
my $short_attributes = $self->getAttributes(0);
my $long_attributes = $self->getAttributes(1);
my $list_attributes = $self->getAttributeLists(1);
if (length($short_attributes)) {
$compositePageString .= "$short_attributes";
}
if (length($long_attributes)) {
$compositePageString .= "$long_attributes";
}
if (length($list_attributes)) {
$contentString .= $list_attributes;
}
my $discussion = $self->discussion();
if (length($discussion)) {
$compositePageString .= "<h2>Discussion</h2>\n";
$compositePageString .= $discussion;
}
if (length($long_attributes)) {
$compositePageString .= "$long_attributes";
}
$compositePageString .= "<hr><br>";
my $etoc = $self->_getClassEmbeddedTOC(1);
if (length($etoc)) {
$compositePageString .= $etoc;
$compositePageString .= "<hr><br>";
}
$contentString= $self->_getFunctionDetailString(1);
if (length($contentString)) {
$compositePageString .= "<h2>Member Functions</h2>\n";
$compositePageString .= $contentString;
}
$contentString= $self->_getVarDetailString(1);
if (length($contentString)) {
$compositePageString .= "<h2>Member Data</h2>\n";
$compositePageString .= $contentString;
}
$contentString= $self->_getConstantDetailString(1);
if (length($contentString)) {
$compositePageString .= "<h2>Constants</h2>\n";
$compositePageString .= $contentString;
}
$contentString= $self->_getTypedefDetailString(1);
if (length($contentString)) {
$compositePageString .= "<h2>Typedefs</h2>\n";
$compositePageString .= $contentString;
}
$contentString= $self->_getStructDetailString(1);
if (length($contentString)) {
$compositePageString .= "<h2>Structs and Unions</h2>\n";
$compositePageString .= $contentString;
}
$contentString= $self->_getEnumDetailString(1);
if (length($contentString)) {
$compositePageString .= "<h2>Enumerations</h2>\n";
$compositePageString .= $contentString;
}
$contentString= $self->_getPDefineDetailString(1);
if (length($contentString)) {
$compositePageString .= "<h2>#defines</h2>\n";
$compositePageString .= $contentString;
}
return $compositePageString;
}
sub _getFunctionDetailString {
my $self = shift;
my $composite = shift;
my @funcObjs = $self->functions();
my $className = $self->name();
my $contentString;
$contentString = $self->_getFunctionEmbeddedTOC($composite);
my @tempobjs = ();
if ($HeaderDoc::sort_entries) {
@tempobjs = sort objName @funcObjs;
} else {
@tempobjs = @funcObjs;
}
foreach my $obj (@tempobjs) {
my $name = $obj->name();
my $desc = $obj->discussion();
my $throws = $obj->throws();
my $abstract = $obj->abstract();
my $availability = $obj->availability();
my $updated = $obj->updated();
my $declaration = $obj->declarationInHTML();
my $declarationRaw = $obj->declaration();
my $accessControl = $obj->accessControl();
my @params = $obj->taggedParameters();
my $result = $obj->result();
my $list_attributes = $obj->getAttributeLists($composite);
$contentString .= "<hr>";
my $methodType = $self->getMethodType($declarationRaw);
my $apiref = "";
$apiref = $obj->apiref($composite);
$contentString .= $apiref;
my $parentclass = $obj->origClass();
if (length($parentclass)) { $parentclass .= "::"; }
if ($self->CClass()) {
$parentclass = "";
}
$contentString .= "<table border=\"0\" cellpadding=\"2\" cellspacing=\"2\" width=\"300\">";
$contentString .= "<tr>";
$contentString .= "<td valign=\"top\" height=\"12\" colspan=\"5\">";
my $urlname = sanitize($name);
$contentString .= "<h2><a name=\"$urlname\">$parentclass$name</a></h2>\n";
$contentString .= "</td>";
$contentString .= "</tr></table>";
if (length($throws)) {
$contentString .= "<b>Throws:</b>\n$throws<BR>\n";
}
if (length($abstract)) {
$contentString .= "$abstract<BR>\n";
}
if (length($availability)) {
$contentString .= "<b>Availability:</b> $availability<BR>\n";
}
if (length($updated)) {
$contentString .= "<b>Updated:</b> $updated<BR>\n";
}
if (length($list_attributes)) {
$contentString .= $list_attributes;
}
$contentString .= "<blockquote><pre><tt>$accessControl</tt>\n<br>$declaration</pre></blockquote>\n";
if (length($desc)) {$contentString .= "<h5><font face=\"Lucida Grande,Helvetica,Arial\">Discussion</font></h5><p>$desc</p>\n"; }
my $arrayLength = @params;
if ($arrayLength > 0) {
my $paramContentString;
foreach my $element (@params) {
my $pName = $element->name();
my $pDesc = $element->discussion();
if (length ($pName)) {
$paramContentString .= "<dt><tt><em>$pName</em></tt></dt><dd>$pDesc</dd>\n";
}
}
if (length ($paramContentString)){
$contentString .= "<h5><font face=\"Lucida Grande,Helvetica,Arial\">Parameter Descriptions</font></h5>\n";
$contentString .= "<blockquote>\n";
$contentString .= "<dl>\n";
$contentString .= $paramContentString;
$contentString .= "</dl>\n</blockquote>\n";
}
}
if (length($result)) {
$contentString .= "<dl><dt><i>function result</i></dt><dd>$result</dd></dl>\n";
}
}
$contentString .= "<hr>\n";
return $contentString;
}
sub _getVarDetailString {
my $self = shift;
my $composite = shift;
my @varObjs = $self->vars();
my $contentString;
my @tempobjs = ();
if ($HeaderDoc::sort_entries) {
@tempobjs = sort objName @varObjs;
} else {
@tempobjs = @varObjs;
}
foreach my $obj (@tempobjs) {
my $name = $obj->name();
my $abstract = $obj->abstract();
my $availability = $obj->availability();
my $updated = $obj->updated();
my $desc = $obj->discussion();
my $declaration = $obj->declarationInHTML();
my $accessControl = $obj->accessControl();
my @fields = ();
my $fieldHeading;
if ($obj->can('fields')) { @fields = $obj->fields();
$fieldHeading = "Field Descriptions";
} elsif ($obj->can('constants')) { @fields = $obj->constants();
$fieldHeading = "Constants";
}
if ($obj->can('isFunctionPointer')) {
if ($obj->isFunctionPointer()) {
$fieldHeading = "Parameter Descriptions";
}
}
my $methodType = "data"; my $apiowner = $self->apiOwner();
my $headerObject = $apiowner->headerObject();
my $className = $self->name();
$contentString .= "<hr>";
my $apiref = $obj->apiref($composite); $contentString .= $apiref;
$contentString .= "<table border=\"0\" cellpadding=\"2\" cellspacing=\"2\" width=\"300\">";
$contentString .= "<tr>";
$contentString .= "<td valign=\"top\" height=\"12\" colspan=\"5\">";
my $urlname = sanitize($name);
$contentString .= "<h2><a name=\"$urlname\">$name</a></h2>\n";
$contentString .= "</td>";
$contentString .= "</tr></table>";
if (length($abstract)) {
$contentString .= "$abstract<BR>\n";
}
if (length($availability)) {
$contentString .= "<b>Availability:</b> $availability<BR>\n";
}
if (length($updated)) {
$contentString .= "<b>Updated:</b> $updated<BR>\n";
}
$contentString .= "<blockquote><tt>$accessControl</tt> $declaration</blockquote>\n";
if (length($desc)) {$contentString .= "<h5><font face=\"Lucida Grande,Helvetica,Arial\">Discussion</font></h5><p>$desc</p>\n"; }
my $arrayLength = @fields;
if ($arrayLength > 0) {
$contentString .= "<h5><font face=\"Lucida Grande,Helvetica,Arial\">$fieldHeading</font></h5>\n";
$contentString .= "<blockquote>\n";
$contentString .= "<dl>\n";
foreach my $element (@fields) {
my $fName = $element->name();
my $fDesc = $element->discussion();
$contentString .= "<dt><tt>$fName</tt></dt><dd>$fDesc</dd>\n";
}
$contentString .= "</dl>\n</blockquote>\n";
}
}
$contentString .= "<hr>\n";
return $contentString;
}
sub getMethodType {
my $self = shift;
my $declaration = shift;
my $methodType = "instm";
if ($declaration =~ /^\s*static/o) {
$methodType = "clm";
}
if ($self->sublang() eq "C") {
$methodType = "func";
}
return $methodType;
}
sub old_getParamSignature {
my $self = shift;
my $declaration = shift;
my $sig;
my @params;
$declaration =~ s/^[^(]+\(([^)]*)\).*/$1/o;
@params = split (/,/, $declaration);
foreach my $paramString (@params) {
my @paramElements = split (/\s+/, $paramString);
my $lastElement = pop @paramElements;
$sig .= join ("", @paramElements);
if ($lastElement =~ /^\*.*/o) {$sig .= "*";}; }
return $sig;
}
sub docNavigatorComment {
my $self = shift;
my $name = $self->name();
$name =~ s/;//sgo;
my $type = "cl";
if ($self->fields()) {
$type = "tmpl";
}
my $uid = $self->apiuid($type);
my $indexgroup = $self->indexgroup(); my $igstring = "";
if (length($indexgroup)) { $igstring = "indexgroup=$indexgroup;"; }
my $appleRef = "<a name=\"$uid\"></a>";
my $navComment = "<!-- headerDoc=cl; uid=$uid; $igstring name=$name-->";
return "$navComment\n$appleRef";
}
sub objName { my $obj1 = $a;
my $obj2 = $b;
return (lc($obj1->name()) cmp lc($obj2->name()));
}
sub byLinkage { my $obj1 = $a;
my $obj2 = $b;
return (lc($obj1->linkageState()) cmp lc($obj2->linkageState()));
}
sub byAccessControl { my $obj1 = $a;
my $obj2 = $b;
return (lc($obj1->accessControl()) cmp lc($obj2->accessControl()));
}
sub objGroup { my $obj1 = $a;
my $obj2 = $b;
return (lc($obj1->group()) cmp lc($obj2->group()));
}
sub linkageAndObjName { my $obj1 = $a;
my $obj2 = $b;
my $linkAndName1 = $obj1->linkageState() . $obj1->name();
my $linkAndName2 = $obj2->linkageState() . $obj2->name();
if ($HeaderDoc::sort_entries) {
return (lc($linkAndName1) cmp lc($linkAndName2));
} else {
return byLinkage($obj1, $obj2);
}
}
sub printObject {
my $self = shift;
$self->SUPER::printObject();
print "CPPClass\n";
print "\n";
}
1;