Handles

handles.pde
/**
 * Handles.
 *
 * Click and drag the white boxes to change their position.
 */
bool firstMousePress = false;
class Handle {
public:
    int x, y;
    int boxx, boxy;
    int stretch;
    int size;
    bool over;
    bool press;
    bool locked = false;
    bool otherslocked = false;
    ArrayList<Handle>* others;
    Handle(int ix, int iy, int il, int is, ArrayList<Handle>* o) {
        x = ix;
        y = iy;
        stretch = il;
        size = is;
        boxx = x + stretch - size / 2;
        boxy = y - size / 2;
        others = o;
        over = false;
        press = false;
    }
    void update() {
        boxx = x + stretch;
        boxy = y - size / 2;
        for (int i = 0; i < others->size(); i++) {
            if (others->get(i)->locked == true) {
                otherslocked = true;
                break;
            } else {
                otherslocked = false;
            }
        }
        if (otherslocked == false) {
            overEvent();
            pressEvent();
        }
        if (press) {
            stretch = lock(mouseX - width / 2 - size / 2, 0, width / 2 - size - 1);
        }
    }
    void overEvent() {
        if (overRect(boxx, boxy, size, size)) {
            over = true;
        } else {
            over = false;
        }
    }
    void pressEvent() {
        if ((over && firstMousePress) || locked) {
            press = true;
            locked = true;
        } else {
            press = false;
        }
    }
    void releaseEvent() {
        locked = false;
    }
    void display() {
        line(x, y, x + stretch, y);
        fill(255);
        stroke(0);
        rect(boxx, boxy, size, size);
        if (over || press) {
            line(boxx, boxy, boxx + size, boxy + size);
            line(boxx, boxy + size, boxx + size, boxy);
        }
    }
    bool overRect(int rx, int ry, int rw, int rh) {
        if (mouseX >= rx && mouseX <= rx + rw &&
            mouseY >= ry && mouseY <= ry + rh) {
            return true;
        } else {
            return false;
        }
    }
    int lock(int val, int minv, int maxv) {
        return min(max(val, minv), maxv);
    }
};
ArrayList<Handle> handles;
void setup() {
    size(640, 360);
    int num = height / 15;
    int hsize = 10;
    handles = ArrayList<Handle>();
    for (int i = 0; i < num; i++) {
        handles.add(new Handle(width / 2, 10 + i * 15, 50 - hsize / 2, 10, &handles));
    }
}
void draw() {
    background(153);
    for (int i = 0; i < handles.size(); i++) {
        Handle* h = handles.get(i);
        h->update();
        h->display();
    }
    fill(0);
    rect(0, 0, width / 2, height);
    if (firstMousePress) {
        firstMousePress = false;
    }
}
void mousePressed() {
    if (!firstMousePress) {
        firstMousePress = true;
    }
}
void mouseReleased() {
    for (int i = 0; i < handles.size(); i++) {
        handles.get(i)->releaseEvent();
    }
}