/** * First Pass: We do sweep and mark of all layers requiring a repaint, the areas behind a visible * opaque layers need no repaint */ private void sweepAndMarkLayers() { if (CGraphicsQ.DEBUG) { System.err.println("[Sweep and mark layers]"); } CLayer l; CLayerElement changed; CLayerElement le = layers.getTop(); while (le != null) { l = le.getLayer(); if (l.visible && l.opaque) { cleanLowerDirtyRegions(le); } // The dirty layer can be invisible, that means it // has been hidden since the previous paint. if (l.isDirty()) { // In the case higher layer was changed we need to // restart all the algorithm from the changed layer changed = sweepAndMarkDirtyLayer(le, !l.visible); if (changed != null) { if (CGraphicsQ.DEBUG) { System.err.println("Restart sweep and mark: " + changed.getLayer()); } le = changed; changed = null; continue; } } // Go to next lower layer le = le.getLower(); } }
/** * Handle input from some type of device-dependent input method. This could be input from * something such as T9, or a phonebook lookup, etc. * * @param str the text to handle as direct input * @return true if this window or one of its layers processed the event */ public boolean methodInput(String str) { CLayer layer; synchronized (layers) { for (CLayerElement le = layers.getTop(); le != null; le = le.getLower()) { layer = le.getLayer(); if (layer.visible && layer.supportsInput && layer.methodInput(str)) { return true; } } } // sync return false; }
/** * Allow this window to process key input. The type of key input will be press, release, repeat, * etc. The key code will identify which key generated the event. This method will return true if * the event was processed by this window or one of its layers, false otherwise. * * @param type the type of key event (press, release, repeat) * @param keyCode the identifier of the key which generated the event * @return true if this window or one of its layers processed the event */ public boolean keyInput(int type, int keyCode) { CLayer layer; synchronized (layers) { for (CLayerElement le = layers.getTop(); le != null; le = le.getLower()) { layer = le.getLayer(); if (layer.supportsInput && layer.keyInput(type, keyCode)) { return true; } } } // sync return false; }
/** * Allow this window to process pointer input. The type of pointer input will be press, release, * drag, etc. The x and y coordinates will identify the point at which the pointer event occurred * in the coordinate system of this window. This window will translate the coordinates * appropriately for each layer contained in this window. This method will return true if the * event was processed by this window or one of its layers, false otherwise. * * @param type the type of pointer event (press, release, drag) * @param x the x coordinate of the location of the event * @param y the y coordinate of the location of the event * @return true if this window or one of its layers processed the event */ public boolean pointerInput(int type, int x, int y) { CLayer layer; synchronized (layers) { for (CLayerElement le = layers.getTop(); le != null; le = le.getLower()) { layer = le.getLayer(); if (layer.visible && layer.supportsInput && layer.handlePoint(x, y)) { // If the layer is visible, supports input, and // contains the point of the pointer press, we translate // the point into the layer's coordinate space and // pass on the input if (layer.pointerInput(type, x - layer.bounds[X], y - layer.bounds[Y])) { return true; } } } } // sync return false; }