
org.nakedobjects.plugins.dnd.viewer.SkylarkViewFactory Maven / Gradle / Ivy
The newest version!
package org.nakedobjects.plugins.dnd.viewer;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;
import org.apache.log4j.Logger;
import org.nakedobjects.metamodel.adapter.NakedObject;
import org.nakedobjects.metamodel.commons.debug.DebugString;
import org.nakedobjects.metamodel.facets.object.value.ValueFacet;
import org.nakedobjects.metamodel.spec.NakedObjectSpecification;
import org.nakedobjects.plugins.dnd.Content;
import org.nakedobjects.plugins.dnd.ObjectContent;
import org.nakedobjects.plugins.dnd.OneToManyField;
import org.nakedobjects.plugins.dnd.TextParseableContent;
import org.nakedobjects.plugins.dnd.TextParseableField;
import org.nakedobjects.plugins.dnd.View;
import org.nakedobjects.plugins.dnd.ViewAxis;
import org.nakedobjects.plugins.dnd.ViewFactory;
import org.nakedobjects.plugins.dnd.ViewRequirement;
import org.nakedobjects.plugins.dnd.ViewSpecification;
import org.nakedobjects.plugins.dnd.viewer.basic.FallbackView;
import org.nakedobjects.plugins.dnd.viewer.basic.MinimizedView;
import org.nakedobjects.plugins.dnd.viewer.border.DisposedObjectBorder;
import org.nakedobjects.plugins.dnd.viewer.list.InternalListSpecification;
import org.nakedobjects.plugins.dnd.viewer.view.dialog.ActionDialogSpecification;
import org.nakedobjects.plugins.dnd.viewer.view.simple.DragViewOutline;
/*
*/
/**
* This class holds all the different view types that all the different objects can be viewed as.
*/
public class SkylarkViewFactory implements ViewFactory {
private static final ViewSpecification fallback = new FallbackView.Specification();
private static final ViewSpecification dialogSpec = new ActionDialogSpecification();
public static final int INTERNAL = 2;
private static final Logger LOG = Logger.getLogger(SkylarkViewFactory.class);
public static final int WINDOW = 1;
private ViewSpecification emptyFieldSpecification;
private final Vector rootViews = new Vector();
private ViewSpecification smallObjectIconSpecification;
private ViewSpecification smallApplicationClassIconSpecification;
private final Vector subviews = new Vector();
private final Vector valueFields = new Vector();
private ViewSpecification workspaceClassIconSpecification;
private ViewSpecification workspaceServiceIconSpecification;
private ViewSpecification workspaceObjectIconSpecification;
private ViewSpecification rootWorkspaceSpecification;
private ViewSpecification workspaceSpecification;
private ViewSpecification dragContentSpecification;
private List viewSpecifications = new ArrayList();
public void addSpecification(final ViewSpecification spec) {
viewSpecifications.add(spec);
}
/**
* @deprecated
*/
public void addServiceIconSpecification(final ViewSpecification spec) {
workspaceServiceIconSpecification = spec;
}
/**
* @deprecated
*/
public void addCompositeRootViewSpecification(final ViewSpecification spec) {
rootViews.addElement(spec);
}
/**
* @deprecated
*/
public void addCompositeSubviewViewSpecification(final ViewSpecification spec) {
subviews.addElement(spec);
}
public void addEmptyFieldSpecification(final ViewSpecification spec) {
emptyFieldSpecification = spec;
}
/**
* @deprecated
*/
public void addObjectIconSpecification(final ViewSpecification spec) {
workspaceObjectIconSpecification = spec;
viewSpecifications.add(spec);
}
/**
* @deprecated
*/
public void addSubviewIconSpecification(final ViewSpecification spec) {
smallObjectIconSpecification = spec;
viewSpecifications.add(spec);
}
/**
* @deprecated
*/
public void addSubviewApplicationClassIconSpecification(final ViewSpecification spec) {
smallApplicationClassIconSpecification = spec;
}
/**
* @deprecated
*/
public void addValueFieldSpecification(final ViewSpecification spec) {
valueFields.addElement(spec);
}
/**
* @deprecated
*/
public void addRootWorkspaceSpecification(final ViewSpecification spec) {
rootWorkspaceSpecification = spec;
}
/**
* @deprecated
*/
public void addWorkspaceSpecification(final ViewSpecification spec) {
workspaceSpecification = spec;
}
public Enumeration closedSubviews(final Content forContent, final View replacingView) {
final Vector v = new Vector();
/**
* @deprecated
*/
if (forContent instanceof ObjectContent) {
v.addElement(smallObjectIconSpecification);
}
return v.elements();
}
public View createIcon(final Content content) {
final ViewSpecification spec = getIconizedRootViewSpecification(content);
final View view = createView(spec, content, null);
LOG.debug("creating " + view + " (icon) for " + content);
return view;
}
public View createWindow(final Content content) {
final ViewSpecification spec = getOpenRootViewSpecification(content);
final View view = createView(spec, content, null);
LOG.debug("creating " + view + " (window) for " + content);
return view;
}
public View createDialog(final Content content) {
return createView(dialogSpec, content, null);
}
public View createFieldView(final ObjectContent content, final ViewAxis axis) {
final ViewSpecification objectFieldSpecification = getIconizedSubViewSpecification(content);
return createView(objectFieldSpecification, content, axis);
}
public View createFieldView(final TextParseableField content, final ViewAxis axis) {
final ViewSpecification valueFieldSpecification = getValueFieldSpecification(content);
return createView(valueFieldSpecification, content, axis);
}
public View createInternalList(final OneToManyField content, final ViewAxis axis) {
final ViewSpecification listSpecification = new InternalListSpecification();
return createView(listSpecification, content, axis);
}
private View createView(final ViewSpecification specification, final Content content, final ViewAxis axis) {
ViewSpecification spec;
if (specification == null) {
LOG.warn("no suitable view for " + content + " using fallback view");
spec = new FallbackView.Specification();
} else {
spec = specification;
}
View createView = spec.createView(content, axis);
if (content.isObject()) {
final NakedObject adapter = content.getNaked();
if (adapter != null && adapter.getResolveState().isDestroyed()) {
createView = new DisposedObjectBorder(createView);
}
}
createView.getSubviews();
return createView;
}
public View createInnerWorkspace(final Content content) {
LOG.debug("creating inner workspace for " + content);
final View view = createView(workspaceSpecification, content, null);
return view;
}
private ViewSpecification defaultViewSpecification(final Vector availableViews, final Content content) {
final Enumeration fields = availableViews.elements();
while (fields.hasMoreElements()) {
final ViewSpecification spec = (ViewSpecification) fields.nextElement();
ViewRequirement requirement = new ViewRequirement(content, ViewRequirement.CLOSED);
if (spec.canDisplay(content, requirement)) {
return spec;
}
}
LOG.warn("no suitable view for " + content + " using fallback view");
return new FallbackView.Specification();
}
private ViewSpecification ensureView(final ViewSpecification spec) {
if (spec == null) {
LOG.error("missing view; using fallback");
return new FallbackView.Specification();
} else {
return spec;
}
}
public void debugData(final DebugString sb) {
sb.append("RootsViews\n");
Enumeration fields = rootViews.elements();
while (fields.hasMoreElements()) {
final ViewSpecification spec = (ViewSpecification) fields.nextElement();
sb.append(" ");
sb.append(spec);
sb.append("\n");
}
sb.append("\n\n");
sb.append("Subviews\n");
fields = subviews.elements();
while (fields.hasMoreElements()) {
final ViewSpecification spec = (ViewSpecification) fields.nextElement();
sb.append(" ");
sb.append(spec);
sb.append("\n");
}
sb.append("\n\n");
sb.append("Value fields\n");
fields = valueFields.elements();
while (fields.hasMoreElements()) {
final ViewSpecification spec = (ViewSpecification) fields.nextElement();
sb.append(" ");
sb.append(spec);
sb.append("\n");
}
sb.append("\n\n");
sb.append("Specifications\n");
for (ViewSpecification spec : viewSpecifications) {
sb.append(" ");
sb.append(spec);
sb.append("\n");
}
sb.append("\n\n");
}
public String debugTitle() {
return "View factory entries";
}
public ViewSpecification getContentDragSpecification() {
return dragContentSpecification;
}
public ViewSpecification getEmptyFieldSpecification() {
if (emptyFieldSpecification == null) {
LOG.error("missing empty field specification; using fallback");
return fallback;
}
return emptyFieldSpecification;
}
public ViewSpecification getIconizedRootViewSpecification(final Content content) {
if (content.getNaked().getSpecification().isService()) {
if (workspaceServiceIconSpecification == null) {
LOG.error("missing workspace class icon specification; using fallback");
return fallback;
}
return ensureView(workspaceServiceIconSpecification);
} else {
if (workspaceObjectIconSpecification == null) {
LOG.error("missing workspace object icon specification; using fallback");
return fallback;
}
return ensureView(workspaceObjectIconSpecification);
}
}
public ViewSpecification getIconizedSubViewSpecification(final Content content) {
if (content.getNaked() == null) {
return getEmptyFieldSpecification();
} else if (content.getNaked().getSpecification().isService()) {
if (smallApplicationClassIconSpecification == null) {
LOG.error("missing small class icon specification; using fall back");
return fallback;
}
return ensureView(smallApplicationClassIconSpecification);
} else {
if (smallObjectIconSpecification == null) {
LOG.error("missing small object icon specification; using fall back");
return fallback;
}
return ensureView(smallObjectIconSpecification);
}
}
private ViewSpecification getOpenRootViewSpecification(final Content content) {
return defaultViewSpecification(rootViews, content);
}
/**
* @deprecated - views should be specific about what subviews they create; and allow the user to change
* them later
*/
@Deprecated
public ViewSpecification getOpenSubViewSpecification(final ObjectContent content) {
return defaultViewSpecification(subviews, content);
}
public ViewSpecification getOverlayViewSpecification(final Content content) {
return fallback;
}
public ViewSpecification getValueFieldSpecification(final TextParseableContent content) {
if (content.isOptionEnabled()) {
// return new ValueOptionField();
}
/*
* NakedValue object = content.getObject(); if (object == null || object.getObject() instanceof String
* || object.getObject() instanceof Date) { return new TextFieldSpecification(); }
*/
return defaultViewSpecification(valueFields, content);
}
/*
public Enumeration openRootViews(final Content forContent, final View replacingView) {
return viewSpecifications(rootViews, forContent);
}
public Enumeration openSubviews(final Content forContent, final View replacingView) {
if (forContent instanceof ObjectContent) {
return viewSpecifications(subviews, forContent);
}
return new Vector().elements();
}
*/
public Enumeration valueViews(final Content forContent, final View replacingView) {
return new Vector().elements();
}
public void setDragContentSpecification(final ViewSpecification dragContentSpecification) {
this.dragContentSpecification = dragContentSpecification;
}
/*
private Enumeration viewSpecifications(final Vector availableViews, final Content content) {
final Vector v = new Vector();
final Enumeration fields = availableViews.elements();
while (fields.hasMoreElements()) {
final ViewSpecification spec = (ViewSpecification) fields.nextElement();
ViewRequirement requirement = new ViewRequirement(content, ViewRequirement.CLOSED);
if (spec.canDisplay(content, requirement)) {
v.addElement(spec);
}
}
return v.elements();
}
*/
public View createDragViewOutline(final View view) {
return new DragViewOutline(view);
}
public View createMinimizedView(final View view) {
return new MinimizedView(view);
}
public View createView(ViewRequirement requirement) {
final ViewSpecification objectFieldSpecification = getSpecificationForRequirement(requirement);
return createView(objectFieldSpecification, requirement.getContent(), requirement.getAxis());
}
public ViewSpecification getSpecificationForRequirement(final ViewRequirement requirement) {
Content content = requirement.getContent();
NakedObjectSpecification specification = content.getSpecification();
boolean isValue = specification != null && specification.containsFacet(ValueFacet.class);
if (content.isObject() && !isValue && content.getNaked() == null) {
return getEmptyFieldSpecification();
} else {
for (ViewSpecification viewSpecification : viewSpecifications) {
if (viewSpecification.canDisplay(content, requirement)) {
return viewSpecification;
}
}
LOG.error("missing specification; using fall back");
return fallback;
}
}
public Enumeration availableViews(final ViewRequirement requirement) {
final Vector v = new Vector();
for (ViewSpecification specification : viewSpecifications) {
if (specification.canDisplay(requirement.getContent(), requirement)) {
// if (requirement.is(ViewRequirement.OPEN) && specification.isOpen())
v.addElement(specification);
}
}
return v.elements();
}
}
// Copyright (c) Naked Objects Group Ltd.
© 2015 - 2025 Weber Informatics LLC | Privacy Policy