001    /*
002     * Copyright 1997-2004 Sun Microsystems, Inc.  All Rights Reserved.
003     * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004     *
005     * This code is free software; you can redistribute it and/or modify it
006     * under the terms of the GNU General Public License version 2 only, as
007     * published by the Free Software Foundation.  Sun designates this
008     * particular file as subject to the "Classpath" exception as provided
009     * by Sun in the LICENSE file that accompanied this code.
010     *
011     * This code is distributed in the hope that it will be useful, but WITHOUT
012     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013     * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
014     * version 2 for more details (a copy is included in the LICENSE file that
015     * accompanied this code).
016     *
017     * You should have received a copy of the GNU General Public License version
018     * 2 along with this work; if not, write to the Free Software Foundation,
019     * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020     *
021     * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022     * CA 95054 USA or visit www.sun.com if you need additional information or
023     * have any questions.
024     */
025    
026    package com.sun.tools.doclets.formats.html;
027    
028    import com.sun.tools.doclets.internal.toolkit.util.*;
029    import java.io.*;
030    
031    /**
032     * Generate the documentation in the Html "frame" format in the browser. The
033     * generated documentation will have two or three frames depending upon the
034     * number of packages on the command line. In general there will be three frames
035     * in the output, a left-hand top frame will have a list of all packages with
036     * links to target left-hand bottom frame. The left-hand bottom frame will have
037     * the particular package contents or the all-classes list, where as the single
038     * right-hand frame will have overview or package summary or class file. Also
039     * take care of browsers which do not support Html frames.
040     *
041     * @author Atul M Dambalkar
042     */
043    public class FrameOutputWriter extends HtmlDocletWriter {
044    
045        /**
046         * Number of packages specified on the command line.
047         */
048        int noOfPackages;
049    
050        /**
051         * Constructor to construct FrameOutputWriter object.
052         *
053         * @param filename File to be generated.
054         */
055        public FrameOutputWriter(ConfigurationImpl configuration,
056                                 String filename) throws IOException {
057            super(configuration, filename);
058        noOfPackages = configuration.packages.length;
059        }
060    
061        /**
062         * Construct FrameOutputWriter object and then use it to generate the Html
063         * file which will have the description of all the frames in the
064         * documentation. The name of the generated file is "index.html" which is
065         * the default first file for Html documents.
066         * @throws DocletAbortException
067         */
068        public static void generate(ConfigurationImpl configuration) {
069            FrameOutputWriter framegen;
070            String filename = "";
071            try {
072                filename = "index.html";
073                framegen = new FrameOutputWriter(configuration, filename);
074                framegen.generateFrameFile();
075                framegen.close();
076            } catch (IOException exc) {
077                configuration.standardmessage.error(
078                            "doclet.exception_encountered",
079                            exc.toString(), filename);
080                throw new DocletAbortException();
081            }
082        }
083    
084        /**
085         * Generate the contants in the "index.html" file. Print the frame details
086         * as well as warning if browser is not supporting the Html frames.
087         */
088        protected void generateFrameFile() {
089            if (configuration.windowtitle.length() > 0) {
090                printFramesetHeader(configuration.windowtitle, configuration.notimestamp);
091            } else {
092                printFramesetHeader(configuration.getText("doclet.Generated_Docs_Untitled"),
093                                    configuration.notimestamp);
094            }
095            printFrameDetails();
096            printFrameFooter();
097        }
098    
099        /**
100         * Generate the code for issueing the warning for a non-frame capable web
101         * client. Also provide links to the non-frame version documentation.
102         */
103        protected void printFrameWarning() {
104            noFrames();
105            h2();
106            printText("doclet.Frame_Alert");
107            h2End();
108            p();
109            printText("doclet.Frame_Warning_Message");
110            br();
111            printText("doclet.Link_To");
112            printHyperLink(configuration.topFile,
113                configuration.getText("doclet.Non_Frame_Version"));
114            println("");
115            noFramesEnd();
116        }
117    
118        /**
119         * Print the frame sizes and their contents.
120         */
121        protected void printFrameDetails() {
122            // title attribute intentionally made empty so
123            // 508 tests will not flag it as missing
124            frameSet("cols=\"20%,80%\" title=\"\" onLoad=\"top.loadFrames()\"");
125            if (noOfPackages <= 1) {
126                printAllClassesFrameTag();
127            } else if (noOfPackages > 1) {
128                frameSet("rows=\"30%,70%\" title=\"\" onLoad=\"top.loadFrames()\"");
129                printAllPackagesFrameTag();
130                printAllClassesFrameTag();
131                frameSetEnd();
132            }
133            printClassFrameTag();
134            printFrameWarning();
135            frameSetEnd();
136        }
137    
138        /**
139         * Print the FRAME tag for the frame that lists all packages
140         */
141        private void printAllPackagesFrameTag() {
142            frame("src=\"overview-frame.html\" name=\"packageListFrame\""
143                + " title=\"" + configuration.getText("doclet.All_Packages") + "\"");
144        }
145    
146        /**
147         * Print the FRAME tag for the frame that lists all classes
148         */
149        private void printAllClassesFrameTag() {
150            frame("src=\"" + "allclasses-frame.html" + "\""
151                + " name=\"packageFrame\""
152                + " title=\"" + configuration.getText("doclet.All_classes_and_interfaces")
153                + "\"");
154        }
155    
156        /**
157         * Print the FRAME tag for the frame that describes the class in detail
158         */
159        private void printClassFrameTag() {
160            frame("src=\"" + configuration.topFile + "\""
161                + " name=\"classFrame\""
162                + " title=\""
163                + configuration.getText("doclet.Package_class_and_interface_descriptions")
164                + "\" scrolling=\"yes\"");
165        }
166    
167    }