License text

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER 
 * Copyright  2008, 2010 Oracle and/or its affiliates.  All rights reserved. 
 * Use is subject to license terms.
 * 
 * This file is available and licensed under the following license:
 * 
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met: 
 * 
 *   * Redistributions of source code must retain the above copyright notice, 
 *     this list of conditions and the following disclaimer. 
 *
 *   * Redistributions in binary form must reproduce the above copyright notice,
 *     this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 *
 *   * Neither the name of Oracle Corporation nor the names of its contributors 
 *     may be used to endorse or promote products derived from this software 
 *     without specific prior written permission. 
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */

    

package tweeter.view.list;

import javafx.scene.CustomNode;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.Node;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.input.MouseEvent;
import tweeter.view.ImageButton;
import tweeter.model.Status;
import tweeter.view.list.ListView;
import tweeter.view.TweeterView;
import javafx.scene.control.Label;
import javafx.scene.layout.LayoutInfo;
import javafx.geometry.VPos;

/**
 * View to display Item in Status List
 */

public def height = 72.0;


public class ListItem extends CustomNode {
    
    public var listView : ListView;
    public var status : Status;
    public var canDelete = false;
    public var onDelete: function(id : String) = null;
    public var selected = false;

    def _userTxtTrim = 25;
    def _TxtTrim = 120;
    def _btmLine = 5;
    def _startX = 0;
    def _topLinePadding = 1;
    def _topLnEndXPadding = 5;
    def _bgRectXY = 2;
    def _bgRectWdthPadd = 10;
    def _bgRectArc = 5;
    def _bgRectHgtPadding = 6;
    def _textX = 55;
    def _textY = 18;
    def _clipRecthgtPadding = 10;
    def _textWdthPadding = 70;
    def _userLayoutX = 55;
    def _userLayoutY = 6;
    def _photoWdthHght = 48;
    def _photoX = 3;
    def _photoY = 10;
    def _delBtnXPadding = 21;
    def _delBtnYPadding = 3;
    
    var deleteButton : ImageButton = ImageButton {
        layoutX: bind listView.itemWidth - _delBtnXPadding
        layoutY: _delBtnYPadding
        normalImage: TweeterView.theme.deleteImage
        visible: bind canDelete
        onMousePressed: function(e) {
            if(onDelete != null) {
                canDelete = false;
                opacity = 0.5;
                onDelete(status.id);
            }
        }
    };

    var photo = ImageView {
        image: TweeterView.theme.photoImage
        x: _photoX
        y: _photoY
        fitWidth: _photoWdthHght
        fitHeight: _photoWdthHght
        preserveRatio: true
    };

    var user = Label {
        layoutX: _userLayoutX
        layoutY: _userLayoutY
        font: Font { name: "dialog" size: 9 }
        textFill: bind Color.web("#{TweeterView.theme.linkColor}")
        text: ""
    };

    var text = Label {
        layoutX: _textX
        layoutY: _textY
        layoutInfo:LayoutInfo {
           width: listView.itemWidth - _textWdthPadding
        }
        vpos:VPos.TOP;
        font:Font { name: "dialog" size: 9 }
        textFill: bind Color.web("#{TweeterView.theme.textColor}")
        text: ""
        textWrap: true
        clip: Rectangle {
            width: bind listView.itemWidth
            height: bind height - _clipRecthgtPadding
        }
    };

    var bgRect = Rectangle {
        x: _bgRectXY
        y: _bgRectXY
        width: bind listView.itemWidth - _bgRectWdthPadd
        height: height - _bgRectHgtPadding
        fill: Color.WHITE
        stroke: bind Color.web("#{TweeterView.theme.linkColor}")
        strokeWidth: 0.5
        visible: bind selected
        arcWidth: _bgRectArc
        arcHeight: _bgRectArc
    }

    var topLine = Line {
        startX: _startX
        startY: bind (height - _topLinePadding)
        endX: bind listView.itemWidth - _topLnEndXPadding
        endY: bind (height - _topLinePadding)
        stroke: Color.GRAY
    };

    var bottomLine = Line {
        startX: _startX
        startY: bind height
        endX: bind listView.itemWidth - _btmLine
        endY: bind height
        stroke: Color.WHITE
    };

    init {
        children = [
            bgRect, photo, user, text, topLine, bottomLine, deleteButton
        ]
    }
    
    override var onMouseEntered = function(e : MouseEvent) {
        selected = true;
    }
    
    override var onMouseExited = function(e : MouseEvent) {
        selected = false;
    }

    override var onMousePressed = function(e : MouseEvent) {
        listView.selectedListItem = this;
    }
    
    public function setStatus(stts : Status) : Void {
        if(stts == null) {
            visible = false;
            return;
        }
        status = stts;
        user.text = trimString("{status.user.name}".trim(), _userTxtTrim);
        text.text = trimString("{status.text}".trim(), _TxtTrim);
        
        if(status.user.profileImageURL == null) {
            photo.image = TweeterView.theme.photoImage;
        } else {
            photo.image = Image {
                url: status.user.profileImageURL
                backgroundLoading: true
                placeholder: TweeterView.theme.photoImage
            };
        }

        visible = true;
    }
}

// Trim the string if length is greater than specified length
public function trimString(string:String, length:Integer):String {
    if(string == null) return "";

    if(string.length() > length) {
        return "{string.substring(0, length).trim()}...";
    } else {
        return string;
    }
}