/*
* 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;
import javafx.data.feed.rss.Channel;
import javafx.data.feed.rss.Item;
import javafx.data.feed.rss.RssTask;
import javafx.scene.image.ImageView;
import javafx.scene.Node;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import tweeter.model.Status;
import tweeter.model.User;
import tweeter.view.AbstractView;
import tweeter.view.list.ListItem;
import tweeter.view.list.ListView;
import tweeter.view.TweeterView;
public class PublicView extends AbstractView {
def line_startX = 5;
def line_startY = 55;
def line_endXpadding = 6;
def line_endY = 55;
def logo_layoutX = 10;
def logo_layoutY = 13;
def statuslist_layoutX = 5;
def statuslistt_layoutY = 60;
def statuslistt_widthpadding = 105;
public var onException: function(message:String) = null;
override var show = true on replace {
if(visible) {
statusList.requestFocus();
}
};
var statuses:Status[];
var logo = ImageView {
layoutX: logo_layoutX
layoutY: logo_layoutY
image: TweeterView.theme.logoImage
};
var statusListItem:ListItem[];
var statusList = ListView {
layoutX: statuslist_layoutX
layoutY: statuslistt_layoutY
height: bind TweeterView.height - statuslistt_widthpadding
listItem: bind statusListItem
};
public function updateStatus(statuses:Status[]):Void {
delete statusListItem;
var index = 0;
for(status in statuses) {
var listItem = ListItem {
listView: statusList
};
listItem.setStatus(status);
insert listItem into statusListItem;
index++;
};
}
var feedTask:RssTask;
public function start() {
if(feedTask.started) { return; }
feedTask = RssTask {
location: "http:
interval: 60s
onChannel: function (channel : Channel):Void {
delete statuses;
}
onItem: function(item : Item): Void {
var title = "{item.title}";
var index = title.indexOf(":");
var user = title.substring(0, index);
var message = title.substring(index + 1);
insert Status {
text: message
user:User {
name: user
}
} into statuses;
}
onException: function(ex) : Void {
onException("{ex.getMessage()}");
}
onDone: function(): Void {
updateStatus(statuses);
}
}
feedTask.start();
}
var line = Line {
startX: line_startX
startY: line_startY
endX: bind TweeterView.width - line_endXpadding
endY: line_endY
stroke: bind Color.web("#{TweeterView.theme.linkColor}")
};
init{
children = [logo, line, statusList ]
}
}