public class DefaultTimelineObjectRenderer extends JPanel implements ITimelineObjectRenderer
Due to the fact that this renderer uses several Java2D features it is not the fastest one that can be written. Less fancy renderers should be even faster. Applications that need to render larger volumes of timeline objects should consider writing their own and slimmed down version of a timeline object renderer.
LayerContainer.setTimelineObjectRenderer(Class, ITimelineObjectRenderer)
,
Serialized FormJPanel.AccessibleJPanel
JComponent.AccessibleJComponent
Container.AccessibleAWTContainer
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy
listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW
accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
Constructor and Description |
---|
DefaultTimelineObjectRenderer()
Constructs a new renderer.
|
Modifier and Type | Method and Description |
---|---|
void |
firePropertyChange(String propertyName,
boolean oldValue,
boolean newValue)
Overriden for performance reasons.
|
void |
firePropertyChange(String propertyName,
byte oldValue,
byte newValue)
Overriden for performance reasons.
|
void |
firePropertyChange(String propertyName,
char oldValue,
char newValue)
Overriden for performance reasons.
|
void |
firePropertyChange(String propertyName,
double oldValue,
double newValue)
Overriden for performance reasons.
|
void |
firePropertyChange(String propertyName,
float oldValue,
float newValue)
Overriden for performance reasons.
|
void |
firePropertyChange(String propertyName,
long oldValue,
long newValue)
Overriden for performance reasons.
|
protected void |
firePropertyChange(String propertyName,
Object oldValue,
Object newValue)
Overriden for performance reasons.
|
void |
firePropertyChange(String propertyName,
short oldValue,
short newValue)
Overriden for performance reasons.
|
Color |
getActivityFillColor1()
Returns the first color that will be used for filling the background of
the timeline object with a gradient paint.
|
Color |
getActivityFillColor2()
Returns the second color that will be used for filling the background of
the timeline object with a gradient paint.
|
Color |
getActivityLineColor()
Returns the line color that will be used for drawing the border of a
timeline object if it is an activity (different start and end times).
|
int |
getBarHeight()
Returns the height that will be used for the bar that will represent an
activity timeline object.
|
int |
getDiamondSize()
Returns the size of the event diamons.
|
Color |
getEventFillColor1()
Returns the first color that will be used for filling the background of
the timeline object with a gradient paint in situations where the object
is an event (same start and end time).
|
Color |
getEventFillColor2()
Returns the second color that will be used for filling the background of
the timeline object with a gradient paint in situations where the object
is an event (same start and end time).
|
Color |
getEventLineColor()
Returns the line color that will be used for drawing the border of a
timeline object in situations where the object is an event (same start
and end time).
|
Color |
getFocusFillColor1()
Returns the first color that will be used for filling the background of
the timeline object with a gradient paint in situations where the object
has the focus.
|
Color |
getFocusFillColor2()
Returns the second color that will be used for filling the background of
the timeline object with a gradient paint in situations where the object
has the focus.
|
Color |
getFocusLineColor()
Returns the line color that will be used for drawing the border of a
timeline object in situations where the object has the focus.
|
Color |
getHighlightFillColor1()
Returns the first color that will be used for filling the background of
the timeline object with a gradient paint in situations where the object
is highlighted.
|
Color |
getHighlightFillColor2()
Returns the second color that will be used for filling the background of
the timeline object with a gradient paint in situations where the object
is highlighted.
|
Color |
getHighlightLineColor()
Returns the line color that will be used for drawing the border of a
timeline object in situations where the object is highlighted.
|
protected IGanttChartModel |
getModel()
Returns the model that provided the currently rendered timeline object.
|
protected Object |
getNode()
Returns the hierarchy (tree) node of the row in which the currently
rendered timeline object is located.
|
Color |
getParentFillColor1()
Returns the first background color used for those timeline objects that
are parent timeline objects (own children timeline objects).
|
Color |
getParentFillColor2()
Returns the second background color used for those timeline objects that
are parent timeline objects (own children timeline objects).
|
Color |
getParentLineColor()
Returns the line color used for those timeline objects that are parent
timeline objects (own children timeline objects).
|
Color |
getPastFillColor1()
Returns the first color used for filling the background of an activity
when the activity is located in the past (earlier than time now).
|
Color |
getPastFillColor2()
Returns the second color used for filling the background of an activity
when the activity is located in the past (earlier than time now).
|
Color |
getResizeHandleColor()
Returns the color used for the resize handles.
|
Color |
getSelectionFillColor1()
Returns the first color that will be used for filling the background of
the timeline object with a gradient paint in situations where the object
is selected.
|
Color |
getSelectionFillColor2()
Returns the second color that will be used for filling the background of
the timeline object with a gradient paint in situations where the object
is selected.
|
Color |
getSelectionLineColor()
Sets the line color that will be used for drawing the border of a
timeline object in situations where the object is selected.
|
protected Object |
getTimelineObject()
Returns the timeline object that is currently being rendered.
|
protected TimelineObjectLayer |
getTimelineObjectLayer()
Returns the timeline object layer where the current rendering operation
takes place.
|
protected TimelineObjectPath |
getTimelineObjectPath()
Returns the path to the currently rendered timeline object.
|
Component |
getTimelineObjectRendererComponent(TimelineObjectLayer layer,
TimelineObjectPath path,
boolean selected,
boolean hasFocus,
boolean highlighted,
int row)
Returns a component that will be used to renderer the given timeline
object.
|
Insets |
getTimelineObjectRendererInsets(int x,
int y,
int width,
int height)
Returns the insets of the object renderer.
|
boolean |
hasFocus()
Determines whether the currently painted timeline object has the focus or
not.
|
void |
invalidate()
Overriden for performance reasons.
|
protected boolean |
isDurationChangeable()
Checks the
IEditTimelineObjectPolicy to see if the duration of
the currently rendered timeline object can be changed. |
protected boolean |
isEvent()
Determines whether the currently rendered timeline object represents an
event.
|
boolean |
isGlossy()
Determines if the bar will be drawn with a glossy effect.
|
boolean |
isHighlighted()
Determines whether the timeline object should be rendered in its
highlighted state or not.
|
boolean |
isParent()
Determines whether the currently rendered timeline object is a parent
timeline object, meaning that it contains children timeline objects (also
called summary timeline object, compound timeline object).
|
boolean |
isRoundedCorners()
Determines whether the bars of activity timeline objects will be drawn
with rounded corners or not.
|
protected boolean |
isSelected()
Determines if the rendered timeline object is currently selected.
|
protected boolean |
isStartTimeChangeable()
Checks the
IEditTimelineObjectPolicy to see if the start time of
the currently rendered timeline object can be changed. |
boolean |
isVisible()
Overriden in order to fix a bug in AWT, which causes the cursor to
flicker during drag and drop operations.
|
boolean |
isVisualizingPastTime()
Determines whether the renderer will draw the timeline object differently
if the object is located in the past (e.g.
|
protected void |
paintActivityBorder(Graphics g)
Paints the border of the activity object.
|
protected void |
paintActivityContent(Graphics g)
Renders the timeline object if it is an activity (different start and end
time = duration).
|
protected void |
paintActivityFocus(Graphics g)
Adds visual feedback to an activity if it owns the focus.
|
protected void |
paintComponent(Graphics g) |
protected void |
paintEvent(Graphics g)
Renders the timeline object if it is an event (same start and end time).
|
protected void |
paintParent(Graphics g)
Renders the timeline object if it is a parent timeline object, meaning
that it contains child timeline objects.
|
void |
repaint()
Overriden for performance reasons.
|
void |
repaint(int x,
int y,
int width,
int height)
Overriden for performance reasons.
|
void |
repaint(long tm)
Overriden for performance reasons.
|
void |
revalidate()
Overriden for performance reasons.
|
void |
setActivityFillColor1(Color color)
Sets the first color that will be used for filling the background of the
timeline object with a gradient paint.
|
void |
setActivityFillColor2(Color color)
Sets the second color that will be used for filling the background of the
timeline object with a gradient paint.
|
void |
setActivityLineColor(Color color)
Sets the line color that will be used for drawing the border of a
timeline object if it is an activity (different start and end times).
|
void |
setBarHeight(int height)
Sets the height that will be used for the bar that will represent an
activity timeline object.
|
void |
setDiamondSize(int size)
Sets the size of the event diamonds.
|
void |
setEventFillColor1(Color color)
Sets the first color that will be used for filling the background of the
timeline object with a gradient paint in situations where the object is
an event (same start and end time).
|
void |
setEventFillColor2(Color color)
Sets the second color that will be used for filling the background of the
timeline object with a gradient paint in situations where the object is
an event (same start and end time).
|
void |
setEventLineColor(Color color)
Sets the line color that will be used for drawing the border of a
timeline object in situations where the object is an event (same start
and end time).
|
void |
setFocusFillColor1(Color color)
Sets the first color that will be used for filling the background of the
timeline object with a gradient paint in situations where the object has
the focus.
|
void |
setFocusFillColor2(Color color)
Sets the second color that will be used for filling the background of the
timeline object with a gradient paint in situations where the object has
the focus.
|
void |
setFocusLineColor(Color color)
Sets the line color that will be used for drawing the border of a
timeline object in situations where the object has the focus.
|
void |
setGlossy(boolean glossy)
Specifies if the bar will be drawn with a glossy effect.
|
void |
setHighlightFillColor1(Color color)
Sets the first color that will be used for filling the background of the
timeline object with a gradient paint in situations where the object is
highlighted.
|
void |
setHighlightFillColor2(Color color)
Sets the second color that will be used for filling the background of the
timeline object with a gradient paint in situations where the object is
highlighted.
|
void |
setHighlightLineColor(Color color)
Sets the line color that will be used for drawing the border of a
timeline object in situations where the object is highlighted.
|
void |
setParentFillColor1(Color color)
Sets the first background color used for those timeline objects that are
parent timeline objects (own children timeline objects).
|
void |
setParentFillColor2(Color color)
Sets the second background color used for those timeline objects that are
parent timeline objects (own children timeline objects).
|
void |
setParentLineColor(Color color)
Sets the line color used for those timeline objects that are parent
timeline objects (own children timeline objects).
|
void |
setPastFillColor1(Color color)
Sets the first color used for filling the background of an activity when
the activity is located in the past (earlier than time now).
|
void |
setPastFillColor2(Color color)
Sets the second color used for filling the background of an activity when
the activity is located in the past (earlier than time now).
|
void |
setResizeHandleColor(Color color)
Sets the color used for the resize handles.
|
void |
setRoundedCorners(boolean b)
Specifies whether the bars of activity timeline objects will be drawn
with rounded corners or not.
|
void |
setSelectionFillColor1(Color color)
Sets the first color that will be used for filling the background of the
timeline object with a gradient paint in situations where the object is
selected.
|
void |
setSelectionFillColor2(Color color)
Sets the second color that will be used for filling the background of the
timeline object with a gradient paint in situations where the object is
selected.
|
void |
setSelectionLineColor(Color color)
Sets the line color that will be used for drawing the border of a
timeline object in situations where the object is selected.
|
void |
setVisualizingPastTime(boolean b)
Specifies whether the renderer will draw the timeline object differently
if the object is located in the past (e.g.
|
void |
validate()
Overriden for performance reasons.
|
getAccessibleContext, getUI, getUIClassID, paramString, setUI, updateUI
addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, hide, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingForPrint, isPaintingOrigin, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paint, paintBorder, paintChildren, paintImmediately, paintImmediately, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setEnabled, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update
add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validateTree
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
public DefaultTimelineObjectRenderer()
public Component getTimelineObjectRendererComponent(TimelineObjectLayer layer, TimelineObjectPath path, boolean selected, boolean hasFocus, boolean highlighted, int row)
ITimelineObjectRenderer
getTimelineObjectRendererComponent
in interface ITimelineObjectRenderer
layer
- the layer in which the timeline object will be renderedpath
- the path to the timeline object that gets renderedselected
- if TRUE the object is currently selected and the rendering
needs to express thathasFocus
- if TRUE the focus is currently on the timeline object and the
rendering needs to express thathighlighted
- if TRUE the timeline object is highlighted and its appearance
needs to vary from its normal appearance (causing a blinking
effect)row
- the row in which the object gets drawnpublic Insets getTimelineObjectRendererInsets(int x, int y, int width, int height)
ITimelineObjectRenderer
DefaultActivityObjectRenderer
).getTimelineObjectRendererInsets
in interface ITimelineObjectRenderer
x
- the x-coordinate of the bounds that will be assigned to the
renderer componenty
- the y-coordinate of the bounds that will be assigned to the
renderer componentwidth
- the width of the bounds that will be assigned to the renderer
componentheight
- the height of the bounds that will be assigned to the renderer
componentprotected void paintComponent(Graphics g)
paintComponent
in class JComponent
protected void paintParent(Graphics g)
g
- the graphics context into which to drawprotected void paintActivityFocus(Graphics g)
g
- the graphics context into which to drawprotected void paintEvent(Graphics g)
g
- the graphics context into which to drawprotected void paintActivityContent(Graphics g)
g
- the graphics context into which to drawpaintActivityBorder(Graphics)
protected void paintActivityBorder(Graphics g)
g
- the graphics context into which to drawsetRoundedCorners(boolean)
public void setGlossy(boolean glossy)
glossy
- if TRUE the bar will appear glossypublic boolean isGlossy()
public int getBarHeight()
public void setBarHeight(int height)
height
- the height of the barpublic Color getActivityFillColor1()
public void setActivityFillColor1(Color color)
color
- the first fill color for the gradient backgroundpublic Color getActivityFillColor2()
public void setActivityFillColor2(Color color)
color
- the second fill color for the gradient backgroundpublic Color getFocusFillColor1()
public void setFocusFillColor1(Color color)
color
- the first fill color for the gradient background of focused
timeline objectspublic Color getFocusFillColor2()
public void setFocusFillColor2(Color color)
color
- the second fill color for the gradient background of focused
timeline objectspublic Color getFocusLineColor()
public void setFocusLineColor(Color color)
color
- the line color for the focused timeline objectpublic Color getHighlightFillColor1()
public void setHighlightFillColor1(Color color)
color
- the first fill color for the gradient background of
highlighted timeline objectspublic Color getHighlightFillColor2()
public void setHighlightFillColor2(Color color)
color
- the second fill color for the gradient background of
highlighted timeline objectspublic Color getHighlightLineColor()
public void setHighlightLineColor(Color color)
color
- the line color for the highlighted timeline objectpublic Color getActivityLineColor()
public void setActivityLineColor(Color color)
color
- the line color for the activity timeline objectpublic Color getSelectionFillColor1()
public void setSelectionFillColor1(Color color)
color
- the first fill color for the gradient background of selected
timeline objectspublic Color getSelectionFillColor2()
public void setSelectionFillColor2(Color color)
color
- the second fill color for the gradient background of selected
timeline objectspublic Color getSelectionLineColor()
public void setSelectionLineColor(Color color)
color
- the line color for the highlighted timeline objectpublic Color getEventFillColor1()
public void setEventFillColor1(Color color)
color
- the first fill color for the gradient background of timeline
objects that are eventspublic Color getEventFillColor2()
public void setEventFillColor2(Color color)
color
- the second fill color for the gradient background of timeline
objects that are eventspublic void setEventLineColor(Color color)
color
- the line color for the event timeline objectpublic Color getEventLineColor()
protected boolean isEvent()
public boolean isParent()
public boolean hasFocus()
isFocused()
but the user could get confused with
the hasFocus()
method of the superclass.protected TimelineObjectLayer getTimelineObjectLayer()
protected IGanttChartModel getModel()
protected Object getNode()
protected Object getTimelineObject()
protected boolean isSelected()
public boolean isHighlighted()
LayerContainer
. This thread runs whenever at least one timeline
object is highlighted.LayerContainer.addHighlightedObjects(java.util.Collection)
,
LayerContainer.isHighlighted(com.dlsc.flexgantt.model.gantt.TimelineObjectPath)
public boolean isVisualizingPastTime()
public void setVisualizingPastTime(boolean b)
b
- TRUE timeline objects located in the past will be drawn in a
different waypublic boolean isRoundedCorners()
public void setRoundedCorners(boolean b)
b
- if TRUE the activity bars will feature rounded cornerspublic Color getResizeHandleColor()
public void setResizeHandleColor(Color color)
color
- the handle colorpublic int getDiamondSize()
public void setDiamondSize(int size)
size
- the diamond sizepublic Color getParentFillColor1()
IGanttChartModel.isParentTimelineObject(Object)
public void setParentFillColor1(Color color)
color
- the first parent background colorIGanttChartModel.isParentTimelineObject(Object)
public Color getParentFillColor2()
IGanttChartModel.isParentTimelineObject(Object)
public void setParentFillColor2(Color color)
color
- the second parent background colorIGanttChartModel.isParentTimelineObject(Object)
public Color getParentLineColor()
IGanttChartModel.isParentTimelineObject(Object)
public void setParentLineColor(Color color)
color
- the parent line colorIGanttChartModel.isParentTimelineObject(Object)
public Color getPastFillColor1()
public void setPastFillColor1(Color color)
color
- the first background color for past activitiespublic Color getPastFillColor2()
public void setPastFillColor2(Color color)
color
- the second background color for past activitiesprotected boolean isStartTimeChangeable()
IEditTimelineObjectPolicy
to see if the start time of
the currently rendered timeline object can be changed. This is important
to know when drawing resize handles. These can only be added on the left
edge of the eventline object when its duration AND its start time can be
changed.protected boolean isDurationChangeable()
IEditTimelineObjectPolicy
to see if the duration of
the currently rendered timeline object can be changed. This is important
to know when drawing resize handles.protected TimelineObjectPath getTimelineObjectPath()
public void validate()
public void invalidate()
invalidate
in class Container
public void revalidate()
revalidate
in class JComponent
public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue)
firePropertyChange
in class JComponent
public void firePropertyChange(String propertyName, byte oldValue, byte newValue)
firePropertyChange
in class Component
public void firePropertyChange(String propertyName, char oldValue, char newValue)
firePropertyChange
in class JComponent
public void firePropertyChange(String propertyName, double oldValue, double newValue)
firePropertyChange
in class Component
public void firePropertyChange(String propertyName, float oldValue, float newValue)
firePropertyChange
in class Component
public void firePropertyChange(String propertyName, long oldValue, long newValue)
firePropertyChange
in class Component
protected void firePropertyChange(String propertyName, Object oldValue, Object newValue)
firePropertyChange
in class Component
public void firePropertyChange(String propertyName, short oldValue, short newValue)
firePropertyChange
in class Component
public void repaint()
public void repaint(int x, int y, int width, int height)
public void repaint(long tm)
Copyright © 2006–2016 Dirk Lemmermann Software & Consulting. All rights reserved.