/*
* Beanfabrics Framework Copyright (C) by Michael Karneim, beanfabrics.org
* Use is subject to license terms. See license.txt.
*/
package org.beanfabrics.swing.customizer.path;
import org.beanfabrics.Path;
import org.beanfabrics.meta.PathNode;
import org.beanfabrics.meta.TypeInfo;
import org.beanfabrics.model.OperationPM;
import org.beanfabrics.model.PMManager;
import org.beanfabrics.model.TextPM;
import org.beanfabrics.support.Operation;
import org.beanfabrics.support.SortOrder;
import org.beanfabrics.support.Validation;
import org.beanfabrics.swing.customizer.util.CustomizerUtil;
/**
* The <code>PathPM</code> is a presentation model presenting a {@link Path} object.
*
* @author Michael Karneim
*/
public class PathPM extends TextPM {
OperationPM choosePath = new OperationPM();
private PathNode rootElementInfo;
private TypeInfo requiredModelTypeInfo;
public PathPM() {
PMManager.setup(this);
}
public void setPathContext(PathContext pathContext) {
this.rootElementInfo = pathContext.root;
this.requiredModelTypeInfo = pathContext.requiredModelTypeInfo;
this.revalidateProperties();
}
public Path getData() {
return Path.parse(this.getText());
}
public void setData(Path path) {
this.setText(Path.getPathString(path));
}
@Operation
void choosePath() {
final PathChooserController ctrl = CustomizerUtil.createPathChooser(getContext(), new PathContext(rootElementInfo, requiredModelTypeInfo), getData());
ctrl.getPresentationModel().onApply(new PathChooserPM.OnApplyHandler() {
@Override
public void apply() {
setData(ctrl.getPresentationModel().getData());
}
});
ctrl.getView().setVisible(true);
}
@Validation(path = "choosePath")
boolean canChoosePath() {
return this.rootElementInfo != null;
}
@Validation
@SortOrder(1)
boolean isSyntacticallyCorrect() {
try {
new Path(this.getText());
return true;
} catch (IllegalArgumentException ex) {
return false;
}
}
@Validation(message = "This path points into the void")
@SortOrder(2)
boolean isComplete() {
Path path = new Path(this.getText());
return (this.rootElementInfo == null || this.rootElementInfo.getNode(path) != null);
}
@Validation(message = "The object at the end of this path does not match the required type")
@SortOrder(3)
boolean isCorrect() {
Path path = new Path(this.getText());
return rootElementInfo == null || requiredModelTypeInfo == null
|| requiredModelTypeInfo.isAssignableFrom(this.rootElementInfo.getNode(path).getTypeInfo());
}
}