org.jhotdraw.draw
Class DefaultDrawingView
- java.lang.Object
-
- java.awt.Component
-
- java.awt.Container
-
- javax.swing.JComponent
-
- org.jhotdraw.draw.DefaultDrawingView
-
- All Implemented Interfaces:
- java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, DrawingView, EditableComponent
public class DefaultDrawingView extends javax.swing.JComponent implements DrawingView, EditableComponent
A default implementation ofDrawingViewsuited for viewing drawings with a small number of figures. FIXME - Implement clone Method. FIXME - Use double buffering for the drawing to improve performance.- See Also:
- Serialized Form
-
-
Nested Class Summary
-
Field Summary
Fields Modifier and Type Field and Description static java.lang.StringDRAWING_DOUBLE_BUFFERED_PROPERTY-
Fields inherited from class javax.swing.JComponent
TOOL_TIP_TEXT_KEY, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW
-
Fields inherited from class java.awt.Component
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
-
Fields inherited from interface org.jhotdraw.draw.DrawingView
ACTIVE_HANDLE_PROPERTY, CONSTRAINER_PROPERTY, CONSTRAINER_VISIBLE_PROPERTY, CURSOR_PROPERTY, DRAWING_PROPERTY, ENABLED_PROPERTY, HANDLE_DETAIL_LEVEL_PROPERTY, INVISIBLE_CONSTRAINER_PROPERTY, SCALE_FACTOR_PROPERTY, VISIBLE_CONSTRAINER_PROPERTY
-
Fields inherited from interface org.jhotdraw.gui.EditableComponent
SELECTION_EMPTY_PROPERTY
-
-
Constructor Summary
Constructors Constructor and Description DefaultDrawingView()Creates new instance.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method and Description voidaddFigureSelectionListener(FigureSelectionListener fsl)Add a listener for selection changes in this DrawingView.voidaddNotify(DrawingEditor editor)Informs the view that it has been added to the specified editor.voidaddToSelection(java.util.Collection<Figure> figures)Adds a collection of figures to the current selection.voidaddToSelection(Figure figure)Adds a figure to the current selection.voidclearSelection()Clears the current selection.voiddelete()Deletes the selected components or the component at (or after) the caret position.java.awt.PointdrawingToView(java.awt.geom.Point2D.Double p)Converts drawing coordinates to view coordinates.java.awt.RectangledrawingToView(java.awt.geom.Rectangle2D.Double r)Converts drawing coordinates to view coordinates.voidduplicate()Duplicates the selected region.FigurefindFigure(java.awt.Point p)Finds a figure at a given coordinates.java.util.Collection<Figure>findFigures(java.awt.Rectangle r)Returns all figures that lie within or intersect the specified bounds.java.util.Collection<Figure>findFiguresWithin(java.awt.Rectangle r)Returns all figures that lie within the specified bounds.HandlefindHandle(java.awt.Point p)Finds a handle at a given coordinates.HandlegetActiveHandle()Gets the active handle.java.util.Collection<Handle>getCompatibleHandles(Handle master)Gets compatible handles.javax.swing.JComponentgetComponent()Returns the JComponent of the drawing view.ConstrainergetConstrainer()Gets the current constrainer of this view.DrawinggetDrawing()Gets the drawing.java.awt.geom.AffineTransformgetDrawingToViewTransform()Gets an transform which can be used to convert drawing coordinates to view coordinates.DrawingEditorgetEditor()Gets the drawing editor associated to the DrawingView.java.lang.StringgetEmptyDrawingMessage()intgetHandleDetailLevel()Returns the detail level of the handles.ConstrainergetInvisibleConstrainer()Gets the editor's constrainer for this view, for use, when the visible constrainer is turned off.java.awt.DimensiongetPreferredSize()doublegetScaleFactor()Gets the scale factor of the drawing view.java.util.Set<Figure>getSelectedFigures()Gets the current selection as a FigureSelection.intgetSelectionCount()Gets the number of selected figures.java.lang.StringgetToolTipText(java.awt.event.MouseEvent evt)ConstrainergetVisibleConstrainer()Gets the editor's constrainer for this view, for use, when the visible constrainer is turned on.voidinvalidate()booleanisConstrainerVisible()Returns true, if the visible Constrainer is in use, returns false, if the invisible Constrainer is in use.booleanisDrawingDoubleBuffered()Returns true, if the the drawing is double buffered.booleanisFigureSelected(Figure checkFigure)Test whether a given figure is selected.booleanisSelectionEmpty()Returns true if the selection is empty.voidpaint(java.awt.Graphics g)voidpaintComponent(java.awt.Graphics gr)Paints the drawing view.voidprintComponent(java.awt.Graphics gr)Prints the drawing view.voidremoveFigureSelectionListener(FigureSelectionListener fsl)Remove a listener for selection changes in this DrawingView.voidremoveFromSelection(Figure figure)Removes a figure from the selection.voidremoveNotify()voidremoveNotify(DrawingEditor editor)Informs the view that it has been removed from the specified editor.voidrepaintHandles()Repaints the handles of the view.voidselectAll()Selects all selectable figures.voidsetActiveHandle(Handle newValue)Sets the active handle.voidsetBounds(int x, int y, int width, int height)Side effect: Changes view Translation.voidsetConstrainerVisible(boolean newValue)Changes between a visible Constrainer and an invisible Constrainer.voidsetDrawing(Drawing newValue)Sets and installs another drawing in the view.voidsetDrawingDoubleBuffered(boolean newValue)Sets whether the drawing is double buffered.voidsetEmptyDrawingMessage(java.lang.String newValue)voidsetEnabled(boolean b)Sets the enabled state of the drawing view.voidsetHandleDetailLevel(int newValue)The detail level of the handles.voidsetInvisibleConstrainer(Constrainer newValue)Sets the editor's constrainer for this view, for use, when the visible constrainer is turned off.voidsetScaleFactor(double newValue)Sets the scale factor of the drawing view.voidsetVisibleConstrainer(Constrainer newValue)Sets the editor's constrainer for this view, for use, when the visible constrainer is turned on.voidtoggleSelection(Figure figure)If a figure isn't selected it is added to the selection.java.awt.geom.Point2D.DoubleviewToDrawing(java.awt.Point p)Converts view coordinates to drawing coordinates.java.awt.geom.Rectangle2D.DoubleviewToDrawing(java.awt.Rectangle r)Converts view coordinates to drawing coordinates.-
Methods inherited from class javax.swing.JComponent
addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getTopLevelAncestor, getTransferHandler, getUIClassID, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, hide, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingForPrint, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paintImmediately, paintImmediately, print, printAll, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update, updateUI
-
Methods inherited from class java.awt.Container
add, add, add, add, add, addContainerListener, 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, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
-
Methods inherited from class java.awt.Component
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getAccessibleContext, 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, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, resize, resize, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
-
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.jhotdraw.draw.DrawingView
addKeyListener, addMouseListener, addMouseMotionListener, addPropertyChangeListener, isEnabled, removeKeyListener, removeMouseListener, removeMouseMotionListener, removePropertyChangeListener, requestFocus, setCursor
-
Methods inherited from interface org.jhotdraw.gui.EditableComponent
addPropertyChangeListener, removePropertyChangeListener
-
-
-
-
Field Detail
-
DRAWING_DOUBLE_BUFFERED_PROPERTY
public static final java.lang.String DRAWING_DOUBLE_BUFFERED_PROPERTY
- See Also:
- Constant Field Values
-
-
Method Detail
-
repaintHandles
public void repaintHandles()
Description copied from interface:DrawingViewRepaints the handles of the view.- Specified by:
repaintHandlesin interfaceDrawingView
-
isSelectionEmpty
public boolean isSelectionEmpty()
Description copied from interface:EditableComponentReturns true if the selection is empty. This is a bound property.- Specified by:
isSelectionEmptyin interfaceEditableComponent
-
getDrawing
@Nullable public Drawing getDrawing()
Description copied from interface:DrawingViewGets the drawing. This is a bound property.- Specified by:
getDrawingin interfaceDrawingView
-
getToolTipText
public java.lang.String getToolTipText(java.awt.event.MouseEvent evt)
- Overrides:
getToolTipTextin classjavax.swing.JComponent
-
setEmptyDrawingMessage
public void setEmptyDrawingMessage(java.lang.String newValue)
-
getEmptyDrawingMessage
public java.lang.String getEmptyDrawingMessage()
-
paintComponent
public void paintComponent(java.awt.Graphics gr)
Paints the drawing view. Uses rendering hints for fast painting. Paints the canvasColor, the grid, the drawing, the handles and the current tool.- Overrides:
paintComponentin classjavax.swing.JComponent
-
printComponent
public void printComponent(java.awt.Graphics gr)
Prints the drawing view. Uses high quality rendering hints for printing. Only prints the drawing. Doesn't print the canvasColor, the grid, the handles and the tool.- Overrides:
printComponentin classjavax.swing.JComponent
-
setDrawing
public void setDrawing(@Nullable Drawing newValue)
Description copied from interface:DrawingViewSets and installs another drawing in the view. This is a bound property.- Specified by:
setDrawingin interfaceDrawingView
-
paint
public void paint(java.awt.Graphics g)
- Overrides:
paintin classjavax.swing.JComponent
-
invalidate
public void invalidate()
- Overrides:
invalidatein classjava.awt.Container
-
removeNotify
public void removeNotify()
- Overrides:
removeNotifyin classjavax.swing.JComponent
-
addToSelection
public void addToSelection(Figure figure)
Adds a figure to the current selection.- Specified by:
addToSelectionin interfaceDrawingView
-
addToSelection
public void addToSelection(java.util.Collection<Figure> figures)
Adds a collection of figures to the current selection.- Specified by:
addToSelectionin interfaceDrawingView
-
removeFromSelection
public void removeFromSelection(Figure figure)
Removes a figure from the selection.- Specified by:
removeFromSelectionin interfaceDrawingView
-
toggleSelection
public void toggleSelection(Figure figure)
If a figure isn't selected it is added to the selection. Otherwise it is removed from the selection.- Specified by:
toggleSelectionin interfaceDrawingView
-
setEnabled
public void setEnabled(boolean b)
Description copied from interface:DrawingViewSets the enabled state of the drawing view. This is a bound property.- Specified by:
setEnabledin interfaceDrawingView- Overrides:
setEnabledin classjavax.swing.JComponent
-
selectAll
public void selectAll()
Selects all selectable figures.- Specified by:
selectAllin interfaceDrawingView- Specified by:
selectAllin interfaceEditableComponent
-
clearSelection
public void clearSelection()
Clears the current selection.- Specified by:
clearSelectionin interfaceDrawingView- Specified by:
clearSelectionin interfaceEditableComponent
-
isFigureSelected
public boolean isFigureSelected(Figure checkFigure)
Test whether a given figure is selected.- Specified by:
isFigureSelectedin interfaceDrawingView
-
getSelectedFigures
public java.util.Set<Figure> getSelectedFigures()
Gets the current selection as a FigureSelection. A FigureSelection can be cut, copied, pasted.- Specified by:
getSelectedFiguresin interfaceDrawingView
-
getSelectionCount
public int getSelectionCount()
Gets the number of selected figures.- Specified by:
getSelectionCountin interfaceDrawingView
-
findHandle
public Handle findHandle(java.awt.Point p)
Finds a handle at a given coordinates.- Specified by:
findHandlein interfaceDrawingView- Returns:
- A handle, null if no handle is found.
-
getCompatibleHandles
public java.util.Collection<Handle> getCompatibleHandles(Handle master)
Gets compatible handles.- Specified by:
getCompatibleHandlesin interfaceDrawingView- Returns:
- A collection containing the handle and all compatible handles.
-
findFigure
public Figure findFigure(java.awt.Point p)
Finds a figure at a given coordinates.- Specified by:
findFigurein interfaceDrawingView- Returns:
- A figure, null if no figure is found.
-
findFigures
public java.util.Collection<Figure> findFigures(java.awt.Rectangle r)
Description copied from interface:DrawingViewReturns all figures that lie within or intersect the specified bounds. The figures are returned in Z-order from back to front.- Specified by:
findFiguresin interfaceDrawingView
-
findFiguresWithin
public java.util.Collection<Figure> findFiguresWithin(java.awt.Rectangle r)
Description copied from interface:DrawingViewReturns all figures that lie within the specified bounds. The figures are returned in Z-order from back to front.- Specified by:
findFiguresWithinin interfaceDrawingView
-
addFigureSelectionListener
public void addFigureSelectionListener(FigureSelectionListener fsl)
Description copied from interface:DrawingViewAdd a listener for selection changes in this DrawingView.- Specified by:
addFigureSelectionListenerin interfaceDrawingView- Parameters:
fsl- jhotdraw.framework.FigureSelectionListener
-
removeFigureSelectionListener
public void removeFigureSelectionListener(FigureSelectionListener fsl)
Description copied from interface:DrawingViewRemove a listener for selection changes in this DrawingView.- Specified by:
removeFigureSelectionListenerin interfaceDrawingView- Parameters:
fsl- jhotdraw.framework.FigureSelectionListener
-
getConstrainer
public Constrainer getConstrainer()
Description copied from interface:DrawingViewGets the current constrainer of this view. If isConstrainerVisible is true, this method returns getVisibleConstrainer, otherwise it returns getInvisibleConstrainer. This is a bound property.- Specified by:
getConstrainerin interfaceDrawingView
-
getPreferredSize
public java.awt.Dimension getPreferredSize()
- Overrides:
getPreferredSizein classjavax.swing.JComponent
-
setBounds
public void setBounds(int x, int y, int width, int height)Side effect: Changes view Translation.- Overrides:
setBoundsin classjava.awt.Component
-
drawingToView
public java.awt.Point drawingToView(java.awt.geom.Point2D.Double p)
Converts drawing coordinates to view coordinates.- Specified by:
drawingToViewin interfaceDrawingView
-
drawingToView
public java.awt.Rectangle drawingToView(java.awt.geom.Rectangle2D.Double r)
Description copied from interface:DrawingViewConverts drawing coordinates to view coordinates.- Specified by:
drawingToViewin interfaceDrawingView
-
viewToDrawing
public java.awt.geom.Point2D.Double viewToDrawing(java.awt.Point p)
Converts view coordinates to drawing coordinates.- Specified by:
viewToDrawingin interfaceDrawingView
-
viewToDrawing
public java.awt.geom.Rectangle2D.Double viewToDrawing(java.awt.Rectangle r)
Description copied from interface:DrawingViewConverts view coordinates to drawing coordinates.- Specified by:
viewToDrawingin interfaceDrawingView
-
getComponent
public javax.swing.JComponent getComponent()
Description copied from interface:DrawingViewReturns the JComponent of the drawing view.- Specified by:
getComponentin interfaceDrawingView
-
getScaleFactor
public double getScaleFactor()
Description copied from interface:DrawingViewGets the scale factor of the drawing view. This is a bound property.- Specified by:
getScaleFactorin interfaceDrawingView
-
setScaleFactor
public void setScaleFactor(double newValue)
Description copied from interface:DrawingViewSets the scale factor of the drawing view. This is a bound property.- Specified by:
setScaleFactorin interfaceDrawingView
-
setHandleDetailLevel
public void setHandleDetailLevel(int newValue)
Description copied from interface:DrawingViewThe detail level of the handles. This is a bound property.- Specified by:
setHandleDetailLevelin interfaceDrawingView
-
getHandleDetailLevel
public int getHandleDetailLevel()
Description copied from interface:DrawingViewReturns the detail level of the handles. This is a bound property.- Specified by:
getHandleDetailLevelin interfaceDrawingView
-
getDrawingToViewTransform
public java.awt.geom.AffineTransform getDrawingToViewTransform()
Description copied from interface:DrawingViewGets an transform which can be used to convert drawing coordinates to view coordinates.- Specified by:
getDrawingToViewTransformin interfaceDrawingView
-
delete
public void delete()
Description copied from interface:EditableComponentDeletes the selected components or the component at (or after) the caret position.- Specified by:
deletein interfaceEditableComponent
-
duplicate
public void duplicate()
Description copied from interface:EditableComponentDuplicates the selected region.- Specified by:
duplicatein interfaceEditableComponent
-
removeNotify
public void removeNotify(DrawingEditor editor)
Description copied from interface:DrawingViewInforms the view that it has been removed from the specified editor. The view must not draw the tool from the editor anymore.- Specified by:
removeNotifyin interfaceDrawingView
-
addNotify
public void addNotify(DrawingEditor editor)
Description copied from interface:DrawingViewInforms the view that it has been added to the specified editor. The view must draw the tool of the editor, if getActiveView() of the editor returns the view.- Specified by:
addNotifyin interfaceDrawingView
-
setVisibleConstrainer
public void setVisibleConstrainer(Constrainer newValue)
Description copied from interface:DrawingViewSets the editor's constrainer for this view, for use, when the visible constrainer is turned on. This is a bound property.- Specified by:
setVisibleConstrainerin interfaceDrawingView
-
getVisibleConstrainer
public Constrainer getVisibleConstrainer()
Description copied from interface:DrawingViewGets the editor's constrainer for this view, for use, when the visible constrainer is turned on. This is a bound property.- Specified by:
getVisibleConstrainerin interfaceDrawingView
-
setInvisibleConstrainer
public void setInvisibleConstrainer(Constrainer newValue)
Description copied from interface:DrawingViewSets the editor's constrainer for this view, for use, when the visible constrainer is turned off. This is a bound property.- Specified by:
setInvisibleConstrainerin interfaceDrawingView
-
getInvisibleConstrainer
public Constrainer getInvisibleConstrainer()
Description copied from interface:DrawingViewGets the editor's constrainer for this view, for use, when the visible constrainer is turned off. This is a bound property.- Specified by:
getInvisibleConstrainerin interfaceDrawingView
-
setConstrainerVisible
public void setConstrainerVisible(boolean newValue)
Description copied from interface:DrawingViewChanges between a visible Constrainer and an invisible Constrainer. This is a bound property.- Specified by:
setConstrainerVisiblein interfaceDrawingView
-
isConstrainerVisible
public boolean isConstrainerVisible()
Description copied from interface:DrawingViewReturns true, if the visible Constrainer is in use, returns false, if the invisible Constrainer is in use. This is a bound property.- Specified by:
isConstrainerVisiblein interfaceDrawingView
-
setDrawingDoubleBuffered
public void setDrawingDoubleBuffered(boolean newValue)
Sets whether the drawing is double buffered.The default value is true.
This is a bound property.
If the drawing view is used for editing, you should leave this to true. If the drawing view is used for viewing only, you should set this to false.
-
isDrawingDoubleBuffered
public boolean isDrawingDoubleBuffered()
Returns true, if the the drawing is double buffered.
-
getEditor
public DrawingEditor getEditor()
Description copied from interface:DrawingViewGets the drawing editor associated to the DrawingView. This is a bound property.- Specified by:
getEditorin interfaceDrawingView
-
setActiveHandle
public void setActiveHandle(@Nullable Handle newValue)
Description copied from interface:DrawingViewSets the active handle.- Specified by:
setActiveHandlein interfaceDrawingView
-
getActiveHandle
public Handle getActiveHandle()
Description copied from interface:DrawingViewGets the active handle.- Specified by:
getActiveHandlein interfaceDrawingView
-
-
DataMelt 3.0 © DataMelt by jWork.ORG