Android Open Source - E-Paper Command Manager






From Project

Back to project page E-Paper.

License

The source code is released under:

GNU General Public License

If you think the Android project E-Paper listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C) 2012 Marcelo Povoa <marcelogpovoa at gmail.com>
 *//from  w w  w. j  a va2  s  .  com
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.epaper.command;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;

import com.epaper.DrawingPath;
import java.util.*;

public class CommandManager
{
    private static float STROKE_DIST = 8.0f;
    private List<DrawingPath> currentStack;
    private List<Command> redoStack;
    private List<Command> undoStack;
    private Bitmap background;

    public CommandManager() {
        currentStack = Collections.synchronizedList(new ArrayList<DrawingPath>());
        redoStack = Collections.synchronizedList(new ArrayList<Command>());
        undoStack = Collections.synchronizedList(new ArrayList<Command>());
    }
    
    public CommandManager(Bitmap bg) {
        this();
        background = bg;
    }

    public void addCommand(Command command) {
        redoStack.clear();
        undoStack.add(command);
        command.apply(currentStack);
    }

    public Command undo() {
        final int undoLength = undoStack.size();

        if (undoLength <= 0)
            return null;

        Command undoCommand = undoStack.get(undoLength - 1);
        undoStack.remove(undoLength - 1);
        redoStack.add(undoCommand);

        undoCommand = undoCommand.invert();
        undoCommand.apply(currentStack);
        return undoCommand;
    }

    public Command redo() {
        final int redoLength = redoStack.toArray().length;

        if (redoLength <= 0)
            return null;

        Command redoCommand = redoStack.get(redoLength - 1);
        redoStack.remove(redoLength - 1);
        redoCommand.apply(currentStack);
        undoStack.add(redoCommand);

        return redoCommand;
    }

    public int currentStackLength() {
        return currentStack.toArray().length;
    }

    public void drawAll(Bitmap drawTo) {
        Canvas c = new Canvas(drawTo);
        
        if (background != null)
            c.drawBitmap(background, 0, 0, null);

        if (currentStack != null) {
            synchronized (currentStack) {
                final Iterator i = currentStack.iterator();

                while (i.hasNext()) {
                    final DrawingPath drawingPath = (DrawingPath) i.next();
                    drawingPath.draw(c);
                }
            }
        }
    }

    public boolean hasMoreRedo() {
        return redoStack.toArray().length > 0;
    }

    public boolean hasMoreUndo() {
        return undoStack.toArray().length > 0;
    }

    public boolean performErase(int h, int w, int x, int y) {
        Bitmap bitmapTmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas ctmp = new Canvas(bitmapTmp);
        
        bitmapTmp.eraseColor(0xFFFFFFFF);
        
        if (currentStack != null) {
            synchronized (currentStack) {
                for (int i = 0; i < currentStackLength(); i++) {
                    final DrawingPath drawingPath = currentStack.get(i);

                    /* Draw each path thicker and with an id color to
                       later check for erase action at x,y */
                    Paint iPaint = new Paint(drawingPath.paint);
                    iPaint.setColor(0xFF000000 | i);
                    iPaint.setStrokeWidth(iPaint.getStrokeWidth() + STROKE_DIST);
                    ctmp.drawPath(drawingPath.path, iPaint);
                }

                return removePath(x, y, bitmapTmp);
            }
        }
        return false;
    }

    public boolean removePath(int x, int y, Bitmap bitmap) {
        int pxy = bitmap.getPixel(x, y);
        
        if (pxy != -1) { /* Non-white -> there is a Path here */
            int idx = pxy ^ 0xFF000000;
            final DrawingPath drawingPath = currentStack.get(idx);
            addCommand(new EraseCommand(drawingPath));
            return true;
        }
        return false;
    }
    
    public boolean isEmpty() {
        return currentStack.isEmpty() && background == null;
    }
}




Java Source Code List

com.epaper.DrawingActivity.java
com.epaper.DrawingPath.java
com.epaper.DrawingSurface.java
com.epaper.FileManager.java
com.epaper.N2EpdController.java
com.epaper.brush.Brush.java
com.epaper.brush.CircleBrush.java
com.epaper.brush.IBrush.java
com.epaper.brush.PenBrush.java
com.epaper.command.CommandManager.java
com.epaper.command.Command.java
com.epaper.command.DrawCommand.java
com.epaper.command.EraseCommand.java
com.epaper.kaloer.filepicker.FilePickerActivity.java