|
|
|
@ -15,67 +15,103 @@ import java.util.Comparator;
|
|
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
|
|
public class MultiSelectionArrangement { |
|
|
|
|
private static final int DEFAULT_GAP = 10; |
|
|
|
|
|
|
|
|
|
private FormDesigner designer; |
|
|
|
|
private XLayoutContainer parent; // 当前选中的那些组件所在父容器
|
|
|
|
|
private List<XCreator> selectedCreators; |
|
|
|
|
private Rectangle rec; |
|
|
|
|
|
|
|
|
|
public MultiSelectionArrangement(FormDesigner designer) { |
|
|
|
|
this.designer = designer; |
|
|
|
|
update(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void leftAlign() { |
|
|
|
|
public void doArrangement(ArrangementType type) { |
|
|
|
|
doArrangement(type, DEFAULT_GAP); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void doArrangement(ArrangementType type, int gap) { |
|
|
|
|
updatePosition(); |
|
|
|
|
switch (type) { |
|
|
|
|
case RIGHT_ALIGN: |
|
|
|
|
rightAlign(); |
|
|
|
|
break; |
|
|
|
|
case TOP_ALIGN: |
|
|
|
|
topAlign(); |
|
|
|
|
break; |
|
|
|
|
case BOTTOM_ALIGN: |
|
|
|
|
bottomAlign(); |
|
|
|
|
break; |
|
|
|
|
case HORIZONTAL_CENTER_ALIGN: |
|
|
|
|
horizontalCenterAlign(); |
|
|
|
|
break; |
|
|
|
|
case VERTICAL_CENTER_ALIGN: |
|
|
|
|
verticalCenterAlign(); |
|
|
|
|
break; |
|
|
|
|
case HORIZONTAL_AUTO_DISTRIBUTION: |
|
|
|
|
horizontalAutoDistribution(); |
|
|
|
|
break; |
|
|
|
|
case HORIZONTAL_MANUAL_DISTRIBUTION: |
|
|
|
|
horizontalManualDistribution(gap); |
|
|
|
|
break; |
|
|
|
|
case VERTICAL_AUTO_DISTRIBUTION: |
|
|
|
|
verticalAutoDistribution(); |
|
|
|
|
break; |
|
|
|
|
case VERTICAL_MANUAL_DISTRIBUTION: |
|
|
|
|
verticalManualDistribution(gap); |
|
|
|
|
break; |
|
|
|
|
case LEFT_ALIGN: |
|
|
|
|
default: |
|
|
|
|
leftAlign(); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
updateModel(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void leftAlign() { |
|
|
|
|
for (XCreator creator : selectedCreators) { |
|
|
|
|
creator.setLocation(rec.x, creator.getY()); |
|
|
|
|
} |
|
|
|
|
update(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void rightAlign() { |
|
|
|
|
private void rightAlign() { |
|
|
|
|
for (XCreator creator : selectedCreators) { |
|
|
|
|
creator.setLocation(rec.x + rec.width - creator.getWidth(), creator.getY()); |
|
|
|
|
} |
|
|
|
|
update(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void topAlign() { |
|
|
|
|
private void topAlign() { |
|
|
|
|
for (XCreator creator : selectedCreators) { |
|
|
|
|
creator.setLocation(creator.getX(), rec.y); |
|
|
|
|
} |
|
|
|
|
update(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void bottomAlign() { |
|
|
|
|
private void bottomAlign() { |
|
|
|
|
for (XCreator creator : selectedCreators) { |
|
|
|
|
creator.setLocation(creator.getX(), rec.y + rec.height - creator.getHeight()); |
|
|
|
|
} |
|
|
|
|
update(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void horizontalCenterAlign() { |
|
|
|
|
private void horizontalCenterAlign() { |
|
|
|
|
for (XCreator creator : selectedCreators) { |
|
|
|
|
creator.setLocation(rec.x + rec.width / 2 - creator.getWidth() / 2, creator.getY()); |
|
|
|
|
} |
|
|
|
|
update(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void verticalCenterAlign() { |
|
|
|
|
private void verticalCenterAlign() { |
|
|
|
|
for (XCreator creator : selectedCreators) { |
|
|
|
|
creator.setLocation(creator.getX(), rec.y + rec.height / 2 - creator.getHeight() / 2); |
|
|
|
|
} |
|
|
|
|
update(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 水平分布,自动,间距由selectedCreators和border共同计算而来
|
|
|
|
|
public void horizontalAutoDistribution() { |
|
|
|
|
private void horizontalAutoDistribution() { |
|
|
|
|
sortHorizontal(); |
|
|
|
|
int[] gaps = calculateHorizontalGaps(); |
|
|
|
|
horizontalDistribution(gaps); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 水平分布,手动,传入一个间距,排列selectedCreators
|
|
|
|
|
public void horizontalManualDistribution(int gap) { |
|
|
|
|
private void horizontalManualDistribution(int gap) { |
|
|
|
|
sortHorizontal(); |
|
|
|
|
reSizeRecByHorizontal(gap); |
|
|
|
|
horizontalDistribution(fillGaps(gap, selectedCreators.size() - 1)); |
|
|
|
@ -87,7 +123,6 @@ public class MultiSelectionArrangement {
|
|
|
|
|
XCreator preCreator = selectedCreators.get(i - 1); |
|
|
|
|
creator.setLocation(preCreator.getX() + preCreator.getWidth() + gaps[i - 1], creator.getY()); |
|
|
|
|
} |
|
|
|
|
update(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void reSizeRecByHorizontal(int gap) { |
|
|
|
@ -145,13 +180,13 @@ public class MultiSelectionArrangement {
|
|
|
|
|
return calculateIntegerGaps(distanceBetweenHeadAndTailCreators - sum, gapCount); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void verticalAutoDistribution() { |
|
|
|
|
private void verticalAutoDistribution() { |
|
|
|
|
sortVertical(); |
|
|
|
|
int[] gaps = calculateVerticalGaps(); |
|
|
|
|
verticalDistribution(gaps); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void verticalManualDistribution(int gap) { |
|
|
|
|
private void verticalManualDistribution(int gap) { |
|
|
|
|
sortVertical(); |
|
|
|
|
reSizeRecByVertical(gap); |
|
|
|
|
verticalDistribution(fillGaps(gap, selectedCreators.size() - 1)); |
|
|
|
@ -163,7 +198,6 @@ public class MultiSelectionArrangement {
|
|
|
|
|
XCreator preCreator = selectedCreators.get(i - 1); |
|
|
|
|
creator.setLocation(creator.getX(), preCreator.getY() + preCreator.getHeight() + gaps[i - 1]); |
|
|
|
|
} |
|
|
|
|
update(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void reSizeRecByVertical(int gap) { |
|
|
|
@ -252,12 +286,15 @@ public class MultiSelectionArrangement {
|
|
|
|
|
return gaps; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void update() { |
|
|
|
|
private void updatePosition() { |
|
|
|
|
FormSelection selection = designer.getSelectionModel().getSelection(); |
|
|
|
|
this.selectedCreators = Arrays.asList(selection.getSelectedCreators()); |
|
|
|
|
this.rec = selection.getSelctionBounds(); |
|
|
|
|
this.parent = getParent(selection.getSelectedCreator()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void updateModel() { |
|
|
|
|
FormSelection selection = designer.getSelectionModel().getSelection(); |
|
|
|
|
XLayoutContainer parent = getParent(selection.getSelectedCreator()); |
|
|
|
|
if (parent != null) { |
|
|
|
|
// 这里要修改修改engine里面的对象才能成功保存,光修改设计器对象没用
|
|
|
|
|
WLayout wabs = parent.toData(); |
|
|
|
|