001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package com.sun.midp.chameleon.layers;
028:
029: import com.sun.midp.chameleon.*;
030: import javax.microedition.lcdui.*;
031:
032: /**
033: * A "Popup" layer is a special kind of layer which can
034: * also have commands associated with it. When a popup
035: * layer is added to a MIDPWindow, its commands (if it has any)
036: * can be accessed through the soft button bar. If a popup layer
037: * does have commands associated with it, any commands on the
038: * current displayable/item are no longer accessible. If
039: * the popup layer does not have its own commands, any
040: * existing commands from the displayable/item remain.
041: *
042: * NOTE: For now, a PopupLayer is also always visible,
043: * that is isVisible() always returns true. To control the
044: * visibility of a PopupLayer, you add it and remove it
045: * from a MIDPWindow. IMPL_NOTE: determine if a relationship between
046: * PopupLayer and MIDPWindow can allow non visible popup layers.
047: */
048: public class ScrollablePopupLayer extends PopupLayer implements
049: ScrollListener {
050:
051: /**
052: * The scroll indicator layer to notify of scroll settings
053: * in case not all content can fit on the menu.
054: */
055: protected ScrollIndLayer scrollInd;
056:
057: /**
058: * Construct a new PopupLayer. By default, setSupportsInput()
059: * is set to true.
060: */
061: public ScrollablePopupLayer() {
062: super ((Image) null, -1);
063: }
064:
065: /**
066: * Construct a new PopupLayer, given a background image.
067: * By default, setSupportsInput() is set to true, and so
068: * is setVisible().
069: */
070: public ScrollablePopupLayer(Image bgImage, int bgColor) {
071: super (bgImage, bgColor);
072: }
073:
074: /**
075: * Construct a new PopupLayer, given a 9 pc background image.
076: * By default, setSupportsInput() is set to true, and so
077: * is setVisible().
078: */
079: public ScrollablePopupLayer(Image[] bgImage, int bgColor) {
080: super (bgImage, bgColor);
081: }
082:
083: /**
084: * Scrolling the contents according to the scrolling parameters.
085: * @param scrollType can be SCROLL_LINEUP, SCROLL_LINEDOWN, SCROLL_PAGEUP,
086: * SCROLL_PAGEDOWN or SCROLL_THUMBTRACK
087: * @param thumbPosition only valid when scrollType is SCROLL_THUMBTRACK
088: *
089: */
090: public void scrollContent(int scrollType, int thumbPosition) {
091: }
092:
093: public void setScrollInd(ScrollIndLayer newScrollInd) {
094: if (scrollInd != newScrollInd || scrollInd != null
095: && scrollInd.scrollable != this || scrollInd != null
096: && scrollInd.listener != this ) {
097: if (scrollInd != null) {
098: scrollInd.setScrollable(null);
099: scrollInd.setListener(null);
100: }
101: if (owner != null) {
102: owner.removeLayer(scrollInd);
103: }
104:
105: scrollInd = newScrollInd;
106: if (scrollInd != null) {
107: scrollInd.setScrollable(this );
108: scrollInd.setListener(this );
109: }
110: }
111: updateScrollIndicator();
112: }
113:
114: /**
115: * Update bounds of layer
116: *
117: * @param layers - current layer can be dependant on this parameter
118: */
119: public void update(CLayer[] layers) {
120: super .update(layers);
121: if (scrollInd != null) {
122: scrollInd.update(layers);
123: if (scrollInd.isVisible()) {
124: bounds[W] -= scrollInd.bounds[W];
125: }
126: }
127: }
128:
129: /**
130: * Add this layer's entire area to be marked for repaint. Any pending
131: * dirty regions will be cleared and the entire layer will be painted
132: * on the next repaint.
133: * TODO: need to be removed as soon as removeLayer algorithm
134: * takes into account layers interaction
135: */
136: public void addDirtyRegion() {
137: super .addDirtyRegion();
138: if (scrollInd != null) {
139: scrollInd.addDirtyRegion();
140: }
141: }
142:
143: /**
144: * Updates the scroll indicator.
145: */
146: public void updateScrollIndicator() {
147: if (scrollInd != null && owner != null) {
148: if (scrollInd.isVisible()) {
149: owner.addLayer(scrollInd);
150: } else {
151: owner.removeLayer(scrollInd);
152: }
153: }
154: }
155: }
|