|
|
|
package com.fr.design.mainframe;
|
|
|
|
|
|
|
|
import com.fr.design.designer.creator.XCreator;
|
|
|
|
import com.fr.design.designer.creator.XCreatorUtils;
|
|
|
|
import com.fr.design.designer.creator.XLayoutContainer;
|
|
|
|
import com.fr.design.designer.creator.XWFitLayout;
|
|
|
|
import com.fr.design.designer.creator.XWParameterLayout;
|
|
|
|
import com.fr.design.designer.creator.cardlayout.XWCardTagLayout;
|
|
|
|
import com.fr.form.ui.container.WLayout;
|
|
|
|
|
|
|
|
import java.awt.Rectangle;
|
|
|
|
import java.util.Arrays;
|
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.Comparator;
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
public class MultiSelectionArrangement {
|
|
|
|
private FormDesigner designer;
|
|
|
|
private XLayoutContainer parent; // 当前选中的那些组件所在父容器
|
|
|
|
private List<XCreator> selectedCreators;
|
|
|
|
private Rectangle rec;
|
|
|
|
|
|
|
|
public MultiSelectionArrangement(FormDesigner designer) {
|
|
|
|
this.designer = designer;
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void leftAlign() {
|
|
|
|
for (XCreator creator : selectedCreators) {
|
|
|
|
creator.setLocation(rec.x, creator.getY());
|
|
|
|
}
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void rightAlign() {
|
|
|
|
for (XCreator creator : selectedCreators) {
|
|
|
|
creator.setLocation(rec.x + rec.width - creator.getWidth(), creator.getY());
|
|
|
|
}
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void topAlign() {
|
|
|
|
for (XCreator creator : selectedCreators) {
|
|
|
|
creator.setLocation(creator.getX(), rec.y);
|
|
|
|
}
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void bottomAlign() {
|
|
|
|
for (XCreator creator : selectedCreators) {
|
|
|
|
creator.setLocation(creator.getX(), rec.y + rec.height - creator.getHeight());
|
|
|
|
}
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void horizontalCenterAlign() {
|
|
|
|
for (XCreator creator : selectedCreators) {
|
|
|
|
creator.setLocation(rec.x + rec.width / 2 - creator.getWidth() / 2, creator.getY());
|
|
|
|
}
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void verticalCenterAlign() {
|
|
|
|
for (XCreator creator : selectedCreators) {
|
|
|
|
creator.setLocation(creator.getX(), rec.y + rec.height / 2 - creator.getHeight() / 2);
|
|
|
|
}
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
|
|
|
// 水平分布,自动,间距由selectedCreators和border共同计算而来
|
|
|
|
public void horizontalAutoDistribution() {
|
|
|
|
sortHorizontal();
|
|
|
|
int gap = calculateHorizontalGap();
|
|
|
|
horizontalDistribution(gap);
|
|
|
|
}
|
|
|
|
|
|
|
|
// 水平分布,手动,传入一个间距,排列selectedCreators
|
|
|
|
public void horizontalManualDistribution(int gap) {
|
|
|
|
reSizeRecByHorizontal(gap);
|
|
|
|
horizontalDistribution(gap);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void horizontalDistribution(int gap) {
|
|
|
|
for (int i = 1; i < selectedCreators.size() - 1; i++) {
|
|
|
|
XCreator creator = selectedCreators.get(i);
|
|
|
|
XCreator preCreator = selectedCreators.get(i - 1);
|
|
|
|
creator.setLocation(preCreator.getX() + preCreator.getWidth() + gap, creator.getY());
|
|
|
|
}
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void reSizeRecByHorizontal(int gap) {
|
|
|
|
int width = 0;
|
|
|
|
for (XCreator creator : selectedCreators) {
|
|
|
|
width += creator.getWidth();
|
|
|
|
}
|
|
|
|
width += (selectedCreators.size() - 1) * gap;
|
|
|
|
rec.x = rec.x + (rec.width - width) / 2;
|
|
|
|
rec.width = width;
|
|
|
|
XCreator first = selectedCreators.get(0);
|
|
|
|
first.setLocation(rec.x, first.getY());
|
|
|
|
XCreator last = selectedCreators.get(selectedCreators.size() - 1);
|
|
|
|
last.setLocation(rec.x + rec.width - last.getWidth(), last.getY());
|
|
|
|
}
|
|
|
|
|
|
|
|
private void sortHorizontal() {
|
|
|
|
Collections.sort(selectedCreators, new Comparator<XCreator>() {
|
|
|
|
@Override
|
|
|
|
public int compare(XCreator o1, XCreator o2) {
|
|
|
|
int diffX = o1.getX() - o2.getX();
|
|
|
|
if (diffX > 0) {
|
|
|
|
return 1;
|
|
|
|
} else if (diffX < 0) {
|
|
|
|
return -1;
|
|
|
|
} else {
|
|
|
|
int diffY = o1.getY() - o2.getY();
|
|
|
|
if (diffY > 0) {
|
|
|
|
return 1;
|
|
|
|
} else if (diffY < 0) {
|
|
|
|
return -1;
|
|
|
|
} else {
|
|
|
|
int diffZOrder = o1.getParent().getComponentZOrder(o1) - o2.getParent().getComponentZOrder(o2);
|
|
|
|
if (diffZOrder > 0) {
|
|
|
|
return -1;
|
|
|
|
} else {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// 计算selectedCreators的均分间距
|
|
|
|
private int calculateHorizontalGap() {
|
|
|
|
int sum = 0;
|
|
|
|
for (XCreator creator : selectedCreators) {
|
|
|
|
sum += creator.getWidth();
|
|
|
|
}
|
|
|
|
XCreator head = selectedCreators.get(0);
|
|
|
|
XCreator tail = selectedCreators.get(selectedCreators.size() - 1);
|
|
|
|
int distanceBetweenHeadAndTailCreators = Math.abs(head.getX() - tail.getX()) + tail.getWidth();
|
|
|
|
return (distanceBetweenHeadAndTailCreators - sum) / (selectedCreators.size() - 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void verticalAutoDistribution() {
|
|
|
|
sortVertical();
|
|
|
|
int gap = calculateVerticalGap();
|
|
|
|
verticalDistribution(gap);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void verticalManualDistribution(int gap) {
|
|
|
|
reSizeRecByVertical(gap);
|
|
|
|
verticalDistribution(gap);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void verticalDistribution(int gap) {
|
|
|
|
for (int i = 1; i < selectedCreators.size() - 1; i++) {
|
|
|
|
XCreator creator = selectedCreators.get(i);
|
|
|
|
XCreator preCreator = selectedCreators.get(i - 1);
|
|
|
|
creator.setLocation(creator.getX(), preCreator.getY() + preCreator.getHeight() + gap);
|
|
|
|
}
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void reSizeRecByVertical(int gap) {
|
|
|
|
int height = 0;
|
|
|
|
for (XCreator creator : selectedCreators) {
|
|
|
|
height += creator.getHeight();
|
|
|
|
}
|
|
|
|
height += (selectedCreators.size() - 1) * gap;
|
|
|
|
rec.y = rec.y + (rec.height - height) / 2;
|
|
|
|
rec.height = height;
|
|
|
|
XCreator first = selectedCreators.get(0);
|
|
|
|
first.setLocation(first.getX(), rec.y);
|
|
|
|
XCreator last = selectedCreators.get(selectedCreators.size() - 1);
|
|
|
|
last.setLocation(last.getX(), rec.y + rec.height - last.getHeight());
|
|
|
|
}
|
|
|
|
|
|
|
|
private void sortVertical() {
|
|
|
|
Collections.sort(selectedCreators, new Comparator<XCreator>() {
|
|
|
|
@Override
|
|
|
|
public int compare(XCreator o1, XCreator o2) {
|
|
|
|
int diffY = o1.getY() - o2.getY();
|
|
|
|
if (diffY > 0) {
|
|
|
|
return 1;
|
|
|
|
} else if (diffY < 0) {
|
|
|
|
return -1;
|
|
|
|
} else {
|
|
|
|
int diffX = o1.getX() - o2.getX();
|
|
|
|
if (diffX > 0) {
|
|
|
|
return 1;
|
|
|
|
} else if (diffX < 0) {
|
|
|
|
return -1;
|
|
|
|
} else {
|
|
|
|
int diffZOrder = o1.getParent().getComponentZOrder(o1) - o2.getParent().getComponentZOrder(o2);
|
|
|
|
if (diffZOrder > 0) {
|
|
|
|
return -1;
|
|
|
|
} else {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
private int calculateVerticalGap() {
|
|
|
|
int sum = 0;
|
|
|
|
for (XCreator creator : selectedCreators) {
|
|
|
|
sum += creator.getHeight();
|
|
|
|
}
|
|
|
|
XCreator head = selectedCreators.get(0);
|
|
|
|
XCreator tail = selectedCreators.get(selectedCreators.size() - 1);
|
|
|
|
int distanceBetweenHeadAndTailCreators = Math.abs(head.getY() - tail.getY()) + tail.getHeight();
|
|
|
|
return (distanceBetweenHeadAndTailCreators - sum) / (selectedCreators.size() - 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void update() {
|
|
|
|
FormSelection selection = designer.getSelectionModel().getSelection();
|
|
|
|
this.selectedCreators = Arrays.asList(selection.getSelectedCreators());
|
|
|
|
this.rec = selection.getSelctionBounds();
|
|
|
|
this.parent = getParent(selection.getSelectedCreator());
|
|
|
|
|
|
|
|
if (parent != null) {
|
|
|
|
// 这里要修改修改engine里面的对象才能成功保存,光修改设计器对象没用
|
|
|
|
WLayout wabs = parent.toData();
|
|
|
|
for (XCreator creator : selectedCreators) {
|
|
|
|
wabs.setBounds(creator.toData(), creator.getBounds());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private XLayoutContainer getParent(XCreator source) {
|
|
|
|
if(source.acceptType(XWCardTagLayout.class)){
|
|
|
|
return (XLayoutContainer)source.getParent();
|
|
|
|
}
|
|
|
|
XLayoutContainer container = XCreatorUtils.getParentXLayoutContainer(source);
|
|
|
|
if (source.acceptType(XWFitLayout.class) || source.acceptType(XWParameterLayout.class)) {
|
|
|
|
container = null;
|
|
|
|
}
|
|
|
|
return container;
|
|
|
|
}
|
|
|
|
}
|