import groovy.json.JsonBuilder
import org.eclipse.swt.*
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.BrowserFunction
import org.eclipse.swt.browser.ProgressListener
import org.eclipse.swt.custom.CTabFolder
import org.eclipse.swt.custom.CTabItem
import org.eclipse.swt.events.SelectionEvent
import org.eclipse.swt.events.SelectionListener
import org.eclipse.swt.layout.GridData
import org.eclipse.swt.layout.GridLayout
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text
import org.eclipse.swt.widgets.ToolBar
import org.eclipse.swt.widgets.ToolItem
class BrowserApplication {
Display display
Shell shell
CTabFolder tabFolder
CTabItem tabScreen
CTabItem tabSource
Browser screen
Text source
Label statusBar
ToolItem toolbarReload
boolean ready
def event
def url
def imagePath = "/home/hiromasa/ピクチャ/wallpaper/"
def init() {
display = new Display()
// シェル
shell = new Shell(display)
shell.setSize(540, 640)
shell.setLayout(new GridLayout())
shell.setText("シルバーらい子ちゃん")
// ツールバー作成
ToolBar toolbar = new ToolBar(shell, SWT.NULL)
toolbarReload = new ToolItem(toolbar, SWT.PUSH)
toolbarReload.setText("リロード")
// CTabFolder
tabFolder = new CTabFolder(shell, SWT.BORDER)
tabFolder.setTabPosition(SWT.BOTTOM)
tabFolder.setSimple(false)
tabFolder.setTabHeight(20)
tabScreen = new CTabItem(tabFolder, SWT.NONE)
tabScreen.setText("スクリーン")
tabSource = new CTabItem(tabFolder, SWT.NONE)
tabSource.setText("ソース")
tabFolder.setSelection(0)
// CTabFolder - Layout
GridData tabLayout = new GridData()
tabLayout.horizontalAlignment = GridData.FILL
tabLayout.verticalAlignment = GridData.FILL
tabLayout.grabExcessHorizontalSpace = true
tabLayout.grabExcessVerticalSpace = true
tabFolder.setLayoutData(tabLayout)
// WebKit
url = new File(".").getAbsolutePath()
screen = new Browser(tabFolder, SWT.WEBKIT)
screen.setUrl("file:///${url}/script/screen.html")
tabScreen.setControl(screen)
// ソース
source = new Text(tabFolder, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL)
tabSource.setControl(source)
// ステータスバー
statusBar = new Label(shell, SWT.LEFT)
statusBar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL))
}
def handle() {
// screen.html 読み込み終了検知
screen.addProgressListener([
changed : { },
completed : {
ready = true
statusBar.setText("Ready")
}] as ProgressListener)
// リロードボタン
toolbarReload.addSelectionListener([
widgetSelected : {
screen.refresh()
},
widgetDefaultSelected : {}] as SelectionListener
)
// Groovy からブラウザの JavaScript を呼び出して HTML テキストをもらう。
tabFolder.addSelectionListener([
widgetSelected : { SelectionEvent e ->
if(e.item == tabSource) {
source.setText(screen.evaluate('return getContentHtml()'))
}
},
widgetDefaultSelected : {}] as SelectionListener)
// JavaScript から Groovy を呼び出すための JS 関数を登録する。
event = new BrowserFunction(screen, "getFileList") {
public Object function(Object[] arguments) {
return getFileList(arguments);
}
}
}
// ファイル一覧を取得して JSON 形式で返却
def getFileList(args) {
def files = [:]
new File("${imagePath}").eachFileMatch(~/.*\.jpg/) {
files[it.name] = it.path
}
return new JsonBuilder(files).toString()
//return [10, 20] as Object[]
}
def loop() {
try {
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
} catch (Exception e) {
// TODO:
e.printStackTrace()
} finally {
display.dispose()
}
}
def BrowserApplication() {
init()
handle()
loop()
}
def static main(def args) {
new BrowserApplication();
}
}