FontSizeHandle.java
/*
* @(#)FontSizeHandle.java
*
* Project: JHotdraw - a GUI framework for technical drawings
* http://www.jhotdraw.org
* http://jhotdraw.sourceforge.net
* Copyright: © by the original author(s) and all contributors
* License: Lesser GNU Public License (LGPL)
* http://www.opensource.org/licenses/lgpl-license.html
*/
package CH.ifa.draw.figures;
import CH.ifa.draw.framework.*;
import CH.ifa.draw.standard.*;
import CH.ifa.draw.util.Undoable;
import CH.ifa.draw.util.UndoableAdapter;
import java.awt.*;
/**
* A Handle to change the font size by direct manipulation.
*
* @version <$CURRENT_VERSION$>
*/
public class FontSizeHandle extends LocatorHandle {
public FontSizeHandle(Figure owner, Locator l) {
super(owner, l);
}
public void invokeStart(int x, int y, DrawingView view) {
setUndoActivity(createUndoActivity(view));
getUndoActivity().setAffectedFigures(new SingleFigureEnumerator(owner()));
}
public void invokeStep (int x, int y, int anchorX, int anchorY, DrawingView view) {
TextFigure textOwner = (TextFigure) owner();
FontSizeHandle.UndoActivity activity = (FontSizeHandle.UndoActivity)getUndoActivity();
int newSize = activity.getFont().getSize() + y-anchorY;
textOwner.setFont(new Font(activity.getFont().getName(), activity.getFont().getStyle(), newSize));
}
public void invokeEnd(int x, int y, int anchorX, int anchorY, DrawingView view) {
TextFigure textOwner = (TextFigure) owner();
FontSizeHandle.UndoActivity activity = (FontSizeHandle.UndoActivity)getUndoActivity();
// there has been no change so there is nothing to undo
if (textOwner.getFont().getSize() == activity.getOldFontSize()) {
setUndoActivity(null);
}
else {
activity.setFont(textOwner.getFont());
}
}
public void draw(Graphics g) {
Rectangle r = displayBox();
g.setColor(Color.yellow);
g.fillOval(r.x, r.y, r.width, r.height);
g.setColor(Color.black);
g.drawOval(r.x, r.y, r.width, r.height);
}
/**
* Factory method for undo activity
*/
protected Undoable createUndoActivity(DrawingView newView) {
TextFigure textOwner = (TextFigure)owner();
return new FontSizeHandle.UndoActivity(newView, textOwner.getFont());
}
public static class UndoActivity extends UndoableAdapter {
private Font myFont;
private int myOldFontSize;
public UndoActivity(DrawingView newView, Font newFont) {
super(newView);
setFont(newFont);
setOldFontSize(getFont().getSize());
setUndoable(true);
setRedoable(true);
}
public boolean undo() {
if (!super.undo()) {
return false;
}
swapFont();
return true;
}
public boolean redo() {
// do not call execute directly as the selection might has changed
if (!isRedoable()) {
return false;
}
swapFont();
return true;
}
protected void swapFont() {
setOldFontSize(replaceFontSize());
FigureEnumeration fe = getAffectedFigures();
while (fe.hasMoreElements()) {
((TextFigure)fe.nextFigure()).setFont(getFont());
}
}
private int replaceFontSize() {
int tempFontSize = getFont().getSize();
setFont(new Font(getFont().getName(), getFont().getStyle(), getOldFontSize()));
return tempFontSize;
}
protected void setFont(Font newFont) {
myFont = newFont;
}
public Font getFont() {
return myFont;
}
protected void setOldFontSize(int newOldFontSize) {
myOldFontSize = newOldFontSize;
}
public int getOldFontSize() {
return myOldFontSize;
}
}
}