Created
December 22, 2013 06:29
-
-
Save alucky0707/8079107 to your computer and use it in GitHub Desktop.
JRuby+SWTでブラウザができてました ref: http://qiita.com/alucky0707/items/56771f627d7a5bfc3bb4
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding : UTF-8 | |
#SWTの読み込み(同じフォルダにswt.jarを置いといてください) | |
require 'swt.jar' | |
#ウィンドウのタイトルとホームページのURL(お好みでどうぞ) | |
title = "SWT Simple Browser on JRuby" | |
homepage = "http://google.com/" | |
#SWT関連のパッケージの読み込み | |
swt = Java::OrgEclipseSwt | |
graphics = Java::OrgEclipseSwtGraphics | |
layout = Java::OrgEclipseSwtLayout | |
widgets = Java::OrgEclipseSwtWidgets | |
browser = Java::OrgEclipseSwtBrowser | |
#定数をswt::SWT::NULLとかするのが面倒なので、 | |
SWT = swt::SWT | |
GridData = layout::GridData | |
#ロケーションバーを作る(クラスに纏めるのが面倒だったからlambdaにしちゃったけど非常にアレ) | |
setup_locationbar = ->(shell) do | |
#ロケーションバーのウィジェット達を纏めるComposite | |
composite = widgets::Composite.new shell, SWT::NULL | |
composite.layout = layout::GridLayout.new 4, false | |
composite.layout_data = GridData.new GridData::FILL_HORIZONTAL | |
#戻るボタン | |
back = widgets::Button.new composite, SWT::NULL | |
back.text = "←" | |
#クリックされたときの動作を登録 | |
back.add_selection_listener do |e| | |
@browser.back if @browser.back_enabled? | |
end | |
#進むボタン | |
forward = widgets::Button.new composite, SWT::NULL | |
forward.text = "→" | |
forward.add_selection_listener do |e| | |
@browser.forward if @browser.forward_enabled? | |
end | |
#更新ボタン | |
update = widgets::Button.new composite, SWT::NULL | |
update.text = "↺" #環境によっては化けそうな文字だな… | |
update.add_selection_listener do |e| | |
#これも非常にアレ | |
case update.text | |
when "↺" | |
@browser.set_url @location.text | |
when "×" | |
@browser.stop | |
end | |
end | |
#URLが表示されてるテキストバー | |
location = widgets::Text.new composite, SWT::SINGLE | SWT::BORDER | |
location.layoutData = GridData.new GridData::FILL_BOTH | |
return back, forward, update, location | |
end | |
#ブラウザを作る。(上に同じく、非常にアレ) | |
setup_browser = ->(shell) do | |
browser = browser::Browser.new shell, SWT::NONE | |
#setUrlがurl=の形式で呼べないのは、複数引数でオーバーライドされているからか、返り値があるから(どっちか分からないけど、多分どちらか) | |
browser.set_url homepage | |
browser.layoutData = GridData.new GridData::FILL_BOTH | |
#ドキュメントのタイトルが変わったとき | |
browser.add_title_listener do |e| | |
shell.text = "#{e.title} - #{title}" | |
end | |
#URLが変わったときに実行される | |
browser.add_location_listener do |e| | |
#ツールバーを更新 | |
@location.text = "#{e.location}" | |
@back.enabled = browser.back_enabled? | |
@forward.enabled = browser.forward_enabled? | |
#changedとchanfingという二つのメソッドを持っているLocationListenerを一つのProcで実装しているので、 | |
#callerで取得したメソッド名を元に分岐する | |
case caller.first.match(/`(.*)'/)[1].to_sym | |
when :changing | |
@update.text = "×" | |
shell.text = "#{e.location} - #{title}" | |
when :changed | |
@update.text = "↺" | |
@update.enabled = true | |
end | |
end | |
browser | |
end | |
#ここら辺はSWTプログラミングのテンプレートみたいなものだと思う | |
display = widgets::Display.new | |
at_exit { display.dispose } #忘れないうちに登録 | |
shell = widgets::Shell.new | |
shell.text = title | |
shell.size = graphics::Point.new 800, 600 | |
shell.layout = layout::GridLayout.new 1, false | |
#全体で使われるウィジェットはなぜかインスタンス変数になってる | |
@back, @forward,@update, @location = setup_locationbar.call shell | |
@browser = setup_browser.call shell | |
shell.open | |
#イベントループ(よく分かっていない) | |
until shell.disposed? | |
unless display.read_and_dispatch | |
display.sleep | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment