blob: 97b3f52147c678c8f92024596a6c3346c4e37495 [file] [log] [blame]
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You 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 org.apache.poi.sl.draw;
import static org.apache.poi.sl.draw.Drawable.DRAW_FACTORY;
import java.awt.Graphics2D;
import java.awt.font.TextLayout;
import java.text.AttributedString;
import org.apache.poi.sl.usermodel.*;
public class DrawFactory {
protected static ThreadLocal<DrawFactory> defaultFactory = new ThreadLocal<DrawFactory>();
/**
* Set a custom draw factory for the current thread.
* This is a fallback, for operations where usercode can't set a graphics context.
* Preferably use the rendering hint {@link Drawable#DRAW_FACTORY} to set the factory.
*
* @param factory
*/
public static void setDefaultFactory(DrawFactory factory) {
defaultFactory.set(factory);
}
public static DrawFactory getInstance(Graphics2D graphics) {
// first try to find the factory over the rendering hint
DrawFactory factory = null;
boolean isHint = false;
if (graphics != null) {
factory = (DrawFactory)graphics.getRenderingHint(DRAW_FACTORY);
isHint = (factory != null);
}
// secondly try the thread local default
if (factory == null) {
factory = defaultFactory.get();
}
// and at last, use the default factory
if (factory == null) {
factory = new DrawFactory();
}
if (graphics != null && !isHint) {
graphics.setRenderingHint(DRAW_FACTORY, factory);
}
return factory;
}
@SuppressWarnings("unchecked")
public Drawable getDrawable(Shape shape) {
if (shape instanceof TextBox) {
return getDrawable((TextBox<? extends TextParagraph<? extends TextRun>>)shape);
} else if (shape instanceof FreeformShape) {
return getDrawable((FreeformShape<? extends TextParagraph<? extends TextRun>>)shape);
} else if (shape instanceof TextShape) {
return getDrawable((TextShape<? extends TextParagraph<? extends TextRun>>)shape);
} else if (shape instanceof GroupShape) {
return getDrawable((GroupShape<? extends Shape>)shape);
} else if (shape instanceof PictureShape) {
return getDrawable((PictureShape)shape);
} else if (shape instanceof Background) {
return getDrawable((Background)shape);
} else if (shape instanceof ConnectorShape) {
return getDrawable((ConnectorShape)shape);
} else if (shape instanceof TableShape) {
return getDrawable((TableShape)shape);
} else if (shape instanceof Slide) {
return getDrawable((Slide<? extends Shape, ? extends SlideShow, ? extends Notes<?,?>>)shape);
} else if (shape instanceof MasterSheet) {
return getDrawable((MasterSheet<? extends Shape, ? extends SlideShow>)shape);
} else if (shape instanceof Sheet) {
return getDrawable((Sheet<? extends Shape, ? extends SlideShow>)shape);
}
throw new IllegalArgumentException("Unsupported shape type: "+shape.getClass());
}
public <T extends Slide<? extends Shape, ? extends SlideShow, ? extends Notes<?,?>>> DrawSlide<T> getDrawable(T sheet) {
return new DrawSlide<T>(sheet);
}
public <T extends Sheet<? extends Shape, ? extends SlideShow>> DrawSheet<T> getDrawable(T sheet) {
return new DrawSheet<T>(sheet);
}
public <T extends MasterSheet<? extends Shape, ? extends SlideShow>> DrawMasterSheet<T> getDrawable(T sheet) {
return new DrawMasterSheet<T>(sheet);
}
public <T extends TextBox<? extends TextParagraph<?>>> DrawTextBox<T> getDrawable(T shape) {
return new DrawTextBox<T>(shape);
}
public <T extends FreeformShape<? extends TextParagraph<? extends TextRun>>> DrawFreeformShape<T> getDrawable(T shape) {
return new DrawFreeformShape<T>(shape);
}
public <T extends ConnectorShape> DrawConnectorShape<T> getDrawable(T shape) {
return new DrawConnectorShape<T>(shape);
}
public <T extends TableShape> DrawTableShape<T> getDrawable(T shape) {
return new DrawTableShape<T>(shape);
}
public <T extends TextShape<? extends TextParagraph<? extends TextRun>>> DrawTextShape<T> getDrawable(T shape) {
return new DrawTextShape<T>(shape);
}
public <T extends GroupShape<? extends Shape>> DrawGroupShape<T> getDrawable(T shape) {
return new DrawGroupShape<T>(shape);
}
public <T extends PictureShape> DrawPictureShape<T> getDrawable(T shape) {
return new DrawPictureShape<T>(shape);
}
public <T extends TextRun> DrawTextParagraph<T> getDrawable(TextParagraph<T> paragraph) {
return new DrawTextParagraph<T>(paragraph);
}
public <T extends Background> DrawBackground<T> getDrawable(T shape) {
return new DrawBackground<T>(shape);
}
public DrawTextFragment getTextFragment(TextLayout layout, AttributedString str) {
return new DrawTextFragment(layout, str);
}
public DrawPaint getPaint(PlaceableShape shape) {
return new DrawPaint(shape);
}
}