| Constructor: |
EditableFigureComponent(EditableFigure ef,
DisplayFigure of,
Config cf) {
setOpaque(true);
setDoubleBuffered(true);
fig = ef;
outlineFig = of;
config(cf);
cf.addObserver(this);
if ( i18n == null ) {
i18n = ResourceBundle.getBundle("net.phbwt.jtans.i18n.main");
}
// changement de taille
this.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
if ( DEBUG ) {
System.out.println("taille");
}
setScale(refScale);
offImg = null;
// marque
foundMarkShapeScaled = null; // � recr�er
foundMarkStroke = new BasicStroke(((float) getWidth()) / 150f,
BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND);
repaint(); // sinon pb. � la diparition de la statusbar
}
});
// click
this.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
traitShape.setLine(rotOriginX, rotOriginY, rotOriginX, rotOriginY);
refreshSelectedPiece();
actualMode = MODE_NONE;
if (!isFound && fig.getCalcFigure().compare(outlineFig.getCalcFigure(),
compareAccuracy)) {
isFound = true;
unselect();
repaint(); // dessine la marque
firePropertyChange(PROPERTY_FOUND, false, true);
}
}
public void mousePressed(MouseEvent e) {
// d�j� trouv�
if (isFound) return;
int x = e.getX();
int y = e.getY();
int sel = fig.selectAt( x, y);
if ( sel == EditableFigure.SEL_NONE &&
isSelected &&
(e.getModifiers() & InputEvent.BUTTON1_MASK) != 0 ) {
// passage en mode rotation
// System.out.println("mode rot");
actualMode = MODE_ROTATION;
rotOriginX = fig.getSelectedPiece().getPosX();
rotOriginY = fig.getSelectedPiece().getPosY();
rotOriginAngle = fig.getSelectedPiece().getRotation();
rotRefAngle = Math.atan2(x - rotOriginX, y - rotOriginY);
// System.out.println("mode rot:orig=" + rotOriginAngle + ":ref=" + rotRefAngle);
traitShape.setLine(rotOriginX, rotOriginY, x, y);
refreshSelectedPiece();
}
if ( sel != EditableFigure.SEL_NONE ) {
// click dans une piece
// System.out.println("mode move");
actualMode = MODE_MOVE;
if ( sel == EditableFigure.SEL_NEW || !isSelected ) {
// selection d'une nouvelle piece (ou de l'ancienne si non selectionn�e)
boolean oldSel = isSelected;
isSelected = true;
// refreshAll();
redrawOffscreenImage(true);
repaint();
firePropertyChange(PROPERTY_SELECTION, oldSel, true);
}
}
if ( ( e.getClickCount() == 2 ||
(e.getModifiers() & InputEvent.BUTTON3_MASK) != 0 )
&& isSelected ) {
fig.flipSelectedPiece();
refreshSelectedPiece();
}
lastX = x;
lastY = y;
}
});
// drag
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
switch ( actualMode) {
case MODE_MOVE:
Point p = fig.translateSelectedPiece(e.getX() - lastX, e.getY() - lastY);
lastX += p.x;
lastY += p.y;
refreshSelectedPiece();
break;
case MODE_ROTATION:
double angle = rotOriginAngle -
rotRefAngle +
Math.atan2(e.getX() - rotOriginX, e.getY() - rotOriginY);
// System.out.println("angle=" + angle);
fig.setRotationForSelectedPiece(angle);
lastX = e.getX();
lastY = e.getY();
traitShape.setLine(rotOriginX, rotOriginY, lastX, lastY);
refreshSelectedPiece();
break;
}
}
});
}
Parameters:
ef - La figure affich�e.
of - La figure outlin�e.
li - l'Observer notifi� lorsque la solution est trouv�e
|
| Methods from javax.swing.JComponent: |
|---|
|
_paintImmediately, addAncestorListener, addNotify, addVetoableChangeListener, alwaysOnTop, checkIfChildObscuredBySibling, clientPropertyChanged, compWriteObjectNotify, componentInputMapChanged, computeVisibleRect, computeVisibleRect, contains, createToolTip, disable, dndDone, dropLocationForPoint, enable, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getAccessibleContext, getActionForKeyStroke, getActionMap, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getCreatedDoubleBuffer, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getGraphicsInvoked, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getManagingFocusBackwardTraversalKeys, getManagingFocusForwardTraversalKeys, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getUIClassID, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getWriteObjCounter, getX, getY, grabFocus, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPainting, isPaintingForPrint, isPaintingOrigin, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paint, paintBorder, paintChildren, paintComponent, paintForceDoubleBuffered, paintImmediately, paintImmediately, paintToOffscreen, paramString, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyBindings, processKeyBindingsForAllComponents, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, rectangleIsObscured, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, safelyGetGraphics, safelyGetGraphics, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setCreatedDoubleBuffer, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setDropLocation, setEnabled, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPaintingChild, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setUIProperty, setVerifyInputWhenFocusTarget, setVisible, setWriteObjCounter, shouldDebugGraphics, superProcessMouseMotionEvent, unregisterKeyboardAction, update, updateUI |
| Methods from java.awt.Component: |
|---|
|
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, addNotify, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, deliverEvent, disable, disableEvents, dispatchEvent, dispatchEventImpl, doLayout, enable, enable, enableEvents, enableInputMethods, eventTypeEnabled, findNextFocusComponent, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, generateName, getAccessibleContext, getAlignmentX, getAlignmentY, getBackground, getBounds, getBounds, getColorModel, getComponentAt, getComponentAt, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeys, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphics, getGraphicsConfiguration, getGraphicsConfigurationImpl, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getListeners, getLocale, getLocation, getLocation, getLocationOnScreen, getMaximumSize, getMinimumSize, getMouseListeners, getMouseMotionListeners, getMouseWheelListeners, getName, getParent, getPeer, getPreferredSize, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getToolkit, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, hide, imageUpdate, inside, invalidate, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusCycleRoot, isFocusOwner, isFocusTraversable, isFocusable, isFontSet, isForegroundSet, isLightweight, isOpaque, isShowing, isValid, isVisible, keyDown, keyUp, layout, list, list, list, list, list, locate, location, lostFocus, minimumSize, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paint, paintAll, paramString, postEvent, preferredSize, prepareImage, prepareImage, print, printAll, processComponentEvent, processEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removeNotify, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, reshape, resize, resize, setBackground, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setEnabled, setFocusTraversalKeys, setFocusTraversalKeysEnabled, setFocusable, setFont, setForeground, setIgnoreRepaint, setLocale, setLocation, setLocation, setName, setPeer, setSize, setSize, setVisible, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle, translateEvent, update, validate |
| Method from net.phbwt.jtans.guimain.EditableFigureComponent Detail: |
public void flip() {
if (! isFound) {
fig.flipSelectedPiece();
refreshSelectedPiece();
}
}
Flippe la piece.
Appelle refreshSelectedPiece(). |
protected final Graphics getComponentGraphics(Graphics g) {
((Graphics2D) g).addRenderingHints(hints);
// ((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC));
// ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION,
// RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED);
return g;
}
|
public final void paintComponent(Graphics g) {
// partie graphique de la configuration (si n�cessaire)
if ( !gfxIsConfigured ) {
configGfx();
}
Graphics2D g2 = (Graphics2D)g;
Stroke oldStroke = g2.getStroke();
Composite oldComposite = null; // utilis� si le composite est modifi�
// cr�e et dessine le buffer
if ( offImg == null ) {
redrawOffscreenImage(false);
}
// le fond et les shapes non selectionn�es
g2.drawImage(offImg, compBorderLeft, compBorderTop, this);
// le trait de rotation
if ( actualMode == MODE_ROTATION ) {
// dessin du trait
g2.setPaint(traitPaint);
g2.setStroke(traitStroke);
g2.draw(traitShape);
if ( traitLastBounds == null ) {
traitLastBounds = new Rectangle();
}
// recopie le contenu (pas la r�f�rence)
traitLastBounds.setBounds(traitShape.getBounds());
traitLastBounds.grow(traitGrow, traitGrow); // en gros moiti� de la largeur du trait
}
// dessin de la shape selectionn�e
if ( isSelected ) {
g2.setPaint(selectedFigurePaint);
if ( selectedFigureComposite != null ) {
oldComposite = g2.getComposite();
g2.setComposite(selectedFigureComposite);
}
} else {
g2.setPaint(unselectedFiguresPaint);
}
g2.fill(fig.getSelectedPiece());
g2.setPaint(borderPaint);
g2.setStroke(borderStroke);
g2.draw(fig.getSelectedPiece());
// pour effacement de l'ancienne pi�ce
if ( selectedPieceLastBounds == null ) {
selectedPieceLastBounds = new Rectangle();
}
// recopie le contenu (pas la r�f�rence)
selectedPieceLastBounds.setBounds(fig.getSelectedPiece().getBounds());
selectedPieceLastBounds.grow(borderGrow, borderGrow); // moiti� de la largeur du trait
// marque
if ( isFound ) {
long time = System.currentTimeMillis();
// (re)cr�e la forme
if (foundMarkShapeScaled == null) {
foundMarkShapeScaled = createFoundMarkShape(g2);
}
if (oldComposite == null) {
oldComposite = g2.getComposite();
}
g2.setComposite(foundMarkComposite);
g2.setPaint(Color.white);
g2.fill(foundMarkShapeScaled);
g2.setStroke(foundMarkStroke);
g2.setPaint(Color.black);
g2.draw(foundMarkShapeScaled);
if (DEBUG) {
time = System.currentTimeMillis() - time; // *debug*
System.out.println("redraw foundMark :" + time);
}
}
// restaure l'�tat de d�part
g2.setStroke(oldStroke);
if (oldComposite != null) {
g2.setComposite(oldComposite);
}
}
|
protected void redrawOffscreenImage(boolean fast) {
if ( DEBUG ) {
System.out.println("offscreenImage redessine");
}
if ( offImg == null ) {
if ( DEBUG ) {
System.out.println("offscreenImage recree");
}
Insets in = getInsets();
compBorderLeft = in.left;
compBorderTop = in.top;
int w = getWidth() - in.left - in.right;
int h = getHeight() - in.top - in.bottom;
offImg = (BufferedImage)createImage(w, h);
offImgGr = (Graphics2D)offImg.createGraphics();
offImgGr.translate(-compBorderLeft, -compBorderTop);
// fig.setRefX(-compBorderLeft, -compBorderTop);
// offImgGr.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC));
// offImgGr.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION,
// RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED);
// valeur par d�faut �cras�es
offImgGr.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_OFF);
offImgGr.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING,
RenderingHints.VALUE_COLOR_RENDER_SPEED);
offImgGr.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
offImgGr.setRenderingHint(RenderingHints.KEY_DITHERING,
RenderingHints.VALUE_DITHER_DISABLE);
offImgGr.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
offImgGr.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_SPEED);
offImgGr.addRenderingHints(hints);
offImgW = w;
offImgH = h;
fast = false;
}
long time = System.currentTimeMillis(); // *debug*
if ( fast && fig.getPreviousSelectedPiece() != null ) {
Rectangle rect = fig.getPreviousSelectedPiece().getBounds()
.union(fig.getSelectedPiece().getBounds());
rect.grow(traitGrow, traitGrow);
offImgGr.setClip(rect);
} else {
offImgGr.setClip(null);
}
// le fond
offImgGr.setPaint(bgPaint);
offImgGr.fill(new Rectangle(compBorderLeft, compBorderTop, offImgW, offImgH));
// l'outline
if ( withOutline ) {
offImgGr.setPaint(outlinePaint);
offImgGr.setStroke(outlineStroke);
for ( Iterator i = outlineFig.outlineIterator(); i.hasNext(); ) {
offImgGr.draw((PixelOutlinePolygon) i.next());
}
}
// les shapes non s�lectionn�es
for ( Iterator i = fig.pieceIteratorBottomUp(); i.hasNext();) {
Shape s = (Shape)i.next();
offImgGr.setPaint(unselectedFiguresPaint);
offImgGr.fill(s);
offImgGr.setPaint(borderPaint);
offImgGr.setStroke(borderStroke);
offImgGr.draw(s);
}
// // les tiny triangles
// offImgGr.setPaint(Color.red);
// TinyTab tt = fig.calcFig.getFigureTinyTab();
// for ( int i = 0; i < tt.ntriangles; i++ ) {
// int x = (int)(tt.xtriangles[i] * fig.scale) + fig.refX;
// int y = (int)(tt.ytriangles[i] * fig.scale) + fig.refY;
// offImgGr.drawLine(x, y, x + 1, y + 1);
// }
// // la shape selectionn�e
// offImgGr.setPaint(selectedFigurePaint);
// offImgGr.fill(fig.shapes[CalcFigure.PIECE_SELECTED]);
if ( DEBUG ) {
time = System.currentTimeMillis() - time; // *debug*
System.out.println("duree redraw=" + time + ":clipping=" + offImgGr.getClip());
}
}
Red�ssine le buffer apr�s l'avoir cr�� si n�cessaire.
Dessine le fond, l'outline, les pi�ces no selectionn�es. |
public void refreshAll() {
if ( !gfxIsConfigured ) {
configGfx();
}
redrawOffscreenImage(false);
this.repaint();
}
|
public void refreshSelectedPiece() {
if ( actualMode == MODE_ROTATION ) {
// red�ssine le fond sous le trait de rotation
if ( traitLastBounds != null ) {
this.repaint(traitLastBounds);
}
// red�ssine le trait
traitActualBounds.setBounds(traitShape.getBounds());
traitActualBounds.grow(traitGrow, traitGrow); // moiti� de la largeur du stroke
this.repaint(traitActualBounds);
}
// red�ssine le fond sous l'ancienne position
if ( selectedPieceLastBounds != null ) {
this.repaint(selectedPieceLastBounds);
}
// d�ssine � la position actuelle
selectedPieceActualBounds.setBounds(fig.getSelectedPiece().getBounds());
selectedPieceActualBounds.grow(borderGrow, borderGrow); // moiti� de la largeur du trait
this.repaint(selectedPieceActualBounds);
}
|
public void setOutlineFigure(DisplayFigure df) {
outlineFig = df;
if (isFound) {
isFound = false;
firePropertyChange(PROPERTY_FOUND, true, false);
repaint(); // efface la marque
}
setScale(refScale);
if ( withOutline ) {
toggleOutline();
}
}
Change de figure outline.
Passe en mode outline non affich�e.
Peut appeller refreshAll(). |
public void setScale(double newScale) {
refScale = newScale;
Insets in = getInsets();
double scale = refScale * (getWidth() - in.left - in.right);
fig.setScale(scale);
fig.setLimits( in.left,
in.top,
getWidth() - in.right,
getHeight() - in.bottom );
outlineFig.setScale(scale);
outlineFig.center( in.left,
in.top,
getWidth() - in.right,
getHeight() - in.bottom );
}
Modifie la taille relative des pi�ce.
Recalcule le scale interne (qui d�pends aussi de la taille du composant).
L'outline est recentr�e.
ne redessine pas : peut �tre suivie par refreshAll(); |
public void toggleOutline() {
withOutline = ! withOutline;
refreshAll();
}
(D�) s�lectionne l'affichage de l'outline.
Appelle refreshAll(). |
public void unselect() {
if (isSelected) {
isSelected = false;
// refreshAll();
refreshSelectedPiece();
firePropertyChange(PROPERTY_SELECTION, true, false);
}
}
D�s�lectionne la piece.
Appelle refreshAll(). |
public void update(Observable obs,
Object obj) {
if ( DEBUG ) {
System.out.println("editfig update");
}
config((Config) obs);
refreshAll();
}
Prend en compte les modifs de la config.
N'est pas appell� � l'init. |