2009年7月14日 星期二

複習Groovy (2) - SwingBuilder - table -- cellRender & closureColumn

Preface

寫FTCS XMLPost tool和看書進度緩慢,這個算是寫FTCS XMLPost tool想用的東西。主要的想法是有一塊用JTable來呈現
該Basic Asset Type table的Metadata,然後我可以用勾選的方式,最後產生XMLPost執行的ini設定檔。^^純粹是初步想法
希望會堅持下去用SwingBuilder做完,而不會做到一半覺得改用Wicket做比較快(雖然對我而言是事實)。

Environment

  • Groovy 1.6.3

  • Sun JDK 1.6.0_10

最初版本和想法

最初是Groovy in Action裡面有關table的範例,作者使用了propertyColumn展示這個componet的做法和功能。以我這個Swing門
外漢想的到,距離心理想要做的東西,針對table還要玩出下列兩項

  1. closureColumn

  2. cellRenderer, cellEditor

測試用的殼

Listing. GroovyTest.java


package script;

import java.io.FileNotFoundException;
import java.io.InputStreamReader;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class GroovyTest {
public static void main(String[] args) throws ScriptException, FileNotFoundException {
if(args.length != 1) {
System.err.println("Missing Required Parameter");
System.exit(-1);
} // if

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("groovy");

engine.eval(new InputStreamReader(ClassLoader.getSystemResourceAsStream(args[0])));
} // main()
} // GroovyTest class

closureColumn property

就只是根據書上的範例多的data加一個欄位,用closureColumn來呈現,特別用selected順便在下一個可以用checkbox來
呈現和設定這欄的資料。

Listing. tabDemo0.groovy

package script

/**
* @author Terry
*
*/
import groovy.swing.SwingBuilder
import java.awt.BorderLayout
import javax.swing.JCheckBox
import javax.swing.DefaultCellEditor
import javax.swing.WindowConstants as WC

def data = [
[nick:'MrG', full:'Guillaume Laforge', selected: false],
[nick:'jez', full:'Jeremy Rayner', selected: false],
[nick:'fraz', full:'Franck Rasolo', selected: false],
[nick:'sormuras', full:'Christian Stein', selected: false],
[nick:'blackdrag', full:'Jochen Theodorou', selected: false]
]

swing = new SwingBuilder()

generateAction = swing.action( name: 'Execute', closure: {
for (Map row : data) {
println row
}
})

frame = swing.frame(title: 'SwingBuilder - table 踹踹係',
defaultCloseOperation: WC.EXIT_ON_CLOSE) {
panel(layout: new BorderLayout()) {
scrollPane(constraints: BorderLayout.CENTER) {
table() {
tableModel(list: data) {
propertyColumn(header: 'Nickname', propertyName: 'nick')
propertyColumn(header: 'Full Name', propertyName: 'full')
closureColumn(header: 'Import ?',
read: { row -> return row.selected },
write: { row, newValue ->
row.selected = newValue })
}
}
}
hbox(constraints: BorderLayout.SOUTH) {
button( 'Execute' ) {
action(generateAction)
}
}
}
}
frame.pack()
frame.show()

Figure. 程式執行結果



cellRenderer, cellEditor property

對Groovy還沒有到那種感覺的程度,所以就只能按照對Swing的了解用Java的方法搞。所以寫了
一個TableCellRenderer。所以先看到的是CheckCellRenderer.groovy之後在tabDemo.groovy裡面
cellRenderer property就設定這個自訂TableCellRenderer,至於CellEdtor則使用DetaulCellEditor
餵給他JCheckBox的物件就可以了。


Listing. CheckCellRenderer.groovy

package script

import java.awt.Component
import javax.swing.JTable
import javax.swing.JCheckBox
import javax.swing.border.EmptyBorder
import javax.swing.table.TableCellRenderer

class CheckCellRenderer extends JCheckBox implements TableCellRenderer {

CheckCellRenderer() {
super()
setOpaque(true)
setBorderPainted(true)
setBorder(new EmptyBorder(1, 1, 1, 1))
setHorizontalAlignment(JCheckBox.CENTER)
}

public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
setSelected(value)
setForeground(table.getForeground())
setBackground(table.getBackground())
return this
}
}

Listing. tabDemo.groovy

package script

/**
* @author Terry
*
*/
import groovy.swing.SwingBuilder
import java.awt.BorderLayout
import javax.swing.JCheckBox
import javax.swing.DefaultCellEditor
import javax.swing.WindowConstants as WC

def data = [
[nick:'MrG', full:'Guillaume Laforge', selected: false],
[nick:'jez', full:'Jeremy Rayner', selected: true],
[nick:'fraz', full:'Franck Rasolo', selected: false],
[nick:'sormuras', full:'Christian Stein', selected: false],
[nick:'blackdrag', full:'Jochen Theodorou', selected: false]
]

swing = new SwingBuilder()

generateAction = swing.action( name: 'Execute', closure: {
for (Map row : data) {
println row
}
})

frame = swing.frame(title: 'SwingBuilder - table 踹踹係',
defaultCloseOperation: WC.EXIT_ON_CLOSE) {
panel(layout: new BorderLayout()) {
scrollPane(constraints: BorderLayout.CENTER) {
table(cellSelectionEnabled: false) {
tableModel(list: data) {
propertyColumn(header: 'Nickname', propertyName: 'nick')
propertyColumn(header: 'Full Name', propertyName: 'full')
closureColumn(header: 'Import ?',
cellRenderer: new CheckCellRenderer(),
cellEditor: new DefaultCellEditor(checkBox(horizontalAlignment: JCheckBox.CENTER)),
read: { row -> return row.selected },
write: { row, newValue ->
row.selected = newValue } )
}
}
}
hbox(constraints: BorderLayout.SOUTH) {
button( 'Execute' ) {
action(generateAction)
}
}
}
}
frame.pack()
frame.show()

Figure. 程式執行結果



Reference

  • Groovy Web Site

  • Groovy in Action, First Edition

  • Swing, Second Edition


Terence Chao, 2009/07/14

2009年7月7日 星期二

複習Groovy的第一章

最近被Manning的Groovy in Action 2Ed預購所吸引...60% off的吸引力太大,就敗了Groovy in Action第二版。因此也把書櫃裡的Groovy in Action第一版拿出來複習一下。自己學東西都是不注重用不用的到,只在乎自己爽不爽,因此學的很發散也忘的很快。哈,記憶體有限很快就purge掉。
因為google要關閉page creator本來打算把用部落格作筆記的做法關掉,一方面也很討厭自己在筆記本唉唉叫的做法,又不是有病幹麻管別人那麼多閒事。為了備份方便,後來改用html搞,沒啥美工天份反正自己看不礙眼就好。網站先放在so-net個人網頁。

2009年6月23日 星期二

Wicket – Write out Binary WebResource

製作ResourceLink的時候,原本都是用WebResourceCSV檔或文字資料。剛好遇到要透過POIHSSFSpreadSheet出來,參考ByteArrayResource,如果只是單純使用ByteArrayResource也可以,因為我打算維持自己之前webresources的做法把自己寫的IExportableDataProvider傳進來再製作出要export的內容。這邊只是POC確定可以跑的版本,不包含任何該公司的資訊。



PDF Document here

Wicket – Implement SyntaxHighlightingBlock

昨天白天不知為啥心情不佳,一整個懶。昨天出門前想到Syntax Highlighting的東西,下班之後就開始玩玩看。單純做好玩所以做來看看,沒想過實際使用的修正。之前雖然就覺得貿然使用Wicket對其他同事和Wicket而言,或許不是很好,畢竟對很多一堆小朋友而言,只有Struts才是王道。即使根本不了解Wicket更甚者連Struts都不是很清楚。哈 不過話說回來我對Wicket也不是了解很多。

SyntaxHightlightingBlock v0.2

因為推銷同事使用之後,在ajax rerender SyntaxHighlightingBlock會無法正確的顯示資料,一方面因為趕時間,所以弄了一個醜醜的解法。


PDF document here
Code @ google code url: http://code.google.com/p/syntaxhighlightingblock/

2009年6月22日 星期一

Wicket – ExternalInlineFrame and CollapsalbeLabel

從上禮拜開始心情又開始有些許波動,大概是自己腦袋知識太少,所以自悲而產生的自我防禦機制。其實自己所知太少,一直以來也沒興趣加入哪個framework好這種意識形態之爭的戰爭。自己對Wicket Source code也沒有了解的很透徹,但畢竟在有時間限制,又只有自己一個搞定所有東西的前提下,選擇framework的時候,還是要選擇自己比較熟悉的framework來做。畢竟對我這種入門等級的騙子而言,那麼多MVC frameworks是不同的人在HTTPOO之間用自己的方法和自己想解決問題的方向來搭起的橋樑。從來都不知道也認為自己沒那個能力知道那個比較好;哪個比較不好(或許改天有時間把兩個frameworksource code都了解透徹之後,可以比較一下)。對我而言,只有用過Struts 1和看過一點點JSF, Struts 2,在眾多橋樑之間,Wicket的想法是一個很有創意想法,他跳脫了Taglib...有時間的前提下,會列為可以多花點時間深入了解的好玩東西

wicket的世界,要製作Component是相當簡單的一件事,在這邊就因為某些狀況而做了兩個簡單的component。一個是連結到Wicket之外的iframecomponent,另一個是有可縮合功能的Label



PDF Document here

2009年5月14日 星期四

How To - Extending Ruby with Visual C++

一方面家裡有事,一方面案子又趕,只能靠自己,忙到沒時間打電動沒時間看書。這次整理的是以前看Ruby Cookbook Recipe 22.1在Windows + Visual C++環境踹踹看的東西。
被「啊欠打」這家豬腦美工公司搞的...心情超差...hmm 污辱了豬,要跟豬對不起

我的XPS上作業環境
  • Windows XP
  • Visual C++ 2008
  • Ruby 1.8.6

PDF Document here

2009年4月14日 星期二

[Fatwire Content Server] 自己猜測的部分Data Model



四月以來諸事不順、心情不佳,煩到一個不行
把前幾個月來工作時陸陸續續整理的東西,既然是沒用的東西放上來應該也沒差 (link)
壓縮檔中
1. 用DBDesigner 4做的Data Model,Data Type都是用MySQL的
2. 圖檔是export出來的東西

這幾天整理自己的lab發現
1. 以前用velocity寫的Masm32的makefile產生程式不見了
2. 竟然看不太懂自己之前寫的Win32 Assembly程式
...也一整個無言

附上一張同事問到的SystemSQL Result Cache問題的解決圖
在deftable這欄透過逗號分隔設定相關的table,當這些table透過Advance UI變更的時候就會清掉該筆SystemSQL的result cache (這個是同事問到的答案)。