summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/doc/html/page/Index.scala
blob: bf531402ce340d9b397a492afe9ff335ef249e7b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* NSC -- new Scala compiler
 * Copyright 2007-2010 LAMP/EPFL
 * @author  David Bernard, Manohar Jonnalagedda
 */

package scala.tools.nsc
package doc
package html
package page

import model._

import scala.collection._
import scala.xml._

class Index(universe: Universe) extends HtmlPage {

  def path = List("allclasses.html")

  def title = {
    val s = universe.settings
    ( if (!s.doctitle.isDefault) s.doctitle.value else "" ) +
    ( if (!s.docversion.isDefault) (" " + s.docversion.value) else "" )
  }

  def headers =
    <xml:group>
      <link href={ relativeLinkTo(List("index.css", "lib")) }  media="screen" type="text/css" rel="stylesheet"/>
		  <script type="text/javascript" src={ relativeLinkTo{List("jquery.js", "lib")} }></script>
      <script type="text/javascript" src={ relativeLinkTo{List("scheduler.js", "lib")} }></script>
      <script type="text/javascript" src={ relativeLinkTo{List("index.js", "lib")} }></script>
    </xml:group>

  def body =
    <body>
      <div id="library">
        <img class='class icon' width="13" height="13" src='lib/class.png'/>
        <img class='trait icon' width="13" height="13" src='lib/trait.png'/>
        <img class='object icon' width="13" height="13" src='lib/object.png'/>
        <img class='package icon' width="13" height="13" src='lib/package.png'/>
      </div>
      <div id="browser">
        <div id="filter"></div>
        <div class="pack" id="tpl">{
          def isExcluded(dtpl: DocTemplateEntity) = {
            val qname = dtpl.qualifiedName
            ( ( qname.startsWith("scala.Tuple") || qname.startsWith("scala.Product") ||
                qname.startsWith("scala.Function") || qname.startsWith("scala.runtime.AbstractFunction")
              ) && !(
                qname == "scala.Tuple1" || qname == "scala.Tuple2" ||
                qname == "scala.Product" || qname == "scala.Product1" || qname == "scala.Product2" ||
                qname == "scala.Function" || qname == "scala.Function1" || qname == "scala.Function2" ||
                qname == "scala.runtime.AbstractFunction0" || qname == "scala.runtime.AbstractFunction1" ||
                qname == "scala.runtime.AbstractFunction2"
              )
            )
          }
          def packageElem(pack: model.Package): NodeSeq = {
            <xml:group>
              { if (!pack.isRootPackage)
                  <h3><a class="tplshow" href={ relativeLinkTo(pack) }>{ pack.qualifiedName }</a></h3>
                else NodeSeq.Empty
              }
              <ol class="templates">{
                val tpls: Map[String, Seq[DocTemplateEntity]] =
                  (pack.templates filter (t => !t.isPackage && !isExcluded(t) )) groupBy (_.name)

                val placeholderSeq: NodeSeq = <div class="placeholder"></div>

                def createLink(entity: DocTemplateEntity, includePlaceholder: Boolean, includeText: Boolean) = {
                	val entityType = docEntityKindToString(entity)
                	val linkContent = (
                		{ if (includePlaceholder) placeholderSeq else NodeSeq.Empty }
                		++
                		{ if (includeText) <span class="tplLink">{ Text(packageQualifiedName(entity)) }</span> else NodeSeq.Empty }
                	)
                	<a class="tplshow" href={ relativeLinkTo(entity) }><span class={ entityType }>({ Text(entityType) })</span>{ linkContent }</a>
                }

                for (tn <- tpls.keySet.toSeq sortBy (_.toLowerCase)) yield {
                	val entities = tpls(tn)
                	val row = (entities find (e => e.isPackage || e.isObject), entities find (e => e.isTrait || e.isClass))

                	val itemContents = row match {
              			case (Some(obj), None) => createLink(obj, includePlaceholder = true, includeText = true)

              			case (maybeObj, Some(template)) =>
              				val firstLink = maybeObj match {
              					case Some(obj) => createLink(obj, includePlaceholder = false, includeText = false)
              					case None => placeholderSeq
              				}

              				firstLink ++ createLink(template, includePlaceholder = false, includeText = true)

              			case _ => // FIXME: this default case should not be necessary. For some reason AnyRef is not a package, object, trait, or class
              				val entry = entities.head
              				placeholderSeq ++ createLink(entry, includePlaceholder = false, includeText = true)
               		}

                  <li title={ entities.head.qualifiedName }>{
                  	itemContents
                  }</li>
                }
              }</ol>
              <ol class="packages"> {
                for (sp <- pack.packages sortBy (_.name.toLowerCase)) yield
                  <li class="pack" title={ sp.qualifiedName }>{ packageElem(sp) }</li>
              }</ol>
            </xml:group>
          }
          packageElem(universe.rootPackage)
        }</div>
      </div>
    </body>


  def packageQualifiedName(ety: DocTemplateEntity): String =
    if (ety.inTemplate.isPackage) ety.name else (packageQualifiedName(ety.inTemplate) + "." + ety.name)

}