1:
37:
38:
39: package ;
40:
41: import ;
42: import ;
43: import ;
44: import ;
45: import ;
46: import ;
47: import ;
48: import ;
49: import ;
50: import ;
51:
52: import ;
53: import ;
54: import ;
55: import ;
56:
57:
98: public class JViewport extends JComponent
99: {
100:
101:
106: protected class ViewListener
107: extends ComponentAdapter
108: implements Serializable
109: {
110: private static final long serialVersionUID = -2812489404285958070L;
111:
112:
115: protected ViewListener()
116: {
117: }
118:
119:
125: public void componentResized(ComponentEvent ev)
126: {
127:
128:
129:
130:
131:
132:
133:
134:
135:
136: Component comp = ev.getComponent();
137: Dimension newSize = comp.getSize();
138: Dimension viewportSize = getSize();
139: boolean revert = false;
140: if (newSize.width > viewportSize.width)
141: {
142: newSize.width = viewportSize.width;
143: revert = true;
144: }
145: if (newSize.height > viewportSize.height)
146: {
147: newSize.height = viewportSize.height;
148: revert = true;
149: }
150: if (revert == true)
151: comp.setSize(newSize);
152: }
153: }
154:
155: private static final long serialVersionUID = -6925142919680527970L;
156:
157: public static final int SIMPLE_SCROLL_MODE = 0;
158: public static final int BLIT_SCROLL_MODE = 1;
159: public static final int BACKINGSTORE_SCROLL_MODE = 2;
160:
161: ChangeEvent changeEvent = new ChangeEvent(this);
162:
163: int scrollMode;
164:
165: protected boolean scrollUnderway;
166: protected boolean isViewSizeSet;
167:
168:
177: Dimension extentSize;
178:
179:
182:
183: Dimension viewSize;
184:
185: Point lastPaintPosition;
186:
187:
190: ViewListener viewListener;
191:
192: public JViewport()
193: {
194: setOpaque(true);
195: setScrollMode(BLIT_SCROLL_MODE);
196: setLayout(createLayoutManager());
197: updateUI();
198: }
199:
200: public Dimension getExtentSize()
201: {
202: if (extentSize == null)
203: return toViewCoordinates(getSize());
204: else
205: return extentSize;
206: }
207:
208: public Dimension toViewCoordinates(Dimension size)
209: {
210: return size;
211: }
212:
213: public Point toViewCoordinates(Point p)
214: {
215: Point pos = getViewPosition();
216: return new Point(p.x + pos.x,
217: p.y + pos.y);
218: }
219:
220: public void setExtentSize(Dimension newSize)
221: {
222: extentSize = newSize;
223: fireStateChanged();
224: }
225:
226:
231: public Dimension getViewSize()
232: {
233: if (isViewSizeSet)
234: return viewSize;
235: else
236: {
237: Component view = getView();
238: if (view != null)
239: return view.getPreferredSize();
240: else
241: return new Dimension();
242: }
243: }
244:
245:
246: public void setViewSize(Dimension newSize)
247: {
248: viewSize = newSize;
249: Component view = getView();
250: if (view != null)
251: view.setSize(viewSize);
252: isViewSizeSet = true;
253: fireStateChanged();
254: }
255:
256:
261:
262: public Point getViewPosition()
263: {
264: Component view = getView();
265: if (view == null)
266: return new Point(0,0);
267: else
268: {
269: Point p = view.getLocation();
270: p.x = -p.x;
271: p.y = -p.y;
272: return p;
273: }
274: }
275:
276: public void setViewPosition(Point p)
277: {
278: Component view = getView();
279: if (view != null)
280: {
281: Point q = new Point(-p.x, -p.y);
282: view.setLocation(q);
283: fireStateChanged();
284: }
285: }
286:
287: public Rectangle getViewRect()
288: {
289: return new Rectangle(getViewPosition(),
290: getExtentSize());
291: }
292:
293:
296: public boolean isBackingStoreEnabled()
297: {
298: return scrollMode == BACKINGSTORE_SCROLL_MODE;
299: }
300:
301:
304: public void setBackingStoreEnabled(boolean b)
305: {
306: if (b && scrollMode != BACKINGSTORE_SCROLL_MODE)
307: {
308: scrollMode = BACKINGSTORE_SCROLL_MODE;
309: fireStateChanged();
310: }
311: }
312:
313: public void setScrollMode(int mode)
314: {
315: scrollMode = mode;
316: fireStateChanged();
317: }
318:
319: public int getScrollMode()
320: {
321: return scrollMode;
322: }
323:
324: public Component getView()
325: {
326: if (getComponentCount() == 0)
327: return null;
328:
329: return getComponents()[0];
330: }
331:
332: public void setView(Component v)
333: {
334: while (getComponentCount() > 0)
335: {
336: if (viewListener != null)
337: getView().removeComponentListener(viewListener);
338: remove(0);
339: }
340:
341: if (v != null)
342: {
343: if (viewListener == null)
344: viewListener = createViewListener();
345: v.addComponentListener(viewListener);
346: add(v);
347: fireStateChanged();
348: }
349: }
350:
351: public void revalidate()
352: {
353: fireStateChanged();
354: super.revalidate();
355: }
356:
357: public void reshape(int x, int y, int w, int h)
358: {
359: boolean changed =
360: (x != getX())
361: || (y != getY())
362: || (w != getWidth())
363: || (h != getHeight());
364: super.reshape(x, y, w, h);
365: if (changed)
366: fireStateChanged();
367: }
368:
369: protected void addImpl(Component comp, Object constraints, int index)
370: {
371: if (getComponentCount() > 0)
372: remove(getComponents()[0]);
373:
374: super.addImpl(comp, constraints, index);
375: }
376:
377: public final Insets getInsets()
378: {
379: return new Insets(0,0,0,0);
380: }
381:
382: public final Insets getInsets(Insets insets)
383: {
384: if (insets == null)
385: return getInsets();
386: insets.top = 0;
387: insets.bottom = 0;
388: insets.left = 0;
389: insets.right = 0;
390: return insets;
391: }
392:
393: public boolean isOptimizedDrawingEnabled()
394: {
395: return false;
396: }
397:
398: public void paint(Graphics g)
399: {
400: paintComponent(g);
401: }
402:
403: public void addChangeListener(ChangeListener listener)
404: {
405: listenerList.add(ChangeListener.class, listener);
406: }
407:
408: public void removeChangeListener(ChangeListener listener)
409: {
410: listenerList.remove(ChangeListener.class, listener);
411: }
412:
413: public ChangeListener[] getChangeListeners()
414: {
415: return (ChangeListener[]) getListeners(ChangeListener.class);
416: }
417:
418: protected void fireStateChanged()
419: {
420: ChangeListener[] listeners = getChangeListeners();
421: for (int i = 0; i < listeners.length; ++i)
422: listeners[i].stateChanged(changeEvent);
423: }
424:
425:
430: public String getUIClassID()
431: {
432: return "ViewportUI";
433: }
434:
435:
438: public void updateUI()
439: {
440: setUI((ViewportUI) UIManager.getUI(this));
441: }
442:
443:
448: public ViewportUI getUI()
449: {
450: return (ViewportUI) ui;
451: }
452:
453:
458: public void setUI(ViewportUI ui)
459: {
460: super.setUI(ui);
461: }
462:
463: public final void setBorder(Border border)
464: {
465: if (border != null)
466: throw new IllegalArgumentException();
467: }
468:
469:
475: protected ViewListener createViewListener()
476: {
477: return new ViewListener();
478: }
479:
480:
486: protected LayoutManager createLayoutManager()
487: {
488: return new ViewportLayout();
489: }
490: }