/* JWildfire - an image and animation processor written in Java Copyright (C) 1995-2014 Andreas Maschke This is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this software; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jwildfire.create.tina.swing; import java.awt.event.ActionEvent; import javax.swing.JLabel; import javax.swing.JPanel; import org.jwildfire.create.tina.animate.AnimationService; import org.jwildfire.create.tina.base.DrawMode; import org.jwildfire.create.tina.base.EditPlane; import org.jwildfire.create.tina.base.XForm; import org.jwildfire.create.tina.base.motion.MotionCurve; public class XFormControlsDelegate extends AbstractControlsDelegate { public XFormControlsDelegate(TinaController pOwner, TinaControllerData pData, JPanel pRootPanel) { super(pOwner, pData, pRootPanel, true); setUpMotionControls(); } private String formatPropertyName(String pName) { return "xform property \"" + pName + "\""; } @Override public String getEditingTitle(JWFNumberField sender) { JLabel label = sender.getLinkedLabelControl(); return label != null ? formatPropertyName(sender.getLinkedLabelControl().getText()) : sender.getLinkedLabelControlName(); } @Override public MotionCurve getCurveToEdit(String pPropName) { return AnimationService.getPropertyCurve(owner.getCurrXForm(), pPropName); } @Override public double getInitialValue(String pPropName) { return AnimationService.getPropertyValue(owner.getCurrXForm(), pPropName); } @Override public boolean isEnabled() { return owner.getCurrXForm() != null; } public void setUpMotionControls() { boolean postTransform = isPostTransform(); switch (getEditPlane()) { case XY: data.affineC00REd.setMotionPropertyName(postTransform ? "xyPostCoeff00" : "xyCoeff00"); data.affineC01REd.setMotionPropertyName(postTransform ? "xyPostCoeff01" : "xyCoeff01"); data.affineC10REd.setMotionPropertyName(postTransform ? "xyPostCoeff10" : "xyCoeff10"); data.affineC11REd.setMotionPropertyName(postTransform ? "xyPostCoeff11" : "xyCoeff11"); data.affineC20REd.setMotionPropertyName(postTransform ? "xyPostCoeff20" : "xyCoeff20"); data.affineC21REd.setMotionPropertyName(postTransform ? "xyPostCoeff21" : "xyCoeff21"); break; case YZ: data.affineC00REd.setMotionPropertyName(postTransform ? "yzPostCoeff00" : "yzCoeff00"); data.affineC01REd.setMotionPropertyName(postTransform ? "yzPostCoeff01" : "yzCoeff01"); data.affineC10REd.setMotionPropertyName(postTransform ? "yzPostCoeff10" : "yzCoeff10"); data.affineC11REd.setMotionPropertyName(postTransform ? "yzPostCoeff11" : "yzCoeff11"); data.affineC20REd.setMotionPropertyName(postTransform ? "yzPostCoeff20" : "yzCoeff20"); data.affineC21REd.setMotionPropertyName(postTransform ? "yzPostCoeff21" : "yzCoeff21"); break; default: data.affineC00REd.setMotionPropertyName(postTransform ? "zxPostCoeff00" : "zxCoeff00"); data.affineC01REd.setMotionPropertyName(postTransform ? "zxPostCoeff01" : "zxCoeff01"); data.affineC10REd.setMotionPropertyName(postTransform ? "zxPostCoeff10" : "zxCoeff10"); data.affineC11REd.setMotionPropertyName(postTransform ? "zxPostCoeff11" : "zxCoeff11"); data.affineC20REd.setMotionPropertyName(postTransform ? "zxPostCoeff20" : "zxCoeff20"); data.affineC21REd.setMotionPropertyName(postTransform ? "zxPostCoeff21" : "zxCoeff21"); break; } } private EditPlane getEditPlane() { if (owner == null || owner.getCurrFlame() == null) return EditPlane.XY; else return owner.getCurrFlame().getEditPlane(); } public void enableControls(XForm xForm) { boolean enabled = xForm != null; data.affineRotateAmountREd.setEnabled(enabled); data.affineScaleAmountREd.setEnabled(enabled); data.affineMoveHorizAmountREd.setEnabled(enabled); data.affineMoveVertAmountREd.setEnabled(enabled); data.affineRotateLeftButton.setEnabled(enabled); data.affineRotateRightButton.setEnabled(enabled); data.affineEnlargeButton.setEnabled(enabled); data.affineShrinkButton.setEnabled(enabled); data.affineMoveUpButton.setEnabled(enabled); data.affineMoveLeftButton.setEnabled(enabled); data.affineMoveRightButton.setEnabled(enabled); data.affineMoveDownButton.setEnabled(enabled); data.affineFlipHorizontalButton.setEnabled(enabled); data.affineFlipVerticalButton.setEnabled(enabled); data.addTransformationButton.setEnabled(owner.getCurrFlame() != null); data.addLinkedTransformationButton.setEnabled(enabled && owner.getCurrLayer() != null && owner.getCurrLayer().getXForms().indexOf(xForm) >= 0); data.duplicateTransformationButton.setEnabled(enabled); data.deleteTransformationButton.setEnabled(enabled); data.addFinalTransformationButton.setEnabled(owner.getCurrFlame() != null); data.affineEditPostTransformButton.setEnabled(owner.getCurrFlame() != null); data.affineEditPostTransformSmallButton.setEnabled(owner.getCurrFlame() != null); data.toggleVariationsButton.setEnabled(owner.getCurrFlame() != null); enableControl(data.affineC00REd, !enabled); enableControl(data.affineC01REd, !enabled); enableControl(data.affineC10REd, !enabled); enableControl(data.affineC11REd, !enabled); enableControl(data.affineC20REd, !enabled); enableControl(data.affineC21REd, !enabled); enableControl(data.affineRotateLeftButton, data.affineRotateEditMotionCurveBtn, getRotateMotionCurveProperty(), !enabled); enableControl(data.affineEnlargeButton, data.affineScaleEditMotionCurveBtn, getScaleMotionCurveProperty(), !enabled); data.affineResetTransformButton.setEnabled(enabled); data.editTransformCaptionButton.setEnabled(enabled); data.transformationWeightREd.setEnabled(enabled); for (TinaNonlinearControlsRow rows : data.TinaNonlinearControlsRows) { rows.getNonlinearVarCmb().setEnabled(enabled); rows.getNonlinearVarREd().setEnabled(enabled); rows.getNonlinearParamsCmb().setEnabled(enabled); rows.getNonlinearParamsREd().setEnabled(enabled); // refreshing occurs in refreshXFormUI(): // rows.getNonlinearParamsLeftButton().setEnabled(enabled); // rows.getNonlinearParamsRightButton().setEnabled(enabled); } data.xFormColorREd.setEnabled(enabled); data.xFormColorSlider.setEnabled(enabled); data.xFormSymmetryREd.setEnabled(enabled); data.xFormSymmetrySlider.setEnabled(enabled); data.xFormMaterialREd.setEnabled(enabled); data.xFormMaterialSlider.setEnabled(enabled); data.xFormMaterialSpeedREd.setEnabled(enabled); data.xFormMaterialSpeedSlider.setEnabled(enabled); data.xFormModGammaREd.setEnabled(enabled); data.xFormModGammaSlider.setEnabled(enabled); data.xFormModGammaSpeedREd.setEnabled(enabled); data.xFormModGammaSpeedSlider.setEnabled(enabled); data.xFormModContrastREd.setEnabled(enabled); data.xFormModContrastSlider.setEnabled(enabled); data.xFormModContrastSpeedREd.setEnabled(enabled); data.xFormModContrastSpeedSlider.setEnabled(enabled); data.xFormModSaturationREd.setEnabled(enabled); data.xFormModSaturationSlider.setEnabled(enabled); data.xFormModSaturationSpeedREd.setEnabled(enabled); data.xFormModSaturationSpeedSlider.setEnabled(enabled); data.xFormModHueREd.setEnabled(enabled); data.xFormModHueSlider.setEnabled(enabled); data.xFormModHueSpeedREd.setEnabled(enabled); data.xFormModHueSpeedSlider.setEnabled(enabled); data.xFormOpacityREd.setEnabled(enabled && xForm.getDrawMode() == DrawMode.OPAQUE); data.xFormOpacitySlider.setEnabled(data.xFormOpacityREd.isEnabled()); data.xFormDrawModeCmb.setEnabled(enabled); data.relWeightsTable.setEnabled(enabled); enableRelWeightsControls(); } public void enableRelWeightsControls() { int selRow = data.relWeightsTable.getSelectedRow(); boolean enabled = data.relWeightsTable.isEnabled() && selRow >= 0 && owner.getCurrXForm() != null; data.relWeightsZeroButton.setEnabled(enabled); data.relWeightsOneButton.setEnabled(enabled); data.relWeightREd.setEnabled(enabled); } private boolean isPostTransform() { return data.affineEditPostTransformButton.isSelected(); } private String getRotateMotionCurveProperty() { switch (getEditPlane()) { case XY: return isPostTransform() ? "xyPostRotate" : "xyRotate"; case YZ: return isPostTransform() ? "yzPostRotate" : "yzRotate"; default: return isPostTransform() ? "zxPostRotate" : "zxRotate"; } } public void editRotateMotionCurve(ActionEvent e) { String propertyName = getRotateMotionCurveProperty(); editMotionCurve(propertyName, formatPropertyName(propertyName)); enableControl(data.affineRotateLeftButton, data.affineRotateEditMotionCurveBtn, propertyName, false); } private String getScaleMotionCurveProperty() { switch (getEditPlane()) { case XY: return isPostTransform() ? "xyPostScale" : "xyScale"; case YZ: return isPostTransform() ? "yzPostScale" : "yzScale"; default: return isPostTransform() ? "zxPostScale" : "zxScale"; } } public void editScaleMotionCurve(ActionEvent e) { String propertyName = getScaleMotionCurveProperty(); editMotionCurve(propertyName, formatPropertyName(propertyName)); enableControl(data.affineRotateLeftButton, data.affineScaleEditMotionCurveBtn, propertyName, false); } }