blob: 407963f507d78f77e0aaa515585014440a498b07 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.codeEditor.printing;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.JDOMUtil;
import com.intellij.util.containers.HashMap;
import org.jdom.Document;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
class PageSizes {
private static final Logger LOG = Logger.getInstance("#com.intellij.codeEditor.printing.PageSizes");
private static ArrayList myPageSizes = null;
private static HashMap myNamesToPageSizes = null;
private static final double MM_TO_INCH = 1/25.4;
@NonNls private static final String PAGE_SIZES_RESOURCE = "/PageSizes.xml";
@NonNls private static final String ELEMENT_SIZE = "size";
@NonNls private static final String ATTRIBUTE_NAME = "name";
@NonNls private static final String ATTRIBUTE_WIDTH = "width";
@NonNls private static final String ATTRIBUTE_HEIGHT = "height";
@NonNls private static final String ATTRIBUTE_UNIT = "unit";
@NonNls private static final String UNIT_MM = "mm";
public static String[] getNames() {
init();
String[] ret = new String[myPageSizes.size()];
for(int i = 0; i < myPageSizes.size(); i++) {
PageSize pageSize = (PageSize)myPageSizes.get(i);
ret[i] = pageSize.name;
}
return ret;
}
public static Object getItem(String name) {
init();
return myNamesToPageSizes.get(name);
}
public static double getWidth(String name) {
init();
PageSize pageSize = (PageSize)myNamesToPageSizes.get(name);
if(pageSize == null) {
return 0;
}
return pageSize.width;
}
public static double getHeight(String name) {
init();
PageSize pageSize = (PageSize)myNamesToPageSizes.get(name);
if(pageSize == null) {
return 0;
}
return pageSize.height;
}
public static String getName(Object item) {
init();
if(!(item instanceof PageSize)) {
return null;
}
PageSize pageSize = (PageSize)item;
return pageSize.name;
}
private static void addPageSizeIn(String name, String dimensions, double width, double height) {
PageSize pageSize = new PageSize();
pageSize.name = name;
pageSize.visualName = name + " (" + dimensions + ")";
pageSize.width = width;
pageSize.height = height;
myPageSizes.add(pageSize);
myNamesToPageSizes.put(pageSize.name, pageSize);
}
private static void init() {
if(myPageSizes != null) {
return;
}
myPageSizes = new ArrayList();
myNamesToPageSizes = new HashMap();
try {
final Document document = JDOMUtil.loadDocument(PageSizes.class.getResourceAsStream(PAGE_SIZES_RESOURCE));
final List elements = document.getRootElement().getChildren(ELEMENT_SIZE);
for (Iterator iterator = elements.iterator(); iterator.hasNext();) {
final Element element = (Element) iterator.next();
String name = element.getAttributeValue(ATTRIBUTE_NAME);
final String widthStr = element.getAttributeValue(ATTRIBUTE_WIDTH);
final String heightStr = element.getAttributeValue(ATTRIBUTE_HEIGHT);
String unit = element.getAttributeValue(ATTRIBUTE_UNIT);
final String unitName = unit.equals(UNIT_MM)
? CodeEditorBundle.message("print.page.size.unit.mm")
: CodeEditorBundle.message("print.page.size.unit.in");
final String dimensions = CodeEditorBundle.message("print.page.width.x.height.unit.template",
widthStr, heightStr, unitName);
double width = parsePageSize(widthStr);
double height = parsePageSize(heightStr);
if (unit.equals(UNIT_MM)) {
width *= MM_TO_INCH;
height *= MM_TO_INCH;
}
addPageSizeIn(name, dimensions, width, height);
}
}
catch (Exception e) {
LOG.error(e);
}
}
private static double parsePageSize(final String sizeStr) {
int slashPos = sizeStr.indexOf('/');
if (slashPos >= 0) {
int spacePos = sizeStr.indexOf(' ');
int intPart = Integer.valueOf(sizeStr.substring(0, spacePos));
double numerator = Double.valueOf(sizeStr.substring(spacePos+1, slashPos));
double denominator = Double.valueOf(sizeStr.substring(slashPos+1));
return intPart + numerator / denominator;
}
return Integer.valueOf(sizeStr);
}
private static class PageSize {
public double width;
public double height;
public String name;
public String visualName;
public String toString() {
return visualName;
}
}
}