com.mxgraph.view.mxLayoutManager Maven / Gradle / Ivy
package com.mxgraph.view;
import java.awt.Point;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import com.mxgraph.layout.mxIGraphLayout;
import com.mxgraph.model.mxGraphModel;
import com.mxgraph.model.mxIGraphModel;
import com.mxgraph.model.mxGraphModel.mxChildChange;
import com.mxgraph.model.mxGraphModel.mxGeometryChange;
import com.mxgraph.model.mxGraphModel.mxRootChange;
import com.mxgraph.model.mxGraphModel.mxTerminalChange;
import com.mxgraph.util.mxEvent;
import com.mxgraph.util.mxEventObject;
import com.mxgraph.util.mxEventSource;
import com.mxgraph.util.mxUndoableEdit;
import com.mxgraph.util.mxUtils;
import com.mxgraph.util.mxUndoableEdit.mxUndoableChange;
/**
* Implements a layout manager that updates the layout for a given transaction.
* The following example installs an automatic tree layout in a graph:
*
*
* new mxLayoutManager(graph) {
*
* mxCompactTreeLayout layout = new mxCompactTreeLayout(graph);
*
* public mxIGraphLayout getLayout(Object parent)
* {
* if (graph.getModel().getChildCount(parent) > 0) {
* return layout;
* }
* return null;
* }
* };
*
*
* This class fires the following event:
*
* mxEvent.LAYOUT_CELLS fires between begin- and endUpdate after all cells have
* been layouted in layoutCells. The cells
property contains all
* cells that have been passed to layoutCells.
*/
public class mxLayoutManager extends mxEventSource
{
/**
* Defines the type of the source or target terminal. The type is a string
* passed to mxCell.is to check if the rule applies to a cell.
*/
protected mxGraph graph;
/**
* Optional string that specifies the value of the attribute to be passed
* to mxCell.is to check if the rule applies to a cell. Default is true.
*/
protected boolean enabled = true;
/**
* Optional string that specifies the attributename to be passed to
* mxCell.is to check if the rule applies to a cell. Default is true.
*/
protected boolean bubbling = true;
/**
*
*/
protected mxIEventListener undoHandler = new mxIEventListener()
{
public void invoke(Object source, mxEventObject evt)
{
if (isEnabled())
{
beforeUndo((mxUndoableEdit) evt.getProperty("edit"));
}
}
};
/**
*
*/
protected mxIEventListener moveHandler = new mxIEventListener()
{
public void invoke(Object source, mxEventObject evt)
{
if (isEnabled())
{
cellsMoved((Object[]) evt.getProperty("cells"), (Point) evt
.getProperty("location"));
}
}
};
/**
*
*/
public mxLayoutManager(mxGraph graph)
{
setGraph(graph);
}
/**
* @return the enabled
*/
public boolean isEnabled()
{
return enabled;
}
/**
* @param value the enabled to set
*/
public void setEnabled(boolean value)
{
enabled = value;
}
/**
* @return the bubbling
*/
public boolean isBubbling()
{
return bubbling;
}
/**
* @param value the bubbling to set
*/
public void setBubbling(boolean value)
{
bubbling = value;
}
/**
* @return the graph
*/
public mxGraph getGraph()
{
return graph;
}
/**
* @param value the graph to set
*/
public void setGraph(mxGraph value)
{
if (graph != null)
{
mxIGraphModel model = graph.getModel();
model.removeListener(undoHandler);
graph.removeListener(moveHandler);
}
graph = value;
if (graph != null)
{
mxIGraphModel model = graph.getModel();
model.addListener(mxEvent.BEFORE_UNDO, undoHandler);
graph.addListener(mxEvent.MOVE_CELLS, moveHandler);
}
}
/**
*
*/
protected mxIGraphLayout getLayout(Object parent)
{
return null;
}
/**
*
*/
protected void cellsMoved(Object[] cells, Point location)
{
if (cells != null && location != null)
{
mxIGraphModel model = getGraph().getModel();
// Checks if a layout exists to take care of the moving
for (int i = 0; i < cells.length; i++)
{
mxIGraphLayout layout = getLayout(model.getParent(cells[i]));
if (layout != null)
{
layout.moveCell(cells[i], location.x, location.y);
}
}
}
}
/**
*
*/
protected void beforeUndo(mxUndoableEdit edit)
{
Collection
© 2015 - 2025 Weber Informatics LLC | Privacy Policy