// The UMLet source code is distributed under the terms of the GPL; see license.txt
//Class by A.Mueller Oct.05
package com.umlet.element.base;
import com.umlet.control.AddEntity;
import com.umlet.control.Command;
import com.umlet.control.Constants;
import com.umlet.control.Controller;
import com.umlet.control.MoveLinePoint;
import com.umlet.control.Selector;
import com.umlet.control.StickingPolygon;
import com.umlet.control.Umlet;
import com.umlet.control.UniversalListener;
import com.umlet.element.base.detail.RelationLinePoint;
import java.util.Iterator;
import java.util.Vector;
import java.util.Enumeration;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
public class Group extends Entity
{
private Vector<Entity> entities;
//after adding all elements to a group the function adjustSize has to be called!
public Group()
{
super();
this.entities = new Vector<Entity>();
}
/**
* Erstellt einen neue Gruppe
*
*/
public void groupSelected()
{
Vector<Entity> ents = Selector.getInstance().getSelectedEntities();
if(ents.isEmpty())
return;
for (Iterator<Entity> it = ents.iterator(); it.hasNext();)
this.addMember(it.next());
adjustSize();
Selector.getInstance().deselectAll();
Selector.getInstance().selectXXX(this);
Controller.getInstance().executeCommandWithoutUndo(
new AddEntity(this, this.getLocation().x, this
.getLocation().y));
}
public void ungroup()
{
for (int i = 0; i < entities.size(); i++)
{
entities.get(i).setGroup(null);
entities.get(i).addMouseListener(UniversalListener.getInstance());
entities.get(i).addMouseMotionListener(UniversalListener.getInstance());
}
Umlet.getInstance().getPanel().remove(this);
}
public Vector<Entity> getMembers()
{
return entities;
}
public void addMember(Entity member)
{
this.entities.add(member);
member.setGroup(this);
member.removeMouseListener(
UniversalListener.getInstance());
member.removeMouseMotionListener(
UniversalListener.getInstance());
}
public void paint(Graphics g)
{
if (this.isSelected())
{
Graphics2D g2 = (Graphics2D) g;
Constants.getFRC(g2);
g2.setColor(java.awt.Color.green);
g2.setStroke(Constants.getStroke(1, 1));
g2.drawRect(0, 0, this.getWidth() - 1, this.getHeight() - 1);
g2.setStroke(Constants.getStroke(0, 1));
}
}
public void adjustSize()
{
if (entities.isEmpty())
return;
Enumeration e = entities.elements();
int maxX = 0;
int maxY = 0;
int minX = 0;
int minY = 0;
boolean first = true;
while (e.hasMoreElements())
{
Entity temp = (Entity) e.nextElement();
if(!first)
{
maxX = Math.max(temp.getX() + temp.getWidth(), maxX);
maxY = Math.max(temp.getY() + temp.getHeight(), maxY);
minX = Math.min(temp.getX(), minX);
minY = Math.min(temp.getY(), minY);
}
else
{
first = false;
maxX = temp.getX() + temp.getWidth();
maxY = temp.getY() + temp.getHeight();
minX = temp.getX();
minY =temp.getY();
}
}
this.setLocation(minX, minY);
this.setSize((maxX - minX), (maxY - minY));
}
@Override
public StickingPolygon getStickingBorder()
{
return null;
}
@Override
public Entity CloneFromMe()
{
Selector.getInstance().deselectAll();
Group temp = new Group();
for (Entity e : this.entities)
{
Entity clone = e.CloneFromMe();
Command cmd;
int MAIN_UNIT = Umlet.getInstance().getMainUnit();
if (e.getParent() == Umlet.getInstance().getPalettePanel()) {
Point viewp = Umlet.getInstance().getScrollPaneMain()
.getViewport().getViewPosition();
cmd = new AddEntity(clone,
viewp.x - (viewp.x % MAIN_UNIT) + e.getX() - this.getX() + MAIN_UNIT * 2,
viewp.y - (viewp.y % MAIN_UNIT) + e.getY() - this.getY() + MAIN_UNIT * 2);
} else {
cmd = new AddEntity(clone, e.getX() + MAIN_UNIT * 2, e.getY()
+ MAIN_UNIT * 2);
}
clone.setState(e.getState());
Controller.getInstance().executeCommandWithoutUndo(cmd);
temp.addMember(clone);
}
temp.adjustSize();
return temp;
}
public int getPossibleResizeDirections() { //LME: deny resizing of groups
return 0;
}
}
|