--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/ScrolledTextComposite.java Mon May 03 12:27:20 2010 +0300
@@ -0,0 +1,160 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package javax.microedition.lcdui;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.ScrollBar;
+
+/**
+ * Composite control which is able to scroll text with a vertical scroll bar.
+ */
+class ScrolledTextComposite extends Composite {
+
+ private Label iESWTTextLabel;
+ private ScrollBar vBar;
+ private boolean resizing;
+ private boolean iTextScrolling;
+
+ /**
+ * Constructor.
+ */
+ public ScrolledTextComposite(Composite parent, ScrollBar vertBar) {
+ super(parent, 0);
+ vBar = vertBar;
+ vBar.setVisible(false);
+ vBar.setMaximum(0);
+ vBar.setThumb(0);
+ vBar.setSelection(0);
+
+ vBar.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ vScroll();
+ }
+ });
+
+ addListener(SWT.Resize, new Listener() {
+ public void handleEvent(Event e) {
+ resize();
+ }
+ });
+
+ iESWTTextLabel = new Label(this, SWT.WRAP);
+ iESWTTextLabel.setLocation(0, 0);
+ layout();
+
+ iESWTTextLabel.addListener(SWT.Resize, new Listener() {
+ public void handleEvent(Event e) {
+ if (e.type == SWT.Resize) {
+ resize();
+ }
+ }
+ });
+ }
+
+ public void setText(String aText) {
+ iESWTTextLabel.setText(aText);
+ iESWTTextLabel.setSize(calculateTextSize());
+ }
+
+ private Point calculateTextSize() {
+ iTextScrolling = false;
+ vBar.setVisible(false);
+ Point nextSize = iESWTTextLabel.computeSize(getClientArea().width,
+ SWT.DEFAULT);
+ if (nextSize.y > getClientArea().height) {
+ iTextScrolling = true;
+ vBar.setVisible(true);
+ nextSize = iESWTTextLabel.computeSize(getClientArea().width,
+ SWT.DEFAULT);
+ }
+ return nextSize;
+ }
+
+ /**
+ * Return if the text is scrolling. The vBar.isVisible() is not good,
+ * because it depends on parent's visibility.
+ */
+ public boolean isTextScrolling() {
+ return iTextScrolling;
+ }
+
+ public void setLayout(Layout layout) {
+ // do not allow a layout to be set
+ }
+
+ public void layout(boolean changed) {
+ iESWTTextLabel.setSize(calculateTextSize());
+
+ Rectangle contentRect = iESWTTextLabel.getBounds();
+ Rectangle hostRect = getClientArea();
+ vBar.setMaximum(contentRect.height);
+ vBar.setThumb(Math.min(contentRect.height, hostRect.height));
+ int vPage = contentRect.height - hostRect.height;
+ int vSelection = vBar.getSelection();
+ if (vSelection >= vPage) {
+ if (vPage <= 0) {
+ vSelection = 0;
+ vBar.setSelection(0);
+ }
+ contentRect.y = -vSelection;
+ }
+ iESWTTextLabel.setLocation(contentRect.x, contentRect.y);
+ }
+
+ public Point computeSize(int wHint, int hHint, boolean changed) {
+ Point size = iESWTTextLabel.computeSize(wHint, hHint, changed);
+ Rectangle trim = computeTrim(0, 0, size.x, size.y);
+ return new Point(trim.width, trim.height);
+ }
+
+ public Point getOrigin() {
+ Point location = iESWTTextLabel.getLocation();
+ return new Point(-location.x, -location.y);
+ }
+
+ public void setOrigin(Point origin) {
+ setOrigin(origin.x, origin.y);
+ }
+
+ public void setOrigin(int x, int y) {
+ if (iESWTTextLabel != null) {
+ vBar.setSelection(y);
+ iESWTTextLabel.setLocation(0, -vBar.getSelection());
+ }
+ }
+
+ private void resize() {
+ if (!resizing) {
+ resizing = true;
+ layout();
+ resizing = false;
+ }
+ }
+
+ private void vScroll() {
+ Point location = iESWTTextLabel.getLocation();
+ int vSelection = vBar.getSelection();
+ iESWTTextLabel.setLocation(location.x, -vSelection);
+ }
+}