Commit 4e8d62ff authored by Simon Barner's avatar Simon Barner

Merge branch '3884' into 'master'

Initial JavaFX-based Partition Architectecture editor

See merge request af3/af3!268
parents c9362d0d e8a30c00
ComponentControllerFactory.java debf3bb80cb56197d4dd0c84f38e466f99da9a34 GREEN
ComponentControllerFactory.java 4995e5cc92b2ce5c3d178f7c047e76bf05844c44 GREEN
ComponentModelFactory.java 7e58831949f50a9887bcbf31959f887a87f703cb GREEN
ComponentStructureFXEditor.java d662863a84c9e3f24e46de19dad1d750a1462cd3 GREEN
ComponentStructureFXEditorBinding.java 370fe5c458f15bd8299364f858250d5c2bda6729 GREEN
ComponentVisualFactory.java 4b5f4e36726d65422719d628765d176aa077b673 GREEN
SubComponentController.java e7361eb33367c160f9a7502721bca13f1ee85128 GREEN
......@@ -29,6 +29,7 @@ import org.fortiss.tooling.base.ui.editor.fx.controller.EObjectDiagramController
import org.fortiss.tooling.base.ui.editor.fx.controller.LayoutedContentAnchorageController;
import org.fortiss.tooling.base.ui.editor.fx.controller.LayoutedDiagramAnchorageController;
import org.fortiss.tooling.base.ui.editor.fx.controller.LayoutedLinkBendPointController;
import org.fortiss.tooling.base.ui.editor.fx.controller.LayoutedRectangularResizableContentController;
/**
* The implementation of the {@link IControllerFactory} for the component editor.
......@@ -40,7 +41,7 @@ public final class ComponentControllerFactory implements IControllerFactory {
/** {@inheritDoc} */
@Override
public IController createContentController(IContentMVCBundle model) {
return new SubComponentController(model);
return new LayoutedRectangularResizableContentController<Component>(model, Component.class);
}
/** {@inheritDoc} */
......
......@@ -58,6 +58,10 @@
<modelEditorBinding binding="org.fortiss.af3.partition.ui.editor.PartitionArchitectureMemoryAreaAllocationEditorBinding">
<modelElementClass modelElementClass="org.fortiss.af3.partition.model.PartitionArchitecture"/>
</modelEditorBinding>
<modelEditorBinding binding="org.fortiss.af3.partition.ui.editor.fx.PartitionStructureFXEditorBinding">
<modelElementClass modelElementClass="org.fortiss.af3.partition.model.PartitionArchitecture"></modelElementClass>
</modelEditorBinding>
</extension>
<extension point="org.fortiss.tooling.kernel.ui.modelElementHandler">
......
PartitionControllerFactory.java 85d48280fd1970357bd58c3061fa989f669dbc3b GREEN
PartitionModelFactory.java d6137f92cb27b13ad08cadcf327c6b39b8cf47e7 GREEN
PartitionStructureFXEditor.java 2b29b5b2021d9692957ef93a4f9eda5b26661e01 GREEN
PartitionStructureFXEditorBinding.java 02754326053ed46688f404df0378ad32bc08a7dc GREEN
PartitionVisualFactory.java df76e179f1970905e6c42f312f71a1126d9dab4b GREEN
/*-------------------------------------------------------------------------+
| Copyright 2019 fortiss GmbH |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.af3.partition.ui.editor.fx;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IController;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IControllerFactory;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IDiagramAnchorageMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IDiagramMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.ILinkMVCBundle;
import org.fortiss.af3.partition.model.MemoryArea;
import org.fortiss.af3.partition.model.MemoryAreaChannel;
import org.fortiss.af3.partition.model.Partition;
import org.fortiss.af3.partition.model.PartitionArchitecture;
import org.fortiss.af3.partition.model.PartitionChannel;
import org.fortiss.af3.partition.model.PartitionPort;
import org.fortiss.tooling.base.ui.editor.fx.controller.EObjectDiagramController;
import org.fortiss.tooling.base.ui.editor.fx.controller.LayoutedDiagramAnchorageController;
import org.fortiss.tooling.base.ui.editor.fx.controller.LayoutedLinkBendPointController;
import org.fortiss.tooling.base.ui.editor.fx.controller.LayoutedRectangularResizableContentController;
/**
* The implementation of the {@link IControllerFactory} for the {@link PartitionArchitecture}
* editor.
*
* @author barner
*/
public final class PartitionControllerFactory implements IControllerFactory {
/** {@inheritDoc} */
@Override
public IController createContentController(IContentMVCBundle modelBundle) {
Object modelObj = modelBundle.getModel();
if(modelObj instanceof Partition) {
return new LayoutedRectangularResizableContentController<Partition>(modelBundle,
Partition.class);
} else if(modelObj instanceof MemoryArea) {
return new LayoutedRectangularResizableContentController<MemoryArea>(modelBundle,
MemoryArea.class);
}
return null;
}
/** {@inheritDoc} */
@Override
public IController createDiagramAnchorageController(IDiagramAnchorageMVCBundle modelBundle) {
return null;
}
/** {@inheritDoc} */
@Override
public IController createContentAnchorageController(IContentAnchorageMVCBundle modelBundle) {
// PartitionPort is a supertype of MemoryArea{Input, Output}Port
return new LayoutedDiagramAnchorageController<>(modelBundle, PartitionPort.class);
}
/** {@inheritDoc} */
@Override
public IController createLinkController(ILinkMVCBundle modelBundle) {
Object linkObj = modelBundle.getModel();
if(linkObj instanceof PartitionChannel) {
return new LayoutedLinkBendPointController<>(modelBundle, PartitionChannel.class);
} else if(linkObj instanceof MemoryAreaChannel) {
return new LayoutedLinkBendPointController<>(modelBundle, MemoryAreaChannel.class);
}
return null;
}
/** {@inheritDoc} */
@Override
public IController createDiagramController(IDiagramMVCBundle diagramBundle) {
return new EObjectDiagramController<>(diagramBundle, PartitionArchitecture.class);
}
}
/*-------------------------------------------------------------------------+
| Copyright 2019 fortiss GmbH |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.af3.partition.ui.editor.fx;
import static java.util.Collections.emptyList;
import static java.util.Objects.requireNonNull;
import static org.conqat.lib.commons.reflect.ReflectionUtils.isInstanceOfAny;
import static org.fortiss.tooling.common.util.LambdaUtils.filterList;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.IModelFactory;
import org.fortiss.af3.partition.model.MemoryArea;
import org.fortiss.af3.partition.model.MemoryAreaChannel;
import org.fortiss.af3.partition.model.Partition;
import org.fortiss.af3.partition.model.PartitionArchitecture;
import org.fortiss.af3.partition.model.PartitionChannel;
import org.fortiss.tooling.base.model.element.IConnection;
import org.fortiss.tooling.base.model.element.IHierarchicElement;
/**
* The implementation of the {@link IModelFactory} for the {@link Partition} editor.
*
* @author barner
*/
public final class PartitionModelFactory implements IModelFactory {
/** The currently edited {@link PartitionArchitecture}. */
private final PartitionArchitecture rootElement;
/** Constructor. */
public PartitionModelFactory(PartitionArchitecture root) {
this.rootElement = requireNonNull(root);
}
/** {@inheritDoc} */
@Override
public Object getRootModel() {
return rootElement;
}
/** {@inheritDoc} */
@SuppressWarnings({"unchecked", "rawtypes"})
@Override
public List<?> getContentModels() {
List rval = new ArrayList();
rval.addAll(rootElement.getPartitions());
rval.addAll(rootElement.getMemoryAreas());
return rval;
}
/** {@inheritDoc} */
@Override
public List<?> getDiagramAnchorageModels() {
return emptyList();
}
/** {@inheritDoc} */
@Override
public List<?> getContentAnchorageModels(Object parent) {
if(isInstanceOfAny(parent, Partition.class, MemoryArea.class)) {
return ((IHierarchicElement)parent).getConnectors();
}
return emptyList();
}
/** {@inheritDoc} */
@Override
public List<?> getLinkModels() {
return filterList(rootElement.getConnections(),
c -> filterPartiallyInitializedConnections(c));
}
/** Checks whether the given connection is only partially initialized. */
private boolean filterPartiallyInitializedConnections(IConnection c) {
return c.getSource() != null && c.getTarget() != null && c.eContainer() != null;
}
/** {@inheritDoc} */
@Override
public Object getLinkStart(Object link) {
if(link instanceof PartitionChannel) {
return ((PartitionChannel)link).getSource();
} else if(link instanceof MemoryAreaChannel) {
return ((MemoryAreaChannel)link).getSource();
}
return null;
}
/** {@inheritDoc} */
@Override
public Object getLinkEnd(Object link) {
if(link instanceof PartitionChannel) {
return ((PartitionChannel)link).getTarget();
} else if(link instanceof MemoryAreaChannel) {
return ((MemoryAreaChannel)link).getTarget();
}
return null;
}
/** {@inheritDoc} */
@Override
public Object getParent(Object element) {
return null;
}
/** {@inheritDoc} */
@Override
public void update() {
// ignored
}
}
/*-------------------------------------------------------------------------+
| Copyright 2019 fortiss GmbH |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.af3.partition.ui.editor.fx;
import static javafx.scene.paint.Color.LIGHTGRAY;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramViewerFeatures;
import org.fortiss.af3.partition.model.MemoryArea;
import org.fortiss.af3.partition.model.MemoryAreaInputPort;
import org.fortiss.af3.partition.model.MemoryAreaOutputPort;
import org.fortiss.af3.partition.model.Partition;
import org.fortiss.af3.partition.model.PartitionArchitecture;
import org.fortiss.af3.partition.model.PartitionInputPort;
import org.fortiss.af3.partition.model.PartitionOutputPort;
import org.fortiss.tooling.kernel.ui.extension.base.LWFXEFEditorBase;
import javafx.geometry.Dimension2D;
/**
* Graphical editor for {@link Partition} structures based on JavaFX.
*
* @author barner
*/
public class PartitionStructureFXEditor extends LWFXEFEditorBase<PartitionArchitecture> {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override
public Class<? extends EObject>[] getVisibleEObjectTypes() {
return new Class[] {Partition.class, PartitionInputPort.class, PartitionOutputPort.class,
MemoryArea.class, MemoryAreaInputPort.class, MemoryAreaOutputPort.class};
}
/** {@inheritDoc} */
@Override
protected void customizeViewer() {
DiagramViewerFeatures features = viewer.getFeatures();
features.setIndicatorSpacing(new Dimension2D(12, 12));
features.setBackgroundColor(LIGHTGRAY);
}
}
......@@ -13,37 +13,54 @@
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.af3.component.ui.editor.fx;
package org.fortiss.af3.partition.ui.editor.fx;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IController;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentMVCBundle;
import org.fortiss.af3.component.model.Component;
import org.fortiss.af3.component.model.Port;
import org.fortiss.tooling.base.ui.editor.fx.controller.LayoutedRectangularResizableContentController;
import javafx.geometry.Side;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IControllerFactory;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.IModelFactory;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IVisualFactory;
import org.eclipse.ui.IEditorPart;
import org.fortiss.af3.partition.model.Partition;
import org.fortiss.tooling.kernel.ui.extension.base.ModelEditorBindingBase;
/**
* {@link IController} for sub-components of the component displayed in the diagram.
* Editor binding for the JavaFX-based {@link Partition} structure editor.
*
* @author hoelzl
* @author diewald
* @author barner
*/
public final class SubComponentController
extends LayoutedRectangularResizableContentController<Component> {
/** Constructor. */
public SubComponentController(IContentMVCBundle mvcb) {
super(mvcb, Component.class);
public final class PartitionStructureFXEditorBinding extends ModelEditorBindingBase<Partition> {
/** {@inheritDoc} */
@Override
public Class<? extends IEditorPart> getEditorClass() {
return PartitionStructureFXEditor.class;
}
/** {@inheritDoc} */
@Override
public Class<? extends IModelFactory> getModelFactory() {
return PartitionModelFactory.class;
}
/** {@inheritDoc} */
@Override
public Class<? extends IVisualFactory> getVisualFactory() {
return PartitionVisualFactory.class;
}
/** {@inheritDoc} */
@Override
protected void moveAnchorageToSideOffset(IContentAnchorageMVCBundle anchorage, Side side,
double offset) {
Object portObj = anchorage.getModel();
if(portObj instanceof Port) {
super.moveAnchorageToSideOffset(anchorage, side, offset);
public Class<? extends IControllerFactory> getControllerFactory() {
return PartitionControllerFactory.class;
}
/** {@inheritDoc} */
@Override
public String getLabel() {
return "Partition Structure (FX)";
}
/** {@inheritDoc} */
@Override
public int getPriority() {
return -100;
}
}
/*-------------------------------------------------------------------------+
| Copyright 2019 fortiss GmbH |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.af3.partition.ui.editor.fx;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IDiagramAnchorageMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.ILinkMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IContentAnchorageVisual;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IContentVisual;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IDiagramAnchorageVisual;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.ILinkVisual;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IVisualFactory;
import org.fortiss.af3.partition.model.MemoryArea;
import org.fortiss.af3.partition.model.MemoryAreaChannel;
import org.fortiss.af3.partition.model.Partition;
import org.fortiss.af3.partition.model.PartitionArchitecture;
import org.fortiss.af3.partition.model.PartitionChannel;
import org.fortiss.af3.partition.model.PartitionPort;
import org.fortiss.af3.partition.ui.editor.fx.visual.MemoryAreaVisual;
import org.fortiss.af3.partition.ui.editor.fx.visual.PartitionPortVisual;
import org.fortiss.af3.partition.ui.editor.fx.visual.PartitionVisual;
import org.fortiss.tooling.base.ui.editor.fx.visual.NamedLayoutedLineLinkVisual;
/**
* The implementation of the {@link IVisualFactory} for the {@link PartitionArchitecture} editor.
*
* @author barner
*/
public final class PartitionVisualFactory implements IVisualFactory {
/** {@inheritDoc} */
@Override
public IContentVisual createContentVisual(IContentMVCBundle modelBundle) {
Object modelObj = modelBundle.getModel();
if(modelObj instanceof Partition) {
return new PartitionVisual(modelBundle);
} else if(modelObj instanceof MemoryArea) {
return new MemoryAreaVisual(modelBundle);
}
return null;
}
/** {@inheritDoc} */
@Override
public IDiagramAnchorageVisual
createDiagramAnchorageVisual(IDiagramAnchorageMVCBundle modelBundle) {
return null;
}
/** {@inheritDoc} */
@Override
public IContentAnchorageVisual
createContentAnchorageVisual(IContentAnchorageMVCBundle modelBundle) {
Object anchorageObj = modelBundle.getModel();
// PartitionPort is a supertype of MemoryArea{Input, Output}Port
if(anchorageObj instanceof PartitionPort) {
return new PartitionPortVisual(modelBundle);
}
return null;
}
/** {@inheritDoc} */
@Override
public ILinkVisual createLinkVisual(ILinkMVCBundle modelBundle) {
Object linkObj = modelBundle.getModel();
if(linkObj instanceof PartitionChannel) {
return new NamedLayoutedLineLinkVisual<PartitionChannel>(modelBundle,
PartitionChannel.class);
} else if(linkObj instanceof MemoryAreaChannel) {
return new NamedLayoutedLineLinkVisual<MemoryAreaChannel>(modelBundle,
MemoryAreaChannel.class);
}
return null;
}
}
MemoryAreaVisual.java 3e844560e0d19d0688f6a3ca394afbea113b9f15 GREEN
PartitionPortVisual.java 9e1d26b30d6cc347a8b402ebb6f437693271e242 GREEN
PartitionVisual.java 7c673660857917c332e2d8e338f6262f8dce5939 GREEN
/*-------------------------------------------------------------------------+
| Copyright 2019 fortiss GmbH |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.af3.partition.ui.editor.fx.visual;
import static org.fortiss.af3.partition.ui.AF3PartitionUIActivator.PLUGIN_ID;
import static org.fortiss.af3.partition.ui.DefaultStyle.MEMORYAREA_BACKGROUND;
import static org.fortiss.tooling.common.ui.javafx.util.GraphicUtils.convertColor;
import static org.fortiss.tooling.common.ui.javafx.util.GraphicUtils.getFXImage;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IContentVisual;
import org.fortiss.af3.partition.model.MemoryArea;
import org.fortiss.af3.partition.model.PartitionArchitecture;
import org.fortiss.tooling.base.ui.editor.fx.visual.NamedLayoutedRectangularContentVisual;
import javafx.scene.image.Image;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
/**
* {@link IContentVisual} for {@link MemoryArea}s of the {@link PartitionArchitecture} displayed in
* the diagram.
*
* @author barner
*/
public final class MemoryAreaVisual extends NamedLayoutedRectangularContentVisual<MemoryArea> {
/** The fill color used by {@link MemoryArea}s. */
private static final Color MEMORYAREA_COLOR = convertColor(MEMORYAREA_BACKGROUND);
/** The icon image. */
private static final Image ICON = getFXImage(PLUGIN_ID, "/icons/memoryarea.png");
/** Constructor. */
public MemoryAreaVisual(IContentMVCBundle mvcb) {
super(mvcb, MemoryArea.class);
}
/** {@inheritDoc} */
@Override
protected Paint getFillColor() {
return MEMORYAREA_COLOR;
}
/** {@inheritDoc} */
@Override
protected Image getIcon() {
return ICON;
}
}
......@@ -13,42 +13,43 @@
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.af3.task.ui.editor.fx;
package org.fortiss.af3.partition.ui.editor.fx.visual;
import static javafx.scene.paint.Color.BLACK;
import static javafx.scene.paint.Color.WHITE;
import static org.conqat.lib.commons.reflect.ReflectionUtils.isInstanceOfAny;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IController;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentMVCBundle;
import org.fortiss.af3.task.model.Task;
import org.fortiss.af3.task.model.TaskPort;
import org.fortiss.tooling.base.ui.editor.fx.controller.LayoutedRectangularResizableContentController;
import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IContentVisual;
import org.fortiss.af3.partition.model.MemoryArea;
import org.fortiss.af3.partition.model.MemoryAreaInputPort;
import org.fortiss.af3.partition.model.Partition;
import org.fortiss.af3.partition.model.PartitionInputPort;
import org.fortiss.af3.partition.model.PartitionPort;
import org.fortiss.tooling.base.ui.editor.fx.visual.NamedLayoutedCircularAnchorageContentVisual;
import javafx.geometry.Side;
import javafx.scene.paint.Paint;
/**
* {@link IController} for {@link Task}s displayed in the diagram.
* {@link IContentVisual} for ports located on {@link Partition}s and {@link MemoryArea}s displayed
* in the diagram.
*
* @author munaro
* @author barner
*/
public class TaskController extends LayoutedRectangularResizableContentController<Task> {