001/*-------------------------------------------------------------------------+
002|                                                                          |
003| Copyright 2005-2011 The ConQAT Project                                   |
004|                                                                          |
005| Licensed under the Apache License, Version 2.0 (the "License");          |
006| you may not use this file except in compliance with the License.         |
007| You may obtain a copy of the License at                                  |
008|                                                                          |
009|    http://www.apache.org/licenses/LICENSE-2.0                            |
010|                                                                          |
011| Unless required by applicable law or agreed to in writing, software      |
012| distributed under the License is distributed on an "AS IS" BASIS,        |
013| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
014| See the License for the specific language governing permissions and      |
015| limitations under the License.                                           |
016+-------------------------------------------------------------------------*/
017package org.conqat.engine.commons.css;
018
019import static org.conqat.lib.commons.color.ECCSMColor.DARK_GRAY;
020import static org.conqat.lib.commons.color.ECCSMColor.LIGHT_GRAY;
021import static org.conqat.lib.commons.html.ECSSProperty.BACKGROUND_COLOR;
022import static org.conqat.lib.commons.html.ECSSProperty.COLOR;
023import static org.conqat.lib.commons.html.ECSSProperty.CURSOR;
024import static org.conqat.lib.commons.html.ECSSProperty.DISPLAY;
025import static org.conqat.lib.commons.html.ECSSProperty.FILTER;
026import static org.conqat.lib.commons.html.ECSSProperty.FONT_FAMILY;
027import static org.conqat.lib.commons.html.ECSSProperty.FONT_SIZE;
028import static org.conqat.lib.commons.html.ECSSProperty.FONT_WEIGHT;
029import static org.conqat.lib.commons.html.ECSSProperty.MARGIN_RIGHT;
030import static org.conqat.lib.commons.html.ECSSProperty.OPACITY;
031import static org.conqat.lib.commons.html.ECSSProperty.PADDING_LEFT;
032import static org.conqat.lib.commons.html.ECSSProperty.PADDING_RIGHT;
033import static org.conqat.lib.commons.html.ECSSProperty.TEXT_ALIGN;
034import static org.conqat.lib.commons.html.ECSSProperty.TEXT_DECORATION;
035import static org.conqat.lib.commons.html.ECSSProperty.VERTICAL_ALIGN;
036import static org.conqat.lib.commons.html.ECSSProperty.WHITE_SPACE;
037import static org.conqat.lib.commons.html.ECSSProperty.WIDTH;
038import static org.conqat.lib.commons.html.EHTMLElement.A;
039import static org.conqat.lib.commons.html.EHTMLElement.IMG;
040
041import java.io.File;
042import java.io.IOException;
043import java.io.PrintStream;
044
045import org.conqat.engine.core.core.ConQATException;
046import org.conqat.lib.commons.color.ECCSMColor;
047import org.conqat.lib.commons.filesystem.FileSystemUtils;
048import org.conqat.lib.commons.html.CSSDeclarationBlock;
049import org.conqat.lib.commons.html.CSSManagerBase;
050import org.conqat.lib.commons.html.ECSSPseudoClass;
051
052/**
053 * The CSS manager used for ConQATDoc. This class defines a number of basic
054 * classes that should be reused in other places. Furthermore it sets the
055 * default styles for some HTML elments.
056 */
057public class CSSMananger extends CSSManagerBase {
058
059        /** Sans-serif font. */
060        public static final CSSDeclarationBlock SAN_SERIF_FONT = new CSSDeclarationBlock(FONT_FAMILY,
061                        "verdana, helvetica, sans-serif");
062
063        /** Default font. */
064        public static final CSSDeclarationBlock DEFAULT_FONT = new CSSDeclarationBlock(SAN_SERIF_FONT, FONT_SIZE, "13px");
065
066        /** Small font. */
067        public static final CSSDeclarationBlock SMALL_FONT = new CSSDeclarationBlock(SAN_SERIF_FONT, FONT_SIZE, "10px");
068
069        /** Bold font. */
070        public static final CSSDeclarationBlock DEFAULT_FONT_BOLD = new CSSDeclarationBlock(DEFAULT_FONT, FONT_WEIGHT,
071                        "bold");
072
073        /** Syntax highlighting style for comments */
074        public static final CSSDeclarationBlock COMMENT = new CSSDeclarationBlock(SMALL_FONT, COLOR, "green");
075
076        /** Syntax highlighting style for keywords */
077        public static final CSSDeclarationBlock KEYWORD = new CSSDeclarationBlock(SMALL_FONT, COLOR, "brown", FONT_WEIGHT,
078                        "bold");
079
080        /** Syntax highlighting style for literals */
081        public static final CSSDeclarationBlock LITERAL = new CSSDeclarationBlock(SMALL_FONT, COLOR, "blue");
082
083        /** Syntax highlighting style for changed gaps */
084        public static final CSSDeclarationBlock GAP_CHANGED = new CSSDeclarationBlock(BACKGROUND_COLOR, "yellow");
085
086        /** Syntax highlighting style for removed gaps */
087        public static final CSSDeclarationBlock GAP_REMOVED = new CSSDeclarationBlock(BACKGROUND_COLOR, "orange");
088
089        /** Syntax highlighting style for added gaps */
090        public static final CSSDeclarationBlock GAP_ADDED = new CSSDeclarationBlock(BACKGROUND_COLOR, "lightgreen");
091
092        /** Dark gray border. */
093        public static final CSSDeclarationBlock DARK_GRAY_BORDER = new CSSDeclarationBlock().setBorder("1px", "solid",
094                        DARK_GRAY.getHTMLColorCode());
095
096        /** Light blue border plus margin. */
097        public static final CSSDeclarationBlock IMAGE_STYLE = new CSSDeclarationBlock().setBorderStyle("none")
098                        .setMargin("8px");
099
100        /** Base class for table cells. */
101        private static final CSSDeclarationBlock TABLE_CELL_BASE = new CSSDeclarationBlock(SMALL_FONT, TEXT_ALIGN, "left")
102                        .setMargin("0px").setPadding("2px");
103
104        /** Default table header cell. */
105        public static final CSSDeclarationBlock TABLE_HEADER_CELL = new CSSDeclarationBlock(TABLE_CELL_BASE, COLOR, "white",
106                        BACKGROUND_COLOR, DARK_GRAY.getHTMLColorCode(), VERTICAL_ALIGN, "text-bottom", FONT_WEIGHT, "bold",
107                        WHITE_SPACE, "nowrap");
108
109        /** Default table cell. */
110        public static final CSSDeclarationBlock TABLE_CELL = new CSSDeclarationBlock(TABLE_CELL_BASE, BACKGROUND_COLOR,
111                        LIGHT_GRAY.getHTMLColorCode(), VERTICAL_ALIGN, "middle", WHITE_SPACE, "nowrap", WIDTH, "auto");
112
113        /** Wide table cell. */
114        public static final CSSDeclarationBlock WIDE_TABLE_CELL = new CSSDeclarationBlock(TABLE_CELL_BASE, BACKGROUND_COLOR,
115                        LIGHT_GRAY.getHTMLColorCode(), VERTICAL_ALIGN, "middle", WHITE_SPACE, "nowrap", WIDTH, "100%");
116
117        /** Additional styling for a table cell that contains an attribute. */
118        public static final CSSDeclarationBlock ATTRIBUTE_TABLE_CELL = new CSSDeclarationBlock(TABLE_CELL, PADDING_LEFT,
119                        "13px", PADDING_RIGHT, "25px");
120
121        /** Link in table. */
122        public static CSSDeclarationBlock TABLE_LINK = new CSSDeclarationBlock(SMALL_FONT, FONT_WEIGHT, "normal", COLOR,
123                        "black", TEXT_DECORATION, "none");
124
125        /** Link in table head. */
126        public static CSSDeclarationBlock TABLE_HEADER_LINK = new CSSDeclarationBlock(SMALL_FONT, FONT_WEIGHT, "bold",
127                        COLOR, "white", TEXT_DECORATION, "none");
128
129        /** Icon in table. */
130        public static CSSDeclarationBlock TABLE_ICON = new CSSDeclarationBlock(DISPLAY, "inline", VERTICAL_ALIGN, "middle",
131                        MARGIN_RIGHT, "6px");
132
133        /** Style for DIVs used in tool-tips. */
134        public static final CSSDeclarationBlock TOOL_TIP_DIV = new CSSDeclarationBlock(DARK_GRAY_BORDER, COLOR, "black",
135                        DISPLAY, "none", BACKGROUND_COLOR, LIGHT_GRAY.getHTMLColorCode(), OPACITY, "0.8", FILTER,
136                        "alpha(opacity = 80)");
137
138        /** Style for tool-tip captions. */
139        public static final CSSDeclarationBlock TOOL_TIP_CAPTION = new CSSDeclarationBlock(DARK_GRAY_BORDER, COLOR, "white",
140                        BACKGROUND_COLOR, DARK_GRAY.getHTMLColorCode()).inheritFrom(SMALL_FONT);
141
142        /** Style for tool-tip cells. */
143        public static final CSSDeclarationBlock TOOL_TIP_CELL = new CSSDeclarationBlock(SMALL_FONT, COLOR, "black",
144                        BACKGROUND_COLOR, LIGHT_GRAY.getHTMLColorCode());
145
146        /** Blue background. */
147        public static final CSSDeclarationBlock BLUE_BACKGROUND = new CSSDeclarationBlock(BACKGROUND_COLOR,
148                        ECCSMColor.BLUE.getHTMLColorCode(), COLOR, "white");
149
150        /** Light blue background. */
151        public static final CSSDeclarationBlock LIGHT_BLUE_BACKGROUND = new CSSDeclarationBlock(BACKGROUND_COLOR,
152                        ECCSMColor.LIGHT_BLUE.getHTMLColorCode());
153
154        /** White background. */
155        public static final CSSDeclarationBlock WHITE_BACKGROUND = new CSSDeclarationBlock(BACKGROUND_COLOR, "white");
156
157        /** Zero padding, zero margin. */
158        public static CSSDeclarationBlock DEFAULT_CONTAINER = new CSSDeclarationBlock(DEFAULT_FONT).setMargin("0px")
159                        .setPadding("0px");
160
161        /** CSS for inlined image. */
162        public static CSSDeclarationBlock INLINED_IMAGE = new CSSDeclarationBlock(DISPLAY, "inline", VERTICAL_ALIGN,
163                        "text-bottom");
164
165        /** CSS for link cursor. */
166        public static final CSSDeclarationBlock LINK_CURSOR = new CSSDeclarationBlock(CURSOR, "pointer");
167
168        /** Create and register all CSS blocks used. */
169        private CSSMananger() {
170                addDefaultDeclaration(IMG, new CSSDeclarationBlock().setBorderWidth("0px"));
171
172                addDefaultDeclaration(A, new CSSDeclarationBlock(DEFAULT_FONT, FONT_SIZE, "12px", FONT_WEIGHT, "600", COLOR,
173                                "black", TEXT_DECORATION, "none"));
174
175                addDefaultDeclaration(A, ECSSPseudoClass.HOVER, new CSSDeclarationBlock(TEXT_DECORATION, "underline"));
176
177        }
178
179        /** The singleton instance. */
180        private static CSSMananger instance;
181
182        /** Get singleton instance. */
183        public static CSSMananger getInstance() {
184                if (instance == null) {
185                        instance = new CSSMananger();
186                }
187                return instance;
188        }
189
190        /**
191         * Write style file to disk.
192         * 
193         * @throws ConQATException
194         *             if style file could not be written.
195         */
196        public void write(File outputDirectory) throws ConQATException {
197                File file = new File(outputDirectory, "css/style.css");
198                try {
199                        FileSystemUtils.ensureParentDirectoryExists(file);
200                        PrintStream stream = new PrintStream(file);
201                        writeOut(stream);
202                        stream.close();
203                } catch (IOException ex) {
204                        throw new ConQATException("Could not write style file: " + file);
205                }
206
207        }
208
209        /** Write out declarations. This exposes the super class method. */
210        @Override
211        public void writeOutDeclarations(PrintStream stream) {
212                super.writeOutDeclarations(stream);
213        }
214
215        /**
216         * Write out default declarations for element (i.e. without specific class).
217         * This exposes the super class method.
218         */
219        @Override
220        public void writeOutDefaultDeclarations(PrintStream stream) {
221                super.writeOutDefaultDeclarations(stream);
222        }
223}