package de.FeatureModellingTool.GraphicalEditor;
import research.tool.CreationTool;
import research.tool.Tool;
import de.FeatureModellingTool.FeatureModel.FeatureModel;
import de.FeatureModellingTool.FeatureModel.FeatureEditor;
import de.FeatureModellingTool.FeatureModel.FeatureModelEditor;
import de.FeatureModellingTool.FeatureModel.Feature;
import de.reuse.GroupMap;
import research.FloatingTextField;
import research.TextHolder;
import research.Figure;
import javax.swing.event.DocumentListener;
import javax.swing.event.DocumentEvent;
import javax.swing.text.PlainDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import java.beans.PropertyChangeEvent;
import java.awt.event.MouseEvent;
import java.awt.*;
import java.awt.geom.AffineTransform;
/**
* author: zhangwei
* Date: 2003-5-28
* Time: 21:45:24
*/
class FeatureCreationTool extends CreationTool implements ConstantDefinition {
protected DocumentListener documentListener = new FloatingTextFieldDocumentListener();
protected FloatingTextField fTextField;
protected TextHolder fTypingTarget;
private FeatureModel featureModel = null;
private FeatureEditor featureEditor = null;
private FeatureModelEditor featureModelEditor = null;
private GroupMap idToFigureMap = null;
private class FeatureDocument extends PlainDocument {
public void insertString(int offset, String s, AttributeSet as)
throws BadLocationException {
s = s.replace(' ', '-');
s = s.replace('/', '-');
s = s.replace('\\', '-');
s = s.replace(':', '-');
s = s.replace('*', '-');
s = s.replace('?', '-');
s = s.replace('"', '-');
s = s.replace('<', '-');
s = s.replace('>', '-');
s = s.replace('|', '-');
super.insertString(offset, s, as);
}
}
protected void contextChange(PropertyChangeEvent e) {
super.contextChange(e);
String propertyName = e.getPropertyName();
if (FEATURE_MODEL.equals(propertyName)) {
end();
featureModel = (FeatureModel) e.getNewValue();
} else if (FEATURE_EDITOR.equals(propertyName)) {
end();
featureEditor = (FeatureEditor) e.getNewValue();
} else if (FEATURE_MODEL_EDITOR.equals(propertyName)) {
end();
featureModelEditor = (FeatureModelEditor) e.getNewValue();
} else if (ID_TO_FIGURE_MAP.equals(propertyName)) {
idToFigureMap = (GroupMap) e.getNewValue();
}
}
public boolean isEnabled() {
if (!super.isEnabled()) return false;
if (featureModel == null) return false;
if (featureEditor == null) return false;
if (featureModelEditor == null) return false;
return true;
}
/**
* If the pressed figure is a TextHolder it can be edited otherwise
* a new text figure is created.
*/
public void mouseDown(MouseEvent e, int x, int y) {
//if(!isEnabled()) return;
if ((!isActivated()) && (!isEnabled()))
return;
boolean flag = false;
if (getTypingTarget() != null) {//������ǰ�ı༭״̬
endEdit(false);
flag = true;
}
TextHolder textHolder = null;
double scale = drawingView.getScale();
int realX = (int) (e.getX() / scale + 0.5);
int realY = (int) (e.getY() / scale + 0.5);
Figure pressedFigure = drawingView.getDrawing().findFigureInside(realX, realY);
if (pressedFigure instanceof FeatureFigure) {
textHolder = (TextHolder) pressedFigure;
if (!textHolder.acceptsTyping())
textHolder = null;
}
if (textHolder != null) {//��ʼ�༭��갴�´���textHolder����������
beginEdit(textHolder);
return;
}
//if (getTypingTarget() != null) {//������ǰ�ı༭״̬
// endEdit();
if (flag) {
getPropertyChangeSupport().firePropertyChange(Tool.TOOL_DONE, false, true);
flag = false;
} else {//�����µ��ı�ͼԪ�����༭�����������
super.mouseDown(e, x, y);
//�� feature model ���������
String name = (String) createdFigure.getAttribute(FeatureFigure.TEXT);
if (name == null) name = "";
Feature currentFeature = featureModelEditor.addFeature(name);
createdFigure.setAttribute("id", currentFeature.getID());
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.add(currentFeature.getID(), createdFigure);
}
drawingView.checkDamage();
textHolder = (TextHolder) createdFigure;
beginEdit(textHolder);
}
}
public void mouseDrag(MouseEvent e, int x, int y) {
}
public void mouseUp(MouseEvent e, int x, int y) {
}
public void end() {
endEdit();
}
/**
* VTextIconTest whether the text tool is currently activated and is displaying
* a overlay TextFigure for accepting input.
*
* @return true, if the text tool has a accepting target TextFigure for its input, false otherwise
*/
public boolean isActivated() {
return getTypingTarget() != null;
}
protected void beginEdit(TextHolder figure) {
if (fTextField == null) {
fTextField = new FloatingTextField(new FeatureDocument());
fTextField.addDocumentListener(documentListener);
}
if (figure != getTypingTarget() && getTypingTarget() != null) {
endEdit();
}
AffineTransform trans = new AffineTransform();
trans.scale(drawingView.getScale(), drawingView.getScale());
Font displayFont = figure.getFont().deriveFont(trans);
fTextField.createOverlay((Container) drawingView, displayFont);
fTextField.setBackground((Color) ((Figure) figure).getAttribute("fillColor"));
fTextField.setBounds(fieldBounds(figure), figure.getText());
setTypingTarget(figure);
fTextField.getTextField().selectAll();
}
public void endEdit() {
endEdit(true);
}
protected void endEdit(boolean release) {
if (getTypingTarget() != null) {
/**
if (fTextField.getText().length() > 0) {
getTypingTarget().setText(fTextField.getText());
} else {
drawingView.remove(targetFigure);
//ɾ����ͼԪ��Ӧ������
featureModelEditor.removeFeature((String) targetFigure.getAttribute("id"));
//����id��figure��ӳ���
if (idToFigureMap != null) {
idToFigureMap.remove((String) targetFigure.getAttribute("id"), targetFigure);
}
}
**/
getTypingTarget().setText(fTextField.getText());
setTypingTarget(null);
fTextField.endOverlay();
if (release)
getPropertyChangeSupport().firePropertyChange(Tool.TOOL_DONE, false, true);
}
}
protected Rectangle fieldBounds(TextHolder figure) {
Rectangle box = figure.textDisplayBox();
double scale = drawingView.getScale();
int realX = (int) (box.x * scale);
int realY = (int) (box.y * scale);
int realW = (int) (box.width * scale + 0.5);
int realH = (int) (box.height * scale + 0.5);
box.setRect(realX, realY, realW, realH);
return box;
}
protected void setTypingTarget(TextHolder newTypingTarget) {
fTypingTarget = newTypingTarget;
}
protected TextHolder getTypingTarget() {
return fTypingTarget;
}
protected class FloatingTextFieldDocumentListener implements DocumentListener {
public void changedUpdate(DocumentEvent evt) {
updateBounds();
updateFeatureName();
}
public void insertUpdate(DocumentEvent evt) {
updateBounds();
updateFeatureName();
}
public void removeUpdate(DocumentEvent evt) {
updateBounds();
updateFeatureName();
}
}
protected void updateBounds() {
if ((getTypingTarget() != null) && (fTextField != null)) {
getTypingTarget().setText(fTextField.getText());
fTextField.updateBounds(fieldBounds(getTypingTarget()));
drawingView.checkDamage();
}
}
/**
* ���µ�ǰͼԪ���������������
*/
protected void updateFeatureName() {
if ((getTypingTarget() != null) && (fTextField != null)) {
Figure figure = (Figure) getTypingTarget();
String id = (String) figure.getAttribute("id");
Feature feature = featureModel.getFeature(id);
this.featureEditor.setName(feature, getTypingTarget().getText());
}
}
}