/*
* Copyright 2017 Laszlo Balazs-Csiki
*
* This file is part of Pixelitor. Pixelitor is free software: you
* can redistribute it and/or modify it under the terms of the GNU
* General Public License, version 3 as published by the Free
* Software Foundation.
*
* Pixelitor 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Pixelitor. If not, see <http://www.gnu.org/licenses/>.
*/
package pixelitor.filters.comp;
import pixelitor.AppLogic;
import pixelitor.Canvas;
import pixelitor.Composition;
import pixelitor.gui.ImageComponents;
import pixelitor.history.History;
import pixelitor.history.MultiLayerBackup;
import pixelitor.history.MultiLayerEdit;
import pixelitor.layers.ContentLayer;
import pixelitor.layers.LayerMask;
import pixelitor.selection.Selection;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.geom.AffineTransform;
import static pixelitor.Composition.ImageChangeActions.REPAINT;
public abstract class SimpleCompAction extends AbstractAction implements CompAction {
private final boolean changesCanvasDimensions;
SimpleCompAction(String name, boolean changesCanvasDimensions) {
this.changesCanvasDimensions = changesCanvasDimensions;
assert name != null;
putValue(Action.NAME, name);
}
@Override
public void actionPerformed(ActionEvent e) {
Composition comp = ImageComponents.getActiveCompOrNull();
process(comp);
}
@Override
public void process(Composition comp) {
MultiLayerBackup backup = new MultiLayerBackup(comp, getEditName(), changesCanvasDimensions);
Canvas canvas = comp.getCanvas();
AffineTransform canvasTX = createTransform(canvas);
if (comp.hasSelection()) {
Selection selection = comp.getSelection();
selection.transform(canvasTX);
}
comp.forEachLayer(layer -> {
if (layer instanceof ContentLayer) {
ContentLayer contentLayer = (ContentLayer) layer;
applyTx(contentLayer);
}
if (layer.hasMask()) {
LayerMask mask = layer.getMask();
applyTx(mask);
}
});
MultiLayerEdit edit = new MultiLayerEdit(comp, getEditName(), backup);
History.addEdit(edit);
if (changesCanvasDimensions) {
changeCanvas(comp);
AppLogic.activeCompSizeChanged(comp);
}
// Only after the shared canvas size was updated
comp.updateAllIconImages();
comp.imageChanged(REPAINT, true);
}
protected abstract void changeCanvas(Composition comp);
protected abstract String getEditName();
protected abstract void applyTx(ContentLayer contentLayer);
protected abstract AffineTransform createTransform(Canvas canvas);
}