blob: 3f8597c1406b7eb6050db3b7679be8b4df829566 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Created by IntelliJ IDEA.
* User: Danno.Ferrin
* Date: Apr 26, 2008
* Time: 8:31:21 AM
*/
package groovy.swing.greet
import java.awt.Cursor
import java.beans.PropertyChangeListener
import javax.swing.*
lookAndFeel('nimbus', 'mac', ['metal', [boldFonts: false]])
actions() {
loginAction = action(
name: 'Login',
enabled: bind(source: controller, sourceProperty: 'allowLogin'),
closure: controller.&login
)
filterTweets = action(
name: 'Filter',
enabled: bind(source: controller, sourceProperty: 'allowSelection'),
closure: controller.&filterTweets
)
userSelected = action(
name: 'Select User',
enabled: bind(source: controller, sourceProperty: 'allowSelection'),
closure: controller.&userSelected
)
tweetAction = action(
name: 'Update',
enabled: bind(source: controller, sourceProperty: 'allowTweet'),
closure: controller.&tweet
)
}
tweetLineFont = new java.awt.Font("Ariel", 0, 12)
tweetLine = panel(border: emptyBorder(3), preferredSize:[250,84]) {
gridBagLayout()
tweetIcon = label(verticalTextPosition:SwingConstants.BOTTOM,
horizontalTextPosition:SwingConstants.CENTER,
//anchor: BASELINE, insets: [3, 3, 3, 3])
anchor: CENTER, insets: [3, 3, 3, 3])
tweetText = textArea(rows: 4, lineWrap: true, wrapStyleWord: true,
opaque: false, editable: false, font: tweetLineFont,
gridwidth: REMAINDER, weightx: 1.0, fill: BOTH, insets: [3, 3, 3, 3])
}
tweetRenderer = {list, tweet, index, isSelected, isFocused ->
if (tweet?.user as String) {
tweetIcon.icon = controller.api.imageMap[tweet.user.profile_image_url as String]
tweetIcon.text = tweet.user.screen_name
tweetText.text = tweet.text
} else if (tweet?.text as String) {
tweetIcon.icon = controller.api.imageMap[tweet.parent().profile_image_url as String]
tweetIcon.text = tweet.parent().screen_name
tweetText.text = tweet.text
} else {
tweetIcon.icon = null
tweetIcon.text = null
tweetText.text = null
}
tweetLine
} as ListCellRenderer
userCell = label(border: emptyBorder(3))
userCellRenderer = {list, user, index, isSelected, isFocused ->
if (user) {
userCell.icon = controller.api.imageMap[user.profile_image_url as String]
userCell.text = "<html>$user.screen_name<br>$user.name<br>$user.location<br>"
} else {
userCell.icon = null
userCell.text = null
}
userCell
} as ListCellRenderer
greetFrame = frame(title: "Greet - A Groovy Twitter Client",
defaultCloseOperation: javax.swing.JFrame.DISPOSE_ON_CLOSE, size: [320, 480],
locationByPlatform:true)
{
panel(cursor: bind(source: controller, sourceProperty: 'allowSelection',
converter: {it ? null : Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)})
) {
gridBagLayout()
users = comboBox(renderer: userCellRenderer, action: userSelected,
gridwidth: REMAINDER, insets: [6, 6, 3, 6], fill: HORIZONTAL)
label('Search:', insets: [3, 6, 3, 3])
searchField = textField(columns: 20, action: filterTweets,
insets: [3, 3, 3, 3], weightx: 1.0, fill: BOTH)
button(action: filterTweets,
gridwidth: REMAINDER, insets: [3, 3, 3, 6], fill:HORIZONTAL)
tabbedPane(gridwidth: REMAINDER, weighty: 1.0, fill: BOTH) {
scrollPane(title: 'Timeline') {
timelineList = list(visibleRowCount: 20, cellRenderer: tweetRenderer)
}
scrollPane(title: 'Tweets') {
tweetList = list(visibleRowCount: 20, cellRenderer: tweetRenderer)
}
scrollPane(title: 'Statuses') {
statusList = list(visibleRowCount: 20, cellRenderer: tweetRenderer)
}
// add data change listeners
[timeline:timelineList, tweets:tweetList, statuses:statusList].each {p, w ->
controller.addPropertyChangeListener(p,
{evt -> w.listData = evt.newValue as Object[]} as PropertyChangeListener
)
}
}
separator(fill: HORIZONTAL, gridwidth: REMAINDER)
tweetBox = textField(action:tweetAction,
fill:BOTH, weightx:1.0, insets:[3,3,3,3], gridwidth:2)
tweetButton = button(tweetAction,
enabled:bind(source:tweetBox, sourceProperty:'text', converter:{it.length() < 140}),
gridwidth:REMAINDER, insets:[3,3,3,3])
separator(fill: HORIZONTAL, gridwidth: REMAINDER)
statusLine = label(text: bind(source: controller.api, sourceProperty: 'status'),
gridwidth: REMAINDER, insets: [3, 6, 3, 6], anchor: WEST
)
}
loginDialog = dialog(
title: "Login to Greet", pack: true, resizable: false,
defaultCloseOperation: WindowConstants.DISPOSE_ON_CLOSE,
locationByPlatform:true)
{
panel(border: emptyBorder(3),
cursor: bind(source: controller, sourceProperty: 'allowLogin',
converter: {it ? null : Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)})
) {
gridBagLayout()
label("Username:",
anchor: EAST, insets: [3, 3, 3, 3])
twitterNameField = textField(action:loginAction, columns: 20,
gridwidth: REMAINDER, insets: [3, 3, 3, 3])
label("Password:",
anchor: EAST, insets: [3, 3, 3, 3])
twitterPasswordField = passwordField(action:loginAction, columns: 20,
gridwidth: REMAINDER, insets: [3, 3, 3, 3])
panel()
button(loginAction, defaultButton: true,
anchor: EAST, insets: [3, 3, 3, 3])
}
}
}
controller.addPropertyChangeListener("friends", {evt ->
view.edt { users.model = new DefaultComboBoxModel(evt.newValue as Object[]) }
} as PropertyChangeListener)
new Timer(120000, filterTweets).start()