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 com.sun.midp.chameleon.skins.resources.ScrollIndResourcesConstants;
031:
032: /**
033: * A ScrollIndLayer is a region of the display used for showing scroll indicator
034: * status either as arrows or bar.
035: */
036: public abstract class ScrollIndLayer extends CLayer {
037: /**
038: * Scrollbar operation types
039: */
040: public static final int SCROLL_NONE = 0;
041: public static final int SCROLL_LINEUP = 1;
042: public static final int SCROLL_LINEDOWN = 2;
043: public static final int SCROLL_PAGEUP = 3;
044: public static final int SCROLL_PAGEDOWN = 4;
045: public static final int SCROLL_THUMBTRACK = 5;
046:
047: /**
048: * scrollIndArrow layer is just one for all scrollable layers.
049: * It is chached and shared between all layers
050: */
051: private static ScrollIndLayer scrollIndArrows;
052:
053: /** Scrollable layer */
054: protected CLayer scrollable;
055: /**
056: * True if special alert indicator bar should be drawn instead of
057: * the regular one
058: */
059: protected boolean alertMode;
060:
061: /**
062: * Scrolling listener.
063: * This layer is notified if the scroll indicator is changed
064: */
065: protected ScrollListener listener;
066:
067: /**
068: * Set the current vertical scroll position and proportion.
069: *
070: * @param scrollPosition vertical scroll position.
071: * @param scrollProportion vertical scroll proportion.
072: */
073: public abstract void setVerticalScroll(int scrollPosition,
074: int scrollProportion);
075:
076: /**
077: * Calculate layer bounds depending on the scrollable
078: */
079: public abstract void setBounds();
080:
081: /**
082: * Common constructor.
083: * @param layer the scrollable controlling the scrolling layer
084: */
085: protected ScrollIndLayer(CLayer layer) {
086: super ();
087: setOpaque(false);
088: setSupportsInput(true);
089: scrollable = layer;
090: alertMode = scrollable instanceof AlertLayer;
091: }
092:
093: /**
094: * Additional constructor.
095: * @param layer the scrollable controlling the scrolling layer
096: * @param listener the scrolling listener
097: */
098: public ScrollIndLayer(CLayer layer, ScrollListener listener) {
099: this (layer);
100: this .listener = listener;
101: }
102:
103: /**
104: * Set new scrollable
105: * @param layer new scrollable controlling the scrolling layer
106: * @return true if the scrollable is changed, false - otherwise
107: */
108: public boolean setScrollable(CLayer layer) {
109: boolean ret = scrollable != layer;
110: if (ret) {
111: setVisible(false);
112: scrollable = layer;
113: alertMode = scrollable instanceof AlertLayer;
114: }
115: return ret;
116: }
117:
118: /**
119: * Set new listener
120: * @param newListener new scrolling listener
121: * @return true if the listener is changed, false - otherwise
122: */
123: public boolean setListener(ScrollListener newListener) {
124: boolean ret = listener != newListener;
125: if (ret) {
126: listener = newListener;
127: if (listener != null) {
128: listener.updateScrollIndicator();
129: }
130: }
131: return ret;
132: }
133:
134: /**
135: * Update bounds of layer
136: *
137: * @param layers - current layer can be dependant on this parameter
138: */
139: public void update(CLayer[] layers) {
140: super .update(layers);
141: setBounds();
142: }
143:
144: /**
145: * Called by MIDPWindow to initialize this layer
146: */
147: protected void initialize() {
148: super .initialize();
149: setBounds();
150: }
151:
152: public static ScrollIndLayer getInstance(int type) {
153: ScrollIndLayer s = null;
154: switch (type) {
155: case ScrollIndResourcesConstants.MODE_ARROWS:
156: if (scrollIndArrows == null) {
157: scrollIndArrows = new ScrollArrowLayer(null, null);
158: }
159: s = scrollIndArrows;
160: break;
161: case ScrollIndResourcesConstants.MODE_BAR:
162: s = new ScrollBarLayer(null, null);
163: break;
164: default:
165: break;
166: }
167: return s;
168: }
169: }
|