Scrollbar.java

/*
 * Copyright © 2013 Nokia Corporation. All rights reserved. Nokia and Nokia
 * Connecting People are registered trademarks of Nokia Corporation. Oracle and
 * Java are trademarks or registered trademarks of Oracle and/or its affiliates.
 * Other product and company names mentioned herein may be trademarks or trade
 * names of their respective owners. See LICENSE.TXT for license information.
 */

package com.nokia.example;

import javax.microedition.lcdui.Graphics;
import com.nokia.mid.ui.TextEditor;

/**
 * Class encapsulating a very basic scrollbar for TextEditor.
 */
public class Scrollbar {

    private TextEditor owner;
    private int thumbColor;
    private int backgroundColor;
    private int cornersDiameter = 20;
    private int thumbY;
    private int thumbHeight;
    private final int margin = 5;
    public static final int width = 30;

    public Scrollbar(TextEditor owner, int thumbColor, int backgroundColor) {
        this.owner = owner;
        this.thumbColor = thumbColor;
        this.backgroundColor = backgroundColor;
    }

    /**
     * Handles pointer events and sets TextEditor's caret position. Pointer
     * events are relative to Canvas owning the TextEditor. This method expects
     * only pointer pressed events.
     */
    public void handlePointerPressed(int x, int y) {
        int scrollbarX = this.owner.getPositionX() + this.owner.getWidth();
        int textEditorY = this.owner.getPositionY();
        int height = this.owner.getHeight();
        if (x > scrollbarX && x < scrollbarX + Scrollbar.width
                && y > textEditorY && y < textEditorY + height) {
            this.updateThumb();
            
            if(BlogWriter.isS60Platform())
            {
                // Setting caret position works only on Symbian platform.
            	
                int caretY = (int) (this.owner.getContentHeight()
                        * ((float) (y - textEditorY) / (float) height));
                if (caretY < 5) {
                    caretY = 0;
                    this.owner.setCaret(0);
                } else {
                	this.owner.setCaret(caretY - this.owner.getVisibleContentPosition());
                }
            }
            
            /*           		
             	//Enable indicator on JRT version 2.1 for symbian devices by uncommenting the following code. 
         		//JRT versions 2.2 and newer already contain the indicator in the virtual keyboard.

            if (this.owner instanceof com.nokia.mid.ui.S60TextEditor) {
                // Setting caret position works only on Symbian platform.
            	com.nokia.mid.ui.S60TextEditor editor = (com.nokia.mid.ui.S60TextEditor) this.owner;
                int caretY = (int) (this.owner.getContentHeight()
                        * ((float) (y - textEditorY) / (float) height));
                if (caretY < 5) {
                    caretY = 0;
                    this.owner.setCaret(0);
                } else {
                    editor.setCaretXY(0, caretY - this.owner.getVisibleContentPosition());
                	
                }
            }*/
            
            
            
        }
        
    }

    /**
     * Paints the Scrollbar. This method should be called from CanvasTextBox
     * paint method.
     */
    public void paint(Graphics gfx, int x, int y) {
        int height = this.owner.getHeight();

        gfx.setColor(this.backgroundColor);
        gfx.fillRoundRect(
                x + this.margin, y,
                Scrollbar.width - 2 * this.margin, height,
                this.cornersDiameter, this.cornersDiameter);

        this.updateThumb();
        gfx.setColor(this.thumbColor);
        gfx.fillRoundRect(
                x + this.margin + 1, y + this.thumbY + 1,
                Scrollbar.width - 2 * this.margin - 2, this.thumbHeight - 2,
                this.cornersDiameter, this.cornersDiameter);
    }

    /**
     * Updates thumb size and position.
     */
    private void updateThumb() {
        int height = this.owner.getHeight();
        int contentHeight = this.owner.getContentHeight();
        this.thumbHeight = (int) (height * ((float) height / (float) contentHeight));
        if (this.thumbHeight > height) {
            this.thumbHeight = height;
        }
        if (this.thumbHeight < 30) {
            this.thumbHeight = 30;
        }

        int visibleContentPos = this.owner.getVisibleContentPosition();
        // S40 has a bug and return always 0
        int endPosition = contentHeight - height;
        if (visibleContentPos > 0) {
            if (contentHeight - visibleContentPos <= height
                    || endPosition == visibleContentPos) {
                this.thumbY = (int) (height - this.thumbHeight);
            } else {
                this.thumbY = (int) (((float) visibleContentPos / (float) contentHeight) * height);
            }
        } else {
            this.thumbY = 0;
        }
    }
}