/** * Выравнивание выбранных компонентов в выбранном направлении. * * @param dimension направление выравнивания * @param alignment требуемое выравнивание * @throws java.lang.Exception */ public void align(int dimension, int alignment) throws Exception { if (selected != null && selected.size() > 1) { // выбрано по крайней мере 2 компонента assert selected.size() == selectedConstraints.size(); assert container != null; Dimension parentSize = container.getBeanInstance().getSize(); if (dimension == 0) { // выравнирание в горизонтальном направлении if (alignment == LayoutConstants.LEADING) { // выравнивание влево // ищем самый левый компонент MarginConstraints first = findLeftCompConstraints(parentSize.width); int leftNew = calcLeft(first, parentSize.width); // новая левая координата // выравниваем остальные компоненты по найденому for (int i = 0; i < selectedConstraints.size(); i++) { MarginLayoutConstraints mlc = selectedConstraints.get(i); MarginConstraints mc = mlc.getConstraintsObject(); RADVisualComponent<?> vc = selected.get(i); if (mc != first) { int leftOld = calcLeft(mc, parentSize.width); // старая левая координата int rightOld = calcRight(mc, parentSize.width); // старая правая координата if (mc.getLeft() != null) { Margin newLeft = mc.getLeft().copy(); newLeft.setPlainValue(leftNew, parentSize.width); // выравниваем левую координату mlc.getMLeft().setValue(newLeft); if (mc.getRight() != null) { // ширина не используется. нужно устанавливать правую координату Margin newRight = mc.getRight().copy(); newRight.setPlainValue( rightOld + (leftOld - leftNew), parentSize.width); // изменяем правую координату mlc.getMRight().setValue(newRight); } } else { Margin newRight = mc.getRight().copy(); newRight.setPlainValue( rightOld + (leftOld - leftNew), parentSize.width); // изменяем правую координату mlc.getMRight().setValue(newRight); } } // отметить компонент как invalid vc.getBeanInstance().invalidate(); } } if (alignment == LayoutConstants.TRAILING) { // выравнивание вправо // ищем самый правый компонент MarginConstraints first = findRightCompConstraints(parentSize.width); int rightNew = calcRight(first, parentSize.width); // новая правая координата // выравниваем остальные компоненты по найденому for (int i = 0; i < selectedConstraints.size(); i++) { MarginLayoutConstraints mlc = selectedConstraints.get(i); MarginConstraints mc = mlc.getConstraintsObject(); RADVisualComponent<?> vc = selected.get(i); if (mc != first) { int leftOld = calcLeft(mc, parentSize.width); // старая левая координата int rightOld = calcRight(mc, parentSize.width); // старая правая координата // выравнивание if (mc.getLeft() != null) { Margin newLeft = mc.getLeft().copy(); newLeft.setPlainValue( leftOld + (rightOld - rightNew), parentSize.width); // изменяем левую координату mlc.getMLeft().setValue(newLeft); if (mc.getRight() != null) // ширина не используется { Margin newRight = mc.getRight().copy(); newRight.setPlainValue( rightNew, parentSize.width); // выравниваем правая координату // } mlc.getMRight().setValue(newRight); } } else { Margin newRight = mc.getRight().copy(); newRight.setPlainValue(rightNew, parentSize.width); // выравниваем правая координату mlc.getMRight().setValue(newRight); } } // отметить компонент как invalid vc.getBeanInstance().invalidate(); } } if (alignment == LayoutConstants.CENTER) { // выравнивание по центру // ищем самый левый компонент MarginConstraints firstL = findLeftCompConstraints(parentSize.width); int leftNew = calcLeft(firstL, parentSize.width); // новая левая координата // ищем самый правый компонент MarginConstraints firstR = findRightCompConstraints(parentSize.width); int rightNew = calcRight(firstR, parentSize.width); // новая правая координата; int centerNew = (parentSize.width - rightNew + leftNew) / 2; // новый центр // выравниваем остальные компоненты по найденому for (int i = 0; i < selectedConstraints.size(); i++) { MarginLayoutConstraints mlc = selectedConstraints.get(i); MarginConstraints mc = mlc.getConstraintsObject(); RADVisualComponent<?> vc = selected.get(i); int leftOld = calcLeft(mc, parentSize.width); // старая левая координата int rightOld = calcRight(mc, parentSize.width); // старая правая координата int centerOld = (parentSize.width - rightOld + leftOld) / 2; // выравнивание int sm = centerNew - centerOld; if (mc.getLeft() != null) { Margin newLeft = mc.getLeft().copy(); newLeft.setPlainValue(leftOld + sm, parentSize.width); // изменяем левую координату mlc.getMLeft().setValue(newLeft); if (mc.getRight() != null) // ширина не используется { Margin newRight = mc.getRight().copy(); newRight.setPlainValue( rightOld - sm, parentSize.width); // выравниваем правая координату mlc.getMRight().setValue(newRight); } } else { Margin newRight = mc.getRight().copy(); newRight.setPlainValue( rightOld - sm, parentSize.width); // выравниваем правая координату mlc.getMRight().setValue(newRight); } // отметить компонент как invalid vc.getBeanInstance().invalidate(); } } } if (dimension == 1) { // выравнивание в вертикальном направлении if (alignment == LayoutConstants.LEADING) { // выравнивание вверх // ищем самый верхний компонент MarginConstraints first = findTopCompConstraints(parentSize.height); int topNew = calcTop(first, parentSize.height); // новая верхняя координата // выравниваем остальные компоненты по найденому for (int i = 0; i < selectedConstraints.size(); i++) { MarginLayoutConstraints mlc = selectedConstraints.get(i); MarginConstraints mc = mlc.getConstraintsObject(); RADVisualComponent<?> vc = selected.get(i); if (mc != first) { int topOld = calcTop(mc, parentSize.height); // старая левая координата int bottomOld = calcBottom(mc, parentSize.height); // старая правая координата if (mc.getTop() != null) { Margin newTop = mc.getTop().copy(); newTop.setPlainValue(topNew, parentSize.height); // выравниваем левую координату mlc.getMTop().setValue(newTop); if (mc.getBottom() != null) { // ширина не используется. нужно устанавливать правую координату Margin newBottom = mc.getBottom().copy(); newBottom.setPlainValue( bottomOld + (topOld - topNew), parentSize.height); // изменяем правую координату mlc.getMBottom().setValue(newBottom); } } else { Margin newBottom = mc.getBottom().copy(); newBottom.setPlainValue( bottomOld + (topOld - topNew), parentSize.height); // изменяем правую координату mlc.getMBottom().setValue(newBottom); } } // отметить компонент как invalid vc.getBeanInstance().invalidate(); } } if (alignment == LayoutConstants.TRAILING) { // выравнивание вниз // ищем самый нижный компонент MarginConstraints first = findBottomCompConstraints(parentSize.height); int bottomNew = calcBottom(first, parentSize.height); // новая нижняя координата // выравниваем остальные компоненты по найденому for (int i = 0; i < selectedConstraints.size(); i++) { MarginLayoutConstraints mlc = selectedConstraints.get(i); MarginConstraints mc = mlc.getConstraintsObject(); RADVisualComponent<?> vc = selected.get(i); if (mc != null) { int topOld = calcTop(mc, parentSize.height); // старая верхняя координата int bottomOld = calcBottom(mc, parentSize.height); // старая нижняя координата // выравнивание if (mc.getTop() != null) { Margin newTop = mc.getTop().copy(); newTop.setPlainValue( topOld + (bottomOld - bottomNew), parentSize.height); // изменяем левую координату mlc.getMTop().setValue(newTop); if (mc.getBottom() != null) { // ширина не используется Margin newBottom = mc.getBottom().copy(); newBottom.setPlainValue( bottomNew, parentSize.height); // выравниваем правая координату mlc.getMBottom().setValue(newBottom); } } else { Margin newBottom = mc.getBottom().copy(); newBottom.setPlainValue( bottomNew, parentSize.height); // выравниваем правая координату mlc.getMBottom().setValue(newBottom); } } // отметить компонент как invalid vc.getBeanInstance().invalidate(); } } if (alignment == LayoutConstants.CENTER) { // выравнивание по центру // ищем самый верхний компонент MarginConstraints firstT = findTopCompConstraints(parentSize.height); int topNew = calcTop(firstT, parentSize.height); // новая верхняя координата // ищем самый нижний компонент MarginConstraints firstR = findBottomCompConstraints(parentSize.height); int bottomNew = calcBottom(firstR, parentSize.height); // новая верхняя координата int centerNew = (parentSize.height - bottomNew + topNew) / 2; // новый центр // выравниваем остальные компоненты по найденому for (int i = 0; i < selectedConstraints.size(); i++) { MarginLayoutConstraints mlc = selectedConstraints.get(i); MarginConstraints mc = mlc.getConstraintsObject(); RADVisualComponent<?> vc = selected.get(i); int topOld = calcTop(mc, parentSize.height); // старая верхняя координата int bottomOld = calcBottom(mc, parentSize.height); // старая нижняя координата int centerOld = (parentSize.height - bottomOld + topOld) / 2; // выравнивание int sm = centerNew - centerOld; if (mc.getTop() != null) { Margin newTop = mc.getTop().copy(); newTop.setPlainValue(topOld + sm, parentSize.height); // изменяем верхняя координату mlc.getMTop().setValue(newTop); if (mc.getBottom() != null) // ширина не используется { Margin newBottom = mc.getBottom().copy(); newBottom.setPlainValue( bottomOld - sm, parentSize.height); // выравниваем нижняя координату mlc.getMBottom().setValue(newBottom); } } else { Margin newBottom = mc.getBottom().copy(); newBottom.setPlainValue( bottomOld - sm, parentSize.height); // выравниваем нижняя координату mlc.getMBottom().setValue(newBottom); } // отметить компонент как invalid vc.getBeanInstance().invalidate(); } } } } }
/** * Установка или сброс ширины/высоты компонента * * @param dimension направление: 0 - ширина, 1 - высота * @throws java.lang.Exception */ public void resize(int dimension) throws Exception { if (selectedConstraints != null && !selectedConstraints.isEmpty()) { // выбрано по крайней мере 1 компонент assert selectedConstraints.size() == selected.size(); for (int i = 0; i < selectedConstraints.size(); i++) { MarginLayoutConstraints mlc = selectedConstraints.get(i); MarginConstraints mc = mlc.getConstraintsObject(); RADVisualComponent<?> vc = selected.get(i); Dimension parentSize = parentSize(vc); if (dimension == 0) { // горизонталь if (mc.getWidth() != null) { // Ширина используется. Cбрасываем. int w = mc.getWidth().calcPlainValue(parentSize.width); if (mc.getLeft() == null) { assert mc.getRight() != null; // Устанавливаем лево Margin newLeft = new Margin(0, true); newLeft.setPlainValue( parentSize.width - mc.getRight().calcPlainValue(parentSize.width) - w, parentSize.width); mlc.getMLeft().setValue(newLeft); } else { // Устанавливаем право Margin oldRight = mc.getRight(); Margin newRight = new Margin(0, oldRight != null ? oldRight.absolute : true); newRight.setPlainValue( parentSize.width - mc.getLeft().calcPlainValue(parentSize.width) - w, parentSize.width); if (!newRight.isEqual(oldRight)) { mlc.getMRight().setValue(newRight); } } // сбрасываем ширину mlc.getMWidth().setValue(null); } else { // Ширина не используется. Устанавливаем int left = mc.getLeft().calcPlainValue(parentSize.width); // считываем левую координату int right = mc.getRight().calcPlainValue(parentSize.width); // считываем правую координату int w = parentSize.width - left - right; // устанавливаем ширину mlc.getMWidth().setValue(new Margin(w, true)); mlc.getMRight().setValue(null); } } else if (dimension == 1) { if (mc.getHeight() != null) { // высота используется. сбрасываем int h = mc.getHeight().calcPlainValue(parentSize.height); // считываем высоту if (mc.getTop() == null) { Margin newTop = new Margin(0, true); newTop.setPlainValue( parentSize.height - mc.getBottom().calcPlainValue(parentSize.height) - h, parentSize.height); mlc.getMTop().setValue(newTop); } else { Margin oldBottom = mc.getBottom(); Margin newBottom = new Margin(0, oldBottom != null ? oldBottom.absolute : true); newBottom.setPlainValue( parentSize.height - mc.getTop().calcPlainValue(parentSize.height) - h, parentSize.height); if (!newBottom.isEqual(oldBottom)) { mlc.getMBottom().setValue(newBottom); } } // сбрасываем высоту mlc.getMHeight().setValue(null); } else { // Высота не используется. Устанавливаем assert mc.getTop() != null && mc.getBottom() != null; int top = mc.getTop().calcPlainValue(parentSize.height); // считываем верхнюю координату int bottom = mc.getBottom().calcPlainValue(parentSize.height); // считываем нижнюю координату int h = parentSize.height - top - bottom; // устанавливаем высоту mlc.getMHeight().setValue(new Margin(h, true)); mlc.getMBottom().setValue(null); } } // отметить компонент как invalid vc.getBeanInstance().invalidate(); } } }